(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
torture/
floatn-convert.c
       1  /* Tests for _FloatN / _FloatNx types: test conversions.  */
       2  /* { dg-do run } */
       3  /* { dg-options "" } */
       4  /* { dg-add-options float16 } */
       5  /* { dg-add-options float32 } */
       6  /* { dg-add-options float64 } */
       7  /* { dg-add-options float128 } */
       8  /* { dg-add-options float32x } */
       9  /* { dg-add-options float64x } */
      10  /* { dg-add-options float128x } */
      11  /* { dg-require-effective-target float32 } */
      12  /* { dg-require-effective-target floatn_nx_runtime } */
      13  
      14  #define __STDC_WANT_IEC_60559_TYPES_EXT__
      15  #include <float.h>
      16  
      17  #ifndef FLT16_MAX
      18  # define _Float16 _Float32
      19  # define FLT16_MAX FLT32_MAX
      20  # define FLT16_MANT_DIG FLT32_MANT_DIG
      21  # define FLT16_EPSILON FLT32_EPSILON
      22  #endif
      23  
      24  #ifndef FLT64_MAX
      25  # define _Float64 _Float32
      26  # define FLT64_MAX FLT32_MAX
      27  # define FLT64_MANT_DIG FLT32_MANT_DIG
      28  # define FLT64_EPSILON FLT32_EPSILON
      29  #endif
      30  
      31  #ifndef FLT128_MAX
      32  # define _Float128 _Float32
      33  # define FLT128_MAX FLT32_MAX
      34  # define FLT128_MANT_DIG FLT32_MANT_DIG
      35  # define FLT128_EPSILON FLT32_EPSILON
      36  #endif
      37  
      38  #ifndef FLT32X_MAX
      39  # define _Float32x _Float32
      40  # define FLT32X_MAX FLT32_MAX
      41  # define FLT32X_MANT_DIG FLT32_MANT_DIG
      42  # define FLT32X_EPSILON FLT32_EPSILON
      43  #endif
      44  
      45  #ifndef FLT64X_MAX
      46  # define _Float64x _Float32
      47  # define FLT64X_MAX FLT32_MAX
      48  # define FLT64X_MANT_DIG FLT32_MANT_DIG
      49  # define FLT64X_EPSILON FLT32_EPSILON
      50  #endif
      51  
      52  #ifndef FLT128X_MAX
      53  # define _Float128x _Float32
      54  # define FLT128X_MAX FLT32_MAX
      55  # define FLT128X_MANT_DIG FLT32_MANT_DIG
      56  # define FLT128X_EPSILON FLT32_EPSILON
      57  #endif
      58  
      59  #define CONCATX(X, Y) X ## Y
      60  #define CONCAT(X, Y) CONCATX (X, Y)
      61  
      62  extern void exit (int);
      63  extern void abort (void);
      64  
      65  #define DO_TEST(TYPE1, PFX1, TYPE2, PFX2)			\
      66    do								\
      67      {								\
      68        volatile TYPE1 a = (TYPE1) 1 + CONCAT (PFX1, _EPSILON);	\
      69        volatile TYPE2 b = (TYPE2) a;				\
      70        volatile TYPE2 expected;					\
      71        if (CONCAT (PFX2, _MANT_DIG) < CONCAT (PFX1, _MANT_DIG))	\
      72  	expected = (TYPE2) 1;					\
      73        else							\
      74  	expected = (TYPE2) 1 + (TYPE2) CONCAT (PFX1, _EPSILON); \
      75        if (b != expected)					\
      76  	abort ();						\
      77      }								\
      78    while (0)
      79  
      80  #define DO_TEST1(TYPE1, PFX1)				\
      81    do							\
      82      {							\
      83        DO_TEST (TYPE1, PFX1, _Float16, FLT16);		\
      84        DO_TEST (TYPE1, PFX1, _Float32, FLT32);		\
      85        DO_TEST (TYPE1, PFX1, _Float64, FLT64);		\
      86        DO_TEST (TYPE1, PFX1, _Float128, FLT128);		\
      87        DO_TEST (TYPE1, PFX1, _Float32x, FLT32X);		\
      88        DO_TEST (TYPE1, PFX1, _Float64x, FLT64X);		\
      89        DO_TEST (TYPE1, PFX1, _Float128x, FLT128X);	\
      90      }							\
      91    while (0)
      92  
      93  int
      94  main (void)
      95  {
      96    DO_TEST1 (_Float16, FLT16);
      97    DO_TEST1 (_Float32, FLT32);
      98    DO_TEST1 (_Float64, FLT64);
      99    DO_TEST1 (_Float128, FLT128);
     100    DO_TEST1 (_Float32x, FLT32X);
     101    DO_TEST1 (_Float64x, FLT64X);
     102    DO_TEST1 (_Float128x, FLT128X);
     103    exit (0);
     104  }