1206917Smarius
2206917Smarius/*
3206917Smarius===============================================================================
4206917Smarius
5206917SmariusThis C source file is part of TestFloat, Release 2a, a package of programs
6206917Smariusfor testing the correctness of floating-point arithmetic complying to the
7206917SmariusIEC/IEEE Standard for Floating-Point.
8206917Smarius
9206917SmariusWritten by John R. Hauser.  More information is available through the Web
10206917Smariuspage `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
11206917Smarius
12206917SmariusTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
13206917Smariushas been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
14206917SmariusTIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
15206917SmariusPERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
16206917SmariusAND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
17206917Smarius
18206917SmariusDerivative works are acceptable, even for commercial purposes, so long as
19206917Smarius(1) they include prominent notice that the work is derivative, and (2) they
20206917Smariusinclude prominent notice akin to these four paragraphs for those parts of
21206917Smariusthis code that are retained.
22206917Smarius
23206917Smarius===============================================================================
24206917Smarius*/
25206917Smarius
26206917Smarius#include "milieu.h"
27206917Smarius#include "softfloat.h"
28206917Smarius#include "testCases.h"
29206917Smarius#include "testLoops.h"
30206917Smarius#include "systmodes.h"
31206917Smarius#include "systflags.h"
32206917Smarius#include "systfloat.h"
33206917Smarius#include "testFunction.h"
34206917Smarius
35206917Smariusconst functionT functions[ NUM_FUNCTIONS ] = {
36206917Smarius    { 0, 0, 0, 0 },
37206917Smarius    { "int32_to_float32",                1, FALSE, TRUE  },
38206917Smarius    { "int32_to_float64",                1, FALSE, FALSE },
39206917Smarius    { "int32_to_floatx80",               1, FALSE, FALSE },
40206917Smarius    { "int32_to_float128",               1, FALSE, FALSE },
41206917Smarius    { "int64_to_float32",                1, FALSE, TRUE  },
42206917Smarius    { "int64_to_float64",                1, FALSE, TRUE  },
43206917Smarius    { "int64_to_floatx80",               1, FALSE, FALSE },
44206917Smarius    { "int64_to_float128",               1, FALSE, FALSE },
45206917Smarius    { "float32_to_int32",                1, FALSE, TRUE  },
46206917Smarius    { "float32_to_int32_round_to_zero",  1, FALSE, FALSE },
47206917Smarius    { "float32_to_int64",                1, FALSE, TRUE  },
48206917Smarius    { "float32_to_int64_round_to_zero",  1, FALSE, FALSE },
49206917Smarius    { "float32_to_float64",              1, FALSE, FALSE },
50206917Smarius    { "float32_to_floatx80",             1, FALSE, FALSE },
51206917Smarius    { "float32_to_float128",             1, FALSE, FALSE },
52206917Smarius    { "float32_round_to_int",            1, FALSE, TRUE  },
53206917Smarius    { "float32_add",                     2, FALSE, TRUE  },
54206917Smarius    { "float32_sub",                     2, FALSE, TRUE  },
55206917Smarius    { "float32_mul",                     2, FALSE, TRUE  },
56206917Smarius    { "float32_div",                     2, FALSE, TRUE  },
57206917Smarius    { "float32_rem",                     2, FALSE, FALSE },
58206917Smarius    { "float32_sqrt",                    1, FALSE, TRUE  },
59206917Smarius    { "float32_eq",                      2, FALSE, FALSE },
60206917Smarius    { "float32_le",                      2, FALSE, FALSE },
61206917Smarius    { "float32_lt",                      2, FALSE, FALSE },
62206917Smarius    { "float32_eq_signaling",            2, FALSE, FALSE },
63206917Smarius    { "float32_le_quiet",                2, FALSE, FALSE },
64206917Smarius    { "float32_lt_quiet",                2, FALSE, FALSE },
65206917Smarius    { "float64_to_int32",                1, FALSE, TRUE  },
66206917Smarius    { "float64_to_int32_round_to_zero",  1, FALSE, FALSE },
67206917Smarius    { "float64_to_int64",                1, FALSE, TRUE  },
68206917Smarius    { "float64_to_int64_round_to_zero",  1, FALSE, FALSE },
69206917Smarius    { "float64_to_float32",              1, FALSE, TRUE  },
70206917Smarius    { "float64_to_floatx80",             1, FALSE, FALSE },
71206917Smarius    { "float64_to_float128",             1, FALSE, FALSE },
72206917Smarius    { "float64_round_to_int",            1, FALSE, TRUE  },
73206917Smarius    { "float64_add",                     2, FALSE, TRUE  },
74206917Smarius    { "float64_sub",                     2, FALSE, TRUE  },
75206917Smarius    { "float64_mul",                     2, FALSE, TRUE  },
76206917Smarius    { "float64_div",                     2, FALSE, TRUE  },
77206917Smarius    { "float64_rem",                     2, FALSE, FALSE },
78206917Smarius    { "float64_sqrt",                    1, FALSE, TRUE  },
79206917Smarius    { "float64_eq",                      2, FALSE, FALSE },
80206917Smarius    { "float64_le",                      2, FALSE, FALSE },
81206917Smarius    { "float64_lt",                      2, FALSE, FALSE },
82206917Smarius    { "float64_eq_signaling",            2, FALSE, FALSE },
83206917Smarius    { "float64_le_quiet",                2, FALSE, FALSE },
84206917Smarius    { "float64_lt_quiet",                2, FALSE, FALSE },
85206917Smarius    { "floatx80_to_int32",               1, FALSE, TRUE  },
86206917Smarius    { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE },
87206917Smarius    { "floatx80_to_int64",               1, FALSE, TRUE  },
88206917Smarius    { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE },
89206917Smarius    { "floatx80_to_float32",             1, FALSE, TRUE  },
90206917Smarius    { "floatx80_to_float64",             1, FALSE, TRUE  },
91206917Smarius    { "floatx80_to_float128",            1, FALSE, FALSE },
92206917Smarius    { "floatx80_round_to_int",           1, FALSE, TRUE  },
93206917Smarius    { "floatx80_add",                    2, TRUE,  TRUE  },
94206917Smarius    { "floatx80_sub",                    2, TRUE,  TRUE  },
95206917Smarius    { "floatx80_mul",                    2, TRUE,  TRUE  },
96206917Smarius    { "floatx80_div",                    2, TRUE,  TRUE  },
97206917Smarius    { "floatx80_rem",                    2, FALSE, FALSE },
98206917Smarius    { "floatx80_sqrt",                   1, TRUE,  TRUE  },
99206917Smarius    { "floatx80_eq",                     2, FALSE, FALSE },
100206917Smarius    { "floatx80_le",                     2, FALSE, FALSE },
101206917Smarius    { "floatx80_lt",                     2, FALSE, FALSE },
102206917Smarius    { "floatx80_eq_signaling",           2, FALSE, FALSE },
103206917Smarius    { "floatx80_le_quiet",               2, FALSE, FALSE },
104206917Smarius    { "floatx80_lt_quiet",               2, FALSE, FALSE },
105206917Smarius    { "float128_to_int32",               1, FALSE, TRUE  },
106206917Smarius    { "float128_to_int32_round_to_zero", 1, FALSE, FALSE },
107206917Smarius    { "float128_to_int64",               1, FALSE, TRUE  },
108206917Smarius    { "float128_to_int64_round_to_zero", 1, FALSE, FALSE },
109206917Smarius    { "float128_to_float32",             1, FALSE, TRUE  },
110206917Smarius    { "float128_to_float64",             1, FALSE, TRUE  },
111206917Smarius    { "float128_to_floatx80",            1, FALSE, TRUE  },
112206917Smarius    { "float128_round_to_int",           1, FALSE, TRUE  },
113206917Smarius    { "float128_add",                    2, FALSE, TRUE  },
114206917Smarius    { "float128_sub",                    2, FALSE, TRUE  },
115206917Smarius    { "float128_mul",                    2, FALSE, TRUE  },
116206917Smarius    { "float128_div",                    2, FALSE, TRUE  },
117206917Smarius    { "float128_rem",                    2, FALSE, FALSE },
118206917Smarius    { "float128_sqrt",                   1, FALSE, TRUE  },
119206917Smarius    { "float128_eq",                     2, FALSE, FALSE },
120206917Smarius    { "float128_le",                     2, FALSE, FALSE },
121206917Smarius    { "float128_lt",                     2, FALSE, FALSE },
122206917Smarius    { "float128_eq_signaling",           2, FALSE, FALSE },
123206917Smarius    { "float128_le_quiet",               2, FALSE, FALSE },
124206917Smarius    { "float128_lt_quiet",               2, FALSE, FALSE },
125206917Smarius};
126206917Smarius
127206917Smariusconst flag functionExists[ NUM_FUNCTIONS ] = {
128206917Smarius    0,
129206917Smarius#ifdef SYST_INT32_TO_FLOAT32
130206917Smarius    1,
131206917Smarius#else
132206917Smarius    0,
133206917Smarius#endif
134206917Smarius#ifdef SYST_INT32_TO_FLOAT64
135206917Smarius    1,
136206917Smarius#else
137206917Smarius    0,
138206917Smarius#endif
139206917Smarius#ifdef SYST_INT32_TO_FLOATX80
140206917Smarius    1,
141206917Smarius#else
142206917Smarius    0,
143206917Smarius#endif
144206917Smarius#ifdef SYST_INT32_TO_FLOAT128
145206917Smarius    1,
146206917Smarius#else
147206917Smarius    0,
148206917Smarius#endif
149206917Smarius#ifdef SYST_INT64_TO_FLOAT32
150206917Smarius    1,
151206917Smarius#else
152206917Smarius    0,
153206917Smarius#endif
154206917Smarius#ifdef SYST_INT64_TO_FLOAT64
155206917Smarius    1,
156206917Smarius#else
157206917Smarius    0,
158206917Smarius#endif
159206917Smarius#ifdef SYST_INT64_TO_FLOATX80
160206917Smarius    1,
161206917Smarius#else
162206917Smarius    0,
163206917Smarius#endif
164206917Smarius#ifdef SYST_INT64_TO_FLOAT128
165206917Smarius    1,
166206917Smarius#else
167206917Smarius    0,
168206917Smarius#endif
169206917Smarius#ifdef SYST_FLOAT32_TO_INT32
170206917Smarius    1,
171206917Smarius#else
172206917Smarius    0,
173206917Smarius#endif
174206917Smarius#ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO
175206917Smarius    1,
176206917Smarius#else
177206917Smarius    0,
178206917Smarius#endif
179206917Smarius#ifdef SYST_FLOAT32_TO_INT64
180206917Smarius    1,
181206917Smarius#else
182206917Smarius    0,
183206917Smarius#endif
184206917Smarius#ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO
185206917Smarius    1,
186206917Smarius#else
187206917Smarius    0,
188206917Smarius#endif
189206917Smarius#ifdef SYST_FLOAT32_TO_FLOAT64
190206917Smarius    1,
191206917Smarius#else
192206917Smarius    0,
193206917Smarius#endif
194206917Smarius#ifdef SYST_FLOAT32_TO_FLOATX80
195206917Smarius    1,
196206917Smarius#else
197206917Smarius    0,
198206917Smarius#endif
199206917Smarius#ifdef SYST_FLOAT32_TO_FLOAT128
200206917Smarius    1,
201206917Smarius#else
202206917Smarius    0,
203206917Smarius#endif
204206917Smarius#ifdef SYST_FLOAT32_ROUND_TO_INT
205206917Smarius    1,
206206917Smarius#else
207206917Smarius    0,
208206917Smarius#endif
209206917Smarius#ifdef SYST_FLOAT32_ADD
210206917Smarius    1,
211206917Smarius#else
212206917Smarius    0,
213206917Smarius#endif
214206917Smarius#ifdef SYST_FLOAT32_SUB
215206917Smarius    1,
216206917Smarius#else
217206917Smarius    0,
218206917Smarius#endif
219206917Smarius#ifdef SYST_FLOAT32_MUL
220206917Smarius    1,
221206917Smarius#else
222206917Smarius    0,
223206917Smarius#endif
224206917Smarius#ifdef SYST_FLOAT32_DIV
225206917Smarius    1,
226206917Smarius#else
227206917Smarius    0,
228206917Smarius#endif
229206917Smarius#ifdef SYST_FLOAT32_REM
230206917Smarius    1,
231206917Smarius#else
232206917Smarius    0,
233206917Smarius#endif
234206917Smarius#ifdef SYST_FLOAT32_SQRT
235206917Smarius    1,
236206917Smarius#else
237206917Smarius    0,
238206917Smarius#endif
239206917Smarius#ifdef SYST_FLOAT32_EQ
240206917Smarius    1,
241206917Smarius#else
242206917Smarius    0,
243206917Smarius#endif
244206917Smarius#ifdef SYST_FLOAT32_LE
245206917Smarius    1,
246206917Smarius#else
247206917Smarius    0,
248206917Smarius#endif
249206917Smarius#ifdef SYST_FLOAT32_LT
250206917Smarius    1,
251206917Smarius#else
252206917Smarius    0,
253206917Smarius#endif
254206917Smarius#ifdef SYST_FLOAT32_EQ_SIGNALING
255206917Smarius    1,
256206917Smarius#else
257206917Smarius    0,
258206917Smarius#endif
259206917Smarius#ifdef SYST_FLOAT32_LE_QUIET
260206917Smarius    1,
261206917Smarius#else
262206917Smarius    0,
263206917Smarius#endif
264206917Smarius#ifdef SYST_FLOAT32_LT_QUIET
265206917Smarius    1,
266206917Smarius#else
267206917Smarius    0,
268206917Smarius#endif
269206917Smarius#ifdef SYST_FLOAT64_TO_INT32
270206917Smarius    1,
271206917Smarius#else
272206917Smarius    0,
273206917Smarius#endif
274206917Smarius#ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO
275206917Smarius    1,
276206917Smarius#else
277206917Smarius    0,
278206917Smarius#endif
279206917Smarius#ifdef SYST_FLOAT64_TO_INT64
280206917Smarius    1,
281206917Smarius#else
282206917Smarius    0,
283206917Smarius#endif
284206917Smarius#ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO
285206917Smarius    1,
286206917Smarius#else
287206917Smarius    0,
288206917Smarius#endif
289206917Smarius#ifdef SYST_FLOAT64_TO_FLOAT32
290206917Smarius    1,
291206917Smarius#else
292206917Smarius    0,
293206917Smarius#endif
294206917Smarius#ifdef SYST_FLOAT64_TO_FLOATX80
295206917Smarius    1,
296206917Smarius#else
297206917Smarius    0,
298206917Smarius#endif
299206917Smarius#ifdef SYST_FLOAT64_TO_FLOAT128
300206917Smarius    1,
301206917Smarius#else
302206917Smarius    0,
303206917Smarius#endif
304206917Smarius#ifdef SYST_FLOAT64_ROUND_TO_INT
305206917Smarius    1,
306206917Smarius#else
307206917Smarius    0,
308206917Smarius#endif
309206917Smarius#ifdef SYST_FLOAT64_ADD
310206917Smarius    1,
311206917Smarius#else
312206917Smarius    0,
313206917Smarius#endif
314206917Smarius#ifdef SYST_FLOAT64_SUB
315206917Smarius    1,
316206917Smarius#else
317206917Smarius    0,
318206917Smarius#endif
319206917Smarius#ifdef SYST_FLOAT64_MUL
320206917Smarius    1,
321206917Smarius#else
322206917Smarius    0,
323206917Smarius#endif
324206917Smarius#ifdef SYST_FLOAT64_DIV
325206917Smarius    1,
326206917Smarius#else
327206917Smarius    0,
328206917Smarius#endif
329206917Smarius#ifdef SYST_FLOAT64_REM
330206917Smarius    1,
331206917Smarius#else
332206917Smarius    0,
333206917Smarius#endif
334206917Smarius#ifdef SYST_FLOAT64_SQRT
335206917Smarius    1,
336206917Smarius#else
337206917Smarius    0,
338206917Smarius#endif
339206917Smarius#ifdef SYST_FLOAT64_EQ
340206917Smarius    1,
341206917Smarius#else
342206917Smarius    0,
343206917Smarius#endif
344206917Smarius#ifdef SYST_FLOAT64_LE
345206917Smarius    1,
346206917Smarius#else
347206917Smarius    0,
348206917Smarius#endif
349206917Smarius#ifdef SYST_FLOAT64_LT
350206917Smarius    1,
351206917Smarius#else
352206917Smarius    0,
353206917Smarius#endif
354206917Smarius#ifdef SYST_FLOAT64_EQ_SIGNALING
355206917Smarius    1,
356206917Smarius#else
357206917Smarius    0,
358206917Smarius#endif
359206917Smarius#ifdef SYST_FLOAT64_LE_QUIET
360206917Smarius    1,
361206917Smarius#else
362206917Smarius    0,
363206917Smarius#endif
364206917Smarius#ifdef SYST_FLOAT64_LT_QUIET
365206917Smarius    1,
366206917Smarius#else
367206917Smarius    0,
368206917Smarius#endif
369206917Smarius#ifdef SYST_FLOATX80_TO_INT32
370206917Smarius    1,
371206917Smarius#else
372206917Smarius    0,
373206917Smarius#endif
374206917Smarius#ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO
375206917Smarius    1,
376206917Smarius#else
377206917Smarius    0,
378206917Smarius#endif
379206917Smarius#ifdef SYST_FLOATX80_TO_INT64
380206917Smarius    1,
381206917Smarius#else
382206917Smarius    0,
383206917Smarius#endif
384206917Smarius#ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO
385206917Smarius    1,
386206917Smarius#else
387206917Smarius    0,
388206917Smarius#endif
389206917Smarius#ifdef SYST_FLOATX80_TO_FLOAT32
390206917Smarius    1,
391206917Smarius#else
392206917Smarius    0,
393206917Smarius#endif
394206917Smarius#ifdef SYST_FLOATX80_TO_FLOAT64
395206917Smarius    1,
396206917Smarius#else
397206917Smarius    0,
398206917Smarius#endif
399206917Smarius#ifdef SYST_FLOATX80_TO_FLOAT128
400206917Smarius    1,
401206917Smarius#else
402206917Smarius    0,
403206917Smarius#endif
404206917Smarius#ifdef SYST_FLOATX80_ROUND_TO_INT
405206917Smarius    1,
406206917Smarius#else
407206917Smarius    0,
408206917Smarius#endif
409206917Smarius#ifdef SYST_FLOATX80_ADD
410206917Smarius    1,
411206917Smarius#else
412206917Smarius    0,
413206917Smarius#endif
414206917Smarius#ifdef SYST_FLOATX80_SUB
415206917Smarius    1,
416206917Smarius#else
417206917Smarius    0,
418206917Smarius#endif
419206917Smarius#ifdef SYST_FLOATX80_MUL
420206917Smarius    1,
421206917Smarius#else
422206917Smarius    0,
423206917Smarius#endif
424206917Smarius#ifdef SYST_FLOATX80_DIV
425206917Smarius    1,
426206917Smarius#else
427206917Smarius    0,
428206917Smarius#endif
429206917Smarius#ifdef SYST_FLOATX80_REM
430206917Smarius    1,
431206917Smarius#else
432206917Smarius    0,
433206917Smarius#endif
434206917Smarius#ifdef SYST_FLOATX80_SQRT
435206917Smarius    1,
436206917Smarius#else
437206917Smarius    0,
438206917Smarius#endif
439206917Smarius#ifdef SYST_FLOATX80_EQ
440206917Smarius    1,
441206917Smarius#else
442206917Smarius    0,
443206917Smarius#endif
444206917Smarius#ifdef SYST_FLOATX80_LE
445206917Smarius    1,
446206917Smarius#else
447206917Smarius    0,
448206917Smarius#endif
449206917Smarius#ifdef SYST_FLOATX80_LT
450206917Smarius    1,
451206917Smarius#else
452206917Smarius    0,
453206917Smarius#endif
454206917Smarius#ifdef SYST_FLOATX80_EQ_SIGNALING
455206917Smarius    1,
456206917Smarius#else
457206917Smarius    0,
458206917Smarius#endif
459206917Smarius#ifdef SYST_FLOATX80_LE_QUIET
460206917Smarius    1,
461206917Smarius#else
462206917Smarius    0,
463206917Smarius#endif
464206917Smarius#ifdef SYST_FLOATX80_LT_QUIET
465206917Smarius    1,
466206917Smarius#else
467206917Smarius    0,
468206917Smarius#endif
469206917Smarius#ifdef SYST_FLOAT128_TO_INT32
470206917Smarius    1,
471206917Smarius#else
472206917Smarius    0,
473206917Smarius#endif
474206917Smarius#ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO
475206917Smarius    1,
476206917Smarius#else
477206917Smarius    0,
478206917Smarius#endif
479206917Smarius#ifdef SYST_FLOAT128_TO_INT64
480206917Smarius    1,
481206917Smarius#else
482206917Smarius    0,
483206917Smarius#endif
484206917Smarius#ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO
485206917Smarius    1,
486206917Smarius#else
487206917Smarius    0,
488206917Smarius#endif
489206917Smarius#ifdef SYST_FLOAT128_TO_FLOAT32
490206917Smarius    1,
491206917Smarius#else
492206917Smarius    0,
493206917Smarius#endif
494206917Smarius#ifdef SYST_FLOAT128_TO_FLOAT64
495206917Smarius    1,
496206917Smarius#else
497206917Smarius    0,
498206917Smarius#endif
499206917Smarius#ifdef SYST_FLOAT128_TO_FLOATX80
500206917Smarius    1,
501206917Smarius#else
502206917Smarius    0,
503206917Smarius#endif
504206917Smarius#ifdef SYST_FLOAT128_ROUND_TO_INT
505206917Smarius    1,
506206917Smarius#else
507206917Smarius    0,
508206917Smarius#endif
509206917Smarius#ifdef SYST_FLOAT128_ADD
510206917Smarius    1,
511206917Smarius#else
512206917Smarius    0,
513206917Smarius#endif
514206917Smarius#ifdef SYST_FLOAT128_SUB
515206917Smarius    1,
516206917Smarius#else
517206917Smarius    0,
518206917Smarius#endif
519206917Smarius#ifdef SYST_FLOAT128_MUL
520206917Smarius    1,
521206917Smarius#else
522206917Smarius    0,
523206917Smarius#endif
524206917Smarius#ifdef SYST_FLOAT128_DIV
525206917Smarius    1,
526206917Smarius#else
527206917Smarius    0,
528206917Smarius#endif
529206917Smarius#ifdef SYST_FLOAT128_REM
530206917Smarius    1,
531206917Smarius#else
532206917Smarius    0,
533206917Smarius#endif
534206917Smarius#ifdef SYST_FLOAT128_SQRT
535206917Smarius    1,
536206917Smarius#else
537206917Smarius    0,
538206917Smarius#endif
539206917Smarius#ifdef SYST_FLOAT128_EQ
540206917Smarius    1,
541206917Smarius#else
542206917Smarius    0,
543206917Smarius#endif
544206917Smarius#ifdef SYST_FLOAT128_LE
545206917Smarius    1,
546206917Smarius#else
547206917Smarius    0,
548206917Smarius#endif
549206917Smarius#ifdef SYST_FLOAT128_LT
550206917Smarius    1,
551206917Smarius#else
552206917Smarius    0,
553206917Smarius#endif
554206917Smarius#ifdef SYST_FLOAT128_EQ_SIGNALING
555206917Smarius    1,
556206917Smarius#else
557206917Smarius    0,
558206917Smarius#endif
559206917Smarius#ifdef SYST_FLOAT128_LE_QUIET
560206917Smarius    1,
561206917Smarius#else
562206917Smarius    0,
563206917Smarius#endif
564206917Smarius#ifdef SYST_FLOAT128_LT_QUIET
565206917Smarius    1,
566206917Smarius#else
567206917Smarius    0,
568206917Smarius#endif
569206917Smarius};
570206917Smarius
571206917Smariusstatic void
572206917Smarius testFunctionVariety(
573206917Smarius     uint8 functionCode, int8 roundingPrecision, int8 roundingMode )
574206917Smarius{
575206917Smarius    uint8 roundingCode;
576206917Smarius
577206917Smarius    functionName = functions[ functionCode ].name;
578206917Smarius#ifdef FLOATX80
579206917Smarius    if ( roundingPrecision == 32 ) {
580206917Smarius        roundingPrecisionName = "32";
581206917Smarius    }
582206917Smarius    else if ( roundingPrecision == 64 ) {
583206917Smarius        roundingPrecisionName = "64";
584206917Smarius    }
585206917Smarius    else if ( roundingPrecision == 80 ) {
586206917Smarius        roundingPrecisionName = "80";
587206917Smarius    }
588206917Smarius    else {
589206917Smarius        roundingPrecision = 80;
590206917Smarius        roundingPrecisionName = 0;
591206917Smarius    }
592206917Smarius    floatx80_rounding_precision = roundingPrecision;
593206917Smarius    syst_float_set_rounding_precision( roundingPrecision );
594206917Smarius#endif
595206917Smarius    switch ( roundingMode ) {
596206917Smarius     case 0:
597206917Smarius        roundingModeName = 0;
598206917Smarius        roundingCode = float_round_nearest_even;
599206917Smarius        break;
600206917Smarius     case ROUND_NEAREST_EVEN:
601206917Smarius        roundingModeName = "nearest_even";
602206917Smarius        roundingCode = float_round_nearest_even;
603206917Smarius        break;
604206917Smarius     case ROUND_TO_ZERO:
605206917Smarius        roundingModeName = "to_zero";
606206917Smarius        roundingCode = float_round_to_zero;
607206917Smarius        break;
608206917Smarius     case ROUND_DOWN:
609206917Smarius        roundingModeName = "down";
610206917Smarius        roundingCode = float_round_down;
611206917Smarius        break;
612206917Smarius     case ROUND_UP:
613206917Smarius        roundingModeName = "up";
614206917Smarius        roundingCode = float_round_up;
615206917Smarius        break;
616206917Smarius    }
617206917Smarius    float_rounding_mode = roundingCode;
618206917Smarius    syst_float_set_rounding_mode( roundingCode );
619206917Smarius    fputs( "Testing ", stderr );
620206917Smarius    writeFunctionName( stderr );
621206917Smarius    fputs( ".\n", stderr );
622206917Smarius    switch ( functionCode ) {
623206917Smarius#ifdef SYST_INT32_TO_FLOAT32
624206917Smarius     case INT32_TO_FLOAT32:
625206917Smarius        test_a_int32_z_float32( int32_to_float32, syst_int32_to_float32 );
626206917Smarius        break;
627206917Smarius#endif
628206917Smarius#ifdef SYST_INT32_TO_FLOAT64
629206917Smarius     case INT32_TO_FLOAT64:
630206917Smarius        test_a_int32_z_float64( int32_to_float64, syst_int32_to_float64 );
631206917Smarius        break;
632206917Smarius#endif
633206917Smarius#ifdef SYST_INT32_TO_FLOATX80
634206917Smarius     case INT32_TO_FLOATX80:
635206917Smarius        test_a_int32_z_floatx80( int32_to_floatx80, syst_int32_to_floatx80 );
636206917Smarius        break;
637206917Smarius#endif
638206917Smarius#ifdef SYST_INT32_TO_FLOAT128
639206917Smarius     case INT32_TO_FLOAT128:
640206917Smarius        test_a_int32_z_float128( int32_to_float128, syst_int32_to_float128 );
641206917Smarius        break;
642206917Smarius#endif
643206917Smarius#ifdef SYST_INT64_TO_FLOAT32
644206917Smarius     case INT64_TO_FLOAT32:
645206917Smarius        test_a_int64_z_float32( int64_to_float32, syst_int64_to_float32 );
646206917Smarius        break;
647206917Smarius#endif
648206917Smarius#ifdef SYST_INT64_TO_FLOAT64
649206917Smarius     case INT64_TO_FLOAT64:
650206917Smarius        test_a_int64_z_float64( int64_to_float64, syst_int64_to_float64 );
651206917Smarius        break;
652206917Smarius#endif
653206917Smarius#ifdef SYST_INT64_TO_FLOATX80
654206917Smarius     case INT64_TO_FLOATX80:
655206917Smarius        test_a_int64_z_floatx80( int64_to_floatx80, syst_int64_to_floatx80 );
656206917Smarius        break;
657206917Smarius#endif
658206917Smarius#ifdef SYST_INT64_TO_FLOAT128
659206917Smarius     case INT64_TO_FLOAT128:
660206917Smarius        test_a_int64_z_float128( int64_to_float128, syst_int64_to_float128 );
661206917Smarius        break;
662206917Smarius#endif
663206917Smarius#ifdef SYST_FLOAT32_TO_INT32
664206917Smarius     case FLOAT32_TO_INT32:
665206917Smarius        test_a_float32_z_int32( float32_to_int32, syst_float32_to_int32 );
666206917Smarius        break;
667206917Smarius#endif
668206917Smarius#ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO
669206917Smarius     case FLOAT32_TO_INT32_ROUND_TO_ZERO:
670206917Smarius        test_a_float32_z_int32(
671206917Smarius            float32_to_int32_round_to_zero,
672206917Smarius            syst_float32_to_int32_round_to_zero
673206917Smarius        );
674206917Smarius        break;
675206917Smarius#endif
676206917Smarius#ifdef SYST_FLOAT32_TO_INT64
677206917Smarius     case FLOAT32_TO_INT64:
678206917Smarius        test_a_float32_z_int64( float32_to_int64, syst_float32_to_int64 );
679206917Smarius        break;
680206917Smarius#endif
681206917Smarius#ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO
682206917Smarius     case FLOAT32_TO_INT64_ROUND_TO_ZERO:
683206917Smarius        test_a_float32_z_int64(
684206917Smarius            float32_to_int64_round_to_zero,
685206917Smarius            syst_float32_to_int64_round_to_zero
686206917Smarius        );
687206917Smarius        break;
688206917Smarius#endif
689206917Smarius#ifdef SYST_FLOAT32_TO_FLOAT64
690206917Smarius     case FLOAT32_TO_FLOAT64:
691206917Smarius        test_a_float32_z_float64(
692206917Smarius            float32_to_float64, syst_float32_to_float64 );
693206917Smarius        break;
694206917Smarius#endif
695206917Smarius#ifdef SYST_FLOAT32_TO_FLOATX80
696206917Smarius     case FLOAT32_TO_FLOATX80:
697206917Smarius        test_a_float32_z_floatx80(
698206917Smarius            float32_to_floatx80, syst_float32_to_floatx80 );
699206917Smarius        break;
700206917Smarius#endif
701206917Smarius#ifdef SYST_FLOAT32_TO_FLOAT128
702206917Smarius     case FLOAT32_TO_FLOAT128:
703206917Smarius        test_a_float32_z_float128(
704206917Smarius            float32_to_float128, syst_float32_to_float128 );
705206917Smarius        break;
706206917Smarius#endif
707206917Smarius#ifdef SYST_FLOAT32_ROUND_TO_INT
708206917Smarius     case FLOAT32_ROUND_TO_INT:
709206917Smarius        test_az_float32( float32_round_to_int, syst_float32_round_to_int );
710206917Smarius        break;
711206917Smarius#endif
712206917Smarius#ifdef SYST_FLOAT32_ADD
713206917Smarius     case FLOAT32_ADD:
714206917Smarius        test_abz_float32( float32_add, syst_float32_add );
715206917Smarius        break;
716206917Smarius#endif
717206917Smarius#ifdef SYST_FLOAT32_SUB
718206917Smarius     case FLOAT32_SUB:
719206917Smarius        test_abz_float32( float32_sub, syst_float32_sub );
720206917Smarius        break;
721206917Smarius#endif
722206917Smarius#ifdef SYST_FLOAT32_MUL
723206917Smarius     case FLOAT32_MUL:
724206917Smarius        test_abz_float32( float32_mul, syst_float32_mul );
725206917Smarius        break;
726206917Smarius#endif
727206917Smarius#ifdef SYST_FLOAT32_DIV
728206917Smarius     case FLOAT32_DIV:
729206917Smarius        test_abz_float32( float32_div, syst_float32_div );
730206917Smarius        break;
731206917Smarius#endif
732206917Smarius#ifdef SYST_FLOAT32_REM
733206917Smarius     case FLOAT32_REM:
734206917Smarius        test_abz_float32( float32_rem, syst_float32_rem );
735206917Smarius        break;
736206917Smarius#endif
737206917Smarius#ifdef SYST_FLOAT32_SQRT
738206917Smarius     case FLOAT32_SQRT:
739206917Smarius        test_az_float32( float32_sqrt, syst_float32_sqrt );
740206917Smarius        break;
741206917Smarius#endif
742206917Smarius#ifdef SYST_FLOAT32_EQ
743206917Smarius     case FLOAT32_EQ:
744206917Smarius        test_ab_float32_z_flag( float32_eq, syst_float32_eq );
745206917Smarius        break;
746206917Smarius#endif
747206917Smarius#ifdef SYST_FLOAT32_LE
748206917Smarius     case FLOAT32_LE:
749206917Smarius        test_ab_float32_z_flag( float32_le, syst_float32_le );
750206917Smarius        break;
751206917Smarius#endif
752206917Smarius#ifdef SYST_FLOAT32_LT
753206917Smarius     case FLOAT32_LT:
754206917Smarius        test_ab_float32_z_flag( float32_lt, syst_float32_lt );
755206917Smarius        break;
756206917Smarius#endif
757206917Smarius#ifdef SYST_FLOAT32_EQ_SIGNALING
758206917Smarius     case FLOAT32_EQ_SIGNALING:
759206917Smarius        test_ab_float32_z_flag(
760206917Smarius            float32_eq_signaling, syst_float32_eq_signaling );
761206917Smarius        break;
762206917Smarius#endif
763206917Smarius#ifdef SYST_FLOAT32_LE_QUIET
764206917Smarius     case FLOAT32_LE_QUIET:
765206917Smarius        test_ab_float32_z_flag( float32_le_quiet, syst_float32_le_quiet );
766206917Smarius        break;
767206917Smarius#endif
768206917Smarius#ifdef SYST_FLOAT32_LT_QUIET
769206917Smarius     case FLOAT32_LT_QUIET:
770206917Smarius        test_ab_float32_z_flag( float32_lt_quiet, syst_float32_lt_quiet );
771206917Smarius        break;
772206917Smarius#endif
773206917Smarius#ifdef SYST_FLOAT64_TO_INT32
774206917Smarius     case FLOAT64_TO_INT32:
775206917Smarius        test_a_float64_z_int32( float64_to_int32, syst_float64_to_int32 );
776206917Smarius        break;
777206917Smarius#endif
778206917Smarius#ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO
779206917Smarius     case FLOAT64_TO_INT32_ROUND_TO_ZERO:
780206917Smarius        test_a_float64_z_int32(
781206917Smarius            float64_to_int32_round_to_zero,
782206917Smarius            syst_float64_to_int32_round_to_zero
783206917Smarius        );
784206917Smarius        break;
785206917Smarius#endif
786206917Smarius#ifdef SYST_FLOAT64_TO_INT64
787206917Smarius     case FLOAT64_TO_INT64:
788206917Smarius        test_a_float64_z_int64( float64_to_int64, syst_float64_to_int64 );
789206917Smarius        break;
790206917Smarius#endif
791206917Smarius#ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO
792206917Smarius     case FLOAT64_TO_INT64_ROUND_TO_ZERO:
793206917Smarius        test_a_float64_z_int64(
794206917Smarius            float64_to_int64_round_to_zero,
795206917Smarius            syst_float64_to_int64_round_to_zero
796206917Smarius        );
797206917Smarius        break;
798206917Smarius#endif
799206917Smarius#ifdef SYST_FLOAT64_TO_FLOAT32
800206917Smarius     case FLOAT64_TO_FLOAT32:
801206917Smarius        test_a_float64_z_float32(
802206917Smarius            float64_to_float32, syst_float64_to_float32 );
803206917Smarius        break;
804206917Smarius#endif
805206917Smarius#ifdef SYST_FLOAT64_TO_FLOATX80
806206917Smarius     case FLOAT64_TO_FLOATX80:
807206917Smarius        test_a_float64_z_floatx80(
808206917Smarius            float64_to_floatx80, syst_float64_to_floatx80 );
809206917Smarius        break;
810206917Smarius#endif
811206917Smarius#ifdef SYST_FLOAT64_TO_FLOAT128
812206917Smarius     case FLOAT64_TO_FLOAT128:
813206917Smarius        test_a_float64_z_float128(
814206917Smarius            float64_to_float128, syst_float64_to_float128 );
815206917Smarius        break;
816206917Smarius#endif
817206917Smarius#ifdef SYST_FLOAT64_ROUND_TO_INT
818206917Smarius     case FLOAT64_ROUND_TO_INT:
819206917Smarius        test_az_float64( float64_round_to_int, syst_float64_round_to_int );
820206917Smarius        break;
821206917Smarius#endif
822206917Smarius#ifdef SYST_FLOAT64_ADD
823206917Smarius     case FLOAT64_ADD:
824206917Smarius        test_abz_float64( float64_add, syst_float64_add );
825206917Smarius        break;
826206917Smarius#endif
827206917Smarius#ifdef SYST_FLOAT64_SUB
828206917Smarius     case FLOAT64_SUB:
829206917Smarius        test_abz_float64( float64_sub, syst_float64_sub );
830206917Smarius        break;
831206917Smarius#endif
832206917Smarius#ifdef SYST_FLOAT64_MUL
833206917Smarius     case FLOAT64_MUL:
834206917Smarius        test_abz_float64( float64_mul, syst_float64_mul );
835206917Smarius        break;
836206917Smarius#endif
837206917Smarius#ifdef SYST_FLOAT64_DIV
838206917Smarius     case FLOAT64_DIV:
839206917Smarius        test_abz_float64( float64_div, syst_float64_div );
840206917Smarius        break;
841206917Smarius#endif
842206917Smarius#ifdef SYST_FLOAT64_REM
843206917Smarius     case FLOAT64_REM:
844206917Smarius        test_abz_float64( float64_rem, syst_float64_rem );
845206917Smarius        break;
846206917Smarius#endif
847206917Smarius#ifdef SYST_FLOAT64_SQRT
848206917Smarius     case FLOAT64_SQRT:
849206917Smarius        test_az_float64( float64_sqrt, syst_float64_sqrt );
850206917Smarius        break;
851206917Smarius#endif
852206917Smarius#ifdef SYST_FLOAT64_EQ
853206917Smarius     case FLOAT64_EQ:
854206917Smarius        test_ab_float64_z_flag( float64_eq, syst_float64_eq );
855206917Smarius        break;
856206917Smarius#endif
857206917Smarius#ifdef SYST_FLOAT64_LE
858206917Smarius     case FLOAT64_LE:
859206917Smarius        test_ab_float64_z_flag( float64_le, syst_float64_le );
860206917Smarius        break;
861206917Smarius#endif
862206917Smarius#ifdef SYST_FLOAT64_LT
863206917Smarius     case FLOAT64_LT:
864206917Smarius        test_ab_float64_z_flag( float64_lt, syst_float64_lt );
865206917Smarius        break;
866206917Smarius#endif
867206917Smarius#ifdef SYST_FLOAT64_EQ_SIGNALING
868206917Smarius     case FLOAT64_EQ_SIGNALING:
869206917Smarius        test_ab_float64_z_flag(
870206917Smarius            float64_eq_signaling, syst_float64_eq_signaling );
871206917Smarius        break;
872206917Smarius#endif
873206917Smarius#ifdef SYST_FLOAT64_LE_QUIET
874206917Smarius     case FLOAT64_LE_QUIET:
875206917Smarius        test_ab_float64_z_flag( float64_le_quiet, syst_float64_le_quiet );
876206917Smarius        break;
877206917Smarius#endif
878206917Smarius#ifdef SYST_FLOAT64_LT_QUIET
879206917Smarius     case FLOAT64_LT_QUIET:
880206917Smarius        test_ab_float64_z_flag( float64_lt_quiet, syst_float64_lt_quiet );
881206917Smarius        break;
882206917Smarius#endif
883206917Smarius#ifdef SYST_FLOATX80_TO_INT32
884206917Smarius     case FLOATX80_TO_INT32:
885206917Smarius        test_a_floatx80_z_int32( floatx80_to_int32, syst_floatx80_to_int32 );
886206917Smarius        break;
887206917Smarius#endif
888206917Smarius#ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO
889206917Smarius     case FLOATX80_TO_INT32_ROUND_TO_ZERO:
890206917Smarius        test_a_floatx80_z_int32(
891206917Smarius            floatx80_to_int32_round_to_zero,
892206917Smarius            syst_floatx80_to_int32_round_to_zero
893206917Smarius        );
894206917Smarius        break;
895206917Smarius#endif
896206917Smarius#ifdef SYST_FLOATX80_TO_INT64
897206917Smarius     case FLOATX80_TO_INT64:
898206917Smarius        test_a_floatx80_z_int64( floatx80_to_int64, syst_floatx80_to_int64 );
899206917Smarius        break;
900206917Smarius#endif
901206917Smarius#ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO
902206917Smarius     case FLOATX80_TO_INT64_ROUND_TO_ZERO:
903206917Smarius        test_a_floatx80_z_int64(
904206917Smarius            floatx80_to_int64_round_to_zero,
905206917Smarius            syst_floatx80_to_int64_round_to_zero
906206917Smarius        );
907206917Smarius        break;
908206917Smarius#endif
909206917Smarius#ifdef SYST_FLOATX80_TO_FLOAT32
910206917Smarius     case FLOATX80_TO_FLOAT32:
911206917Smarius        test_a_floatx80_z_float32(
912206917Smarius            floatx80_to_float32, syst_floatx80_to_float32 );
913206917Smarius        break;
914206917Smarius#endif
915206917Smarius#ifdef SYST_FLOATX80_TO_FLOAT64
916206917Smarius     case FLOATX80_TO_FLOAT64:
917206917Smarius        test_a_floatx80_z_float64(
918206917Smarius            floatx80_to_float64, syst_floatx80_to_float64 );
919206917Smarius        break;
920206917Smarius#endif
921206917Smarius#ifdef SYST_FLOATX80_TO_FLOAT128
922206917Smarius     case FLOATX80_TO_FLOAT128:
923206917Smarius        test_a_floatx80_z_float128(
924206917Smarius            floatx80_to_float128, syst_floatx80_to_float128 );
925206917Smarius        break;
926206917Smarius#endif
927206917Smarius#ifdef SYST_FLOATX80_ROUND_TO_INT
928206917Smarius     case FLOATX80_ROUND_TO_INT:
929206917Smarius        test_az_floatx80( floatx80_round_to_int, syst_floatx80_round_to_int );
930206917Smarius        break;
931206917Smarius#endif
932206917Smarius#ifdef SYST_FLOATX80_ADD
933206917Smarius     case FLOATX80_ADD:
934206917Smarius        test_abz_floatx80( floatx80_add, syst_floatx80_add );
935206917Smarius        break;
936206917Smarius#endif
937206917Smarius#ifdef SYST_FLOATX80_SUB
938206917Smarius     case FLOATX80_SUB:
939206917Smarius        test_abz_floatx80( floatx80_sub, syst_floatx80_sub );
940206917Smarius        break;
941206917Smarius#endif
942206917Smarius#ifdef SYST_FLOATX80_MUL
943206917Smarius     case FLOATX80_MUL:
944206917Smarius        test_abz_floatx80( floatx80_mul, syst_floatx80_mul );
945206917Smarius        break;
946206917Smarius#endif
947206917Smarius#ifdef SYST_FLOATX80_DIV
948206917Smarius     case FLOATX80_DIV:
949206917Smarius        test_abz_floatx80( floatx80_div, syst_floatx80_div );
950206917Smarius        break;
951206917Smarius#endif
952206917Smarius#ifdef SYST_FLOATX80_REM
953206917Smarius     case FLOATX80_REM:
954206917Smarius        test_abz_floatx80( floatx80_rem, syst_floatx80_rem );
955206917Smarius        break;
956206917Smarius#endif
957206917Smarius#ifdef SYST_FLOATX80_SQRT
958206917Smarius     case FLOATX80_SQRT:
959206917Smarius        test_az_floatx80( floatx80_sqrt, syst_floatx80_sqrt );
960206917Smarius        break;
961206917Smarius#endif
962206917Smarius#ifdef SYST_FLOATX80_EQ
963206917Smarius     case FLOATX80_EQ:
964206917Smarius        test_ab_floatx80_z_flag( floatx80_eq, syst_floatx80_eq );
965206917Smarius        break;
966206917Smarius#endif
967206917Smarius#ifdef SYST_FLOATX80_LE
968206917Smarius     case FLOATX80_LE:
969206917Smarius        test_ab_floatx80_z_flag( floatx80_le, syst_floatx80_le );
970206917Smarius        break;
971206917Smarius#endif
972206917Smarius#ifdef SYST_FLOATX80_LT
973206917Smarius     case FLOATX80_LT:
974206917Smarius        test_ab_floatx80_z_flag( floatx80_lt, syst_floatx80_lt );
975206917Smarius        break;
976206917Smarius#endif
977206917Smarius#ifdef SYST_FLOATX80_EQ_SIGNALING
978206917Smarius     case FLOATX80_EQ_SIGNALING:
979206917Smarius        test_ab_floatx80_z_flag(
980206917Smarius            floatx80_eq_signaling, syst_floatx80_eq_signaling );
981206917Smarius        break;
982206917Smarius#endif
983206917Smarius#ifdef SYST_FLOATX80_LE_QUIET
984206917Smarius     case FLOATX80_LE_QUIET:
985206917Smarius        test_ab_floatx80_z_flag( floatx80_le_quiet, syst_floatx80_le_quiet );
986206917Smarius        break;
987206917Smarius#endif
988206917Smarius#ifdef SYST_FLOATX80_LT_QUIET
989206917Smarius     case FLOATX80_LT_QUIET:
990206917Smarius        test_ab_floatx80_z_flag( floatx80_lt_quiet, syst_floatx80_lt_quiet );
991206917Smarius        break;
992206917Smarius#endif
993206917Smarius#ifdef SYST_FLOAT128_TO_INT32
994206917Smarius     case FLOAT128_TO_INT32:
995206917Smarius        test_a_float128_z_int32( float128_to_int32, syst_float128_to_int32 );
996206917Smarius        break;
997206917Smarius#endif
998206917Smarius#ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO
999206917Smarius     case FLOAT128_TO_INT32_ROUND_TO_ZERO:
1000206917Smarius        test_a_float128_z_int32(
1001206917Smarius            float128_to_int32_round_to_zero,
1002206917Smarius            syst_float128_to_int32_round_to_zero
1003206917Smarius        );
1004206917Smarius        break;
1005206917Smarius#endif
1006206917Smarius#ifdef SYST_FLOAT128_TO_INT64
1007206917Smarius     case FLOAT128_TO_INT64:
1008206917Smarius        test_a_float128_z_int64( float128_to_int64, syst_float128_to_int64 );
1009206917Smarius        break;
1010206917Smarius#endif
1011206917Smarius#ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO
1012206917Smarius     case FLOAT128_TO_INT64_ROUND_TO_ZERO:
1013206917Smarius        test_a_float128_z_int64(
1014206917Smarius            float128_to_int64_round_to_zero,
1015206917Smarius            syst_float128_to_int64_round_to_zero
1016206917Smarius        );
1017206917Smarius        break;
1018206917Smarius#endif
1019206917Smarius#ifdef SYST_FLOAT128_TO_FLOAT32
1020206917Smarius     case FLOAT128_TO_FLOAT32:
1021206917Smarius        test_a_float128_z_float32(
1022206917Smarius            float128_to_float32, syst_float128_to_float32 );
1023206917Smarius        break;
1024206917Smarius#endif
1025206917Smarius#ifdef SYST_FLOAT128_TO_FLOAT64
1026206917Smarius     case FLOAT128_TO_FLOAT64:
1027206917Smarius        test_a_float128_z_float64(
1028206917Smarius            float128_to_float64, syst_float128_to_float64 );
1029206917Smarius        break;
1030206917Smarius#endif
1031206917Smarius#ifdef SYST_FLOAT128_TO_FLOATX80
1032206917Smarius     case FLOAT128_TO_FLOATX80:
1033206917Smarius        test_a_float128_z_floatx80(
1034206917Smarius            float128_to_floatx80, syst_float128_to_floatx80 );
1035206917Smarius        break;
1036206917Smarius#endif
1037206917Smarius#ifdef SYST_FLOAT128_ROUND_TO_INT
1038206917Smarius     case FLOAT128_ROUND_TO_INT:
1039206917Smarius        test_az_float128( float128_round_to_int, syst_float128_round_to_int );
1040206917Smarius        break;
1041206917Smarius#endif
1042206917Smarius#ifdef SYST_FLOAT128_ADD
1043206917Smarius     case FLOAT128_ADD:
1044206917Smarius        test_abz_float128( float128_add, syst_float128_add );
1045206917Smarius        break;
1046206917Smarius#endif
1047206917Smarius#ifdef SYST_FLOAT128_SUB
1048206917Smarius     case FLOAT128_SUB:
1049206917Smarius        test_abz_float128( float128_sub, syst_float128_sub );
1050206917Smarius        break;
1051206917Smarius#endif
1052206917Smarius#ifdef SYST_FLOAT128_MUL
1053206917Smarius     case FLOAT128_MUL:
1054206917Smarius        test_abz_float128( float128_mul, syst_float128_mul );
1055206917Smarius        break;
1056206917Smarius#endif
1057206917Smarius#ifdef SYST_FLOAT128_DIV
1058206917Smarius     case FLOAT128_DIV:
1059206917Smarius        test_abz_float128( float128_div, syst_float128_div );
1060206917Smarius        break;
1061206917Smarius#endif
1062206917Smarius#ifdef SYST_FLOAT128_REM
1063206917Smarius     case FLOAT128_REM:
1064206917Smarius        test_abz_float128( float128_rem, syst_float128_rem );
1065206917Smarius        break;
1066206917Smarius#endif
1067206917Smarius#ifdef SYST_FLOAT128_SQRT
1068206917Smarius     case FLOAT128_SQRT:
1069206917Smarius        test_az_float128( float128_sqrt, syst_float128_sqrt );
1070206917Smarius        break;
1071206917Smarius#endif
1072206917Smarius#ifdef SYST_FLOAT128_EQ
1073206917Smarius     case FLOAT128_EQ:
1074206917Smarius        test_ab_float128_z_flag( float128_eq, syst_float128_eq );
1075206917Smarius        break;
1076206917Smarius#endif
1077206917Smarius#ifdef SYST_FLOAT128_LE
1078206917Smarius     case FLOAT128_LE:
1079206917Smarius        test_ab_float128_z_flag( float128_le, syst_float128_le );
1080206917Smarius        break;
1081206917Smarius#endif
1082206917Smarius#ifdef SYST_FLOAT128_LT
1083206917Smarius     case FLOAT128_LT:
1084206917Smarius        test_ab_float128_z_flag( float128_lt, syst_float128_lt );
1085206917Smarius        break;
1086206917Smarius#endif
1087206917Smarius#ifdef SYST_FLOAT128_EQ_SIGNALING
1088206917Smarius     case FLOAT128_EQ_SIGNALING:
1089206917Smarius        test_ab_float128_z_flag(
1090206917Smarius            float128_eq_signaling, syst_float128_eq_signaling );
1091206917Smarius        break;
1092206917Smarius#endif
1093206917Smarius#ifdef SYST_FLOAT128_LE_QUIET
1094206917Smarius     case FLOAT128_LE_QUIET:
1095206917Smarius        test_ab_float128_z_flag( float128_le_quiet, syst_float128_le_quiet );
1096206917Smarius        break;
1097206917Smarius#endif
1098206917Smarius#ifdef SYST_FLOAT128_LT_QUIET
1099206917Smarius     case FLOAT128_LT_QUIET:
1100206917Smarius        test_ab_float128_z_flag( float128_lt_quiet, syst_float128_lt_quiet );
1101206917Smarius        break;
1102206917Smarius#endif
1103206917Smarius    }
1104206917Smarius    if ( ( errorStop && anyErrors ) || stop ) exitWithStatus();
1105206917Smarius
1106206917Smarius}
1107206917Smarius
1108206917Smariusvoid
1109206917Smarius testFunction(
1110206917Smarius     uint8 functionCode, int8 roundingPrecisionIn, int8 roundingModeIn )
1111206917Smarius{
1112206917Smarius    int8 roundingPrecision, roundingMode;
1113206917Smarius
1114206917Smarius    roundingPrecision = 32;
1115206917Smarius    for (;;) {
1116206917Smarius        if ( ! functions[ functionCode ].roundingPrecision ) {
1117206917Smarius            roundingPrecision = 0;
1118206917Smarius        }
1119206917Smarius        else if ( roundingPrecisionIn ) {
1120206917Smarius            roundingPrecision = roundingPrecisionIn;
1121206917Smarius        }
1122206917Smarius        for ( roundingMode = 1;
1123206917Smarius              roundingMode < NUM_ROUNDINGMODES;
1124206917Smarius              ++roundingMode
1125206917Smarius            ) {
1126206917Smarius            if ( ! functions[ functionCode ].roundingMode ) {
1127206917Smarius                roundingMode = 0;
1128206917Smarius            }
1129206917Smarius            else if ( roundingModeIn ) {
1130206917Smarius                roundingMode = roundingModeIn;
1131206917Smarius            }
1132206917Smarius            testFunctionVariety(
1133206917Smarius                functionCode, roundingPrecision, roundingMode );
1134206917Smarius            if ( roundingModeIn || ! roundingMode ) break;
1135206917Smarius        }
1136206917Smarius        if ( roundingPrecisionIn || ! roundingPrecision ) break;
1137206917Smarius        if ( roundingPrecision == 80 ) {
1138206917Smarius            break;
1139206917Smarius        }
1140206917Smarius        else if ( roundingPrecision == 64 ) {
1141206917Smarius            roundingPrecision = 80;
1142206917Smarius        }
1143206917Smarius        else if ( roundingPrecision == 32 ) {
1144206917Smarius            roundingPrecision = 64;
1145206917Smarius        }
1146206917Smarius    }
1147206917Smarius
1148206917Smarius}
1149206917Smarius
1150