xref: /minix3/lib/libc/softfloat/timesoftfloat.c (revision 2fe8fb192fe7e8720e3e7a77f928da545e872a6a)
1*2fe8fb19SBen Gras /* $NetBSD: timesoftfloat.c,v 1.1 2000/06/06 08:15:11 bjh21 Exp $ */
2*2fe8fb19SBen Gras 
3*2fe8fb19SBen Gras /*
4*2fe8fb19SBen Gras ===============================================================================
5*2fe8fb19SBen Gras 
6*2fe8fb19SBen Gras This C source file is part of the SoftFloat IEC/IEEE Floating-point
7*2fe8fb19SBen Gras Arithmetic Package, Release 2a.
8*2fe8fb19SBen Gras 
9*2fe8fb19SBen Gras Written by John R. Hauser.  This work was made possible in part by the
10*2fe8fb19SBen Gras International Computer Science Institute, located at Suite 600, 1947 Center
11*2fe8fb19SBen Gras Street, Berkeley, California 94704.  Funding was partially provided by the
12*2fe8fb19SBen Gras National Science Foundation under grant MIP-9311980.  The original version
13*2fe8fb19SBen Gras of this code was written as part of a project to build a fixed-point vector
14*2fe8fb19SBen Gras processor in collaboration with the University of California at Berkeley,
15*2fe8fb19SBen Gras overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
16*2fe8fb19SBen Gras is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
17*2fe8fb19SBen Gras arithmetic/SoftFloat.html'.
18*2fe8fb19SBen Gras 
19*2fe8fb19SBen Gras THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
20*2fe8fb19SBen Gras has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
21*2fe8fb19SBen Gras TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
22*2fe8fb19SBen Gras PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
23*2fe8fb19SBen Gras AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
24*2fe8fb19SBen Gras 
25*2fe8fb19SBen Gras Derivative works are acceptable, even for commercial purposes, so long as
26*2fe8fb19SBen Gras (1) they include prominent notice that the work is derivative, and (2) they
27*2fe8fb19SBen Gras include prominent notice akin to these four paragraphs for those parts of
28*2fe8fb19SBen Gras this code that are retained.
29*2fe8fb19SBen Gras 
30*2fe8fb19SBen Gras ===============================================================================
31*2fe8fb19SBen Gras */
32*2fe8fb19SBen Gras 
33*2fe8fb19SBen Gras #include <sys/cdefs.h>
34*2fe8fb19SBen Gras #if defined(LIBC_SCCS) && !defined(lint)
35*2fe8fb19SBen Gras __RCSID("$NetBSD: timesoftfloat.c,v 1.1 2000/06/06 08:15:11 bjh21 Exp $");
36*2fe8fb19SBen Gras #endif /* LIBC_SCCS and not lint */
37*2fe8fb19SBen Gras 
38*2fe8fb19SBen Gras #include <stdlib.h>
39*2fe8fb19SBen Gras #include <stdarg.h>
40*2fe8fb19SBen Gras #include <string.h>
41*2fe8fb19SBen Gras #include <stdio.h>
42*2fe8fb19SBen Gras #include <time.h>
43*2fe8fb19SBen Gras #include "milieu.h"
44*2fe8fb19SBen Gras #include "softfloat.h"
45*2fe8fb19SBen Gras 
46*2fe8fb19SBen Gras enum {
47*2fe8fb19SBen Gras     minIterations = 1000
48*2fe8fb19SBen Gras };
49*2fe8fb19SBen Gras 
fail(const char * message,...)50*2fe8fb19SBen Gras static void fail( const char *message, ... )
51*2fe8fb19SBen Gras {
52*2fe8fb19SBen Gras     va_list varArgs;
53*2fe8fb19SBen Gras 
54*2fe8fb19SBen Gras     fputs( "timesoftfloat: ", stderr );
55*2fe8fb19SBen Gras     va_start( varArgs, message );
56*2fe8fb19SBen Gras     vfprintf( stderr, message, varArgs );
57*2fe8fb19SBen Gras     va_end( varArgs );
58*2fe8fb19SBen Gras     fputs( ".\n", stderr );
59*2fe8fb19SBen Gras     exit( EXIT_FAILURE );
60*2fe8fb19SBen Gras 
61*2fe8fb19SBen Gras }
62*2fe8fb19SBen Gras 
63*2fe8fb19SBen Gras static char *functionName;
64*2fe8fb19SBen Gras static char *roundingPrecisionName, *roundingModeName, *tininessModeName;
65*2fe8fb19SBen Gras 
reportTime(int32 count,long clocks)66*2fe8fb19SBen Gras static void reportTime( int32 count, long clocks )
67*2fe8fb19SBen Gras {
68*2fe8fb19SBen Gras 
69*2fe8fb19SBen Gras     printf(
70*2fe8fb19SBen Gras         "%8.1f kops/s: %s",
71*2fe8fb19SBen Gras         ( count / ( ( (float) clocks ) / CLOCKS_PER_SEC ) ) / 1000,
72*2fe8fb19SBen Gras         functionName
73*2fe8fb19SBen Gras     );
74*2fe8fb19SBen Gras     if ( roundingModeName ) {
75*2fe8fb19SBen Gras         if ( roundingPrecisionName ) {
76*2fe8fb19SBen Gras             fputs( ", precision ", stdout );
77*2fe8fb19SBen Gras             fputs( roundingPrecisionName, stdout );
78*2fe8fb19SBen Gras         }
79*2fe8fb19SBen Gras         fputs( ", rounding ", stdout );
80*2fe8fb19SBen Gras         fputs( roundingModeName, stdout );
81*2fe8fb19SBen Gras         if ( tininessModeName ) {
82*2fe8fb19SBen Gras             fputs( ", tininess ", stdout );
83*2fe8fb19SBen Gras             fputs( tininessModeName, stdout );
84*2fe8fb19SBen Gras             fputs( " rounding", stdout );
85*2fe8fb19SBen Gras         }
86*2fe8fb19SBen Gras     }
87*2fe8fb19SBen Gras     fputc( '\n', stdout );
88*2fe8fb19SBen Gras 
89*2fe8fb19SBen Gras }
90*2fe8fb19SBen Gras 
91*2fe8fb19SBen Gras enum {
92*2fe8fb19SBen Gras     numInputs_int32 = 32
93*2fe8fb19SBen Gras };
94*2fe8fb19SBen Gras 
95*2fe8fb19SBen Gras static const int32 inputs_int32[ numInputs_int32 ] = {
96*2fe8fb19SBen Gras     0xFFFFBB79, 0x405CF80F, 0x00000000, 0xFFFFFD04,
97*2fe8fb19SBen Gras     0xFFF20002, 0x0C8EF795, 0xF00011FF, 0x000006CA,
98*2fe8fb19SBen Gras     0x00009BFE, 0xFF4862E3, 0x9FFFEFFE, 0xFFFFFFB7,
99*2fe8fb19SBen Gras     0x0BFF7FFF, 0x0000F37A, 0x0011DFFE, 0x00000006,
100*2fe8fb19SBen Gras     0xFFF02006, 0xFFFFF7D1, 0x10200003, 0xDE8DF765,
101*2fe8fb19SBen Gras     0x00003E02, 0x000019E8, 0x0008FFFE, 0xFFFFFB5C,
102*2fe8fb19SBen Gras     0xFFDF7FFE, 0x07C42FBF, 0x0FFFE3FF, 0x040B9F13,
103*2fe8fb19SBen Gras     0xBFFFFFF8, 0x0001BF56, 0x000017F6, 0x000A908A
104*2fe8fb19SBen Gras };
105*2fe8fb19SBen Gras 
time_a_int32_z_float32(float32 function (int32))106*2fe8fb19SBen Gras static void time_a_int32_z_float32( float32 function( int32 ) )
107*2fe8fb19SBen Gras {
108*2fe8fb19SBen Gras     clock_t startClock, endClock;
109*2fe8fb19SBen Gras     int32 count, i;
110*2fe8fb19SBen Gras     int8 inputNum;
111*2fe8fb19SBen Gras 
112*2fe8fb19SBen Gras     count = 0;
113*2fe8fb19SBen Gras     inputNum = 0;
114*2fe8fb19SBen Gras     startClock = clock();
115*2fe8fb19SBen Gras     do {
116*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
117*2fe8fb19SBen Gras             function( inputs_int32[ inputNum ] );
118*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
119*2fe8fb19SBen Gras         }
120*2fe8fb19SBen Gras         count += minIterations;
121*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
122*2fe8fb19SBen Gras     inputNum = 0;
123*2fe8fb19SBen Gras     startClock = clock();
124*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
125*2fe8fb19SBen Gras         function( inputs_int32[ inputNum ] );
126*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
127*2fe8fb19SBen Gras     }
128*2fe8fb19SBen Gras     endClock = clock();
129*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
130*2fe8fb19SBen Gras 
131*2fe8fb19SBen Gras }
132*2fe8fb19SBen Gras 
time_a_int32_z_float64(float64 function (int32))133*2fe8fb19SBen Gras static void time_a_int32_z_float64( float64 function( int32 ) )
134*2fe8fb19SBen Gras {
135*2fe8fb19SBen Gras     clock_t startClock, endClock;
136*2fe8fb19SBen Gras     int32 count, i;
137*2fe8fb19SBen Gras     int8 inputNum;
138*2fe8fb19SBen Gras 
139*2fe8fb19SBen Gras     count = 0;
140*2fe8fb19SBen Gras     inputNum = 0;
141*2fe8fb19SBen Gras     startClock = clock();
142*2fe8fb19SBen Gras     do {
143*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
144*2fe8fb19SBen Gras             function( inputs_int32[ inputNum ] );
145*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
146*2fe8fb19SBen Gras         }
147*2fe8fb19SBen Gras         count += minIterations;
148*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
149*2fe8fb19SBen Gras     inputNum = 0;
150*2fe8fb19SBen Gras     startClock = clock();
151*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
152*2fe8fb19SBen Gras         function( inputs_int32[ inputNum ] );
153*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
154*2fe8fb19SBen Gras     }
155*2fe8fb19SBen Gras     endClock = clock();
156*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
157*2fe8fb19SBen Gras 
158*2fe8fb19SBen Gras }
159*2fe8fb19SBen Gras 
160*2fe8fb19SBen Gras #ifdef FLOATX80
161*2fe8fb19SBen Gras 
time_a_int32_z_floatx80(floatx80 function (int32))162*2fe8fb19SBen Gras static void time_a_int32_z_floatx80( floatx80 function( int32 ) )
163*2fe8fb19SBen Gras {
164*2fe8fb19SBen Gras     clock_t startClock, endClock;
165*2fe8fb19SBen Gras     int32 count, i;
166*2fe8fb19SBen Gras     int8 inputNum;
167*2fe8fb19SBen Gras 
168*2fe8fb19SBen Gras     count = 0;
169*2fe8fb19SBen Gras     inputNum = 0;
170*2fe8fb19SBen Gras     startClock = clock();
171*2fe8fb19SBen Gras     do {
172*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
173*2fe8fb19SBen Gras             function( inputs_int32[ inputNum ] );
174*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
175*2fe8fb19SBen Gras         }
176*2fe8fb19SBen Gras         count += minIterations;
177*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
178*2fe8fb19SBen Gras     inputNum = 0;
179*2fe8fb19SBen Gras     startClock = clock();
180*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
181*2fe8fb19SBen Gras         function( inputs_int32[ inputNum ] );
182*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
183*2fe8fb19SBen Gras     }
184*2fe8fb19SBen Gras     endClock = clock();
185*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
186*2fe8fb19SBen Gras 
187*2fe8fb19SBen Gras }
188*2fe8fb19SBen Gras 
189*2fe8fb19SBen Gras #endif
190*2fe8fb19SBen Gras 
191*2fe8fb19SBen Gras #ifdef FLOAT128
192*2fe8fb19SBen Gras 
time_a_int32_z_float128(float128 function (int32))193*2fe8fb19SBen Gras static void time_a_int32_z_float128( float128 function( int32 ) )
194*2fe8fb19SBen Gras {
195*2fe8fb19SBen Gras     clock_t startClock, endClock;
196*2fe8fb19SBen Gras     int32 count, i;
197*2fe8fb19SBen Gras     int8 inputNum;
198*2fe8fb19SBen Gras 
199*2fe8fb19SBen Gras     count = 0;
200*2fe8fb19SBen Gras     inputNum = 0;
201*2fe8fb19SBen Gras     startClock = clock();
202*2fe8fb19SBen Gras     do {
203*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
204*2fe8fb19SBen Gras             function( inputs_int32[ inputNum ] );
205*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
206*2fe8fb19SBen Gras         }
207*2fe8fb19SBen Gras         count += minIterations;
208*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
209*2fe8fb19SBen Gras     inputNum = 0;
210*2fe8fb19SBen Gras     startClock = clock();
211*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
212*2fe8fb19SBen Gras         function( inputs_int32[ inputNum ] );
213*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
214*2fe8fb19SBen Gras     }
215*2fe8fb19SBen Gras     endClock = clock();
216*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
217*2fe8fb19SBen Gras 
218*2fe8fb19SBen Gras }
219*2fe8fb19SBen Gras 
220*2fe8fb19SBen Gras #endif
221*2fe8fb19SBen Gras 
222*2fe8fb19SBen Gras enum {
223*2fe8fb19SBen Gras     numInputs_int64 = 32
224*2fe8fb19SBen Gras };
225*2fe8fb19SBen Gras 
226*2fe8fb19SBen Gras static const int64 inputs_int64[ numInputs_int64 ] = {
227*2fe8fb19SBen Gras     LIT64( 0xFBFFC3FFFFFFFFFF ),
228*2fe8fb19SBen Gras     LIT64( 0x0000000003C589BC ),
229*2fe8fb19SBen Gras     LIT64( 0x00000000400013FE ),
230*2fe8fb19SBen Gras     LIT64( 0x0000000000186171 ),
231*2fe8fb19SBen Gras     LIT64( 0xFFFFFFFFFFFEFBFA ),
232*2fe8fb19SBen Gras     LIT64( 0xFFFFFD79E6DFFC73 ),
233*2fe8fb19SBen Gras     LIT64( 0x0000000010001DFF ),
234*2fe8fb19SBen Gras     LIT64( 0xDD1A0F0C78513710 ),
235*2fe8fb19SBen Gras     LIT64( 0xFFFF83FFFFFEFFFE ),
236*2fe8fb19SBen Gras     LIT64( 0x00756EBD1AD0C1C7 ),
237*2fe8fb19SBen Gras     LIT64( 0x0003FDFFFFFFFFBE ),
238*2fe8fb19SBen Gras     LIT64( 0x0007D0FB2C2CA951 ),
239*2fe8fb19SBen Gras     LIT64( 0x0007FC0007FFFFFE ),
240*2fe8fb19SBen Gras     LIT64( 0x0000001F942B18BB ),
241*2fe8fb19SBen Gras     LIT64( 0x0000080101FFFFFE ),
242*2fe8fb19SBen Gras     LIT64( 0xFFFFFFFFFFFF0978 ),
243*2fe8fb19SBen Gras     LIT64( 0x000000000008BFFF ),
244*2fe8fb19SBen Gras     LIT64( 0x0000000006F5AF08 ),
245*2fe8fb19SBen Gras     LIT64( 0xFFDEFF7FFFFFFFFE ),
246*2fe8fb19SBen Gras     LIT64( 0x0000000000000003 ),
247*2fe8fb19SBen Gras     LIT64( 0x3FFFFFFFFF80007D ),
248*2fe8fb19SBen Gras     LIT64( 0x0000000000000078 ),
249*2fe8fb19SBen Gras     LIT64( 0xFFF80000007FDFFD ),
250*2fe8fb19SBen Gras     LIT64( 0x1BBC775B78016AB0 ),
251*2fe8fb19SBen Gras     LIT64( 0xFFF9001FFFFFFFFE ),
252*2fe8fb19SBen Gras     LIT64( 0xFFFD4767AB98E43F ),
253*2fe8fb19SBen Gras     LIT64( 0xFFFFFEFFFE00001E ),
254*2fe8fb19SBen Gras     LIT64( 0xFFFFFFFFFFF04EFD ),
255*2fe8fb19SBen Gras     LIT64( 0x07FFFFFFFFFFF7FF ),
256*2fe8fb19SBen Gras     LIT64( 0xFFFC9EAA38F89050 ),
257*2fe8fb19SBen Gras     LIT64( 0x00000020FBFFFFFE ),
258*2fe8fb19SBen Gras     LIT64( 0x0000099AE6455357 )
259*2fe8fb19SBen Gras };
260*2fe8fb19SBen Gras 
time_a_int64_z_float32(float32 function (int64))261*2fe8fb19SBen Gras static void time_a_int64_z_float32( float32 function( int64 ) )
262*2fe8fb19SBen Gras {
263*2fe8fb19SBen Gras     clock_t startClock, endClock;
264*2fe8fb19SBen Gras     int32 count, i;
265*2fe8fb19SBen Gras     int8 inputNum;
266*2fe8fb19SBen Gras 
267*2fe8fb19SBen Gras     count = 0;
268*2fe8fb19SBen Gras     inputNum = 0;
269*2fe8fb19SBen Gras     startClock = clock();
270*2fe8fb19SBen Gras     do {
271*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
272*2fe8fb19SBen Gras             function( inputs_int64[ inputNum ] );
273*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
274*2fe8fb19SBen Gras         }
275*2fe8fb19SBen Gras         count += minIterations;
276*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
277*2fe8fb19SBen Gras     inputNum = 0;
278*2fe8fb19SBen Gras     startClock = clock();
279*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
280*2fe8fb19SBen Gras         function( inputs_int64[ inputNum ] );
281*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
282*2fe8fb19SBen Gras     }
283*2fe8fb19SBen Gras     endClock = clock();
284*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
285*2fe8fb19SBen Gras 
286*2fe8fb19SBen Gras }
287*2fe8fb19SBen Gras 
time_a_int64_z_float64(float64 function (int64))288*2fe8fb19SBen Gras static void time_a_int64_z_float64( float64 function( int64 ) )
289*2fe8fb19SBen Gras {
290*2fe8fb19SBen Gras     clock_t startClock, endClock;
291*2fe8fb19SBen Gras     int32 count, i;
292*2fe8fb19SBen Gras     int8 inputNum;
293*2fe8fb19SBen Gras 
294*2fe8fb19SBen Gras     count = 0;
295*2fe8fb19SBen Gras     inputNum = 0;
296*2fe8fb19SBen Gras     startClock = clock();
297*2fe8fb19SBen Gras     do {
298*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
299*2fe8fb19SBen Gras             function( inputs_int64[ inputNum ] );
300*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
301*2fe8fb19SBen Gras         }
302*2fe8fb19SBen Gras         count += minIterations;
303*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
304*2fe8fb19SBen Gras     inputNum = 0;
305*2fe8fb19SBen Gras     startClock = clock();
306*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
307*2fe8fb19SBen Gras         function( inputs_int64[ inputNum ] );
308*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
309*2fe8fb19SBen Gras     }
310*2fe8fb19SBen Gras     endClock = clock();
311*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
312*2fe8fb19SBen Gras 
313*2fe8fb19SBen Gras }
314*2fe8fb19SBen Gras 
315*2fe8fb19SBen Gras #ifdef FLOATX80
316*2fe8fb19SBen Gras 
time_a_int64_z_floatx80(floatx80 function (int64))317*2fe8fb19SBen Gras static void time_a_int64_z_floatx80( floatx80 function( int64 ) )
318*2fe8fb19SBen Gras {
319*2fe8fb19SBen Gras     clock_t startClock, endClock;
320*2fe8fb19SBen Gras     int32 count, i;
321*2fe8fb19SBen Gras     int8 inputNum;
322*2fe8fb19SBen Gras 
323*2fe8fb19SBen Gras     count = 0;
324*2fe8fb19SBen Gras     inputNum = 0;
325*2fe8fb19SBen Gras     startClock = clock();
326*2fe8fb19SBen Gras     do {
327*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
328*2fe8fb19SBen Gras             function( inputs_int64[ inputNum ] );
329*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
330*2fe8fb19SBen Gras         }
331*2fe8fb19SBen Gras         count += minIterations;
332*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
333*2fe8fb19SBen Gras     inputNum = 0;
334*2fe8fb19SBen Gras     startClock = clock();
335*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
336*2fe8fb19SBen Gras         function( inputs_int64[ inputNum ] );
337*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
338*2fe8fb19SBen Gras     }
339*2fe8fb19SBen Gras     endClock = clock();
340*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
341*2fe8fb19SBen Gras 
342*2fe8fb19SBen Gras }
343*2fe8fb19SBen Gras 
344*2fe8fb19SBen Gras #endif
345*2fe8fb19SBen Gras 
346*2fe8fb19SBen Gras #ifdef FLOAT128
347*2fe8fb19SBen Gras 
time_a_int64_z_float128(float128 function (int64))348*2fe8fb19SBen Gras static void time_a_int64_z_float128( float128 function( int64 ) )
349*2fe8fb19SBen Gras {
350*2fe8fb19SBen Gras     clock_t startClock, endClock;
351*2fe8fb19SBen Gras     int32 count, i;
352*2fe8fb19SBen Gras     int8 inputNum;
353*2fe8fb19SBen Gras 
354*2fe8fb19SBen Gras     count = 0;
355*2fe8fb19SBen Gras     inputNum = 0;
356*2fe8fb19SBen Gras     startClock = clock();
357*2fe8fb19SBen Gras     do {
358*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
359*2fe8fb19SBen Gras             function( inputs_int64[ inputNum ] );
360*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
361*2fe8fb19SBen Gras         }
362*2fe8fb19SBen Gras         count += minIterations;
363*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
364*2fe8fb19SBen Gras     inputNum = 0;
365*2fe8fb19SBen Gras     startClock = clock();
366*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
367*2fe8fb19SBen Gras         function( inputs_int64[ inputNum ] );
368*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
369*2fe8fb19SBen Gras     }
370*2fe8fb19SBen Gras     endClock = clock();
371*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
372*2fe8fb19SBen Gras 
373*2fe8fb19SBen Gras }
374*2fe8fb19SBen Gras 
375*2fe8fb19SBen Gras #endif
376*2fe8fb19SBen Gras 
377*2fe8fb19SBen Gras enum {
378*2fe8fb19SBen Gras     numInputs_float32 = 32
379*2fe8fb19SBen Gras };
380*2fe8fb19SBen Gras 
381*2fe8fb19SBen Gras static const float32 inputs_float32[ numInputs_float32 ] = {
382*2fe8fb19SBen Gras     0x4EFA0000, 0xC1D0B328, 0x80000000, 0x3E69A31E,
383*2fe8fb19SBen Gras     0xAF803EFF, 0x3F800000, 0x17BF8000, 0xE74A301A,
384*2fe8fb19SBen Gras     0x4E010003, 0x7EE3C75D, 0xBD803FE0, 0xBFFEFF00,
385*2fe8fb19SBen Gras     0x7981F800, 0x431FFFFC, 0xC100C000, 0x3D87EFFF,
386*2fe8fb19SBen Gras     0x4103FEFE, 0xBC000007, 0xBF01F7FF, 0x4E6C6B5C,
387*2fe8fb19SBen Gras     0xC187FFFE, 0xC58B9F13, 0x4F88007F, 0xDF004007,
388*2fe8fb19SBen Gras     0xB7FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000,
389*2fe8fb19SBen Gras     0xDB428661, 0x33F89B1F, 0xA3BFEFFF, 0x537BFFBE
390*2fe8fb19SBen Gras };
391*2fe8fb19SBen Gras 
time_a_float32_z_int32(int32 function (float32))392*2fe8fb19SBen Gras static void time_a_float32_z_int32( int32 function( float32 ) )
393*2fe8fb19SBen Gras {
394*2fe8fb19SBen Gras     clock_t startClock, endClock;
395*2fe8fb19SBen Gras     int32 count, i;
396*2fe8fb19SBen Gras     int8 inputNum;
397*2fe8fb19SBen Gras 
398*2fe8fb19SBen Gras     count = 0;
399*2fe8fb19SBen Gras     inputNum = 0;
400*2fe8fb19SBen Gras     startClock = clock();
401*2fe8fb19SBen Gras     do {
402*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
403*2fe8fb19SBen Gras             function( inputs_float32[ inputNum ] );
404*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
405*2fe8fb19SBen Gras         }
406*2fe8fb19SBen Gras         count += minIterations;
407*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
408*2fe8fb19SBen Gras     inputNum = 0;
409*2fe8fb19SBen Gras     startClock = clock();
410*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
411*2fe8fb19SBen Gras         function( inputs_float32[ inputNum ] );
412*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
413*2fe8fb19SBen Gras     }
414*2fe8fb19SBen Gras     endClock = clock();
415*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
416*2fe8fb19SBen Gras 
417*2fe8fb19SBen Gras }
418*2fe8fb19SBen Gras 
time_a_float32_z_int64(int64 function (float32))419*2fe8fb19SBen Gras static void time_a_float32_z_int64( int64 function( float32 ) )
420*2fe8fb19SBen Gras {
421*2fe8fb19SBen Gras     clock_t startClock, endClock;
422*2fe8fb19SBen Gras     int32 count, i;
423*2fe8fb19SBen Gras     int8 inputNum;
424*2fe8fb19SBen Gras 
425*2fe8fb19SBen Gras     count = 0;
426*2fe8fb19SBen Gras     inputNum = 0;
427*2fe8fb19SBen Gras     startClock = clock();
428*2fe8fb19SBen Gras     do {
429*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
430*2fe8fb19SBen Gras             function( inputs_float32[ inputNum ] );
431*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
432*2fe8fb19SBen Gras         }
433*2fe8fb19SBen Gras         count += minIterations;
434*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
435*2fe8fb19SBen Gras     inputNum = 0;
436*2fe8fb19SBen Gras     startClock = clock();
437*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
438*2fe8fb19SBen Gras         function( inputs_float32[ inputNum ] );
439*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
440*2fe8fb19SBen Gras     }
441*2fe8fb19SBen Gras     endClock = clock();
442*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
443*2fe8fb19SBen Gras 
444*2fe8fb19SBen Gras }
445*2fe8fb19SBen Gras 
time_a_float32_z_float64(float64 function (float32))446*2fe8fb19SBen Gras static void time_a_float32_z_float64( float64 function( float32 ) )
447*2fe8fb19SBen Gras {
448*2fe8fb19SBen Gras     clock_t startClock, endClock;
449*2fe8fb19SBen Gras     int32 count, i;
450*2fe8fb19SBen Gras     int8 inputNum;
451*2fe8fb19SBen Gras 
452*2fe8fb19SBen Gras     count = 0;
453*2fe8fb19SBen Gras     inputNum = 0;
454*2fe8fb19SBen Gras     startClock = clock();
455*2fe8fb19SBen Gras     do {
456*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
457*2fe8fb19SBen Gras             function( inputs_float32[ inputNum ] );
458*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
459*2fe8fb19SBen Gras         }
460*2fe8fb19SBen Gras         count += minIterations;
461*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
462*2fe8fb19SBen Gras     inputNum = 0;
463*2fe8fb19SBen Gras     startClock = clock();
464*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
465*2fe8fb19SBen Gras         function( inputs_float32[ inputNum ] );
466*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
467*2fe8fb19SBen Gras     }
468*2fe8fb19SBen Gras     endClock = clock();
469*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
470*2fe8fb19SBen Gras 
471*2fe8fb19SBen Gras }
472*2fe8fb19SBen Gras 
473*2fe8fb19SBen Gras #ifdef FLOATX80
474*2fe8fb19SBen Gras 
time_a_float32_z_floatx80(floatx80 function (float32))475*2fe8fb19SBen Gras static void time_a_float32_z_floatx80( floatx80 function( float32 ) )
476*2fe8fb19SBen Gras {
477*2fe8fb19SBen Gras     clock_t startClock, endClock;
478*2fe8fb19SBen Gras     int32 count, i;
479*2fe8fb19SBen Gras     int8 inputNum;
480*2fe8fb19SBen Gras 
481*2fe8fb19SBen Gras     count = 0;
482*2fe8fb19SBen Gras     inputNum = 0;
483*2fe8fb19SBen Gras     startClock = clock();
484*2fe8fb19SBen Gras     do {
485*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
486*2fe8fb19SBen Gras             function( inputs_float32[ inputNum ] );
487*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
488*2fe8fb19SBen Gras         }
489*2fe8fb19SBen Gras         count += minIterations;
490*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
491*2fe8fb19SBen Gras     inputNum = 0;
492*2fe8fb19SBen Gras     startClock = clock();
493*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
494*2fe8fb19SBen Gras         function( inputs_float32[ inputNum ] );
495*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
496*2fe8fb19SBen Gras     }
497*2fe8fb19SBen Gras     endClock = clock();
498*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
499*2fe8fb19SBen Gras 
500*2fe8fb19SBen Gras }
501*2fe8fb19SBen Gras 
502*2fe8fb19SBen Gras #endif
503*2fe8fb19SBen Gras 
504*2fe8fb19SBen Gras #ifdef FLOAT128
505*2fe8fb19SBen Gras 
time_a_float32_z_float128(float128 function (float32))506*2fe8fb19SBen Gras static void time_a_float32_z_float128( float128 function( float32 ) )
507*2fe8fb19SBen Gras {
508*2fe8fb19SBen Gras     clock_t startClock, endClock;
509*2fe8fb19SBen Gras     int32 count, i;
510*2fe8fb19SBen Gras     int8 inputNum;
511*2fe8fb19SBen Gras 
512*2fe8fb19SBen Gras     count = 0;
513*2fe8fb19SBen Gras     inputNum = 0;
514*2fe8fb19SBen Gras     startClock = clock();
515*2fe8fb19SBen Gras     do {
516*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
517*2fe8fb19SBen Gras             function( inputs_float32[ inputNum ] );
518*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
519*2fe8fb19SBen Gras         }
520*2fe8fb19SBen Gras         count += minIterations;
521*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
522*2fe8fb19SBen Gras     inputNum = 0;
523*2fe8fb19SBen Gras     startClock = clock();
524*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
525*2fe8fb19SBen Gras         function( inputs_float32[ inputNum ] );
526*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
527*2fe8fb19SBen Gras     }
528*2fe8fb19SBen Gras     endClock = clock();
529*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
530*2fe8fb19SBen Gras 
531*2fe8fb19SBen Gras }
532*2fe8fb19SBen Gras 
533*2fe8fb19SBen Gras #endif
534*2fe8fb19SBen Gras 
time_az_float32(float32 function (float32))535*2fe8fb19SBen Gras static void time_az_float32( float32 function( float32 ) )
536*2fe8fb19SBen Gras {
537*2fe8fb19SBen Gras     clock_t startClock, endClock;
538*2fe8fb19SBen Gras     int32 count, i;
539*2fe8fb19SBen Gras     int8 inputNum;
540*2fe8fb19SBen Gras 
541*2fe8fb19SBen Gras     count = 0;
542*2fe8fb19SBen Gras     inputNum = 0;
543*2fe8fb19SBen Gras     startClock = clock();
544*2fe8fb19SBen Gras     do {
545*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
546*2fe8fb19SBen Gras             function( inputs_float32[ inputNum ] );
547*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
548*2fe8fb19SBen Gras         }
549*2fe8fb19SBen Gras         count += minIterations;
550*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
551*2fe8fb19SBen Gras     inputNum = 0;
552*2fe8fb19SBen Gras     startClock = clock();
553*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
554*2fe8fb19SBen Gras         function( inputs_float32[ inputNum ] );
555*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
556*2fe8fb19SBen Gras     }
557*2fe8fb19SBen Gras     endClock = clock();
558*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
559*2fe8fb19SBen Gras 
560*2fe8fb19SBen Gras }
561*2fe8fb19SBen Gras 
time_ab_float32_z_flag(flag function (float32,float32))562*2fe8fb19SBen Gras static void time_ab_float32_z_flag( flag function( float32, float32 ) )
563*2fe8fb19SBen Gras {
564*2fe8fb19SBen Gras     clock_t startClock, endClock;
565*2fe8fb19SBen Gras     int32 count, i;
566*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
567*2fe8fb19SBen Gras 
568*2fe8fb19SBen Gras     count = 0;
569*2fe8fb19SBen Gras     inputNumA = 0;
570*2fe8fb19SBen Gras     inputNumB = 0;
571*2fe8fb19SBen Gras     startClock = clock();
572*2fe8fb19SBen Gras     do {
573*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
574*2fe8fb19SBen Gras             function(
575*2fe8fb19SBen Gras                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
576*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
577*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
578*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
579*2fe8fb19SBen Gras         }
580*2fe8fb19SBen Gras         count += minIterations;
581*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
582*2fe8fb19SBen Gras     inputNumA = 0;
583*2fe8fb19SBen Gras     inputNumB = 0;
584*2fe8fb19SBen Gras     startClock = clock();
585*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
586*2fe8fb19SBen Gras             function(
587*2fe8fb19SBen Gras                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
588*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
589*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
590*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
591*2fe8fb19SBen Gras     }
592*2fe8fb19SBen Gras     endClock = clock();
593*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
594*2fe8fb19SBen Gras 
595*2fe8fb19SBen Gras }
596*2fe8fb19SBen Gras 
time_abz_float32(float32 function (float32,float32))597*2fe8fb19SBen Gras static void time_abz_float32( float32 function( float32, float32 ) )
598*2fe8fb19SBen Gras {
599*2fe8fb19SBen Gras     clock_t startClock, endClock;
600*2fe8fb19SBen Gras     int32 count, i;
601*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
602*2fe8fb19SBen Gras 
603*2fe8fb19SBen Gras     count = 0;
604*2fe8fb19SBen Gras     inputNumA = 0;
605*2fe8fb19SBen Gras     inputNumB = 0;
606*2fe8fb19SBen Gras     startClock = clock();
607*2fe8fb19SBen Gras     do {
608*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
609*2fe8fb19SBen Gras             function(
610*2fe8fb19SBen Gras                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
611*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
612*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
613*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
614*2fe8fb19SBen Gras         }
615*2fe8fb19SBen Gras         count += minIterations;
616*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
617*2fe8fb19SBen Gras     inputNumA = 0;
618*2fe8fb19SBen Gras     inputNumB = 0;
619*2fe8fb19SBen Gras     startClock = clock();
620*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
621*2fe8fb19SBen Gras             function(
622*2fe8fb19SBen Gras                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
623*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
624*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
625*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
626*2fe8fb19SBen Gras     }
627*2fe8fb19SBen Gras     endClock = clock();
628*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
629*2fe8fb19SBen Gras 
630*2fe8fb19SBen Gras }
631*2fe8fb19SBen Gras 
632*2fe8fb19SBen Gras static const float32 inputs_float32_pos[ numInputs_float32 ] = {
633*2fe8fb19SBen Gras     0x4EFA0000, 0x41D0B328, 0x00000000, 0x3E69A31E,
634*2fe8fb19SBen Gras     0x2F803EFF, 0x3F800000, 0x17BF8000, 0x674A301A,
635*2fe8fb19SBen Gras     0x4E010003, 0x7EE3C75D, 0x3D803FE0, 0x3FFEFF00,
636*2fe8fb19SBen Gras     0x7981F800, 0x431FFFFC, 0x4100C000, 0x3D87EFFF,
637*2fe8fb19SBen Gras     0x4103FEFE, 0x3C000007, 0x3F01F7FF, 0x4E6C6B5C,
638*2fe8fb19SBen Gras     0x4187FFFE, 0x458B9F13, 0x4F88007F, 0x5F004007,
639*2fe8fb19SBen Gras     0x37FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000,
640*2fe8fb19SBen Gras     0x5B428661, 0x33F89B1F, 0x23BFEFFF, 0x537BFFBE
641*2fe8fb19SBen Gras };
642*2fe8fb19SBen Gras 
time_az_float32_pos(float32 function (float32))643*2fe8fb19SBen Gras static void time_az_float32_pos( float32 function( float32 ) )
644*2fe8fb19SBen Gras {
645*2fe8fb19SBen Gras     clock_t startClock, endClock;
646*2fe8fb19SBen Gras     int32 count, i;
647*2fe8fb19SBen Gras     int8 inputNum;
648*2fe8fb19SBen Gras 
649*2fe8fb19SBen Gras     count = 0;
650*2fe8fb19SBen Gras     inputNum = 0;
651*2fe8fb19SBen Gras     startClock = clock();
652*2fe8fb19SBen Gras     do {
653*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
654*2fe8fb19SBen Gras             function( inputs_float32_pos[ inputNum ] );
655*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
656*2fe8fb19SBen Gras         }
657*2fe8fb19SBen Gras         count += minIterations;
658*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
659*2fe8fb19SBen Gras     inputNum = 0;
660*2fe8fb19SBen Gras     startClock = clock();
661*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
662*2fe8fb19SBen Gras         function( inputs_float32_pos[ inputNum ] );
663*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
664*2fe8fb19SBen Gras     }
665*2fe8fb19SBen Gras     endClock = clock();
666*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
667*2fe8fb19SBen Gras 
668*2fe8fb19SBen Gras }
669*2fe8fb19SBen Gras 
670*2fe8fb19SBen Gras enum {
671*2fe8fb19SBen Gras     numInputs_float64 = 32
672*2fe8fb19SBen Gras };
673*2fe8fb19SBen Gras 
674*2fe8fb19SBen Gras static const float64 inputs_float64[ numInputs_float64 ] = {
675*2fe8fb19SBen Gras     LIT64( 0x422FFFC008000000 ),
676*2fe8fb19SBen Gras     LIT64( 0xB7E0000480000000 ),
677*2fe8fb19SBen Gras     LIT64( 0xF3FD2546120B7935 ),
678*2fe8fb19SBen Gras     LIT64( 0x3FF0000000000000 ),
679*2fe8fb19SBen Gras     LIT64( 0xCE07F766F09588D6 ),
680*2fe8fb19SBen Gras     LIT64( 0x8000000000000000 ),
681*2fe8fb19SBen Gras     LIT64( 0x3FCE000400000000 ),
682*2fe8fb19SBen Gras     LIT64( 0x8313B60F0032BED8 ),
683*2fe8fb19SBen Gras     LIT64( 0xC1EFFFFFC0002000 ),
684*2fe8fb19SBen Gras     LIT64( 0x3FB3C75D224F2B0F ),
685*2fe8fb19SBen Gras     LIT64( 0x7FD00000004000FF ),
686*2fe8fb19SBen Gras     LIT64( 0xA12FFF8000001FFF ),
687*2fe8fb19SBen Gras     LIT64( 0x3EE0000000FE0000 ),
688*2fe8fb19SBen Gras     LIT64( 0x0010000080000004 ),
689*2fe8fb19SBen Gras     LIT64( 0x41CFFFFE00000020 ),
690*2fe8fb19SBen Gras     LIT64( 0x40303FFFFFFFFFFD ),
691*2fe8fb19SBen Gras     LIT64( 0x3FD000003FEFFFFF ),
692*2fe8fb19SBen Gras     LIT64( 0xBFD0000010000000 ),
693*2fe8fb19SBen Gras     LIT64( 0xB7FC6B5C16CA55CF ),
694*2fe8fb19SBen Gras     LIT64( 0x413EEB940B9D1301 ),
695*2fe8fb19SBen Gras     LIT64( 0xC7E00200001FFFFF ),
696*2fe8fb19SBen Gras     LIT64( 0x47F00021FFFFFFFE ),
697*2fe8fb19SBen Gras     LIT64( 0xBFFFFFFFF80000FF ),
698*2fe8fb19SBen Gras     LIT64( 0xC07FFFFFE00FFFFF ),
699*2fe8fb19SBen Gras     LIT64( 0x001497A63740C5E8 ),
700*2fe8fb19SBen Gras     LIT64( 0xC4BFFFE0001FFFFF ),
701*2fe8fb19SBen Gras     LIT64( 0x96FFDFFEFFFFFFFF ),
702*2fe8fb19SBen Gras     LIT64( 0x403FC000000001FE ),
703*2fe8fb19SBen Gras     LIT64( 0xFFD00000000001F6 ),
704*2fe8fb19SBen Gras     LIT64( 0x0640400002000000 ),
705*2fe8fb19SBen Gras     LIT64( 0x479CEE1E4F789FE0 ),
706*2fe8fb19SBen Gras     LIT64( 0xC237FFFFFFFFFDFE )
707*2fe8fb19SBen Gras };
708*2fe8fb19SBen Gras 
time_a_float64_z_int32(int32 function (float64))709*2fe8fb19SBen Gras static void time_a_float64_z_int32( int32 function( float64 ) )
710*2fe8fb19SBen Gras {
711*2fe8fb19SBen Gras     clock_t startClock, endClock;
712*2fe8fb19SBen Gras     int32 count, i;
713*2fe8fb19SBen Gras     int8 inputNum;
714*2fe8fb19SBen Gras 
715*2fe8fb19SBen Gras     count = 0;
716*2fe8fb19SBen Gras     inputNum = 0;
717*2fe8fb19SBen Gras     startClock = clock();
718*2fe8fb19SBen Gras     do {
719*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
720*2fe8fb19SBen Gras             function( inputs_float64[ inputNum ] );
721*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
722*2fe8fb19SBen Gras         }
723*2fe8fb19SBen Gras         count += minIterations;
724*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
725*2fe8fb19SBen Gras     inputNum = 0;
726*2fe8fb19SBen Gras     startClock = clock();
727*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
728*2fe8fb19SBen Gras         function( inputs_float64[ inputNum ] );
729*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
730*2fe8fb19SBen Gras     }
731*2fe8fb19SBen Gras     endClock = clock();
732*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
733*2fe8fb19SBen Gras 
734*2fe8fb19SBen Gras }
735*2fe8fb19SBen Gras 
time_a_float64_z_int64(int64 function (float64))736*2fe8fb19SBen Gras static void time_a_float64_z_int64( int64 function( float64 ) )
737*2fe8fb19SBen Gras {
738*2fe8fb19SBen Gras     clock_t startClock, endClock;
739*2fe8fb19SBen Gras     int32 count, i;
740*2fe8fb19SBen Gras     int8 inputNum;
741*2fe8fb19SBen Gras 
742*2fe8fb19SBen Gras     count = 0;
743*2fe8fb19SBen Gras     inputNum = 0;
744*2fe8fb19SBen Gras     startClock = clock();
745*2fe8fb19SBen Gras     do {
746*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
747*2fe8fb19SBen Gras             function( inputs_float64[ inputNum ] );
748*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
749*2fe8fb19SBen Gras         }
750*2fe8fb19SBen Gras         count += minIterations;
751*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
752*2fe8fb19SBen Gras     inputNum = 0;
753*2fe8fb19SBen Gras     startClock = clock();
754*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
755*2fe8fb19SBen Gras         function( inputs_float64[ inputNum ] );
756*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
757*2fe8fb19SBen Gras     }
758*2fe8fb19SBen Gras     endClock = clock();
759*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
760*2fe8fb19SBen Gras 
761*2fe8fb19SBen Gras }
762*2fe8fb19SBen Gras 
time_a_float64_z_float32(float32 function (float64))763*2fe8fb19SBen Gras static void time_a_float64_z_float32( float32 function( float64 ) )
764*2fe8fb19SBen Gras {
765*2fe8fb19SBen Gras     clock_t startClock, endClock;
766*2fe8fb19SBen Gras     int32 count, i;
767*2fe8fb19SBen Gras     int8 inputNum;
768*2fe8fb19SBen Gras 
769*2fe8fb19SBen Gras     count = 0;
770*2fe8fb19SBen Gras     inputNum = 0;
771*2fe8fb19SBen Gras     startClock = clock();
772*2fe8fb19SBen Gras     do {
773*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
774*2fe8fb19SBen Gras             function( inputs_float64[ inputNum ] );
775*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
776*2fe8fb19SBen Gras         }
777*2fe8fb19SBen Gras         count += minIterations;
778*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
779*2fe8fb19SBen Gras     inputNum = 0;
780*2fe8fb19SBen Gras     startClock = clock();
781*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
782*2fe8fb19SBen Gras         function( inputs_float64[ inputNum ] );
783*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
784*2fe8fb19SBen Gras     }
785*2fe8fb19SBen Gras     endClock = clock();
786*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
787*2fe8fb19SBen Gras 
788*2fe8fb19SBen Gras }
789*2fe8fb19SBen Gras 
790*2fe8fb19SBen Gras #ifdef FLOATX80
791*2fe8fb19SBen Gras 
time_a_float64_z_floatx80(floatx80 function (float64))792*2fe8fb19SBen Gras static void time_a_float64_z_floatx80( floatx80 function( float64 ) )
793*2fe8fb19SBen Gras {
794*2fe8fb19SBen Gras     clock_t startClock, endClock;
795*2fe8fb19SBen Gras     int32 count, i;
796*2fe8fb19SBen Gras     int8 inputNum;
797*2fe8fb19SBen Gras 
798*2fe8fb19SBen Gras     count = 0;
799*2fe8fb19SBen Gras     inputNum = 0;
800*2fe8fb19SBen Gras     startClock = clock();
801*2fe8fb19SBen Gras     do {
802*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
803*2fe8fb19SBen Gras             function( inputs_float64[ inputNum ] );
804*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
805*2fe8fb19SBen Gras         }
806*2fe8fb19SBen Gras         count += minIterations;
807*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
808*2fe8fb19SBen Gras     inputNum = 0;
809*2fe8fb19SBen Gras     startClock = clock();
810*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
811*2fe8fb19SBen Gras         function( inputs_float64[ inputNum ] );
812*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
813*2fe8fb19SBen Gras     }
814*2fe8fb19SBen Gras     endClock = clock();
815*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
816*2fe8fb19SBen Gras 
817*2fe8fb19SBen Gras }
818*2fe8fb19SBen Gras 
819*2fe8fb19SBen Gras #endif
820*2fe8fb19SBen Gras 
821*2fe8fb19SBen Gras #ifdef FLOAT128
822*2fe8fb19SBen Gras 
time_a_float64_z_float128(float128 function (float64))823*2fe8fb19SBen Gras static void time_a_float64_z_float128( float128 function( float64 ) )
824*2fe8fb19SBen Gras {
825*2fe8fb19SBen Gras     clock_t startClock, endClock;
826*2fe8fb19SBen Gras     int32 count, i;
827*2fe8fb19SBen Gras     int8 inputNum;
828*2fe8fb19SBen Gras 
829*2fe8fb19SBen Gras     count = 0;
830*2fe8fb19SBen Gras     inputNum = 0;
831*2fe8fb19SBen Gras     startClock = clock();
832*2fe8fb19SBen Gras     do {
833*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
834*2fe8fb19SBen Gras             function( inputs_float64[ inputNum ] );
835*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
836*2fe8fb19SBen Gras         }
837*2fe8fb19SBen Gras         count += minIterations;
838*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
839*2fe8fb19SBen Gras     inputNum = 0;
840*2fe8fb19SBen Gras     startClock = clock();
841*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
842*2fe8fb19SBen Gras         function( inputs_float64[ inputNum ] );
843*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
844*2fe8fb19SBen Gras     }
845*2fe8fb19SBen Gras     endClock = clock();
846*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
847*2fe8fb19SBen Gras 
848*2fe8fb19SBen Gras }
849*2fe8fb19SBen Gras 
850*2fe8fb19SBen Gras #endif
851*2fe8fb19SBen Gras 
time_az_float64(float64 function (float64))852*2fe8fb19SBen Gras static void time_az_float64( float64 function( float64 ) )
853*2fe8fb19SBen Gras {
854*2fe8fb19SBen Gras     clock_t startClock, endClock;
855*2fe8fb19SBen Gras     int32 count, i;
856*2fe8fb19SBen Gras     int8 inputNum;
857*2fe8fb19SBen Gras 
858*2fe8fb19SBen Gras     count = 0;
859*2fe8fb19SBen Gras     inputNum = 0;
860*2fe8fb19SBen Gras     startClock = clock();
861*2fe8fb19SBen Gras     do {
862*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
863*2fe8fb19SBen Gras             function( inputs_float64[ inputNum ] );
864*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
865*2fe8fb19SBen Gras         }
866*2fe8fb19SBen Gras         count += minIterations;
867*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
868*2fe8fb19SBen Gras     inputNum = 0;
869*2fe8fb19SBen Gras     startClock = clock();
870*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
871*2fe8fb19SBen Gras         function( inputs_float64[ inputNum ] );
872*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
873*2fe8fb19SBen Gras     }
874*2fe8fb19SBen Gras     endClock = clock();
875*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
876*2fe8fb19SBen Gras 
877*2fe8fb19SBen Gras }
878*2fe8fb19SBen Gras 
time_ab_float64_z_flag(flag function (float64,float64))879*2fe8fb19SBen Gras static void time_ab_float64_z_flag( flag function( float64, float64 ) )
880*2fe8fb19SBen Gras {
881*2fe8fb19SBen Gras     clock_t startClock, endClock;
882*2fe8fb19SBen Gras     int32 count, i;
883*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
884*2fe8fb19SBen Gras 
885*2fe8fb19SBen Gras     count = 0;
886*2fe8fb19SBen Gras     inputNumA = 0;
887*2fe8fb19SBen Gras     inputNumB = 0;
888*2fe8fb19SBen Gras     startClock = clock();
889*2fe8fb19SBen Gras     do {
890*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
891*2fe8fb19SBen Gras             function(
892*2fe8fb19SBen Gras                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
893*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
894*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
895*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
896*2fe8fb19SBen Gras         }
897*2fe8fb19SBen Gras         count += minIterations;
898*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
899*2fe8fb19SBen Gras     inputNumA = 0;
900*2fe8fb19SBen Gras     inputNumB = 0;
901*2fe8fb19SBen Gras     startClock = clock();
902*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
903*2fe8fb19SBen Gras             function(
904*2fe8fb19SBen Gras                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
905*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
906*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
907*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
908*2fe8fb19SBen Gras     }
909*2fe8fb19SBen Gras     endClock = clock();
910*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
911*2fe8fb19SBen Gras 
912*2fe8fb19SBen Gras }
913*2fe8fb19SBen Gras 
time_abz_float64(float64 function (float64,float64))914*2fe8fb19SBen Gras static void time_abz_float64( float64 function( float64, float64 ) )
915*2fe8fb19SBen Gras {
916*2fe8fb19SBen Gras     clock_t startClock, endClock;
917*2fe8fb19SBen Gras     int32 count, i;
918*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
919*2fe8fb19SBen Gras 
920*2fe8fb19SBen Gras     count = 0;
921*2fe8fb19SBen Gras     inputNumA = 0;
922*2fe8fb19SBen Gras     inputNumB = 0;
923*2fe8fb19SBen Gras     startClock = clock();
924*2fe8fb19SBen Gras     do {
925*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
926*2fe8fb19SBen Gras             function(
927*2fe8fb19SBen Gras                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
928*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
929*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
930*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
931*2fe8fb19SBen Gras         }
932*2fe8fb19SBen Gras         count += minIterations;
933*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
934*2fe8fb19SBen Gras     inputNumA = 0;
935*2fe8fb19SBen Gras     inputNumB = 0;
936*2fe8fb19SBen Gras     startClock = clock();
937*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
938*2fe8fb19SBen Gras             function(
939*2fe8fb19SBen Gras                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
940*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
941*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
942*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
943*2fe8fb19SBen Gras     }
944*2fe8fb19SBen Gras     endClock = clock();
945*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
946*2fe8fb19SBen Gras 
947*2fe8fb19SBen Gras }
948*2fe8fb19SBen Gras 
949*2fe8fb19SBen Gras static const float64 inputs_float64_pos[ numInputs_float64 ] = {
950*2fe8fb19SBen Gras     LIT64( 0x422FFFC008000000 ),
951*2fe8fb19SBen Gras     LIT64( 0x37E0000480000000 ),
952*2fe8fb19SBen Gras     LIT64( 0x73FD2546120B7935 ),
953*2fe8fb19SBen Gras     LIT64( 0x3FF0000000000000 ),
954*2fe8fb19SBen Gras     LIT64( 0x4E07F766F09588D6 ),
955*2fe8fb19SBen Gras     LIT64( 0x0000000000000000 ),
956*2fe8fb19SBen Gras     LIT64( 0x3FCE000400000000 ),
957*2fe8fb19SBen Gras     LIT64( 0x0313B60F0032BED8 ),
958*2fe8fb19SBen Gras     LIT64( 0x41EFFFFFC0002000 ),
959*2fe8fb19SBen Gras     LIT64( 0x3FB3C75D224F2B0F ),
960*2fe8fb19SBen Gras     LIT64( 0x7FD00000004000FF ),
961*2fe8fb19SBen Gras     LIT64( 0x212FFF8000001FFF ),
962*2fe8fb19SBen Gras     LIT64( 0x3EE0000000FE0000 ),
963*2fe8fb19SBen Gras     LIT64( 0x0010000080000004 ),
964*2fe8fb19SBen Gras     LIT64( 0x41CFFFFE00000020 ),
965*2fe8fb19SBen Gras     LIT64( 0x40303FFFFFFFFFFD ),
966*2fe8fb19SBen Gras     LIT64( 0x3FD000003FEFFFFF ),
967*2fe8fb19SBen Gras     LIT64( 0x3FD0000010000000 ),
968*2fe8fb19SBen Gras     LIT64( 0x37FC6B5C16CA55CF ),
969*2fe8fb19SBen Gras     LIT64( 0x413EEB940B9D1301 ),
970*2fe8fb19SBen Gras     LIT64( 0x47E00200001FFFFF ),
971*2fe8fb19SBen Gras     LIT64( 0x47F00021FFFFFFFE ),
972*2fe8fb19SBen Gras     LIT64( 0x3FFFFFFFF80000FF ),
973*2fe8fb19SBen Gras     LIT64( 0x407FFFFFE00FFFFF ),
974*2fe8fb19SBen Gras     LIT64( 0x001497A63740C5E8 ),
975*2fe8fb19SBen Gras     LIT64( 0x44BFFFE0001FFFFF ),
976*2fe8fb19SBen Gras     LIT64( 0x16FFDFFEFFFFFFFF ),
977*2fe8fb19SBen Gras     LIT64( 0x403FC000000001FE ),
978*2fe8fb19SBen Gras     LIT64( 0x7FD00000000001F6 ),
979*2fe8fb19SBen Gras     LIT64( 0x0640400002000000 ),
980*2fe8fb19SBen Gras     LIT64( 0x479CEE1E4F789FE0 ),
981*2fe8fb19SBen Gras     LIT64( 0x4237FFFFFFFFFDFE )
982*2fe8fb19SBen Gras };
983*2fe8fb19SBen Gras 
time_az_float64_pos(float64 function (float64))984*2fe8fb19SBen Gras static void time_az_float64_pos( float64 function( float64 ) )
985*2fe8fb19SBen Gras {
986*2fe8fb19SBen Gras     clock_t startClock, endClock;
987*2fe8fb19SBen Gras     int32 count, i;
988*2fe8fb19SBen Gras     int8 inputNum;
989*2fe8fb19SBen Gras 
990*2fe8fb19SBen Gras     count = 0;
991*2fe8fb19SBen Gras     inputNum = 0;
992*2fe8fb19SBen Gras     startClock = clock();
993*2fe8fb19SBen Gras     do {
994*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
995*2fe8fb19SBen Gras             function( inputs_float64_pos[ inputNum ] );
996*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
997*2fe8fb19SBen Gras         }
998*2fe8fb19SBen Gras         count += minIterations;
999*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1000*2fe8fb19SBen Gras     inputNum = 0;
1001*2fe8fb19SBen Gras     startClock = clock();
1002*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1003*2fe8fb19SBen Gras         function( inputs_float64_pos[ inputNum ] );
1004*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
1005*2fe8fb19SBen Gras     }
1006*2fe8fb19SBen Gras     endClock = clock();
1007*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1008*2fe8fb19SBen Gras 
1009*2fe8fb19SBen Gras }
1010*2fe8fb19SBen Gras 
1011*2fe8fb19SBen Gras #ifdef FLOATX80
1012*2fe8fb19SBen Gras 
1013*2fe8fb19SBen Gras enum {
1014*2fe8fb19SBen Gras     numInputs_floatx80 = 32
1015*2fe8fb19SBen Gras };
1016*2fe8fb19SBen Gras 
1017*2fe8fb19SBen Gras static const struct {
1018*2fe8fb19SBen Gras     bits16 high;
1019*2fe8fb19SBen Gras     bits64 low;
1020*2fe8fb19SBen Gras } inputs_floatx80[ numInputs_floatx80 ] = {
1021*2fe8fb19SBen Gras     { 0xC03F, LIT64( 0xA9BE15A19C1E8B62 ) },
1022*2fe8fb19SBen Gras     { 0x8000, LIT64( 0x0000000000000000 ) },
1023*2fe8fb19SBen Gras     { 0x75A8, LIT64( 0xE59591E4788957A5 ) },
1024*2fe8fb19SBen Gras     { 0xBFFF, LIT64( 0xFFF0000000000040 ) },
1025*2fe8fb19SBen Gras     { 0x0CD8, LIT64( 0xFC000000000007FE ) },
1026*2fe8fb19SBen Gras     { 0x43BA, LIT64( 0x99A4000000000000 ) },
1027*2fe8fb19SBen Gras     { 0x3FFF, LIT64( 0x8000000000000000 ) },
1028*2fe8fb19SBen Gras     { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) },
1029*2fe8fb19SBen Gras     { 0x403E, LIT64( 0xFFF0000000002000 ) },
1030*2fe8fb19SBen Gras     { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) },
1031*2fe8fb19SBen Gras     { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) },
1032*2fe8fb19SBen Gras     { 0x737A, LIT64( 0x800000007FFDFFFE ) },
1033*2fe8fb19SBen Gras     { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) },
1034*2fe8fb19SBen Gras     { 0xBBFE, LIT64( 0x8000040000001FFE ) },
1035*2fe8fb19SBen Gras     { 0xC002, LIT64( 0xFF80000000000020 ) },
1036*2fe8fb19SBen Gras     { 0xDE8D, LIT64( 0xFFFFFFFFFFE00004 ) },
1037*2fe8fb19SBen Gras     { 0xC004, LIT64( 0x8000000000003FFB ) },
1038*2fe8fb19SBen Gras     { 0x407F, LIT64( 0x800000000003FFFE ) },
1039*2fe8fb19SBen Gras     { 0xC000, LIT64( 0xA459EE6A5C16CA55 ) },
1040*2fe8fb19SBen Gras     { 0x8003, LIT64( 0xC42CBF7399AEEB94 ) },
1041*2fe8fb19SBen Gras     { 0xBF7F, LIT64( 0xF800000000000006 ) },
1042*2fe8fb19SBen Gras     { 0xC07F, LIT64( 0xBF56BE8871F28FEA ) },
1043*2fe8fb19SBen Gras     { 0xC07E, LIT64( 0xFFFF77FFFFFFFFFE ) },
1044*2fe8fb19SBen Gras     { 0xADC9, LIT64( 0x8000000FFFFFFFDE ) },
1045*2fe8fb19SBen Gras     { 0xC001, LIT64( 0xEFF7FFFFFFFFFFFF ) },
1046*2fe8fb19SBen Gras     { 0x4001, LIT64( 0xBE84F30125C497A6 ) },
1047*2fe8fb19SBen Gras     { 0xC06B, LIT64( 0xEFFFFFFFFFFFFFFF ) },
1048*2fe8fb19SBen Gras     { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) },
1049*2fe8fb19SBen Gras     { 0x87E9, LIT64( 0x81FFFFFFFFFFFBFF ) },
1050*2fe8fb19SBen Gras     { 0xA63F, LIT64( 0x801FFFFFFEFFFFFE ) },
1051*2fe8fb19SBen Gras     { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) },
1052*2fe8fb19SBen Gras     { 0x4018, LIT64( 0x8000000000080003 ) }
1053*2fe8fb19SBen Gras };
1054*2fe8fb19SBen Gras 
time_a_floatx80_z_int32(int32 function (floatx80))1055*2fe8fb19SBen Gras static void time_a_floatx80_z_int32( int32 function( floatx80 ) )
1056*2fe8fb19SBen Gras {
1057*2fe8fb19SBen Gras     clock_t startClock, endClock;
1058*2fe8fb19SBen Gras     int32 count, i;
1059*2fe8fb19SBen Gras     int8 inputNum;
1060*2fe8fb19SBen Gras     floatx80 a;
1061*2fe8fb19SBen Gras 
1062*2fe8fb19SBen Gras     count = 0;
1063*2fe8fb19SBen Gras     inputNum = 0;
1064*2fe8fb19SBen Gras     startClock = clock();
1065*2fe8fb19SBen Gras     do {
1066*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1067*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNum ].low;
1068*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNum ].high;
1069*2fe8fb19SBen Gras             function( a );
1070*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1071*2fe8fb19SBen Gras         }
1072*2fe8fb19SBen Gras         count += minIterations;
1073*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1074*2fe8fb19SBen Gras     inputNum = 0;
1075*2fe8fb19SBen Gras     startClock = clock();
1076*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1077*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNum ].low;
1078*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNum ].high;
1079*2fe8fb19SBen Gras         function( a );
1080*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1081*2fe8fb19SBen Gras     }
1082*2fe8fb19SBen Gras     endClock = clock();
1083*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1084*2fe8fb19SBen Gras 
1085*2fe8fb19SBen Gras }
1086*2fe8fb19SBen Gras 
time_a_floatx80_z_int64(int64 function (floatx80))1087*2fe8fb19SBen Gras static void time_a_floatx80_z_int64( int64 function( floatx80 ) )
1088*2fe8fb19SBen Gras {
1089*2fe8fb19SBen Gras     clock_t startClock, endClock;
1090*2fe8fb19SBen Gras     int32 count, i;
1091*2fe8fb19SBen Gras     int8 inputNum;
1092*2fe8fb19SBen Gras     floatx80 a;
1093*2fe8fb19SBen Gras 
1094*2fe8fb19SBen Gras     count = 0;
1095*2fe8fb19SBen Gras     inputNum = 0;
1096*2fe8fb19SBen Gras     startClock = clock();
1097*2fe8fb19SBen Gras     do {
1098*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1099*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNum ].low;
1100*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNum ].high;
1101*2fe8fb19SBen Gras             function( a );
1102*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1103*2fe8fb19SBen Gras         }
1104*2fe8fb19SBen Gras         count += minIterations;
1105*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1106*2fe8fb19SBen Gras     inputNum = 0;
1107*2fe8fb19SBen Gras     startClock = clock();
1108*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1109*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNum ].low;
1110*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNum ].high;
1111*2fe8fb19SBen Gras         function( a );
1112*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1113*2fe8fb19SBen Gras     }
1114*2fe8fb19SBen Gras     endClock = clock();
1115*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1116*2fe8fb19SBen Gras 
1117*2fe8fb19SBen Gras }
1118*2fe8fb19SBen Gras 
time_a_floatx80_z_float32(float32 function (floatx80))1119*2fe8fb19SBen Gras static void time_a_floatx80_z_float32( float32 function( floatx80 ) )
1120*2fe8fb19SBen Gras {
1121*2fe8fb19SBen Gras     clock_t startClock, endClock;
1122*2fe8fb19SBen Gras     int32 count, i;
1123*2fe8fb19SBen Gras     int8 inputNum;
1124*2fe8fb19SBen Gras     floatx80 a;
1125*2fe8fb19SBen Gras 
1126*2fe8fb19SBen Gras     count = 0;
1127*2fe8fb19SBen Gras     inputNum = 0;
1128*2fe8fb19SBen Gras     startClock = clock();
1129*2fe8fb19SBen Gras     do {
1130*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1131*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNum ].low;
1132*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNum ].high;
1133*2fe8fb19SBen Gras             function( a );
1134*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1135*2fe8fb19SBen Gras         }
1136*2fe8fb19SBen Gras         count += minIterations;
1137*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1138*2fe8fb19SBen Gras     inputNum = 0;
1139*2fe8fb19SBen Gras     startClock = clock();
1140*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1141*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNum ].low;
1142*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNum ].high;
1143*2fe8fb19SBen Gras         function( a );
1144*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1145*2fe8fb19SBen Gras     }
1146*2fe8fb19SBen Gras     endClock = clock();
1147*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1148*2fe8fb19SBen Gras 
1149*2fe8fb19SBen Gras }
1150*2fe8fb19SBen Gras 
time_a_floatx80_z_float64(float64 function (floatx80))1151*2fe8fb19SBen Gras static void time_a_floatx80_z_float64( float64 function( floatx80 ) )
1152*2fe8fb19SBen Gras {
1153*2fe8fb19SBen Gras     clock_t startClock, endClock;
1154*2fe8fb19SBen Gras     int32 count, i;
1155*2fe8fb19SBen Gras     int8 inputNum;
1156*2fe8fb19SBen Gras     floatx80 a;
1157*2fe8fb19SBen Gras 
1158*2fe8fb19SBen Gras     count = 0;
1159*2fe8fb19SBen Gras     inputNum = 0;
1160*2fe8fb19SBen Gras     startClock = clock();
1161*2fe8fb19SBen Gras     do {
1162*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1163*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNum ].low;
1164*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNum ].high;
1165*2fe8fb19SBen Gras             function( a );
1166*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1167*2fe8fb19SBen Gras         }
1168*2fe8fb19SBen Gras         count += minIterations;
1169*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1170*2fe8fb19SBen Gras     inputNum = 0;
1171*2fe8fb19SBen Gras     startClock = clock();
1172*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1173*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNum ].low;
1174*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNum ].high;
1175*2fe8fb19SBen Gras         function( a );
1176*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1177*2fe8fb19SBen Gras     }
1178*2fe8fb19SBen Gras     endClock = clock();
1179*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1180*2fe8fb19SBen Gras 
1181*2fe8fb19SBen Gras }
1182*2fe8fb19SBen Gras 
1183*2fe8fb19SBen Gras #ifdef FLOAT128
1184*2fe8fb19SBen Gras 
time_a_floatx80_z_float128(float128 function (floatx80))1185*2fe8fb19SBen Gras static void time_a_floatx80_z_float128( float128 function( floatx80 ) )
1186*2fe8fb19SBen Gras {
1187*2fe8fb19SBen Gras     clock_t startClock, endClock;
1188*2fe8fb19SBen Gras     int32 count, i;
1189*2fe8fb19SBen Gras     int8 inputNum;
1190*2fe8fb19SBen Gras     floatx80 a;
1191*2fe8fb19SBen Gras 
1192*2fe8fb19SBen Gras     count = 0;
1193*2fe8fb19SBen Gras     inputNum = 0;
1194*2fe8fb19SBen Gras     startClock = clock();
1195*2fe8fb19SBen Gras     do {
1196*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1197*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNum ].low;
1198*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNum ].high;
1199*2fe8fb19SBen Gras             function( a );
1200*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1201*2fe8fb19SBen Gras         }
1202*2fe8fb19SBen Gras         count += minIterations;
1203*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1204*2fe8fb19SBen Gras     inputNum = 0;
1205*2fe8fb19SBen Gras     startClock = clock();
1206*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1207*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNum ].low;
1208*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNum ].high;
1209*2fe8fb19SBen Gras         function( a );
1210*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1211*2fe8fb19SBen Gras     }
1212*2fe8fb19SBen Gras     endClock = clock();
1213*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1214*2fe8fb19SBen Gras 
1215*2fe8fb19SBen Gras }
1216*2fe8fb19SBen Gras 
1217*2fe8fb19SBen Gras #endif
1218*2fe8fb19SBen Gras 
time_az_floatx80(floatx80 function (floatx80))1219*2fe8fb19SBen Gras static void time_az_floatx80( floatx80 function( floatx80 ) )
1220*2fe8fb19SBen Gras {
1221*2fe8fb19SBen Gras     clock_t startClock, endClock;
1222*2fe8fb19SBen Gras     int32 count, i;
1223*2fe8fb19SBen Gras     int8 inputNum;
1224*2fe8fb19SBen Gras     floatx80 a;
1225*2fe8fb19SBen Gras 
1226*2fe8fb19SBen Gras     count = 0;
1227*2fe8fb19SBen Gras     inputNum = 0;
1228*2fe8fb19SBen Gras     startClock = clock();
1229*2fe8fb19SBen Gras     do {
1230*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1231*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNum ].low;
1232*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNum ].high;
1233*2fe8fb19SBen Gras             function( a );
1234*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1235*2fe8fb19SBen Gras         }
1236*2fe8fb19SBen Gras         count += minIterations;
1237*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1238*2fe8fb19SBen Gras     inputNum = 0;
1239*2fe8fb19SBen Gras     startClock = clock();
1240*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1241*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNum ].low;
1242*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNum ].high;
1243*2fe8fb19SBen Gras         function( a );
1244*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1245*2fe8fb19SBen Gras     }
1246*2fe8fb19SBen Gras     endClock = clock();
1247*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1248*2fe8fb19SBen Gras 
1249*2fe8fb19SBen Gras }
1250*2fe8fb19SBen Gras 
time_ab_floatx80_z_flag(flag function (floatx80,floatx80))1251*2fe8fb19SBen Gras static void time_ab_floatx80_z_flag( flag function( floatx80, floatx80 ) )
1252*2fe8fb19SBen Gras {
1253*2fe8fb19SBen Gras     clock_t startClock, endClock;
1254*2fe8fb19SBen Gras     int32 count, i;
1255*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
1256*2fe8fb19SBen Gras     floatx80 a, b;
1257*2fe8fb19SBen Gras 
1258*2fe8fb19SBen Gras     count = 0;
1259*2fe8fb19SBen Gras     inputNumA = 0;
1260*2fe8fb19SBen Gras     inputNumB = 0;
1261*2fe8fb19SBen Gras     startClock = clock();
1262*2fe8fb19SBen Gras     do {
1263*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1264*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNumA ].low;
1265*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNumA ].high;
1266*2fe8fb19SBen Gras             b.low = inputs_floatx80[ inputNumB ].low;
1267*2fe8fb19SBen Gras             b.high = inputs_floatx80[ inputNumB ].high;
1268*2fe8fb19SBen Gras             function( a, b );
1269*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
1270*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
1271*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
1272*2fe8fb19SBen Gras         }
1273*2fe8fb19SBen Gras         count += minIterations;
1274*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1275*2fe8fb19SBen Gras     inputNumA = 0;
1276*2fe8fb19SBen Gras     inputNumB = 0;
1277*2fe8fb19SBen Gras     startClock = clock();
1278*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1279*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNumA ].low;
1280*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNumA ].high;
1281*2fe8fb19SBen Gras         b.low = inputs_floatx80[ inputNumB ].low;
1282*2fe8fb19SBen Gras         b.high = inputs_floatx80[ inputNumB ].high;
1283*2fe8fb19SBen Gras         function( a, b );
1284*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
1285*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
1286*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
1287*2fe8fb19SBen Gras     }
1288*2fe8fb19SBen Gras     endClock = clock();
1289*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1290*2fe8fb19SBen Gras 
1291*2fe8fb19SBen Gras }
1292*2fe8fb19SBen Gras 
time_abz_floatx80(floatx80 function (floatx80,floatx80))1293*2fe8fb19SBen Gras static void time_abz_floatx80( floatx80 function( floatx80, floatx80 ) )
1294*2fe8fb19SBen Gras {
1295*2fe8fb19SBen Gras     clock_t startClock, endClock;
1296*2fe8fb19SBen Gras     int32 count, i;
1297*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
1298*2fe8fb19SBen Gras     floatx80 a, b;
1299*2fe8fb19SBen Gras 
1300*2fe8fb19SBen Gras     count = 0;
1301*2fe8fb19SBen Gras     inputNumA = 0;
1302*2fe8fb19SBen Gras     inputNumB = 0;
1303*2fe8fb19SBen Gras     startClock = clock();
1304*2fe8fb19SBen Gras     do {
1305*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1306*2fe8fb19SBen Gras             a.low = inputs_floatx80[ inputNumA ].low;
1307*2fe8fb19SBen Gras             a.high = inputs_floatx80[ inputNumA ].high;
1308*2fe8fb19SBen Gras             b.low = inputs_floatx80[ inputNumB ].low;
1309*2fe8fb19SBen Gras             b.high = inputs_floatx80[ inputNumB ].high;
1310*2fe8fb19SBen Gras             function( a, b );
1311*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
1312*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
1313*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
1314*2fe8fb19SBen Gras         }
1315*2fe8fb19SBen Gras         count += minIterations;
1316*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1317*2fe8fb19SBen Gras     inputNumA = 0;
1318*2fe8fb19SBen Gras     inputNumB = 0;
1319*2fe8fb19SBen Gras     startClock = clock();
1320*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1321*2fe8fb19SBen Gras         a.low = inputs_floatx80[ inputNumA ].low;
1322*2fe8fb19SBen Gras         a.high = inputs_floatx80[ inputNumA ].high;
1323*2fe8fb19SBen Gras         b.low = inputs_floatx80[ inputNumB ].low;
1324*2fe8fb19SBen Gras         b.high = inputs_floatx80[ inputNumB ].high;
1325*2fe8fb19SBen Gras         function( a, b );
1326*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
1327*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
1328*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
1329*2fe8fb19SBen Gras     }
1330*2fe8fb19SBen Gras     endClock = clock();
1331*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1332*2fe8fb19SBen Gras 
1333*2fe8fb19SBen Gras }
1334*2fe8fb19SBen Gras 
1335*2fe8fb19SBen Gras static const struct {
1336*2fe8fb19SBen Gras     bits16 high;
1337*2fe8fb19SBen Gras     bits64 low;
1338*2fe8fb19SBen Gras } inputs_floatx80_pos[ numInputs_floatx80 ] = {
1339*2fe8fb19SBen Gras     { 0x403F, LIT64( 0xA9BE15A19C1E8B62 ) },
1340*2fe8fb19SBen Gras     { 0x0000, LIT64( 0x0000000000000000 ) },
1341*2fe8fb19SBen Gras     { 0x75A8, LIT64( 0xE59591E4788957A5 ) },
1342*2fe8fb19SBen Gras     { 0x3FFF, LIT64( 0xFFF0000000000040 ) },
1343*2fe8fb19SBen Gras     { 0x0CD8, LIT64( 0xFC000000000007FE ) },
1344*2fe8fb19SBen Gras     { 0x43BA, LIT64( 0x99A4000000000000 ) },
1345*2fe8fb19SBen Gras     { 0x3FFF, LIT64( 0x8000000000000000 ) },
1346*2fe8fb19SBen Gras     { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) },
1347*2fe8fb19SBen Gras     { 0x403E, LIT64( 0xFFF0000000002000 ) },
1348*2fe8fb19SBen Gras     { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) },
1349*2fe8fb19SBen Gras     { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) },
1350*2fe8fb19SBen Gras     { 0x737A, LIT64( 0x800000007FFDFFFE ) },
1351*2fe8fb19SBen Gras     { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) },
1352*2fe8fb19SBen Gras     { 0x3BFE, LIT64( 0x8000040000001FFE ) },
1353*2fe8fb19SBen Gras     { 0x4002, LIT64( 0xFF80000000000020 ) },
1354*2fe8fb19SBen Gras     { 0x5E8D, LIT64( 0xFFFFFFFFFFE00004 ) },
1355*2fe8fb19SBen Gras     { 0x4004, LIT64( 0x8000000000003FFB ) },
1356*2fe8fb19SBen Gras     { 0x407F, LIT64( 0x800000000003FFFE ) },
1357*2fe8fb19SBen Gras     { 0x4000, LIT64( 0xA459EE6A5C16CA55 ) },
1358*2fe8fb19SBen Gras     { 0x0003, LIT64( 0xC42CBF7399AEEB94 ) },
1359*2fe8fb19SBen Gras     { 0x3F7F, LIT64( 0xF800000000000006 ) },
1360*2fe8fb19SBen Gras     { 0x407F, LIT64( 0xBF56BE8871F28FEA ) },
1361*2fe8fb19SBen Gras     { 0x407E, LIT64( 0xFFFF77FFFFFFFFFE ) },
1362*2fe8fb19SBen Gras     { 0x2DC9, LIT64( 0x8000000FFFFFFFDE ) },
1363*2fe8fb19SBen Gras     { 0x4001, LIT64( 0xEFF7FFFFFFFFFFFF ) },
1364*2fe8fb19SBen Gras     { 0x4001, LIT64( 0xBE84F30125C497A6 ) },
1365*2fe8fb19SBen Gras     { 0x406B, LIT64( 0xEFFFFFFFFFFFFFFF ) },
1366*2fe8fb19SBen Gras     { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) },
1367*2fe8fb19SBen Gras     { 0x07E9, LIT64( 0x81FFFFFFFFFFFBFF ) },
1368*2fe8fb19SBen Gras     { 0x263F, LIT64( 0x801FFFFFFEFFFFFE ) },
1369*2fe8fb19SBen Gras     { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) },
1370*2fe8fb19SBen Gras     { 0x4018, LIT64( 0x8000000000080003 ) }
1371*2fe8fb19SBen Gras };
1372*2fe8fb19SBen Gras 
time_az_floatx80_pos(floatx80 function (floatx80))1373*2fe8fb19SBen Gras static void time_az_floatx80_pos( floatx80 function( floatx80 ) )
1374*2fe8fb19SBen Gras {
1375*2fe8fb19SBen Gras     clock_t startClock, endClock;
1376*2fe8fb19SBen Gras     int32 count, i;
1377*2fe8fb19SBen Gras     int8 inputNum;
1378*2fe8fb19SBen Gras     floatx80 a;
1379*2fe8fb19SBen Gras 
1380*2fe8fb19SBen Gras     count = 0;
1381*2fe8fb19SBen Gras     inputNum = 0;
1382*2fe8fb19SBen Gras     startClock = clock();
1383*2fe8fb19SBen Gras     do {
1384*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1385*2fe8fb19SBen Gras             a.low = inputs_floatx80_pos[ inputNum ].low;
1386*2fe8fb19SBen Gras             a.high = inputs_floatx80_pos[ inputNum ].high;
1387*2fe8fb19SBen Gras             function( a );
1388*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1389*2fe8fb19SBen Gras         }
1390*2fe8fb19SBen Gras         count += minIterations;
1391*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1392*2fe8fb19SBen Gras     inputNum = 0;
1393*2fe8fb19SBen Gras     startClock = clock();
1394*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1395*2fe8fb19SBen Gras         a.low = inputs_floatx80_pos[ inputNum ].low;
1396*2fe8fb19SBen Gras         a.high = inputs_floatx80_pos[ inputNum ].high;
1397*2fe8fb19SBen Gras         function( a );
1398*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
1399*2fe8fb19SBen Gras     }
1400*2fe8fb19SBen Gras     endClock = clock();
1401*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1402*2fe8fb19SBen Gras 
1403*2fe8fb19SBen Gras }
1404*2fe8fb19SBen Gras 
1405*2fe8fb19SBen Gras #endif
1406*2fe8fb19SBen Gras 
1407*2fe8fb19SBen Gras #ifdef FLOAT128
1408*2fe8fb19SBen Gras 
1409*2fe8fb19SBen Gras enum {
1410*2fe8fb19SBen Gras     numInputs_float128 = 32
1411*2fe8fb19SBen Gras };
1412*2fe8fb19SBen Gras 
1413*2fe8fb19SBen Gras static const struct {
1414*2fe8fb19SBen Gras     bits64 high, low;
1415*2fe8fb19SBen Gras } inputs_float128[ numInputs_float128 ] = {
1416*2fe8fb19SBen Gras     { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) },
1417*2fe8fb19SBen Gras     { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) },
1418*2fe8fb19SBen Gras     { LIT64( 0x85F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) },
1419*2fe8fb19SBen Gras     { LIT64( 0xF2B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) },
1420*2fe8fb19SBen Gras     { LIT64( 0x8000000000000000 ), LIT64( 0x0000000000000000 ) },
1421*2fe8fb19SBen Gras     { LIT64( 0xBFFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) },
1422*2fe8fb19SBen Gras     { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) },
1423*2fe8fb19SBen Gras     { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) },
1424*2fe8fb19SBen Gras     { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) },
1425*2fe8fb19SBen Gras     { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) },
1426*2fe8fb19SBen Gras     { LIT64( 0xBF7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) },
1427*2fe8fb19SBen Gras     { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) },
1428*2fe8fb19SBen Gras     { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) },
1429*2fe8fb19SBen Gras     { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) },
1430*2fe8fb19SBen Gras     { LIT64( 0xBFFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) },
1431*2fe8fb19SBen Gras     { LIT64( 0xBDB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) },
1432*2fe8fb19SBen Gras     { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) },
1433*2fe8fb19SBen Gras     { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) },
1434*2fe8fb19SBen Gras     { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) },
1435*2fe8fb19SBen Gras     { LIT64( 0x8001000000000000 ), LIT64( 0x0000001000000001 ) },
1436*2fe8fb19SBen Gras     { LIT64( 0xC036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) },
1437*2fe8fb19SBen Gras     { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) },
1438*2fe8fb19SBen Gras     { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) },
1439*2fe8fb19SBen Gras     { LIT64( 0xBFFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) },
1440*2fe8fb19SBen Gras     { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) },
1441*2fe8fb19SBen Gras     { LIT64( 0xB5CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) },
1442*2fe8fb19SBen Gras     { LIT64( 0xE228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) },
1443*2fe8fb19SBen Gras     { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) },
1444*2fe8fb19SBen Gras     { LIT64( 0xC1AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) },
1445*2fe8fb19SBen Gras     { LIT64( 0xC96F000000000000 ), LIT64( 0x00000001FFFBFFFF ) },
1446*2fe8fb19SBen Gras     { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) },
1447*2fe8fb19SBen Gras     { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) }
1448*2fe8fb19SBen Gras };
1449*2fe8fb19SBen Gras 
time_a_float128_z_int32(int32 function (float128))1450*2fe8fb19SBen Gras static void time_a_float128_z_int32( int32 function( float128 ) )
1451*2fe8fb19SBen Gras {
1452*2fe8fb19SBen Gras     clock_t startClock, endClock;
1453*2fe8fb19SBen Gras     int32 count, i;
1454*2fe8fb19SBen Gras     int8 inputNum;
1455*2fe8fb19SBen Gras     float128 a;
1456*2fe8fb19SBen Gras 
1457*2fe8fb19SBen Gras     count = 0;
1458*2fe8fb19SBen Gras     inputNum = 0;
1459*2fe8fb19SBen Gras     startClock = clock();
1460*2fe8fb19SBen Gras     do {
1461*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1462*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNum ].low;
1463*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNum ].high;
1464*2fe8fb19SBen Gras             function( a );
1465*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1466*2fe8fb19SBen Gras         }
1467*2fe8fb19SBen Gras         count += minIterations;
1468*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1469*2fe8fb19SBen Gras     inputNum = 0;
1470*2fe8fb19SBen Gras     startClock = clock();
1471*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1472*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNum ].low;
1473*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNum ].high;
1474*2fe8fb19SBen Gras         function( a );
1475*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1476*2fe8fb19SBen Gras     }
1477*2fe8fb19SBen Gras     endClock = clock();
1478*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1479*2fe8fb19SBen Gras 
1480*2fe8fb19SBen Gras }
1481*2fe8fb19SBen Gras 
time_a_float128_z_int64(int64 function (float128))1482*2fe8fb19SBen Gras static void time_a_float128_z_int64( int64 function( float128 ) )
1483*2fe8fb19SBen Gras {
1484*2fe8fb19SBen Gras     clock_t startClock, endClock;
1485*2fe8fb19SBen Gras     int32 count, i;
1486*2fe8fb19SBen Gras     int8 inputNum;
1487*2fe8fb19SBen Gras     float128 a;
1488*2fe8fb19SBen Gras 
1489*2fe8fb19SBen Gras     count = 0;
1490*2fe8fb19SBen Gras     inputNum = 0;
1491*2fe8fb19SBen Gras     startClock = clock();
1492*2fe8fb19SBen Gras     do {
1493*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1494*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNum ].low;
1495*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNum ].high;
1496*2fe8fb19SBen Gras             function( a );
1497*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1498*2fe8fb19SBen Gras         }
1499*2fe8fb19SBen Gras         count += minIterations;
1500*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1501*2fe8fb19SBen Gras     inputNum = 0;
1502*2fe8fb19SBen Gras     startClock = clock();
1503*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1504*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNum ].low;
1505*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNum ].high;
1506*2fe8fb19SBen Gras         function( a );
1507*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1508*2fe8fb19SBen Gras     }
1509*2fe8fb19SBen Gras     endClock = clock();
1510*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1511*2fe8fb19SBen Gras 
1512*2fe8fb19SBen Gras }
1513*2fe8fb19SBen Gras 
time_a_float128_z_float32(float32 function (float128))1514*2fe8fb19SBen Gras static void time_a_float128_z_float32( float32 function( float128 ) )
1515*2fe8fb19SBen Gras {
1516*2fe8fb19SBen Gras     clock_t startClock, endClock;
1517*2fe8fb19SBen Gras     int32 count, i;
1518*2fe8fb19SBen Gras     int8 inputNum;
1519*2fe8fb19SBen Gras     float128 a;
1520*2fe8fb19SBen Gras 
1521*2fe8fb19SBen Gras     count = 0;
1522*2fe8fb19SBen Gras     inputNum = 0;
1523*2fe8fb19SBen Gras     startClock = clock();
1524*2fe8fb19SBen Gras     do {
1525*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1526*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNum ].low;
1527*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNum ].high;
1528*2fe8fb19SBen Gras             function( a );
1529*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1530*2fe8fb19SBen Gras         }
1531*2fe8fb19SBen Gras         count += minIterations;
1532*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1533*2fe8fb19SBen Gras     inputNum = 0;
1534*2fe8fb19SBen Gras     startClock = clock();
1535*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1536*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNum ].low;
1537*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNum ].high;
1538*2fe8fb19SBen Gras         function( a );
1539*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1540*2fe8fb19SBen Gras     }
1541*2fe8fb19SBen Gras     endClock = clock();
1542*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1543*2fe8fb19SBen Gras 
1544*2fe8fb19SBen Gras }
1545*2fe8fb19SBen Gras 
time_a_float128_z_float64(float64 function (float128))1546*2fe8fb19SBen Gras static void time_a_float128_z_float64( float64 function( float128 ) )
1547*2fe8fb19SBen Gras {
1548*2fe8fb19SBen Gras     clock_t startClock, endClock;
1549*2fe8fb19SBen Gras     int32 count, i;
1550*2fe8fb19SBen Gras     int8 inputNum;
1551*2fe8fb19SBen Gras     float128 a;
1552*2fe8fb19SBen Gras 
1553*2fe8fb19SBen Gras     count = 0;
1554*2fe8fb19SBen Gras     inputNum = 0;
1555*2fe8fb19SBen Gras     startClock = clock();
1556*2fe8fb19SBen Gras     do {
1557*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1558*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNum ].low;
1559*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNum ].high;
1560*2fe8fb19SBen Gras             function( a );
1561*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1562*2fe8fb19SBen Gras         }
1563*2fe8fb19SBen Gras         count += minIterations;
1564*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1565*2fe8fb19SBen Gras     inputNum = 0;
1566*2fe8fb19SBen Gras     startClock = clock();
1567*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1568*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNum ].low;
1569*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNum ].high;
1570*2fe8fb19SBen Gras         function( a );
1571*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1572*2fe8fb19SBen Gras     }
1573*2fe8fb19SBen Gras     endClock = clock();
1574*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1575*2fe8fb19SBen Gras 
1576*2fe8fb19SBen Gras }
1577*2fe8fb19SBen Gras 
1578*2fe8fb19SBen Gras #ifdef FLOATX80
1579*2fe8fb19SBen Gras 
time_a_float128_z_floatx80(floatx80 function (float128))1580*2fe8fb19SBen Gras static void time_a_float128_z_floatx80( floatx80 function( float128 ) )
1581*2fe8fb19SBen Gras {
1582*2fe8fb19SBen Gras     clock_t startClock, endClock;
1583*2fe8fb19SBen Gras     int32 count, i;
1584*2fe8fb19SBen Gras     int8 inputNum;
1585*2fe8fb19SBen Gras     float128 a;
1586*2fe8fb19SBen Gras 
1587*2fe8fb19SBen Gras     count = 0;
1588*2fe8fb19SBen Gras     inputNum = 0;
1589*2fe8fb19SBen Gras     startClock = clock();
1590*2fe8fb19SBen Gras     do {
1591*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1592*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNum ].low;
1593*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNum ].high;
1594*2fe8fb19SBen Gras             function( a );
1595*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1596*2fe8fb19SBen Gras         }
1597*2fe8fb19SBen Gras         count += minIterations;
1598*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1599*2fe8fb19SBen Gras     inputNum = 0;
1600*2fe8fb19SBen Gras     startClock = clock();
1601*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1602*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNum ].low;
1603*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNum ].high;
1604*2fe8fb19SBen Gras         function( a );
1605*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1606*2fe8fb19SBen Gras     }
1607*2fe8fb19SBen Gras     endClock = clock();
1608*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1609*2fe8fb19SBen Gras 
1610*2fe8fb19SBen Gras }
1611*2fe8fb19SBen Gras 
1612*2fe8fb19SBen Gras #endif
1613*2fe8fb19SBen Gras 
time_az_float128(float128 function (float128))1614*2fe8fb19SBen Gras static void time_az_float128( float128 function( float128 ) )
1615*2fe8fb19SBen Gras {
1616*2fe8fb19SBen Gras     clock_t startClock, endClock;
1617*2fe8fb19SBen Gras     int32 count, i;
1618*2fe8fb19SBen Gras     int8 inputNum;
1619*2fe8fb19SBen Gras     float128 a;
1620*2fe8fb19SBen Gras 
1621*2fe8fb19SBen Gras     count = 0;
1622*2fe8fb19SBen Gras     inputNum = 0;
1623*2fe8fb19SBen Gras     startClock = clock();
1624*2fe8fb19SBen Gras     do {
1625*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1626*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNum ].low;
1627*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNum ].high;
1628*2fe8fb19SBen Gras             function( a );
1629*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1630*2fe8fb19SBen Gras         }
1631*2fe8fb19SBen Gras         count += minIterations;
1632*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1633*2fe8fb19SBen Gras     inputNum = 0;
1634*2fe8fb19SBen Gras     startClock = clock();
1635*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1636*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNum ].low;
1637*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNum ].high;
1638*2fe8fb19SBen Gras         function( a );
1639*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1640*2fe8fb19SBen Gras     }
1641*2fe8fb19SBen Gras     endClock = clock();
1642*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1643*2fe8fb19SBen Gras 
1644*2fe8fb19SBen Gras }
1645*2fe8fb19SBen Gras 
time_ab_float128_z_flag(flag function (float128,float128))1646*2fe8fb19SBen Gras static void time_ab_float128_z_flag( flag function( float128, float128 ) )
1647*2fe8fb19SBen Gras {
1648*2fe8fb19SBen Gras     clock_t startClock, endClock;
1649*2fe8fb19SBen Gras     int32 count, i;
1650*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
1651*2fe8fb19SBen Gras     float128 a, b;
1652*2fe8fb19SBen Gras 
1653*2fe8fb19SBen Gras     count = 0;
1654*2fe8fb19SBen Gras     inputNumA = 0;
1655*2fe8fb19SBen Gras     inputNumB = 0;
1656*2fe8fb19SBen Gras     startClock = clock();
1657*2fe8fb19SBen Gras     do {
1658*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1659*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNumA ].low;
1660*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNumA ].high;
1661*2fe8fb19SBen Gras             b.low = inputs_float128[ inputNumB ].low;
1662*2fe8fb19SBen Gras             b.high = inputs_float128[ inputNumB ].high;
1663*2fe8fb19SBen Gras             function( a, b );
1664*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
1665*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
1666*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
1667*2fe8fb19SBen Gras         }
1668*2fe8fb19SBen Gras         count += minIterations;
1669*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1670*2fe8fb19SBen Gras     inputNumA = 0;
1671*2fe8fb19SBen Gras     inputNumB = 0;
1672*2fe8fb19SBen Gras     startClock = clock();
1673*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1674*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNumA ].low;
1675*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNumA ].high;
1676*2fe8fb19SBen Gras         b.low = inputs_float128[ inputNumB ].low;
1677*2fe8fb19SBen Gras         b.high = inputs_float128[ inputNumB ].high;
1678*2fe8fb19SBen Gras         function( a, b );
1679*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
1680*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
1681*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
1682*2fe8fb19SBen Gras     }
1683*2fe8fb19SBen Gras     endClock = clock();
1684*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1685*2fe8fb19SBen Gras 
1686*2fe8fb19SBen Gras }
1687*2fe8fb19SBen Gras 
time_abz_float128(float128 function (float128,float128))1688*2fe8fb19SBen Gras static void time_abz_float128( float128 function( float128, float128 ) )
1689*2fe8fb19SBen Gras {
1690*2fe8fb19SBen Gras     clock_t startClock, endClock;
1691*2fe8fb19SBen Gras     int32 count, i;
1692*2fe8fb19SBen Gras     int8 inputNumA, inputNumB;
1693*2fe8fb19SBen Gras     float128 a, b;
1694*2fe8fb19SBen Gras 
1695*2fe8fb19SBen Gras     count = 0;
1696*2fe8fb19SBen Gras     inputNumA = 0;
1697*2fe8fb19SBen Gras     inputNumB = 0;
1698*2fe8fb19SBen Gras     startClock = clock();
1699*2fe8fb19SBen Gras     do {
1700*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1701*2fe8fb19SBen Gras             a.low = inputs_float128[ inputNumA ].low;
1702*2fe8fb19SBen Gras             a.high = inputs_float128[ inputNumA ].high;
1703*2fe8fb19SBen Gras             b.low = inputs_float128[ inputNumB ].low;
1704*2fe8fb19SBen Gras             b.high = inputs_float128[ inputNumB ].high;
1705*2fe8fb19SBen Gras             function( a, b );
1706*2fe8fb19SBen Gras             inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
1707*2fe8fb19SBen Gras             if ( inputNumA == 0 ) ++inputNumB;
1708*2fe8fb19SBen Gras             inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
1709*2fe8fb19SBen Gras         }
1710*2fe8fb19SBen Gras         count += minIterations;
1711*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1712*2fe8fb19SBen Gras     inputNumA = 0;
1713*2fe8fb19SBen Gras     inputNumB = 0;
1714*2fe8fb19SBen Gras     startClock = clock();
1715*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1716*2fe8fb19SBen Gras         a.low = inputs_float128[ inputNumA ].low;
1717*2fe8fb19SBen Gras         a.high = inputs_float128[ inputNumA ].high;
1718*2fe8fb19SBen Gras         b.low = inputs_float128[ inputNumB ].low;
1719*2fe8fb19SBen Gras         b.high = inputs_float128[ inputNumB ].high;
1720*2fe8fb19SBen Gras         function( a, b );
1721*2fe8fb19SBen Gras         inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
1722*2fe8fb19SBen Gras         if ( inputNumA == 0 ) ++inputNumB;
1723*2fe8fb19SBen Gras         inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
1724*2fe8fb19SBen Gras     }
1725*2fe8fb19SBen Gras     endClock = clock();
1726*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1727*2fe8fb19SBen Gras 
1728*2fe8fb19SBen Gras }
1729*2fe8fb19SBen Gras 
1730*2fe8fb19SBen Gras static const struct {
1731*2fe8fb19SBen Gras     bits64 high, low;
1732*2fe8fb19SBen Gras } inputs_float128_pos[ numInputs_float128 ] = {
1733*2fe8fb19SBen Gras     { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) },
1734*2fe8fb19SBen Gras     { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) },
1735*2fe8fb19SBen Gras     { LIT64( 0x05F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) },
1736*2fe8fb19SBen Gras     { LIT64( 0x72B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) },
1737*2fe8fb19SBen Gras     { LIT64( 0x0000000000000000 ), LIT64( 0x0000000000000000 ) },
1738*2fe8fb19SBen Gras     { LIT64( 0x3FFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) },
1739*2fe8fb19SBen Gras     { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) },
1740*2fe8fb19SBen Gras     { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) },
1741*2fe8fb19SBen Gras     { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) },
1742*2fe8fb19SBen Gras     { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) },
1743*2fe8fb19SBen Gras     { LIT64( 0x3F7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) },
1744*2fe8fb19SBen Gras     { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) },
1745*2fe8fb19SBen Gras     { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) },
1746*2fe8fb19SBen Gras     { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) },
1747*2fe8fb19SBen Gras     { LIT64( 0x3FFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) },
1748*2fe8fb19SBen Gras     { LIT64( 0x3DB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) },
1749*2fe8fb19SBen Gras     { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) },
1750*2fe8fb19SBen Gras     { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) },
1751*2fe8fb19SBen Gras     { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) },
1752*2fe8fb19SBen Gras     { LIT64( 0x0001000000000000 ), LIT64( 0x0000001000000001 ) },
1753*2fe8fb19SBen Gras     { LIT64( 0x4036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) },
1754*2fe8fb19SBen Gras     { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) },
1755*2fe8fb19SBen Gras     { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) },
1756*2fe8fb19SBen Gras     { LIT64( 0x3FFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) },
1757*2fe8fb19SBen Gras     { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) },
1758*2fe8fb19SBen Gras     { LIT64( 0x35CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) },
1759*2fe8fb19SBen Gras     { LIT64( 0x6228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) },
1760*2fe8fb19SBen Gras     { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) },
1761*2fe8fb19SBen Gras     { LIT64( 0x41AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) },
1762*2fe8fb19SBen Gras     { LIT64( 0x496F000000000000 ), LIT64( 0x00000001FFFBFFFF ) },
1763*2fe8fb19SBen Gras     { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) },
1764*2fe8fb19SBen Gras     { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) }
1765*2fe8fb19SBen Gras };
1766*2fe8fb19SBen Gras 
time_az_float128_pos(float128 function (float128))1767*2fe8fb19SBen Gras static void time_az_float128_pos( float128 function( float128 ) )
1768*2fe8fb19SBen Gras {
1769*2fe8fb19SBen Gras     clock_t startClock, endClock;
1770*2fe8fb19SBen Gras     int32 count, i;
1771*2fe8fb19SBen Gras     int8 inputNum;
1772*2fe8fb19SBen Gras     float128 a;
1773*2fe8fb19SBen Gras 
1774*2fe8fb19SBen Gras     count = 0;
1775*2fe8fb19SBen Gras     inputNum = 0;
1776*2fe8fb19SBen Gras     startClock = clock();
1777*2fe8fb19SBen Gras     do {
1778*2fe8fb19SBen Gras         for ( i = minIterations; i; --i ) {
1779*2fe8fb19SBen Gras             a.low = inputs_float128_pos[ inputNum ].low;
1780*2fe8fb19SBen Gras             a.high = inputs_float128_pos[ inputNum ].high;
1781*2fe8fb19SBen Gras             function( a );
1782*2fe8fb19SBen Gras             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1783*2fe8fb19SBen Gras         }
1784*2fe8fb19SBen Gras         count += minIterations;
1785*2fe8fb19SBen Gras     } while ( clock() - startClock < CLOCKS_PER_SEC );
1786*2fe8fb19SBen Gras     inputNum = 0;
1787*2fe8fb19SBen Gras     startClock = clock();
1788*2fe8fb19SBen Gras     for ( i = count; i; --i ) {
1789*2fe8fb19SBen Gras         a.low = inputs_float128_pos[ inputNum ].low;
1790*2fe8fb19SBen Gras         a.high = inputs_float128_pos[ inputNum ].high;
1791*2fe8fb19SBen Gras         function( a );
1792*2fe8fb19SBen Gras         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
1793*2fe8fb19SBen Gras     }
1794*2fe8fb19SBen Gras     endClock = clock();
1795*2fe8fb19SBen Gras     reportTime( count, endClock - startClock );
1796*2fe8fb19SBen Gras 
1797*2fe8fb19SBen Gras }
1798*2fe8fb19SBen Gras 
1799*2fe8fb19SBen Gras #endif
1800*2fe8fb19SBen Gras 
1801*2fe8fb19SBen Gras enum {
1802*2fe8fb19SBen Gras     INT32_TO_FLOAT32 = 1,
1803*2fe8fb19SBen Gras     INT32_TO_FLOAT64,
1804*2fe8fb19SBen Gras #ifdef FLOATX80
1805*2fe8fb19SBen Gras     INT32_TO_FLOATX80,
1806*2fe8fb19SBen Gras #endif
1807*2fe8fb19SBen Gras #ifdef FLOAT128
1808*2fe8fb19SBen Gras     INT32_TO_FLOAT128,
1809*2fe8fb19SBen Gras #endif
1810*2fe8fb19SBen Gras     INT64_TO_FLOAT32,
1811*2fe8fb19SBen Gras     INT64_TO_FLOAT64,
1812*2fe8fb19SBen Gras #ifdef FLOATX80
1813*2fe8fb19SBen Gras     INT64_TO_FLOATX80,
1814*2fe8fb19SBen Gras #endif
1815*2fe8fb19SBen Gras #ifdef FLOAT128
1816*2fe8fb19SBen Gras     INT64_TO_FLOAT128,
1817*2fe8fb19SBen Gras #endif
1818*2fe8fb19SBen Gras     FLOAT32_TO_INT32,
1819*2fe8fb19SBen Gras     FLOAT32_TO_INT32_ROUND_TO_ZERO,
1820*2fe8fb19SBen Gras     FLOAT32_TO_INT64,
1821*2fe8fb19SBen Gras     FLOAT32_TO_INT64_ROUND_TO_ZERO,
1822*2fe8fb19SBen Gras     FLOAT32_TO_FLOAT64,
1823*2fe8fb19SBen Gras #ifdef FLOATX80
1824*2fe8fb19SBen Gras     FLOAT32_TO_FLOATX80,
1825*2fe8fb19SBen Gras #endif
1826*2fe8fb19SBen Gras #ifdef FLOAT128
1827*2fe8fb19SBen Gras     FLOAT32_TO_FLOAT128,
1828*2fe8fb19SBen Gras #endif
1829*2fe8fb19SBen Gras     FLOAT32_ROUND_TO_INT,
1830*2fe8fb19SBen Gras     FLOAT32_ADD,
1831*2fe8fb19SBen Gras     FLOAT32_SUB,
1832*2fe8fb19SBen Gras     FLOAT32_MUL,
1833*2fe8fb19SBen Gras     FLOAT32_DIV,
1834*2fe8fb19SBen Gras     FLOAT32_REM,
1835*2fe8fb19SBen Gras     FLOAT32_SQRT,
1836*2fe8fb19SBen Gras     FLOAT32_EQ,
1837*2fe8fb19SBen Gras     FLOAT32_LE,
1838*2fe8fb19SBen Gras     FLOAT32_LT,
1839*2fe8fb19SBen Gras     FLOAT32_EQ_SIGNALING,
1840*2fe8fb19SBen Gras     FLOAT32_LE_QUIET,
1841*2fe8fb19SBen Gras     FLOAT32_LT_QUIET,
1842*2fe8fb19SBen Gras     FLOAT64_TO_INT32,
1843*2fe8fb19SBen Gras     FLOAT64_TO_INT32_ROUND_TO_ZERO,
1844*2fe8fb19SBen Gras     FLOAT64_TO_INT64,
1845*2fe8fb19SBen Gras     FLOAT64_TO_INT64_ROUND_TO_ZERO,
1846*2fe8fb19SBen Gras     FLOAT64_TO_FLOAT32,
1847*2fe8fb19SBen Gras #ifdef FLOATX80
1848*2fe8fb19SBen Gras     FLOAT64_TO_FLOATX80,
1849*2fe8fb19SBen Gras #endif
1850*2fe8fb19SBen Gras #ifdef FLOAT128
1851*2fe8fb19SBen Gras     FLOAT64_TO_FLOAT128,
1852*2fe8fb19SBen Gras #endif
1853*2fe8fb19SBen Gras     FLOAT64_ROUND_TO_INT,
1854*2fe8fb19SBen Gras     FLOAT64_ADD,
1855*2fe8fb19SBen Gras     FLOAT64_SUB,
1856*2fe8fb19SBen Gras     FLOAT64_MUL,
1857*2fe8fb19SBen Gras     FLOAT64_DIV,
1858*2fe8fb19SBen Gras     FLOAT64_REM,
1859*2fe8fb19SBen Gras     FLOAT64_SQRT,
1860*2fe8fb19SBen Gras     FLOAT64_EQ,
1861*2fe8fb19SBen Gras     FLOAT64_LE,
1862*2fe8fb19SBen Gras     FLOAT64_LT,
1863*2fe8fb19SBen Gras     FLOAT64_EQ_SIGNALING,
1864*2fe8fb19SBen Gras     FLOAT64_LE_QUIET,
1865*2fe8fb19SBen Gras     FLOAT64_LT_QUIET,
1866*2fe8fb19SBen Gras #ifdef FLOATX80
1867*2fe8fb19SBen Gras     FLOATX80_TO_INT32,
1868*2fe8fb19SBen Gras     FLOATX80_TO_INT32_ROUND_TO_ZERO,
1869*2fe8fb19SBen Gras     FLOATX80_TO_INT64,
1870*2fe8fb19SBen Gras     FLOATX80_TO_INT64_ROUND_TO_ZERO,
1871*2fe8fb19SBen Gras     FLOATX80_TO_FLOAT32,
1872*2fe8fb19SBen Gras     FLOATX80_TO_FLOAT64,
1873*2fe8fb19SBen Gras #ifdef FLOAT128
1874*2fe8fb19SBen Gras     FLOATX80_TO_FLOAT128,
1875*2fe8fb19SBen Gras #endif
1876*2fe8fb19SBen Gras     FLOATX80_ROUND_TO_INT,
1877*2fe8fb19SBen Gras     FLOATX80_ADD,
1878*2fe8fb19SBen Gras     FLOATX80_SUB,
1879*2fe8fb19SBen Gras     FLOATX80_MUL,
1880*2fe8fb19SBen Gras     FLOATX80_DIV,
1881*2fe8fb19SBen Gras     FLOATX80_REM,
1882*2fe8fb19SBen Gras     FLOATX80_SQRT,
1883*2fe8fb19SBen Gras     FLOATX80_EQ,
1884*2fe8fb19SBen Gras     FLOATX80_LE,
1885*2fe8fb19SBen Gras     FLOATX80_LT,
1886*2fe8fb19SBen Gras     FLOATX80_EQ_SIGNALING,
1887*2fe8fb19SBen Gras     FLOATX80_LE_QUIET,
1888*2fe8fb19SBen Gras     FLOATX80_LT_QUIET,
1889*2fe8fb19SBen Gras #endif
1890*2fe8fb19SBen Gras #ifdef FLOAT128
1891*2fe8fb19SBen Gras     FLOAT128_TO_INT32,
1892*2fe8fb19SBen Gras     FLOAT128_TO_INT32_ROUND_TO_ZERO,
1893*2fe8fb19SBen Gras     FLOAT128_TO_INT64,
1894*2fe8fb19SBen Gras     FLOAT128_TO_INT64_ROUND_TO_ZERO,
1895*2fe8fb19SBen Gras     FLOAT128_TO_FLOAT32,
1896*2fe8fb19SBen Gras     FLOAT128_TO_FLOAT64,
1897*2fe8fb19SBen Gras #ifdef FLOATX80
1898*2fe8fb19SBen Gras     FLOAT128_TO_FLOATX80,
1899*2fe8fb19SBen Gras #endif
1900*2fe8fb19SBen Gras     FLOAT128_ROUND_TO_INT,
1901*2fe8fb19SBen Gras     FLOAT128_ADD,
1902*2fe8fb19SBen Gras     FLOAT128_SUB,
1903*2fe8fb19SBen Gras     FLOAT128_MUL,
1904*2fe8fb19SBen Gras     FLOAT128_DIV,
1905*2fe8fb19SBen Gras     FLOAT128_REM,
1906*2fe8fb19SBen Gras     FLOAT128_SQRT,
1907*2fe8fb19SBen Gras     FLOAT128_EQ,
1908*2fe8fb19SBen Gras     FLOAT128_LE,
1909*2fe8fb19SBen Gras     FLOAT128_LT,
1910*2fe8fb19SBen Gras     FLOAT128_EQ_SIGNALING,
1911*2fe8fb19SBen Gras     FLOAT128_LE_QUIET,
1912*2fe8fb19SBen Gras     FLOAT128_LT_QUIET,
1913*2fe8fb19SBen Gras #endif
1914*2fe8fb19SBen Gras     NUM_FUNCTIONS
1915*2fe8fb19SBen Gras };
1916*2fe8fb19SBen Gras 
1917*2fe8fb19SBen Gras static struct {
1918*2fe8fb19SBen Gras     char *name;
1919*2fe8fb19SBen Gras     int8 numInputs;
1920*2fe8fb19SBen Gras     flag roundingPrecision, roundingMode;
1921*2fe8fb19SBen Gras     flag tininessMode, tininessModeAtReducedPrecision;
1922*2fe8fb19SBen Gras } functions[ NUM_FUNCTIONS ] = {
1923*2fe8fb19SBen Gras     { 0, 0, 0, 0, 0, 0 },
1924*2fe8fb19SBen Gras     { "int32_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
1925*2fe8fb19SBen Gras     { "int32_to_float64",                1, FALSE, FALSE, FALSE, FALSE },
1926*2fe8fb19SBen Gras #ifdef FLOATX80
1927*2fe8fb19SBen Gras     { "int32_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
1928*2fe8fb19SBen Gras #endif
1929*2fe8fb19SBen Gras #ifdef FLOAT128
1930*2fe8fb19SBen Gras     { "int32_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
1931*2fe8fb19SBen Gras #endif
1932*2fe8fb19SBen Gras     { "int64_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
1933*2fe8fb19SBen Gras     { "int64_to_float64",                1, FALSE, TRUE,  FALSE, FALSE },
1934*2fe8fb19SBen Gras #ifdef FLOATX80
1935*2fe8fb19SBen Gras     { "int64_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
1936*2fe8fb19SBen Gras #endif
1937*2fe8fb19SBen Gras #ifdef FLOAT128
1938*2fe8fb19SBen Gras     { "int64_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
1939*2fe8fb19SBen Gras #endif
1940*2fe8fb19SBen Gras     { "float32_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
1941*2fe8fb19SBen Gras     { "float32_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
1942*2fe8fb19SBen Gras     { "float32_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
1943*2fe8fb19SBen Gras     { "float32_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
1944*2fe8fb19SBen Gras     { "float32_to_float64",              1, FALSE, FALSE, FALSE, FALSE },
1945*2fe8fb19SBen Gras #ifdef FLOATX80
1946*2fe8fb19SBen Gras     { "float32_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
1947*2fe8fb19SBen Gras #endif
1948*2fe8fb19SBen Gras #ifdef FLOAT128
1949*2fe8fb19SBen Gras     { "float32_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
1950*2fe8fb19SBen Gras #endif
1951*2fe8fb19SBen Gras     { "float32_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
1952*2fe8fb19SBen Gras     { "float32_add",                     2, FALSE, TRUE,  FALSE, FALSE },
1953*2fe8fb19SBen Gras     { "float32_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
1954*2fe8fb19SBen Gras     { "float32_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
1955*2fe8fb19SBen Gras     { "float32_div",                     2, FALSE, TRUE,  FALSE, FALSE },
1956*2fe8fb19SBen Gras     { "float32_rem",                     2, FALSE, FALSE, FALSE, FALSE },
1957*2fe8fb19SBen Gras     { "float32_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
1958*2fe8fb19SBen Gras     { "float32_eq",                      2, FALSE, FALSE, FALSE, FALSE },
1959*2fe8fb19SBen Gras     { "float32_le",                      2, FALSE, FALSE, FALSE, FALSE },
1960*2fe8fb19SBen Gras     { "float32_lt",                      2, FALSE, FALSE, FALSE, FALSE },
1961*2fe8fb19SBen Gras     { "float32_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
1962*2fe8fb19SBen Gras     { "float32_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
1963*2fe8fb19SBen Gras     { "float32_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
1964*2fe8fb19SBen Gras     { "float64_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
1965*2fe8fb19SBen Gras     { "float64_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
1966*2fe8fb19SBen Gras     { "float64_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
1967*2fe8fb19SBen Gras     { "float64_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
1968*2fe8fb19SBen Gras     { "float64_to_float32",              1, FALSE, TRUE,  TRUE,  FALSE },
1969*2fe8fb19SBen Gras #ifdef FLOATX80
1970*2fe8fb19SBen Gras     { "float64_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
1971*2fe8fb19SBen Gras #endif
1972*2fe8fb19SBen Gras #ifdef FLOAT128
1973*2fe8fb19SBen Gras     { "float64_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
1974*2fe8fb19SBen Gras #endif
1975*2fe8fb19SBen Gras     { "float64_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
1976*2fe8fb19SBen Gras     { "float64_add",                     2, FALSE, TRUE,  FALSE, FALSE },
1977*2fe8fb19SBen Gras     { "float64_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
1978*2fe8fb19SBen Gras     { "float64_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
1979*2fe8fb19SBen Gras     { "float64_div",                     2, FALSE, TRUE,  FALSE, FALSE },
1980*2fe8fb19SBen Gras     { "float64_rem",                     2, FALSE, FALSE, FALSE, FALSE },
1981*2fe8fb19SBen Gras     { "float64_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
1982*2fe8fb19SBen Gras     { "float64_eq",                      2, FALSE, FALSE, FALSE, FALSE },
1983*2fe8fb19SBen Gras     { "float64_le",                      2, FALSE, FALSE, FALSE, FALSE },
1984*2fe8fb19SBen Gras     { "float64_lt",                      2, FALSE, FALSE, FALSE, FALSE },
1985*2fe8fb19SBen Gras     { "float64_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
1986*2fe8fb19SBen Gras     { "float64_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
1987*2fe8fb19SBen Gras     { "float64_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
1988*2fe8fb19SBen Gras #ifdef FLOATX80
1989*2fe8fb19SBen Gras     { "floatx80_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
1990*2fe8fb19SBen Gras     { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
1991*2fe8fb19SBen Gras     { "floatx80_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
1992*2fe8fb19SBen Gras     { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
1993*2fe8fb19SBen Gras     { "floatx80_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
1994*2fe8fb19SBen Gras     { "floatx80_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
1995*2fe8fb19SBen Gras #ifdef FLOAT128
1996*2fe8fb19SBen Gras     { "floatx80_to_float128",            1, FALSE, FALSE, FALSE, FALSE },
1997*2fe8fb19SBen Gras #endif
1998*2fe8fb19SBen Gras     { "floatx80_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
1999*2fe8fb19SBen Gras     { "floatx80_add",                    2, TRUE,  TRUE,  FALSE, TRUE  },
2000*2fe8fb19SBen Gras     { "floatx80_sub",                    2, TRUE,  TRUE,  FALSE, TRUE  },
2001*2fe8fb19SBen Gras     { "floatx80_mul",                    2, TRUE,  TRUE,  TRUE,  TRUE  },
2002*2fe8fb19SBen Gras     { "floatx80_div",                    2, TRUE,  TRUE,  FALSE, TRUE  },
2003*2fe8fb19SBen Gras     { "floatx80_rem",                    2, FALSE, FALSE, FALSE, FALSE },
2004*2fe8fb19SBen Gras     { "floatx80_sqrt",                   1, TRUE,  TRUE,  FALSE, FALSE },
2005*2fe8fb19SBen Gras     { "floatx80_eq",                     2, FALSE, FALSE, FALSE, FALSE },
2006*2fe8fb19SBen Gras     { "floatx80_le",                     2, FALSE, FALSE, FALSE, FALSE },
2007*2fe8fb19SBen Gras     { "floatx80_lt",                     2, FALSE, FALSE, FALSE, FALSE },
2008*2fe8fb19SBen Gras     { "floatx80_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
2009*2fe8fb19SBen Gras     { "floatx80_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
2010*2fe8fb19SBen Gras     { "floatx80_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
2011*2fe8fb19SBen Gras #endif
2012*2fe8fb19SBen Gras #ifdef FLOAT128
2013*2fe8fb19SBen Gras     { "float128_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
2014*2fe8fb19SBen Gras     { "float128_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
2015*2fe8fb19SBen Gras     { "float128_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
2016*2fe8fb19SBen Gras     { "float128_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
2017*2fe8fb19SBen Gras     { "float128_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
2018*2fe8fb19SBen Gras     { "float128_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
2019*2fe8fb19SBen Gras #ifdef FLOATX80
2020*2fe8fb19SBen Gras     { "float128_to_floatx80",            1, FALSE, TRUE,  TRUE,  FALSE },
2021*2fe8fb19SBen Gras #endif
2022*2fe8fb19SBen Gras     { "float128_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
2023*2fe8fb19SBen Gras     { "float128_add",                    2, FALSE, TRUE,  FALSE, FALSE },
2024*2fe8fb19SBen Gras     { "float128_sub",                    2, FALSE, TRUE,  FALSE, FALSE },
2025*2fe8fb19SBen Gras     { "float128_mul",                    2, FALSE, TRUE,  TRUE,  FALSE },
2026*2fe8fb19SBen Gras     { "float128_div",                    2, FALSE, TRUE,  FALSE, FALSE },
2027*2fe8fb19SBen Gras     { "float128_rem",                    2, FALSE, FALSE, FALSE, FALSE },
2028*2fe8fb19SBen Gras     { "float128_sqrt",                   1, FALSE, TRUE,  FALSE, FALSE },
2029*2fe8fb19SBen Gras     { "float128_eq",                     2, FALSE, FALSE, FALSE, FALSE },
2030*2fe8fb19SBen Gras     { "float128_le",                     2, FALSE, FALSE, FALSE, FALSE },
2031*2fe8fb19SBen Gras     { "float128_lt",                     2, FALSE, FALSE, FALSE, FALSE },
2032*2fe8fb19SBen Gras     { "float128_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
2033*2fe8fb19SBen Gras     { "float128_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
2034*2fe8fb19SBen Gras     { "float128_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
2035*2fe8fb19SBen Gras #endif
2036*2fe8fb19SBen Gras };
2037*2fe8fb19SBen Gras 
2038*2fe8fb19SBen Gras enum {
2039*2fe8fb19SBen Gras     ROUND_NEAREST_EVEN = 1,
2040*2fe8fb19SBen Gras     ROUND_TO_ZERO,
2041*2fe8fb19SBen Gras     ROUND_DOWN,
2042*2fe8fb19SBen Gras     ROUND_UP,
2043*2fe8fb19SBen Gras     NUM_ROUNDINGMODES
2044*2fe8fb19SBen Gras };
2045*2fe8fb19SBen Gras enum {
2046*2fe8fb19SBen Gras     TININESS_BEFORE_ROUNDING = 1,
2047*2fe8fb19SBen Gras     TININESS_AFTER_ROUNDING,
2048*2fe8fb19SBen Gras     NUM_TININESSMODES
2049*2fe8fb19SBen Gras };
2050*2fe8fb19SBen Gras 
2051*2fe8fb19SBen Gras static void
timeFunctionVariety(uint8 functionCode,int8 roundingPrecision,int8 roundingMode,int8 tininessMode)2052*2fe8fb19SBen Gras  timeFunctionVariety(
2053*2fe8fb19SBen Gras      uint8 functionCode,
2054*2fe8fb19SBen Gras      int8 roundingPrecision,
2055*2fe8fb19SBen Gras      int8 roundingMode,
2056*2fe8fb19SBen Gras      int8 tininessMode
2057*2fe8fb19SBen Gras  )
2058*2fe8fb19SBen Gras {
2059*2fe8fb19SBen Gras     uint8 roundingCode;
2060*2fe8fb19SBen Gras     int8 tininessCode;
2061*2fe8fb19SBen Gras 
2062*2fe8fb19SBen Gras     functionName = functions[ functionCode ].name;
2063*2fe8fb19SBen Gras     if ( roundingPrecision == 32 ) {
2064*2fe8fb19SBen Gras         roundingPrecisionName = "32";
2065*2fe8fb19SBen Gras     }
2066*2fe8fb19SBen Gras     else if ( roundingPrecision == 64 ) {
2067*2fe8fb19SBen Gras         roundingPrecisionName = "64";
2068*2fe8fb19SBen Gras     }
2069*2fe8fb19SBen Gras     else if ( roundingPrecision == 80 ) {
2070*2fe8fb19SBen Gras         roundingPrecisionName = "80";
2071*2fe8fb19SBen Gras     }
2072*2fe8fb19SBen Gras     else {
2073*2fe8fb19SBen Gras         roundingPrecisionName = 0;
2074*2fe8fb19SBen Gras     }
2075*2fe8fb19SBen Gras #ifdef FLOATX80
2076*2fe8fb19SBen Gras     floatx80_rounding_precision = roundingPrecision;
2077*2fe8fb19SBen Gras #endif
2078*2fe8fb19SBen Gras     switch ( roundingMode ) {
2079*2fe8fb19SBen Gras      case 0:
2080*2fe8fb19SBen Gras         roundingModeName = 0;
2081*2fe8fb19SBen Gras         roundingCode = float_round_nearest_even;
2082*2fe8fb19SBen Gras         break;
2083*2fe8fb19SBen Gras      case ROUND_NEAREST_EVEN:
2084*2fe8fb19SBen Gras         roundingModeName = "nearest_even";
2085*2fe8fb19SBen Gras         roundingCode = float_round_nearest_even;
2086*2fe8fb19SBen Gras         break;
2087*2fe8fb19SBen Gras      case ROUND_TO_ZERO:
2088*2fe8fb19SBen Gras         roundingModeName = "to_zero";
2089*2fe8fb19SBen Gras         roundingCode = float_round_to_zero;
2090*2fe8fb19SBen Gras         break;
2091*2fe8fb19SBen Gras      case ROUND_DOWN:
2092*2fe8fb19SBen Gras         roundingModeName = "down";
2093*2fe8fb19SBen Gras         roundingCode = float_round_down;
2094*2fe8fb19SBen Gras         break;
2095*2fe8fb19SBen Gras      case ROUND_UP:
2096*2fe8fb19SBen Gras         roundingModeName = "up";
2097*2fe8fb19SBen Gras         roundingCode = float_round_up;
2098*2fe8fb19SBen Gras         break;
2099*2fe8fb19SBen Gras     }
2100*2fe8fb19SBen Gras     float_rounding_mode = roundingCode;
2101*2fe8fb19SBen Gras     switch ( tininessMode ) {
2102*2fe8fb19SBen Gras      case 0:
2103*2fe8fb19SBen Gras         tininessModeName = 0;
2104*2fe8fb19SBen Gras         tininessCode = float_tininess_after_rounding;
2105*2fe8fb19SBen Gras         break;
2106*2fe8fb19SBen Gras      case TININESS_BEFORE_ROUNDING:
2107*2fe8fb19SBen Gras         tininessModeName = "before";
2108*2fe8fb19SBen Gras         tininessCode = float_tininess_before_rounding;
2109*2fe8fb19SBen Gras         break;
2110*2fe8fb19SBen Gras      case TININESS_AFTER_ROUNDING:
2111*2fe8fb19SBen Gras         tininessModeName = "after";
2112*2fe8fb19SBen Gras         tininessCode = float_tininess_after_rounding;
2113*2fe8fb19SBen Gras         break;
2114*2fe8fb19SBen Gras     }
2115*2fe8fb19SBen Gras     float_detect_tininess = tininessCode;
2116*2fe8fb19SBen Gras     switch ( functionCode ) {
2117*2fe8fb19SBen Gras      case INT32_TO_FLOAT32:
2118*2fe8fb19SBen Gras         time_a_int32_z_float32( int32_to_float32 );
2119*2fe8fb19SBen Gras         break;
2120*2fe8fb19SBen Gras      case INT32_TO_FLOAT64:
2121*2fe8fb19SBen Gras         time_a_int32_z_float64( int32_to_float64 );
2122*2fe8fb19SBen Gras         break;
2123*2fe8fb19SBen Gras #ifdef FLOATX80
2124*2fe8fb19SBen Gras      case INT32_TO_FLOATX80:
2125*2fe8fb19SBen Gras         time_a_int32_z_floatx80( int32_to_floatx80 );
2126*2fe8fb19SBen Gras         break;
2127*2fe8fb19SBen Gras #endif
2128*2fe8fb19SBen Gras #ifdef FLOAT128
2129*2fe8fb19SBen Gras      case INT32_TO_FLOAT128:
2130*2fe8fb19SBen Gras         time_a_int32_z_float128( int32_to_float128 );
2131*2fe8fb19SBen Gras         break;
2132*2fe8fb19SBen Gras #endif
2133*2fe8fb19SBen Gras      case INT64_TO_FLOAT32:
2134*2fe8fb19SBen Gras         time_a_int64_z_float32( int64_to_float32 );
2135*2fe8fb19SBen Gras         break;
2136*2fe8fb19SBen Gras      case INT64_TO_FLOAT64:
2137*2fe8fb19SBen Gras         time_a_int64_z_float64( int64_to_float64 );
2138*2fe8fb19SBen Gras         break;
2139*2fe8fb19SBen Gras #ifdef FLOATX80
2140*2fe8fb19SBen Gras      case INT64_TO_FLOATX80:
2141*2fe8fb19SBen Gras         time_a_int64_z_floatx80( int64_to_floatx80 );
2142*2fe8fb19SBen Gras         break;
2143*2fe8fb19SBen Gras #endif
2144*2fe8fb19SBen Gras #ifdef FLOAT128
2145*2fe8fb19SBen Gras      case INT64_TO_FLOAT128:
2146*2fe8fb19SBen Gras         time_a_int64_z_float128( int64_to_float128 );
2147*2fe8fb19SBen Gras         break;
2148*2fe8fb19SBen Gras #endif
2149*2fe8fb19SBen Gras      case FLOAT32_TO_INT32:
2150*2fe8fb19SBen Gras         time_a_float32_z_int32( float32_to_int32 );
2151*2fe8fb19SBen Gras         break;
2152*2fe8fb19SBen Gras      case FLOAT32_TO_INT32_ROUND_TO_ZERO:
2153*2fe8fb19SBen Gras         time_a_float32_z_int32( float32_to_int32_round_to_zero );
2154*2fe8fb19SBen Gras         break;
2155*2fe8fb19SBen Gras      case FLOAT32_TO_INT64:
2156*2fe8fb19SBen Gras         time_a_float32_z_int64( float32_to_int64 );
2157*2fe8fb19SBen Gras         break;
2158*2fe8fb19SBen Gras      case FLOAT32_TO_INT64_ROUND_TO_ZERO:
2159*2fe8fb19SBen Gras         time_a_float32_z_int64( float32_to_int64_round_to_zero );
2160*2fe8fb19SBen Gras         break;
2161*2fe8fb19SBen Gras      case FLOAT32_TO_FLOAT64:
2162*2fe8fb19SBen Gras         time_a_float32_z_float64( float32_to_float64 );
2163*2fe8fb19SBen Gras         break;
2164*2fe8fb19SBen Gras #ifdef FLOATX80
2165*2fe8fb19SBen Gras      case FLOAT32_TO_FLOATX80:
2166*2fe8fb19SBen Gras         time_a_float32_z_floatx80( float32_to_floatx80 );
2167*2fe8fb19SBen Gras         break;
2168*2fe8fb19SBen Gras #endif
2169*2fe8fb19SBen Gras #ifdef FLOAT128
2170*2fe8fb19SBen Gras      case FLOAT32_TO_FLOAT128:
2171*2fe8fb19SBen Gras         time_a_float32_z_float128( float32_to_float128 );
2172*2fe8fb19SBen Gras         break;
2173*2fe8fb19SBen Gras #endif
2174*2fe8fb19SBen Gras      case FLOAT32_ROUND_TO_INT:
2175*2fe8fb19SBen Gras         time_az_float32( float32_round_to_int );
2176*2fe8fb19SBen Gras         break;
2177*2fe8fb19SBen Gras      case FLOAT32_ADD:
2178*2fe8fb19SBen Gras         time_abz_float32( float32_add );
2179*2fe8fb19SBen Gras         break;
2180*2fe8fb19SBen Gras      case FLOAT32_SUB:
2181*2fe8fb19SBen Gras         time_abz_float32( float32_sub );
2182*2fe8fb19SBen Gras         break;
2183*2fe8fb19SBen Gras      case FLOAT32_MUL:
2184*2fe8fb19SBen Gras         time_abz_float32( float32_mul );
2185*2fe8fb19SBen Gras         break;
2186*2fe8fb19SBen Gras      case FLOAT32_DIV:
2187*2fe8fb19SBen Gras         time_abz_float32( float32_div );
2188*2fe8fb19SBen Gras         break;
2189*2fe8fb19SBen Gras      case FLOAT32_REM:
2190*2fe8fb19SBen Gras         time_abz_float32( float32_rem );
2191*2fe8fb19SBen Gras         break;
2192*2fe8fb19SBen Gras      case FLOAT32_SQRT:
2193*2fe8fb19SBen Gras         time_az_float32_pos( float32_sqrt );
2194*2fe8fb19SBen Gras         break;
2195*2fe8fb19SBen Gras      case FLOAT32_EQ:
2196*2fe8fb19SBen Gras         time_ab_float32_z_flag( float32_eq );
2197*2fe8fb19SBen Gras         break;
2198*2fe8fb19SBen Gras      case FLOAT32_LE:
2199*2fe8fb19SBen Gras         time_ab_float32_z_flag( float32_le );
2200*2fe8fb19SBen Gras         break;
2201*2fe8fb19SBen Gras      case FLOAT32_LT:
2202*2fe8fb19SBen Gras         time_ab_float32_z_flag( float32_lt );
2203*2fe8fb19SBen Gras         break;
2204*2fe8fb19SBen Gras      case FLOAT32_EQ_SIGNALING:
2205*2fe8fb19SBen Gras         time_ab_float32_z_flag( float32_eq_signaling );
2206*2fe8fb19SBen Gras         break;
2207*2fe8fb19SBen Gras      case FLOAT32_LE_QUIET:
2208*2fe8fb19SBen Gras         time_ab_float32_z_flag( float32_le_quiet );
2209*2fe8fb19SBen Gras         break;
2210*2fe8fb19SBen Gras      case FLOAT32_LT_QUIET:
2211*2fe8fb19SBen Gras         time_ab_float32_z_flag( float32_lt_quiet );
2212*2fe8fb19SBen Gras         break;
2213*2fe8fb19SBen Gras      case FLOAT64_TO_INT32:
2214*2fe8fb19SBen Gras         time_a_float64_z_int32( float64_to_int32 );
2215*2fe8fb19SBen Gras         break;
2216*2fe8fb19SBen Gras      case FLOAT64_TO_INT32_ROUND_TO_ZERO:
2217*2fe8fb19SBen Gras         time_a_float64_z_int32( float64_to_int32_round_to_zero );
2218*2fe8fb19SBen Gras         break;
2219*2fe8fb19SBen Gras      case FLOAT64_TO_INT64:
2220*2fe8fb19SBen Gras         time_a_float64_z_int64( float64_to_int64 );
2221*2fe8fb19SBen Gras         break;
2222*2fe8fb19SBen Gras      case FLOAT64_TO_INT64_ROUND_TO_ZERO:
2223*2fe8fb19SBen Gras         time_a_float64_z_int64( float64_to_int64_round_to_zero );
2224*2fe8fb19SBen Gras         break;
2225*2fe8fb19SBen Gras      case FLOAT64_TO_FLOAT32:
2226*2fe8fb19SBen Gras         time_a_float64_z_float32( float64_to_float32 );
2227*2fe8fb19SBen Gras         break;
2228*2fe8fb19SBen Gras #ifdef FLOATX80
2229*2fe8fb19SBen Gras      case FLOAT64_TO_FLOATX80:
2230*2fe8fb19SBen Gras         time_a_float64_z_floatx80( float64_to_floatx80 );
2231*2fe8fb19SBen Gras         break;
2232*2fe8fb19SBen Gras #endif
2233*2fe8fb19SBen Gras #ifdef FLOAT128
2234*2fe8fb19SBen Gras      case FLOAT64_TO_FLOAT128:
2235*2fe8fb19SBen Gras         time_a_float64_z_float128( float64_to_float128 );
2236*2fe8fb19SBen Gras         break;
2237*2fe8fb19SBen Gras #endif
2238*2fe8fb19SBen Gras      case FLOAT64_ROUND_TO_INT:
2239*2fe8fb19SBen Gras         time_az_float64( float64_round_to_int );
2240*2fe8fb19SBen Gras         break;
2241*2fe8fb19SBen Gras      case FLOAT64_ADD:
2242*2fe8fb19SBen Gras         time_abz_float64( float64_add );
2243*2fe8fb19SBen Gras         break;
2244*2fe8fb19SBen Gras      case FLOAT64_SUB:
2245*2fe8fb19SBen Gras         time_abz_float64( float64_sub );
2246*2fe8fb19SBen Gras         break;
2247*2fe8fb19SBen Gras      case FLOAT64_MUL:
2248*2fe8fb19SBen Gras         time_abz_float64( float64_mul );
2249*2fe8fb19SBen Gras         break;
2250*2fe8fb19SBen Gras      case FLOAT64_DIV:
2251*2fe8fb19SBen Gras         time_abz_float64( float64_div );
2252*2fe8fb19SBen Gras         break;
2253*2fe8fb19SBen Gras      case FLOAT64_REM:
2254*2fe8fb19SBen Gras         time_abz_float64( float64_rem );
2255*2fe8fb19SBen Gras         break;
2256*2fe8fb19SBen Gras      case FLOAT64_SQRT:
2257*2fe8fb19SBen Gras         time_az_float64_pos( float64_sqrt );
2258*2fe8fb19SBen Gras         break;
2259*2fe8fb19SBen Gras      case FLOAT64_EQ:
2260*2fe8fb19SBen Gras         time_ab_float64_z_flag( float64_eq );
2261*2fe8fb19SBen Gras         break;
2262*2fe8fb19SBen Gras      case FLOAT64_LE:
2263*2fe8fb19SBen Gras         time_ab_float64_z_flag( float64_le );
2264*2fe8fb19SBen Gras         break;
2265*2fe8fb19SBen Gras      case FLOAT64_LT:
2266*2fe8fb19SBen Gras         time_ab_float64_z_flag( float64_lt );
2267*2fe8fb19SBen Gras         break;
2268*2fe8fb19SBen Gras      case FLOAT64_EQ_SIGNALING:
2269*2fe8fb19SBen Gras         time_ab_float64_z_flag( float64_eq_signaling );
2270*2fe8fb19SBen Gras         break;
2271*2fe8fb19SBen Gras      case FLOAT64_LE_QUIET:
2272*2fe8fb19SBen Gras         time_ab_float64_z_flag( float64_le_quiet );
2273*2fe8fb19SBen Gras         break;
2274*2fe8fb19SBen Gras      case FLOAT64_LT_QUIET:
2275*2fe8fb19SBen Gras         time_ab_float64_z_flag( float64_lt_quiet );
2276*2fe8fb19SBen Gras         break;
2277*2fe8fb19SBen Gras #ifdef FLOATX80
2278*2fe8fb19SBen Gras      case FLOATX80_TO_INT32:
2279*2fe8fb19SBen Gras         time_a_floatx80_z_int32( floatx80_to_int32 );
2280*2fe8fb19SBen Gras         break;
2281*2fe8fb19SBen Gras      case FLOATX80_TO_INT32_ROUND_TO_ZERO:
2282*2fe8fb19SBen Gras         time_a_floatx80_z_int32( floatx80_to_int32_round_to_zero );
2283*2fe8fb19SBen Gras         break;
2284*2fe8fb19SBen Gras      case FLOATX80_TO_INT64:
2285*2fe8fb19SBen Gras         time_a_floatx80_z_int64( floatx80_to_int64 );
2286*2fe8fb19SBen Gras         break;
2287*2fe8fb19SBen Gras      case FLOATX80_TO_INT64_ROUND_TO_ZERO:
2288*2fe8fb19SBen Gras         time_a_floatx80_z_int64( floatx80_to_int64_round_to_zero );
2289*2fe8fb19SBen Gras         break;
2290*2fe8fb19SBen Gras      case FLOATX80_TO_FLOAT32:
2291*2fe8fb19SBen Gras         time_a_floatx80_z_float32( floatx80_to_float32 );
2292*2fe8fb19SBen Gras         break;
2293*2fe8fb19SBen Gras      case FLOATX80_TO_FLOAT64:
2294*2fe8fb19SBen Gras         time_a_floatx80_z_float64( floatx80_to_float64 );
2295*2fe8fb19SBen Gras         break;
2296*2fe8fb19SBen Gras #ifdef FLOAT128
2297*2fe8fb19SBen Gras      case FLOATX80_TO_FLOAT128:
2298*2fe8fb19SBen Gras         time_a_floatx80_z_float128( floatx80_to_float128 );
2299*2fe8fb19SBen Gras         break;
2300*2fe8fb19SBen Gras #endif
2301*2fe8fb19SBen Gras      case FLOATX80_ROUND_TO_INT:
2302*2fe8fb19SBen Gras         time_az_floatx80( floatx80_round_to_int );
2303*2fe8fb19SBen Gras         break;
2304*2fe8fb19SBen Gras      case FLOATX80_ADD:
2305*2fe8fb19SBen Gras         time_abz_floatx80( floatx80_add );
2306*2fe8fb19SBen Gras         break;
2307*2fe8fb19SBen Gras      case FLOATX80_SUB:
2308*2fe8fb19SBen Gras         time_abz_floatx80( floatx80_sub );
2309*2fe8fb19SBen Gras         break;
2310*2fe8fb19SBen Gras      case FLOATX80_MUL:
2311*2fe8fb19SBen Gras         time_abz_floatx80( floatx80_mul );
2312*2fe8fb19SBen Gras         break;
2313*2fe8fb19SBen Gras      case FLOATX80_DIV:
2314*2fe8fb19SBen Gras         time_abz_floatx80( floatx80_div );
2315*2fe8fb19SBen Gras         break;
2316*2fe8fb19SBen Gras      case FLOATX80_REM:
2317*2fe8fb19SBen Gras         time_abz_floatx80( floatx80_rem );
2318*2fe8fb19SBen Gras         break;
2319*2fe8fb19SBen Gras      case FLOATX80_SQRT:
2320*2fe8fb19SBen Gras         time_az_floatx80_pos( floatx80_sqrt );
2321*2fe8fb19SBen Gras         break;
2322*2fe8fb19SBen Gras      case FLOATX80_EQ:
2323*2fe8fb19SBen Gras         time_ab_floatx80_z_flag( floatx80_eq );
2324*2fe8fb19SBen Gras         break;
2325*2fe8fb19SBen Gras      case FLOATX80_LE:
2326*2fe8fb19SBen Gras         time_ab_floatx80_z_flag( floatx80_le );
2327*2fe8fb19SBen Gras         break;
2328*2fe8fb19SBen Gras      case FLOATX80_LT:
2329*2fe8fb19SBen Gras         time_ab_floatx80_z_flag( floatx80_lt );
2330*2fe8fb19SBen Gras         break;
2331*2fe8fb19SBen Gras      case FLOATX80_EQ_SIGNALING:
2332*2fe8fb19SBen Gras         time_ab_floatx80_z_flag( floatx80_eq_signaling );
2333*2fe8fb19SBen Gras         break;
2334*2fe8fb19SBen Gras      case FLOATX80_LE_QUIET:
2335*2fe8fb19SBen Gras         time_ab_floatx80_z_flag( floatx80_le_quiet );
2336*2fe8fb19SBen Gras         break;
2337*2fe8fb19SBen Gras      case FLOATX80_LT_QUIET:
2338*2fe8fb19SBen Gras         time_ab_floatx80_z_flag( floatx80_lt_quiet );
2339*2fe8fb19SBen Gras         break;
2340*2fe8fb19SBen Gras #endif
2341*2fe8fb19SBen Gras #ifdef FLOAT128
2342*2fe8fb19SBen Gras      case FLOAT128_TO_INT32:
2343*2fe8fb19SBen Gras         time_a_float128_z_int32( float128_to_int32 );
2344*2fe8fb19SBen Gras         break;
2345*2fe8fb19SBen Gras      case FLOAT128_TO_INT32_ROUND_TO_ZERO:
2346*2fe8fb19SBen Gras         time_a_float128_z_int32( float128_to_int32_round_to_zero );
2347*2fe8fb19SBen Gras         break;
2348*2fe8fb19SBen Gras      case FLOAT128_TO_INT64:
2349*2fe8fb19SBen Gras         time_a_float128_z_int64( float128_to_int64 );
2350*2fe8fb19SBen Gras         break;
2351*2fe8fb19SBen Gras      case FLOAT128_TO_INT64_ROUND_TO_ZERO:
2352*2fe8fb19SBen Gras         time_a_float128_z_int64( float128_to_int64_round_to_zero );
2353*2fe8fb19SBen Gras         break;
2354*2fe8fb19SBen Gras      case FLOAT128_TO_FLOAT32:
2355*2fe8fb19SBen Gras         time_a_float128_z_float32( float128_to_float32 );
2356*2fe8fb19SBen Gras         break;
2357*2fe8fb19SBen Gras      case FLOAT128_TO_FLOAT64:
2358*2fe8fb19SBen Gras         time_a_float128_z_float64( float128_to_float64 );
2359*2fe8fb19SBen Gras         break;
2360*2fe8fb19SBen Gras #ifdef FLOATX80
2361*2fe8fb19SBen Gras      case FLOAT128_TO_FLOATX80:
2362*2fe8fb19SBen Gras         time_a_float128_z_floatx80( float128_to_floatx80 );
2363*2fe8fb19SBen Gras         break;
2364*2fe8fb19SBen Gras #endif
2365*2fe8fb19SBen Gras      case FLOAT128_ROUND_TO_INT:
2366*2fe8fb19SBen Gras         time_az_float128( float128_round_to_int );
2367*2fe8fb19SBen Gras         break;
2368*2fe8fb19SBen Gras      case FLOAT128_ADD:
2369*2fe8fb19SBen Gras         time_abz_float128( float128_add );
2370*2fe8fb19SBen Gras         break;
2371*2fe8fb19SBen Gras      case FLOAT128_SUB:
2372*2fe8fb19SBen Gras         time_abz_float128( float128_sub );
2373*2fe8fb19SBen Gras         break;
2374*2fe8fb19SBen Gras      case FLOAT128_MUL:
2375*2fe8fb19SBen Gras         time_abz_float128( float128_mul );
2376*2fe8fb19SBen Gras         break;
2377*2fe8fb19SBen Gras      case FLOAT128_DIV:
2378*2fe8fb19SBen Gras         time_abz_float128( float128_div );
2379*2fe8fb19SBen Gras         break;
2380*2fe8fb19SBen Gras      case FLOAT128_REM:
2381*2fe8fb19SBen Gras         time_abz_float128( float128_rem );
2382*2fe8fb19SBen Gras         break;
2383*2fe8fb19SBen Gras      case FLOAT128_SQRT:
2384*2fe8fb19SBen Gras         time_az_float128_pos( float128_sqrt );
2385*2fe8fb19SBen Gras         break;
2386*2fe8fb19SBen Gras      case FLOAT128_EQ:
2387*2fe8fb19SBen Gras         time_ab_float128_z_flag( float128_eq );
2388*2fe8fb19SBen Gras         break;
2389*2fe8fb19SBen Gras      case FLOAT128_LE:
2390*2fe8fb19SBen Gras         time_ab_float128_z_flag( float128_le );
2391*2fe8fb19SBen Gras         break;
2392*2fe8fb19SBen Gras      case FLOAT128_LT:
2393*2fe8fb19SBen Gras         time_ab_float128_z_flag( float128_lt );
2394*2fe8fb19SBen Gras         break;
2395*2fe8fb19SBen Gras      case FLOAT128_EQ_SIGNALING:
2396*2fe8fb19SBen Gras         time_ab_float128_z_flag( float128_eq_signaling );
2397*2fe8fb19SBen Gras         break;
2398*2fe8fb19SBen Gras      case FLOAT128_LE_QUIET:
2399*2fe8fb19SBen Gras         time_ab_float128_z_flag( float128_le_quiet );
2400*2fe8fb19SBen Gras         break;
2401*2fe8fb19SBen Gras      case FLOAT128_LT_QUIET:
2402*2fe8fb19SBen Gras         time_ab_float128_z_flag( float128_lt_quiet );
2403*2fe8fb19SBen Gras         break;
2404*2fe8fb19SBen Gras #endif
2405*2fe8fb19SBen Gras     }
2406*2fe8fb19SBen Gras 
2407*2fe8fb19SBen Gras }
2408*2fe8fb19SBen Gras 
2409*2fe8fb19SBen Gras static void
timeFunction(uint8 functionCode,int8 roundingPrecisionIn,int8 roundingModeIn,int8 tininessModeIn)2410*2fe8fb19SBen Gras  timeFunction(
2411*2fe8fb19SBen Gras      uint8 functionCode,
2412*2fe8fb19SBen Gras      int8 roundingPrecisionIn,
2413*2fe8fb19SBen Gras      int8 roundingModeIn,
2414*2fe8fb19SBen Gras      int8 tininessModeIn
2415*2fe8fb19SBen Gras  )
2416*2fe8fb19SBen Gras {
2417*2fe8fb19SBen Gras     int8 roundingPrecision, roundingMode, tininessMode;
2418*2fe8fb19SBen Gras 
2419*2fe8fb19SBen Gras     roundingPrecision = 32;
2420*2fe8fb19SBen Gras     for (;;) {
2421*2fe8fb19SBen Gras         if ( ! functions[ functionCode ].roundingPrecision ) {
2422*2fe8fb19SBen Gras             roundingPrecision = 0;
2423*2fe8fb19SBen Gras         }
2424*2fe8fb19SBen Gras         else if ( roundingPrecisionIn ) {
2425*2fe8fb19SBen Gras             roundingPrecision = roundingPrecisionIn;
2426*2fe8fb19SBen Gras         }
2427*2fe8fb19SBen Gras         for ( roundingMode = 1;
2428*2fe8fb19SBen Gras               roundingMode < NUM_ROUNDINGMODES;
2429*2fe8fb19SBen Gras               ++roundingMode
2430*2fe8fb19SBen Gras             ) {
2431*2fe8fb19SBen Gras             if ( ! functions[ functionCode ].roundingMode ) {
2432*2fe8fb19SBen Gras                 roundingMode = 0;
2433*2fe8fb19SBen Gras             }
2434*2fe8fb19SBen Gras             else if ( roundingModeIn ) {
2435*2fe8fb19SBen Gras                 roundingMode = roundingModeIn;
2436*2fe8fb19SBen Gras             }
2437*2fe8fb19SBen Gras             for ( tininessMode = 1;
2438*2fe8fb19SBen Gras                   tininessMode < NUM_TININESSMODES;
2439*2fe8fb19SBen Gras                   ++tininessMode
2440*2fe8fb19SBen Gras                 ) {
2441*2fe8fb19SBen Gras                 if (    ( roundingPrecision == 32 )
2442*2fe8fb19SBen Gras                      || ( roundingPrecision == 64 ) ) {
2443*2fe8fb19SBen Gras                     if ( ! functions[ functionCode ]
2444*2fe8fb19SBen Gras                                .tininessModeAtReducedPrecision
2445*2fe8fb19SBen Gras                        ) {
2446*2fe8fb19SBen Gras                         tininessMode = 0;
2447*2fe8fb19SBen Gras                     }
2448*2fe8fb19SBen Gras                     else if ( tininessModeIn ) {
2449*2fe8fb19SBen Gras                         tininessMode = tininessModeIn;
2450*2fe8fb19SBen Gras                     }
2451*2fe8fb19SBen Gras                 }
2452*2fe8fb19SBen Gras                 else {
2453*2fe8fb19SBen Gras                     if ( ! functions[ functionCode ].tininessMode ) {
2454*2fe8fb19SBen Gras                         tininessMode = 0;
2455*2fe8fb19SBen Gras                     }
2456*2fe8fb19SBen Gras                     else if ( tininessModeIn ) {
2457*2fe8fb19SBen Gras                         tininessMode = tininessModeIn;
2458*2fe8fb19SBen Gras                     }
2459*2fe8fb19SBen Gras                 }
2460*2fe8fb19SBen Gras                 timeFunctionVariety(
2461*2fe8fb19SBen Gras                     functionCode, roundingPrecision, roundingMode, tininessMode
2462*2fe8fb19SBen Gras                 );
2463*2fe8fb19SBen Gras                 if ( tininessModeIn || ! tininessMode ) break;
2464*2fe8fb19SBen Gras             }
2465*2fe8fb19SBen Gras             if ( roundingModeIn || ! roundingMode ) break;
2466*2fe8fb19SBen Gras         }
2467*2fe8fb19SBen Gras         if ( roundingPrecisionIn || ! roundingPrecision ) break;
2468*2fe8fb19SBen Gras         if ( roundingPrecision == 80 ) {
2469*2fe8fb19SBen Gras             break;
2470*2fe8fb19SBen Gras         }
2471*2fe8fb19SBen Gras         else if ( roundingPrecision == 64 ) {
2472*2fe8fb19SBen Gras             roundingPrecision = 80;
2473*2fe8fb19SBen Gras         }
2474*2fe8fb19SBen Gras         else if ( roundingPrecision == 32 ) {
2475*2fe8fb19SBen Gras             roundingPrecision = 64;
2476*2fe8fb19SBen Gras         }
2477*2fe8fb19SBen Gras     }
2478*2fe8fb19SBen Gras 
2479*2fe8fb19SBen Gras }
2480*2fe8fb19SBen Gras 
main(int argc,char ** argv)2481*2fe8fb19SBen Gras main( int argc, char **argv )
2482*2fe8fb19SBen Gras {
2483*2fe8fb19SBen Gras     char *argPtr;
2484*2fe8fb19SBen Gras     flag functionArgument;
2485*2fe8fb19SBen Gras     uint8 functionCode;
2486*2fe8fb19SBen Gras     int8 operands, roundingPrecision, roundingMode, tininessMode;
2487*2fe8fb19SBen Gras 
2488*2fe8fb19SBen Gras     if ( argc <= 1 ) goto writeHelpMessage;
2489*2fe8fb19SBen Gras     functionArgument = FALSE;
2490*2fe8fb19SBen Gras     functionCode = 0;
2491*2fe8fb19SBen Gras     operands = 0;
2492*2fe8fb19SBen Gras     roundingPrecision = 0;
2493*2fe8fb19SBen Gras     roundingMode = 0;
2494*2fe8fb19SBen Gras     tininessMode = 0;
2495*2fe8fb19SBen Gras     --argc;
2496*2fe8fb19SBen Gras     ++argv;
2497*2fe8fb19SBen Gras     while ( argc && ( argPtr = argv[ 0 ] ) ) {
2498*2fe8fb19SBen Gras         if ( argPtr[ 0 ] == '-' ) ++argPtr;
2499*2fe8fb19SBen Gras         if ( strcmp( argPtr, "help" ) == 0 ) {
2500*2fe8fb19SBen Gras  writeHelpMessage:
2501*2fe8fb19SBen Gras             fputs(
2502*2fe8fb19SBen Gras "timesoftfloat [<option>...] <function>\n"
2503*2fe8fb19SBen Gras "  <option>:  (* is default)\n"
2504*2fe8fb19SBen Gras "    -help            --Write this message and exit.\n"
2505*2fe8fb19SBen Gras #ifdef FLOATX80
2506*2fe8fb19SBen Gras "    -precision32     --Only time rounding precision equivalent to float32.\n"
2507*2fe8fb19SBen Gras "    -precision64     --Only time rounding precision equivalent to float64.\n"
2508*2fe8fb19SBen Gras "    -precision80     --Only time maximum rounding precision.\n"
2509*2fe8fb19SBen Gras #endif
2510*2fe8fb19SBen Gras "    -nearesteven     --Only time rounding to nearest/even.\n"
2511*2fe8fb19SBen Gras "    -tozero          --Only time rounding to zero.\n"
2512*2fe8fb19SBen Gras "    -down            --Only time rounding down.\n"
2513*2fe8fb19SBen Gras "    -up              --Only time rounding up.\n"
2514*2fe8fb19SBen Gras "    -tininessbefore  --Only time underflow tininess before rounding.\n"
2515*2fe8fb19SBen Gras "    -tininessafter   --Only time underflow tininess after rounding.\n"
2516*2fe8fb19SBen Gras "  <function>:\n"
2517*2fe8fb19SBen Gras "    int32_to_<float>                 <float>_add   <float>_eq\n"
2518*2fe8fb19SBen Gras "    <float>_to_int32                 <float>_sub   <float>_le\n"
2519*2fe8fb19SBen Gras "    <float>_to_int32_round_to_zero   <float>_mul   <float>_lt\n"
2520*2fe8fb19SBen Gras "    int64_to_<float>                 <float>_div   <float>_eq_signaling\n"
2521*2fe8fb19SBen Gras "    <float>_to_int64                 <float>_rem   <float>_le_quiet\n"
2522*2fe8fb19SBen Gras "    <float>_to_int64_round_to_zero                 <float>_lt_quiet\n"
2523*2fe8fb19SBen Gras "    <float>_to_<float>\n"
2524*2fe8fb19SBen Gras "    <float>_round_to_int\n"
2525*2fe8fb19SBen Gras "    <float>_sqrt\n"
2526*2fe8fb19SBen Gras "    -all1            --All 1-operand functions.\n"
2527*2fe8fb19SBen Gras "    -all2            --All 2-operand functions.\n"
2528*2fe8fb19SBen Gras "    -all             --All functions.\n"
2529*2fe8fb19SBen Gras "  <float>:\n"
2530*2fe8fb19SBen Gras "    float32          --Single precision.\n"
2531*2fe8fb19SBen Gras "    float64          --Double precision.\n"
2532*2fe8fb19SBen Gras #ifdef FLOATX80
2533*2fe8fb19SBen Gras "    floatx80         --Extended double precision.\n"
2534*2fe8fb19SBen Gras #endif
2535*2fe8fb19SBen Gras #ifdef FLOAT128
2536*2fe8fb19SBen Gras "    float128         --Quadruple precision.\n"
2537*2fe8fb19SBen Gras #endif
2538*2fe8fb19SBen Gras                 ,
2539*2fe8fb19SBen Gras                 stdout
2540*2fe8fb19SBen Gras             );
2541*2fe8fb19SBen Gras             return EXIT_SUCCESS;
2542*2fe8fb19SBen Gras         }
2543*2fe8fb19SBen Gras #ifdef FLOATX80
2544*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "precision32" ) == 0 ) {
2545*2fe8fb19SBen Gras             roundingPrecision = 32;
2546*2fe8fb19SBen Gras         }
2547*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "precision64" ) == 0 ) {
2548*2fe8fb19SBen Gras             roundingPrecision = 64;
2549*2fe8fb19SBen Gras         }
2550*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "precision80" ) == 0 ) {
2551*2fe8fb19SBen Gras             roundingPrecision = 80;
2552*2fe8fb19SBen Gras         }
2553*2fe8fb19SBen Gras #endif
2554*2fe8fb19SBen Gras         else if (    ( strcmp( argPtr, "nearesteven" ) == 0 )
2555*2fe8fb19SBen Gras                   || ( strcmp( argPtr, "nearest_even" ) == 0 ) ) {
2556*2fe8fb19SBen Gras             roundingMode = ROUND_NEAREST_EVEN;
2557*2fe8fb19SBen Gras         }
2558*2fe8fb19SBen Gras         else if (    ( strcmp( argPtr, "tozero" ) == 0 )
2559*2fe8fb19SBen Gras                   || ( strcmp( argPtr, "to_zero" ) == 0 ) ) {
2560*2fe8fb19SBen Gras             roundingMode = ROUND_TO_ZERO;
2561*2fe8fb19SBen Gras         }
2562*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "down" ) == 0 ) {
2563*2fe8fb19SBen Gras             roundingMode = ROUND_DOWN;
2564*2fe8fb19SBen Gras         }
2565*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "up" ) == 0 ) {
2566*2fe8fb19SBen Gras             roundingMode = ROUND_UP;
2567*2fe8fb19SBen Gras         }
2568*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "tininessbefore" ) == 0 ) {
2569*2fe8fb19SBen Gras             tininessMode = TININESS_BEFORE_ROUNDING;
2570*2fe8fb19SBen Gras         }
2571*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "tininessafter" ) == 0 ) {
2572*2fe8fb19SBen Gras             tininessMode = TININESS_AFTER_ROUNDING;
2573*2fe8fb19SBen Gras         }
2574*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "all1" ) == 0 ) {
2575*2fe8fb19SBen Gras             functionArgument = TRUE;
2576*2fe8fb19SBen Gras             functionCode = 0;
2577*2fe8fb19SBen Gras             operands = 1;
2578*2fe8fb19SBen Gras         }
2579*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "all2" ) == 0 ) {
2580*2fe8fb19SBen Gras             functionArgument = TRUE;
2581*2fe8fb19SBen Gras             functionCode = 0;
2582*2fe8fb19SBen Gras             operands = 2;
2583*2fe8fb19SBen Gras         }
2584*2fe8fb19SBen Gras         else if ( strcmp( argPtr, "all" ) == 0 ) {
2585*2fe8fb19SBen Gras             functionArgument = TRUE;
2586*2fe8fb19SBen Gras             functionCode = 0;
2587*2fe8fb19SBen Gras             operands = 0;
2588*2fe8fb19SBen Gras         }
2589*2fe8fb19SBen Gras         else {
2590*2fe8fb19SBen Gras             for ( functionCode = 1;
2591*2fe8fb19SBen Gras                   functionCode < NUM_FUNCTIONS;
2592*2fe8fb19SBen Gras                   ++functionCode
2593*2fe8fb19SBen Gras                 ) {
2594*2fe8fb19SBen Gras                 if ( strcmp( argPtr, functions[ functionCode ].name ) == 0 ) {
2595*2fe8fb19SBen Gras                     break;
2596*2fe8fb19SBen Gras                 }
2597*2fe8fb19SBen Gras             }
2598*2fe8fb19SBen Gras             if ( functionCode == NUM_FUNCTIONS ) {
2599*2fe8fb19SBen Gras                 fail( "Invalid option or function `%s'", argv[ 0 ] );
2600*2fe8fb19SBen Gras             }
2601*2fe8fb19SBen Gras             functionArgument = TRUE;
2602*2fe8fb19SBen Gras         }
2603*2fe8fb19SBen Gras         --argc;
2604*2fe8fb19SBen Gras         ++argv;
2605*2fe8fb19SBen Gras     }
2606*2fe8fb19SBen Gras     if ( ! functionArgument ) fail( "Function argument required" );
2607*2fe8fb19SBen Gras     if ( functionCode ) {
2608*2fe8fb19SBen Gras         timeFunction(
2609*2fe8fb19SBen Gras             functionCode, roundingPrecision, roundingMode, tininessMode );
2610*2fe8fb19SBen Gras     }
2611*2fe8fb19SBen Gras     else if ( operands == 1 ) {
2612*2fe8fb19SBen Gras         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
2613*2fe8fb19SBen Gras             ) {
2614*2fe8fb19SBen Gras             if ( functions[ functionCode ].numInputs == 1 ) {
2615*2fe8fb19SBen Gras                 timeFunction(
2616*2fe8fb19SBen Gras                     functionCode, roundingPrecision, roundingMode, tininessMode
2617*2fe8fb19SBen Gras                 );
2618*2fe8fb19SBen Gras             }
2619*2fe8fb19SBen Gras         }
2620*2fe8fb19SBen Gras     }
2621*2fe8fb19SBen Gras     else if ( operands == 2 ) {
2622*2fe8fb19SBen Gras         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
2623*2fe8fb19SBen Gras             ) {
2624*2fe8fb19SBen Gras             if ( functions[ functionCode ].numInputs == 2 ) {
2625*2fe8fb19SBen Gras                 timeFunction(
2626*2fe8fb19SBen Gras                     functionCode, roundingPrecision, roundingMode, tininessMode
2627*2fe8fb19SBen Gras                 );
2628*2fe8fb19SBen Gras             }
2629*2fe8fb19SBen Gras         }
2630*2fe8fb19SBen Gras     }
2631*2fe8fb19SBen Gras     else {
2632*2fe8fb19SBen Gras         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
2633*2fe8fb19SBen Gras             ) {
2634*2fe8fb19SBen Gras             timeFunction(
2635*2fe8fb19SBen Gras                 functionCode, roundingPrecision, roundingMode, tininessMode );
2636*2fe8fb19SBen Gras         }
2637*2fe8fb19SBen Gras     }
2638*2fe8fb19SBen Gras     return EXIT_SUCCESS;
2639*2fe8fb19SBen Gras 
2640*2fe8fb19SBen Gras }
2641*2fe8fb19SBen Gras 
2642