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 } */
8 
9 #include <fenv.h>
10 #include <stdbool.h>
11 #include <stdint.h>
12 
13 typedef union
14 {
15   __float128 value;
16 
17   struct
18 #ifdef __MINGW32__
19   /* Make sure we are using gnu-style bitfield handling.  */
20   __attribute__ ((gcc_struct))
21 #endif
22   {
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;
37 
38 } ieee854_float128;
39 
40 bool
41 __attribute__((noinline, noclone))
check_nan(__float128 val,bool quiet)42 check_nan (__float128 val, bool quiet)
43 {
44   ieee854_float128 u;
45   volatile __float128 tmp;
46 
47   u.value = val;
48 
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;
53 
54   if (!__builtin_isnan (u.value))
55     return false;
56 
57   feclearexcept (FE_INVALID);
58 
59   tmp = u.value + u.value;
60 
61   if ((fetestexcept (FE_INVALID) != 0) == quiet)
62     return false;
63 
64   return true;
65 }
66 
67 int
main(void)68 main (void)
69 {
70   __float128 nan;
71 
72   nan = __builtin_nanq ("");
73 
74   if (!check_nan (nan, true))
75     __builtin_abort ();
76 
77   nan = __builtin_nanq ("0x0");
78 
79   if (!check_nan (nan, true))
80     __builtin_abort ();
81 
82   nan = __builtin_nanq ("0x1");
83 
84   if (!check_nan (nan, true))
85     __builtin_abort ();
86 
87   nan = __builtin_nansq ("");
88 
89   if (!check_nan (nan, false))
90     __builtin_abort ();
91 
92   nan = __builtin_nansq ("0x0");
93 
94   if (!check_nan (nan, false))
95     __builtin_abort ();
96 
97   nan = __builtin_nansq ("0x1");
98 
99   if (!check_nan (nan, false))
100     __builtin_abort ();
101 
102   return 0;
103 }
104