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.
This commit is contained in:
Michael Meissner 2021-02-22 15:33:29 -05:00
parent 8e99b5ba4c
commit 781183595a
14 changed files with 467 additions and 3 deletions

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Decimal64 -> _Float128 conversion. */
/* FINE_GRAINED_LIBRARIES is used so we can isolate just to dd_to_tf conversion
function from dp-bits.c. */
#define FINE_GRAINED_LIBRARIES 1
#define L_dd_to_kf 1
#define WIDTH 64
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IEEE128__)
#error "Long double is not IEEE 128-bit"
#endif
/* Use dfp-bit.c to do the real work. */
#include "dfp-bit.c"

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* _Float128 -> Decimal64 conversion. */
/* FINE_GRAINED_LIBRARIES is used so we can isolate just to tf_to_dd conversion
function from dp-bits.c. */
#define FINE_GRAINED_LIBRARIES 1
#define L_kf_to_dd 1
#define WIDTH 64
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IEEE128__)
#error "Long double is not IEEE 128-bit"
#endif
/* Use dfp-bit.c to do the real work. */
#include "dfp-bit.c"

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* _Float128 -> Decimal32 conversion. */
/* FINE_GRAINED_LIBRARIES is used so we can isolate just to tf_to_sd conversion
function from dp-bits.c. */
#define FINE_GRAINED_LIBRARIES 1
#define L_kf_to_sd 1
#define WIDTH 32
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IEEE128__)
#error "Long double is not IEEE 128-bit"
#endif
/* Use dfp-bit.c to do the real work. */
#include "dfp-bit.c"

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* _Float128 -> Decimal128 conversion. */
/* FINE_GRAINED_LIBRARIES is used so we can isolate just to tf_to_td conversion
function from dp-bits.c. */
#define FINE_GRAINED_LIBRARIES 1
#define L_kf_to_td 1
#define WIDTH 128
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IEEE128__)
#error "Long double is not IEEE 128-bit"
#endif
/* Use dfp-bit.c to do the real work. */
#include "dfp-bit.c"

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Decimal32 -> _Float128 conversion. */
/* FINE_GRAINED_LIBRARIES is used so we can isolate just to sd_to_tf conversion
function from dp-bits.c. */
#define FINE_GRAINED_LIBRARIES 1
#define L_sd_to_kf 1
#define WIDTH 32
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IEEE128__)
#error "Long double is not IEEE 128-bit"
#endif
/* Use dfp-bit.c to do the real work. */
#include "dfp-bit.c"

View File

@ -0,0 +1,57 @@
/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Conversion to IEEE 128-bit floating point from string using snprintf. */
#include <stddef.h>
#include <stdlib.h>
#include <soft-fp.h>
#include <quad-float128.h>
#include <stdio.h>
/* This function must be built with IBM 128-bit as long double, so that we can
access the strfroml function if do not have an IEEE 128-bit version, and if
that is not available, use sprintf. */
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IBM128__)
#error "Long double is not IBM 128-bit"
#endif
/* If the user is using GLIBC 2.32, we can use the __snprintfieee128 function.
If we are linked against an earlier library, we will have fake it by
converting the value to long double, and using sprintf to do the conversion.
This isn't ideal, as IEEE 128-bit has more exponent range than IBM
128-bit. */
extern int __sprintfieee128 (char *restrict, const char *restrict, ...)
__attribute__ ((__weak__));
int __sprintfkf (char *restrict string,
const char *restrict format,
_Float128 number)
{
if (__sprintfieee128)
return __sprintfieee128 (string, format, number);
return sprintf (string, format, (long double) number);
}

View File

@ -0,0 +1,28 @@
/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Declaration of the conversion function to IEEE 128-bit floating point from
string using snprintf. */
extern int __sprintfkf (char *restrict, const char *restrict, ...);

View File

@ -0,0 +1,53 @@
/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Conversion to IEEE 128-bit floating point from string. */
#include <stddef.h>
#include <stdlib.h>
#include <soft-fp.h>
#include <quad-float128.h>
/* This function must be built with IBM 128-bit as long double, so that we can
access the strtold function if do not have an IEEE 128-bit version. */
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IBM128__)
#error "Long double is not IBM 128-bit"
#endif
/* If the user is using GLIBC 2.32, we can use the __strtoieee128 function.
If we are linked against an earlier library, we will have fake it by
converting the string to IBM 128-bit long double, and then converting that to
__float128. This isn't ideal, as IEEE 128-bit has more exponent range than
IBM 128-bit. */
extern _Float128 __strtoieee128 (const char *, char **) __attribute__ ((__weak__));
_Float128
__strtokf (const char *string, char **endptr)
{
if (__strtoieee128)
return __strtoieee128 (string, endptr);
return strtold (string, endptr);
}

View File

@ -0,0 +1,27 @@
/* Copyright (C) 1989-2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Declaration of the conversion function to IEEE 128-bit floating point from
string. */
extern _Float128 __strtokf (const char *, char **);

View File

@ -0,0 +1,37 @@
/* Copyright (C) 2021 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
/* Decimal128 -> _Float128 conversion. */
/* FINE_GRAINED_LIBRARIES is used so we can isolate just to td_to_tf conversion
function from dp-bits.c. */
#define FINE_GRAINED_LIBRARIES 1
#define L_td_to_kf 1
#define WIDTH 128
#if !defined(__LONG_DOUBLE_128__) || !defined(__LONG_DOUBLE_IEEE128__)
#error "Long double is not IEEE 128-bit"
#endif
/* Use dfp-bit.c to do the real work. */
#include "dfp-bit.c"

View File

@ -49,6 +49,7 @@ typedef __complex float TCtype __attribute__ ((mode (TC)));
#pragma GCC target ("vsx,float128")
#endif
#include <stddef.h>
#include <quad.h>
#define IBM128_TYPE __ibm128
@ -171,6 +172,13 @@ extern TFtype __trunctfkf2 (IBM128_TYPE);
extern TCtype __mulkc3 (TFtype, TFtype, TFtype, TFtype);
extern TCtype __divkc3 (TFtype, TFtype, TFtype, TFtype);
/* Convert IEEE 128-bit floating point to/from string. We explicitly use
_Float128 instead of TFmode because _strtokf and _strfromkf must be compiled
with long double being IBM 128. */
extern _Float128 __strtokf (const char *, char **);
extern int __strfromkf (char *restrict, size_t, const char *restrict,
_Float128);
/* Implementation of conversions between __ibm128 and __float128, to allow the
same code to be used on systems with IEEE 128-bit emulation and with IEEE
128-bit hardware support. */

View File

@ -22,10 +22,23 @@ fp128_softfp_static_obj = $(addsuffix -sw$(objext),$(fp128_softfp_funcs))
fp128_softfp_shared_obj = $(addsuffix -sw_s$(objext),$(fp128_softfp_funcs))
fp128_softfp_obj = $(fp128_softfp_static_obj) $(fp128_softfp_shared_obj)
# Decimal <-> _Float128 conversions
fp128_dec_funcs = _kf_to_sd _kf_to_dd _kf_to_td \
_sd_to_kf _dd_to_kf _td_to_kf
# _Float128 to/from string conversions that must be compiled with IBM 128-bit
# long double.
fp128_decstr_funcs = _strtokf _sprintfkf
# Decimal <-> __ibm128 conversions
ibm128_dec_funcs = _tf_to_sd _tf_to_dd _tf_to_td \
_sd_to_tf _dd_to_tf _td_to_tf
# New functions for software emulation
fp128_ppc_funcs = floattikf floatuntikf fixkfti fixunskfti \
extendkftf2-sw trunctfkf2-sw \
sfp-exceptions _mulkc3 _divkc3 _powikf2
sfp-exceptions _mulkc3 _divkc3 _powikf2 \
$(fp128_dec_funcs) $(fp128_decstr_funcs)
fp128_ppc_src = $(addprefix $(srcdir)/config/rs6000/,$(addsuffix \
.c,$(fp128_ppc_funcs)))
@ -69,6 +82,28 @@ $(fp128_ppc_obj) : INTERNAL_CFLAGS += $(FP128_CFLAGS_SW)
$(fp128_obj) : $(fp128_includes)
$(fp128_obj) : $(srcdir)/config/rs6000/quad-float128.h
# Force the TF mode to/from decimal functions to be compiled with IBM long
# double. Add building the KF mode to/from decimal conversions with explict
# IEEE long double.
fp128_dec_objs = $(addsuffix $(objext),$(fp128_dec_funcs)) \
$(addsuffix _s$(objext),$(fp128_dec_funcs))
fp128_decstr_objs = $(addsuffix $(objext),$(fp128_decstr_funcs)) \
$(addsuffix _s$(objext),$(fp128_decstr_funcs))
ibm128_dec_objs = $(addsuffix $(objext),$(ibm128_dec_funcs)) \
$(addsuffix _s$(objext),$(ibm128_dec_funcs))
FP128_CFLAGS_DECIMAL = -mno-gnu-attribute -Wno-psabi -mabi=ieeelongdouble
IBM128_CFLAGS_DECIMAL = -mno-gnu-attribute -Wno-psabi -mabi=ibmlongdouble
$(fp128_dec_objs) : INTERNAL_CFLAGS += $(FP128_CFLAGS_DECIMAL)
$(fp128_decstr_objs) : INTERNAL_CFLAGS += $(IBM128_CFLAGS_DECIMAL)
$(ibm128_dec_objs) : INTERNAL_CFLAGS += $(IBM128_CFLAGS_DECIMAL)
$(fp128_decstr_objs) : $(srcdir)/config/rs6000/_strtokf.h \
$(srcdir)/config/rs6000/_sprintfkf.h \
$(fp128_softfp_src) : $(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@)) $(fp128_dep)
@src="$(srcdir)/soft-fp/$(subst -sw,,$(subst kf,tf,$@))"; \
echo "Create $@"; \

View File

@ -606,6 +606,7 @@ INT_TO_DFP (INT_TYPE i)
#if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
|| defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
|| defined (L_sd_to_kf) || defined (L_dd_to_kf) || defined (L_td_to_kf) \
|| ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
&& LONG_DOUBLE_HAS_XF_MODE) \
|| ((defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf)) \
@ -626,6 +627,7 @@ DFP_TO_BFP (DFP_C_TYPE f)
#if defined (L_sf_to_sd) || defined (L_sf_to_dd) || defined (L_sf_to_td) \
|| defined (L_df_to_sd) || defined (L_df_to_dd) || defined (L_df_to_td) \
|| defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td) \
|| ((defined (L_xf_to_sd) || defined (L_xf_to_dd) || defined (L_xf_to_td)) \
&& LONG_DOUBLE_HAS_XF_MODE) \
|| ((defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)) \
@ -641,8 +643,14 @@ BFP_TO_DFP (BFP_TYPE x)
decContextDefault (&context, CONTEXT_INIT);
DFP_INIT_ROUNDMODE (context.round);
/* Use a C library function to write the floating point value to a string. */
sprintf (buf, BFP_FMT, (BFP_VIA_TYPE) x);
/* Use the sprintf library function to write the floating point value to a string.
If we are handling the IEEE 128-bit floating point on PowerPC, use the
special function __sprintfkf instead of sprintf. This function allows us
to use __sprintfieee128 if we have a new enough GLIBC, and it can fall back
to using the traditional sprintf via conversion to IBM 128-bit if the glibc
is older. */
BFP_SPRINTF (buf, BFP_FMT, (BFP_VIA_TYPE) x);
/* Convert from the floating point string to a decimal* type. */
FROM_STRING (&s, buf, &context);

View File

@ -241,6 +241,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#elif defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf) \
|| defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)
#define BFP_KIND 4
#elif defined (L_sd_to_kf) || defined (L_dd_to_kf) || defined (L_td_to_kf) \
|| defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td)
#define BFP_KIND 5
#endif
/* If BFP_KIND is defined, define additional macros:
@ -291,6 +294,13 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#define BFP_VIA_TYPE long double
#endif /* LONG_DOUBLE_HAS_TF_MODE */
#elif BFP_KIND == 5
#define BFP_TYPE _Float128
#define BFP_FMT "%.36Le"
#define BFP_VIA_TYPE _Float128
#define STR_TO_BFP __strtokf
#include <_strtokf.h>
#endif /* BFP_KIND */
#if WIDTH == 128 || WIDTH_TO == 128
@ -490,6 +500,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#elif BFP_KIND == 4
#define BFP_TO_DFP DPD_BID_NAME(__dpd_trunctfsd,__bid_trunctfsd)
#define DFP_TO_BFP DPD_BID_NAME(__dpd_extendsdtf,__bid_extendsdtf)
#elif BFP_KIND == 5
#define BFP_TO_DFP DPD_BID_NAME(__dpd_trunckfsd,__bid_trunckfsd)
#define DFP_TO_BFP DPD_BID_NAME(__dpd_extendsdkf,__bid_extendsdkf)
#endif /* BFP_KIND */
#elif WIDTH == 64
@ -505,6 +518,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#elif BFP_KIND == 4
#define BFP_TO_DFP DPD_BID_NAME(__dpd_trunctfdd,__bid_trunctfdd)
#define DFP_TO_BFP DPD_BID_NAME(__dpd_extendddtf,__bid_extendddtf)
#elif BFP_KIND == 5
#define BFP_TO_DFP DPD_BID_NAME(__dpd_trunckfdd,__bid_trunckfdd)
#define DFP_TO_BFP DPD_BID_NAME(__dpd_extendddkf,__bid_extendddkf)
#endif /* BFP_KIND */
#elif WIDTH == 128
@ -520,6 +536,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#elif BFP_KIND == 4
#define BFP_TO_DFP DPD_BID_NAME(__dpd_extendtftd,__bid_extendtftd)
#define DFP_TO_BFP DPD_BID_NAME(__dpd_trunctdtf,__bid_trunctdtf)
#elif BFP_KIND == 5
#define BFP_TO_DFP DPD_BID_NAME(__dpd_extendkftd,__bid_extendkftd)
#define DFP_TO_BFP DPD_BID_NAME(__dpd_trunctdkf,__bid_trunctdkf)
#endif /* BFP_KIND */
#endif /* WIDTH */
@ -609,6 +628,7 @@ extern DFP_C_TYPE INT_TO_DFP (INT_TYPE);
#if defined (L_sd_to_sf) || defined (L_dd_to_sf) || defined (L_td_to_sf) \
|| defined (L_sd_to_df) || defined (L_dd_to_df) || defined (L_td_to_df) \
|| defined (L_sd_to_kf) || defined (L_dd_to_kf) || defined (L_td_to_kf) \
|| ((defined (L_sd_to_xf) || defined (L_dd_to_xf) || defined (L_td_to_xf)) \
&& LONG_DOUBLE_HAS_XF_MODE) \
|| ((defined (L_sd_to_tf) || defined (L_dd_to_tf) || defined (L_td_to_tf)) \
@ -623,6 +643,12 @@ extern BFP_TYPE DFP_TO_BFP (DFP_C_TYPE);
|| ((defined (L_tf_to_sd) || defined (L_tf_to_dd) || defined (L_tf_to_td)) \
&& LONG_DOUBLE_HAS_TF_MODE)
extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
#define BFP_SPRINTF sprintf
#elif defined (L_kf_to_sd) || defined (L_kf_to_dd) || defined (L_kf_to_td)
extern DFP_C_TYPE BFP_TO_DFP (BFP_TYPE);
#include <_sprintfkf.h>
#define BFP_SPRINTF __sprintfkf
#endif
#endif /* _DFPBIT_H */