Add C2x *_NORM_MAX constants to <float.h>.
authorJoseph Myers <joseph@codesourcery.com>
Wed, 13 Nov 2019 15:25:15 +0000 (15:25 +0000)
committerJoseph Myers <jsm28@gcc.gnu.org>
Wed, 13 Nov 2019 15:25:15 +0000 (15:25 +0000)
commit00be2a5f394119085c72aee8d18adefd8ec3ec22
tree71659c0262824c7ba87b2a92d37b1025348f0dd0
parent5024c8bb463fe7bfd20972cff37e3c917001172e
Add C2x *_NORM_MAX constants to <float.h>.

C2x adds <float.h> constants FLT_NORM_MAX, DBL_NORM_MAX and
LDBL_NORM_MAX.  These are for the maximum "normalized" finite
floating-point number, where the given definition of normalized is
that all possible values with MANT_DIG significand digits (leading one
not zero) can be represented with that exponent.  The effect of that
definition is that these macros are the same as the corresponding MAX
macros for all formats except IBM long double, where the NORM_MAX
value has exponent 1 smaller than the MAX one so that all 106 digits
can be 1.

This patch adds those macros to GCC.  They are only defined for float,
double and long double; C2x does not include such macros for DFP
types, and while the integration of TS 18661-3 into C2x has not yet
occurred, the draft proposed text does not add them for the _FloatN /
_FloatNx types (where they would always be the same as the MAX
macros).

Bootstrapped with no regressions on x86_64-pc-linux-gnu.  Also tested
compilation of the new test for powerpc-linux-gnu to confirm the check
of LDBL_NORM_MAX in the IBM long double case does get properly
optimized out.

gcc:
* ginclude/float.c [__STDC_VERSION__ > 201710L] (FLT_NORM_MAX,
DBL_NORM_MAX, LDBL_NORM_MAX): Define.
* real.c (get_max_float): Add norm_max argument.
* real.h (get_max_float): Update prototype.
* builtins.c (fold_builtin_interclass_mathfn): Update calls to
get_max_float.

gcc/c-family:
* c-cppbuiltin.c (builtin_define_float_constants): Also define
NORM_MAX constants.  Update call to get_max_float.
(LAZY_HEX_FP_VALUES_CNT): Update value to include NORM_MAX
constants.

gcc/d:
* d-target.cc (define_float_constants): Update call to
get_max_float.

gcc/testsuite:
* gcc.dg/c11-float-3.c, gcc.dg/c2x-float-1.c: New tests.

From-SVN: r278145
12 files changed:
gcc/ChangeLog
gcc/builtins.c
gcc/c-family/ChangeLog
gcc/c-family/c-cppbuiltin.c
gcc/d/ChangeLog
gcc/d/d-target.cc
gcc/ginclude/float.h
gcc/real.c
gcc/real.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c11-float-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/c2x-float-1.c [new file with mode: 0644]