README.txt revision 1.1.1.1.4.2 1 1.1.1.1.4.2 rmind Compiler-RT
2 1.1.1.1.4.2 rmind ================================
3 1.1.1.1.4.2 rmind
4 1.1.1.1.4.2 rmind This directory and its subdirectories contain source code for the compiler
5 1.1.1.1.4.2 rmind support routines.
6 1.1.1.1.4.2 rmind
7 1.1.1.1.4.2 rmind Compiler-RT is open source software. You may freely distribute it under the
8 1.1.1.1.4.2 rmind terms of the license agreement found in LICENSE.txt.
9 1.1.1.1.4.2 rmind
10 1.1.1.1.4.2 rmind ================================
11 1.1.1.1.4.2 rmind
12 1.1.1.1.4.2 rmind This is a replacement library for libgcc. Each function is contained
13 1.1.1.1.4.2 rmind in its own file. Each function has a corresponding unit test under
14 1.1.1.1.4.2 rmind test/Unit.
15 1.1.1.1.4.2 rmind
16 1.1.1.1.4.2 rmind A rudimentary script to test each file is in the file called
17 1.1.1.1.4.2 rmind test/Unit/test.
18 1.1.1.1.4.2 rmind
19 1.1.1.1.4.2 rmind Here is the specification for this library:
20 1.1.1.1.4.2 rmind
21 1.1.1.1.4.2 rmind http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc
22 1.1.1.1.4.2 rmind
23 1.1.1.1.4.2 rmind Here is a synopsis of the contents of this library:
24 1.1.1.1.4.2 rmind
25 1.1.1.1.4.2 rmind typedef int si_int;
26 1.1.1.1.4.2 rmind typedef unsigned su_int;
27 1.1.1.1.4.2 rmind
28 1.1.1.1.4.2 rmind typedef long long di_int;
29 1.1.1.1.4.2 rmind typedef unsigned long long du_int;
30 1.1.1.1.4.2 rmind
31 1.1.1.1.4.2 rmind // Integral bit manipulation
32 1.1.1.1.4.2 rmind
33 1.1.1.1.4.2 rmind di_int __ashldi3(di_int a, si_int b); // a << b
34 1.1.1.1.4.2 rmind ti_int __ashlti3(ti_int a, si_int b); // a << b
35 1.1.1.1.4.2 rmind
36 1.1.1.1.4.2 rmind di_int __ashrdi3(di_int a, si_int b); // a >> b arithmetic (sign fill)
37 1.1.1.1.4.2 rmind ti_int __ashrti3(ti_int a, si_int b); // a >> b arithmetic (sign fill)
38 1.1.1.1.4.2 rmind di_int __lshrdi3(di_int a, si_int b); // a >> b logical (zero fill)
39 1.1.1.1.4.2 rmind ti_int __lshrti3(ti_int a, si_int b); // a >> b logical (zero fill)
40 1.1.1.1.4.2 rmind
41 1.1.1.1.4.2 rmind si_int __clzsi2(si_int a); // count leading zeros
42 1.1.1.1.4.2 rmind si_int __clzdi2(di_int a); // count leading zeros
43 1.1.1.1.4.2 rmind si_int __clzti2(ti_int a); // count leading zeros
44 1.1.1.1.4.2 rmind si_int __ctzsi2(si_int a); // count trailing zeros
45 1.1.1.1.4.2 rmind si_int __ctzdi2(di_int a); // count trailing zeros
46 1.1.1.1.4.2 rmind si_int __ctzti2(ti_int a); // count trailing zeros
47 1.1.1.1.4.2 rmind
48 1.1.1.1.4.2 rmind si_int __ffsdi2(di_int a); // find least significant 1 bit
49 1.1.1.1.4.2 rmind si_int __ffsti2(ti_int a); // find least significant 1 bit
50 1.1.1.1.4.2 rmind
51 1.1.1.1.4.2 rmind si_int __paritysi2(si_int a); // bit parity
52 1.1.1.1.4.2 rmind si_int __paritydi2(di_int a); // bit parity
53 1.1.1.1.4.2 rmind si_int __parityti2(ti_int a); // bit parity
54 1.1.1.1.4.2 rmind
55 1.1.1.1.4.2 rmind si_int __popcountsi2(si_int a); // bit population
56 1.1.1.1.4.2 rmind si_int __popcountdi2(di_int a); // bit population
57 1.1.1.1.4.2 rmind si_int __popcountti2(ti_int a); // bit population
58 1.1.1.1.4.2 rmind
59 1.1.1.1.4.2 rmind uint32_t __bswapsi2(uint32_t a); // a byteswapped, arm only
60 1.1.1.1.4.2 rmind uint64_t __bswapdi2(uint64_t a); // a byteswapped, arm only
61 1.1.1.1.4.2 rmind
62 1.1.1.1.4.2 rmind // Integral arithmetic
63 1.1.1.1.4.2 rmind
64 1.1.1.1.4.2 rmind di_int __negdi2 (di_int a); // -a
65 1.1.1.1.4.2 rmind ti_int __negti2 (ti_int a); // -a
66 1.1.1.1.4.2 rmind di_int __muldi3 (di_int a, di_int b); // a * b
67 1.1.1.1.4.2 rmind ti_int __multi3 (ti_int a, ti_int b); // a * b
68 1.1.1.1.4.2 rmind si_int __divsi3 (si_int a, si_int b); // a / b signed
69 1.1.1.1.4.2 rmind di_int __divdi3 (di_int a, di_int b); // a / b signed
70 1.1.1.1.4.2 rmind ti_int __divti3 (ti_int a, ti_int b); // a / b signed
71 1.1.1.1.4.2 rmind su_int __udivsi3 (su_int n, su_int d); // a / b unsigned
72 1.1.1.1.4.2 rmind du_int __udivdi3 (du_int a, du_int b); // a / b unsigned
73 1.1.1.1.4.2 rmind tu_int __udivti3 (tu_int a, tu_int b); // a / b unsigned
74 1.1.1.1.4.2 rmind si_int __modsi3 (si_int a, si_int b); // a % b signed
75 1.1.1.1.4.2 rmind di_int __moddi3 (di_int a, di_int b); // a % b signed
76 1.1.1.1.4.2 rmind ti_int __modti3 (ti_int a, ti_int b); // a % b signed
77 1.1.1.1.4.2 rmind su_int __umodsi3 (su_int a, su_int b); // a % b unsigned
78 1.1.1.1.4.2 rmind du_int __umoddi3 (du_int a, du_int b); // a % b unsigned
79 1.1.1.1.4.2 rmind tu_int __umodti3 (tu_int a, tu_int b); // a % b unsigned
80 1.1.1.1.4.2 rmind du_int __udivmoddi4(du_int a, du_int b, du_int* rem); // a / b, *rem = a % b unsigned
81 1.1.1.1.4.2 rmind tu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem); // a / b, *rem = a % b unsigned
82 1.1.1.1.4.2 rmind su_int __udivmodsi4(su_int a, su_int b, su_int* rem); // a / b, *rem = a % b unsigned
83 1.1.1.1.4.2 rmind si_int __divmodsi4(si_int a, si_int b, si_int* rem); // a / b, *rem = a % b signed
84 1.1.1.1.4.2 rmind
85 1.1.1.1.4.2 rmind
86 1.1.1.1.4.2 rmind
87 1.1.1.1.4.2 rmind // Integral arithmetic with trapping overflow
88 1.1.1.1.4.2 rmind
89 1.1.1.1.4.2 rmind si_int __absvsi2(si_int a); // abs(a)
90 1.1.1.1.4.2 rmind di_int __absvdi2(di_int a); // abs(a)
91 1.1.1.1.4.2 rmind ti_int __absvti2(ti_int a); // abs(a)
92 1.1.1.1.4.2 rmind
93 1.1.1.1.4.2 rmind si_int __negvsi2(si_int a); // -a
94 1.1.1.1.4.2 rmind di_int __negvdi2(di_int a); // -a
95 1.1.1.1.4.2 rmind ti_int __negvti2(ti_int a); // -a
96 1.1.1.1.4.2 rmind
97 1.1.1.1.4.2 rmind si_int __addvsi3(si_int a, si_int b); // a + b
98 1.1.1.1.4.2 rmind di_int __addvdi3(di_int a, di_int b); // a + b
99 1.1.1.1.4.2 rmind ti_int __addvti3(ti_int a, ti_int b); // a + b
100 1.1.1.1.4.2 rmind
101 1.1.1.1.4.2 rmind si_int __subvsi3(si_int a, si_int b); // a - b
102 1.1.1.1.4.2 rmind di_int __subvdi3(di_int a, di_int b); // a - b
103 1.1.1.1.4.2 rmind ti_int __subvti3(ti_int a, ti_int b); // a - b
104 1.1.1.1.4.2 rmind
105 1.1.1.1.4.2 rmind si_int __mulvsi3(si_int a, si_int b); // a * b
106 1.1.1.1.4.2 rmind di_int __mulvdi3(di_int a, di_int b); // a * b
107 1.1.1.1.4.2 rmind ti_int __mulvti3(ti_int a, ti_int b); // a * b
108 1.1.1.1.4.2 rmind
109 1.1.1.1.4.2 rmind
110 1.1.1.1.4.2 rmind // Integral arithmetic which returns if overflow
111 1.1.1.1.4.2 rmind
112 1.1.1.1.4.2 rmind si_int __mulosi4(si_int a, si_int b, int* overflow); // a * b, overflow set to one if result not in signed range
113 1.1.1.1.4.2 rmind di_int __mulodi4(di_int a, di_int b, int* overflow); // a * b, overflow set to one if result not in signed range
114 1.1.1.1.4.2 rmind ti_int __muloti4(ti_int a, ti_int b, int* overflow); // a * b, overflow set to
115 1.1.1.1.4.2 rmind one if result not in signed range
116 1.1.1.1.4.2 rmind
117 1.1.1.1.4.2 rmind
118 1.1.1.1.4.2 rmind // Integral comparison: a < b -> 0
119 1.1.1.1.4.2 rmind // a == b -> 1
120 1.1.1.1.4.2 rmind // a > b -> 2
121 1.1.1.1.4.2 rmind
122 1.1.1.1.4.2 rmind si_int __cmpdi2 (di_int a, di_int b);
123 1.1.1.1.4.2 rmind si_int __cmpti2 (ti_int a, ti_int b);
124 1.1.1.1.4.2 rmind si_int __ucmpdi2(du_int a, du_int b);
125 1.1.1.1.4.2 rmind si_int __ucmpti2(tu_int a, tu_int b);
126 1.1.1.1.4.2 rmind
127 1.1.1.1.4.2 rmind // Integral / floating point conversion
128 1.1.1.1.4.2 rmind
129 1.1.1.1.4.2 rmind di_int __fixsfdi( float a);
130 1.1.1.1.4.2 rmind di_int __fixdfdi( double a);
131 1.1.1.1.4.2 rmind di_int __fixxfdi(long double a);
132 1.1.1.1.4.2 rmind
133 1.1.1.1.4.2 rmind ti_int __fixsfti( float a);
134 1.1.1.1.4.2 rmind ti_int __fixdfti( double a);
135 1.1.1.1.4.2 rmind ti_int __fixxfti(long double a);
136 1.1.1.1.4.2 rmind uint64_t __fixtfdi(long double input); // ppc only, doesn't match documentation
137 1.1.1.1.4.2 rmind
138 1.1.1.1.4.2 rmind su_int __fixunssfsi( float a);
139 1.1.1.1.4.2 rmind su_int __fixunsdfsi( double a);
140 1.1.1.1.4.2 rmind su_int __fixunsxfsi(long double a);
141 1.1.1.1.4.2 rmind
142 1.1.1.1.4.2 rmind du_int __fixunssfdi( float a);
143 1.1.1.1.4.2 rmind du_int __fixunsdfdi( double a);
144 1.1.1.1.4.2 rmind du_int __fixunsxfdi(long double a);
145 1.1.1.1.4.2 rmind
146 1.1.1.1.4.2 rmind tu_int __fixunssfti( float a);
147 1.1.1.1.4.2 rmind tu_int __fixunsdfti( double a);
148 1.1.1.1.4.2 rmind tu_int __fixunsxfti(long double a);
149 1.1.1.1.4.2 rmind uint64_t __fixunstfdi(long double input); // ppc only
150 1.1.1.1.4.2 rmind
151 1.1.1.1.4.2 rmind float __floatdisf(di_int a);
152 1.1.1.1.4.2 rmind double __floatdidf(di_int a);
153 1.1.1.1.4.2 rmind long double __floatdixf(di_int a);
154 1.1.1.1.4.2 rmind long double __floatditf(int64_t a); // ppc only
155 1.1.1.1.4.2 rmind
156 1.1.1.1.4.2 rmind float __floattisf(ti_int a);
157 1.1.1.1.4.2 rmind double __floattidf(ti_int a);
158 1.1.1.1.4.2 rmind long double __floattixf(ti_int a);
159 1.1.1.1.4.2 rmind
160 1.1.1.1.4.2 rmind float __floatundisf(du_int a);
161 1.1.1.1.4.2 rmind double __floatundidf(du_int a);
162 1.1.1.1.4.2 rmind long double __floatundixf(du_int a);
163 1.1.1.1.4.2 rmind long double __floatunditf(uint64_t a); // ppc only
164 1.1.1.1.4.2 rmind
165 1.1.1.1.4.2 rmind float __floatuntisf(tu_int a);
166 1.1.1.1.4.2 rmind double __floatuntidf(tu_int a);
167 1.1.1.1.4.2 rmind long double __floatuntixf(tu_int a);
168 1.1.1.1.4.2 rmind
169 1.1.1.1.4.2 rmind // Floating point raised to integer power
170 1.1.1.1.4.2 rmind
171 1.1.1.1.4.2 rmind float __powisf2( float a, si_int b); // a ^ b
172 1.1.1.1.4.2 rmind double __powidf2( double a, si_int b); // a ^ b
173 1.1.1.1.4.2 rmind long double __powixf2(long double a, si_int b); // a ^ b
174 1.1.1.1.4.2 rmind long double __powitf2(long double a, si_int b); // ppc only, a ^ b
175 1.1.1.1.4.2 rmind
176 1.1.1.1.4.2 rmind // Complex arithmetic
177 1.1.1.1.4.2 rmind
178 1.1.1.1.4.2 rmind // (a + ib) * (c + id)
179 1.1.1.1.4.2 rmind
180 1.1.1.1.4.2 rmind float _Complex __mulsc3( float a, float b, float c, float d);
181 1.1.1.1.4.2 rmind double _Complex __muldc3(double a, double b, double c, double d);
182 1.1.1.1.4.2 rmind long double _Complex __mulxc3(long double a, long double b,
183 1.1.1.1.4.2 rmind long double c, long double d);
184 1.1.1.1.4.2 rmind long double _Complex __multc3(long double a, long double b,
185 1.1.1.1.4.2 rmind long double c, long double d); // ppc only
186 1.1.1.1.4.2 rmind
187 1.1.1.1.4.2 rmind // (a + ib) / (c + id)
188 1.1.1.1.4.2 rmind
189 1.1.1.1.4.2 rmind float _Complex __divsc3( float a, float b, float c, float d);
190 1.1.1.1.4.2 rmind double _Complex __divdc3(double a, double b, double c, double d);
191 1.1.1.1.4.2 rmind long double _Complex __divxc3(long double a, long double b,
192 1.1.1.1.4.2 rmind long double c, long double d);
193 1.1.1.1.4.2 rmind long double _Complex __divtc3(long double a, long double b,
194 1.1.1.1.4.2 rmind long double c, long double d); // ppc only
195 1.1.1.1.4.2 rmind
196 1.1.1.1.4.2 rmind
197 1.1.1.1.4.2 rmind // Runtime support
198 1.1.1.1.4.2 rmind
199 1.1.1.1.4.2 rmind // __clear_cache() is used to tell process that new instructions have been
200 1.1.1.1.4.2 rmind // written to an address range. Necessary on processors that do not have
201 1.1.1.1.4.2 rmind // a unified instuction and data cache.
202 1.1.1.1.4.2 rmind void __clear_cache(void* start, void* end);
203 1.1.1.1.4.2 rmind
204 1.1.1.1.4.2 rmind // __enable_execute_stack() is used with nested functions when a trampoline
205 1.1.1.1.4.2 rmind // function is written onto the stack and that page range needs to be made
206 1.1.1.1.4.2 rmind // executable.
207 1.1.1.1.4.2 rmind void __enable_execute_stack(void* addr);
208 1.1.1.1.4.2 rmind
209 1.1.1.1.4.2 rmind // __gcc_personality_v0() is normally only called by the system unwinder.
210 1.1.1.1.4.2 rmind // C code (as opposed to C++) normally does not need a personality function
211 1.1.1.1.4.2 rmind // because there are no catch clauses or destructors to be run. But there
212 1.1.1.1.4.2 rmind // is a C language extension __attribute__((cleanup(func))) which marks local
213 1.1.1.1.4.2 rmind // variables as needing the cleanup function "func" to be run when the
214 1.1.1.1.4.2 rmind // variable goes out of scope. That includes when an exception is thrown,
215 1.1.1.1.4.2 rmind // so a personality handler is needed.
216 1.1.1.1.4.2 rmind _Unwind_Reason_Code __gcc_personality_v0(int version, _Unwind_Action actions,
217 1.1.1.1.4.2 rmind uint64_t exceptionClass, struct _Unwind_Exception* exceptionObject,
218 1.1.1.1.4.2 rmind _Unwind_Context_t context);
219 1.1.1.1.4.2 rmind
220 1.1.1.1.4.2 rmind // for use with some implementations of assert() in <assert.h>
221 1.1.1.1.4.2 rmind void __eprintf(const char* format, const char* assertion_expression,
222 1.1.1.1.4.2 rmind const char* line, const char* file);
223 1.1.1.1.4.2 rmind
224 1.1.1.1.4.2 rmind
225 1.1.1.1.4.2 rmind
226 1.1.1.1.4.2 rmind // Power PC specific functions
227 1.1.1.1.4.2 rmind
228 1.1.1.1.4.2 rmind // There is no C interface to the saveFP/restFP functions. They are helper
229 1.1.1.1.4.2 rmind // functions called by the prolog and epilog of functions that need to save
230 1.1.1.1.4.2 rmind // a number of non-volatile float point registers.
231 1.1.1.1.4.2 rmind saveFP
232 1.1.1.1.4.2 rmind restFP
233 1.1.1.1.4.2 rmind
234 1.1.1.1.4.2 rmind // PowerPC has a standard template for trampoline functions. This function
235 1.1.1.1.4.2 rmind // generates a custom trampoline function with the specific realFunc
236 1.1.1.1.4.2 rmind // and localsPtr values.
237 1.1.1.1.4.2 rmind void __trampoline_setup(uint32_t* trampOnStack, int trampSizeAllocated,
238 1.1.1.1.4.2 rmind const void* realFunc, void* localsPtr);
239 1.1.1.1.4.2 rmind
240 1.1.1.1.4.2 rmind // adds two 128-bit double-double precision values ( x + y )
241 1.1.1.1.4.2 rmind long double __gcc_qadd(long double x, long double y);
242 1.1.1.1.4.2 rmind
243 1.1.1.1.4.2 rmind // subtracts two 128-bit double-double precision values ( x - y )
244 1.1.1.1.4.2 rmind long double __gcc_qsub(long double x, long double y);
245 1.1.1.1.4.2 rmind
246 1.1.1.1.4.2 rmind // multiples two 128-bit double-double precision values ( x * y )
247 1.1.1.1.4.2 rmind long double __gcc_qmul(long double x, long double y);
248 1.1.1.1.4.2 rmind
249 1.1.1.1.4.2 rmind // divides two 128-bit double-double precision values ( x / y )
250 1.1.1.1.4.2 rmind long double __gcc_qdiv(long double a, long double b);
251 1.1.1.1.4.2 rmind
252 1.1.1.1.4.2 rmind
253 1.1.1.1.4.2 rmind // ARM specific functions
254 1.1.1.1.4.2 rmind
255 1.1.1.1.4.2 rmind // There is no C interface to the switch* functions. These helper functions
256 1.1.1.1.4.2 rmind // are only needed by Thumb1 code for efficient switch table generation.
257 1.1.1.1.4.2 rmind switch16
258 1.1.1.1.4.2 rmind switch32
259 1.1.1.1.4.2 rmind switch8
260 1.1.1.1.4.2 rmind switchu8
261 1.1.1.1.4.2 rmind
262 1.1.1.1.4.2 rmind // There is no C interface to the *_vfp_d8_d15_regs functions. There are
263 1.1.1.1.4.2 rmind // called in the prolog and epilog of Thumb1 functions. When the C++ ABI use
264 1.1.1.1.4.2 rmind // SJLJ for exceptions, each function with a catch clause or destuctors needs
265 1.1.1.1.4.2 rmind // to save and restore all registers in it prolog and epliog. But there is
266 1.1.1.1.4.2 rmind // no way to access vector and high float registers from thumb1 code, so the
267 1.1.1.1.4.2 rmind // compiler must add call outs to these helper functions in the prolog and
268 1.1.1.1.4.2 rmind // epilog.
269 1.1.1.1.4.2 rmind restore_vfp_d8_d15_regs
270 1.1.1.1.4.2 rmind save_vfp_d8_d15_regs
271 1.1.1.1.4.2 rmind
272 1.1.1.1.4.2 rmind
273 1.1.1.1.4.2 rmind // Note: long ago ARM processors did not have floating point hardware support.
274 1.1.1.1.4.2 rmind // Floating point was done in software and floating point parameters were
275 1.1.1.1.4.2 rmind // passed in integer registers. When hardware support was added for floating
276 1.1.1.1.4.2 rmind // point, new *vfp functions were added to do the same operations but with
277 1.1.1.1.4.2 rmind // floating point parameters in floating point registers.
278 1.1.1.1.4.2 rmind
279 1.1.1.1.4.2 rmind // Undocumented functions
280 1.1.1.1.4.2 rmind
281 1.1.1.1.4.2 rmind float __addsf3vfp(float a, float b); // Appears to return a + b
282 1.1.1.1.4.2 rmind double __adddf3vfp(double a, double b); // Appears to return a + b
283 1.1.1.1.4.2 rmind float __divsf3vfp(float a, float b); // Appears to return a / b
284 1.1.1.1.4.2 rmind double __divdf3vfp(double a, double b); // Appears to return a / b
285 1.1.1.1.4.2 rmind int __eqsf2vfp(float a, float b); // Appears to return one
286 1.1.1.1.4.2 rmind // iff a == b and neither is NaN.
287 1.1.1.1.4.2 rmind int __eqdf2vfp(double a, double b); // Appears to return one
288 1.1.1.1.4.2 rmind // iff a == b and neither is NaN.
289 1.1.1.1.4.2 rmind double __extendsfdf2vfp(float a); // Appears to convert from
290 1.1.1.1.4.2 rmind // float to double.
291 1.1.1.1.4.2 rmind int __fixdfsivfp(double a); // Appears to convert from
292 1.1.1.1.4.2 rmind // double to int.
293 1.1.1.1.4.2 rmind int __fixsfsivfp(float a); // Appears to convert from
294 1.1.1.1.4.2 rmind // float to int.
295 1.1.1.1.4.2 rmind unsigned int __fixunssfsivfp(float a); // Appears to convert from
296 1.1.1.1.4.2 rmind // float to unsigned int.
297 1.1.1.1.4.2 rmind unsigned int __fixunsdfsivfp(double a); // Appears to convert from
298 1.1.1.1.4.2 rmind // double to unsigned int.
299 1.1.1.1.4.2 rmind double __floatsidfvfp(int a); // Appears to convert from
300 1.1.1.1.4.2 rmind // int to double.
301 1.1.1.1.4.2 rmind float __floatsisfvfp(int a); // Appears to convert from
302 1.1.1.1.4.2 rmind // int to float.
303 1.1.1.1.4.2 rmind double __floatunssidfvfp(unsigned int a); // Appears to convert from
304 1.1.1.1.4.2 rmind // unisgned int to double.
305 1.1.1.1.4.2 rmind float __floatunssisfvfp(unsigned int a); // Appears to convert from
306 1.1.1.1.4.2 rmind // unisgned int to float.
307 1.1.1.1.4.2 rmind int __gedf2vfp(double a, double b); // Appears to return __gedf2
308 1.1.1.1.4.2 rmind // (a >= b)
309 1.1.1.1.4.2 rmind int __gesf2vfp(float a, float b); // Appears to return __gesf2
310 1.1.1.1.4.2 rmind // (a >= b)
311 1.1.1.1.4.2 rmind int __gtdf2vfp(double a, double b); // Appears to return __gtdf2
312 1.1.1.1.4.2 rmind // (a > b)
313 1.1.1.1.4.2 rmind int __gtsf2vfp(float a, float b); // Appears to return __gtsf2
314 1.1.1.1.4.2 rmind // (a > b)
315 1.1.1.1.4.2 rmind int __ledf2vfp(double a, double b); // Appears to return __ledf2
316 1.1.1.1.4.2 rmind // (a <= b)
317 1.1.1.1.4.2 rmind int __lesf2vfp(float a, float b); // Appears to return __lesf2
318 1.1.1.1.4.2 rmind // (a <= b)
319 1.1.1.1.4.2 rmind int __ltdf2vfp(double a, double b); // Appears to return __ltdf2
320 1.1.1.1.4.2 rmind // (a < b)
321 1.1.1.1.4.2 rmind int __ltsf2vfp(float a, float b); // Appears to return __ltsf2
322 1.1.1.1.4.2 rmind // (a < b)
323 1.1.1.1.4.2 rmind double __muldf3vfp(double a, double b); // Appears to return a * b
324 1.1.1.1.4.2 rmind float __mulsf3vfp(float a, float b); // Appears to return a * b
325 1.1.1.1.4.2 rmind int __nedf2vfp(double a, double b); // Appears to return __nedf2
326 1.1.1.1.4.2 rmind // (a != b)
327 1.1.1.1.4.2 rmind double __negdf2vfp(double a); // Appears to return -a
328 1.1.1.1.4.2 rmind float __negsf2vfp(float a); // Appears to return -a
329 1.1.1.1.4.2 rmind float __negsf2vfp(float a); // Appears to return -a
330 1.1.1.1.4.2 rmind double __subdf3vfp(double a, double b); // Appears to return a - b
331 1.1.1.1.4.2 rmind float __subsf3vfp(float a, float b); // Appears to return a - b
332 1.1.1.1.4.2 rmind float __truncdfsf2vfp(double a); // Appears to convert from
333 1.1.1.1.4.2 rmind // double to float.
334 1.1.1.1.4.2 rmind int __unorddf2vfp(double a, double b); // Appears to return __unorddf2
335 1.1.1.1.4.2 rmind int __unordsf2vfp(float a, float b); // Appears to return __unordsf2
336 1.1.1.1.4.2 rmind
337 1.1.1.1.4.2 rmind
338 1.1.1.1.4.2 rmind Preconditions are listed for each function at the definition when there are any.
339 1.1.1.1.4.2 rmind Any preconditions reflect the specification at
340 1.1.1.1.4.2 rmind http://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc.
341 1.1.1.1.4.2 rmind
342 1.1.1.1.4.2 rmind Assumptions are listed in "int_lib.h", and in individual files. Where possible
343 1.1.1.1.4.2 rmind assumptions are checked at compile time.
344