177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoCompiler-RT
277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao================================
377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoThis directory and its subdirectories contain source code for the compiler
577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosupport routines.
677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoCompiler-RT is open source software. You may freely distribute it under the
877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoterms of the license agreement found in LICENSE.txt.
977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao================================
1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoThis is a replacement library for libgcc.  Each function is contained
1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoin its own file.  Each function has a corresponding unit test under
1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotest/Unit.
1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoA rudimentary script to test each file is in the file called
1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotest/Unit/test.
1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoHere is the specification for this library:
2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaohttp://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc
2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoHere is a synopsis of the contents of this library:
2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef      int si_int;
2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef unsigned su_int;
2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef          long long di_int;
2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef unsigned long long du_int;
3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Integral bit manipulation
3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __ashldi3(di_int a, si_int b);      // a << b
3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __ashlti3(ti_int a, si_int b);      // a << b
3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __ashrdi3(di_int a, si_int b);      // a >> b  arithmetic (sign fill)
3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __ashrti3(ti_int a, si_int b);      // a >> b  arithmetic (sign fill)
3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __lshrdi3(di_int a, si_int b);      // a >> b  logical    (zero fill)
3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __lshrti3(ti_int a, si_int b);      // a >> b  logical    (zero fill)
4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __clzsi2(si_int a);  // count leading zeros
4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __clzdi2(di_int a);  // count leading zeros
4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __clzti2(ti_int a);  // count leading zeros
4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __ctzsi2(si_int a);  // count trailing zeros
4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __ctzdi2(di_int a);  // count trailing zeros
4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __ctzti2(ti_int a);  // count trailing zeros
4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __ffsdi2(di_int a);  // find least significant 1 bit
4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __ffsti2(ti_int a);  // find least significant 1 bit
5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __paritysi2(si_int a);  // bit parity
5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __paritydi2(di_int a);  // bit parity
5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __parityti2(ti_int a);  // bit parity
5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __popcountsi2(si_int a);  // bit population
5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __popcountdi2(di_int a);  // bit population
5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __popcountti2(ti_int a);  // bit population
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaouint32_t __bswapsi2(uint32_t a);   // a byteswapped, arm only
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaouint64_t __bswapdi2(uint64_t a);   // a byteswapped, arm only
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Integral arithmetic
6377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __negdi2    (di_int a);                         // -a
6577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __negti2    (ti_int a);                         // -a
6677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __muldi3    (di_int a, di_int b);               // a * b
6777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __multi3    (ti_int a, ti_int b);               // a * b
6877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __divsi3    (si_int a, si_int b);               // a / b   signed
6977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __divdi3    (di_int a, di_int b);               // a / b   signed
7077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __divti3    (ti_int a, ti_int b);               // a / b   signed
7177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosu_int __udivsi3   (su_int n, su_int d);               // a / b   unsigned
7277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodu_int __udivdi3   (du_int a, du_int b);               // a / b   unsigned
7377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotu_int __udivti3   (tu_int a, tu_int b);               // a / b   unsigned
7477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __modsi3    (si_int a, si_int b);               // a % b   signed
7577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __moddi3    (di_int a, di_int b);               // a % b   signed
7677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __modti3    (ti_int a, ti_int b);               // a % b   signed
7777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosu_int __umodsi3   (su_int a, su_int b);               // a % b   unsigned
7877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodu_int __umoddi3   (du_int a, du_int b);               // a % b   unsigned
7977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotu_int __umodti3   (tu_int a, tu_int b);               // a % b   unsigned
8077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodu_int __udivmoddi4(du_int a, du_int b, du_int* rem);  // a / b, *rem = a % b
8177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem);  // a / b, *rem = a % b
8277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//  Integral arithmetic with trapping overflow
8477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __absvsi2(si_int a);           // abs(a)
8677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __absvdi2(di_int a);           // abs(a)
8777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __absvti2(ti_int a);           // abs(a)
8877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
8977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __negvsi2(si_int a);           // -a
9077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __negvdi2(di_int a);           // -a
9177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __negvti2(ti_int a);           // -a
9277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
9377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __addvsi3(si_int a, si_int b);  // a + b
9477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __addvdi3(di_int a, di_int b);  // a + b
9577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __addvti3(ti_int a, ti_int b);  // a + b
9677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
9777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __subvsi3(si_int a, si_int b);  // a - b
9877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __subvdi3(di_int a, di_int b);  // a - b
9977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __subvti3(ti_int a, ti_int b);  // a - b
10077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
10177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __mulvsi3(si_int a, si_int b);  // a * b
10277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __mulvdi3(di_int a, di_int b);  // a * b
10377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __mulvti3(ti_int a, ti_int b);  // a * b
10477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
10577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//  Integral comparison: a  < b -> 0
10677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//                       a == b -> 1
10777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//                       a  > b -> 2
10877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
10977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __cmpdi2 (di_int a, di_int b);
11077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __cmpti2 (ti_int a, ti_int b);
11177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __ucmpdi2(du_int a, du_int b);
11277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosi_int __ucmpti2(tu_int a, tu_int b);
11377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
11477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//  Integral / floating point conversion
11577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
11677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __fixsfdi(      float a);
11777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __fixdfdi(     double a);
11877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodi_int __fixxfdi(long double a);
11977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
12077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __fixsfti(      float a);
12177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __fixdfti(     double a);
12277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoti_int __fixxfti(long double a);
12377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaouint64_t __fixtfdi(long double input);  // ppc only, doesn't match documentation
12477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
12577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosu_int __fixunssfsi(      float a);
12677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosu_int __fixunsdfsi(     double a);
12777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosu_int __fixunsxfsi(long double a);
12877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
12977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodu_int __fixunssfdi(      float a);
13077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodu_int __fixunsdfdi(     double a);
13177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodu_int __fixunsxfdi(long double a);
13277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
13377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotu_int __fixunssfti(      float a);
13477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotu_int __fixunsdfti(     double a);
13577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotu_int __fixunsxfti(long double a);
13677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaouint64_t __fixunstfdi(long double input);  // ppc only
13777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
13877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat       __floatdisf(di_int a);
13977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble      __floatdidf(di_int a);
14077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __floatdixf(di_int a);
14177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __floatditf(int64_t a);        // ppc only
14277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
14377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat       __floattisf(ti_int a);
14477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble      __floattidf(ti_int a);
14577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __floattixf(ti_int a);
14677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
14777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat       __floatundisf(du_int a);
14877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble      __floatundidf(du_int a);
14977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __floatundixf(du_int a);
15077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __floatunditf(uint64_t a);     // ppc only
15177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
15277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat       __floatuntisf(tu_int a);
15377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble      __floatuntidf(tu_int a);
15477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __floatuntixf(tu_int a);
15577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
15677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//  Floating point raised to integer power
15777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
15877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat       __powisf2(      float a, si_int b);  // a ^ b
15977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble      __powidf2(     double a, si_int b);  // a ^ b
16077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __powixf2(long double a, si_int b);  // a ^ b
16177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __powitf2(long double a, si_int b);  // ppc only, a ^ b
16277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
16377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//  Complex arithmetic
16477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
16577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//  (a + ib) * (c + id)
16677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
16777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao      float _Complex __mulsc3( float a,  float b,  float c,  float d);
16877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao     double _Complex __muldc3(double a, double b, double c, double d);
16977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double _Complex __mulxc3(long double a, long double b,
17077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                              long double c, long double d);
17177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double _Complex __multc3(long double a, long double b,
17277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                              long double c, long double d); // ppc only
17377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
17477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//  (a + ib) / (c + id)
17577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
17677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao      float _Complex __divsc3( float a,  float b,  float c,  float d);
17777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao     double _Complex __divdc3(double a, double b, double c, double d);
17877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double _Complex __divxc3(long double a, long double b,
17977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                              long double c, long double d);
18077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double _Complex __divtc3(long double a, long double b,
18177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                              long double c, long double d);  // ppc only
18277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
18377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
18477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//         Runtime support
18577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
18677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// __clear_cache() is used to tell process that new instructions have been
18777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// written to an address range.  Necessary on processors that do not have
18877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// a unified instuction and data cache.
18977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid __clear_cache(void* start, void* end);
19077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
19177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// __enable_execute_stack() is used with nested functions when a trampoline
19277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// function is written onto the stack and that page range needs to be made
19377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// executable.
19477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid __enable_execute_stack(void* addr);
19577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
19677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// __gcc_personality_v0() is normally only called by the system unwinder.
19777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// C code (as opposed to C++) normally does not need a personality function
19877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// because there are no catch clauses or destructors to be run.  But there
19977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// is a C language extension __attribute__((cleanup(func))) which marks local
20077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// variables as needing the cleanup function "func" to be run when the
20177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// variable goes out of scope.  That includes when an exception is thrown,
20277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// so a personality handler is needed.  
20377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao_Unwind_Reason_Code __gcc_personality_v0(int version, _Unwind_Action actions,
20477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao         uint64_t exceptionClass, struct _Unwind_Exception* exceptionObject,
20577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao         _Unwind_Context_t context);
20677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
20777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// for use with some implementations of assert() in <assert.h>
20877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid __eprintf(const char* format, const char* assertion_expression,
20977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao				const char* line, const char* file);
21077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao				
21177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
21277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
21377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//   Power PC specific functions
21477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
21577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// There is no C interface to the saveFP/restFP functions.  They are helper
21677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// functions called by the prolog and epilog of functions that need to save
21777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// a number of non-volatile float point registers.  
21877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaosaveFP
21977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaorestFP
22077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
22177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// PowerPC has a standard template for trampoline functions.  This function
22277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// generates a custom trampoline function with the specific realFunc
22377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// and localsPtr values.
22477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid __trampoline_setup(uint32_t* trampOnStack, int trampSizeAllocated, 
22577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                const void* realFunc, void* localsPtr);
22677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
22777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// adds two 128-bit double-double precision values ( x + y )
22877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __gcc_qadd(long double x, long double y);  
22977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
23077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// subtracts two 128-bit double-double precision values ( x - y )
23177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __gcc_qsub(long double x, long double y); 
23277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
23377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// multiples two 128-bit double-double precision values ( x * y )
23477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __gcc_qmul(long double x, long double y);  
23577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
23677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// divides two 128-bit double-double precision values ( x / y )
23777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaolong double __gcc_qdiv(long double a, long double b);  
23877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
23977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
24077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//    ARM specific functions
24177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
24277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// There is no C interface to the switch* functions.  These helper functions
24377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// are only needed by Thumb1 code for efficient switch table generation.
24477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoswitch16
24577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoswitch32
24677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoswitch8
24777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoswitchu8
24877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
24977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// There is no C interface to the *_vfp_d8_d15_regs functions.  There are
25077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// called in the prolog and epilog of Thumb1 functions.  When the C++ ABI use
25177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// SJLJ for exceptions, each function with a catch clause or destuctors needs
25277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// to save and restore all registers in it prolog and epliog.  But there is 
25377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// no way to access vector and high float registers from thumb1 code, so the 
25477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// compiler must add call outs to these helper functions in the prolog and 
25577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// epilog.
25677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaorestore_vfp_d8_d15_regs
25777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaosave_vfp_d8_d15_regs
25877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
25977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
26077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Note: long ago ARM processors did not have floating point hardware support.
26177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Floating point was done in software and floating point parameters were 
26277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// passed in integer registers.  When hardware support was added for floating
26377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// point, new *vfp functions were added to do the same operations but with 
26477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// floating point parameters in floating point registers.
26577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
26677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
26777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// Undocumented functions
26877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
26977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat  __addsf3vfp(float a, float b);   // Appears to return a + b
27077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __adddf3vfp(double a, double b); // Appears to return a + b
27177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat  __divsf3vfp(float a, float b);   // Appears to return a / b
27277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __divdf3vfp(double a, double b); // Appears to return a / b
27377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint    __eqsf2vfp(float a, float b);    // Appears to return  one
27477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     iff a == b and neither is NaN.
27577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint    __eqdf2vfp(double a, double b);  // Appears to return  one
27677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     iff a == b and neither is NaN.
27777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __extendsfdf2vfp(float a);       // Appears to convert from
27877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     float to double.
27977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint    __fixdfsivfp(double a);          // Appears to convert from
28077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     double to int.
28177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint    __fixsfsivfp(float a);           // Appears to convert from
28277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     float to int.
28377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaounsigned int __fixunssfsivfp(float a);  // Appears to convert from
28477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     float to unsigned int.
28577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaounsigned int __fixunsdfsivfp(double a); // Appears to convert from
28677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     double to unsigned int.
28777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __floatsidfvfp(int a);           // Appears to convert from
28877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     int to double.
28977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat __floatsisfvfp(int a);            // Appears to convert from
29077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     int to float.
29177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __floatunssidfvfp(unsigned int a); // Appears to convert from
29277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     unisgned int to double.
29377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat __floatunssisfvfp(unsigned int a); // Appears to convert from
29477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     unisgned int to float.
29577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __gedf2vfp(double a, double b);     // Appears to return __gedf2
29677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a >= b)
29777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __gesf2vfp(float a, float b);       // Appears to return __gesf2
29877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a >= b)
29977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __gtdf2vfp(double a, double b);     // Appears to return __gtdf2
30077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a > b)
30177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __gtsf2vfp(float a, float b);       // Appears to return __gtsf2
30277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a > b)
30377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __ledf2vfp(double a, double b);     // Appears to return __ledf2
30477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a <= b)
30577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __lesf2vfp(float a, float b);       // Appears to return __lesf2
30677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a <= b)
30777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __ltdf2vfp(double a, double b);     // Appears to return __ltdf2
30877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a < b)
30977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __ltsf2vfp(float a, float b);       // Appears to return __ltsf2
31077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a < b)
31177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __muldf3vfp(double a, double b); // Appears to return a * b
31277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat __mulsf3vfp(float a, float b);    // Appears to return a * b
31377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __nedf2vfp(double a, double b);     // Appears to return __nedf2
31477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     (a != b)
31577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __negdf2vfp(double a);           // Appears to return -a
31677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat __negsf2vfp(float a);             // Appears to return -a
31777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat __negsf2vfp(float a);             // Appears to return -a
31877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodouble __subdf3vfp(double a, double b); // Appears to return a - b
31977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat __subsf3vfp(float a, float b);    // Appears to return a - b
32077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofloat __truncdfsf2vfp(double a);        // Appears to convert from
32177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao                                        //     double to float.
32277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __unorddf2vfp(double a, double b);  // Appears to return __unorddf2
32377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint __unordsf2vfp(float a, float b);    // Appears to return __unordsf2
32477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
32577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
32677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoPreconditions are listed for each function at the definition when there are any.
32777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoAny preconditions reflect the specification at
32877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaohttp://gcc.gnu.org/onlinedocs/gccint/Libgcc.html#Libgcc.
32977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
33077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei LiaoAssumptions are listed in "int_lib.h", and in individual files.  Where possible
33177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoassumptions are checked at compile time.
332