Merge -r 127928:132243 from trunk
[official-gcc.git] / gcc / testsuite / gcc.dg / dfp / convert.h
blobbc9ef42f4dd508b9cd95fe22b58309c28d49f05a
1 extern void abort (void);
2 static int failcnt = 0;
4 /* Macros are set up to skip using long double, which doesn't necessarily
5 map to TF mode. If there's a reason to skip those for a test, the
6 test itself can define USE_TF to be zero. */
7 #ifndef USE_TF
8 #define USE_TF 1
9 #endif
11 /* Support compiling the test to report individual failures; default is
12 to abort as soon as a check fails. */
13 #if defined(DBG) || defined(DBG2)
14 #include <stdio.h>
15 #define FAILURE(NUM) \
16 { printf ("failed for test %s\n", NUM); failcnt++; }
17 #else
18 #define FAILURE(N) abort ();
19 #endif
21 /* This is useful when modifying the test to make sure that tests are
22 actually run. */
23 #if defined(DBG2)
24 #define REPORT(NUM) \
25 { printf ("%s\n", NUM); }
26 #else
27 #define REPORT(N) ;
28 #endif
30 #define CONVERT_VALID(NUM,FROM,TO,FROMVAL,TOVAL,DIFF) \
31 void \
32 convert_##NUM (void) \
33 { \
34 REPORT(#NUM " " #FROMVAL) \
35 FROM = FROMVAL; \
36 TO = FROM; \
37 if (TO < (TOVAL - DIFF) || TO > (TOVAL + DIFF)) \
38 FAILURE (#NUM); \
41 #define CONVERT_TO_PINF(NUM,FROM,TO,FROMVAL,TOSUFFIX) \
42 void \
43 convert_##NUM (void) \
44 { \
45 REPORT(#NUM " " #FROMVAL) \
46 FROM = FROMVAL; \
47 TO = FROM; \
48 if (__builtin_isinf##TOSUFFIX (TO) == 0) \
49 FAILURE (#NUM " pinf: isinf"); \
50 if (__builtin_signbit##TOSUFFIX (TO) != 0) \
51 FAILURE (#NUM " pinf: sign"); \
54 #define CONVERT_TO_MINF(NUM,FROM,TO,FROMVAL,TOSUFFIX) \
55 void \
56 convert_##NUM (void) \
57 { \
58 REPORT(#NUM " " #FROMVAL) \
59 FROM = FROMVAL; \
60 TO = FROM; \
61 if (__builtin_isinf##TOSUFFIX (TO) == 0) \
62 FAILURE (#NUM " pinf: isinf"); \
63 if (__builtin_signbit##TOSUFFIX (TO) == 0) \
64 FAILURE (#NUM " pinf: sign"); \
67 #define CONVERT_TO_PZERO(NUM,FROM,TO,FROMVAL,TOVAL,TOSUFFIX) \
68 void \
69 convert_##NUM (void) \
70 { \
71 REPORT(#NUM " " #FROMVAL) \
72 FROM = FROMVAL; \
73 TO = FROM; \
74 if (TO != TOVAL) \
75 FAILURE (#NUM "_pzero: zero") \
76 if (__builtin_signbit##TOSUFFIX (TO) != 0) \
77 FAILURE (#NUM " _pzero: sign"); \
80 #define CONVERT_TO_MZERO(NUM,FROM,TO,FROMVAL,TOVAL,TOSUFFIX) \
81 void \
82 convert_##NUM (void) \
83 { \
84 REPORT(#NUM " " #FROMVAL) \
85 FROM = FROMVAL; \
86 TO = FROM; \
87 if (TO != TOVAL) \
88 FAILURE (#NUM "_mzero: zero") \
89 if (__builtin_signbit##TOSUFFIX (TO) == 0) \
90 FAILURE (#NUM " _mzero: sign"); \
93 #define CONVERT_NAN(NUM,FROM,TO,FROMSUFFIX,TOSUFFIX) \
94 void \
95 convert_##NUM##_nan (void) \
96 { \
97 REPORT(#NUM "_nan") \
98 FROM = __builtin_nan##FROMSUFFIX (""); \
99 TO = FROM; \
100 if (__builtin_isnan##TOSUFFIX (TO) == 0) \
101 FAILURE (#NUM " nan"); \
104 #define CONVERT_PINF(NUM,FROM,TO,FROMSUFFIX,TOSUFFIX) \
105 void \
106 convert_##NUM##_pinf (void) \
108 REPORT (#NUM "_pinf") \
109 FROM = __builtin_inf##FROMSUFFIX (); \
110 TO = FROM; \
111 if (__builtin_isinf##TOSUFFIX (TO) == 0) \
112 FAILURE (#NUM " pinf: isinf"); \
113 if (__builtin_signbit##TOSUFFIX (TO) != 0) \
114 FAILURE (#NUM " pinf: sign"); \
117 #define CONVERT_MINF(NUM,FROM,TO,FROMSUFFIX,TOSUFFIX) \
118 void \
119 convert_##NUM##_minf (void) \
121 REPORT (#NUM "_minf") \
122 FROM = -__builtin_inf##FROMSUFFIX (); \
123 TO = FROM; \
124 if (__builtin_isinf##TOSUFFIX (TO) == 0) \
125 FAILURE (#NUM " minf: isinf"); \
126 if (__builtin_signbit##TOSUFFIX (TO) == 0) \
127 FAILURE (#NUM " minf: sign"); \
130 #define CONVERT_PZERO(NUM,FROM,TO,FROMVALUE,TOVALUE,TOSUFFIX) \
131 void \
132 convert_##NUM##_pzero (void) \
134 REPORT (#NUM "_pzero") \
135 FROM = FROMVALUE; \
136 TO = FROM; \
137 if (TO != TOVALUE) \
138 FAILURE (#NUM "pzero: zero") \
139 if (__builtin_signbit##TOSUFFIX (TO) != 0) \
140 FAILURE (#NUM " pzero: sign"); \
143 #define CONVERT_MZERO(NUM,FROM,TO,FROMVALUE,TOVALUE,TOSUFFIX) \
144 void \
145 convert_##NUM##_mzero (void) \
147 REPORT (#NUM "_mzero") \
148 FROM = FROMVALUE; \
149 TO = FROM; \
150 if (TO != TOVALUE) \
151 FAILURE (#NUM "mzero: zero") \
152 if (__builtin_signbit##TOSUFFIX (TO) == 0) \
153 FAILURE (#NUM " mzero: sign"); \
156 #define CONVERT_VALID_NOTF(NUM,VAL,DIFF) \
157 CONVERT_VALID (NUM##_sdsf, sd, sf, VAL##df, VAL##f, DIFF##f) \
158 CONVERT_VALID (NUM##_sddf, sd, df, VAL##df, VAL, DIFF) \
159 CONVERT_VALID (NUM##_ddsf, dd, sf, VAL##dd, VAL##f, DIFF##f) \
160 CONVERT_VALID (NUM##_dddf, dd, df, VAL##dd, VAL, DIFF) \
161 CONVERT_VALID (NUM##_tdsf, td, sf, VAL##dl, VAL##f, DIFF##f) \
162 CONVERT_VALID (NUM##_tddf, td, df, VAL##dl, VAL, DIFF) \
163 CONVERT_VALID (NUM##_sfsd, sf, sd, VAL##f, VAL##df, DIFF##df) \
164 CONVERT_VALID (NUM##_sfdd, sf, dd, VAL##f, VAL##dd, DIFF##dd) \
165 CONVERT_VALID (NUM##_sftd, sf, td, VAL##f, VAL##dl, DIFF##dl) \
166 CONVERT_VALID (NUM##_dfsd, df, sd, VAL, VAL##df, DIFF##df) \
167 CONVERT_VALID (NUM##_dfdd, df, dd, VAL, VAL##dd, DIFF##dd) \
168 CONVERT_VALID (NUM##_dftd, df, td, VAL, VAL##dl, DIFF##dl) \
169 CONVERT_VALID (NUM##_sddd, sd, dd, VAL##df, VAL##dd, DIFF##dd) \
170 CONVERT_VALID (NUM##_sdtd, sd, dd, VAL##df, VAL##dd, DIFF##dd) \
171 CONVERT_VALID (NUM##_ddsd, dd, sd, VAL##dd, VAL##df, DIFF##dd) \
172 CONVERT_VALID (NUM##_ddtd, dd, td, VAL##dd, VAL##dl, DIFF##dl) \
173 CONVERT_VALID (NUM##_tdsd, td, sd, VAL##dl, VAL##df, DIFF##df) \
174 CONVERT_VALID (NUM##_tddd, td, dd, VAL##dl, VAL##dd, DIFF##dd)
176 #if USE_TF == 0
177 #define CONVERT_VALID_TF(NUM,VAL,DIFF)
178 #else
179 #define CONVERT_VALID_TF(NUM,VAL,DIFF) \
180 CONVERT_VALID (NUM##_sdtf, sd, tf, VAL##df, VAL##l, DIFF##l) \
181 CONVERT_VALID (NUM##_tdtf, td, tf, VAL##dl, VAL##l, DIFF##l) \
182 CONVERT_VALID (NUM##_ddtf, dd, tf, VAL##dd, VAL##l, DIFF##l) \
183 CONVERT_VALID (NUM##_tfsd, tf, sd, VAL##l, VAL##df, DIFF##df) \
184 CONVERT_VALID (NUM##_tfdd, tf, dd, VAL##l, VAL##dd, DIFF##dd) \
185 CONVERT_VALID (NUM##_tftd, tf, td, VAL##l, VAL##dl, DIFF##dl)
186 #endif
188 #define CONVERT_VALID_ALL(NUM,VAL,DIFF) \
189 CONVERT_VALID_NOTF(NUM,VAL,DIFF) \
190 CONVERT_VALID_TF(NUM,VAL,DIFF)
192 #define CALL_VALID_NOTF(NUM) \
193 convert_##NUM##_sdsf (); \
194 convert_##NUM##_sddf (); \
195 convert_##NUM##_ddsf (); \
196 convert_##NUM##_dddf (); \
197 convert_##NUM##_tdsf (); \
198 convert_##NUM##_tddf (); \
199 convert_##NUM##_sfsd (); \
200 convert_##NUM##_sfdd (); \
201 convert_##NUM##_sftd (); \
202 convert_##NUM##_dfsd (); \
203 convert_##NUM##_dfdd (); \
204 convert_##NUM##_dftd (); \
205 convert_##NUM##_sddd (); \
206 convert_##NUM##_sdtd (); \
207 convert_##NUM##_ddsd (); \
208 convert_##NUM##_ddtd (); \
209 convert_##NUM##_tdsd (); \
210 convert_##NUM##_tddd ();
212 #if USE_TF == 0
213 #define CALL_VALID_TF(NUM)
214 #else
215 #define CALL_VALID_TF(NUM) \
216 convert_##NUM##_sdtf (); \
217 convert_##NUM##_ddtf (); \
218 convert_##NUM##_tdtf (); \
219 convert_##NUM##_tfsd (); \
220 convert_##NUM##_tfdd (); \
221 convert_##NUM##_tftd ();
222 #endif
224 #define CALL_VALID_ALL(NUM) \
225 CALL_VALID_NOTF(NUM) \
226 CALL_VALID_TF(NUM)
228 #define CONVERT_ZEROES(NUM,FROM,TO,FROMVALUE,TOVALUE,TOSUFFIX) \
229 CONVERT_PZERO(NUM, FROM, TO, FROMVALUE, TOVALUE, TOSUFFIX) \
230 CONVERT_MZERO(NUM, FROM, TO, -FROMVALUE, -TOVALUE, TOSUFFIX)
232 #define CONVERT_ZEROES_NOTF(NUM) \
233 CONVERT_ZEROES (NUM##_sdsf, sd, sf, 0.0df, 0.0f, f) \
234 CONVERT_ZEROES (NUM##_sddf, sd, df, 0.0df, 0.0, ) \
235 CONVERT_ZEROES (NUM##_ddsf, dd, sf, 0.0dd, 0.0f, f) \
236 CONVERT_ZEROES (NUM##_dddf, dd, df, 0.0dd, 0.0, ) \
237 CONVERT_ZEROES (NUM##_tdsf, td, sf, 0.0dl, 0.0f, f) \
238 CONVERT_ZEROES (NUM##_tddf, td, df, 0.0dl, 0.0, ) \
239 CONVERT_ZEROES (NUM##_sfsd, sf, sd, 0.0f, 0.0df, d32) \
240 CONVERT_ZEROES (NUM##_sfdd, sf, dd, 0.0f, 0.0dd, d64) \
241 CONVERT_ZEROES (NUM##_sftd, sf, td, 0.0f, 0.0dl, d128) \
242 CONVERT_ZEROES (NUM##_dfsd, df, sd, 0.0, 0.0df, d32) \
243 CONVERT_ZEROES (NUM##_dfdd, df, dd, 0.0, 0.0dd, d64) \
244 CONVERT_ZEROES (NUM##_dftd, df, td, 0.0, 0.0dl, d128) \
245 CONVERT_ZEROES (NUM##_sddd, sd, dd, 0.0df, 0.0dd, d64) \
246 CONVERT_ZEROES (NUM##_sdtd, sd, td, 0.0dl, 0.0dl, d128) \
247 CONVERT_ZEROES (NUM##_ddsd, dd, sd, 0.0dd, 0.0df, d32) \
248 CONVERT_ZEROES (NUM##_ddtd, dd, td, 0.0dd, 0.0dl, d128) \
249 CONVERT_ZEROES (NUM##_tdsd, td, sd, 0.0dl, 0.0df, d32) \
250 CONVERT_ZEROES (NUM##_tddd, td, dd, 0.0dl, 0.0dd, d64)
252 #if USE_TF == 0
253 #define CONVERT_ZEROES_TF(NUM)
254 #else
255 #define CONVERT_ZEROES_TF(NUM) \
256 CONVERT_ZEROES (NUM##_sdtf, sd, tf, 0.0df, 0.0l, l) \
257 CONVERT_ZEROES (NUM##_ddtf, dd, tf, 0.0dd, 0.0l, l) \
258 CONVERT_ZEROES (NUM##_tdtf, td, tf, 0.0dl, 0.0l, l) \
259 CONVERT_ZEROES (NUM##_tfsd, tf, sd, 0.0l, 0.0df, d32) \
260 CONVERT_ZEROES (NUM##_tfdd, tf, dd, 0.0l, 0.0dd, d64) \
261 CONVERT_ZEROES (NUM##_tftd, tf, td, 0.0l, 0.0dl, d128)
262 #endif
264 #define CONVERT_ZEROES_ALL(NUM) \
265 CONVERT_ZEROES_NOTF(NUM) \
266 CONVERT_ZEROES_TF(NUM)
268 #define CALL_ZEROES(NUM) \
269 convert_##NUM##_pzero (); \
270 convert_##NUM##_mzero ();
272 #define CALL_ZEROES_NOTF(NUM) \
273 CALL_ZEROES (NUM##_sdsf) \
274 CALL_ZEROES (NUM##_sddf) \
275 CALL_ZEROES (NUM##_ddsf) \
276 CALL_ZEROES (NUM##_dddf) \
277 CALL_ZEROES (NUM##_tdsf) \
278 CALL_ZEROES (NUM##_tddf) \
279 CALL_ZEROES (NUM##_sfsd) \
280 CALL_ZEROES (NUM##_sfdd) \
281 CALL_ZEROES (NUM##_sftd) \
282 CALL_ZEROES (NUM##_dfsd) \
283 CALL_ZEROES (NUM##_dfdd) \
284 CALL_ZEROES (NUM##_dftd) \
285 CALL_ZEROES (NUM##_sddd) \
286 CALL_ZEROES (NUM##_sdtd) \
287 CALL_ZEROES (NUM##_ddsd) \
288 CALL_ZEROES (NUM##_ddtd) \
289 CALL_ZEROES (NUM##_tdsd) \
290 CALL_ZEROES (NUM##_tddd)
292 #if USE_TF == 0
293 #define CALL_ZEROES_TF(NUM)
294 #else
295 #define CALL_ZEROES_TF(NUM) \
296 CALL_ZEROES (NUM##_sdtf) \
297 CALL_ZEROES (NUM##_ddtf) \
298 CALL_ZEROES (NUM##_tdtf) \
299 CALL_ZEROES (NUM##_tfsd) \
300 CALL_ZEROES (NUM##_tfdd) \
301 CALL_ZEROES (NUM##_tftd)
302 #endif
304 #define CALL_ZEROES_ALL(NUM) \
305 CALL_ZEROES_NOTF(NUM) \
306 CALL_ZEROES_TF(NUM)
308 #define CONVERT_INF(NUM,FROM,TO,FROMSUFFIX,TOSUFFIX) \
309 CONVERT_PINF (NUM, FROM, TO, FROMSUFFIX, TOSUFFIX) \
310 CONVERT_MINF (NUM, FROM, TO, FROMSUFFIX, TOSUFFIX)
312 #define CONVERT_INF_NOTF(NUM) \
313 CONVERT_INF (NUM##_sdsf, sd, sf, d32, f) \
314 CONVERT_INF (NUM##_sddf, sd, df, d32, ) \
315 CONVERT_INF (NUM##_ddsf, dd, sf, d64, f) \
316 CONVERT_INF (NUM##_dddf, dd, df, d64, ) \
317 CONVERT_INF (NUM##_tdsf, td, sf, d128, f) \
318 CONVERT_INF (NUM##_tddf, td, df, d128, ) \
319 CONVERT_INF (NUM##_sfsd, sf, sd, f, d32) \
320 CONVERT_INF (NUM##_sfdd, sf, dd, f, d64) \
321 CONVERT_INF (NUM##_sftd, sf, td, f, d128) \
322 CONVERT_INF (NUM##_dfsd, df, sd, , d32) \
323 CONVERT_INF (NUM##_dfdd, df, dd, , d64) \
324 CONVERT_INF (NUM##_dftd, df, td, , d128) \
325 CONVERT_INF (NUM##_sddd, sd, dd, d32, d64) \
326 CONVERT_INF (NUM##_sdtd, sd, td, d32, d128) \
327 CONVERT_INF (NUM##_ddsd, dd, sd, d64, d32) \
328 CONVERT_INF (NUM##_ddtd, dd, td, d64, d128) \
329 CONVERT_INF (NUM##_tdsd, td, sd, d128, d32) \
330 CONVERT_INF (NUM##_tddd, td, dd, d128, d64)
332 #if USE_TF == 0
333 #define CONVERT_INF_TF(NUM)
334 #else
335 #define CONVERT_INF_TF(NUM) \
336 CONVERT_INF (NUM##_sdtf, sd, tf, d32, l) \
337 CONVERT_INF (NUM##_ddtf, dd, tf, d64, l) \
338 CONVERT_INF (NUM##_tdtf, td, tf, d128, l) \
339 CONVERT_INF (NUM##_tfsd, tf, sd, l, d32) \
340 CONVERT_INF (NUM##_tfdd, tf, dd, l, d64) \
341 CONVERT_INF (NUM##_tftd, tf, td, l, d128)
342 #endif
344 #define CONVERT_INF_ALL(NUM) \
345 CONVERT_INF_NOTF(NUM) \
346 CONVERT_INF_TF(NUM)
348 #define CALL_INF(NUM) \
349 convert_##NUM##_pinf (); \
350 convert_##NUM##_minf ();
352 #define CALL_INF_NOTF(NUM) \
353 CALL_INF (NUM##_sdsf) \
354 CALL_INF (NUM##_sddf) \
355 CALL_INF (NUM##_ddsf) \
356 CALL_INF (NUM##_dddf) \
357 CALL_INF (NUM##_tdsf) \
358 CALL_INF (NUM##_tddf) \
359 CALL_INF (NUM##_sfsd) \
360 CALL_INF (NUM##_sfdd) \
361 CALL_INF (NUM##_sftd) \
362 CALL_INF (NUM##_dfsd) \
363 CALL_INF (NUM##_dfdd) \
364 CALL_INF (NUM##_dftd) \
365 CALL_INF (NUM##_sddd) \
366 CALL_INF (NUM##_sdtd) \
367 CALL_INF (NUM##_ddsd) \
368 CALL_INF (NUM##_ddtd) \
369 CALL_INF (NUM##_tdsd) \
370 CALL_INF (NUM##_tddd)
372 #if USE_TF == 0
373 #define CALL_INF_TF(NUM)
374 #else
375 #define CALL_INF_TF(NUM) \
376 CALL_INF (NUM##_sdtf) \
377 CALL_INF (NUM##_ddtf) \
378 CALL_INF (NUM##_tdtf) \
379 CALL_INF (NUM##_tfsd) \
380 CALL_INF (NUM##_tfdd) \
381 CALL_INF (NUM##_tftd)
382 #endif
384 #define CALL_INF_ALL(NUM) \
385 CALL_INF_NOTF(NUM) \
386 CALL_INF_TF(NUM)
388 #define CONVERT_NAN_NOTF(NUM) \
389 CONVERT_NAN (NUM##_sdsf, sd, sf, d32, f) \
390 CONVERT_NAN (NUM##_sddf, sd, df, d32, ) \
391 CONVERT_NAN (NUM##_ddsf, dd, sf, d64, f) \
392 CONVERT_NAN (NUM##_dddf, dd, df, d64, ) \
393 CONVERT_NAN (NUM##_tdsf, td, sf, d128, f) \
394 CONVERT_NAN (NUM##_tddf, td, df, d128, ) \
395 CONVERT_NAN (NUM##_sfsd, sf, sd, f, d32) \
396 CONVERT_NAN (NUM##_sfdd, sf, dd, f, d64) \
397 CONVERT_NAN (NUM##_sftd, sf, td, f, d128) \
398 CONVERT_NAN (NUM##_dfsd, df, sd, , d32) \
399 CONVERT_NAN (NUM##_dfdd, df, dd, , d64) \
400 CONVERT_NAN (NUM##_dftd, df, td, , d128) \
401 CONVERT_NAN (NUM##_sddd, sd, dd, d32, d64) \
402 CONVERT_NAN (NUM##_sdtd, sd, td, d32, d128) \
403 CONVERT_NAN (NUM##_ddsd, dd, sd, d64, d32) \
404 CONVERT_NAN (NUM##_ddtd, dd, td, d64, d128) \
405 CONVERT_NAN (NUM##_tdsd, td, sd, d128, d32) \
406 CONVERT_NAN (NUM##_tddd, td, dd, d128, d64)
408 #if USE_TF == 0
409 #define CONVERT_NAN_TF(NUM)
410 #else
411 #define CONVERT_NAN_TF(NUM) \
412 CONVERT_NAN (NUM##_sdtf, sd, tf, d32, l) \
413 CONVERT_NAN (NUM##_ddtf, dd, tf, d64, l) \
414 CONVERT_NAN (NUM##_tdtf, td, tf, d128, l) \
415 CONVERT_NAN (NUM##_tfsd, tf, sd, l, d32) \
416 CONVERT_NAN (NUM##_tfdd, tf, dd, l, d64) \
417 CONVERT_NAN (NUM##_tftd, tf, td, l, d128)
418 #endif
420 #define CONVERT_NAN_ALL(NUM) \
421 CONVERT_NAN_NOTF(NUM) \
422 CONVERT_NAN_TF(NUM)
424 #define CALL_NAN(NUM) \
425 convert_##NUM##_nan ();
427 #define CALL_NAN_NOTF(NUM) \
428 CALL_NAN (NUM##_sdsf) \
429 CALL_NAN (NUM##_sddf) \
430 CALL_NAN (NUM##_ddsf) \
431 CALL_NAN (NUM##_dddf) \
432 CALL_NAN (NUM##_tdsf) \
433 CALL_NAN (NUM##_tddf) \
434 CALL_NAN (NUM##_sfsd) \
435 CALL_NAN (NUM##_sfdd) \
436 CALL_NAN (NUM##_sftd) \
437 CALL_NAN (NUM##_dfsd) \
438 CALL_NAN (NUM##_dfdd) \
439 CALL_NAN (NUM##_dftd) \
440 CALL_NAN (NUM##_sddd) \
441 CALL_NAN (NUM##_sdtd) \
442 CALL_NAN (NUM##_ddsd) \
443 CALL_NAN (NUM##_ddtd) \
444 CALL_NAN (NUM##_tdsd) \
445 CALL_NAN (NUM##_tddd)
447 #if USE_TF == 0
448 #define CALL_NAN_TF(NUM)
449 #else
450 #define CALL_NAN_TF(NUM) \
451 CALL_NAN (NUM##_sdtf) \
452 CALL_NAN (NUM##_ddtf) \
453 CALL_NAN (NUM##_tdtf) \
454 CALL_NAN (NUM##_tfsd) \
455 CALL_NAN (NUM##_tfdd) \
456 CALL_NAN (NUM##_tftd)
457 #endif
459 #define CALL_NAN_ALL(NUM) \
460 CALL_NAN_NOTF(NUM) \
461 CALL_NAN_TF(NUM)