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