### 4.3 Routines for decimal floating point emulation

The software decimal floating point library implements IEEE 754R decimal floating point arithmetic and is only activated on selected targets.

#### 4.3.1 Arithmetic functions

— Runtime Function: _Decimal32 __addsd3 (_Decimal32 a, _Decimal32 b)
— Runtime Function: _Decimal64 __adddd3 (_Decimal64 a, _Decimal64 b)
— Runtime Function: _Decimal128 __addtd3 (_Decimal128 a, _Decimal128 b)

> These functions return the sum of a and b.

— Runtime Function: _Decimal32 __subsd3 (_Decimal32 a, _Decimal32 b)
— Runtime Function: _Decimal64 __subdd3 (_Decimal64 a, _Decimal64 b)
— Runtime Function: _Decimal128 __subtd3 (_Decimal128 a, _Decimal128 b)

> These functions return the difference between b and a; that is, a - b.

— Runtime Function: _Decimal32 __mulsd3 (_Decimal32 a, _Decimal32 b)
— Runtime Function: _Decimal64 __muldd3 (_Decimal64 a, _Decimal64 b)
— Runtime Function: _Decimal128 __multd3 (_Decimal128 a, _Decimal128 b)

> These functions return the product of a and b.

— Runtime Function: _Decimal32 __divsd3 (_Decimal32 a, _Decimal32 b)
— Runtime Function: _Decimal64 __divdd3 (_Decimal64 a, _Decimal64 b)
— Runtime Function: _Decimal128 __divtd3 (_Decimal128 a, _Decimal128 b)

> These functions return the quotient of a and b; that is, a / b.

— Runtime Function: _Decimal32 __negsd2 (_Decimal32 a)
— Runtime Function: _Decimal64 __negdd2 (_Decimal64 a)
— Runtime Function: _Decimal128 __negtd2 (_Decimal128 a)

> These functions return the negation of a. They simply flip the sign bit, so they can produce negative zero and negative NaN.

#### 4.3.2 Conversion functions

— Runtime Function: _Decimal64 __extendsddd2 (_Decimal32 a)
— Runtime Function: _Decimal128 __extendsdtd2 (_Decimal32 a)
— Runtime Function: _Decimal128 __extendddtd2 (_Decimal64 a)

> — Runtime Function: _Decimal32 __extendsfsd (float a)
> — Runtime Function: double __extendsddf (_Decimal32 a)
> — Runtime Function: long double __extendsdxf (_Decimal32 a)
> — Runtime Function: _Decimal64 __extendsfdd (float a)
> — Runtime Function: _Decimal64 __extenddfdd (double a)
> — Runtime Function: long double __extendddxf (_Decimal64 a)
> — Runtime Function: _Decimal128 __extendsftd (float a)
> — Runtime Function: _Decimal128 __extenddftd (double a)
> — Runtime Function: _Decimal128 __extendxftd (long double a)

> > These functions extend a to the wider mode of their return type.

— Runtime Function: _Decimal32 __truncddsd2 (_Decimal64 a)
— Runtime Function: _Decimal32 __trunctdsd2 (_Decimal128 a)
— Runtime Function: _Decimal64 __trunctddd2 (_Decimal128 a)

> — Runtime Function: float __truncsdsf (_Decimal32 a)
> — Runtime Function: _Decimal32 __truncdfsd (double a)
> — Runtime Function: _Decimal32 __truncxfsd (long double a)
> — Runtime Function: float __truncddsf (_Decimal64 a)
> — Runtime Function: double __truncdddf (_Decimal64 a)
> — Runtime Function: _Decimal64 __truncxfdd (long double a)
> — Runtime Function: float __trunctdsf (_Decimal128 a)
> — Runtime Function: double __trunctddf (_Decimal128 a)
> — Runtime Function: long double __trunctdxf (_Decimal128 a)

> > These functions truncate a to the narrower mode of their return type.

— Runtime Function: int __fixsdsi (_Decimal32 a)
— Runtime Function: int __fixddsi (_Decimal64 a)
— Runtime Function: int __fixtdsi (_Decimal128 a)

> These functions convert a to a signed integer.

— Runtime Function: long __fixsddi (_Decimal32 a)
— Runtime Function: long __fixdddi (_Decimal64 a)
— Runtime Function: long __fixtddi (_Decimal128 a)

> These functions convert a to a signed long.

— Runtime Function: unsigned int __fixunssdsi (_Decimal32 a)
— Runtime Function: unsigned int __fixunsddsi (_Decimal64 a)
— Runtime Function: unsigned int __fixunstdsi (_Decimal128 a)

> These functions convert a to an unsigned integer. Negative values all become zero.

— Runtime Function: unsigned long __fixunssddi (_Decimal32 a)
— Runtime Function: unsigned long __fixunsdddi (_Decimal64 a)
— Runtime Function: unsigned long __fixunstddi (_Decimal128 a)

> These functions convert a to an unsigned long. Negative values all become zero.

— Runtime Function: _Decimal32 __floatsisd (int i)
— Runtime Function: _Decimal64 __floatsidd (int i)
— Runtime Function: _Decimal128 __floatsitd (int i)

> These functions convert i, a signed integer, to decimal floating point.

— Runtime Function: _Decimal32 __floatdisd (long i)
— Runtime Function: _Decimal64 __floatdidd (long i)
— Runtime Function: _Decimal128 __floatditd (long i)

> These functions convert i, a signed long, to decimal floating point.

— Runtime Function: _Decimal32 __floatunssisd (unsigned int i)
— Runtime Function: _Decimal64 __floatunssidd (unsigned int i)
— Runtime Function: _Decimal128 __floatunssitd (unsigned int i)

> These functions convert i, an unsigned integer, to decimal floating point.

— Runtime Function: _Decimal32 __floatunsdisd (unsigned long i)
— Runtime Function: _Decimal64 __floatunsdidd (unsigned long i)
— Runtime Function: _Decimal128 __floatunsditd (unsigned long i)

> These functions convert i, an unsigned long, to decimal floating point.

#### 4.3.3 Comparison functions

— Runtime Function: int __unordsd2 (_Decimal32 a, _Decimal32 b)
— Runtime Function: int __unorddd2 (_Decimal64 a, _Decimal64 b)
— Runtime Function: int __unordtd2 (_Decimal128 a, _Decimal128 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 (__unordXd2 (a, b))
             return E;
           return __cmpXd2 (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 __eqsd2 (_Decimal32 a, _Decimal32 b)
— Runtime Function: int __eqdd2 (_Decimal64 a, _Decimal64 b)
— Runtime Function: int __eqtd2 (_Decimal128 a, _Decimal128 b)

> These functions return zero if neither argument is NaN, and a and b are equal.

— Runtime Function: int __nesd2 (_Decimal32 a, _Decimal32 b)
— Runtime Function: int __nedd2 (_Decimal64 a, _Decimal64 b)
— Runtime Function: int __netd2 (_Decimal128 a, _Decimal128 b)

> These functions return a nonzero value if either argument is NaN, or if a and b are unequal.

— Runtime Function: int __gesd2 (_Decimal32 a, _Decimal32 b)
— Runtime Function: int __gedd2 (_Decimal64 a, _Decimal64 b)
— Runtime Function: int __getd2 (_Decimal128 a, _Decimal128 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 __ltsd2 (_Decimal32 a, _Decimal32 b)
— Runtime Function: int __ltdd2 (_Decimal64 a, _Decimal64 b)
— Runtime Function: int __lttd2 (_Decimal128 a, _Decimal128 b)

> These functions return a value less than zero if neither argument is NaN, and a is strictly less than b.

— Runtime Function: int __lesd2 (_Decimal32 a, _Decimal32 b)
— Runtime Function: int __ledd2 (_Decimal64 a, _Decimal64 b)
— Runtime Function: int __letd2 (_Decimal128 a, _Decimal128 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 __gtsd2 (_Decimal32 a, _Decimal32 b)
— Runtime Function: int __gtdd2 (_Decimal64 a, _Decimal64 b)
— Runtime Function: int __gttd2 (_Decimal128 a, _Decimal128 b)

> These functions return a value greater than zero if neither argument is NaN, and a is strictly greater than b.