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)42check_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)68main (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