middle-end: copy STMT_VINFO_STRIDED_P when DR is replaced [PR116956]
[official-gcc.git] / gcc / testsuite / gcc.dg / torture / float128-nan.c
blob0ad043160a4fbabc6fec86e784fcc27434b3cafd
1 /* Test __float128 NaN generation. */
2 /* { dg-do run } */
3 /* { dg-require-effective-target fenv_exceptions } */
4 /* { dg-require-effective-target __float128 } */
5 /* { dg-require-effective-target base_quadfloat_support } */
6 /* { dg-options "" } */
7 /* { dg-add-options __float128 } */
9 #include <fenv.h>
10 #include <stdbool.h>
11 #include <stdint.h>
13 typedef union
15 __float128 value;
17 struct
18 #ifdef __MINGW32__
19 /* Make sure we are using gnu-style bitfield handling. */
20 __attribute__ ((gcc_struct))
21 #endif
23 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
24 unsigned negative:1;
25 unsigned exponent:15;
26 unsigned quiet_nan:1;
27 uint64_t mant_high:47;
28 uint64_t mant_low:64;
29 #else
30 uint64_t mant_low:64;
31 uint64_t mant_high:47;
32 unsigned quiet_nan:1;
33 unsigned exponent:15;
34 unsigned negative:1;
35 #endif
36 } nan;
38 } ieee854_float128;
40 bool
41 __attribute__((noinline, noclone))
42 check_nan (__float128 val, bool quiet)
44 ieee854_float128 u;
45 volatile __float128 tmp;
47 u.value = val;
49 if (u.nan.exponent != 0x7fff
50 || (u.nan.quiet_nan | u.nan.mant_high | u.nan.mant_low) == 0
51 || u.nan.quiet_nan != quiet)
52 return false;
54 if (!__builtin_isnan (u.value))
55 return false;
57 feclearexcept (FE_INVALID);
59 tmp = u.value + u.value;
61 if ((fetestexcept (FE_INVALID) != 0) == quiet)
62 return false;
64 return true;
67 int
68 main (void)
70 __float128 nan;
72 nan = __builtin_nanq ("");
74 if (!check_nan (nan, true))
75 __builtin_abort ();
77 nan = __builtin_nanq ("0x0");
79 if (!check_nan (nan, true))
80 __builtin_abort ();
82 nan = __builtin_nanq ("0x1");
84 if (!check_nan (nan, true))
85 __builtin_abort ();
87 nan = __builtin_nansq ("");
89 if (!check_nan (nan, false))
90 __builtin_abort ();
92 nan = __builtin_nansq ("0x0");
94 if (!check_nan (nan, false))
95 __builtin_abort ();
97 nan = __builtin_nansq ("0x1");
99 if (!check_nan (nan, false))
100 __builtin_abort ();
102 return 0;