diff options
author | Joseph Myers <joseph@codesourcery.com> | 2021-06-01 14:22:06 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2021-06-01 14:22:06 +0000 |
commit | 858045ad1c5ac1682288bbcb3676632b97a21ddf (patch) | |
tree | b3d59a6f3fe347f6d4f543a2921fc967bd8e29ba /math | |
parent | c8a11c58673a5b9a25443f2c53231b660a8b4071 (diff) | |
download | glibc-858045ad1c5ac1682288bbcb3676632b97a21ddf.tar glibc-858045ad1c5ac1682288bbcb3676632b97a21ddf.tar.gz glibc-858045ad1c5ac1682288bbcb3676632b97a21ddf.tar.bz2 glibc-858045ad1c5ac1682288bbcb3676632b97a21ddf.zip |
Update floating-point feature test macro handling for C2X
ISO C2X has made some changes to the handling of feature test macros
related to features from the floating-point TSes, and to exactly what
such features are present in what headers, that require corresponding
changes in glibc.
* For the few features that were controlled by
__STDC_WANT_IEC_60559_BFP_EXT__ (and the corresponding DFP macro) in
C2X, there is now instead a new feature test macro
__STDC_WANT_IEC_60559_EXT__ covering both binary and decimal FP.
This controls CR_DECIMAL_DIG in <float.h> (provided by GCC; I
implemented support for the new feature test macro for GCC 11) and
the totalorder and payload functions in <math.h>. C2X no longer
says anything about __STDC_WANT_IEC_60559_BFP_EXT__ (so it's
appropriate for that macro to continue to enable exactly the
features from TS 18661-1).
* The SNAN macros for each floating-point type have moved to <float.h>
(and been renamed in the process). Thus, the copies in <math.h>
should only be defined for __STDC_WANT_IEC_60559_BFP_EXT__, not for
C2X.
* The fmaxmag and fminmag functions have been removed (replaced by new
functions for the new min/max operations in IEEE 754-2019). Thus
those should also only be declared for
__STDC_WANT_IEC_60559_BFP_EXT__.
* The _FloatN / _FloatNx handling for the last two points in glibc is
trickier, since __STDC_WANT_IEC_60559_TYPES_EXT__ is still in C2X
(the integration of TS 18661-3 as an Annex, that is, which hasn't
yet been merged into the C standard git repository but has been
accepted by WG14), so C2X with that macro should not declare some
things that are declared for older standards with that macro. The
approach taken here is to provide the declarations (when
__STDC_WANT_IEC_60559_TYPES_EXT__ is enabled) only when (defined
__USE_GNU || !__GLIBC_USE (ISOC2X)), so if C2X features are enabled
then those declarations (that are only in TS 18661-3 and not in C2X)
will only be provided if _GNU_SOURCE is defined as well. Thus
_GNU_SOURCE remains a superset of the TS features as well as of C2X.
Some other somewhat related changes in C2X are not addressed here.
There's an open proposal not to include the fmin and fmax functions
for the _FloatN / _FloatNx types, given the new min/max operations,
which could be handled like the previous point if adopted. And the
fromfp functions have been changed to return a result in floating type
rather than intmax_t / uintmax_t; my inclination there is to treat
that like that change of totalorder type (new symbol versions etc. for
the ABI change; old versions become compat symbols and are no longer
supported as an API).
Tested for x86_64 and x86.
Diffstat (limited to 'math')
-rw-r--r-- | math/bits/mathcalls.h | 12 | ||||
-rw-r--r-- | math/math.h | 30 |
2 files changed, 30 insertions, 12 deletions
diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index 2361dd3982..dc145b4bcf 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -364,17 +364,21 @@ __MATHDECL (__intmax_t, fromfpx,, (_Mdouble_ __x, int __round, __MATHDECL (__uintmax_t, ufromfpx,, (_Mdouble_ __x, int __round, unsigned int __width)); +/* Canonicalize floating-point representation. */ +__MATHDECL_1 (int, canonicalize,, (_Mdouble_ *__cx, const _Mdouble_ *__x)); +#endif + +#if (__GLIBC_USE (IEC_60559_BFP_EXT) \ + || (__MATH_DECLARING_FLOATN \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X)))) /* Return value with maximum magnitude. */ __MATHCALLX (fmaxmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); /* Return value with minimum magnitude. */ __MATHCALLX (fminmag,, (_Mdouble_ __x, _Mdouble_ __y), (__const__)); - -/* Canonicalize floating-point representation. */ -__MATHDECL_1 (int, canonicalize,, (_Mdouble_ *__cx, const _Mdouble_ *__x)); #endif -#if __GLIBC_USE (IEC_60559_BFP_EXT) || __MATH_DECLARING_FLOATN +#if __GLIBC_USE (IEC_60559_EXT) || __MATH_DECLARING_FLOATN /* Total order operation. */ __MATHDECL_1 (int, totalorder,, (const _Mdouble_ *__x, const _Mdouble_ *__y)) diff --git a/math/math.h b/math/math.h index 0e205158a9..6b7ac79122 100644 --- a/math/math.h +++ b/math/math.h @@ -104,7 +104,7 @@ __BEGIN_DECLS # endif #endif /* __USE_ISOC99 */ -#if __GLIBC_USE (IEC_60559_BFP_EXT_C2X) +#if __GLIBC_USE (IEC_60559_BFP_EXT) /* Signaling NaN macros, if supported. */ # if __GNUC_PREREQ (3, 3) # define SNANF (__builtin_nansf ("")) @@ -112,25 +112,39 @@ __BEGIN_DECLS # define SNANL (__builtin_nansl ("")) # endif #endif -#if __HAVE_FLOAT16 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT16 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF16 (__builtin_nansf16 ("")) #endif -#if __HAVE_FLOAT32 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT32 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF32 (__builtin_nansf32 ("")) #endif -#if __HAVE_FLOAT64 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT64 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF64 (__builtin_nansf64 ("")) #endif -#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT128 \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF128 (__builtin_nansf128 ("")) #endif -#if __HAVE_FLOAT32X && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT32X \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF32X (__builtin_nansf32x ("")) #endif -#if __HAVE_FLOAT64X && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT64X \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF64X (__builtin_nansf64x ("")) #endif -#if __HAVE_FLOAT128X && __GLIBC_USE (IEC_60559_TYPES_EXT) +#if (__HAVE_FLOAT128X \ + && __GLIBC_USE (IEC_60559_TYPES_EXT) \ + && (defined __USE_GNU || !__GLIBC_USE (ISOC2X))) # define SNANF128X (__builtin_nansf128x ("")) #endif |