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