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 Implicit Calls to Library Routines). In this section, the default names are used.
Presently the library does not support XFmode, which is used
for long double on some architectures.
Arithmetic functions#
-
float __addsf3(float a, float b)#
-
double __adddf3(double a, double b)#
-
long double __addtf3(long double a, long double b)#
-
long double __addxf3(long double a, long double b)#
These functions return the sum of
aandb.
-
float __subsf3(float a, float b)#
-
double __subdf3(double a, double b)#
-
long double __subtf3(long double a, long double b)#
-
long double __subxf3(long double a, long double b)#
These functions return the difference between
banda; that is,a-b.
-
float __mulsf3(float a, float b)#
-
double __muldf3(double a, double b)#
-
long double __multf3(long double a, long double b)#
-
long double __mulxf3(long double a, long double b)#
These functions return the product of
aandb.
Conversion functions#
-
double __extendsfdf2(float a)#
-
long double __extendsftf2(float a)#
-
long double __extendsfxf2(float a)#
-
long double __extenddftf2(double a)#
-
long double __extenddfxf2(double a)#
These functions extend
ato the wider mode of their return type.
-
double __truncxfdf2(long double a)#
-
double __trunctfdf2(long double a)#
-
float __truncxfsf2(long double a)#
-
float __trunctfsf2(long double a)#
-
float __truncdfsf2(double a)#
These functions truncate
ato the narrower mode of their return type, rounding toward zero.
-
int __fixsfsi(float a)#
-
int __fixdfsi(double a)#
-
int __fixtfsi(long double a)#
-
int __fixxfsi(long double a)#
These functions convert
ato a signed integer, rounding toward zero.
-
long __fixsfdi(float a)#
-
long __fixdfdi(double a)#
-
long __fixtfdi(long double a)#
-
long __fixxfdi(long double a)#
These functions convert
ato a signed long, rounding toward zero.
-
long long __fixsfti(float a)#
-
long long __fixdfti(double a)#
-
long long __fixtfti(long double a)#
-
long long __fixxfti(long double a)#
These functions convert
ato a signed long long, rounding toward zero.
-
unsigned int __fixunssfsi(float a)#
-
unsigned int __fixunsdfsi(double a)#
-
unsigned int __fixunstfsi(long double a)#
-
unsigned int __fixunsxfsi(long double a)#
These functions convert
ato an unsigned integer, rounding toward zero. Negative values all become zero.
-
unsigned long __fixunssfdi(float a)#
-
unsigned long __fixunsdfdi(double a)#
-
unsigned long __fixunstfdi(long double a)#
-
unsigned long __fixunsxfdi(long double a)#
These functions convert
ato an unsigned long, rounding toward zero. Negative values all become zero.
-
unsigned long long __fixunssfti(float a)#
-
unsigned long long __fixunsdfti(double a)#
-
unsigned long long __fixunstfti(long double a)#
-
unsigned long long __fixunsxfti(long double a)#
These functions convert
ato an unsigned long long, rounding toward zero. Negative values all become zero.
-
float __floatsisf(int i)#
-
double __floatsidf(int i)#
-
long double __floatsitf(int i)#
-
long double __floatsixf(int i)#
These functions convert
i, a signed integer, to floating point.
-
float __floatdisf(long i)#
-
double __floatdidf(long i)#
-
long double __floatditf(long i)#
-
long double __floatdixf(long i)#
These functions convert
i, a signed long, to floating point.
-
float __floattisf(long long i)#
-
double __floattidf(long long i)#
-
long double __floattitf(long long i)#
-
long double __floattixf(long long i)#
These functions convert
i, a signed long long, to floating point.
-
float __floatunsisf(unsigned int i)#
-
double __floatunsidf(unsigned int i)#
-
long double __floatunsitf(unsigned int i)#
-
long double __floatunsixf(unsigned int i)#
These functions convert
i, an unsigned integer, to floating point.
Comparison functions#
There are two sets of basic comparison functions.
-
int __cmpsf2(float a, float b)#
-
int __cmpdf2(double a, double b)#
-
int __cmptf2(long double a, long double b)#
These functions calculate a <=> b. That is, if
ais less thanb, they return -1; ifais greater thanb, they return 1; and ifaandbare 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.
-
int __unordsf2(float a, float b)#
-
int __unorddf2(double a, double b)#
-
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.
-
int __eqsf2(float a, float b)#
-
int __eqdf2(double a, double b)#
-
int __eqtf2(long double a, long double b)#
These functions return zero if neither argument is NaN, and
aandbare equal.
-
int __nesf2(float a, float b)#
-
int __nedf2(double a, double b)#
-
int __netf2(long double a, long double b)#
These functions return a nonzero value if either argument is NaN, or if
aandbare unequal.
-
int __gesf2(float a, float b)#
-
int __gedf2(double a, double b)#
-
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
ais greater than or equal tob.
-
int __ltsf2(float a, float b)#
-
int __ltdf2(double a, double b)#
-
int __lttf2(long double a, long double b)#
These functions return a value less than zero if neither argument is NaN, and
ais strictly less thanb.
Other floating-point functions#
-
float __powisf2(float a, int b)#
-
double __powidf2(double a, int b)#
-
long double __powitf2(long double a, int b)#
-
long double __powixf2(long double a, int b)#
These functions convert raise
ato the powerb.
-
complex float __mulsc3(float a, float b, float c, float d)#
-
complex double __muldc3(double a, double b, double c, double d)#
-
complex long double __multc3(long double a, long double b, long double c, long double d)#
-
complex long double __mulxc3(long double a, long double b, long double c, long double d)#
These functions return the product of
a+ ibandc+ id, following the rules of C99 Annex G.
-
complex float __divsc3(float a, float b, float c, float d)#
-
complex double __divdc3(double a, double b, double c, double d)#
-
complex long double __divtc3(long double a, long double b, long double c, long double d)#
-
complex long double __divxc3(long double a, long double b, long double c, long double d)#
These functions return the quotient of
a+ ibandc+ id(i.e., (a+ ib) / (c+ id)), following the rules of C99 Annex G.