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