Add _FloatN, _FloatNx tests for __builtin_fpclassify.
[official-gcc.git] / gcc / testsuite / gcc.dg / torture / floatn-convert.c
blob741ffc8800fff02b29f57fe6e9db329165636192
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 } */
14 #define __STDC_WANT_IEC_60559_TYPES_EXT__
15 #include <float.h>
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
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
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
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
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
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
59 #define CONCATX(X, Y) X ## Y
60 #define CONCAT(X, Y) CONCATX (X, Y)
62 extern void exit (int);
63 extern void abort (void);
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)
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)
93 int
94 main (void)
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);