| ============================================== |
| libbcc Compiler Runtime Function Documentation |
| ============================================== |
| |
| Integer Arithmetic Routines |
| --------------------------- |
| |
| *Arithmetic Functions*:: |
| |
| __ashldi3 : long (long a, int b) // a << b [[llvm]] |
| __ashrdi3 : long (long a, int b) // a / 2**b (i.e. arithmetic a >> b) [[llvm]] |
| __divdi3 : long (long a, long b) // a / b [[llvm]] |
| __lshrdi3 : long (long a, int b) // a >> b (without sign extension) [[llvm]] |
| __moddi3 : long (long a, long b) // a % b [[llvm]] |
| __muldi3 : long (long a, long b) // a * b [[llvm]] |
| __muldsi3 : long (int a, int b) // (long)a * (long)b [[llvm compiler-rt extension]] [[llvm]] |
| __negdi2 : long (long a) // -a [[llvm]] |
| __udivsi3 : unsigned int (unsigned int a, unsigned int b) // unsigned int a / b [[llvm]] |
| __udivdi3 : unsigned long (unsigned long a, unsigned long a) // unsigned long a / b [[llvm]] |
| __udivmoddi4 : unsigned long (unsigned long a, unsigned long b, unsigned long *rem) // unsigned long a/b and a%b [[llvm]] |
| __umoddi3 : unsigned long (unsigned long a, unsigned long b) // unsigned long a % b [[llvm]] |
| |
| *Comparison functions*:: |
| |
| __cmpdi2 : int (long a, long b) // Signed comparison of a and b. (if a < b then return 0. if a == b then return 1. if a > b then return 2.) [[llvm]] |
| __ucmpdi2 : int (unsigned long a, unsigned long a) // Unsigned comparison of a and b. (if a < b then return 0. if a == b then return 1. if a > b then return 2.) [[llvm]] |
| |
| *Trapping arithmetic functions*:: |
| |
| __absvsi2 : int (int a) // |a| [[llvm]] |
| __absvdi2 : long (long a) // |a| [[llvm]] |
| __addvsi3 : int (int a, int b) // a + b [[llvm]] |
| __addvdi3 : long (long a, long b) // a + b [[llvm]] |
| __mulvsi3 : int (int a, int b) // a * b [[llvm]] |
| __mulvdi3 : long (long a, long b) // a * b [[llvm]] |
| __negvsi2 : int (int a) // -a [[llvm]] |
| __negvdi2 : long (long a) // -a [[llvm]] |
| __subvsi3 : int (int a, int b) // a - b [[llvm]] |
| __subvdi3 : long (long a, long b) // a - b [[llvm]] |
| |
| *Bit operations*:: |
| |
| __clzsi2 : int (int a) // number of leading 0-bits in a from MSB [[llvm]] |
| __clzdi2 : int (long a) // number of leading 0-bits in a from MSB [[llvm]] |
| __ctzsi2 : int (int a) // number of trailing 0-bits in a from LSB [[llvm]] |
| __ctzdi2 : int (long a) // number of trailing 0-bits in a from LSB [[llvm]] |
| __ffsdi2 : int (long a) // index of the least significant 1-bit [[llvm]] |
| __paritysi2 : int (int a) // parity (if number of 1-bits is even, then return 0) [[llvm]] |
| __paritydi2 : int (long a) // parity (if number of 1-bits is even, then return 0) [[llvm]] |
| __popcountsi2 : int (int a) // number of 1-bits [[llvm]] |
| __popcountdi2 : int (long a) // number of 1-bits [[llvm]] |
| __bswapsi2 : uint32_t (uint32_t) // reverse the byte order [[generic]] |
| __bswapdi2 : uint64_t (uint64_t) // reverse the byte order [[generic]] |
| |
| Floating Point Emulation Routines |
| --------------------------------- |
| |
| *Arithmetic functions*:: |
| |
| __addsf3 : float (float a, float b) // a + b [[vfp]] [[generic]] |
| __adddf3 : double (double a, double b) // a + b [[vfp]] [[generic]] |
| __subsf3 : float (float a, float b) // a - b [[vfp]] [[generic]] |
| __subdf3 : double (double a, double b) // a - b [[vfp]] [[generic]] |
| __mulsf3 : float (float a, float b) // a * b [[vfp]] [[generic]] |
| __muldf3 : double (double a, double b) // a * b [[vfp]] [[generic]] |
| __divsf3 : float (float a, float b) // a / b [[vfp]] [[generic]] |
| __divdf3 : double (double a, double b) // a / b [[vfp]] [[generic]] |
| __negsf2 : float (float a) // -a [[vfp]] [[generic]] |
| __negdf2 : double (double a) // -a [[vfp]] [[generic]] |
| |
| *Conversion functions*:: |
| |
| __extendsfdf2 : double (float a) // (double)a [[vfp]] [[generic]] |
| __truncdfsf2 : float (double a) // (float)a [[vfp]] [[generic]] |
| __fixsfsi : int (float a) // (int)a, rounding toward 0 [[vfp]] [[generic]] |
| __fixdfsi : int (double a) // (int)a, rounding toward 0 [[vfp]] [[generic]] |
| __fixsfdi : long (float a) // (long)a, rounding toward 0 [[llvm]] |
| __fixdfdi : long (double a) // (long)a, rounding toward 0 [[llvm]] |
| __fixunssfsi : unsigned int (float a) // (unsigned int)a, rounding toward 0, negative number will be 0. [[vfp]] [[llvm]] |
| __fixunsdfsi : unsigned int (double a) // (unsigned int)a, rounding toward 0, negative number will be 0. [[vfp]] [[llvm]] |
| __fixunssfdi : unsigned long (float a) // (unsigned long)a, rounding toward 0, negative number will be 0. [[llvm]] |
| __fixunsdfdi : unsigned long (double a) // (unsigned long)a, rounding toward 0, negative number will be 0. [[llvm]] |
| __floatsisf : float (int i) // (float)i [[vfp]] [[generic]] |
| __floatsidf : double (int i) // (double)i [[vfp]] [[generic]] |
| __floatdisf : float (long i) // (float) i [[llvm]] |
| __floatdidf : double (long i) // (double)i [[llvm]] |
| __floatunsisf : float (unsigned int i) // (float)i [[generic]] |
| __floatunsidf : double (unsigned int i) // (double)i [[generic]] |
| __floatunssisfvfp : float (unsigned int i) // (float)i [[llvm compiler-rt extension]] [[vfp]] |
| __floatunssidfvfp : double (unsigned int i) // (double)i [[llvm compiler-rt extension]] [[vfp]] |
| __floatundisf : float (unsigned long i) // (float)i [[llvm]] |
| __floatundidf : double (unsigned long i) // (double)i [[llvm]] |
| __unordsf2 : int (float a, float b) // if a == NaN or b == NaN, then return non-zero. [[vfp]] [[generic]] |
| __unorddf2 : int (double a, double b) // if a == NaN or b == NaN, then return non-zero. [[vfp]] [[generic]] |
| __eqsf2 : int (float a, float b) // a != b (i.e. return 0 when a == b) (note: NaN != NaN) [[vfp]] [[generic]] |
| __eqdf2 : int (double a, double b) // a != b (i.e. return 0 when a == b) (note: NaN != NaN) [[vfp]] [[generic]] |
| __nesf2 : int (float a, float b) // a != b || a == NaN || b == NaN [[vfp]] |
| __nedf2 : int (double a, double b) // a != b || a == NaN || b == NaN [[vfp]] |
| __gesf2 : int (float a, float b) // (a >= b) ? nonnegative_value : negative_value [[vfp]] [[generic]] |
| __gedf2 : int (double a, double b) // (a >= b) ? nonnegative_value : negative_value [[vfp]] [[generic]] |
| __ltsf2 : int (float a, float b) // (a < b) ? negative_value : nonnegative_value [[vfp]] |
| __ltdf2 : int (double a, double b) // (a < b) ? negative_value : nonnegative_value [[vfp]] |
| __lesf2 : int (float a, float b) // (a <= b) ? nonpositive_value : positive_value [[vfp]] [[generic]] |
| __ledf2 : int (double a, double b) // (a <= b) ? nonpositive_value : positive_value [[vfp]] [[generic]] |
| __gtsf2 : int (float a, float b) // (a > b) ? positive_value : nonpositive_value [[vfp]] |
| __gtdf2 : int (double a, double b) // (a > b) ? positive_value : nonpositive_value [[vfp]] |
| |
| *Other floating-point functions*:: |
| |
| __powisf2 : float (float a, int b) // a**b [[llvm]] |
| __powidf2 : double (double a, int b) // a**b [[llvm]] |
| __mulsc3 : complex_float (float a, float b, float c, float d) // (a+bi) * (c+di) [[llvm]] |
| __muldc3 : complex_double (double a, double b, double c, double d) // (a+bi) * (c+di) [[llvm]] |
| __divsc3 : complex_float (float a, float b, float c, float d) // (a+bi) / (c+di) [[llvm]] |
| __divdc3 : complex_double (double a, double b, double c, double d) // (a+bi) / (c+di) [[llvm]] |
| |
| |
| |
| Miscellaneous Routines |
| ---------------------- |
| |
| :: |
| |
| __eprintf : void (char const *, char const *, char const *, char const *) // fprintf for assertions [[llvm compiler-rt extension]] [[llvm]] |