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