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