diff options
author | Joseph Myers <joseph@codesourcery.com> | 2020-11-17 00:27:06 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2020-11-17 00:27:06 +0000 |
commit | f8e4c55cbc09fbbe136b2ba2da405d7bdced07ae (patch) | |
tree | b937d5e9dc9e4b0c6182e10ceb6ee47c5372308a | |
parent | 3cfe746fc5255f8dd1674bf4a8873b7b8e178c89 (diff) | |
download | gcc-f8e4c55cbc09fbbe136b2ba2da405d7bdced07ae.zip gcc-f8e4c55cbc09fbbe136b2ba2da405d7bdced07ae.tar.gz gcc-f8e4c55cbc09fbbe136b2ba2da405d7bdced07ae.tar.bz2 |
float.h: C2x decimal signaling NaN macros
C2x adds macros for decimal floating-point signaling NaNs to
<float.h>. Add these macros to GCC's <float.h> implementation.
Note that the current C2x draft has these under incorrect names
D32_SNAN, D64_SNAN, D128_SNAN. The intent was to change the naming
convention to be consistent with other <float.h> macros when they were
moved to <float.h>, so DEC32_SNAN, DEC64_SNAN, DEC128_NAN, which this
patch uses (as does the current draft integration of TS 18661-3 as an
Annex to C2x, for its _Decimal* and _Decimal*x types).
Bootstrapped with no regressions for x86_64-pc-linux-gnu.
gcc/
2020-11-17 Joseph Myers <joseph@codesourcery.com>
* ginclude/float.h (DEC32_SNAN, DEC64_SNAN, DEC128_SNAN): New C2x
macros.
gcc/testsuite/
2020-11-17 Joseph Myers <joseph@codesourcery.com>
* gcc.dg/dfp/c2x-float-dfp-7.c, gcc.dg/dfp/c2x-float-dfp-8.c: New
tests.
* gcc.dg/c2x-float-no-dfp-3.c: Also check that DEC32_SNAN,
DEC64_SNAN and DEC128_SNAN are not defined.
-rw-r--r-- | gcc/ginclude/float.h | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-7.c | 45 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-8.c | 45 |
4 files changed, 110 insertions, 0 deletions
diff --git a/gcc/ginclude/float.h b/gcc/ginclude/float.h index 7744699..0fa0046 100644 --- a/gcc/ginclude/float.h +++ b/gcc/ginclude/float.h @@ -601,6 +601,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see #undef DEC_NAN #define DEC_NAN (__builtin_nand32 ("")) +/* Signaling NaN in each decimal floating-point type. */ +#undef DEC32_SNAN +#define DEC32_SNAN (__builtin_nansd32 ("")) +#undef DEC64_SNAN +#define DEC64_SNAN (__builtin_nansd64 ("")) +#undef DEC128_SNAN +#define DEC128_SNAN (__builtin_nansd128 ("")) + #endif /* C2X */ #endif /* __DEC32_MANT_DIG__ */ diff --git a/gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c b/gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c index d8a239c..aa790c8 100644 --- a/gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c +++ b/gcc/testsuite/gcc.dg/c2x-float-no-dfp-3.c @@ -12,3 +12,15 @@ #ifdef DEC_NAN # error "DEC_NAN defined" #endif + +#ifdef DEC32_SNAN +# error "DEC32_SNAN defined" +#endif + +#ifdef DEC64_SNAN +# error "DEC64_SNAN defined" +#endif + +#ifdef DEC128_SNAN +# error "DEC128_SNAN defined" +#endif diff --git a/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-7.c b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-7.c new file mode 100644 index 0000000..dec6b50 --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-7.c @@ -0,0 +1,45 @@ +/* Test DEC*_SNAN macros defined in <float.h> with DFP support. */ +/* { dg-do run } */ +/* { dg-options "-std=c2x" } */ + +#include <float.h> + +#ifndef DEC32_SNAN +# error "DEC32_SNAN not defined" +#endif + +#ifndef DEC64_SNAN +# error "DEC64_SNAN not defined" +#endif + +#ifndef DEC128_SNAN +# error "DEC128_SNAN not defined" +#endif + +volatile _Decimal32 d32 = DEC32_SNAN; +volatile _Decimal64 d64 = DEC64_SNAN; +volatile _Decimal128 d128 = DEC128_SNAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + (void) _Generic (DEC32_SNAN, _Decimal32 : 0); + if (!__builtin_isnan (DEC32_SNAN)) + abort (); + if (!__builtin_isnan (d32)) + abort (); + (void) _Generic (DEC64_SNAN, _Decimal64 : 0); + if (!__builtin_isnan (DEC64_SNAN)) + abort (); + if (!__builtin_isnan (d64)) + abort (); + (void) _Generic (DEC128_SNAN, _Decimal128 : 0); + if (!__builtin_isnan (DEC128_SNAN)) + abort (); + if (!__builtin_isnan (d128)) + abort (); + exit (0); +} diff --git a/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-8.c b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-8.c new file mode 100644 index 0000000..4169602 --- /dev/null +++ b/gcc/testsuite/gcc.dg/dfp/c2x-float-dfp-8.c @@ -0,0 +1,45 @@ +/* Test DEC*_SNAN macros. Test requiring runtime exceptions + support. */ +/* { dg-do run } */ +/* { dg-require-effective-target fenv_exceptions_dfp } */ +/* { dg-options "-std=c2x" } */ + +#include <fenv.h> +#include <float.h> + +volatile _Decimal32 d32 = DEC32_SNAN; +volatile _Decimal64 d64 = DEC64_SNAN; +volatile _Decimal128 d128 = DEC128_SNAN; + +extern void abort (void); +extern void exit (int); + +int +main (void) +{ + feclearexcept (FE_ALL_EXCEPT); + d32 += d32; + if (!fetestexcept (FE_INVALID)) + abort (); + feclearexcept (FE_ALL_EXCEPT); + d32 += d32; + if (fetestexcept (FE_INVALID)) + abort (); + feclearexcept (FE_ALL_EXCEPT); + d64 += d64; + if (!fetestexcept (FE_INVALID)) + abort (); + feclearexcept (FE_ALL_EXCEPT); + d64 += d64; + if (fetestexcept (FE_INVALID)) + abort (); + feclearexcept (FE_ALL_EXCEPT); + d128 += d128; + if (!fetestexcept (FE_INVALID)) + abort (); + feclearexcept (FE_ALL_EXCEPT); + d128 += d128; + if (fetestexcept (FE_INVALID)) + abort (); + exit (0); +} |