==============================================
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]]