4.2 Routines for floating point emulation
The software floating point library is used on machines which do not
have hardware support for floating point. It is also used whenever
-msoft-float is used to disable generation of floating point
instructions. (Not all targets support this switch.)
For compatibility with other compilers, the floating point emulation
routines can be renamed with the DECLARE_LIBRARY_RENAMES
macro
(see Library Calls). In this section, the default names are used.
Presently the library does not support XFmode
, which is used
for long double
on some architectures.
4.2.1 Arithmetic functions
— Runtime Function: float
__addsf3 (
float a, float b)
— Runtime Function: double
__adddf3 (
double a, double b)
— Runtime Function: long double
__addtf3 (
long double a, long double b)
— Runtime Function: long double
__addxf3 (
long double a, long double b)
These functions return the sum of a and b.
— Runtime Function: float
__subsf3 (
float a, float b)
— Runtime Function: double
__subdf3 (
double a, double b)
— Runtime Function: long double
__subtf3 (
long double a, long double b)
— Runtime Function: long double
__subxf3 (
long double a, long double b)
These functions return the difference between b and a;
that is, a - b.
— Runtime Function: float
__mulsf3 (
float a, float b)
— Runtime Function: double
__muldf3 (
double a, double b)
— Runtime Function: long double
__multf3 (
long double a, long double b)
— Runtime Function: long double
__mulxf3 (
long double a, long double b)
These functions return the product of a and b.
— Runtime Function: float
__divsf3 (
float a, float b)
— Runtime Function: double
__divdf3 (
double a, double b)
— Runtime Function: long double
__divtf3 (
long double a, long double b)
— Runtime Function: long double
__divxf3 (
long double a, long double b)
These functions return the quotient of a and b; that is,
a / b.
— Runtime Function: float
__negsf2 (
float a)
— Runtime Function: double
__negdf2 (
double a)
— Runtime Function: long double
__negtf2 (
long double a)
— Runtime Function: long double
__negxf2 (
long double a)
These functions return the negation of a. They simply flip the
sign bit, so they can produce negative zero and negative NaN.
4.2.2 Conversion functions
— Runtime Function: double
__extendsfdf2 (
float a)
— Runtime Function: long double
__extendsftf2 (
float a)
— Runtime Function: long double
__extendsfxf2 (
float a)
— Runtime Function: long double
__extenddftf2 (
double a)
— Runtime Function: long double
__extenddfxf2 (
double a)
These functions extend a to the wider mode of their return
type.
— Runtime Function: double
__truncxfdf2 (
long double a)
— Runtime Function: double
__trunctfdf2 (
long double a)
— Runtime Function: float
__truncxfsf2 (
long double a)
— Runtime Function: float
__trunctfsf2 (
long double a)
— Runtime Function: float
__truncdfsf2 (
double a)
These functions truncate a to the narrower mode of their return
type, rounding toward zero.
— Runtime Function: int
__fixsfsi (
float a)
— Runtime Function: int
__fixdfsi (
double a)
— Runtime Function: int
__fixtfsi (
long double a)
— Runtime Function: int
__fixxfsi (
long double a)
These functions convert a to a signed integer, rounding toward zero.
— Runtime Function: long
__fixsfdi (
float a)
— Runtime Function: long
__fixdfdi (
double a)
— Runtime Function: long
__fixtfdi (
long double a)
— Runtime Function: long
__fixxfdi (
long double a)
These functions convert a to a signed long, rounding toward zero.
— Runtime Function: long long
__fixsfti (
float a)
— Runtime Function: long long
__fixdfti (
double a)
— Runtime Function: long long
__fixtfti (
long double a)
— Runtime Function: long long
__fixxfti (
long double a)
These functions convert a to a signed long long, rounding toward zero.
— Runtime Function: unsigned int
__fixunssfsi (
float a)
— Runtime Function: unsigned int
__fixunsdfsi (
double a)
— Runtime Function: unsigned int
__fixunstfsi (
long double a)
— Runtime Function: unsigned int
__fixunsxfsi (
long double a)
These functions convert a to an unsigned integer, rounding
toward zero. Negative values all become zero.
— Runtime Function: unsigned long
__fixunssfdi (
float a)
— Runtime Function: unsigned long
__fixunsdfdi (
double a)
— Runtime Function: unsigned long
__fixunstfdi (
long double a)
— Runtime Function: unsigned long
__fixunsxfdi (
long double a)
These functions convert a to an unsigned long, rounding
toward zero. Negative values all become zero.
— Runtime Function: unsigned long long
__fixunssfti (
float a)
— Runtime Function: unsigned long long
__fixunsdfti (
double a)
— Runtime Function: unsigned long long
__fixunstfti (
long double a)
— Runtime Function: unsigned long long
__fixunsxfti (
long double a)
These functions convert a to an unsigned long long, rounding
toward zero. Negative values all become zero.
— Runtime Function: float
__floatsisf (
int i)
— Runtime Function: double
__floatsidf (
int i)
— Runtime Function: long double
__floatsitf (
int i)
— Runtime Function: long double
__floatsixf (
int i)
These functions convert i, a signed integer, to floating point.
— Runtime Function: float
__floatdisf (
long i)
— Runtime Function: double
__floatdidf (
long i)
— Runtime Function: long double
__floatditf (
long i)
— Runtime Function: long double
__floatdixf (
long i)
These functions convert i, a signed long, to floating point.
— Runtime Function: float
__floattisf (
long long i)
— Runtime Function: double
__floattidf (
long long i)
— Runtime Function: long double
__floattitf (
long long i)
— Runtime Function: long double
__floattixf (
long long i)
These functions convert i, a signed long long, to floating point.
— Runtime Function: float
__floatunsisf (
unsigned int i)
— Runtime Function: double
__floatunsidf (
unsigned int i)
— Runtime Function: long double
__floatunsitf (
unsigned int i)
— Runtime Function: long double
__floatunsixf (
unsigned int i)
These functions convert i, an unsigned integer, to floating point.
— Runtime Function: float
__floatundisf (
unsigned long i)
— Runtime Function: double
__floatundidf (
unsigned long i)
— Runtime Function: long double
__floatunditf (
unsigned long i)
— Runtime Function: long double
__floatundixf (
unsigned long i)
These functions convert i, an unsigned long, to floating point.
— Runtime Function: float
__floatuntisf (
unsigned long long i)
— Runtime Function: double
__floatuntidf (
unsigned long long i)
— Runtime Function: long double
__floatuntitf (
unsigned long long i)
— Runtime Function: long double
__floatuntixf (
unsigned long long i)
These functions convert i, an unsigned long long, to floating point.
4.2.3 Comparison functions
There are two sets of basic comparison functions.
— Runtime Function: int
__cmpsf2 (
float a, float b)
— Runtime Function: int
__cmpdf2 (
double a, double b)
— Runtime Function: int
__cmptf2 (
long double a, long double b)
These functions calculate a <=> b. That is, if a is less
than b, they return −1; if a is greater than b, they
return 1; and if a and b are equal they return 0. If
either argument is NaN they return 1, but you should not rely on this;
if NaN is a possibility, use one of the higher-level comparison
functions.
— Runtime Function: int
__unordsf2 (
float a, float b)
— Runtime Function: int
__unorddf2 (
double a, double b)
— Runtime Function: int
__unordtf2 (
long double a, long double b)
These functions return a nonzero value if either argument is NaN, otherwise 0.
There is also a complete group of higher level functions which
correspond directly to comparison operators. They implement the ISO C
semantics for floating-point comparisons, taking NaN into account.
Pay careful attention to the return values defined for each set.
Under the hood, all of these routines are implemented as
if (__unordXf2 (a, b))
return E;
return __cmpXf2 (a, b);
where E is a constant chosen to give the proper behavior for
NaN. Thus, the meaning of the return value is different for each set.
Do not rely on this implementation; only the semantics documented
below are guaranteed.
— Runtime Function: int
__eqsf2 (
float a, float b)
— Runtime Function: int
__eqdf2 (
double a, double b)
— Runtime Function: int
__eqtf2 (
long double a, long double b)
These functions return zero if neither argument is NaN, and a and
b are equal.
— Runtime Function: int
__nesf2 (
float a, float b)
— Runtime Function: int
__nedf2 (
double a, double b)
— Runtime Function: int
__netf2 (
long double a, long double b)
These functions return a nonzero value if either argument is NaN, or
if a and b are unequal.
— Runtime Function: int
__gesf2 (
float a, float b)
— Runtime Function: int
__gedf2 (
double a, double b)
— Runtime Function: int
__getf2 (
long double a, long double b)
These functions return a value greater than or equal to zero if
neither argument is NaN, and a is greater than or equal to
b.
— Runtime Function: int
__ltsf2 (
float a, float b)
— Runtime Function: int
__ltdf2 (
double a, double b)
— Runtime Function: int
__lttf2 (
long double a, long double b)
These functions return a value less than zero if neither argument is
NaN, and a is strictly less than b.
— Runtime Function: int
__lesf2 (
float a, float b)
— Runtime Function: int
__ledf2 (
double a, double b)
— Runtime Function: int
__letf2 (
long double a, long double b)
These functions return a value less than or equal to zero if neither
argument is NaN, and a is less than or equal to b.
— Runtime Function: int
__gtsf2 (
float a, float b)
— Runtime Function: int
__gtdf2 (
double a, double b)
— Runtime Function: int
__gttf2 (
long double a, long double b)
These functions return a value greater than zero if neither argument
is NaN, and a is strictly greater than b.
4.2.4 Other floating-point functions
— Runtime Function: float
__powisf2 (
float a, int b)
— Runtime Function: double
__powidf2 (
double a, int b)
— Runtime Function: long double
__powitf2 (
long double a, int b)
— Runtime Function: long double
__powixf2 (
long double a, int b)
These functions convert raise a to the power b.
— Runtime Function: complex float
__mulsc3 (
float a, float b, float c, float d)
— Runtime Function: complex double
__muldc3 (
double a, double b, double c, double d)
— Runtime Function: complex long double
__multc3 (
long double a, long double b, long double c, long double d)
— Runtime Function: complex long double
__mulxc3 (
long double a, long double b, long double c, long double d)
These functions return the product of a + ib and
c + id, following the rules of C99 Annex G.
— Runtime Function: complex float
__divsc3 (
float a, float b, float c, float d)
— Runtime Function: complex double
__divdc3 (
double a, double b, double c, double d)
— Runtime Function: complex long double
__divtc3 (
long double a, long double b, long double c, long double d)
— Runtime Function: complex long double
__divxc3 (
long double a, long double b, long double c, long double d)
These functions return the quotient of a + ib and
c + id (i.e., (a + ib) / (c
+ id)), following the rules of C99 Annex G.