4.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.

4.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.

4.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.

4.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.