Skip to content
Snippets Groups Projects
  • Michael Meissner's avatar
    78118359
    Add conversions between _Float128 and Decimal. · 78118359
    Michael Meissner authored
    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.
    78118359
    History
    Add conversions between _Float128 and Decimal.
    Michael Meissner authored
    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.
gcc NaN GiB