testFunction.c revision 206917
1178825Sdfr
2233294Sstas/*
3233294Sstas===============================================================================
4233294Sstas
5178825SdfrThis C source file is part of TestFloat, Release 2a, a package of programs
6233294Sstasfor testing the correctness of floating-point arithmetic complying to the
7233294SstasIEC/IEEE Standard for Floating-Point.
8233294Sstas
9178825SdfrWritten by John R. Hauser.  More information is available through the Web
10233294Sstaspage `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
11233294Sstas
12178825SdfrTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
13233294Sstashas been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
14233294SstasTIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
15233294SstasPERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
16178825SdfrAND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
17233294Sstas
18233294SstasDerivative works are acceptable, even for commercial purposes, so long as
19233294Sstas(1) they include prominent notice that the work is derivative, and (2) they
20178825Sdfrinclude prominent notice akin to these four paragraphs for those parts of
21233294Sstasthis code that are retained.
22233294Sstas
23233294Sstas===============================================================================
24233294Sstas*/
25233294Sstas
26233294Sstas#include "milieu.h"
27233294Sstas#include "softfloat.h"
28233294Sstas#include "testCases.h"
29233294Sstas#include "testLoops.h"
30233294Sstas#include "systmodes.h"
31233294Sstas#include "systflags.h"
32178825Sdfr#include "systfloat.h"
33178825Sdfr#include "testFunction.h"
34178825Sdfr
35178825Sdfrconst functionT functions[ NUM_FUNCTIONS ] = {
36178825Sdfr    { 0, 0, 0, 0 },
37178825Sdfr    { "int32_to_float32",                1, FALSE, TRUE  },
38178825Sdfr    { "int32_to_float64",                1, FALSE, FALSE },
39178825Sdfr    { "int32_to_floatx80",               1, FALSE, FALSE },
40233294Sstas    { "int32_to_float128",               1, FALSE, FALSE },
41178825Sdfr    { "int64_to_float32",                1, FALSE, TRUE  },
42178825Sdfr    { "int64_to_float64",                1, FALSE, TRUE  },
43178825Sdfr    { "int64_to_floatx80",               1, FALSE, FALSE },
44178825Sdfr    { "int64_to_float128",               1, FALSE, FALSE },
45233294Sstas    { "float32_to_int32",                1, FALSE, TRUE  },
46178825Sdfr    { "float32_to_int32_round_to_zero",  1, FALSE, FALSE },
47178825Sdfr    { "float32_to_int64",                1, FALSE, TRUE  },
48178825Sdfr    { "float32_to_int64_round_to_zero",  1, FALSE, FALSE },
49178825Sdfr    { "float32_to_float64",              1, FALSE, FALSE },
50233294Sstas    { "float32_to_floatx80",             1, FALSE, FALSE },
51178825Sdfr    { "float32_to_float128",             1, FALSE, FALSE },
52178825Sdfr    { "float32_round_to_int",            1, FALSE, TRUE  },
53178825Sdfr    { "float32_add",                     2, FALSE, TRUE  },
54233294Sstas    { "float32_sub",                     2, FALSE, TRUE  },
55233294Sstas    { "float32_mul",                     2, FALSE, TRUE  },
56233294Sstas    { "float32_div",                     2, FALSE, TRUE  },
57178825Sdfr    { "float32_rem",                     2, FALSE, FALSE },
58178825Sdfr    { "float32_sqrt",                    1, FALSE, TRUE  },
59178825Sdfr    { "float32_eq",                      2, FALSE, FALSE },
60178825Sdfr    { "float32_le",                      2, FALSE, FALSE },
61178825Sdfr    { "float32_lt",                      2, FALSE, FALSE },
62178825Sdfr    { "float32_eq_signaling",            2, FALSE, FALSE },
63178825Sdfr    { "float32_le_quiet",                2, FALSE, FALSE },
64178825Sdfr    { "float32_lt_quiet",                2, FALSE, FALSE },
65178825Sdfr    { "float64_to_int32",                1, FALSE, TRUE  },
66233294Sstas    { "float64_to_int32_round_to_zero",  1, FALSE, FALSE },
67178825Sdfr    { "float64_to_int64",                1, FALSE, TRUE  },
68178825Sdfr    { "float64_to_int64_round_to_zero",  1, FALSE, FALSE },
69178825Sdfr    { "float64_to_float32",              1, FALSE, TRUE  },
70178825Sdfr    { "float64_to_floatx80",             1, FALSE, FALSE },
71178825Sdfr    { "float64_to_float128",             1, FALSE, FALSE },
72233294Sstas    { "float64_round_to_int",            1, FALSE, TRUE  },
73178825Sdfr    { "float64_add",                     2, FALSE, TRUE  },
74178825Sdfr    { "float64_sub",                     2, FALSE, TRUE  },
75178825Sdfr    { "float64_mul",                     2, FALSE, TRUE  },
76178825Sdfr    { "float64_div",                     2, FALSE, TRUE  },
77178825Sdfr    { "float64_rem",                     2, FALSE, FALSE },
78178825Sdfr    { "float64_sqrt",                    1, FALSE, TRUE  },
79178825Sdfr    { "float64_eq",                      2, FALSE, FALSE },
80178825Sdfr    { "float64_le",                      2, FALSE, FALSE },
81178825Sdfr    { "float64_lt",                      2, FALSE, FALSE },
82178825Sdfr    { "float64_eq_signaling",            2, FALSE, FALSE },
83178825Sdfr    { "float64_le_quiet",                2, FALSE, FALSE },
84233294Sstas    { "float64_lt_quiet",                2, FALSE, FALSE },
85233294Sstas    { "floatx80_to_int32",               1, FALSE, TRUE  },
86178825Sdfr    { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE },
87178825Sdfr    { "floatx80_to_int64",               1, FALSE, TRUE  },
88178825Sdfr    { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE },
89178825Sdfr    { "floatx80_to_float32",             1, FALSE, TRUE  },
90178825Sdfr    { "floatx80_to_float64",             1, FALSE, TRUE  },
91178825Sdfr    { "floatx80_to_float128",            1, FALSE, FALSE },
92178825Sdfr    { "floatx80_round_to_int",           1, FALSE, TRUE  },
93178825Sdfr    { "floatx80_add",                    2, TRUE,  TRUE  },
94178825Sdfr    { "floatx80_sub",                    2, TRUE,  TRUE  },
95178825Sdfr    { "floatx80_mul",                    2, TRUE,  TRUE  },
96178825Sdfr    { "floatx80_div",                    2, TRUE,  TRUE  },
97233294Sstas    { "floatx80_rem",                    2, FALSE, FALSE },
98178825Sdfr    { "floatx80_sqrt",                   1, TRUE,  TRUE  },
99178825Sdfr    { "floatx80_eq",                     2, FALSE, FALSE },
100178825Sdfr    { "floatx80_le",                     2, FALSE, FALSE },
101178825Sdfr    { "floatx80_lt",                     2, FALSE, FALSE },
102178825Sdfr    { "floatx80_eq_signaling",           2, FALSE, FALSE },
103233294Sstas    { "floatx80_le_quiet",               2, FALSE, FALSE },
104178825Sdfr    { "floatx80_lt_quiet",               2, FALSE, FALSE },
105178825Sdfr    { "float128_to_int32",               1, FALSE, TRUE  },
106178825Sdfr    { "float128_to_int32_round_to_zero", 1, FALSE, FALSE },
107178825Sdfr    { "float128_to_int64",               1, FALSE, TRUE  },
108178825Sdfr    { "float128_to_int64_round_to_zero", 1, FALSE, FALSE },
109178825Sdfr    { "float128_to_float32",             1, FALSE, TRUE  },
110178825Sdfr    { "float128_to_float64",             1, FALSE, TRUE  },
111178825Sdfr    { "float128_to_floatx80",            1, FALSE, TRUE  },
112178825Sdfr    { "float128_round_to_int",           1, FALSE, TRUE  },
113178825Sdfr    { "float128_add",                    2, FALSE, TRUE  },
114178825Sdfr    { "float128_sub",                    2, FALSE, TRUE  },
115233294Sstas    { "float128_mul",                    2, FALSE, TRUE  },
116178825Sdfr    { "float128_div",                    2, FALSE, TRUE  },
117178825Sdfr    { "float128_rem",                    2, FALSE, FALSE },
118178825Sdfr    { "float128_sqrt",                   1, FALSE, TRUE  },
119178825Sdfr    { "float128_eq",                     2, FALSE, FALSE },
120178825Sdfr    { "float128_le",                     2, FALSE, FALSE },
121178825Sdfr    { "float128_lt",                     2, FALSE, FALSE },
122233294Sstas    { "float128_eq_signaling",           2, FALSE, FALSE },
123233294Sstas    { "float128_le_quiet",               2, FALSE, FALSE },
124178825Sdfr    { "float128_lt_quiet",               2, FALSE, FALSE },
125178825Sdfr};
126178825Sdfr
127178825Sdfrconst flag functionExists[ NUM_FUNCTIONS ] = {
128178825Sdfr    0,
129178825Sdfr#ifdef SYST_INT32_TO_FLOAT32
130178825Sdfr    1,
131178825Sdfr#else
132178825Sdfr    0,
133178825Sdfr#endif
134178825Sdfr#ifdef SYST_INT32_TO_FLOAT64
135178825Sdfr    1,
136178825Sdfr#else
137178825Sdfr    0,
138233294Sstas#endif
139233294Sstas#ifdef SYST_INT32_TO_FLOATX80
140178825Sdfr    1,
141178825Sdfr#else
142178825Sdfr    0,
143178825Sdfr#endif
144178825Sdfr#ifdef SYST_INT32_TO_FLOAT128
145178825Sdfr    1,
146178825Sdfr#else
147178825Sdfr    0,
148178825Sdfr#endif
149178825Sdfr#ifdef SYST_INT64_TO_FLOAT32
150178825Sdfr    1,
151178825Sdfr#else
152178825Sdfr    0,
153178825Sdfr#endif
154178825Sdfr#ifdef SYST_INT64_TO_FLOAT64
155233294Sstas    1,
156233294Sstas#else
157178825Sdfr    0,
158178825Sdfr#endif
159178825Sdfr#ifdef SYST_INT64_TO_FLOATX80
160233294Sstas    1,
161178825Sdfr#else
162178825Sdfr    0,
163233294Sstas#endif
164178825Sdfr#ifdef SYST_INT64_TO_FLOAT128
165178825Sdfr    1,
166178825Sdfr#else
167178825Sdfr    0,
168178825Sdfr#endif
169178825Sdfr#ifdef SYST_FLOAT32_TO_INT32
170178825Sdfr    1,
171178825Sdfr#else
172178825Sdfr    0,
173233294Sstas#endif
174178825Sdfr#ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO
175178825Sdfr    1,
176178825Sdfr#else
177178825Sdfr    0,
178178825Sdfr#endif
179233294Sstas#ifdef SYST_FLOAT32_TO_INT64
180233294Sstas    1,
181178825Sdfr#else
182178825Sdfr    0,
183233294Sstas#endif
184178825Sdfr#ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO
185178825Sdfr    1,
186178825Sdfr#else
187178825Sdfr    0,
188178825Sdfr#endif
189233294Sstas#ifdef SYST_FLOAT32_TO_FLOAT64
190178825Sdfr    1,
191178825Sdfr#else
192178825Sdfr    0,
193178825Sdfr#endif
194178825Sdfr#ifdef SYST_FLOAT32_TO_FLOATX80
195178825Sdfr    1,
196178825Sdfr#else
197178825Sdfr    0,
198178825Sdfr#endif
199178825Sdfr#ifdef SYST_FLOAT32_TO_FLOAT128
200178825Sdfr    1,
201178825Sdfr#else
202178825Sdfr    0,
203178825Sdfr#endif
204178825Sdfr#ifdef SYST_FLOAT32_ROUND_TO_INT
205178825Sdfr    1,
206178825Sdfr#else
207178825Sdfr    0,
208178825Sdfr#endif
209178825Sdfr#ifdef SYST_FLOAT32_ADD
210178825Sdfr    1,
211178825Sdfr#else
212178825Sdfr    0,
213178825Sdfr#endif
214178825Sdfr#ifdef SYST_FLOAT32_SUB
215178825Sdfr    1,
216178825Sdfr#else
217178825Sdfr    0,
218178825Sdfr#endif
219178825Sdfr#ifdef SYST_FLOAT32_MUL
220178825Sdfr    1,
221178825Sdfr#else
222178825Sdfr    0,
223178825Sdfr#endif
224178825Sdfr#ifdef SYST_FLOAT32_DIV
225178825Sdfr    1,
226178825Sdfr#else
227178825Sdfr    0,
228178825Sdfr#endif
229178825Sdfr#ifdef SYST_FLOAT32_REM
230178825Sdfr    1,
231178825Sdfr#else
232178825Sdfr    0,
233178825Sdfr#endif
234178825Sdfr#ifdef SYST_FLOAT32_SQRT
235178825Sdfr    1,
236233294Sstas#else
237233294Sstas    0,
238233294Sstas#endif
239233294Sstas#ifdef SYST_FLOAT32_EQ
240233294Sstas    1,
241233294Sstas#else
242233294Sstas    0,
243233294Sstas#endif
244233294Sstas#ifdef SYST_FLOAT32_LE
245233294Sstas    1,
246233294Sstas#else
247233294Sstas    0,
248233294Sstas#endif
249233294Sstas#ifdef SYST_FLOAT32_LT
250178825Sdfr    1,
251178825Sdfr#else
252178825Sdfr    0,
253178825Sdfr#endif
254178825Sdfr#ifdef SYST_FLOAT32_EQ_SIGNALING
255178825Sdfr    1,
256178825Sdfr#else
257178825Sdfr    0,
258178825Sdfr#endif
259178825Sdfr#ifdef SYST_FLOAT32_LE_QUIET
260178825Sdfr    1,
261178825Sdfr#else
262178825Sdfr    0,
263178825Sdfr#endif
264233294Sstas#ifdef SYST_FLOAT32_LT_QUIET
265178825Sdfr    1,
266178825Sdfr#else
267178825Sdfr    0,
268178825Sdfr#endif
269178825Sdfr#ifdef SYST_FLOAT64_TO_INT32
270178825Sdfr    1,
271178825Sdfr#else
272178825Sdfr    0,
273178825Sdfr#endif
274178825Sdfr#ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO
275178825Sdfr    1,
276178825Sdfr#else
277178825Sdfr    0,
278178825Sdfr#endif
279178825Sdfr#ifdef SYST_FLOAT64_TO_INT64
280233294Sstas    1,
281178825Sdfr#else
282178825Sdfr    0,
283178825Sdfr#endif
284178825Sdfr#ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO
285178825Sdfr    1,
286178825Sdfr#else
287178825Sdfr    0,
288178825Sdfr#endif
289233294Sstas#ifdef SYST_FLOAT64_TO_FLOAT32
290178825Sdfr    1,
291178825Sdfr#else
292178825Sdfr    0,
293178825Sdfr#endif
294178825Sdfr#ifdef SYST_FLOAT64_TO_FLOATX80
295233294Sstas    1,
296178825Sdfr#else
297178825Sdfr    0,
298178825Sdfr#endif
299233294Sstas#ifdef SYST_FLOAT64_TO_FLOAT128
300233294Sstas    1,
301233294Sstas#else
302178825Sdfr    0,
303178825Sdfr#endif
304178825Sdfr#ifdef SYST_FLOAT64_ROUND_TO_INT
305178825Sdfr    1,
306178825Sdfr#else
307178825Sdfr    0,
308178825Sdfr#endif
309178825Sdfr#ifdef SYST_FLOAT64_ADD
310178825Sdfr    1,
311178825Sdfr#else
312178825Sdfr    0,
313233294Sstas#endif
314178825Sdfr#ifdef SYST_FLOAT64_SUB
315178825Sdfr    1,
316178825Sdfr#else
317233294Sstas    0,
318233294Sstas#endif
319233294Sstas#ifdef SYST_FLOAT64_MUL
320178825Sdfr    1,
321178825Sdfr#else
322178825Sdfr    0,
323233294Sstas#endif
324178825Sdfr#ifdef SYST_FLOAT64_DIV
325178825Sdfr    1,
326178825Sdfr#else
327233294Sstas    0,
328178825Sdfr#endif
329178825Sdfr#ifdef SYST_FLOAT64_REM
330178825Sdfr    1,
331178825Sdfr#else
332178825Sdfr    0,
333178825Sdfr#endif
334178825Sdfr#ifdef SYST_FLOAT64_SQRT
335233294Sstas    1,
336233294Sstas#else
337178825Sdfr    0,
338233294Sstas#endif
339233294Sstas#ifdef SYST_FLOAT64_EQ
340178825Sdfr    1,
341178825Sdfr#else
342178825Sdfr    0,
343178825Sdfr#endif
344178825Sdfr#ifdef SYST_FLOAT64_LE
345233294Sstas    1,
346178825Sdfr#else
347178825Sdfr    0,
348178825Sdfr#endif
349178825Sdfr#ifdef SYST_FLOAT64_LT
350178825Sdfr    1,
351178825Sdfr#else
352178825Sdfr    0,
353178825Sdfr#endif
354178825Sdfr#ifdef SYST_FLOAT64_EQ_SIGNALING
355178825Sdfr    1,
356178825Sdfr#else
357178825Sdfr    0,
358178825Sdfr#endif
359233294Sstas#ifdef SYST_FLOAT64_LE_QUIET
360233294Sstas    1,
361233294Sstas#else
362178825Sdfr    0,
363178825Sdfr#endif
364178825Sdfr#ifdef SYST_FLOAT64_LT_QUIET
365178825Sdfr    1,
366233294Sstas#else
367178825Sdfr    0,
368178825Sdfr#endif
369178825Sdfr#ifdef SYST_FLOATX80_TO_INT32
370178825Sdfr    1,
371233294Sstas#else
372178825Sdfr    0,
373178825Sdfr#endif
374178825Sdfr#ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO
375233294Sstas    1,
376178825Sdfr#else
377178825Sdfr    0,
378178825Sdfr#endif
379178825Sdfr#ifdef SYST_FLOATX80_TO_INT64
380178825Sdfr    1,
381178825Sdfr#else
382178825Sdfr    0,
383233294Sstas#endif
384178825Sdfr#ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO
385178825Sdfr    1,
386233294Sstas#else
387178825Sdfr    0,
388178825Sdfr#endif
389178825Sdfr#ifdef SYST_FLOATX80_TO_FLOAT32
390178825Sdfr    1,
391178825Sdfr#else
392178825Sdfr    0,
393178825Sdfr#endif
394178825Sdfr#ifdef SYST_FLOATX80_TO_FLOAT64
395178825Sdfr    1,
396178825Sdfr#else
397178825Sdfr    0,
398178825Sdfr#endif
399178825Sdfr#ifdef SYST_FLOATX80_TO_FLOAT128
400178825Sdfr    1,
401178825Sdfr#else
402233294Sstas    0,
403178825Sdfr#endif
404178825Sdfr#ifdef SYST_FLOATX80_ROUND_TO_INT
405178825Sdfr    1,
406178825Sdfr#else
407233294Sstas    0,
408178825Sdfr#endif
409178825Sdfr#ifdef SYST_FLOATX80_ADD
410178825Sdfr    1,
411178825Sdfr#else
412233294Sstas    0,
413178825Sdfr#endif
414178825Sdfr#ifdef SYST_FLOATX80_SUB
415178825Sdfr    1,
416178825Sdfr#else
417178825Sdfr    0,
418178825Sdfr#endif
419178825Sdfr#ifdef SYST_FLOATX80_MUL
420178825Sdfr    1,
421178825Sdfr#else
422178825Sdfr    0,
423178825Sdfr#endif
424178825Sdfr#ifdef SYST_FLOATX80_DIV
425178825Sdfr    1,
426178825Sdfr#else
427178825Sdfr    0,
428178825Sdfr#endif
429178825Sdfr#ifdef SYST_FLOATX80_REM
430178825Sdfr    1,
431178825Sdfr#else
432178825Sdfr    0,
433178825Sdfr#endif
434178825Sdfr#ifdef SYST_FLOATX80_SQRT
435    1,
436#else
437    0,
438#endif
439#ifdef SYST_FLOATX80_EQ
440    1,
441#else
442    0,
443#endif
444#ifdef SYST_FLOATX80_LE
445    1,
446#else
447    0,
448#endif
449#ifdef SYST_FLOATX80_LT
450    1,
451#else
452    0,
453#endif
454#ifdef SYST_FLOATX80_EQ_SIGNALING
455    1,
456#else
457    0,
458#endif
459#ifdef SYST_FLOATX80_LE_QUIET
460    1,
461#else
462    0,
463#endif
464#ifdef SYST_FLOATX80_LT_QUIET
465    1,
466#else
467    0,
468#endif
469#ifdef SYST_FLOAT128_TO_INT32
470    1,
471#else
472    0,
473#endif
474#ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO
475    1,
476#else
477    0,
478#endif
479#ifdef SYST_FLOAT128_TO_INT64
480    1,
481#else
482    0,
483#endif
484#ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO
485    1,
486#else
487    0,
488#endif
489#ifdef SYST_FLOAT128_TO_FLOAT32
490    1,
491#else
492    0,
493#endif
494#ifdef SYST_FLOAT128_TO_FLOAT64
495    1,
496#else
497    0,
498#endif
499#ifdef SYST_FLOAT128_TO_FLOATX80
500    1,
501#else
502    0,
503#endif
504#ifdef SYST_FLOAT128_ROUND_TO_INT
505    1,
506#else
507    0,
508#endif
509#ifdef SYST_FLOAT128_ADD
510    1,
511#else
512    0,
513#endif
514#ifdef SYST_FLOAT128_SUB
515    1,
516#else
517    0,
518#endif
519#ifdef SYST_FLOAT128_MUL
520    1,
521#else
522    0,
523#endif
524#ifdef SYST_FLOAT128_DIV
525    1,
526#else
527    0,
528#endif
529#ifdef SYST_FLOAT128_REM
530    1,
531#else
532    0,
533#endif
534#ifdef SYST_FLOAT128_SQRT
535    1,
536#else
537    0,
538#endif
539#ifdef SYST_FLOAT128_EQ
540    1,
541#else
542    0,
543#endif
544#ifdef SYST_FLOAT128_LE
545    1,
546#else
547    0,
548#endif
549#ifdef SYST_FLOAT128_LT
550    1,
551#else
552    0,
553#endif
554#ifdef SYST_FLOAT128_EQ_SIGNALING
555    1,
556#else
557    0,
558#endif
559#ifdef SYST_FLOAT128_LE_QUIET
560    1,
561#else
562    0,
563#endif
564#ifdef SYST_FLOAT128_LT_QUIET
565    1,
566#else
567    0,
568#endif
569};
570
571static void
572 testFunctionVariety(
573     uint8 functionCode, int8 roundingPrecision, int8 roundingMode )
574{
575    uint8 roundingCode;
576
577    functionName = functions[ functionCode ].name;
578#ifdef FLOATX80
579    if ( roundingPrecision == 32 ) {
580        roundingPrecisionName = "32";
581    }
582    else if ( roundingPrecision == 64 ) {
583        roundingPrecisionName = "64";
584    }
585    else if ( roundingPrecision == 80 ) {
586        roundingPrecisionName = "80";
587    }
588    else {
589        roundingPrecision = 80;
590        roundingPrecisionName = 0;
591    }
592    floatx80_rounding_precision = roundingPrecision;
593    syst_float_set_rounding_precision( roundingPrecision );
594#endif
595    switch ( roundingMode ) {
596     case 0:
597        roundingModeName = 0;
598        roundingCode = float_round_nearest_even;
599        break;
600     case ROUND_NEAREST_EVEN:
601        roundingModeName = "nearest_even";
602        roundingCode = float_round_nearest_even;
603        break;
604     case ROUND_TO_ZERO:
605        roundingModeName = "to_zero";
606        roundingCode = float_round_to_zero;
607        break;
608     case ROUND_DOWN:
609        roundingModeName = "down";
610        roundingCode = float_round_down;
611        break;
612     case ROUND_UP:
613        roundingModeName = "up";
614        roundingCode = float_round_up;
615        break;
616    }
617    float_rounding_mode = roundingCode;
618    syst_float_set_rounding_mode( roundingCode );
619    fputs( "Testing ", stderr );
620    writeFunctionName( stderr );
621    fputs( ".\n", stderr );
622    switch ( functionCode ) {
623#ifdef SYST_INT32_TO_FLOAT32
624     case INT32_TO_FLOAT32:
625        test_a_int32_z_float32( int32_to_float32, syst_int32_to_float32 );
626        break;
627#endif
628#ifdef SYST_INT32_TO_FLOAT64
629     case INT32_TO_FLOAT64:
630        test_a_int32_z_float64( int32_to_float64, syst_int32_to_float64 );
631        break;
632#endif
633#ifdef SYST_INT32_TO_FLOATX80
634     case INT32_TO_FLOATX80:
635        test_a_int32_z_floatx80( int32_to_floatx80, syst_int32_to_floatx80 );
636        break;
637#endif
638#ifdef SYST_INT32_TO_FLOAT128
639     case INT32_TO_FLOAT128:
640        test_a_int32_z_float128( int32_to_float128, syst_int32_to_float128 );
641        break;
642#endif
643#ifdef SYST_INT64_TO_FLOAT32
644     case INT64_TO_FLOAT32:
645        test_a_int64_z_float32( int64_to_float32, syst_int64_to_float32 );
646        break;
647#endif
648#ifdef SYST_INT64_TO_FLOAT64
649     case INT64_TO_FLOAT64:
650        test_a_int64_z_float64( int64_to_float64, syst_int64_to_float64 );
651        break;
652#endif
653#ifdef SYST_INT64_TO_FLOATX80
654     case INT64_TO_FLOATX80:
655        test_a_int64_z_floatx80( int64_to_floatx80, syst_int64_to_floatx80 );
656        break;
657#endif
658#ifdef SYST_INT64_TO_FLOAT128
659     case INT64_TO_FLOAT128:
660        test_a_int64_z_float128( int64_to_float128, syst_int64_to_float128 );
661        break;
662#endif
663#ifdef SYST_FLOAT32_TO_INT32
664     case FLOAT32_TO_INT32:
665        test_a_float32_z_int32( float32_to_int32, syst_float32_to_int32 );
666        break;
667#endif
668#ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO
669     case FLOAT32_TO_INT32_ROUND_TO_ZERO:
670        test_a_float32_z_int32(
671            float32_to_int32_round_to_zero,
672            syst_float32_to_int32_round_to_zero
673        );
674        break;
675#endif
676#ifdef SYST_FLOAT32_TO_INT64
677     case FLOAT32_TO_INT64:
678        test_a_float32_z_int64( float32_to_int64, syst_float32_to_int64 );
679        break;
680#endif
681#ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO
682     case FLOAT32_TO_INT64_ROUND_TO_ZERO:
683        test_a_float32_z_int64(
684            float32_to_int64_round_to_zero,
685            syst_float32_to_int64_round_to_zero
686        );
687        break;
688#endif
689#ifdef SYST_FLOAT32_TO_FLOAT64
690     case FLOAT32_TO_FLOAT64:
691        test_a_float32_z_float64(
692            float32_to_float64, syst_float32_to_float64 );
693        break;
694#endif
695#ifdef SYST_FLOAT32_TO_FLOATX80
696     case FLOAT32_TO_FLOATX80:
697        test_a_float32_z_floatx80(
698            float32_to_floatx80, syst_float32_to_floatx80 );
699        break;
700#endif
701#ifdef SYST_FLOAT32_TO_FLOAT128
702     case FLOAT32_TO_FLOAT128:
703        test_a_float32_z_float128(
704            float32_to_float128, syst_float32_to_float128 );
705        break;
706#endif
707#ifdef SYST_FLOAT32_ROUND_TO_INT
708     case FLOAT32_ROUND_TO_INT:
709        test_az_float32( float32_round_to_int, syst_float32_round_to_int );
710        break;
711#endif
712#ifdef SYST_FLOAT32_ADD
713     case FLOAT32_ADD:
714        test_abz_float32( float32_add, syst_float32_add );
715        break;
716#endif
717#ifdef SYST_FLOAT32_SUB
718     case FLOAT32_SUB:
719        test_abz_float32( float32_sub, syst_float32_sub );
720        break;
721#endif
722#ifdef SYST_FLOAT32_MUL
723     case FLOAT32_MUL:
724        test_abz_float32( float32_mul, syst_float32_mul );
725        break;
726#endif
727#ifdef SYST_FLOAT32_DIV
728     case FLOAT32_DIV:
729        test_abz_float32( float32_div, syst_float32_div );
730        break;
731#endif
732#ifdef SYST_FLOAT32_REM
733     case FLOAT32_REM:
734        test_abz_float32( float32_rem, syst_float32_rem );
735        break;
736#endif
737#ifdef SYST_FLOAT32_SQRT
738     case FLOAT32_SQRT:
739        test_az_float32( float32_sqrt, syst_float32_sqrt );
740        break;
741#endif
742#ifdef SYST_FLOAT32_EQ
743     case FLOAT32_EQ:
744        test_ab_float32_z_flag( float32_eq, syst_float32_eq );
745        break;
746#endif
747#ifdef SYST_FLOAT32_LE
748     case FLOAT32_LE:
749        test_ab_float32_z_flag( float32_le, syst_float32_le );
750        break;
751#endif
752#ifdef SYST_FLOAT32_LT
753     case FLOAT32_LT:
754        test_ab_float32_z_flag( float32_lt, syst_float32_lt );
755        break;
756#endif
757#ifdef SYST_FLOAT32_EQ_SIGNALING
758     case FLOAT32_EQ_SIGNALING:
759        test_ab_float32_z_flag(
760            float32_eq_signaling, syst_float32_eq_signaling );
761        break;
762#endif
763#ifdef SYST_FLOAT32_LE_QUIET
764     case FLOAT32_LE_QUIET:
765        test_ab_float32_z_flag( float32_le_quiet, syst_float32_le_quiet );
766        break;
767#endif
768#ifdef SYST_FLOAT32_LT_QUIET
769     case FLOAT32_LT_QUIET:
770        test_ab_float32_z_flag( float32_lt_quiet, syst_float32_lt_quiet );
771        break;
772#endif
773#ifdef SYST_FLOAT64_TO_INT32
774     case FLOAT64_TO_INT32:
775        test_a_float64_z_int32( float64_to_int32, syst_float64_to_int32 );
776        break;
777#endif
778#ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO
779     case FLOAT64_TO_INT32_ROUND_TO_ZERO:
780        test_a_float64_z_int32(
781            float64_to_int32_round_to_zero,
782            syst_float64_to_int32_round_to_zero
783        );
784        break;
785#endif
786#ifdef SYST_FLOAT64_TO_INT64
787     case FLOAT64_TO_INT64:
788        test_a_float64_z_int64( float64_to_int64, syst_float64_to_int64 );
789        break;
790#endif
791#ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO
792     case FLOAT64_TO_INT64_ROUND_TO_ZERO:
793        test_a_float64_z_int64(
794            float64_to_int64_round_to_zero,
795            syst_float64_to_int64_round_to_zero
796        );
797        break;
798#endif
799#ifdef SYST_FLOAT64_TO_FLOAT32
800     case FLOAT64_TO_FLOAT32:
801        test_a_float64_z_float32(
802            float64_to_float32, syst_float64_to_float32 );
803        break;
804#endif
805#ifdef SYST_FLOAT64_TO_FLOATX80
806     case FLOAT64_TO_FLOATX80:
807        test_a_float64_z_floatx80(
808            float64_to_floatx80, syst_float64_to_floatx80 );
809        break;
810#endif
811#ifdef SYST_FLOAT64_TO_FLOAT128
812     case FLOAT64_TO_FLOAT128:
813        test_a_float64_z_float128(
814            float64_to_float128, syst_float64_to_float128 );
815        break;
816#endif
817#ifdef SYST_FLOAT64_ROUND_TO_INT
818     case FLOAT64_ROUND_TO_INT:
819        test_az_float64( float64_round_to_int, syst_float64_round_to_int );
820        break;
821#endif
822#ifdef SYST_FLOAT64_ADD
823     case FLOAT64_ADD:
824        test_abz_float64( float64_add, syst_float64_add );
825        break;
826#endif
827#ifdef SYST_FLOAT64_SUB
828     case FLOAT64_SUB:
829        test_abz_float64( float64_sub, syst_float64_sub );
830        break;
831#endif
832#ifdef SYST_FLOAT64_MUL
833     case FLOAT64_MUL:
834        test_abz_float64( float64_mul, syst_float64_mul );
835        break;
836#endif
837#ifdef SYST_FLOAT64_DIV
838     case FLOAT64_DIV:
839        test_abz_float64( float64_div, syst_float64_div );
840        break;
841#endif
842#ifdef SYST_FLOAT64_REM
843     case FLOAT64_REM:
844        test_abz_float64( float64_rem, syst_float64_rem );
845        break;
846#endif
847#ifdef SYST_FLOAT64_SQRT
848     case FLOAT64_SQRT:
849        test_az_float64( float64_sqrt, syst_float64_sqrt );
850        break;
851#endif
852#ifdef SYST_FLOAT64_EQ
853     case FLOAT64_EQ:
854        test_ab_float64_z_flag( float64_eq, syst_float64_eq );
855        break;
856#endif
857#ifdef SYST_FLOAT64_LE
858     case FLOAT64_LE:
859        test_ab_float64_z_flag( float64_le, syst_float64_le );
860        break;
861#endif
862#ifdef SYST_FLOAT64_LT
863     case FLOAT64_LT:
864        test_ab_float64_z_flag( float64_lt, syst_float64_lt );
865        break;
866#endif
867#ifdef SYST_FLOAT64_EQ_SIGNALING
868     case FLOAT64_EQ_SIGNALING:
869        test_ab_float64_z_flag(
870            float64_eq_signaling, syst_float64_eq_signaling );
871        break;
872#endif
873#ifdef SYST_FLOAT64_LE_QUIET
874     case FLOAT64_LE_QUIET:
875        test_ab_float64_z_flag( float64_le_quiet, syst_float64_le_quiet );
876        break;
877#endif
878#ifdef SYST_FLOAT64_LT_QUIET
879     case FLOAT64_LT_QUIET:
880        test_ab_float64_z_flag( float64_lt_quiet, syst_float64_lt_quiet );
881        break;
882#endif
883#ifdef SYST_FLOATX80_TO_INT32
884     case FLOATX80_TO_INT32:
885        test_a_floatx80_z_int32( floatx80_to_int32, syst_floatx80_to_int32 );
886        break;
887#endif
888#ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO
889     case FLOATX80_TO_INT32_ROUND_TO_ZERO:
890        test_a_floatx80_z_int32(
891            floatx80_to_int32_round_to_zero,
892            syst_floatx80_to_int32_round_to_zero
893        );
894        break;
895#endif
896#ifdef SYST_FLOATX80_TO_INT64
897     case FLOATX80_TO_INT64:
898        test_a_floatx80_z_int64( floatx80_to_int64, syst_floatx80_to_int64 );
899        break;
900#endif
901#ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO
902     case FLOATX80_TO_INT64_ROUND_TO_ZERO:
903        test_a_floatx80_z_int64(
904            floatx80_to_int64_round_to_zero,
905            syst_floatx80_to_int64_round_to_zero
906        );
907        break;
908#endif
909#ifdef SYST_FLOATX80_TO_FLOAT32
910     case FLOATX80_TO_FLOAT32:
911        test_a_floatx80_z_float32(
912            floatx80_to_float32, syst_floatx80_to_float32 );
913        break;
914#endif
915#ifdef SYST_FLOATX80_TO_FLOAT64
916     case FLOATX80_TO_FLOAT64:
917        test_a_floatx80_z_float64(
918            floatx80_to_float64, syst_floatx80_to_float64 );
919        break;
920#endif
921#ifdef SYST_FLOATX80_TO_FLOAT128
922     case FLOATX80_TO_FLOAT128:
923        test_a_floatx80_z_float128(
924            floatx80_to_float128, syst_floatx80_to_float128 );
925        break;
926#endif
927#ifdef SYST_FLOATX80_ROUND_TO_INT
928     case FLOATX80_ROUND_TO_INT:
929        test_az_floatx80( floatx80_round_to_int, syst_floatx80_round_to_int );
930        break;
931#endif
932#ifdef SYST_FLOATX80_ADD
933     case FLOATX80_ADD:
934        test_abz_floatx80( floatx80_add, syst_floatx80_add );
935        break;
936#endif
937#ifdef SYST_FLOATX80_SUB
938     case FLOATX80_SUB:
939        test_abz_floatx80( floatx80_sub, syst_floatx80_sub );
940        break;
941#endif
942#ifdef SYST_FLOATX80_MUL
943     case FLOATX80_MUL:
944        test_abz_floatx80( floatx80_mul, syst_floatx80_mul );
945        break;
946#endif
947#ifdef SYST_FLOATX80_DIV
948     case FLOATX80_DIV:
949        test_abz_floatx80( floatx80_div, syst_floatx80_div );
950        break;
951#endif
952#ifdef SYST_FLOATX80_REM
953     case FLOATX80_REM:
954        test_abz_floatx80( floatx80_rem, syst_floatx80_rem );
955        break;
956#endif
957#ifdef SYST_FLOATX80_SQRT
958     case FLOATX80_SQRT:
959        test_az_floatx80( floatx80_sqrt, syst_floatx80_sqrt );
960        break;
961#endif
962#ifdef SYST_FLOATX80_EQ
963     case FLOATX80_EQ:
964        test_ab_floatx80_z_flag( floatx80_eq, syst_floatx80_eq );
965        break;
966#endif
967#ifdef SYST_FLOATX80_LE
968     case FLOATX80_LE:
969        test_ab_floatx80_z_flag( floatx80_le, syst_floatx80_le );
970        break;
971#endif
972#ifdef SYST_FLOATX80_LT
973     case FLOATX80_LT:
974        test_ab_floatx80_z_flag( floatx80_lt, syst_floatx80_lt );
975        break;
976#endif
977#ifdef SYST_FLOATX80_EQ_SIGNALING
978     case FLOATX80_EQ_SIGNALING:
979        test_ab_floatx80_z_flag(
980            floatx80_eq_signaling, syst_floatx80_eq_signaling );
981        break;
982#endif
983#ifdef SYST_FLOATX80_LE_QUIET
984     case FLOATX80_LE_QUIET:
985        test_ab_floatx80_z_flag( floatx80_le_quiet, syst_floatx80_le_quiet );
986        break;
987#endif
988#ifdef SYST_FLOATX80_LT_QUIET
989     case FLOATX80_LT_QUIET:
990        test_ab_floatx80_z_flag( floatx80_lt_quiet, syst_floatx80_lt_quiet );
991        break;
992#endif
993#ifdef SYST_FLOAT128_TO_INT32
994     case FLOAT128_TO_INT32:
995        test_a_float128_z_int32( float128_to_int32, syst_float128_to_int32 );
996        break;
997#endif
998#ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO
999     case FLOAT128_TO_INT32_ROUND_TO_ZERO:
1000        test_a_float128_z_int32(
1001            float128_to_int32_round_to_zero,
1002            syst_float128_to_int32_round_to_zero
1003        );
1004        break;
1005#endif
1006#ifdef SYST_FLOAT128_TO_INT64
1007     case FLOAT128_TO_INT64:
1008        test_a_float128_z_int64( float128_to_int64, syst_float128_to_int64 );
1009        break;
1010#endif
1011#ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO
1012     case FLOAT128_TO_INT64_ROUND_TO_ZERO:
1013        test_a_float128_z_int64(
1014            float128_to_int64_round_to_zero,
1015            syst_float128_to_int64_round_to_zero
1016        );
1017        break;
1018#endif
1019#ifdef SYST_FLOAT128_TO_FLOAT32
1020     case FLOAT128_TO_FLOAT32:
1021        test_a_float128_z_float32(
1022            float128_to_float32, syst_float128_to_float32 );
1023        break;
1024#endif
1025#ifdef SYST_FLOAT128_TO_FLOAT64
1026     case FLOAT128_TO_FLOAT64:
1027        test_a_float128_z_float64(
1028            float128_to_float64, syst_float128_to_float64 );
1029        break;
1030#endif
1031#ifdef SYST_FLOAT128_TO_FLOATX80
1032     case FLOAT128_TO_FLOATX80:
1033        test_a_float128_z_floatx80(
1034            float128_to_floatx80, syst_float128_to_floatx80 );
1035        break;
1036#endif
1037#ifdef SYST_FLOAT128_ROUND_TO_INT
1038     case FLOAT128_ROUND_TO_INT:
1039        test_az_float128( float128_round_to_int, syst_float128_round_to_int );
1040        break;
1041#endif
1042#ifdef SYST_FLOAT128_ADD
1043     case FLOAT128_ADD:
1044        test_abz_float128( float128_add, syst_float128_add );
1045        break;
1046#endif
1047#ifdef SYST_FLOAT128_SUB
1048     case FLOAT128_SUB:
1049        test_abz_float128( float128_sub, syst_float128_sub );
1050        break;
1051#endif
1052#ifdef SYST_FLOAT128_MUL
1053     case FLOAT128_MUL:
1054        test_abz_float128( float128_mul, syst_float128_mul );
1055        break;
1056#endif
1057#ifdef SYST_FLOAT128_DIV
1058     case FLOAT128_DIV:
1059        test_abz_float128( float128_div, syst_float128_div );
1060        break;
1061#endif
1062#ifdef SYST_FLOAT128_REM
1063     case FLOAT128_REM:
1064        test_abz_float128( float128_rem, syst_float128_rem );
1065        break;
1066#endif
1067#ifdef SYST_FLOAT128_SQRT
1068     case FLOAT128_SQRT:
1069        test_az_float128( float128_sqrt, syst_float128_sqrt );
1070        break;
1071#endif
1072#ifdef SYST_FLOAT128_EQ
1073     case FLOAT128_EQ:
1074        test_ab_float128_z_flag( float128_eq, syst_float128_eq );
1075        break;
1076#endif
1077#ifdef SYST_FLOAT128_LE
1078     case FLOAT128_LE:
1079        test_ab_float128_z_flag( float128_le, syst_float128_le );
1080        break;
1081#endif
1082#ifdef SYST_FLOAT128_LT
1083     case FLOAT128_LT:
1084        test_ab_float128_z_flag( float128_lt, syst_float128_lt );
1085        break;
1086#endif
1087#ifdef SYST_FLOAT128_EQ_SIGNALING
1088     case FLOAT128_EQ_SIGNALING:
1089        test_ab_float128_z_flag(
1090            float128_eq_signaling, syst_float128_eq_signaling );
1091        break;
1092#endif
1093#ifdef SYST_FLOAT128_LE_QUIET
1094     case FLOAT128_LE_QUIET:
1095        test_ab_float128_z_flag( float128_le_quiet, syst_float128_le_quiet );
1096        break;
1097#endif
1098#ifdef SYST_FLOAT128_LT_QUIET
1099     case FLOAT128_LT_QUIET:
1100        test_ab_float128_z_flag( float128_lt_quiet, syst_float128_lt_quiet );
1101        break;
1102#endif
1103    }
1104    if ( ( errorStop && anyErrors ) || stop ) exitWithStatus();
1105
1106}
1107
1108void
1109 testFunction(
1110     uint8 functionCode, int8 roundingPrecisionIn, int8 roundingModeIn )
1111{
1112    int8 roundingPrecision, roundingMode;
1113
1114    roundingPrecision = 32;
1115    for (;;) {
1116        if ( ! functions[ functionCode ].roundingPrecision ) {
1117            roundingPrecision = 0;
1118        }
1119        else if ( roundingPrecisionIn ) {
1120            roundingPrecision = roundingPrecisionIn;
1121        }
1122        for ( roundingMode = 1;
1123              roundingMode < NUM_ROUNDINGMODES;
1124              ++roundingMode
1125            ) {
1126            if ( ! functions[ functionCode ].roundingMode ) {
1127                roundingMode = 0;
1128            }
1129            else if ( roundingModeIn ) {
1130                roundingMode = roundingModeIn;
1131            }
1132            testFunctionVariety(
1133                functionCode, roundingPrecision, roundingMode );
1134            if ( roundingModeIn || ! roundingMode ) break;
1135        }
1136        if ( roundingPrecisionIn || ! roundingPrecision ) break;
1137        if ( roundingPrecision == 80 ) {
1138            break;
1139        }
1140        else if ( roundingPrecision == 64 ) {
1141            roundingPrecision = 80;
1142        }
1143        else if ( roundingPrecision == 32 ) {
1144            roundingPrecision = 64;
1145        }
1146    }
1147
1148}
1149
1150