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