gcc/
[official-gcc.git] / gcc / testsuite / gcc.dg / dfp / compare-special.h
blob1bd77e521563127ad34fa2dc238d969539650e1f
1 /* Basic test of runtime relational comparisons using NaNs and infinities. */
3 #include <stdlib.h>
5 static int failcnt;
7 #define PASTE2(A,B) A ## B
8 #define PASTE(A,B) PASTE2(A,B)
10 #ifdef DBG
11 #include <stdio.h>
12 #define FAILURE(OP,KIND) \
13 { printf ("failed at line %d: %s for %s values\n", __LINE__, OP, KIND); \
14 failcnt++; }
15 #else
16 #define FAILURE(OP,KIND) abort ();
17 #endif
19 #ifndef WIDTH
20 #error define WIDTH as decimal float size in bytes
21 #endif
23 #if WIDTH == 32
24 #define DTYPE _Decimal32
25 #define SUFFIX DF
26 #define SUFFIX2 d32
27 #elif WIDTH == 64
28 #define DTYPE _Decimal64
29 #define SUFFIX DD
30 #define SUFFIX2 d64
31 #elif WIDTH == 128
32 #define DTYPE _Decimal128
33 #define SUFFIX DL
34 #define SUFFIX2 d128
35 #elif WIDTH == 0
36 /* This is for testing the test using a type known to work. */
37 #define DTYPE double
38 #define SUFFIX
39 #define SUFFIX2
40 #else
41 #error invalid width for decimal float type
42 #endif
44 DTYPE m_two = PASTE(-2.0, SUFFIX);
45 DTYPE m_one = PASTE(-1.0, SUFFIX);
46 DTYPE zero = PASTE(0.0, SUFFIX);
47 DTYPE one = PASTE(1.0, SUFFIX);
48 DTYPE two = PASTE(2.0, SUFFIX);
50 volatile DTYPE x, y, z, nan, inf, m_inf;
52 void
53 test_compares (void)
55 nan = PASTE(__builtin_nan, SUFFIX2) ("");
56 inf = PASTE(__builtin_inf, SUFFIX2) ();
57 m_inf = - PASTE(__builtin_inf, SUFFIX2) ();
59 x = PASTE(__builtin_nan, SUFFIX2) ("");
60 y = PASTE(__builtin_inf, SUFFIX2) ();
61 z = - PASTE(__builtin_inf, SUFFIX2) ();
63 /* Less than or equal to with NaN. */
65 if (x <= two) FAILURE ("<=", "NaN")
66 if (x <= zero) FAILURE ("<=", "NaN")
67 if (x <= m_one) FAILURE ("<=", "NaN")
68 if (x <= nan) FAILURE ("<=", "NaN")
69 if (x <= inf) FAILURE ("<=", "NaN")
70 if (x <= m_inf) FAILURE ("<=", "NaN")
72 if (two <= x) FAILURE ("<=", "NaN")
73 if (zero <= x) FAILURE ("<=", "NaN")
74 if (m_one <= x) FAILURE ("<=", "NaN")
75 if (nan <= x) FAILURE ("<=", "NaN")
76 if (inf <= x) FAILURE ("<=", "NaN")
77 if (m_inf <= x) FAILURE ("<=", "NaN")
79 /* Less than or equal to with infinities, no NaNs. */
81 if (y <= two) FAILURE ("<=", "inf")
82 if (y <= zero) FAILURE ("<=", "inf")
83 if (y <= m_one) FAILURE ("<=", "inf")
84 if (!(two <= y)) FAILURE ("<=", "inf")
85 if (!(zero <= y)) FAILURE ("<=", "inf")
86 if (!(m_one <= y)) FAILURE ("<=", "inf")
88 if (!(z <= two)) FAILURE ("<=", "-inf")
89 if (!(z <= zero)) FAILURE ("<=", "-inf")
90 if (!(z <= m_one)) FAILURE ("<=", "-inf")
91 if (two <= z) FAILURE ("<=", "-inf")
92 if (zero <= z) FAILURE ("<=", "-inf")
93 if (m_one <= z) FAILURE ("<=", "-inf")
95 if (!(y <= inf)) FAILURE ("<=", "inf")
96 if (y <= m_inf) FAILURE ("<=", "inf")
97 if (!(z <= inf)) FAILURE ("<=", "inf")
98 if (!(z <= m_inf)) FAILURE ("<=", "inf")
100 /* Less than with NaN. */
102 if (x < two) FAILURE ("<", "NaN")
103 if (x < zero) FAILURE ("<", "NaN")
104 if (x < m_one) FAILURE ("<", "NaN")
105 if (x < nan) FAILURE ("<", "NaN")
106 if (x < inf) FAILURE ("<", "NaN")
107 if (x < m_inf) FAILURE ("<", "NaN")
109 if (two < x) FAILURE ("<", "NaN")
110 if (zero < x) FAILURE ("<", "NaN")
111 if (m_one < x) FAILURE ("<", "NaN")
112 if (nan < x) FAILURE ("<", "NaN")
113 if (inf < x) FAILURE ("<", "NaN")
114 if (m_inf < x) FAILURE ("<", "NaN")
116 /* Less than with infinities, no NaNs. */
118 if (y < two) FAILURE ("<", "inf")
119 if (y < zero) FAILURE ("<", "inf")
120 if (y < m_one) FAILURE ("<", "inf")
121 if (!(two < y)) FAILURE ("<", "inf")
122 if (!(zero < y)) FAILURE ("<", "inf")
123 if (!(m_one < y)) FAILURE ("<", "inf")
125 if (!(z < two)) FAILURE ("<", "-inf")
126 if (!(z < zero)) FAILURE ("<", "-inf")
127 if (!(z < m_one)) FAILURE ("<", "-inf")
128 if (two < z) FAILURE ("<", "-inf")
129 if (zero < z) FAILURE ("<", "-inf")
130 if (m_one < z) FAILURE ("<", "-inf")
132 if (y < inf) FAILURE ("<=", "inf")
133 if (y < m_inf) FAILURE ("<=", "inf")
134 if (!(z < inf)) FAILURE ("<=", "inf")
135 if (z < m_inf) FAILURE ("<=", "inf")
137 /* Greater than or equal to with NaN. */
139 if (x >= two) FAILURE (">=", "NaN")
140 if (x >= zero) FAILURE (">=", "NaN")
141 if (x >= m_one) FAILURE (">=", "NaN")
142 if (x >= nan) FAILURE (">=", "NaN")
143 if (x >= inf) FAILURE (">=", "NaN")
144 if (x >= m_inf) FAILURE (">=", "NaN")
146 if (two >= x) FAILURE (">=", "NaN")
147 if (zero >= x) FAILURE (">=", "NaN")
148 if (m_one >= x) FAILURE (">=", "NaN")
149 if (nan >= x) FAILURE (">=", "NaN")
150 if (inf >= x) FAILURE (">=", "NaN")
151 if (m_inf >= x) FAILURE (">=", "NaN")
153 /* Greater than or equal to with infinities, no NaNs. */
155 if (!(y >= two)) FAILURE (">=", "inf")
156 if (!(y >= zero)) FAILURE (">=", "inf")
157 if (!(y >= m_one)) FAILURE (">=", "inf")
158 if (two >= y) FAILURE (">=", "inf")
159 if (zero >= y) FAILURE (">=", "inf")
160 if (m_one >= y) FAILURE (">=", "inf")
162 if (z >= two) FAILURE (">=", "-inf")
163 if (z >= zero) FAILURE (">=", "-inf")
164 if (z >= m_one) FAILURE (">=", "-inf")
165 if (!(two >= z)) FAILURE (">=", "-inf")
166 if (!(zero >= z)) FAILURE (">=", "-inf")
167 if (!(m_one >= z)) FAILURE (">=", "-inf")
169 if (!(y >= inf)) FAILURE ("<=", "inf")
170 if (!(y >= m_inf)) FAILURE ("<=", "inf")
171 if (z >= inf) FAILURE ("<=", "inf")
172 if (!(z >= m_inf)) FAILURE ("<=", "inf")
174 /* Greater than with NaN. */
176 if (x > two) FAILURE (">", "NaN")
177 if (x > zero) FAILURE (">", "NaN")
178 if (x > m_one) FAILURE (">", "NaN")
179 if (x > nan) FAILURE (">", "NaN")
180 if (x > inf) FAILURE (">", "NaN")
181 if (x > m_inf) FAILURE (">", "NaN")
183 if (two > x) FAILURE (">", "NaN")
184 if (zero > x) FAILURE (">", "NaN")
185 if (m_one > x) FAILURE (">", "NaN")
186 if (nan > x) FAILURE (">", "NaN")
187 if (inf > x) FAILURE (">", "NaN")
188 if (m_inf > x) FAILURE (">", "NaN")
190 /* Greater than with infinities, no NaNs. */
192 if (!(y > two)) FAILURE (">", "inf")
193 if (!(y > zero)) FAILURE (">", "inf")
194 if (!(y > m_one)) FAILURE (">", "inf")
195 if (two > y) FAILURE (">", "inf")
196 if (zero > y) FAILURE (">", "inf")
197 if (m_one > y) FAILURE (">", "inf")
199 if (z > two) FAILURE (">", "-inf")
200 if (z > zero) FAILURE (">", "-inf")
201 if (z > m_one) FAILURE (">", "-inf")
202 if (!(two > z)) FAILURE (">", "-inf")
203 if (!(zero > z)) FAILURE (">", "-inf")
204 if (!(m_one > z)) FAILURE (">", "-inf")
206 if (y > inf) FAILURE (">", "inf")
207 if (!(y > m_inf)) FAILURE (">", "inf")
208 if (z > inf) FAILURE (">", "inf")
209 if (z > m_inf) FAILURE (">", "inf")
211 /* Equal with NaN. */
213 if (x == two) FAILURE ("==", "NaN")
214 if (x == zero) FAILURE ("==", "NaN")
215 if (x == m_one) FAILURE ("==", "NaN")
216 if (x == nan) FAILURE ("==", "NaN")
217 if (x == inf) FAILURE ("==", "NaN")
218 if (x == m_inf) FAILURE ("==", "NaN")
220 if (two == x) FAILURE ("==", "NaN")
221 if (zero == x) FAILURE ("==", "NaN")
222 if (m_one == x) FAILURE ("==", "NaN")
223 if (nan == x) FAILURE ("==", "NaN")
224 if (inf == x) FAILURE ("==", "NaN")
225 if (m_inf == x) FAILURE ("==", "NaN")
227 /* Equal with infinities, no NaNs. */
229 if (y == two) FAILURE ("==", "inf")
230 if (y == zero) FAILURE ("==", "inf")
231 if (y == m_one) FAILURE ("==", "inf")
232 if (two == y) FAILURE ("==", "inf")
233 if (zero == y) FAILURE ("==", "inf")
234 if (m_one == y) FAILURE ("==", "inf")
236 if (z == two) FAILURE ("==", "-inf")
237 if (z == zero) FAILURE ("==", "-inf")
238 if (z == m_one) FAILURE ("==", "-inf")
239 if (two == z) FAILURE ("==", "-inf")
240 if (zero == z) FAILURE ("==", "-inf")
241 if (m_one == z) FAILURE ("==", "-inf")
243 if (!(y == inf)) FAILURE ("==", "inf")
244 if (y == m_inf) FAILURE ("==", "inf")
245 if (z == inf) FAILURE ("==", "inf")
246 if (!(z == m_inf)) FAILURE ("==", "inf")
248 /* Not equal with NaN. */
250 if (!(x != two)) FAILURE ("!=", "NaN")
251 if (!(x != zero)) FAILURE ("!=", "NaN")
252 if (!(x != m_one)) FAILURE ("!=", "NaN")
253 if (!(x != nan)) FAILURE ("!=", "NaN")
254 if (!(x != inf)) FAILURE ("!=", "NaN")
255 if (!(x != m_inf)) FAILURE ("!=", "NaN")
257 if (!(two != x)) FAILURE ("!=", "NaN")
258 if (!(zero != x)) FAILURE ("!=", "NaN")
259 if (!(m_one != x)) FAILURE ("!=", "NaN")
260 if (!(nan != x)) FAILURE ("!=", "NaN")
261 if (!(inf != x)) FAILURE ("!=", "NaN")
262 if (!(m_inf != x)) FAILURE ("!=", "NaN")
264 /* Not equal with infinities, no NaNs. */
266 if (!(y != two)) FAILURE ("!=", "inf")
267 if (!(y != zero)) FAILURE ("!=", "inf")
268 if (!(y != m_one)) FAILURE ("!=", "inf")
269 if (!(two != y)) FAILURE ("!=", "inf")
270 if (!(zero != y)) FAILURE ("!=", "inf")
271 if (!(m_one != y)) FAILURE ("!=", "inf")
273 if (!(z != two)) FAILURE ("!=", "-inf")
274 if (!(z != zero)) FAILURE ("!=", "-inf")
275 if (!(z != m_one)) FAILURE ("!=", "-inf")
276 if (!(two != z)) FAILURE ("!=", "-inf")
277 if (!(zero != z)) FAILURE ("!=", "-inf")
278 if (!(m_one != z)) FAILURE ("!=", "-inf")
280 if (y != inf) FAILURE ("!=", "inf")
281 if (!(y != m_inf)) FAILURE ("!=", "inf")
282 if (!(z != inf)) FAILURE ("!=", "inf")
283 if (z != m_inf) FAILURE ("!=", "inf")
285 if (failcnt)
286 abort ();