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