1*1f21f64aSMarius Strobl 
2*1f21f64aSMarius Strobl /*
3*1f21f64aSMarius Strobl ===============================================================================
4*1f21f64aSMarius Strobl 
5*1f21f64aSMarius Strobl This C source file is part of TestFloat, Release 2a, a package of programs
6*1f21f64aSMarius Strobl for testing the correctness of floating-point arithmetic complying to the
7*1f21f64aSMarius Strobl IEC/IEEE Standard for Floating-Point.
8*1f21f64aSMarius Strobl 
9*1f21f64aSMarius Strobl Written by John R. Hauser.  More information is available through the Web
10*1f21f64aSMarius Strobl page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
11*1f21f64aSMarius Strobl 
12*1f21f64aSMarius Strobl THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
13*1f21f64aSMarius Strobl has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
14*1f21f64aSMarius Strobl TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
15*1f21f64aSMarius Strobl PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
16*1f21f64aSMarius Strobl AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
17*1f21f64aSMarius Strobl 
18*1f21f64aSMarius Strobl Derivative works are acceptable, even for commercial purposes, so long as
19*1f21f64aSMarius Strobl (1) they include prominent notice that the work is derivative, and (2) they
20*1f21f64aSMarius Strobl include prominent notice akin to these four paragraphs for those parts of
21*1f21f64aSMarius Strobl this code that are retained.
22*1f21f64aSMarius Strobl 
23*1f21f64aSMarius Strobl ===============================================================================
24*1f21f64aSMarius Strobl */
25*1f21f64aSMarius Strobl 
26*1f21f64aSMarius Strobl #include <sys/cdefs.h>
27*1f21f64aSMarius Strobl __FBSDID("$FreeBSD$");
28*1f21f64aSMarius Strobl 
29*1f21f64aSMarius Strobl #include <stdlib.h>
30*1f21f64aSMarius Strobl #include <signal.h>
31*1f21f64aSMarius Strobl #include <string.h>
32*1f21f64aSMarius Strobl #include "milieu.h"
33*1f21f64aSMarius Strobl #include "fail.h"
34*1f21f64aSMarius Strobl #include "softfloat.h"
35*1f21f64aSMarius Strobl #include "slowfloat.h"
36*1f21f64aSMarius Strobl #include "testCases.h"
37*1f21f64aSMarius Strobl #include "testLoops.h"
38*1f21f64aSMarius Strobl 
catchSIGINT(int signalCode)39*1f21f64aSMarius Strobl static void catchSIGINT( int signalCode )
40*1f21f64aSMarius Strobl {
41*1f21f64aSMarius Strobl 
42*1f21f64aSMarius Strobl     if ( stop ) exit( EXIT_FAILURE );
43*1f21f64aSMarius Strobl     stop = TRUE;
44*1f21f64aSMarius Strobl 
45*1f21f64aSMarius Strobl }
46*1f21f64aSMarius Strobl 
clearFlags(void)47*1f21f64aSMarius Strobl int8 clearFlags( void )
48*1f21f64aSMarius Strobl {
49*1f21f64aSMarius Strobl     int8 flags;
50*1f21f64aSMarius Strobl 
51*1f21f64aSMarius Strobl     flags = float_exception_flags;
52*1f21f64aSMarius Strobl     float_exception_flags = 0;
53*1f21f64aSMarius Strobl     return flags;
54*1f21f64aSMarius Strobl 
55*1f21f64aSMarius Strobl }
56*1f21f64aSMarius Strobl 
57*1f21f64aSMarius Strobl enum {
58*1f21f64aSMarius Strobl     INT32_TO_FLOAT32 = 1,
59*1f21f64aSMarius Strobl     INT32_TO_FLOAT64,
60*1f21f64aSMarius Strobl #ifdef FLOATX80
61*1f21f64aSMarius Strobl     INT32_TO_FLOATX80,
62*1f21f64aSMarius Strobl #endif
63*1f21f64aSMarius Strobl #ifdef FLOAT128
64*1f21f64aSMarius Strobl     INT32_TO_FLOAT128,
65*1f21f64aSMarius Strobl #endif
66*1f21f64aSMarius Strobl #ifdef BITS64
67*1f21f64aSMarius Strobl     INT64_TO_FLOAT32,
68*1f21f64aSMarius Strobl     INT64_TO_FLOAT64,
69*1f21f64aSMarius Strobl #ifdef FLOATX80
70*1f21f64aSMarius Strobl     INT64_TO_FLOATX80,
71*1f21f64aSMarius Strobl #endif
72*1f21f64aSMarius Strobl #ifdef FLOAT128
73*1f21f64aSMarius Strobl     INT64_TO_FLOAT128,
74*1f21f64aSMarius Strobl #endif
75*1f21f64aSMarius Strobl #endif
76*1f21f64aSMarius Strobl     FLOAT32_TO_INT32,
77*1f21f64aSMarius Strobl     FLOAT32_TO_INT32_ROUND_TO_ZERO,
78*1f21f64aSMarius Strobl #ifdef BITS64
79*1f21f64aSMarius Strobl     FLOAT32_TO_INT64,
80*1f21f64aSMarius Strobl     FLOAT32_TO_INT64_ROUND_TO_ZERO,
81*1f21f64aSMarius Strobl #endif
82*1f21f64aSMarius Strobl     FLOAT32_TO_FLOAT64,
83*1f21f64aSMarius Strobl #ifdef FLOATX80
84*1f21f64aSMarius Strobl     FLOAT32_TO_FLOATX80,
85*1f21f64aSMarius Strobl #endif
86*1f21f64aSMarius Strobl #ifdef FLOAT128
87*1f21f64aSMarius Strobl     FLOAT32_TO_FLOAT128,
88*1f21f64aSMarius Strobl #endif
89*1f21f64aSMarius Strobl     FLOAT32_ROUND_TO_INT,
90*1f21f64aSMarius Strobl     FLOAT32_ADD,
91*1f21f64aSMarius Strobl     FLOAT32_SUB,
92*1f21f64aSMarius Strobl     FLOAT32_MUL,
93*1f21f64aSMarius Strobl     FLOAT32_DIV,
94*1f21f64aSMarius Strobl     FLOAT32_REM,
95*1f21f64aSMarius Strobl     FLOAT32_SQRT,
96*1f21f64aSMarius Strobl     FLOAT32_EQ,
97*1f21f64aSMarius Strobl     FLOAT32_LE,
98*1f21f64aSMarius Strobl     FLOAT32_LT,
99*1f21f64aSMarius Strobl     FLOAT32_EQ_SIGNALING,
100*1f21f64aSMarius Strobl     FLOAT32_LE_QUIET,
101*1f21f64aSMarius Strobl     FLOAT32_LT_QUIET,
102*1f21f64aSMarius Strobl     FLOAT64_TO_INT32,
103*1f21f64aSMarius Strobl     FLOAT64_TO_INT32_ROUND_TO_ZERO,
104*1f21f64aSMarius Strobl #ifdef BITS64
105*1f21f64aSMarius Strobl     FLOAT64_TO_INT64,
106*1f21f64aSMarius Strobl     FLOAT64_TO_INT64_ROUND_TO_ZERO,
107*1f21f64aSMarius Strobl #endif
108*1f21f64aSMarius Strobl     FLOAT64_TO_FLOAT32,
109*1f21f64aSMarius Strobl #ifdef FLOATX80
110*1f21f64aSMarius Strobl     FLOAT64_TO_FLOATX80,
111*1f21f64aSMarius Strobl #endif
112*1f21f64aSMarius Strobl #ifdef FLOAT128
113*1f21f64aSMarius Strobl     FLOAT64_TO_FLOAT128,
114*1f21f64aSMarius Strobl #endif
115*1f21f64aSMarius Strobl     FLOAT64_ROUND_TO_INT,
116*1f21f64aSMarius Strobl     FLOAT64_ADD,
117*1f21f64aSMarius Strobl     FLOAT64_SUB,
118*1f21f64aSMarius Strobl     FLOAT64_MUL,
119*1f21f64aSMarius Strobl     FLOAT64_DIV,
120*1f21f64aSMarius Strobl     FLOAT64_REM,
121*1f21f64aSMarius Strobl     FLOAT64_SQRT,
122*1f21f64aSMarius Strobl     FLOAT64_EQ,
123*1f21f64aSMarius Strobl     FLOAT64_LE,
124*1f21f64aSMarius Strobl     FLOAT64_LT,
125*1f21f64aSMarius Strobl     FLOAT64_EQ_SIGNALING,
126*1f21f64aSMarius Strobl     FLOAT64_LE_QUIET,
127*1f21f64aSMarius Strobl     FLOAT64_LT_QUIET,
128*1f21f64aSMarius Strobl #ifdef FLOATX80
129*1f21f64aSMarius Strobl     FLOATX80_TO_INT32,
130*1f21f64aSMarius Strobl     FLOATX80_TO_INT32_ROUND_TO_ZERO,
131*1f21f64aSMarius Strobl #ifdef BITS64
132*1f21f64aSMarius Strobl     FLOATX80_TO_INT64,
133*1f21f64aSMarius Strobl     FLOATX80_TO_INT64_ROUND_TO_ZERO,
134*1f21f64aSMarius Strobl #endif
135*1f21f64aSMarius Strobl     FLOATX80_TO_FLOAT32,
136*1f21f64aSMarius Strobl     FLOATX80_TO_FLOAT64,
137*1f21f64aSMarius Strobl #ifdef FLOAT128
138*1f21f64aSMarius Strobl     FLOATX80_TO_FLOAT128,
139*1f21f64aSMarius Strobl #endif
140*1f21f64aSMarius Strobl     FLOATX80_ROUND_TO_INT,
141*1f21f64aSMarius Strobl     FLOATX80_ADD,
142*1f21f64aSMarius Strobl     FLOATX80_SUB,
143*1f21f64aSMarius Strobl     FLOATX80_MUL,
144*1f21f64aSMarius Strobl     FLOATX80_DIV,
145*1f21f64aSMarius Strobl     FLOATX80_REM,
146*1f21f64aSMarius Strobl     FLOATX80_SQRT,
147*1f21f64aSMarius Strobl     FLOATX80_EQ,
148*1f21f64aSMarius Strobl     FLOATX80_LE,
149*1f21f64aSMarius Strobl     FLOATX80_LT,
150*1f21f64aSMarius Strobl     FLOATX80_EQ_SIGNALING,
151*1f21f64aSMarius Strobl     FLOATX80_LE_QUIET,
152*1f21f64aSMarius Strobl     FLOATX80_LT_QUIET,
153*1f21f64aSMarius Strobl #endif
154*1f21f64aSMarius Strobl #ifdef FLOAT128
155*1f21f64aSMarius Strobl     FLOAT128_TO_INT32,
156*1f21f64aSMarius Strobl     FLOAT128_TO_INT32_ROUND_TO_ZERO,
157*1f21f64aSMarius Strobl #ifdef BITS64
158*1f21f64aSMarius Strobl     FLOAT128_TO_INT64,
159*1f21f64aSMarius Strobl     FLOAT128_TO_INT64_ROUND_TO_ZERO,
160*1f21f64aSMarius Strobl #endif
161*1f21f64aSMarius Strobl     FLOAT128_TO_FLOAT32,
162*1f21f64aSMarius Strobl     FLOAT128_TO_FLOAT64,
163*1f21f64aSMarius Strobl #ifdef FLOATX80
164*1f21f64aSMarius Strobl     FLOAT128_TO_FLOATX80,
165*1f21f64aSMarius Strobl #endif
166*1f21f64aSMarius Strobl     FLOAT128_ROUND_TO_INT,
167*1f21f64aSMarius Strobl     FLOAT128_ADD,
168*1f21f64aSMarius Strobl     FLOAT128_SUB,
169*1f21f64aSMarius Strobl     FLOAT128_MUL,
170*1f21f64aSMarius Strobl     FLOAT128_DIV,
171*1f21f64aSMarius Strobl     FLOAT128_REM,
172*1f21f64aSMarius Strobl     FLOAT128_SQRT,
173*1f21f64aSMarius Strobl     FLOAT128_EQ,
174*1f21f64aSMarius Strobl     FLOAT128_LE,
175*1f21f64aSMarius Strobl     FLOAT128_LT,
176*1f21f64aSMarius Strobl     FLOAT128_EQ_SIGNALING,
177*1f21f64aSMarius Strobl     FLOAT128_LE_QUIET,
178*1f21f64aSMarius Strobl     FLOAT128_LT_QUIET,
179*1f21f64aSMarius Strobl #endif
180*1f21f64aSMarius Strobl     NUM_FUNCTIONS
181*1f21f64aSMarius Strobl };
182*1f21f64aSMarius Strobl static struct {
183*1f21f64aSMarius Strobl     char *name;
184*1f21f64aSMarius Strobl     int8 numInputs;
185*1f21f64aSMarius Strobl     flag roundingPrecision, roundingMode;
186*1f21f64aSMarius Strobl     flag tininessMode, tininessModeAtReducedPrecision;
187*1f21f64aSMarius Strobl } functions[ NUM_FUNCTIONS ] = {
188*1f21f64aSMarius Strobl     { 0, 0, 0, 0, 0, 0 },
189*1f21f64aSMarius Strobl     { "int32_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
190*1f21f64aSMarius Strobl     { "int32_to_float64",                1, FALSE, FALSE, FALSE, FALSE },
191*1f21f64aSMarius Strobl #ifdef FLOATX80
192*1f21f64aSMarius Strobl     { "int32_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
193*1f21f64aSMarius Strobl #endif
194*1f21f64aSMarius Strobl #ifdef FLOAT128
195*1f21f64aSMarius Strobl     { "int32_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
196*1f21f64aSMarius Strobl #endif
197*1f21f64aSMarius Strobl #ifdef BITS64
198*1f21f64aSMarius Strobl     { "int64_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
199*1f21f64aSMarius Strobl     { "int64_to_float64",                1, FALSE, TRUE,  FALSE, FALSE },
200*1f21f64aSMarius Strobl #ifdef FLOATX80
201*1f21f64aSMarius Strobl     { "int64_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
202*1f21f64aSMarius Strobl #endif
203*1f21f64aSMarius Strobl #ifdef FLOAT128
204*1f21f64aSMarius Strobl     { "int64_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
205*1f21f64aSMarius Strobl #endif
206*1f21f64aSMarius Strobl #endif
207*1f21f64aSMarius Strobl     { "float32_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
208*1f21f64aSMarius Strobl     { "float32_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
209*1f21f64aSMarius Strobl #ifdef BITS64
210*1f21f64aSMarius Strobl     { "float32_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
211*1f21f64aSMarius Strobl     { "float32_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
212*1f21f64aSMarius Strobl #endif
213*1f21f64aSMarius Strobl     { "float32_to_float64",              1, FALSE, FALSE, FALSE, FALSE },
214*1f21f64aSMarius Strobl #ifdef FLOATX80
215*1f21f64aSMarius Strobl     { "float32_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
216*1f21f64aSMarius Strobl #endif
217*1f21f64aSMarius Strobl #ifdef FLOAT128
218*1f21f64aSMarius Strobl     { "float32_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
219*1f21f64aSMarius Strobl #endif
220*1f21f64aSMarius Strobl     { "float32_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
221*1f21f64aSMarius Strobl     { "float32_add",                     2, FALSE, TRUE,  FALSE, FALSE },
222*1f21f64aSMarius Strobl     { "float32_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
223*1f21f64aSMarius Strobl     { "float32_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
224*1f21f64aSMarius Strobl     { "float32_div",                     2, FALSE, TRUE,  FALSE, FALSE },
225*1f21f64aSMarius Strobl     { "float32_rem",                     2, FALSE, FALSE, FALSE, FALSE },
226*1f21f64aSMarius Strobl     { "float32_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
227*1f21f64aSMarius Strobl     { "float32_eq",                      2, FALSE, FALSE, FALSE, FALSE },
228*1f21f64aSMarius Strobl     { "float32_le",                      2, FALSE, FALSE, FALSE, FALSE },
229*1f21f64aSMarius Strobl     { "float32_lt",                      2, FALSE, FALSE, FALSE, FALSE },
230*1f21f64aSMarius Strobl     { "float32_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
231*1f21f64aSMarius Strobl     { "float32_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
232*1f21f64aSMarius Strobl     { "float32_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
233*1f21f64aSMarius Strobl     { "float64_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
234*1f21f64aSMarius Strobl     { "float64_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
235*1f21f64aSMarius Strobl #ifdef BITS64
236*1f21f64aSMarius Strobl     { "float64_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
237*1f21f64aSMarius Strobl     { "float64_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
238*1f21f64aSMarius Strobl #endif
239*1f21f64aSMarius Strobl     { "float64_to_float32",              1, FALSE, TRUE,  TRUE,  FALSE },
240*1f21f64aSMarius Strobl #ifdef FLOATX80
241*1f21f64aSMarius Strobl     { "float64_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
242*1f21f64aSMarius Strobl #endif
243*1f21f64aSMarius Strobl #ifdef FLOAT128
244*1f21f64aSMarius Strobl     { "float64_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
245*1f21f64aSMarius Strobl #endif
246*1f21f64aSMarius Strobl     { "float64_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
247*1f21f64aSMarius Strobl     { "float64_add",                     2, FALSE, TRUE,  FALSE, FALSE },
248*1f21f64aSMarius Strobl     { "float64_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
249*1f21f64aSMarius Strobl     { "float64_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
250*1f21f64aSMarius Strobl     { "float64_div",                     2, FALSE, TRUE,  FALSE, FALSE },
251*1f21f64aSMarius Strobl     { "float64_rem",                     2, FALSE, FALSE, FALSE, FALSE },
252*1f21f64aSMarius Strobl     { "float64_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
253*1f21f64aSMarius Strobl     { "float64_eq",                      2, FALSE, FALSE, FALSE, FALSE },
254*1f21f64aSMarius Strobl     { "float64_le",                      2, FALSE, FALSE, FALSE, FALSE },
255*1f21f64aSMarius Strobl     { "float64_lt",                      2, FALSE, FALSE, FALSE, FALSE },
256*1f21f64aSMarius Strobl     { "float64_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
257*1f21f64aSMarius Strobl     { "float64_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
258*1f21f64aSMarius Strobl     { "float64_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
259*1f21f64aSMarius Strobl #ifdef FLOATX80
260*1f21f64aSMarius Strobl     { "floatx80_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
261*1f21f64aSMarius Strobl     { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
262*1f21f64aSMarius Strobl #ifdef BITS64
263*1f21f64aSMarius Strobl     { "floatx80_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
264*1f21f64aSMarius Strobl     { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
265*1f21f64aSMarius Strobl #endif
266*1f21f64aSMarius Strobl     { "floatx80_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
267*1f21f64aSMarius Strobl     { "floatx80_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
268*1f21f64aSMarius Strobl #ifdef FLOAT128
269*1f21f64aSMarius Strobl     { "floatx80_to_float128",            1, FALSE, FALSE, FALSE, FALSE },
270*1f21f64aSMarius Strobl #endif
271*1f21f64aSMarius Strobl     { "floatx80_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
272*1f21f64aSMarius Strobl     { "floatx80_add",                    2, TRUE,  TRUE,  FALSE, TRUE  },
273*1f21f64aSMarius Strobl     { "floatx80_sub",                    2, TRUE,  TRUE,  FALSE, TRUE  },
274*1f21f64aSMarius Strobl     { "floatx80_mul",                    2, TRUE,  TRUE,  TRUE,  TRUE  },
275*1f21f64aSMarius Strobl     { "floatx80_div",                    2, TRUE,  TRUE,  FALSE, TRUE  },
276*1f21f64aSMarius Strobl     { "floatx80_rem",                    2, FALSE, FALSE, FALSE, FALSE },
277*1f21f64aSMarius Strobl     { "floatx80_sqrt",                   1, TRUE,  TRUE,  FALSE, FALSE },
278*1f21f64aSMarius Strobl     { "floatx80_eq",                     2, FALSE, FALSE, FALSE, FALSE },
279*1f21f64aSMarius Strobl     { "floatx80_le",                     2, FALSE, FALSE, FALSE, FALSE },
280*1f21f64aSMarius Strobl     { "floatx80_lt",                     2, FALSE, FALSE, FALSE, FALSE },
281*1f21f64aSMarius Strobl     { "floatx80_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
282*1f21f64aSMarius Strobl     { "floatx80_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
283*1f21f64aSMarius Strobl     { "floatx80_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
284*1f21f64aSMarius Strobl #endif
285*1f21f64aSMarius Strobl #ifdef FLOAT128
286*1f21f64aSMarius Strobl     { "float128_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
287*1f21f64aSMarius Strobl     { "float128_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
288*1f21f64aSMarius Strobl #ifdef BITS64
289*1f21f64aSMarius Strobl     { "float128_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
290*1f21f64aSMarius Strobl     { "float128_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
291*1f21f64aSMarius Strobl #endif
292*1f21f64aSMarius Strobl     { "float128_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
293*1f21f64aSMarius Strobl     { "float128_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
294*1f21f64aSMarius Strobl #ifdef FLOATX80
295*1f21f64aSMarius Strobl     { "float128_to_floatx80",            1, FALSE, TRUE,  TRUE,  FALSE },
296*1f21f64aSMarius Strobl #endif
297*1f21f64aSMarius Strobl     { "float128_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
298*1f21f64aSMarius Strobl     { "float128_add",                    2, FALSE, TRUE,  FALSE, FALSE },
299*1f21f64aSMarius Strobl     { "float128_sub",                    2, FALSE, TRUE,  FALSE, FALSE },
300*1f21f64aSMarius Strobl     { "float128_mul",                    2, FALSE, TRUE,  TRUE,  FALSE },
301*1f21f64aSMarius Strobl     { "float128_div",                    2, FALSE, TRUE,  FALSE, FALSE },
302*1f21f64aSMarius Strobl     { "float128_rem",                    2, FALSE, FALSE, FALSE, FALSE },
303*1f21f64aSMarius Strobl     { "float128_sqrt",                   1, FALSE, TRUE,  FALSE, FALSE },
304*1f21f64aSMarius Strobl     { "float128_eq",                     2, FALSE, FALSE, FALSE, FALSE },
305*1f21f64aSMarius Strobl     { "float128_le",                     2, FALSE, FALSE, FALSE, FALSE },
306*1f21f64aSMarius Strobl     { "float128_lt",                     2, FALSE, FALSE, FALSE, FALSE },
307*1f21f64aSMarius Strobl     { "float128_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
308*1f21f64aSMarius Strobl     { "float128_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
309*1f21f64aSMarius Strobl     { "float128_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
310*1f21f64aSMarius Strobl #endif
311*1f21f64aSMarius Strobl };
312*1f21f64aSMarius Strobl 
313*1f21f64aSMarius Strobl enum {
314*1f21f64aSMarius Strobl     ROUND_NEAREST_EVEN = 1,
315*1f21f64aSMarius Strobl     ROUND_TO_ZERO,
316*1f21f64aSMarius Strobl     ROUND_DOWN,
317*1f21f64aSMarius Strobl     ROUND_UP,
318*1f21f64aSMarius Strobl     NUM_ROUNDINGMODES
319*1f21f64aSMarius Strobl };
320*1f21f64aSMarius Strobl enum {
321*1f21f64aSMarius Strobl     TININESS_BEFORE_ROUNDING = 1,
322*1f21f64aSMarius Strobl     TININESS_AFTER_ROUNDING,
323*1f21f64aSMarius Strobl     NUM_TININESSMODES
324*1f21f64aSMarius Strobl };
325*1f21f64aSMarius Strobl 
326*1f21f64aSMarius Strobl static void
testFunctionVariety(uint8 functionCode,int8 roundingPrecision,int8 roundingMode,int8 tininessMode)327*1f21f64aSMarius Strobl  testFunctionVariety(
328*1f21f64aSMarius Strobl      uint8 functionCode,
329*1f21f64aSMarius Strobl      int8 roundingPrecision,
330*1f21f64aSMarius Strobl      int8 roundingMode,
331*1f21f64aSMarius Strobl      int8 tininessMode
332*1f21f64aSMarius Strobl  )
333*1f21f64aSMarius Strobl {
334*1f21f64aSMarius Strobl     uint8 roundingCode;
335*1f21f64aSMarius Strobl     int8 tininessCode;
336*1f21f64aSMarius Strobl 
337*1f21f64aSMarius Strobl     functionName = functions[ functionCode ].name;
338*1f21f64aSMarius Strobl     if ( roundingPrecision == 32 ) {
339*1f21f64aSMarius Strobl         roundingPrecisionName = "32";
340*1f21f64aSMarius Strobl     }
341*1f21f64aSMarius Strobl     else if ( roundingPrecision == 64 ) {
342*1f21f64aSMarius Strobl         roundingPrecisionName = "64";
343*1f21f64aSMarius Strobl     }
344*1f21f64aSMarius Strobl     else if ( roundingPrecision == 80 ) {
345*1f21f64aSMarius Strobl         roundingPrecisionName = "80";
346*1f21f64aSMarius Strobl     }
347*1f21f64aSMarius Strobl     else {
348*1f21f64aSMarius Strobl         roundingPrecisionName = 0;
349*1f21f64aSMarius Strobl     }
350*1f21f64aSMarius Strobl #ifdef FLOATX80
351*1f21f64aSMarius Strobl     floatx80_rounding_precision = roundingPrecision;
352*1f21f64aSMarius Strobl     slow_floatx80_rounding_precision = roundingPrecision;
353*1f21f64aSMarius Strobl #endif
354*1f21f64aSMarius Strobl     switch ( roundingMode ) {
355*1f21f64aSMarius Strobl      default:
356*1f21f64aSMarius Strobl         roundingModeName = 0;
357*1f21f64aSMarius Strobl         roundingCode = float_round_nearest_even;
358*1f21f64aSMarius Strobl         break;
359*1f21f64aSMarius Strobl      case ROUND_NEAREST_EVEN:
360*1f21f64aSMarius Strobl         roundingModeName = "nearest_even";
361*1f21f64aSMarius Strobl         roundingCode = float_round_nearest_even;
362*1f21f64aSMarius Strobl         break;
363*1f21f64aSMarius Strobl      case ROUND_TO_ZERO:
364*1f21f64aSMarius Strobl         roundingModeName = "to_zero";
365*1f21f64aSMarius Strobl         roundingCode = float_round_to_zero;
366*1f21f64aSMarius Strobl         break;
367*1f21f64aSMarius Strobl      case ROUND_DOWN:
368*1f21f64aSMarius Strobl         roundingModeName = "down";
369*1f21f64aSMarius Strobl         roundingCode = float_round_down;
370*1f21f64aSMarius Strobl         break;
371*1f21f64aSMarius Strobl      case ROUND_UP:
372*1f21f64aSMarius Strobl         roundingModeName = "up";
373*1f21f64aSMarius Strobl         roundingCode = float_round_up;
374*1f21f64aSMarius Strobl         break;
375*1f21f64aSMarius Strobl     }
376*1f21f64aSMarius Strobl     float_rounding_mode = roundingCode;
377*1f21f64aSMarius Strobl     slow_float_rounding_mode = roundingCode;
378*1f21f64aSMarius Strobl     switch ( tininessMode ) {
379*1f21f64aSMarius Strobl      default:
380*1f21f64aSMarius Strobl         tininessModeName = 0;
381*1f21f64aSMarius Strobl         tininessCode = float_tininess_after_rounding;
382*1f21f64aSMarius Strobl         break;
383*1f21f64aSMarius Strobl      case TININESS_BEFORE_ROUNDING:
384*1f21f64aSMarius Strobl         tininessModeName = "before";
385*1f21f64aSMarius Strobl         tininessCode = float_tininess_before_rounding;
386*1f21f64aSMarius Strobl         break;
387*1f21f64aSMarius Strobl      case TININESS_AFTER_ROUNDING:
388*1f21f64aSMarius Strobl         tininessModeName = "after";
389*1f21f64aSMarius Strobl         tininessCode = float_tininess_after_rounding;
390*1f21f64aSMarius Strobl         break;
391*1f21f64aSMarius Strobl     }
392*1f21f64aSMarius Strobl     float_detect_tininess = tininessCode;
393*1f21f64aSMarius Strobl     slow_float_detect_tininess = tininessCode;
394*1f21f64aSMarius Strobl     fputs( "Testing ", stderr );
395*1f21f64aSMarius Strobl     writeFunctionName( stderr );
396*1f21f64aSMarius Strobl     fputs( ".\n", stderr );
397*1f21f64aSMarius Strobl     switch ( functionCode ) {
398*1f21f64aSMarius Strobl      case INT32_TO_FLOAT32:
399*1f21f64aSMarius Strobl         test_a_int32_z_float32( slow_int32_to_float32, int32_to_float32 );
400*1f21f64aSMarius Strobl         break;
401*1f21f64aSMarius Strobl      case INT32_TO_FLOAT64:
402*1f21f64aSMarius Strobl         test_a_int32_z_float64( slow_int32_to_float64, int32_to_float64 );
403*1f21f64aSMarius Strobl         break;
404*1f21f64aSMarius Strobl #ifdef FLOATX80
405*1f21f64aSMarius Strobl      case INT32_TO_FLOATX80:
406*1f21f64aSMarius Strobl         test_a_int32_z_floatx80( slow_int32_to_floatx80, int32_to_floatx80 );
407*1f21f64aSMarius Strobl         break;
408*1f21f64aSMarius Strobl #endif
409*1f21f64aSMarius Strobl #ifdef FLOAT128
410*1f21f64aSMarius Strobl      case INT32_TO_FLOAT128:
411*1f21f64aSMarius Strobl         test_a_int32_z_float128( slow_int32_to_float128, int32_to_float128 );
412*1f21f64aSMarius Strobl         break;
413*1f21f64aSMarius Strobl #endif
414*1f21f64aSMarius Strobl #ifdef BITS64
415*1f21f64aSMarius Strobl      case INT64_TO_FLOAT32:
416*1f21f64aSMarius Strobl         test_a_int64_z_float32( slow_int64_to_float32, int64_to_float32 );
417*1f21f64aSMarius Strobl         break;
418*1f21f64aSMarius Strobl      case INT64_TO_FLOAT64:
419*1f21f64aSMarius Strobl         test_a_int64_z_float64( slow_int64_to_float64, int64_to_float64 );
420*1f21f64aSMarius Strobl         break;
421*1f21f64aSMarius Strobl #ifdef FLOATX80
422*1f21f64aSMarius Strobl      case INT64_TO_FLOATX80:
423*1f21f64aSMarius Strobl         test_a_int64_z_floatx80( slow_int64_to_floatx80, int64_to_floatx80 );
424*1f21f64aSMarius Strobl         break;
425*1f21f64aSMarius Strobl #endif
426*1f21f64aSMarius Strobl #ifdef FLOAT128
427*1f21f64aSMarius Strobl      case INT64_TO_FLOAT128:
428*1f21f64aSMarius Strobl         test_a_int64_z_float128( slow_int64_to_float128, int64_to_float128 );
429*1f21f64aSMarius Strobl         break;
430*1f21f64aSMarius Strobl #endif
431*1f21f64aSMarius Strobl #endif
432*1f21f64aSMarius Strobl      case FLOAT32_TO_INT32:
433*1f21f64aSMarius Strobl         test_a_float32_z_int32( slow_float32_to_int32, float32_to_int32 );
434*1f21f64aSMarius Strobl         break;
435*1f21f64aSMarius Strobl      case FLOAT32_TO_INT32_ROUND_TO_ZERO:
436*1f21f64aSMarius Strobl         test_a_float32_z_int32(
437*1f21f64aSMarius Strobl             slow_float32_to_int32_round_to_zero,
438*1f21f64aSMarius Strobl             float32_to_int32_round_to_zero
439*1f21f64aSMarius Strobl         );
440*1f21f64aSMarius Strobl         break;
441*1f21f64aSMarius Strobl #ifdef BITS64
442*1f21f64aSMarius Strobl      case FLOAT32_TO_INT64:
443*1f21f64aSMarius Strobl         test_a_float32_z_int64( slow_float32_to_int64, float32_to_int64 );
444*1f21f64aSMarius Strobl         break;
445*1f21f64aSMarius Strobl      case FLOAT32_TO_INT64_ROUND_TO_ZERO:
446*1f21f64aSMarius Strobl         test_a_float32_z_int64(
447*1f21f64aSMarius Strobl             slow_float32_to_int64_round_to_zero,
448*1f21f64aSMarius Strobl             float32_to_int64_round_to_zero
449*1f21f64aSMarius Strobl         );
450*1f21f64aSMarius Strobl         break;
451*1f21f64aSMarius Strobl #endif
452*1f21f64aSMarius Strobl      case FLOAT32_TO_FLOAT64:
453*1f21f64aSMarius Strobl         test_a_float32_z_float64(
454*1f21f64aSMarius Strobl             slow_float32_to_float64, float32_to_float64 );
455*1f21f64aSMarius Strobl         break;
456*1f21f64aSMarius Strobl #ifdef FLOATX80
457*1f21f64aSMarius Strobl      case FLOAT32_TO_FLOATX80:
458*1f21f64aSMarius Strobl         test_a_float32_z_floatx80(
459*1f21f64aSMarius Strobl             slow_float32_to_floatx80, float32_to_floatx80 );
460*1f21f64aSMarius Strobl         break;
461*1f21f64aSMarius Strobl #endif
462*1f21f64aSMarius Strobl #ifdef FLOAT128
463*1f21f64aSMarius Strobl      case FLOAT32_TO_FLOAT128:
464*1f21f64aSMarius Strobl         test_a_float32_z_float128(
465*1f21f64aSMarius Strobl             slow_float32_to_float128, float32_to_float128 );
466*1f21f64aSMarius Strobl         break;
467*1f21f64aSMarius Strobl #endif
468*1f21f64aSMarius Strobl      case FLOAT32_ROUND_TO_INT:
469*1f21f64aSMarius Strobl         test_az_float32( slow_float32_round_to_int, float32_round_to_int );
470*1f21f64aSMarius Strobl         break;
471*1f21f64aSMarius Strobl      case FLOAT32_ADD:
472*1f21f64aSMarius Strobl         test_abz_float32( slow_float32_add, float32_add );
473*1f21f64aSMarius Strobl         break;
474*1f21f64aSMarius Strobl      case FLOAT32_SUB:
475*1f21f64aSMarius Strobl         test_abz_float32( slow_float32_sub, float32_sub );
476*1f21f64aSMarius Strobl         break;
477*1f21f64aSMarius Strobl      case FLOAT32_MUL:
478*1f21f64aSMarius Strobl         test_abz_float32( slow_float32_mul, float32_mul );
479*1f21f64aSMarius Strobl         break;
480*1f21f64aSMarius Strobl      case FLOAT32_DIV:
481*1f21f64aSMarius Strobl         test_abz_float32( slow_float32_div, float32_div );
482*1f21f64aSMarius Strobl         break;
483*1f21f64aSMarius Strobl      case FLOAT32_REM:
484*1f21f64aSMarius Strobl         test_abz_float32( slow_float32_rem, float32_rem );
485*1f21f64aSMarius Strobl         break;
486*1f21f64aSMarius Strobl      case FLOAT32_SQRT:
487*1f21f64aSMarius Strobl         test_az_float32( slow_float32_sqrt, float32_sqrt );
488*1f21f64aSMarius Strobl         break;
489*1f21f64aSMarius Strobl      case FLOAT32_EQ:
490*1f21f64aSMarius Strobl         test_ab_float32_z_flag( slow_float32_eq, float32_eq );
491*1f21f64aSMarius Strobl         break;
492*1f21f64aSMarius Strobl      case FLOAT32_LE:
493*1f21f64aSMarius Strobl         test_ab_float32_z_flag( slow_float32_le, float32_le );
494*1f21f64aSMarius Strobl         break;
495*1f21f64aSMarius Strobl      case FLOAT32_LT:
496*1f21f64aSMarius Strobl         test_ab_float32_z_flag( slow_float32_lt, float32_lt );
497*1f21f64aSMarius Strobl         break;
498*1f21f64aSMarius Strobl      case FLOAT32_EQ_SIGNALING:
499*1f21f64aSMarius Strobl         test_ab_float32_z_flag(
500*1f21f64aSMarius Strobl             slow_float32_eq_signaling, float32_eq_signaling );
501*1f21f64aSMarius Strobl         break;
502*1f21f64aSMarius Strobl      case FLOAT32_LE_QUIET:
503*1f21f64aSMarius Strobl         test_ab_float32_z_flag( slow_float32_le_quiet, float32_le_quiet );
504*1f21f64aSMarius Strobl         break;
505*1f21f64aSMarius Strobl      case FLOAT32_LT_QUIET:
506*1f21f64aSMarius Strobl         test_ab_float32_z_flag( slow_float32_lt_quiet, float32_lt_quiet );
507*1f21f64aSMarius Strobl         break;
508*1f21f64aSMarius Strobl      case FLOAT64_TO_INT32:
509*1f21f64aSMarius Strobl         test_a_float64_z_int32( slow_float64_to_int32, float64_to_int32 );
510*1f21f64aSMarius Strobl         break;
511*1f21f64aSMarius Strobl      case FLOAT64_TO_INT32_ROUND_TO_ZERO:
512*1f21f64aSMarius Strobl         test_a_float64_z_int32(
513*1f21f64aSMarius Strobl             slow_float64_to_int32_round_to_zero,
514*1f21f64aSMarius Strobl             float64_to_int32_round_to_zero
515*1f21f64aSMarius Strobl         );
516*1f21f64aSMarius Strobl         break;
517*1f21f64aSMarius Strobl #ifdef BITS64
518*1f21f64aSMarius Strobl      case FLOAT64_TO_INT64:
519*1f21f64aSMarius Strobl         test_a_float64_z_int64( slow_float64_to_int64, float64_to_int64 );
520*1f21f64aSMarius Strobl         break;
521*1f21f64aSMarius Strobl      case FLOAT64_TO_INT64_ROUND_TO_ZERO:
522*1f21f64aSMarius Strobl         test_a_float64_z_int64(
523*1f21f64aSMarius Strobl             slow_float64_to_int64_round_to_zero,
524*1f21f64aSMarius Strobl             float64_to_int64_round_to_zero
525*1f21f64aSMarius Strobl         );
526*1f21f64aSMarius Strobl         break;
527*1f21f64aSMarius Strobl #endif
528*1f21f64aSMarius Strobl      case FLOAT64_TO_FLOAT32:
529*1f21f64aSMarius Strobl         test_a_float64_z_float32(
530*1f21f64aSMarius Strobl             slow_float64_to_float32, float64_to_float32 );
531*1f21f64aSMarius Strobl         break;
532*1f21f64aSMarius Strobl #ifdef FLOATX80
533*1f21f64aSMarius Strobl      case FLOAT64_TO_FLOATX80:
534*1f21f64aSMarius Strobl         test_a_float64_z_floatx80(
535*1f21f64aSMarius Strobl             slow_float64_to_floatx80, float64_to_floatx80 );
536*1f21f64aSMarius Strobl         break;
537*1f21f64aSMarius Strobl #endif
538*1f21f64aSMarius Strobl #ifdef FLOAT128
539*1f21f64aSMarius Strobl      case FLOAT64_TO_FLOAT128:
540*1f21f64aSMarius Strobl         test_a_float64_z_float128(
541*1f21f64aSMarius Strobl             slow_float64_to_float128, float64_to_float128 );
542*1f21f64aSMarius Strobl         break;
543*1f21f64aSMarius Strobl #endif
544*1f21f64aSMarius Strobl      case FLOAT64_ROUND_TO_INT:
545*1f21f64aSMarius Strobl         test_az_float64( slow_float64_round_to_int, float64_round_to_int );
546*1f21f64aSMarius Strobl         break;
547*1f21f64aSMarius Strobl      case FLOAT64_ADD:
548*1f21f64aSMarius Strobl         test_abz_float64( slow_float64_add, float64_add );
549*1f21f64aSMarius Strobl         break;
550*1f21f64aSMarius Strobl      case FLOAT64_SUB:
551*1f21f64aSMarius Strobl         test_abz_float64( slow_float64_sub, float64_sub );
552*1f21f64aSMarius Strobl         break;
553*1f21f64aSMarius Strobl      case FLOAT64_MUL:
554*1f21f64aSMarius Strobl         test_abz_float64( slow_float64_mul, float64_mul );
555*1f21f64aSMarius Strobl         break;
556*1f21f64aSMarius Strobl      case FLOAT64_DIV:
557*1f21f64aSMarius Strobl         test_abz_float64( slow_float64_div, float64_div );
558*1f21f64aSMarius Strobl         break;
559*1f21f64aSMarius Strobl      case FLOAT64_REM:
560*1f21f64aSMarius Strobl         test_abz_float64( slow_float64_rem, float64_rem );
561*1f21f64aSMarius Strobl         break;
562*1f21f64aSMarius Strobl      case FLOAT64_SQRT:
563*1f21f64aSMarius Strobl         test_az_float64( slow_float64_sqrt, float64_sqrt );
564*1f21f64aSMarius Strobl         break;
565*1f21f64aSMarius Strobl      case FLOAT64_EQ:
566*1f21f64aSMarius Strobl         test_ab_float64_z_flag( slow_float64_eq, float64_eq );
567*1f21f64aSMarius Strobl         break;
568*1f21f64aSMarius Strobl      case FLOAT64_LE:
569*1f21f64aSMarius Strobl         test_ab_float64_z_flag( slow_float64_le, float64_le );
570*1f21f64aSMarius Strobl         break;
571*1f21f64aSMarius Strobl      case FLOAT64_LT:
572*1f21f64aSMarius Strobl         test_ab_float64_z_flag( slow_float64_lt, float64_lt );
573*1f21f64aSMarius Strobl         break;
574*1f21f64aSMarius Strobl      case FLOAT64_EQ_SIGNALING:
575*1f21f64aSMarius Strobl         test_ab_float64_z_flag(
576*1f21f64aSMarius Strobl             slow_float64_eq_signaling, float64_eq_signaling );
577*1f21f64aSMarius Strobl         break;
578*1f21f64aSMarius Strobl      case FLOAT64_LE_QUIET:
579*1f21f64aSMarius Strobl         test_ab_float64_z_flag( slow_float64_le_quiet, float64_le_quiet );
580*1f21f64aSMarius Strobl         break;
581*1f21f64aSMarius Strobl      case FLOAT64_LT_QUIET:
582*1f21f64aSMarius Strobl         test_ab_float64_z_flag( slow_float64_lt_quiet, float64_lt_quiet );
583*1f21f64aSMarius Strobl         break;
584*1f21f64aSMarius Strobl #ifdef FLOATX80
585*1f21f64aSMarius Strobl      case FLOATX80_TO_INT32:
586*1f21f64aSMarius Strobl         test_a_floatx80_z_int32( slow_floatx80_to_int32, floatx80_to_int32 );
587*1f21f64aSMarius Strobl         break;
588*1f21f64aSMarius Strobl      case FLOATX80_TO_INT32_ROUND_TO_ZERO:
589*1f21f64aSMarius Strobl         test_a_floatx80_z_int32(
590*1f21f64aSMarius Strobl             slow_floatx80_to_int32_round_to_zero,
591*1f21f64aSMarius Strobl             floatx80_to_int32_round_to_zero
592*1f21f64aSMarius Strobl         );
593*1f21f64aSMarius Strobl         break;
594*1f21f64aSMarius Strobl #ifdef BITS64
595*1f21f64aSMarius Strobl      case FLOATX80_TO_INT64:
596*1f21f64aSMarius Strobl         test_a_floatx80_z_int64( slow_floatx80_to_int64, floatx80_to_int64 );
597*1f21f64aSMarius Strobl         break;
598*1f21f64aSMarius Strobl      case FLOATX80_TO_INT64_ROUND_TO_ZERO:
599*1f21f64aSMarius Strobl         test_a_floatx80_z_int64(
600*1f21f64aSMarius Strobl             slow_floatx80_to_int64_round_to_zero,
601*1f21f64aSMarius Strobl             floatx80_to_int64_round_to_zero
602*1f21f64aSMarius Strobl         );
603*1f21f64aSMarius Strobl         break;
604*1f21f64aSMarius Strobl #endif
605*1f21f64aSMarius Strobl      case FLOATX80_TO_FLOAT32:
606*1f21f64aSMarius Strobl         test_a_floatx80_z_float32(
607*1f21f64aSMarius Strobl             slow_floatx80_to_float32, floatx80_to_float32 );
608*1f21f64aSMarius Strobl         break;
609*1f21f64aSMarius Strobl      case FLOATX80_TO_FLOAT64:
610*1f21f64aSMarius Strobl         test_a_floatx80_z_float64(
611*1f21f64aSMarius Strobl             slow_floatx80_to_float64, floatx80_to_float64 );
612*1f21f64aSMarius Strobl         break;
613*1f21f64aSMarius Strobl #ifdef FLOAT128
614*1f21f64aSMarius Strobl      case FLOATX80_TO_FLOAT128:
615*1f21f64aSMarius Strobl         test_a_floatx80_z_float128(
616*1f21f64aSMarius Strobl             slow_floatx80_to_float128, floatx80_to_float128 );
617*1f21f64aSMarius Strobl         break;
618*1f21f64aSMarius Strobl #endif
619*1f21f64aSMarius Strobl      case FLOATX80_ROUND_TO_INT:
620*1f21f64aSMarius Strobl         test_az_floatx80( slow_floatx80_round_to_int, floatx80_round_to_int );
621*1f21f64aSMarius Strobl         break;
622*1f21f64aSMarius Strobl      case FLOATX80_ADD:
623*1f21f64aSMarius Strobl         test_abz_floatx80( slow_floatx80_add, floatx80_add );
624*1f21f64aSMarius Strobl         break;
625*1f21f64aSMarius Strobl      case FLOATX80_SUB:
626*1f21f64aSMarius Strobl         test_abz_floatx80( slow_floatx80_sub, floatx80_sub );
627*1f21f64aSMarius Strobl         break;
628*1f21f64aSMarius Strobl      case FLOATX80_MUL:
629*1f21f64aSMarius Strobl         test_abz_floatx80( slow_floatx80_mul, floatx80_mul );
630*1f21f64aSMarius Strobl         break;
631*1f21f64aSMarius Strobl      case FLOATX80_DIV:
632*1f21f64aSMarius Strobl         test_abz_floatx80( slow_floatx80_div, floatx80_div );
633*1f21f64aSMarius Strobl         break;
634*1f21f64aSMarius Strobl      case FLOATX80_REM:
635*1f21f64aSMarius Strobl         test_abz_floatx80( slow_floatx80_rem, floatx80_rem );
636*1f21f64aSMarius Strobl         break;
637*1f21f64aSMarius Strobl      case FLOATX80_SQRT:
638*1f21f64aSMarius Strobl         test_az_floatx80( slow_floatx80_sqrt, floatx80_sqrt );
639*1f21f64aSMarius Strobl         break;
640*1f21f64aSMarius Strobl      case FLOATX80_EQ:
641*1f21f64aSMarius Strobl         test_ab_floatx80_z_flag( slow_floatx80_eq, floatx80_eq );
642*1f21f64aSMarius Strobl         break;
643*1f21f64aSMarius Strobl      case FLOATX80_LE:
644*1f21f64aSMarius Strobl         test_ab_floatx80_z_flag( slow_floatx80_le, floatx80_le );
645*1f21f64aSMarius Strobl         break;
646*1f21f64aSMarius Strobl      case FLOATX80_LT:
647*1f21f64aSMarius Strobl         test_ab_floatx80_z_flag( slow_floatx80_lt, floatx80_lt );
648*1f21f64aSMarius Strobl         break;
649*1f21f64aSMarius Strobl      case FLOATX80_EQ_SIGNALING:
650*1f21f64aSMarius Strobl         test_ab_floatx80_z_flag(
651*1f21f64aSMarius Strobl             slow_floatx80_eq_signaling, floatx80_eq_signaling );
652*1f21f64aSMarius Strobl         break;
653*1f21f64aSMarius Strobl      case FLOATX80_LE_QUIET:
654*1f21f64aSMarius Strobl         test_ab_floatx80_z_flag( slow_floatx80_le_quiet, floatx80_le_quiet );
655*1f21f64aSMarius Strobl         break;
656*1f21f64aSMarius Strobl      case FLOATX80_LT_QUIET:
657*1f21f64aSMarius Strobl         test_ab_floatx80_z_flag( slow_floatx80_lt_quiet, floatx80_lt_quiet );
658*1f21f64aSMarius Strobl         break;
659*1f21f64aSMarius Strobl #endif
660*1f21f64aSMarius Strobl #ifdef FLOAT128
661*1f21f64aSMarius Strobl      case FLOAT128_TO_INT32:
662*1f21f64aSMarius Strobl         test_a_float128_z_int32( slow_float128_to_int32, float128_to_int32 );
663*1f21f64aSMarius Strobl         break;
664*1f21f64aSMarius Strobl      case FLOAT128_TO_INT32_ROUND_TO_ZERO:
665*1f21f64aSMarius Strobl         test_a_float128_z_int32(
666*1f21f64aSMarius Strobl             slow_float128_to_int32_round_to_zero,
667*1f21f64aSMarius Strobl             float128_to_int32_round_to_zero
668*1f21f64aSMarius Strobl         );
669*1f21f64aSMarius Strobl         break;
670*1f21f64aSMarius Strobl #ifdef BITS64
671*1f21f64aSMarius Strobl      case FLOAT128_TO_INT64:
672*1f21f64aSMarius Strobl         test_a_float128_z_int64( slow_float128_to_int64, float128_to_int64 );
673*1f21f64aSMarius Strobl         break;
674*1f21f64aSMarius Strobl      case FLOAT128_TO_INT64_ROUND_TO_ZERO:
675*1f21f64aSMarius Strobl         test_a_float128_z_int64(
676*1f21f64aSMarius Strobl             slow_float128_to_int64_round_to_zero,
677*1f21f64aSMarius Strobl             float128_to_int64_round_to_zero
678*1f21f64aSMarius Strobl         );
679*1f21f64aSMarius Strobl         break;
680*1f21f64aSMarius Strobl #endif
681*1f21f64aSMarius Strobl      case FLOAT128_TO_FLOAT32:
682*1f21f64aSMarius Strobl         test_a_float128_z_float32(
683*1f21f64aSMarius Strobl             slow_float128_to_float32, float128_to_float32 );
684*1f21f64aSMarius Strobl         break;
685*1f21f64aSMarius Strobl      case FLOAT128_TO_FLOAT64:
686*1f21f64aSMarius Strobl         test_a_float128_z_float64(
687*1f21f64aSMarius Strobl             slow_float128_to_float64, float128_to_float64 );
688*1f21f64aSMarius Strobl         break;
689*1f21f64aSMarius Strobl #ifdef FLOATX80
690*1f21f64aSMarius Strobl      case FLOAT128_TO_FLOATX80:
691*1f21f64aSMarius Strobl         test_a_float128_z_floatx80(
692*1f21f64aSMarius Strobl             slow_float128_to_floatx80, float128_to_floatx80 );
693*1f21f64aSMarius Strobl         break;
694*1f21f64aSMarius Strobl #endif
695*1f21f64aSMarius Strobl      case FLOAT128_ROUND_TO_INT:
696*1f21f64aSMarius Strobl         test_az_float128( slow_float128_round_to_int, float128_round_to_int );
697*1f21f64aSMarius Strobl         break;
698*1f21f64aSMarius Strobl      case FLOAT128_ADD:
699*1f21f64aSMarius Strobl         test_abz_float128( slow_float128_add, float128_add );
700*1f21f64aSMarius Strobl         break;
701*1f21f64aSMarius Strobl      case FLOAT128_SUB:
702*1f21f64aSMarius Strobl         test_abz_float128( slow_float128_sub, float128_sub );
703*1f21f64aSMarius Strobl         break;
704*1f21f64aSMarius Strobl      case FLOAT128_MUL:
705*1f21f64aSMarius Strobl         test_abz_float128( slow_float128_mul, float128_mul );
706*1f21f64aSMarius Strobl         break;
707*1f21f64aSMarius Strobl      case FLOAT128_DIV:
708*1f21f64aSMarius Strobl         test_abz_float128( slow_float128_div, float128_div );
709*1f21f64aSMarius Strobl         break;
710*1f21f64aSMarius Strobl      case FLOAT128_REM:
711*1f21f64aSMarius Strobl         test_abz_float128( slow_float128_rem, float128_rem );
712*1f21f64aSMarius Strobl         break;
713*1f21f64aSMarius Strobl      case FLOAT128_SQRT:
714*1f21f64aSMarius Strobl         test_az_float128( slow_float128_sqrt, float128_sqrt );
715*1f21f64aSMarius Strobl         break;
716*1f21f64aSMarius Strobl      case FLOAT128_EQ:
717*1f21f64aSMarius Strobl         test_ab_float128_z_flag( slow_float128_eq, float128_eq );
718*1f21f64aSMarius Strobl         break;
719*1f21f64aSMarius Strobl      case FLOAT128_LE:
720*1f21f64aSMarius Strobl         test_ab_float128_z_flag( slow_float128_le, float128_le );
721*1f21f64aSMarius Strobl         break;
722*1f21f64aSMarius Strobl      case FLOAT128_LT:
723*1f21f64aSMarius Strobl         test_ab_float128_z_flag( slow_float128_lt, float128_lt );
724*1f21f64aSMarius Strobl         break;
725*1f21f64aSMarius Strobl      case FLOAT128_EQ_SIGNALING:
726*1f21f64aSMarius Strobl         test_ab_float128_z_flag(
727*1f21f64aSMarius Strobl             slow_float128_eq_signaling, float128_eq_signaling );
728*1f21f64aSMarius Strobl         break;
729*1f21f64aSMarius Strobl      case FLOAT128_LE_QUIET:
730*1f21f64aSMarius Strobl         test_ab_float128_z_flag( slow_float128_le_quiet, float128_le_quiet );
731*1f21f64aSMarius Strobl         break;
732*1f21f64aSMarius Strobl      case FLOAT128_LT_QUIET:
733*1f21f64aSMarius Strobl         test_ab_float128_z_flag( slow_float128_lt_quiet, float128_lt_quiet );
734*1f21f64aSMarius Strobl         break;
735*1f21f64aSMarius Strobl #endif
736*1f21f64aSMarius Strobl     }
737*1f21f64aSMarius Strobl     if ( ( errorStop && anyErrors ) || stop ) exitWithStatus();
738*1f21f64aSMarius Strobl 
739*1f21f64aSMarius Strobl }
740*1f21f64aSMarius Strobl 
741*1f21f64aSMarius Strobl static void
testFunction(uint8 functionCode,int8 roundingPrecisionIn,int8 roundingModeIn,int8 tininessModeIn)742*1f21f64aSMarius Strobl  testFunction(
743*1f21f64aSMarius Strobl      uint8 functionCode,
744*1f21f64aSMarius Strobl      int8 roundingPrecisionIn,
745*1f21f64aSMarius Strobl      int8 roundingModeIn,
746*1f21f64aSMarius Strobl      int8 tininessModeIn
747*1f21f64aSMarius Strobl  )
748*1f21f64aSMarius Strobl {
749*1f21f64aSMarius Strobl     int8 roundingPrecision, roundingMode, tininessMode;
750*1f21f64aSMarius Strobl 
751*1f21f64aSMarius Strobl     roundingPrecision = 32;
752*1f21f64aSMarius Strobl     for (;;) {
753*1f21f64aSMarius Strobl         if ( ! functions[ functionCode ].roundingPrecision ) {
754*1f21f64aSMarius Strobl             roundingPrecision = 0;
755*1f21f64aSMarius Strobl         }
756*1f21f64aSMarius Strobl         else if ( roundingPrecisionIn ) {
757*1f21f64aSMarius Strobl             roundingPrecision = roundingPrecisionIn;
758*1f21f64aSMarius Strobl         }
759*1f21f64aSMarius Strobl         for ( roundingMode = 1;
760*1f21f64aSMarius Strobl               roundingMode < NUM_ROUNDINGMODES;
761*1f21f64aSMarius Strobl               ++roundingMode
762*1f21f64aSMarius Strobl             ) {
763*1f21f64aSMarius Strobl             if ( ! functions[ functionCode ].roundingMode ) {
764*1f21f64aSMarius Strobl                 roundingMode = 0;
765*1f21f64aSMarius Strobl             }
766*1f21f64aSMarius Strobl             else if ( roundingModeIn ) {
767*1f21f64aSMarius Strobl                 roundingMode = roundingModeIn;
768*1f21f64aSMarius Strobl             }
769*1f21f64aSMarius Strobl             for ( tininessMode = 1;
770*1f21f64aSMarius Strobl                   tininessMode < NUM_TININESSMODES;
771*1f21f64aSMarius Strobl                   ++tininessMode
772*1f21f64aSMarius Strobl                 ) {
773*1f21f64aSMarius Strobl                 if (    ( roundingPrecision == 32 )
774*1f21f64aSMarius Strobl                      || ( roundingPrecision == 64 ) ) {
775*1f21f64aSMarius Strobl                     if ( ! functions[ functionCode ]
776*1f21f64aSMarius Strobl                                .tininessModeAtReducedPrecision
777*1f21f64aSMarius Strobl                        ) {
778*1f21f64aSMarius Strobl                         tininessMode = 0;
779*1f21f64aSMarius Strobl                     }
780*1f21f64aSMarius Strobl                     else if ( tininessModeIn ) {
781*1f21f64aSMarius Strobl                         tininessMode = tininessModeIn;
782*1f21f64aSMarius Strobl                     }
783*1f21f64aSMarius Strobl                 }
784*1f21f64aSMarius Strobl                 else {
785*1f21f64aSMarius Strobl                     if ( ! functions[ functionCode ].tininessMode ) {
786*1f21f64aSMarius Strobl                         tininessMode = 0;
787*1f21f64aSMarius Strobl                     }
788*1f21f64aSMarius Strobl                     else if ( tininessModeIn ) {
789*1f21f64aSMarius Strobl                         tininessMode = tininessModeIn;
790*1f21f64aSMarius Strobl                     }
791*1f21f64aSMarius Strobl                 }
792*1f21f64aSMarius Strobl                 testFunctionVariety(
793*1f21f64aSMarius Strobl                     functionCode, roundingPrecision, roundingMode, tininessMode
794*1f21f64aSMarius Strobl                 );
795*1f21f64aSMarius Strobl                 if ( tininessModeIn || ! tininessMode ) break;
796*1f21f64aSMarius Strobl             }
797*1f21f64aSMarius Strobl             if ( roundingModeIn || ! roundingMode ) break;
798*1f21f64aSMarius Strobl         }
799*1f21f64aSMarius Strobl         if ( roundingPrecisionIn || ! roundingPrecision ) break;
800*1f21f64aSMarius Strobl         if ( roundingPrecision == 80 ) {
801*1f21f64aSMarius Strobl             break;
802*1f21f64aSMarius Strobl         }
803*1f21f64aSMarius Strobl         else if ( roundingPrecision == 64 ) {
804*1f21f64aSMarius Strobl             roundingPrecision = 80;
805*1f21f64aSMarius Strobl         }
806*1f21f64aSMarius Strobl         else if ( roundingPrecision == 32 ) {
807*1f21f64aSMarius Strobl             roundingPrecision = 64;
808*1f21f64aSMarius Strobl         }
809*1f21f64aSMarius Strobl     }
810*1f21f64aSMarius Strobl 
811*1f21f64aSMarius Strobl }
812*1f21f64aSMarius Strobl 
813*1f21f64aSMarius Strobl int
main(int argc,char ** argv)814*1f21f64aSMarius Strobl main( int argc, char **argv )
815*1f21f64aSMarius Strobl {
816*1f21f64aSMarius Strobl     char *argPtr;
817*1f21f64aSMarius Strobl     flag functionArgument;
818*1f21f64aSMarius Strobl     uint8 functionCode;
819*1f21f64aSMarius Strobl     int8 operands, roundingPrecision, roundingMode, tininessMode;
820*1f21f64aSMarius Strobl 
821*1f21f64aSMarius Strobl     fail_programName = "testsoftfloat";
822*1f21f64aSMarius Strobl     if ( argc <= 1 ) goto writeHelpMessage;
823*1f21f64aSMarius Strobl     testCases_setLevel( 1 );
824*1f21f64aSMarius Strobl     trueName = "true";
825*1f21f64aSMarius Strobl     testName = "soft";
826*1f21f64aSMarius Strobl     errorStop = FALSE;
827*1f21f64aSMarius Strobl     forever = FALSE;
828*1f21f64aSMarius Strobl     maxErrorCount = 20;
829*1f21f64aSMarius Strobl     trueFlagsPtr = &slow_float_exception_flags;
830*1f21f64aSMarius Strobl     testFlagsFunctionPtr = clearFlags;
831*1f21f64aSMarius Strobl     functionArgument = FALSE;
832*1f21f64aSMarius Strobl     functionCode = 0;
833*1f21f64aSMarius Strobl     operands = 0;
834*1f21f64aSMarius Strobl     roundingPrecision = 0;
835*1f21f64aSMarius Strobl     roundingMode = 0;
836*1f21f64aSMarius Strobl     tininessMode = 0;
837*1f21f64aSMarius Strobl     --argc;
838*1f21f64aSMarius Strobl     ++argv;
839*1f21f64aSMarius Strobl     while ( argc && ( argPtr = argv[ 0 ] ) ) {
840*1f21f64aSMarius Strobl         if ( argPtr[ 0 ] == '-' ) ++argPtr;
841*1f21f64aSMarius Strobl         if ( strcmp( argPtr, "help" ) == 0 ) {
842*1f21f64aSMarius Strobl  writeHelpMessage:
843*1f21f64aSMarius Strobl             fputs(
844*1f21f64aSMarius Strobl "testsoftfloat [<option>...] <function>\n"
845*1f21f64aSMarius Strobl "  <option>:  (* is default)\n"
846*1f21f64aSMarius Strobl "    -help            --Write this message and exit.\n"
847*1f21f64aSMarius Strobl "    -level <num>     --Testing level <num> (1 or 2).\n"
848*1f21f64aSMarius Strobl " *  -level 1\n"
849*1f21f64aSMarius Strobl "    -errors <num>    --Stop each function test after <num> errors.\n"
850*1f21f64aSMarius Strobl " *  -errors 20\n"
851*1f21f64aSMarius Strobl "    -errorstop       --Exit after first function with any error.\n"
852*1f21f64aSMarius Strobl "    -forever         --Test one function repeatedly (implies `-level 2').\n"
853*1f21f64aSMarius Strobl #ifdef FLOATX80
854*1f21f64aSMarius Strobl "    -precision32     --Only test rounding precision equivalent to float32.\n"
855*1f21f64aSMarius Strobl "    -precision64     --Only test rounding precision equivalent to float64.\n"
856*1f21f64aSMarius Strobl "    -precision80     --Only test maximum rounding precision.\n"
857*1f21f64aSMarius Strobl #endif
858*1f21f64aSMarius Strobl "    -nearesteven     --Only test rounding to nearest/even.\n"
859*1f21f64aSMarius Strobl "    -tozero          --Only test rounding to zero.\n"
860*1f21f64aSMarius Strobl "    -down            --Only test rounding down.\n"
861*1f21f64aSMarius Strobl "    -up              --Only test rounding up.\n"
862*1f21f64aSMarius Strobl "    -tininessbefore  --Only test underflow tininess before rounding.\n"
863*1f21f64aSMarius Strobl "    -tininessafter   --Only test underflow tininess after rounding.\n"
864*1f21f64aSMarius Strobl "  <function>:\n"
865*1f21f64aSMarius Strobl "    int32_to_<float>                 <float>_add   <float>_eq\n"
866*1f21f64aSMarius Strobl "    <float>_to_int32                 <float>_sub   <float>_le\n"
867*1f21f64aSMarius Strobl "    <float>_to_int32_round_to_zero   <float>_mul   <float>_lt\n"
868*1f21f64aSMarius Strobl #ifdef BITS64
869*1f21f64aSMarius Strobl "    int64_to_<float>                 <float>_div   <float>_eq_signaling\n"
870*1f21f64aSMarius Strobl "    <float>_to_int64                 <float>_rem   <float>_le_quiet\n"
871*1f21f64aSMarius Strobl "    <float>_to_int64_round_to_zero                 <float>_lt_quiet\n"
872*1f21f64aSMarius Strobl "    <float>_to_<float>\n"
873*1f21f64aSMarius Strobl "    <float>_round_to_int\n"
874*1f21f64aSMarius Strobl "    <float>_sqrt\n"
875*1f21f64aSMarius Strobl #else
876*1f21f64aSMarius Strobl "    <float>_to_<float>               <float>_div   <float>_eq_signaling\n"
877*1f21f64aSMarius Strobl "    <float>_round_to_int             <float>_rem   <float>_le_quiet\n"
878*1f21f64aSMarius Strobl "    <float>_sqrt                                   <float>_lt_quiet\n"
879*1f21f64aSMarius Strobl #endif
880*1f21f64aSMarius Strobl "    -all1            --All 1-operand functions.\n"
881*1f21f64aSMarius Strobl "    -all2            --All 2-operand functions.\n"
882*1f21f64aSMarius Strobl "    -all             --All functions.\n"
883*1f21f64aSMarius Strobl "  <float>:\n"
884*1f21f64aSMarius Strobl "    float32          --Single precision.\n"
885*1f21f64aSMarius Strobl "    float64          --Double precision.\n"
886*1f21f64aSMarius Strobl #ifdef FLOATX80
887*1f21f64aSMarius Strobl "    floatx80         --Extended double precision.\n"
888*1f21f64aSMarius Strobl #endif
889*1f21f64aSMarius Strobl #ifdef FLOAT128
890*1f21f64aSMarius Strobl "    float128         --Quadruple precision.\n"
891*1f21f64aSMarius Strobl #endif
892*1f21f64aSMarius Strobl                 ,
893*1f21f64aSMarius Strobl                 stdout
894*1f21f64aSMarius Strobl             );
895*1f21f64aSMarius Strobl             return EXIT_SUCCESS;
896*1f21f64aSMarius Strobl         }
897*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "level" ) == 0 ) {
898*1f21f64aSMarius Strobl             if ( argc < 2 ) goto optionError;
899*1f21f64aSMarius Strobl             testCases_setLevel( atoi( argv[ 1 ] ) );
900*1f21f64aSMarius Strobl             --argc;
901*1f21f64aSMarius Strobl             ++argv;
902*1f21f64aSMarius Strobl         }
903*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "level1" ) == 0 ) {
904*1f21f64aSMarius Strobl             testCases_setLevel( 1 );
905*1f21f64aSMarius Strobl         }
906*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "level2" ) == 0 ) {
907*1f21f64aSMarius Strobl             testCases_setLevel( 2 );
908*1f21f64aSMarius Strobl         }
909*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "errors" ) == 0 ) {
910*1f21f64aSMarius Strobl             if ( argc < 2 ) {
911*1f21f64aSMarius Strobl      optionError:
912*1f21f64aSMarius Strobl                 fail( "`%s' option requires numeric argument", argv[ 0 ] );
913*1f21f64aSMarius Strobl             }
914*1f21f64aSMarius Strobl             maxErrorCount = atoi( argv[ 1 ] );
915*1f21f64aSMarius Strobl             --argc;
916*1f21f64aSMarius Strobl             ++argv;
917*1f21f64aSMarius Strobl         }
918*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "errorstop" ) == 0 ) {
919*1f21f64aSMarius Strobl             errorStop = TRUE;
920*1f21f64aSMarius Strobl         }
921*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "forever" ) == 0 ) {
922*1f21f64aSMarius Strobl             testCases_setLevel( 2 );
923*1f21f64aSMarius Strobl             forever = TRUE;
924*1f21f64aSMarius Strobl         }
925*1f21f64aSMarius Strobl #ifdef FLOATX80
926*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "precision32" ) == 0 ) {
927*1f21f64aSMarius Strobl             roundingPrecision = 32;
928*1f21f64aSMarius Strobl         }
929*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "precision64" ) == 0 ) {
930*1f21f64aSMarius Strobl             roundingPrecision = 64;
931*1f21f64aSMarius Strobl         }
932*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "precision80" ) == 0 ) {
933*1f21f64aSMarius Strobl             roundingPrecision = 80;
934*1f21f64aSMarius Strobl         }
935*1f21f64aSMarius Strobl #endif
936*1f21f64aSMarius Strobl         else if (    ( strcmp( argPtr, "nearesteven" ) == 0 )
937*1f21f64aSMarius Strobl                   || ( strcmp( argPtr, "nearest_even" ) == 0 ) ) {
938*1f21f64aSMarius Strobl             roundingMode = ROUND_NEAREST_EVEN;
939*1f21f64aSMarius Strobl         }
940*1f21f64aSMarius Strobl         else if (    ( strcmp( argPtr, "tozero" ) == 0 )
941*1f21f64aSMarius Strobl                   || ( strcmp( argPtr, "to_zero" ) == 0 ) ) {
942*1f21f64aSMarius Strobl             roundingMode = ROUND_TO_ZERO;
943*1f21f64aSMarius Strobl         }
944*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "down" ) == 0 ) {
945*1f21f64aSMarius Strobl             roundingMode = ROUND_DOWN;
946*1f21f64aSMarius Strobl         }
947*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "up" ) == 0 ) {
948*1f21f64aSMarius Strobl             roundingMode = ROUND_UP;
949*1f21f64aSMarius Strobl         }
950*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "tininessbefore" ) == 0 ) {
951*1f21f64aSMarius Strobl             tininessMode = TININESS_BEFORE_ROUNDING;
952*1f21f64aSMarius Strobl         }
953*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "tininessafter" ) == 0 ) {
954*1f21f64aSMarius Strobl             tininessMode = TININESS_AFTER_ROUNDING;
955*1f21f64aSMarius Strobl         }
956*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "all1" ) == 0 ) {
957*1f21f64aSMarius Strobl             functionArgument = TRUE;
958*1f21f64aSMarius Strobl             functionCode = 0;
959*1f21f64aSMarius Strobl             operands = 1;
960*1f21f64aSMarius Strobl         }
961*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "all2" ) == 0 ) {
962*1f21f64aSMarius Strobl             functionArgument = TRUE;
963*1f21f64aSMarius Strobl             functionCode = 0;
964*1f21f64aSMarius Strobl             operands = 2;
965*1f21f64aSMarius Strobl         }
966*1f21f64aSMarius Strobl         else if ( strcmp( argPtr, "all" ) == 0 ) {
967*1f21f64aSMarius Strobl             functionArgument = TRUE;
968*1f21f64aSMarius Strobl             functionCode = 0;
969*1f21f64aSMarius Strobl             operands = 0;
970*1f21f64aSMarius Strobl         }
971*1f21f64aSMarius Strobl         else {
972*1f21f64aSMarius Strobl             for ( functionCode = 1;
973*1f21f64aSMarius Strobl                   functionCode < NUM_FUNCTIONS;
974*1f21f64aSMarius Strobl                   ++functionCode
975*1f21f64aSMarius Strobl                 ) {
976*1f21f64aSMarius Strobl                 if ( strcmp( argPtr, functions[ functionCode ].name ) == 0 ) {
977*1f21f64aSMarius Strobl                     break;
978*1f21f64aSMarius Strobl                 }
979*1f21f64aSMarius Strobl             }
980*1f21f64aSMarius Strobl             if ( functionCode == NUM_FUNCTIONS ) {
981*1f21f64aSMarius Strobl                 fail( "Invalid option or function `%s'", argv[ 0 ] );
982*1f21f64aSMarius Strobl             }
983*1f21f64aSMarius Strobl             functionArgument = TRUE;
984*1f21f64aSMarius Strobl         }
985*1f21f64aSMarius Strobl         --argc;
986*1f21f64aSMarius Strobl         ++argv;
987*1f21f64aSMarius Strobl     }
988*1f21f64aSMarius Strobl     if ( ! functionArgument ) fail( "Function argument required" );
989*1f21f64aSMarius Strobl     (void) signal( SIGINT, catchSIGINT );
990*1f21f64aSMarius Strobl     (void) signal( SIGTERM, catchSIGINT );
991*1f21f64aSMarius Strobl     if ( functionCode ) {
992*1f21f64aSMarius Strobl         if ( forever ) {
993*1f21f64aSMarius Strobl             if ( ! roundingPrecision ) roundingPrecision = 80;
994*1f21f64aSMarius Strobl             if ( ! roundingMode ) roundingMode = ROUND_NEAREST_EVEN;
995*1f21f64aSMarius Strobl         }
996*1f21f64aSMarius Strobl         testFunction(
997*1f21f64aSMarius Strobl             functionCode, roundingPrecision, roundingMode, tininessMode );
998*1f21f64aSMarius Strobl     }
999*1f21f64aSMarius Strobl     else {
1000*1f21f64aSMarius Strobl         if ( operands == 1 ) {
1001*1f21f64aSMarius Strobl             for ( functionCode = 1;
1002*1f21f64aSMarius Strobl                   functionCode < NUM_FUNCTIONS;
1003*1f21f64aSMarius Strobl                   ++functionCode
1004*1f21f64aSMarius Strobl                 ) {
1005*1f21f64aSMarius Strobl                 if ( functions[ functionCode ].numInputs == 1 ) {
1006*1f21f64aSMarius Strobl                     testFunction(
1007*1f21f64aSMarius Strobl                         functionCode,
1008*1f21f64aSMarius Strobl                         roundingPrecision,
1009*1f21f64aSMarius Strobl                         roundingMode,
1010*1f21f64aSMarius Strobl                         tininessMode
1011*1f21f64aSMarius Strobl                     );
1012*1f21f64aSMarius Strobl                 }
1013*1f21f64aSMarius Strobl             }
1014*1f21f64aSMarius Strobl         }
1015*1f21f64aSMarius Strobl         else if ( operands == 2 ) {
1016*1f21f64aSMarius Strobl             for ( functionCode = 1;
1017*1f21f64aSMarius Strobl                   functionCode < NUM_FUNCTIONS;
1018*1f21f64aSMarius Strobl                   ++functionCode
1019*1f21f64aSMarius Strobl                 ) {
1020*1f21f64aSMarius Strobl                 if ( functions[ functionCode ].numInputs == 2 ) {
1021*1f21f64aSMarius Strobl                     testFunction(
1022*1f21f64aSMarius Strobl                         functionCode,
1023*1f21f64aSMarius Strobl                         roundingPrecision,
1024*1f21f64aSMarius Strobl                         roundingMode,
1025*1f21f64aSMarius Strobl                         tininessMode
1026*1f21f64aSMarius Strobl                     );
1027*1f21f64aSMarius Strobl                 }
1028*1f21f64aSMarius Strobl             }
1029*1f21f64aSMarius Strobl         }
1030*1f21f64aSMarius Strobl         else {
1031*1f21f64aSMarius Strobl             for ( functionCode = 1;
1032*1f21f64aSMarius Strobl                   functionCode < NUM_FUNCTIONS;
1033*1f21f64aSMarius Strobl                   ++functionCode
1034*1f21f64aSMarius Strobl                 ) {
1035*1f21f64aSMarius Strobl                 testFunction(
1036*1f21f64aSMarius Strobl                     functionCode, roundingPrecision, roundingMode, tininessMode
1037*1f21f64aSMarius Strobl                 );
1038*1f21f64aSMarius Strobl             }
1039*1f21f64aSMarius Strobl         }
1040*1f21f64aSMarius Strobl     }
1041*1f21f64aSMarius Strobl     exitWithStatus();
1042*1f21f64aSMarius Strobl 
1043*1f21f64aSMarius Strobl }
1044*1f21f64aSMarius Strobl 
1045