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))
      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
      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  }