Decimal float library routines (GNU Compiler Collection (GCC) Internals)

### 3.3 Routines for decimal floating point emulation ¶

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

The software decimal floating point library supports either DPD (Densely Packed Decimal) or BID (Binary Integer Decimal) encoding as selected at configure time.

#### 3.3.1 Arithmetic functions ¶

Runtime Function: `_Decimal32` __dpd_addsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal32` __bid_addsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal64` __dpd_adddd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal64` __bid_adddd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal128` __dpd_addtd3 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `_Decimal128` __bid_addtd3 `(_Decimal128 a, _Decimal128 b)` ¶

  These functions return the sum of a and b.

Runtime Function: `_Decimal32` __dpd_subsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal32` __bid_subsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal64` __dpd_subdd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal64` __bid_subdd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal128` __dpd_subtd3 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `_Decimal128` __bid_subtd3 `(_Decimal128 a, _Decimal128 b)` ¶

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

Runtime Function: `_Decimal32` __dpd_mulsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal32` __bid_mulsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal64` __dpd_muldd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal64` __bid_muldd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal128` __dpd_multd3 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `_Decimal128` __bid_multd3 `(_Decimal128 a, _Decimal128 b)` ¶

  These functions return the product of a and b.

Runtime Function: `_Decimal32` __dpd_divsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal32` __bid_divsd3 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `_Decimal64` __dpd_divdd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal64` __bid_divdd3 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `_Decimal128` __dpd_divtd3 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `_Decimal128` __bid_divtd3 `(_Decimal128 a, _Decimal128 b)` ¶

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

Runtime Function: `_Decimal32` __dpd_negsd2 `(_Decimal32 a)` ¶
Runtime Function: `_Decimal32` __bid_negsd2 `(_Decimal32 a)` ¶
Runtime Function: `_Decimal64` __dpd_negdd2 `(_Decimal64 a)` ¶
Runtime Function: `_Decimal64` __bid_negdd2 `(_Decimal64 a)` ¶
Runtime Function: `_Decimal128` __dpd_negtd2 `(_Decimal128 a)` ¶
Runtime Function: `_Decimal128` __bid_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.

#### 3.3.2 Conversion functions ¶

Runtime Function: `_Decimal64` __dpd_extendsddd2 `(_Decimal32 a)` ¶
Runtime Function: `_Decimal64` __bid_extendsddd2 `(_Decimal32 a)` ¶
Runtime Function: `_Decimal128` __dpd_extendsdtd2 `(_Decimal32 a)` ¶
Runtime Function: `_Decimal128` __bid_extendsdtd2 `(_Decimal32 a)` ¶
Runtime Function: `_Decimal128` __dpd_extendddtd2 `(_Decimal64 a)` ¶
Runtime Function: `_Decimal128` __bid_extendddtd2 `(_Decimal64 a)` ¶
Runtime Function: `_Decimal32` __dpd_truncddsd2 `(_Decimal64 a)` ¶
Runtime Function: `_Decimal32` __bid_truncddsd2 `(_Decimal64 a)` ¶
Runtime Function: `_Decimal32` __dpd_trunctdsd2 `(_Decimal128 a)` ¶
Runtime Function: `_Decimal32` __bid_trunctdsd2 `(_Decimal128 a)` ¶
Runtime Function: `_Decimal64` __dpd_trunctddd2 `(_Decimal128 a)` ¶
Runtime Function: `_Decimal64` __bid_trunctddd2 `(_Decimal128 a)` ¶

  These functions convert the value a from one decimal floating type to another.

Runtime Function: `_Decimal64` __dpd_extendsfdd `(float a)` ¶
Runtime Function: `_Decimal64` __bid_extendsfdd `(float a)` ¶
Runtime Function: `_Decimal128` __dpd_extendsftd `(float a)` ¶
Runtime Function: `_Decimal128` __bid_extendsftd `(float a)` ¶
Runtime Function: `_Decimal128` __dpd_extenddftd `(double a)` ¶
Runtime Function: `_Decimal128` __bid_extenddftd `(double a)` ¶
Runtime Function: `_Decimal128` __dpd_extendxftd `(long double a)` ¶
Runtime Function: `_Decimal128` __bid_extendxftd `(long double a)` ¶
Runtime Function: `_Decimal32` __dpd_truncdfsd `(double a)` ¶
Runtime Function: `_Decimal32` __bid_truncdfsd `(double a)` ¶
Runtime Function: `_Decimal32` __dpd_truncxfsd `(long double a)` ¶
Runtime Function: `_Decimal32` __bid_truncxfsd `(long double a)` ¶
Runtime Function: `_Decimal32` __dpd_trunctfsd `(long double a)` ¶
Runtime Function: `_Decimal32` __bid_trunctfsd `(long double a)` ¶
Runtime Function: `_Decimal64` __dpd_truncxfdd `(long double a)` ¶
Runtime Function: `_Decimal64` __bid_truncxfdd `(long double a)` ¶
Runtime Function: `_Decimal64` __dpd_trunctfdd `(long double a)` ¶
Runtime Function: `_Decimal64` __bid_trunctfdd `(long double a)` ¶

  These functions convert the value of a from a binary floating type to a decimal floating type of a different size.

Runtime Function: `float` __dpd_truncddsf `(_Decimal64 a)` ¶
Runtime Function: `float` __bid_truncddsf `(_Decimal64 a)` ¶
Runtime Function: `float` __dpd_trunctdsf `(_Decimal128 a)` ¶
Runtime Function: `float` __bid_trunctdsf `(_Decimal128 a)` ¶
Runtime Function: `double` __dpd_extendsddf `(_Decimal32 a)` ¶
Runtime Function: `double` __bid_extendsddf `(_Decimal32 a)` ¶
Runtime Function: `double` __dpd_trunctddf `(_Decimal128 a)` ¶
Runtime Function: `double` __bid_trunctddf `(_Decimal128 a)` ¶
Runtime Function: `long double` __dpd_extendsdxf `(_Decimal32 a)` ¶
Runtime Function: `long double` __bid_extendsdxf `(_Decimal32 a)` ¶
Runtime Function: `long double` __dpd_extendddxf `(_Decimal64 a)` ¶
Runtime Function: `long double` __bid_extendddxf `(_Decimal64 a)` ¶
Runtime Function: `long double` __dpd_trunctdxf `(_Decimal128 a)` ¶
Runtime Function: `long double` __bid_trunctdxf `(_Decimal128 a)` ¶
Runtime Function: `long double` __dpd_extendsdtf `(_Decimal32 a)` ¶
Runtime Function: `long double` __bid_extendsdtf `(_Decimal32 a)` ¶
Runtime Function: `long double` __dpd_extendddtf `(_Decimal64 a)` ¶
Runtime Function: `long double` __bid_extendddtf `(_Decimal64 a)` ¶

  These functions convert the value of a from a decimal floating type to a binary floating type of a different size.

Runtime Function: `_Decimal32` __dpd_extendsfsd `(float a)` ¶
Runtime Function: `_Decimal32` __bid_extendsfsd `(float a)` ¶
Runtime Function: `_Decimal64` __dpd_extenddfdd `(double a)` ¶
Runtime Function: `_Decimal64` __bid_extenddfdd `(double a)` ¶
Runtime Function: `_Decimal128` __dpd_extendtftd `(long double a)` ¶
Runtime Function: `_Decimal128` __bid_extendtftd `(long double a)` ¶
Runtime Function: `float` __dpd_truncsdsf `(_Decimal32 a)` ¶
Runtime Function: `float` __bid_truncsdsf `(_Decimal32 a)` ¶
Runtime Function: `double` __dpd_truncdddf `(_Decimal64 a)` ¶
Runtime Function: `double` __bid_truncdddf `(_Decimal64 a)` ¶
Runtime Function: `long double` __dpd_trunctdtf `(_Decimal128 a)` ¶
Runtime Function: `long double` __bid_trunctdtf `(_Decimal128 a)` ¶

  These functions convert the value of a between decimal and binary floating types of the same size.

Runtime Function: `int` __dpd_fixsdsi `(_Decimal32 a)` ¶
Runtime Function: `int` __bid_fixsdsi `(_Decimal32 a)` ¶
Runtime Function: `int` __dpd_fixddsi `(_Decimal64 a)` ¶
Runtime Function: `int` __bid_fixddsi `(_Decimal64 a)` ¶
Runtime Function: `int` __dpd_fixtdsi `(_Decimal128 a)` ¶
Runtime Function: `int` __bid_fixtdsi `(_Decimal128 a)` ¶

  These functions convert a to a signed integer.

Runtime Function: `long` __dpd_fixsddi `(_Decimal32 a)` ¶
Runtime Function: `long` __bid_fixsddi `(_Decimal32 a)` ¶
Runtime Function: `long` __dpd_fixdddi `(_Decimal64 a)` ¶
Runtime Function: `long` __bid_fixdddi `(_Decimal64 a)` ¶
Runtime Function: `long` __dpd_fixtddi `(_Decimal128 a)` ¶
Runtime Function: `long` __bid_fixtddi `(_Decimal128 a)` ¶

  These functions convert a to a signed long.

Runtime Function: `unsigned int` __dpd_fixunssdsi `(_Decimal32 a)` ¶
Runtime Function: `unsigned int` __bid_fixunssdsi `(_Decimal32 a)` ¶
Runtime Function: `unsigned int` __dpd_fixunsddsi `(_Decimal64 a)` ¶
Runtime Function: `unsigned int` __bid_fixunsddsi `(_Decimal64 a)` ¶
Runtime Function: `unsigned int` __dpd_fixunstdsi `(_Decimal128 a)` ¶
Runtime Function: `unsigned int` __bid_fixunstdsi `(_Decimal128 a)` ¶

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

Runtime Function: `unsigned long` __dpd_fixunssddi `(_Decimal32 a)` ¶
Runtime Function: `unsigned long` __bid_fixunssddi `(_Decimal32 a)` ¶
Runtime Function: `unsigned long` __dpd_fixunsdddi `(_Decimal64 a)` ¶
Runtime Function: `unsigned long` __bid_fixunsdddi `(_Decimal64 a)` ¶
Runtime Function: `unsigned long` __dpd_fixunstddi `(_Decimal128 a)` ¶
Runtime Function: `unsigned long` __bid_fixunstddi `(_Decimal128 a)` ¶

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

Runtime Function: `_Decimal32` __dpd_floatsisd `(int i)` ¶
Runtime Function: `_Decimal32` __bid_floatsisd `(int i)` ¶
Runtime Function: `_Decimal64` __dpd_floatsidd `(int i)` ¶
Runtime Function: `_Decimal64` __bid_floatsidd `(int i)` ¶
Runtime Function: `_Decimal128` __dpd_floatsitd `(int i)` ¶
Runtime Function: `_Decimal128` __bid_floatsitd `(int i)` ¶

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

Runtime Function: `_Decimal32` __dpd_floatdisd `(long i)` ¶
Runtime Function: `_Decimal32` __bid_floatdisd `(long i)` ¶
Runtime Function: `_Decimal64` __dpd_floatdidd `(long i)` ¶
Runtime Function: `_Decimal64` __bid_floatdidd `(long i)` ¶
Runtime Function: `_Decimal128` __dpd_floatditd `(long i)` ¶
Runtime Function: `_Decimal128` __bid_floatditd `(long i)` ¶

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

Runtime Function: `_Decimal32` __dpd_floatunssisd `(unsigned int i)` ¶
Runtime Function: `_Decimal32` __bid_floatunssisd `(unsigned int i)` ¶
Runtime Function: `_Decimal64` __dpd_floatunssidd `(unsigned int i)` ¶
Runtime Function: `_Decimal64` __bid_floatunssidd `(unsigned int i)` ¶
Runtime Function: `_Decimal128` __dpd_floatunssitd `(unsigned int i)` ¶
Runtime Function: `_Decimal128` __bid_floatunssitd `(unsigned int i)` ¶

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

Runtime Function: `_Decimal32` __dpd_floatunsdisd `(unsigned long i)` ¶
Runtime Function: `_Decimal32` __bid_floatunsdisd `(unsigned long i)` ¶
Runtime Function: `_Decimal64` __dpd_floatunsdidd `(unsigned long i)` ¶
Runtime Function: `_Decimal64` __bid_floatunsdidd `(unsigned long i)` ¶
Runtime Function: `_Decimal128` __dpd_floatunsditd `(unsigned long i)` ¶
Runtime Function: `_Decimal128` __bid_floatunsditd `(unsigned long i)` ¶

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

Runtime Function: `void` __bid_fixsdbitint `(`UBILtype` *r, int32_t rprec, _Decimal32 a)` ¶
Runtime Function: `void` __bid_fixddbitint `(`UBILtype` *r, int32_t rprec, _Decimal64 a)` ¶
Runtime Function: `void` __bid_fixtdbitint `(`UBILtype` *r, int32_t rprec, _Decimal128 a)` ¶

  These functions convert a to bit-precise integer r, rounding toward zero. If rprec is positive, it converts to unsigned bit-precise integer and negative values all become zero, if rprec is negative, it converts to signed bit-precise integer. So far implemented for BID format only.

Runtime Function: `_Decimal32` __bid_floatbitintsd `(`UBILtype` *i, int32_t iprec)` ¶
Runtime Function: `_Decimal64` __bid_floatbitintdd `(`UBILtype` *i, int32_t iprec)` ¶
Runtime Function: `_Decimal128` __bid_floatbitinttd `(`UBILtype` *i, int32_t iprec)` ¶

  These functions convert bit-precise integer i to decimal floating point. If iprec is positive, it is conversion from unsigned bit-precise integer, otherwise from signed bit-precise integer. So far implemented for BID format only.

#### 3.3.3 Comparison functions ¶

Runtime Function: `int` __dpd_unordsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __bid_unordsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __dpd_unorddd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __bid_unorddd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __dpd_unordtd2 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `int` __bid_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 (__bid_unordXd2 (a, b))
        return E;
      return __bid_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` __dpd_eqsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __bid_eqsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __dpd_eqdd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __bid_eqdd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __dpd_eqtd2 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `int` __bid_eqtd2 `(_Decimal128 a, _Decimal128 b)` ¶

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

Runtime Function: `int` __dpd_nesd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __bid_nesd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __dpd_nedd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __bid_nedd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __dpd_netd2 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `int` __bid_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` __dpd_gesd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __bid_gesd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __dpd_gedd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __bid_gedd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __dpd_getd2 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `int` __bid_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` __dpd_ltsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __bid_ltsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __dpd_ltdd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __bid_ltdd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __dpd_lttd2 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `int` __bid_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` __dpd_lesd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __bid_lesd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __dpd_ledd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __bid_ledd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __dpd_letd2 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `int` __bid_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` __dpd_gtsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __bid_gtsd2 `(_Decimal32 a, _Decimal32 b)` ¶
Runtime Function: `int` __dpd_gtdd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __bid_gtdd2 `(_Decimal64 a, _Decimal64 b)` ¶
Runtime Function: `int` __dpd_gttd2 `(_Decimal128 a, _Decimal128 b)` ¶
Runtime Function: `int` __bid_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.