Update floating-point feature test macro handling for C2X

Message ID alpine.DEB.2.22.394.2105122355290.88150@digraph.polyomino.org.uk
State Committed
Headers
Series Update floating-point feature test macro handling for C2X |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Joseph Myers May 12, 2021, 11:57 p.m. UTC
  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.

---

I would like review of this patch.
  

Comments

Joseph Myers May 20, 2021, 10:06 p.m. UTC | #1
Ping.  This patch 
<https://sourceware.org/pipermail/libc-alpha/2021-May/126316.html> is 
pending review.
  
Florian Weimer May 21, 2021, 7:27 a.m. UTC | #2
* Joseph Myers:

> +@defvr Macro __STDC_WANT_IEC_60559_EXT__
> +@standards{ISO, (none)}
> +If you define this macro, ISO C2X features defined in Annex F of that
> +standard are enabled.  This affects declarations of the
> +@code{totalorder} functions and functions related to NaN payloads.
> +@end defvr

Should this say “macros related to NaN payloads”?

Thanks,
Florian
  
Joseph Myers May 24, 2021, 7:08 p.m. UTC | #3
On Fri, 21 May 2021, Florian Weimer via Libc-alpha wrote:

> * Joseph Myers:
> 
> > +@defvr Macro __STDC_WANT_IEC_60559_EXT__
> > +@standards{ISO, (none)}
> > +If you define this macro, ISO C2X features defined in Annex F of that
> > +standard are enabled.  This affects declarations of the
> > +@code{totalorder} functions and functions related to NaN payloads.
> > +@end defvr
> 
> Should this say “macros related to NaN payloads”?

No.  The getpayload / setpayload / setpayloadsig functions are all 
functions, not macros (and since they have pointer arguments, there are no 
corresponding type-generic macros either).
  
Joseph Myers May 27, 2021, 4:36 p.m. UTC | #4
Ping^2.  This patch 
<https://sourceware.org/pipermail/libc-alpha/2021-May/126316.html> is 
still pending review.
  
Adhemerval Zanella May 28, 2021, 8:33 p.m. UTC | #5
On 12/05/2021 20:57, Joseph Myers wrote:
> 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.

I haven't follow up the standards itself, but the changes sounds
reasonable.

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

I check on some more architecture without any regressions: aarch64,
arm-gnueabihf, powerpc64le, riscv64, s390x, and sparc64.

> 
> ---
> 
> I would like review of this patch.

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> 
> diff --git a/NEWS b/NEWS
> index a5631af920..17228c1246 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -23,6 +23,12 @@ Major new features:
>    /proc to be mounted.  However, different than fexecve, if the syscall is not
>    supported by the kernel an error is returned instead of trying a fallback.
>  
> +* The feature test macro __STDC_WANT_IEC_60559_EXT__, from draft ISO
> +  C2X, is supported to enable declarations of functions defined in Annex F
> +  of C2X.  Those declarations are also enabled when
> +  __STDC_WANT_IEC_60559_BFP_EXT__, as specified in TS 18661-1, is
> +  defined, and when _GNU_SOURCE is defined.
> +
>  Deprecated and removed features, and other changes affecting compatibility:
>  
>  * The function pthread_mutex_consistent_np has been deprecated; programs

Ok.

> diff --git a/bits/libc-header-start.h b/bits/libc-header-start.h
> index 296e1cef9b..47f39105a2 100644
> --- a/bits/libc-header-start.h
> +++ b/bits/libc-header-start.h
> @@ -44,8 +44,26 @@
>  
>  /* ISO/IEC TS 18661-1:2014 defines the __STDC_WANT_IEC_60559_BFP_EXT__
>     macro.  Most but not all symbols enabled by that macro in TS
> -   18661-1 are enabled unconditionally in C2X; the symbols in Annex F
> -   still require that macro in C2X.  */
> +   18661-1 are enabled unconditionally in C2X.  In C2X, the symbols in
> +   Annex F still require a new feature test macro
> +   __STDC_WANT_IEC_60559_EXT__ instead (C2X does not define
> +   __STDC_WANT_IEC_60559_BFP_EXT__), while a few features from TS
> +   18661-1 are not included in C2X (and thus should depend on
> +   __STDC_WANT_IEC_60559_BFP_EXT__ even when C2X features are
> +   enabled).
> +
> +   __GLIBC_USE (IEC_60559_BFP_EXT) controls those features from TS
> +   18661-1 not included in C2X.
> +
> +   __GLIBC_USE (IEC_60559_BFP_EXT_C2X) controls those features from TS
> +   18661-1 that are also included in C2X (with no feature test macro
> +   required in C2X).
> +
> +   __GLIBC_USE (IEC_60559_EXT) controls those features from TS 18661-1
> +   that are included in C2X but conditional on
> +   __STDC_WANT_IEC_60559_EXT__.  (There are currently no features
> +   conditional on __STDC_WANT_IEC_60559_EXT__ that are not in TS
> +   18661-1.)  */

Ok.

>  #undef __GLIBC_USE_IEC_60559_BFP_EXT
>  #if defined __USE_GNU || defined __STDC_WANT_IEC_60559_BFP_EXT__
>  # define __GLIBC_USE_IEC_60559_BFP_EXT 1
> @@ -58,6 +76,12 @@
>  #else
>  # define __GLIBC_USE_IEC_60559_BFP_EXT_C2X 0
>  #endif
> +#undef __GLIBC_USE_IEC_60559_EXT
> +#if __GLIBC_USE (IEC_60559_BFP_EXT) || defined __STDC_WANT_IEC_60559_EXT__
> +# define __GLIBC_USE_IEC_60559_EXT 1
> +#else
> +# define __GLIBC_USE_IEC_60559_EXT 0
> +#endif
>  
>  /* ISO/IEC TS 18661-4:2015 defines the
>     __STDC_WANT_IEC_60559_FUNCS_EXT__ macro.  Other than the reduction

Ok, so if __STDC_WANT_IEC_60559_BFP_EXT__ is defined *and* 
__STDC_WANT_IEC_60559_EXT__ is also defined we use the definition
from __GLIBC_USE_IEC_60559_EXT (as per comment as well).

> diff --git a/include/features.h b/include/features.h
> index eb97470afa..fcd1a9502f 100644
> --- a/include/features.h
> +++ b/include/features.h
> @@ -33,6 +33,8 @@
>  			Extensions to ISO C11 from TS 18661-4:2015.
>     __STDC_WANT_IEC_60559_TYPES_EXT__
>  			Extensions to ISO C11 from TS 18661-3:2015.
> +   __STDC_WANT_IEC_60559_EXT__
> +			ISO C2X interfaces defined only in Annex F.
>  
>     _POSIX_SOURCE	IEEE Std 1003.1.
>     _POSIX_C_SOURCE	If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;

Ok.

> diff --git a/manual/creature.texi b/manual/creature.texi
> index 5090735e4f..705a949089 100644
> --- a/manual/creature.texi
> +++ b/manual/creature.texi
> @@ -215,6 +215,13 @@ enabled.  Only some of the features from this TS are supported by
>  @theglibc{}.
>  @end defvr
>  
> +@defvr Macro __STDC_WANT_IEC_60559_EXT__
> +@standards{ISO, (none)}
> +If you define this macro, ISO C2X features defined in Annex F of that
> +standard are enabled.  This affects declarations of the
> +@code{totalorder} functions and functions related to NaN payloads.
> +@end defvr
> +
>  @defvr Macro _GNU_SOURCE
>  @standards{GNU, (none)}
>  If you define this macro, everything is included: @w{ISO C89}, @w{ISO

Should it add a note for CR_DECIMAL_DIG as well? Or the gcc documentation
is suffice?

> 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
> +

Ok it moves canonicalize to __GLIBC_USE (IEC_60559_BFP_EXT_C2X).

> +#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
>  

Ok, fmaxmag and fminmag are not only declared for __STDC_WANT_IEC_60559_BFP_EXT__.

> -#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))

Ok.

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

Ok.
  
Joseph Myers June 1, 2021, 5:30 p.m. UTC | #6
On Fri, 28 May 2021, Adhemerval Zanella via Libc-alpha wrote:

> > @@ -215,6 +215,13 @@ enabled.  Only some of the features from this TS are supported by
> >  @theglibc{}.
> >  @end defvr
> >  
> > +@defvr Macro __STDC_WANT_IEC_60559_EXT__
> > +@standards{ISO, (none)}
> > +If you define this macro, ISO C2X features defined in Annex F of that
> > +standard are enabled.  This affects declarations of the
> > +@code{totalorder} functions and functions related to NaN payloads.
> > +@end defvr
> > +
> >  @defvr Macro _GNU_SOURCE
> >  @standards{GNU, (none)}
> >  If you define this macro, everything is included: @w{ISO C89}, @w{ISO
> 
> Should it add a note for CR_DECIMAL_DIG as well? Or the gcc documentation
> is suffice?

I think this part of the manual is only expected to cover the effects of 
feature test macros on glibc's own headers, not on compiler-provided 
headers.
  
Adhemerval Zanella June 1, 2021, 5:36 p.m. UTC | #7
On 01/06/2021 14:30, Joseph Myers wrote:
> On Fri, 28 May 2021, Adhemerval Zanella via Libc-alpha wrote:
> 
>>> @@ -215,6 +215,13 @@ enabled.  Only some of the features from this TS are supported by
>>>  @theglibc{}.
>>>  @end defvr
>>>  
>>> +@defvr Macro __STDC_WANT_IEC_60559_EXT__
>>> +@standards{ISO, (none)}
>>> +If you define this macro, ISO C2X features defined in Annex F of that
>>> +standard are enabled.  This affects declarations of the
>>> +@code{totalorder} functions and functions related to NaN payloads.
>>> +@end defvr
>>> +
>>>  @defvr Macro _GNU_SOURCE
>>>  @standards{GNU, (none)}
>>>  If you define this macro, everything is included: @w{ISO C89}, @w{ISO
>>
>> Should it add a note for CR_DECIMAL_DIG as well? Or the gcc documentation
>> is suffice?
> 
> I think this part of the manual is only expected to cover the effects of 
> feature test macros on glibc's own headers, not on compiler-provided 
> headers.
> 

Fair enough.
  

Patch

diff --git a/NEWS b/NEWS
index a5631af920..17228c1246 100644
--- a/NEWS
+++ b/NEWS
@@ -23,6 +23,12 @@  Major new features:
   /proc to be mounted.  However, different than fexecve, if the syscall is not
   supported by the kernel an error is returned instead of trying a fallback.
 
+* The feature test macro __STDC_WANT_IEC_60559_EXT__, from draft ISO
+  C2X, is supported to enable declarations of functions defined in Annex F
+  of C2X.  Those declarations are also enabled when
+  __STDC_WANT_IEC_60559_BFP_EXT__, as specified in TS 18661-1, is
+  defined, and when _GNU_SOURCE is defined.
+
 Deprecated and removed features, and other changes affecting compatibility:
 
 * The function pthread_mutex_consistent_np has been deprecated; programs
diff --git a/bits/libc-header-start.h b/bits/libc-header-start.h
index 296e1cef9b..47f39105a2 100644
--- a/bits/libc-header-start.h
+++ b/bits/libc-header-start.h
@@ -44,8 +44,26 @@ 
 
 /* ISO/IEC TS 18661-1:2014 defines the __STDC_WANT_IEC_60559_BFP_EXT__
    macro.  Most but not all symbols enabled by that macro in TS
-   18661-1 are enabled unconditionally in C2X; the symbols in Annex F
-   still require that macro in C2X.  */
+   18661-1 are enabled unconditionally in C2X.  In C2X, the symbols in
+   Annex F still require a new feature test macro
+   __STDC_WANT_IEC_60559_EXT__ instead (C2X does not define
+   __STDC_WANT_IEC_60559_BFP_EXT__), while a few features from TS
+   18661-1 are not included in C2X (and thus should depend on
+   __STDC_WANT_IEC_60559_BFP_EXT__ even when C2X features are
+   enabled).
+
+   __GLIBC_USE (IEC_60559_BFP_EXT) controls those features from TS
+   18661-1 not included in C2X.
+
+   __GLIBC_USE (IEC_60559_BFP_EXT_C2X) controls those features from TS
+   18661-1 that are also included in C2X (with no feature test macro
+   required in C2X).
+
+   __GLIBC_USE (IEC_60559_EXT) controls those features from TS 18661-1
+   that are included in C2X but conditional on
+   __STDC_WANT_IEC_60559_EXT__.  (There are currently no features
+   conditional on __STDC_WANT_IEC_60559_EXT__ that are not in TS
+   18661-1.)  */
 #undef __GLIBC_USE_IEC_60559_BFP_EXT
 #if defined __USE_GNU || defined __STDC_WANT_IEC_60559_BFP_EXT__
 # define __GLIBC_USE_IEC_60559_BFP_EXT 1
@@ -58,6 +76,12 @@ 
 #else
 # define __GLIBC_USE_IEC_60559_BFP_EXT_C2X 0
 #endif
+#undef __GLIBC_USE_IEC_60559_EXT
+#if __GLIBC_USE (IEC_60559_BFP_EXT) || defined __STDC_WANT_IEC_60559_EXT__
+# define __GLIBC_USE_IEC_60559_EXT 1
+#else
+# define __GLIBC_USE_IEC_60559_EXT 0
+#endif
 
 /* ISO/IEC TS 18661-4:2015 defines the
    __STDC_WANT_IEC_60559_FUNCS_EXT__ macro.  Other than the reduction
diff --git a/include/features.h b/include/features.h
index eb97470afa..fcd1a9502f 100644
--- a/include/features.h
+++ b/include/features.h
@@ -33,6 +33,8 @@ 
 			Extensions to ISO C11 from TS 18661-4:2015.
    __STDC_WANT_IEC_60559_TYPES_EXT__
 			Extensions to ISO C11 from TS 18661-3:2015.
+   __STDC_WANT_IEC_60559_EXT__
+			ISO C2X interfaces defined only in Annex F.
 
    _POSIX_SOURCE	IEEE Std 1003.1.
    _POSIX_C_SOURCE	If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
diff --git a/manual/creature.texi b/manual/creature.texi
index 5090735e4f..705a949089 100644
--- a/manual/creature.texi
+++ b/manual/creature.texi
@@ -215,6 +215,13 @@  enabled.  Only some of the features from this TS are supported by
 @theglibc{}.
 @end defvr
 
+@defvr Macro __STDC_WANT_IEC_60559_EXT__
+@standards{ISO, (none)}
+If you define this macro, ISO C2X features defined in Annex F of that
+standard are enabled.  This affects declarations of the
+@code{totalorder} functions and functions related to NaN payloads.
+@end defvr
+
 @defvr Macro _GNU_SOURCE
 @standards{GNU, (none)}
 If you define this macro, everything is included: @w{ISO C89}, @w{ISO
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