Add conversions between _Float128 and Decimal.
authorMichael Meissner <meissner@linux.ibm.com>
Mon, 22 Feb 2021 20:33:29 +0000 (15:33 -0500)
committerMichael Meissner <meissner@linux.ibm.com>
Mon, 22 Feb 2021 20:33:29 +0000 (15:33 -0500)
commit781183595acba67a37c66f59a0c1d9b5fee7e248
treeaebce9b934a865fdd62b1307093b2b7cd0c14fa2
parent8e99b5ba4c19526335fe9cabdc6df7fb2edcfe6f
Add conversions between _Float128 and Decimal.

This patch implements conversions between _Float128 and the 3 Decimal floating
types.  It does this by extendending the dfp-bit conversions to add a new
binary floating point type (KF), and doing the conversions in the same manner
as the other binary/decimal conversions.

For conversions from _Float128 to Decimal, this patch uses a function
(__sprintfkf) instead of the sprintf function to convert long double values to
strings.  The __sprintfkf function determines if GLIBC 2.32 or newer is used
and calls the IEEE 128-bit version of sprintf (__sprintfieee128).  If the GLIBC
is earlier than 2.32, the code will convert _Float128 to __ibm128 and then use
the normal sprintf to convert this value.

For conversions from Decimal to _Float128, this patch uses a function
(__strtokf) instead of strtold to convert the strings from the Decimal
conversion to long double.  The __strtokf function determines if GLIBC 2.32 or
newer is used, and if it is, calls the IEEE 128-bit version (__strtoieee128).
If the GLIBC is earlier than 2.32, the code will call strtold and convert the
__ibm128 value to _Float128.

These functions will primarily be used if/when the default PowerPC long double
type is changed to IEEE 128-bit, but they could also be used if the user
explicitly converts _Float128 to/from a Decimal type.

libgcc/
2021-02-22  Michael Meissner  <meissner@linux.ibm.com>

* config/rs6000/_dd_to_kf.c: New file.
* config/rs6000/_kf_to_dd.c: New file.
* config/rs6000/_kf_to_sd.c: New file.
* config/rs6000/_kf_to_td.c: New file.
* config/rs6000/_sd_to_kf.c: New file.
* config/rs6000/_sprintfkf.c: New file.
* config/rs6000/_sprintfkf.h: New file.
* config/rs6000/_strtokf.h: New file.
* config/rs6000/_strtokf.c: New file.
* config/rs6000/_td_to_kf.c: New file.
* config/rs6000/quad-float128.h: Add new declarations.
* config/rs6000/t-float128 (fp128_dec_funcs): New macro.
(fp128_decstr_funcs): New macro.
(ibm128_dec_funcs): New macro.
(fp128_ppc_funcs): Add the new conversions.
(fp128_dec_objs): Force Decimal <-> __float128 conversions to be
compiled with -mabi=ieeelongdouble.
(fp128_decstr_objs): Force __float128 <-> string conversions to be
compiled with -mabi=ibmlongdouble.
(ibm128_dec_objs): Force Decimal <-> __float128 conversions to be
compiled with -mabi=ieeelongdouble.
(FP128_CFLAGS_DECIMAL): New macro.
(IBM128_CFLAGS_DECIMAL): New macro.
* dfp-bit.c (DFP_TO_BFP): Add PowerPC _Float128 support.
(BFP_TO_DFP): Add PowerPC _Float128 support.
* dfp-bit.h (BFP_KIND): Add new binary floating point kind for
IEEE 128-bit floating point.
(DFP_TO_BFP): Add PowerPC _Float128 support.
(BFP_TO_DFP): Add PowerPC _Float128 support.
(BFP_SPRINTF): New macro.
14 files changed:
libgcc/config/rs6000/_dd_to_kf.c [new file with mode: 0644]
libgcc/config/rs6000/_kf_to_dd.c [new file with mode: 0644]
libgcc/config/rs6000/_kf_to_sd.c [new file with mode: 0644]
libgcc/config/rs6000/_kf_to_td.c [new file with mode: 0644]
libgcc/config/rs6000/_sd_to_kf.c [new file with mode: 0644]
libgcc/config/rs6000/_sprintfkf.c [new file with mode: 0644]
libgcc/config/rs6000/_sprintfkf.h [new file with mode: 0644]
libgcc/config/rs6000/_strtokf.c [new file with mode: 0644]
libgcc/config/rs6000/_strtokf.h [new file with mode: 0644]
libgcc/config/rs6000/_td_to_kf.c [new file with mode: 0644]
libgcc/config/rs6000/quad-float128.h
libgcc/config/rs6000/t-float128
libgcc/dfp-bit.c
libgcc/dfp-bit.h