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