xref: /openbsd-src/lib/libc/softfloat/timesoftfloat.c (revision fcc6486e8fa643ad995186ed9df8a89e35dbfa53)
1*fcc6486eSmiod /*	$OpenBSD: timesoftfloat.c,v 1.3 2015/09/13 14:21:46 miod Exp $	*/
208daf0c2Sdrahn /* $NetBSD: timesoftfloat.c,v 1.1 2000/06/06 08:15:11 bjh21 Exp $ */
308daf0c2Sdrahn 
408daf0c2Sdrahn /*
508daf0c2Sdrahn ===============================================================================
608daf0c2Sdrahn 
708daf0c2Sdrahn This C source file is part of the SoftFloat IEC/IEEE Floating-point
808daf0c2Sdrahn Arithmetic Package, Release 2a.
908daf0c2Sdrahn 
1008daf0c2Sdrahn Written by John R. Hauser.  This work was made possible in part by the
1108daf0c2Sdrahn International Computer Science Institute, located at Suite 600, 1947 Center
1208daf0c2Sdrahn Street, Berkeley, California 94704.  Funding was partially provided by the
1308daf0c2Sdrahn National Science Foundation under grant MIP-9311980.  The original version
1408daf0c2Sdrahn of this code was written as part of a project to build a fixed-point vector
1508daf0c2Sdrahn processor in collaboration with the University of California at Berkeley,
1608daf0c2Sdrahn overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
1708daf0c2Sdrahn is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
1808daf0c2Sdrahn arithmetic/SoftFloat.html'.
1908daf0c2Sdrahn 
2008daf0c2Sdrahn THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
2108daf0c2Sdrahn has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
2208daf0c2Sdrahn TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
2308daf0c2Sdrahn PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
2408daf0c2Sdrahn AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
2508daf0c2Sdrahn 
2608daf0c2Sdrahn Derivative works are acceptable, even for commercial purposes, so long as
2708daf0c2Sdrahn (1) they include prominent notice that the work is derivative, and (2) they
2808daf0c2Sdrahn include prominent notice akin to these four paragraphs for those parts of
2908daf0c2Sdrahn this code that are retained.
3008daf0c2Sdrahn 
3108daf0c2Sdrahn ===============================================================================
3208daf0c2Sdrahn */
3308daf0c2Sdrahn 
3408daf0c2Sdrahn #include <stdlib.h>
3508daf0c2Sdrahn #include <stdarg.h>
3608daf0c2Sdrahn #include <string.h>
3708daf0c2Sdrahn #include <stdio.h>
3808daf0c2Sdrahn #include <time.h>
3908daf0c2Sdrahn #include "milieu.h"
40*fcc6486eSmiod #include <softfloat.h>
4108daf0c2Sdrahn 
4208daf0c2Sdrahn enum {
4308daf0c2Sdrahn     minIterations = 1000
4408daf0c2Sdrahn };
4508daf0c2Sdrahn 
fail(const char * message,...)4608daf0c2Sdrahn static void fail( const char *message, ... )
4708daf0c2Sdrahn {
4808daf0c2Sdrahn     va_list varArgs;
4908daf0c2Sdrahn 
5008daf0c2Sdrahn     fputs( "timesoftfloat: ", stderr );
5108daf0c2Sdrahn     va_start( varArgs, message );
5208daf0c2Sdrahn     vfprintf( stderr, message, varArgs );
5308daf0c2Sdrahn     va_end( varArgs );
5408daf0c2Sdrahn     fputs( ".\n", stderr );
5508daf0c2Sdrahn     exit( EXIT_FAILURE );
5608daf0c2Sdrahn 
5708daf0c2Sdrahn }
5808daf0c2Sdrahn 
5908daf0c2Sdrahn static char *functionName;
6008daf0c2Sdrahn static char *roundingPrecisionName, *roundingModeName, *tininessModeName;
6108daf0c2Sdrahn 
reportTime(int32 count,long clocks)6208daf0c2Sdrahn static void reportTime( int32 count, long clocks )
6308daf0c2Sdrahn {
6408daf0c2Sdrahn 
6508daf0c2Sdrahn     printf(
6608daf0c2Sdrahn         "%8.1f kops/s: %s",
6708daf0c2Sdrahn         ( count / ( ( (float) clocks ) / CLOCKS_PER_SEC ) ) / 1000,
6808daf0c2Sdrahn         functionName
6908daf0c2Sdrahn     );
7008daf0c2Sdrahn     if ( roundingModeName ) {
7108daf0c2Sdrahn         if ( roundingPrecisionName ) {
7208daf0c2Sdrahn             fputs( ", precision ", stdout );
7308daf0c2Sdrahn             fputs( roundingPrecisionName, stdout );
7408daf0c2Sdrahn         }
7508daf0c2Sdrahn         fputs( ", rounding ", stdout );
7608daf0c2Sdrahn         fputs( roundingModeName, stdout );
7708daf0c2Sdrahn         if ( tininessModeName ) {
7808daf0c2Sdrahn             fputs( ", tininess ", stdout );
7908daf0c2Sdrahn             fputs( tininessModeName, stdout );
8008daf0c2Sdrahn             fputs( " rounding", stdout );
8108daf0c2Sdrahn         }
8208daf0c2Sdrahn     }
8308daf0c2Sdrahn     fputc( '\n', stdout );
8408daf0c2Sdrahn 
8508daf0c2Sdrahn }
8608daf0c2Sdrahn 
8708daf0c2Sdrahn enum {
8808daf0c2Sdrahn     numInputs_int32 = 32
8908daf0c2Sdrahn };
9008daf0c2Sdrahn 
9108daf0c2Sdrahn static const int32 inputs_int32[ numInputs_int32 ] = {
9208daf0c2Sdrahn     0xFFFFBB79, 0x405CF80F, 0x00000000, 0xFFFFFD04,
9308daf0c2Sdrahn     0xFFF20002, 0x0C8EF795, 0xF00011FF, 0x000006CA,
9408daf0c2Sdrahn     0x00009BFE, 0xFF4862E3, 0x9FFFEFFE, 0xFFFFFFB7,
9508daf0c2Sdrahn     0x0BFF7FFF, 0x0000F37A, 0x0011DFFE, 0x00000006,
9608daf0c2Sdrahn     0xFFF02006, 0xFFFFF7D1, 0x10200003, 0xDE8DF765,
9708daf0c2Sdrahn     0x00003E02, 0x000019E8, 0x0008FFFE, 0xFFFFFB5C,
9808daf0c2Sdrahn     0xFFDF7FFE, 0x07C42FBF, 0x0FFFE3FF, 0x040B9F13,
9908daf0c2Sdrahn     0xBFFFFFF8, 0x0001BF56, 0x000017F6, 0x000A908A
10008daf0c2Sdrahn };
10108daf0c2Sdrahn 
time_a_int32_z_float32(float32 function (int32))10208daf0c2Sdrahn static void time_a_int32_z_float32( float32 function( int32 ) )
10308daf0c2Sdrahn {
10408daf0c2Sdrahn     clock_t startClock, endClock;
10508daf0c2Sdrahn     int32 count, i;
10608daf0c2Sdrahn     int8 inputNum;
10708daf0c2Sdrahn 
10808daf0c2Sdrahn     count = 0;
10908daf0c2Sdrahn     inputNum = 0;
11008daf0c2Sdrahn     startClock = clock();
11108daf0c2Sdrahn     do {
11208daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
11308daf0c2Sdrahn             function( inputs_int32[ inputNum ] );
11408daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
11508daf0c2Sdrahn         }
11608daf0c2Sdrahn         count += minIterations;
11708daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
11808daf0c2Sdrahn     inputNum = 0;
11908daf0c2Sdrahn     startClock = clock();
12008daf0c2Sdrahn     for ( i = count; i; --i ) {
12108daf0c2Sdrahn         function( inputs_int32[ inputNum ] );
12208daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
12308daf0c2Sdrahn     }
12408daf0c2Sdrahn     endClock = clock();
12508daf0c2Sdrahn     reportTime( count, endClock - startClock );
12608daf0c2Sdrahn 
12708daf0c2Sdrahn }
12808daf0c2Sdrahn 
time_a_int32_z_float64(float64 function (int32))12908daf0c2Sdrahn static void time_a_int32_z_float64( float64 function( int32 ) )
13008daf0c2Sdrahn {
13108daf0c2Sdrahn     clock_t startClock, endClock;
13208daf0c2Sdrahn     int32 count, i;
13308daf0c2Sdrahn     int8 inputNum;
13408daf0c2Sdrahn 
13508daf0c2Sdrahn     count = 0;
13608daf0c2Sdrahn     inputNum = 0;
13708daf0c2Sdrahn     startClock = clock();
13808daf0c2Sdrahn     do {
13908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
14008daf0c2Sdrahn             function( inputs_int32[ inputNum ] );
14108daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
14208daf0c2Sdrahn         }
14308daf0c2Sdrahn         count += minIterations;
14408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
14508daf0c2Sdrahn     inputNum = 0;
14608daf0c2Sdrahn     startClock = clock();
14708daf0c2Sdrahn     for ( i = count; i; --i ) {
14808daf0c2Sdrahn         function( inputs_int32[ inputNum ] );
14908daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
15008daf0c2Sdrahn     }
15108daf0c2Sdrahn     endClock = clock();
15208daf0c2Sdrahn     reportTime( count, endClock - startClock );
15308daf0c2Sdrahn 
15408daf0c2Sdrahn }
15508daf0c2Sdrahn 
15608daf0c2Sdrahn #ifdef FLOATX80
15708daf0c2Sdrahn 
time_a_int32_z_floatx80(floatx80 function (int32))15808daf0c2Sdrahn static void time_a_int32_z_floatx80( floatx80 function( int32 ) )
15908daf0c2Sdrahn {
16008daf0c2Sdrahn     clock_t startClock, endClock;
16108daf0c2Sdrahn     int32 count, i;
16208daf0c2Sdrahn     int8 inputNum;
16308daf0c2Sdrahn 
16408daf0c2Sdrahn     count = 0;
16508daf0c2Sdrahn     inputNum = 0;
16608daf0c2Sdrahn     startClock = clock();
16708daf0c2Sdrahn     do {
16808daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
16908daf0c2Sdrahn             function( inputs_int32[ inputNum ] );
17008daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
17108daf0c2Sdrahn         }
17208daf0c2Sdrahn         count += minIterations;
17308daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
17408daf0c2Sdrahn     inputNum = 0;
17508daf0c2Sdrahn     startClock = clock();
17608daf0c2Sdrahn     for ( i = count; i; --i ) {
17708daf0c2Sdrahn         function( inputs_int32[ inputNum ] );
17808daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
17908daf0c2Sdrahn     }
18008daf0c2Sdrahn     endClock = clock();
18108daf0c2Sdrahn     reportTime( count, endClock - startClock );
18208daf0c2Sdrahn 
18308daf0c2Sdrahn }
18408daf0c2Sdrahn 
18508daf0c2Sdrahn #endif
18608daf0c2Sdrahn 
18708daf0c2Sdrahn #ifdef FLOAT128
18808daf0c2Sdrahn 
time_a_int32_z_float128(float128 function (int32))18908daf0c2Sdrahn static void time_a_int32_z_float128( float128 function( int32 ) )
19008daf0c2Sdrahn {
19108daf0c2Sdrahn     clock_t startClock, endClock;
19208daf0c2Sdrahn     int32 count, i;
19308daf0c2Sdrahn     int8 inputNum;
19408daf0c2Sdrahn 
19508daf0c2Sdrahn     count = 0;
19608daf0c2Sdrahn     inputNum = 0;
19708daf0c2Sdrahn     startClock = clock();
19808daf0c2Sdrahn     do {
19908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
20008daf0c2Sdrahn             function( inputs_int32[ inputNum ] );
20108daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
20208daf0c2Sdrahn         }
20308daf0c2Sdrahn         count += minIterations;
20408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
20508daf0c2Sdrahn     inputNum = 0;
20608daf0c2Sdrahn     startClock = clock();
20708daf0c2Sdrahn     for ( i = count; i; --i ) {
20808daf0c2Sdrahn         function( inputs_int32[ inputNum ] );
20908daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
21008daf0c2Sdrahn     }
21108daf0c2Sdrahn     endClock = clock();
21208daf0c2Sdrahn     reportTime( count, endClock - startClock );
21308daf0c2Sdrahn 
21408daf0c2Sdrahn }
21508daf0c2Sdrahn 
21608daf0c2Sdrahn #endif
21708daf0c2Sdrahn 
21808daf0c2Sdrahn enum {
21908daf0c2Sdrahn     numInputs_int64 = 32
22008daf0c2Sdrahn };
22108daf0c2Sdrahn 
22208daf0c2Sdrahn static const int64 inputs_int64[ numInputs_int64 ] = {
22308daf0c2Sdrahn     LIT64( 0xFBFFC3FFFFFFFFFF ),
22408daf0c2Sdrahn     LIT64( 0x0000000003C589BC ),
22508daf0c2Sdrahn     LIT64( 0x00000000400013FE ),
22608daf0c2Sdrahn     LIT64( 0x0000000000186171 ),
22708daf0c2Sdrahn     LIT64( 0xFFFFFFFFFFFEFBFA ),
22808daf0c2Sdrahn     LIT64( 0xFFFFFD79E6DFFC73 ),
22908daf0c2Sdrahn     LIT64( 0x0000000010001DFF ),
23008daf0c2Sdrahn     LIT64( 0xDD1A0F0C78513710 ),
23108daf0c2Sdrahn     LIT64( 0xFFFF83FFFFFEFFFE ),
23208daf0c2Sdrahn     LIT64( 0x00756EBD1AD0C1C7 ),
23308daf0c2Sdrahn     LIT64( 0x0003FDFFFFFFFFBE ),
23408daf0c2Sdrahn     LIT64( 0x0007D0FB2C2CA951 ),
23508daf0c2Sdrahn     LIT64( 0x0007FC0007FFFFFE ),
23608daf0c2Sdrahn     LIT64( 0x0000001F942B18BB ),
23708daf0c2Sdrahn     LIT64( 0x0000080101FFFFFE ),
23808daf0c2Sdrahn     LIT64( 0xFFFFFFFFFFFF0978 ),
23908daf0c2Sdrahn     LIT64( 0x000000000008BFFF ),
24008daf0c2Sdrahn     LIT64( 0x0000000006F5AF08 ),
24108daf0c2Sdrahn     LIT64( 0xFFDEFF7FFFFFFFFE ),
24208daf0c2Sdrahn     LIT64( 0x0000000000000003 ),
24308daf0c2Sdrahn     LIT64( 0x3FFFFFFFFF80007D ),
24408daf0c2Sdrahn     LIT64( 0x0000000000000078 ),
24508daf0c2Sdrahn     LIT64( 0xFFF80000007FDFFD ),
24608daf0c2Sdrahn     LIT64( 0x1BBC775B78016AB0 ),
24708daf0c2Sdrahn     LIT64( 0xFFF9001FFFFFFFFE ),
24808daf0c2Sdrahn     LIT64( 0xFFFD4767AB98E43F ),
24908daf0c2Sdrahn     LIT64( 0xFFFFFEFFFE00001E ),
25008daf0c2Sdrahn     LIT64( 0xFFFFFFFFFFF04EFD ),
25108daf0c2Sdrahn     LIT64( 0x07FFFFFFFFFFF7FF ),
25208daf0c2Sdrahn     LIT64( 0xFFFC9EAA38F89050 ),
25308daf0c2Sdrahn     LIT64( 0x00000020FBFFFFFE ),
25408daf0c2Sdrahn     LIT64( 0x0000099AE6455357 )
25508daf0c2Sdrahn };
25608daf0c2Sdrahn 
time_a_int64_z_float32(float32 function (int64))25708daf0c2Sdrahn static void time_a_int64_z_float32( float32 function( int64 ) )
25808daf0c2Sdrahn {
25908daf0c2Sdrahn     clock_t startClock, endClock;
26008daf0c2Sdrahn     int32 count, i;
26108daf0c2Sdrahn     int8 inputNum;
26208daf0c2Sdrahn 
26308daf0c2Sdrahn     count = 0;
26408daf0c2Sdrahn     inputNum = 0;
26508daf0c2Sdrahn     startClock = clock();
26608daf0c2Sdrahn     do {
26708daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
26808daf0c2Sdrahn             function( inputs_int64[ inputNum ] );
26908daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
27008daf0c2Sdrahn         }
27108daf0c2Sdrahn         count += minIterations;
27208daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
27308daf0c2Sdrahn     inputNum = 0;
27408daf0c2Sdrahn     startClock = clock();
27508daf0c2Sdrahn     for ( i = count; i; --i ) {
27608daf0c2Sdrahn         function( inputs_int64[ inputNum ] );
27708daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
27808daf0c2Sdrahn     }
27908daf0c2Sdrahn     endClock = clock();
28008daf0c2Sdrahn     reportTime( count, endClock - startClock );
28108daf0c2Sdrahn 
28208daf0c2Sdrahn }
28308daf0c2Sdrahn 
time_a_int64_z_float64(float64 function (int64))28408daf0c2Sdrahn static void time_a_int64_z_float64( float64 function( int64 ) )
28508daf0c2Sdrahn {
28608daf0c2Sdrahn     clock_t startClock, endClock;
28708daf0c2Sdrahn     int32 count, i;
28808daf0c2Sdrahn     int8 inputNum;
28908daf0c2Sdrahn 
29008daf0c2Sdrahn     count = 0;
29108daf0c2Sdrahn     inputNum = 0;
29208daf0c2Sdrahn     startClock = clock();
29308daf0c2Sdrahn     do {
29408daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
29508daf0c2Sdrahn             function( inputs_int64[ inputNum ] );
29608daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
29708daf0c2Sdrahn         }
29808daf0c2Sdrahn         count += minIterations;
29908daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
30008daf0c2Sdrahn     inputNum = 0;
30108daf0c2Sdrahn     startClock = clock();
30208daf0c2Sdrahn     for ( i = count; i; --i ) {
30308daf0c2Sdrahn         function( inputs_int64[ inputNum ] );
30408daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
30508daf0c2Sdrahn     }
30608daf0c2Sdrahn     endClock = clock();
30708daf0c2Sdrahn     reportTime( count, endClock - startClock );
30808daf0c2Sdrahn 
30908daf0c2Sdrahn }
31008daf0c2Sdrahn 
31108daf0c2Sdrahn #ifdef FLOATX80
31208daf0c2Sdrahn 
time_a_int64_z_floatx80(floatx80 function (int64))31308daf0c2Sdrahn static void time_a_int64_z_floatx80( floatx80 function( int64 ) )
31408daf0c2Sdrahn {
31508daf0c2Sdrahn     clock_t startClock, endClock;
31608daf0c2Sdrahn     int32 count, i;
31708daf0c2Sdrahn     int8 inputNum;
31808daf0c2Sdrahn 
31908daf0c2Sdrahn     count = 0;
32008daf0c2Sdrahn     inputNum = 0;
32108daf0c2Sdrahn     startClock = clock();
32208daf0c2Sdrahn     do {
32308daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
32408daf0c2Sdrahn             function( inputs_int64[ inputNum ] );
32508daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
32608daf0c2Sdrahn         }
32708daf0c2Sdrahn         count += minIterations;
32808daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
32908daf0c2Sdrahn     inputNum = 0;
33008daf0c2Sdrahn     startClock = clock();
33108daf0c2Sdrahn     for ( i = count; i; --i ) {
33208daf0c2Sdrahn         function( inputs_int64[ inputNum ] );
33308daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
33408daf0c2Sdrahn     }
33508daf0c2Sdrahn     endClock = clock();
33608daf0c2Sdrahn     reportTime( count, endClock - startClock );
33708daf0c2Sdrahn 
33808daf0c2Sdrahn }
33908daf0c2Sdrahn 
34008daf0c2Sdrahn #endif
34108daf0c2Sdrahn 
34208daf0c2Sdrahn #ifdef FLOAT128
34308daf0c2Sdrahn 
time_a_int64_z_float128(float128 function (int64))34408daf0c2Sdrahn static void time_a_int64_z_float128( float128 function( int64 ) )
34508daf0c2Sdrahn {
34608daf0c2Sdrahn     clock_t startClock, endClock;
34708daf0c2Sdrahn     int32 count, i;
34808daf0c2Sdrahn     int8 inputNum;
34908daf0c2Sdrahn 
35008daf0c2Sdrahn     count = 0;
35108daf0c2Sdrahn     inputNum = 0;
35208daf0c2Sdrahn     startClock = clock();
35308daf0c2Sdrahn     do {
35408daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
35508daf0c2Sdrahn             function( inputs_int64[ inputNum ] );
35608daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
35708daf0c2Sdrahn         }
35808daf0c2Sdrahn         count += minIterations;
35908daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
36008daf0c2Sdrahn     inputNum = 0;
36108daf0c2Sdrahn     startClock = clock();
36208daf0c2Sdrahn     for ( i = count; i; --i ) {
36308daf0c2Sdrahn         function( inputs_int64[ inputNum ] );
36408daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
36508daf0c2Sdrahn     }
36608daf0c2Sdrahn     endClock = clock();
36708daf0c2Sdrahn     reportTime( count, endClock - startClock );
36808daf0c2Sdrahn 
36908daf0c2Sdrahn }
37008daf0c2Sdrahn 
37108daf0c2Sdrahn #endif
37208daf0c2Sdrahn 
37308daf0c2Sdrahn enum {
37408daf0c2Sdrahn     numInputs_float32 = 32
37508daf0c2Sdrahn };
37608daf0c2Sdrahn 
37708daf0c2Sdrahn static const float32 inputs_float32[ numInputs_float32 ] = {
37808daf0c2Sdrahn     0x4EFA0000, 0xC1D0B328, 0x80000000, 0x3E69A31E,
37908daf0c2Sdrahn     0xAF803EFF, 0x3F800000, 0x17BF8000, 0xE74A301A,
38008daf0c2Sdrahn     0x4E010003, 0x7EE3C75D, 0xBD803FE0, 0xBFFEFF00,
38108daf0c2Sdrahn     0x7981F800, 0x431FFFFC, 0xC100C000, 0x3D87EFFF,
38208daf0c2Sdrahn     0x4103FEFE, 0xBC000007, 0xBF01F7FF, 0x4E6C6B5C,
38308daf0c2Sdrahn     0xC187FFFE, 0xC58B9F13, 0x4F88007F, 0xDF004007,
38408daf0c2Sdrahn     0xB7FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000,
38508daf0c2Sdrahn     0xDB428661, 0x33F89B1F, 0xA3BFEFFF, 0x537BFFBE
38608daf0c2Sdrahn };
38708daf0c2Sdrahn 
time_a_float32_z_int32(int32 function (float32))38808daf0c2Sdrahn static void time_a_float32_z_int32( int32 function( float32 ) )
38908daf0c2Sdrahn {
39008daf0c2Sdrahn     clock_t startClock, endClock;
39108daf0c2Sdrahn     int32 count, i;
39208daf0c2Sdrahn     int8 inputNum;
39308daf0c2Sdrahn 
39408daf0c2Sdrahn     count = 0;
39508daf0c2Sdrahn     inputNum = 0;
39608daf0c2Sdrahn     startClock = clock();
39708daf0c2Sdrahn     do {
39808daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
39908daf0c2Sdrahn             function( inputs_float32[ inputNum ] );
40008daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
40108daf0c2Sdrahn         }
40208daf0c2Sdrahn         count += minIterations;
40308daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
40408daf0c2Sdrahn     inputNum = 0;
40508daf0c2Sdrahn     startClock = clock();
40608daf0c2Sdrahn     for ( i = count; i; --i ) {
40708daf0c2Sdrahn         function( inputs_float32[ inputNum ] );
40808daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
40908daf0c2Sdrahn     }
41008daf0c2Sdrahn     endClock = clock();
41108daf0c2Sdrahn     reportTime( count, endClock - startClock );
41208daf0c2Sdrahn 
41308daf0c2Sdrahn }
41408daf0c2Sdrahn 
time_a_float32_z_int64(int64 function (float32))41508daf0c2Sdrahn static void time_a_float32_z_int64( int64 function( float32 ) )
41608daf0c2Sdrahn {
41708daf0c2Sdrahn     clock_t startClock, endClock;
41808daf0c2Sdrahn     int32 count, i;
41908daf0c2Sdrahn     int8 inputNum;
42008daf0c2Sdrahn 
42108daf0c2Sdrahn     count = 0;
42208daf0c2Sdrahn     inputNum = 0;
42308daf0c2Sdrahn     startClock = clock();
42408daf0c2Sdrahn     do {
42508daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
42608daf0c2Sdrahn             function( inputs_float32[ inputNum ] );
42708daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
42808daf0c2Sdrahn         }
42908daf0c2Sdrahn         count += minIterations;
43008daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
43108daf0c2Sdrahn     inputNum = 0;
43208daf0c2Sdrahn     startClock = clock();
43308daf0c2Sdrahn     for ( i = count; i; --i ) {
43408daf0c2Sdrahn         function( inputs_float32[ inputNum ] );
43508daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
43608daf0c2Sdrahn     }
43708daf0c2Sdrahn     endClock = clock();
43808daf0c2Sdrahn     reportTime( count, endClock - startClock );
43908daf0c2Sdrahn 
44008daf0c2Sdrahn }
44108daf0c2Sdrahn 
time_a_float32_z_float64(float64 function (float32))44208daf0c2Sdrahn static void time_a_float32_z_float64( float64 function( float32 ) )
44308daf0c2Sdrahn {
44408daf0c2Sdrahn     clock_t startClock, endClock;
44508daf0c2Sdrahn     int32 count, i;
44608daf0c2Sdrahn     int8 inputNum;
44708daf0c2Sdrahn 
44808daf0c2Sdrahn     count = 0;
44908daf0c2Sdrahn     inputNum = 0;
45008daf0c2Sdrahn     startClock = clock();
45108daf0c2Sdrahn     do {
45208daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
45308daf0c2Sdrahn             function( inputs_float32[ inputNum ] );
45408daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
45508daf0c2Sdrahn         }
45608daf0c2Sdrahn         count += minIterations;
45708daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
45808daf0c2Sdrahn     inputNum = 0;
45908daf0c2Sdrahn     startClock = clock();
46008daf0c2Sdrahn     for ( i = count; i; --i ) {
46108daf0c2Sdrahn         function( inputs_float32[ inputNum ] );
46208daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
46308daf0c2Sdrahn     }
46408daf0c2Sdrahn     endClock = clock();
46508daf0c2Sdrahn     reportTime( count, endClock - startClock );
46608daf0c2Sdrahn 
46708daf0c2Sdrahn }
46808daf0c2Sdrahn 
46908daf0c2Sdrahn #ifdef FLOATX80
47008daf0c2Sdrahn 
time_a_float32_z_floatx80(floatx80 function (float32))47108daf0c2Sdrahn static void time_a_float32_z_floatx80( floatx80 function( float32 ) )
47208daf0c2Sdrahn {
47308daf0c2Sdrahn     clock_t startClock, endClock;
47408daf0c2Sdrahn     int32 count, i;
47508daf0c2Sdrahn     int8 inputNum;
47608daf0c2Sdrahn 
47708daf0c2Sdrahn     count = 0;
47808daf0c2Sdrahn     inputNum = 0;
47908daf0c2Sdrahn     startClock = clock();
48008daf0c2Sdrahn     do {
48108daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
48208daf0c2Sdrahn             function( inputs_float32[ inputNum ] );
48308daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
48408daf0c2Sdrahn         }
48508daf0c2Sdrahn         count += minIterations;
48608daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
48708daf0c2Sdrahn     inputNum = 0;
48808daf0c2Sdrahn     startClock = clock();
48908daf0c2Sdrahn     for ( i = count; i; --i ) {
49008daf0c2Sdrahn         function( inputs_float32[ inputNum ] );
49108daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
49208daf0c2Sdrahn     }
49308daf0c2Sdrahn     endClock = clock();
49408daf0c2Sdrahn     reportTime( count, endClock - startClock );
49508daf0c2Sdrahn 
49608daf0c2Sdrahn }
49708daf0c2Sdrahn 
49808daf0c2Sdrahn #endif
49908daf0c2Sdrahn 
50008daf0c2Sdrahn #ifdef FLOAT128
50108daf0c2Sdrahn 
time_a_float32_z_float128(float128 function (float32))50208daf0c2Sdrahn static void time_a_float32_z_float128( float128 function( float32 ) )
50308daf0c2Sdrahn {
50408daf0c2Sdrahn     clock_t startClock, endClock;
50508daf0c2Sdrahn     int32 count, i;
50608daf0c2Sdrahn     int8 inputNum;
50708daf0c2Sdrahn 
50808daf0c2Sdrahn     count = 0;
50908daf0c2Sdrahn     inputNum = 0;
51008daf0c2Sdrahn     startClock = clock();
51108daf0c2Sdrahn     do {
51208daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
51308daf0c2Sdrahn             function( inputs_float32[ inputNum ] );
51408daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
51508daf0c2Sdrahn         }
51608daf0c2Sdrahn         count += minIterations;
51708daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
51808daf0c2Sdrahn     inputNum = 0;
51908daf0c2Sdrahn     startClock = clock();
52008daf0c2Sdrahn     for ( i = count; i; --i ) {
52108daf0c2Sdrahn         function( inputs_float32[ inputNum ] );
52208daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
52308daf0c2Sdrahn     }
52408daf0c2Sdrahn     endClock = clock();
52508daf0c2Sdrahn     reportTime( count, endClock - startClock );
52608daf0c2Sdrahn 
52708daf0c2Sdrahn }
52808daf0c2Sdrahn 
52908daf0c2Sdrahn #endif
53008daf0c2Sdrahn 
time_az_float32(float32 function (float32))53108daf0c2Sdrahn static void time_az_float32( float32 function( float32 ) )
53208daf0c2Sdrahn {
53308daf0c2Sdrahn     clock_t startClock, endClock;
53408daf0c2Sdrahn     int32 count, i;
53508daf0c2Sdrahn     int8 inputNum;
53608daf0c2Sdrahn 
53708daf0c2Sdrahn     count = 0;
53808daf0c2Sdrahn     inputNum = 0;
53908daf0c2Sdrahn     startClock = clock();
54008daf0c2Sdrahn     do {
54108daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
54208daf0c2Sdrahn             function( inputs_float32[ inputNum ] );
54308daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
54408daf0c2Sdrahn         }
54508daf0c2Sdrahn         count += minIterations;
54608daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
54708daf0c2Sdrahn     inputNum = 0;
54808daf0c2Sdrahn     startClock = clock();
54908daf0c2Sdrahn     for ( i = count; i; --i ) {
55008daf0c2Sdrahn         function( inputs_float32[ inputNum ] );
55108daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
55208daf0c2Sdrahn     }
55308daf0c2Sdrahn     endClock = clock();
55408daf0c2Sdrahn     reportTime( count, endClock - startClock );
55508daf0c2Sdrahn 
55608daf0c2Sdrahn }
55708daf0c2Sdrahn 
time_ab_float32_z_flag(flag function (float32,float32))55808daf0c2Sdrahn static void time_ab_float32_z_flag( flag function( float32, float32 ) )
55908daf0c2Sdrahn {
56008daf0c2Sdrahn     clock_t startClock, endClock;
56108daf0c2Sdrahn     int32 count, i;
56208daf0c2Sdrahn     int8 inputNumA, inputNumB;
56308daf0c2Sdrahn 
56408daf0c2Sdrahn     count = 0;
56508daf0c2Sdrahn     inputNumA = 0;
56608daf0c2Sdrahn     inputNumB = 0;
56708daf0c2Sdrahn     startClock = clock();
56808daf0c2Sdrahn     do {
56908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
57008daf0c2Sdrahn             function(
57108daf0c2Sdrahn                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
57208daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
57308daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
57408daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
57508daf0c2Sdrahn         }
57608daf0c2Sdrahn         count += minIterations;
57708daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
57808daf0c2Sdrahn     inputNumA = 0;
57908daf0c2Sdrahn     inputNumB = 0;
58008daf0c2Sdrahn     startClock = clock();
58108daf0c2Sdrahn     for ( i = count; i; --i ) {
58208daf0c2Sdrahn             function(
58308daf0c2Sdrahn                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
58408daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
58508daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
58608daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
58708daf0c2Sdrahn     }
58808daf0c2Sdrahn     endClock = clock();
58908daf0c2Sdrahn     reportTime( count, endClock - startClock );
59008daf0c2Sdrahn 
59108daf0c2Sdrahn }
59208daf0c2Sdrahn 
time_abz_float32(float32 function (float32,float32))59308daf0c2Sdrahn static void time_abz_float32( float32 function( float32, float32 ) )
59408daf0c2Sdrahn {
59508daf0c2Sdrahn     clock_t startClock, endClock;
59608daf0c2Sdrahn     int32 count, i;
59708daf0c2Sdrahn     int8 inputNumA, inputNumB;
59808daf0c2Sdrahn 
59908daf0c2Sdrahn     count = 0;
60008daf0c2Sdrahn     inputNumA = 0;
60108daf0c2Sdrahn     inputNumB = 0;
60208daf0c2Sdrahn     startClock = clock();
60308daf0c2Sdrahn     do {
60408daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
60508daf0c2Sdrahn             function(
60608daf0c2Sdrahn                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
60708daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
60808daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
60908daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
61008daf0c2Sdrahn         }
61108daf0c2Sdrahn         count += minIterations;
61208daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
61308daf0c2Sdrahn     inputNumA = 0;
61408daf0c2Sdrahn     inputNumB = 0;
61508daf0c2Sdrahn     startClock = clock();
61608daf0c2Sdrahn     for ( i = count; i; --i ) {
61708daf0c2Sdrahn             function(
61808daf0c2Sdrahn                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
61908daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
62008daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
62108daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
62208daf0c2Sdrahn     }
62308daf0c2Sdrahn     endClock = clock();
62408daf0c2Sdrahn     reportTime( count, endClock - startClock );
62508daf0c2Sdrahn 
62608daf0c2Sdrahn }
62708daf0c2Sdrahn 
62808daf0c2Sdrahn static const float32 inputs_float32_pos[ numInputs_float32 ] = {
62908daf0c2Sdrahn     0x4EFA0000, 0x41D0B328, 0x00000000, 0x3E69A31E,
63008daf0c2Sdrahn     0x2F803EFF, 0x3F800000, 0x17BF8000, 0x674A301A,
63108daf0c2Sdrahn     0x4E010003, 0x7EE3C75D, 0x3D803FE0, 0x3FFEFF00,
63208daf0c2Sdrahn     0x7981F800, 0x431FFFFC, 0x4100C000, 0x3D87EFFF,
63308daf0c2Sdrahn     0x4103FEFE, 0x3C000007, 0x3F01F7FF, 0x4E6C6B5C,
63408daf0c2Sdrahn     0x4187FFFE, 0x458B9F13, 0x4F88007F, 0x5F004007,
63508daf0c2Sdrahn     0x37FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000,
63608daf0c2Sdrahn     0x5B428661, 0x33F89B1F, 0x23BFEFFF, 0x537BFFBE
63708daf0c2Sdrahn };
63808daf0c2Sdrahn 
time_az_float32_pos(float32 function (float32))63908daf0c2Sdrahn static void time_az_float32_pos( float32 function( float32 ) )
64008daf0c2Sdrahn {
64108daf0c2Sdrahn     clock_t startClock, endClock;
64208daf0c2Sdrahn     int32 count, i;
64308daf0c2Sdrahn     int8 inputNum;
64408daf0c2Sdrahn 
64508daf0c2Sdrahn     count = 0;
64608daf0c2Sdrahn     inputNum = 0;
64708daf0c2Sdrahn     startClock = clock();
64808daf0c2Sdrahn     do {
64908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
65008daf0c2Sdrahn             function( inputs_float32_pos[ inputNum ] );
65108daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
65208daf0c2Sdrahn         }
65308daf0c2Sdrahn         count += minIterations;
65408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
65508daf0c2Sdrahn     inputNum = 0;
65608daf0c2Sdrahn     startClock = clock();
65708daf0c2Sdrahn     for ( i = count; i; --i ) {
65808daf0c2Sdrahn         function( inputs_float32_pos[ inputNum ] );
65908daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
66008daf0c2Sdrahn     }
66108daf0c2Sdrahn     endClock = clock();
66208daf0c2Sdrahn     reportTime( count, endClock - startClock );
66308daf0c2Sdrahn 
66408daf0c2Sdrahn }
66508daf0c2Sdrahn 
66608daf0c2Sdrahn enum {
66708daf0c2Sdrahn     numInputs_float64 = 32
66808daf0c2Sdrahn };
66908daf0c2Sdrahn 
67008daf0c2Sdrahn static const float64 inputs_float64[ numInputs_float64 ] = {
67108daf0c2Sdrahn     LIT64( 0x422FFFC008000000 ),
67208daf0c2Sdrahn     LIT64( 0xB7E0000480000000 ),
67308daf0c2Sdrahn     LIT64( 0xF3FD2546120B7935 ),
67408daf0c2Sdrahn     LIT64( 0x3FF0000000000000 ),
67508daf0c2Sdrahn     LIT64( 0xCE07F766F09588D6 ),
67608daf0c2Sdrahn     LIT64( 0x8000000000000000 ),
67708daf0c2Sdrahn     LIT64( 0x3FCE000400000000 ),
67808daf0c2Sdrahn     LIT64( 0x8313B60F0032BED8 ),
67908daf0c2Sdrahn     LIT64( 0xC1EFFFFFC0002000 ),
68008daf0c2Sdrahn     LIT64( 0x3FB3C75D224F2B0F ),
68108daf0c2Sdrahn     LIT64( 0x7FD00000004000FF ),
68208daf0c2Sdrahn     LIT64( 0xA12FFF8000001FFF ),
68308daf0c2Sdrahn     LIT64( 0x3EE0000000FE0000 ),
68408daf0c2Sdrahn     LIT64( 0x0010000080000004 ),
68508daf0c2Sdrahn     LIT64( 0x41CFFFFE00000020 ),
68608daf0c2Sdrahn     LIT64( 0x40303FFFFFFFFFFD ),
68708daf0c2Sdrahn     LIT64( 0x3FD000003FEFFFFF ),
68808daf0c2Sdrahn     LIT64( 0xBFD0000010000000 ),
68908daf0c2Sdrahn     LIT64( 0xB7FC6B5C16CA55CF ),
69008daf0c2Sdrahn     LIT64( 0x413EEB940B9D1301 ),
69108daf0c2Sdrahn     LIT64( 0xC7E00200001FFFFF ),
69208daf0c2Sdrahn     LIT64( 0x47F00021FFFFFFFE ),
69308daf0c2Sdrahn     LIT64( 0xBFFFFFFFF80000FF ),
69408daf0c2Sdrahn     LIT64( 0xC07FFFFFE00FFFFF ),
69508daf0c2Sdrahn     LIT64( 0x001497A63740C5E8 ),
69608daf0c2Sdrahn     LIT64( 0xC4BFFFE0001FFFFF ),
69708daf0c2Sdrahn     LIT64( 0x96FFDFFEFFFFFFFF ),
69808daf0c2Sdrahn     LIT64( 0x403FC000000001FE ),
69908daf0c2Sdrahn     LIT64( 0xFFD00000000001F6 ),
70008daf0c2Sdrahn     LIT64( 0x0640400002000000 ),
70108daf0c2Sdrahn     LIT64( 0x479CEE1E4F789FE0 ),
70208daf0c2Sdrahn     LIT64( 0xC237FFFFFFFFFDFE )
70308daf0c2Sdrahn };
70408daf0c2Sdrahn 
time_a_float64_z_int32(int32 function (float64))70508daf0c2Sdrahn static void time_a_float64_z_int32( int32 function( float64 ) )
70608daf0c2Sdrahn {
70708daf0c2Sdrahn     clock_t startClock, endClock;
70808daf0c2Sdrahn     int32 count, i;
70908daf0c2Sdrahn     int8 inputNum;
71008daf0c2Sdrahn 
71108daf0c2Sdrahn     count = 0;
71208daf0c2Sdrahn     inputNum = 0;
71308daf0c2Sdrahn     startClock = clock();
71408daf0c2Sdrahn     do {
71508daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
71608daf0c2Sdrahn             function( inputs_float64[ inputNum ] );
71708daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
71808daf0c2Sdrahn         }
71908daf0c2Sdrahn         count += minIterations;
72008daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
72108daf0c2Sdrahn     inputNum = 0;
72208daf0c2Sdrahn     startClock = clock();
72308daf0c2Sdrahn     for ( i = count; i; --i ) {
72408daf0c2Sdrahn         function( inputs_float64[ inputNum ] );
72508daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
72608daf0c2Sdrahn     }
72708daf0c2Sdrahn     endClock = clock();
72808daf0c2Sdrahn     reportTime( count, endClock - startClock );
72908daf0c2Sdrahn 
73008daf0c2Sdrahn }
73108daf0c2Sdrahn 
time_a_float64_z_int64(int64 function (float64))73208daf0c2Sdrahn static void time_a_float64_z_int64( int64 function( float64 ) )
73308daf0c2Sdrahn {
73408daf0c2Sdrahn     clock_t startClock, endClock;
73508daf0c2Sdrahn     int32 count, i;
73608daf0c2Sdrahn     int8 inputNum;
73708daf0c2Sdrahn 
73808daf0c2Sdrahn     count = 0;
73908daf0c2Sdrahn     inputNum = 0;
74008daf0c2Sdrahn     startClock = clock();
74108daf0c2Sdrahn     do {
74208daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
74308daf0c2Sdrahn             function( inputs_float64[ inputNum ] );
74408daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
74508daf0c2Sdrahn         }
74608daf0c2Sdrahn         count += minIterations;
74708daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
74808daf0c2Sdrahn     inputNum = 0;
74908daf0c2Sdrahn     startClock = clock();
75008daf0c2Sdrahn     for ( i = count; i; --i ) {
75108daf0c2Sdrahn         function( inputs_float64[ inputNum ] );
75208daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
75308daf0c2Sdrahn     }
75408daf0c2Sdrahn     endClock = clock();
75508daf0c2Sdrahn     reportTime( count, endClock - startClock );
75608daf0c2Sdrahn 
75708daf0c2Sdrahn }
75808daf0c2Sdrahn 
time_a_float64_z_float32(float32 function (float64))75908daf0c2Sdrahn static void time_a_float64_z_float32( float32 function( float64 ) )
76008daf0c2Sdrahn {
76108daf0c2Sdrahn     clock_t startClock, endClock;
76208daf0c2Sdrahn     int32 count, i;
76308daf0c2Sdrahn     int8 inputNum;
76408daf0c2Sdrahn 
76508daf0c2Sdrahn     count = 0;
76608daf0c2Sdrahn     inputNum = 0;
76708daf0c2Sdrahn     startClock = clock();
76808daf0c2Sdrahn     do {
76908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
77008daf0c2Sdrahn             function( inputs_float64[ inputNum ] );
77108daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
77208daf0c2Sdrahn         }
77308daf0c2Sdrahn         count += minIterations;
77408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
77508daf0c2Sdrahn     inputNum = 0;
77608daf0c2Sdrahn     startClock = clock();
77708daf0c2Sdrahn     for ( i = count; i; --i ) {
77808daf0c2Sdrahn         function( inputs_float64[ inputNum ] );
77908daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
78008daf0c2Sdrahn     }
78108daf0c2Sdrahn     endClock = clock();
78208daf0c2Sdrahn     reportTime( count, endClock - startClock );
78308daf0c2Sdrahn 
78408daf0c2Sdrahn }
78508daf0c2Sdrahn 
78608daf0c2Sdrahn #ifdef FLOATX80
78708daf0c2Sdrahn 
time_a_float64_z_floatx80(floatx80 function (float64))78808daf0c2Sdrahn static void time_a_float64_z_floatx80( floatx80 function( float64 ) )
78908daf0c2Sdrahn {
79008daf0c2Sdrahn     clock_t startClock, endClock;
79108daf0c2Sdrahn     int32 count, i;
79208daf0c2Sdrahn     int8 inputNum;
79308daf0c2Sdrahn 
79408daf0c2Sdrahn     count = 0;
79508daf0c2Sdrahn     inputNum = 0;
79608daf0c2Sdrahn     startClock = clock();
79708daf0c2Sdrahn     do {
79808daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
79908daf0c2Sdrahn             function( inputs_float64[ inputNum ] );
80008daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
80108daf0c2Sdrahn         }
80208daf0c2Sdrahn         count += minIterations;
80308daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
80408daf0c2Sdrahn     inputNum = 0;
80508daf0c2Sdrahn     startClock = clock();
80608daf0c2Sdrahn     for ( i = count; i; --i ) {
80708daf0c2Sdrahn         function( inputs_float64[ inputNum ] );
80808daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
80908daf0c2Sdrahn     }
81008daf0c2Sdrahn     endClock = clock();
81108daf0c2Sdrahn     reportTime( count, endClock - startClock );
81208daf0c2Sdrahn 
81308daf0c2Sdrahn }
81408daf0c2Sdrahn 
81508daf0c2Sdrahn #endif
81608daf0c2Sdrahn 
81708daf0c2Sdrahn #ifdef FLOAT128
81808daf0c2Sdrahn 
time_a_float64_z_float128(float128 function (float64))81908daf0c2Sdrahn static void time_a_float64_z_float128( float128 function( float64 ) )
82008daf0c2Sdrahn {
82108daf0c2Sdrahn     clock_t startClock, endClock;
82208daf0c2Sdrahn     int32 count, i;
82308daf0c2Sdrahn     int8 inputNum;
82408daf0c2Sdrahn 
82508daf0c2Sdrahn     count = 0;
82608daf0c2Sdrahn     inputNum = 0;
82708daf0c2Sdrahn     startClock = clock();
82808daf0c2Sdrahn     do {
82908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
83008daf0c2Sdrahn             function( inputs_float64[ inputNum ] );
83108daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
83208daf0c2Sdrahn         }
83308daf0c2Sdrahn         count += minIterations;
83408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
83508daf0c2Sdrahn     inputNum = 0;
83608daf0c2Sdrahn     startClock = clock();
83708daf0c2Sdrahn     for ( i = count; i; --i ) {
83808daf0c2Sdrahn         function( inputs_float64[ inputNum ] );
83908daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
84008daf0c2Sdrahn     }
84108daf0c2Sdrahn     endClock = clock();
84208daf0c2Sdrahn     reportTime( count, endClock - startClock );
84308daf0c2Sdrahn 
84408daf0c2Sdrahn }
84508daf0c2Sdrahn 
84608daf0c2Sdrahn #endif
84708daf0c2Sdrahn 
time_az_float64(float64 function (float64))84808daf0c2Sdrahn static void time_az_float64( float64 function( float64 ) )
84908daf0c2Sdrahn {
85008daf0c2Sdrahn     clock_t startClock, endClock;
85108daf0c2Sdrahn     int32 count, i;
85208daf0c2Sdrahn     int8 inputNum;
85308daf0c2Sdrahn 
85408daf0c2Sdrahn     count = 0;
85508daf0c2Sdrahn     inputNum = 0;
85608daf0c2Sdrahn     startClock = clock();
85708daf0c2Sdrahn     do {
85808daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
85908daf0c2Sdrahn             function( inputs_float64[ inputNum ] );
86008daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
86108daf0c2Sdrahn         }
86208daf0c2Sdrahn         count += minIterations;
86308daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
86408daf0c2Sdrahn     inputNum = 0;
86508daf0c2Sdrahn     startClock = clock();
86608daf0c2Sdrahn     for ( i = count; i; --i ) {
86708daf0c2Sdrahn         function( inputs_float64[ inputNum ] );
86808daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
86908daf0c2Sdrahn     }
87008daf0c2Sdrahn     endClock = clock();
87108daf0c2Sdrahn     reportTime( count, endClock - startClock );
87208daf0c2Sdrahn 
87308daf0c2Sdrahn }
87408daf0c2Sdrahn 
time_ab_float64_z_flag(flag function (float64,float64))87508daf0c2Sdrahn static void time_ab_float64_z_flag( flag function( float64, float64 ) )
87608daf0c2Sdrahn {
87708daf0c2Sdrahn     clock_t startClock, endClock;
87808daf0c2Sdrahn     int32 count, i;
87908daf0c2Sdrahn     int8 inputNumA, inputNumB;
88008daf0c2Sdrahn 
88108daf0c2Sdrahn     count = 0;
88208daf0c2Sdrahn     inputNumA = 0;
88308daf0c2Sdrahn     inputNumB = 0;
88408daf0c2Sdrahn     startClock = clock();
88508daf0c2Sdrahn     do {
88608daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
88708daf0c2Sdrahn             function(
88808daf0c2Sdrahn                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
88908daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
89008daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
89108daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
89208daf0c2Sdrahn         }
89308daf0c2Sdrahn         count += minIterations;
89408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
89508daf0c2Sdrahn     inputNumA = 0;
89608daf0c2Sdrahn     inputNumB = 0;
89708daf0c2Sdrahn     startClock = clock();
89808daf0c2Sdrahn     for ( i = count; i; --i ) {
89908daf0c2Sdrahn             function(
90008daf0c2Sdrahn                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
90108daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
90208daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
90308daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
90408daf0c2Sdrahn     }
90508daf0c2Sdrahn     endClock = clock();
90608daf0c2Sdrahn     reportTime( count, endClock - startClock );
90708daf0c2Sdrahn 
90808daf0c2Sdrahn }
90908daf0c2Sdrahn 
time_abz_float64(float64 function (float64,float64))91008daf0c2Sdrahn static void time_abz_float64( float64 function( float64, float64 ) )
91108daf0c2Sdrahn {
91208daf0c2Sdrahn     clock_t startClock, endClock;
91308daf0c2Sdrahn     int32 count, i;
91408daf0c2Sdrahn     int8 inputNumA, inputNumB;
91508daf0c2Sdrahn 
91608daf0c2Sdrahn     count = 0;
91708daf0c2Sdrahn     inputNumA = 0;
91808daf0c2Sdrahn     inputNumB = 0;
91908daf0c2Sdrahn     startClock = clock();
92008daf0c2Sdrahn     do {
92108daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
92208daf0c2Sdrahn             function(
92308daf0c2Sdrahn                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
92408daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
92508daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
92608daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
92708daf0c2Sdrahn         }
92808daf0c2Sdrahn         count += minIterations;
92908daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
93008daf0c2Sdrahn     inputNumA = 0;
93108daf0c2Sdrahn     inputNumB = 0;
93208daf0c2Sdrahn     startClock = clock();
93308daf0c2Sdrahn     for ( i = count; i; --i ) {
93408daf0c2Sdrahn             function(
93508daf0c2Sdrahn                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
93608daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
93708daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
93808daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
93908daf0c2Sdrahn     }
94008daf0c2Sdrahn     endClock = clock();
94108daf0c2Sdrahn     reportTime( count, endClock - startClock );
94208daf0c2Sdrahn 
94308daf0c2Sdrahn }
94408daf0c2Sdrahn 
94508daf0c2Sdrahn static const float64 inputs_float64_pos[ numInputs_float64 ] = {
94608daf0c2Sdrahn     LIT64( 0x422FFFC008000000 ),
94708daf0c2Sdrahn     LIT64( 0x37E0000480000000 ),
94808daf0c2Sdrahn     LIT64( 0x73FD2546120B7935 ),
94908daf0c2Sdrahn     LIT64( 0x3FF0000000000000 ),
95008daf0c2Sdrahn     LIT64( 0x4E07F766F09588D6 ),
95108daf0c2Sdrahn     LIT64( 0x0000000000000000 ),
95208daf0c2Sdrahn     LIT64( 0x3FCE000400000000 ),
95308daf0c2Sdrahn     LIT64( 0x0313B60F0032BED8 ),
95408daf0c2Sdrahn     LIT64( 0x41EFFFFFC0002000 ),
95508daf0c2Sdrahn     LIT64( 0x3FB3C75D224F2B0F ),
95608daf0c2Sdrahn     LIT64( 0x7FD00000004000FF ),
95708daf0c2Sdrahn     LIT64( 0x212FFF8000001FFF ),
95808daf0c2Sdrahn     LIT64( 0x3EE0000000FE0000 ),
95908daf0c2Sdrahn     LIT64( 0x0010000080000004 ),
96008daf0c2Sdrahn     LIT64( 0x41CFFFFE00000020 ),
96108daf0c2Sdrahn     LIT64( 0x40303FFFFFFFFFFD ),
96208daf0c2Sdrahn     LIT64( 0x3FD000003FEFFFFF ),
96308daf0c2Sdrahn     LIT64( 0x3FD0000010000000 ),
96408daf0c2Sdrahn     LIT64( 0x37FC6B5C16CA55CF ),
96508daf0c2Sdrahn     LIT64( 0x413EEB940B9D1301 ),
96608daf0c2Sdrahn     LIT64( 0x47E00200001FFFFF ),
96708daf0c2Sdrahn     LIT64( 0x47F00021FFFFFFFE ),
96808daf0c2Sdrahn     LIT64( 0x3FFFFFFFF80000FF ),
96908daf0c2Sdrahn     LIT64( 0x407FFFFFE00FFFFF ),
97008daf0c2Sdrahn     LIT64( 0x001497A63740C5E8 ),
97108daf0c2Sdrahn     LIT64( 0x44BFFFE0001FFFFF ),
97208daf0c2Sdrahn     LIT64( 0x16FFDFFEFFFFFFFF ),
97308daf0c2Sdrahn     LIT64( 0x403FC000000001FE ),
97408daf0c2Sdrahn     LIT64( 0x7FD00000000001F6 ),
97508daf0c2Sdrahn     LIT64( 0x0640400002000000 ),
97608daf0c2Sdrahn     LIT64( 0x479CEE1E4F789FE0 ),
97708daf0c2Sdrahn     LIT64( 0x4237FFFFFFFFFDFE )
97808daf0c2Sdrahn };
97908daf0c2Sdrahn 
time_az_float64_pos(float64 function (float64))98008daf0c2Sdrahn static void time_az_float64_pos( float64 function( float64 ) )
98108daf0c2Sdrahn {
98208daf0c2Sdrahn     clock_t startClock, endClock;
98308daf0c2Sdrahn     int32 count, i;
98408daf0c2Sdrahn     int8 inputNum;
98508daf0c2Sdrahn 
98608daf0c2Sdrahn     count = 0;
98708daf0c2Sdrahn     inputNum = 0;
98808daf0c2Sdrahn     startClock = clock();
98908daf0c2Sdrahn     do {
99008daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
99108daf0c2Sdrahn             function( inputs_float64_pos[ inputNum ] );
99208daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
99308daf0c2Sdrahn         }
99408daf0c2Sdrahn         count += minIterations;
99508daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
99608daf0c2Sdrahn     inputNum = 0;
99708daf0c2Sdrahn     startClock = clock();
99808daf0c2Sdrahn     for ( i = count; i; --i ) {
99908daf0c2Sdrahn         function( inputs_float64_pos[ inputNum ] );
100008daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
100108daf0c2Sdrahn     }
100208daf0c2Sdrahn     endClock = clock();
100308daf0c2Sdrahn     reportTime( count, endClock - startClock );
100408daf0c2Sdrahn 
100508daf0c2Sdrahn }
100608daf0c2Sdrahn 
100708daf0c2Sdrahn #ifdef FLOATX80
100808daf0c2Sdrahn 
100908daf0c2Sdrahn enum {
101008daf0c2Sdrahn     numInputs_floatx80 = 32
101108daf0c2Sdrahn };
101208daf0c2Sdrahn 
101308daf0c2Sdrahn static const struct {
101408daf0c2Sdrahn     bits16 high;
101508daf0c2Sdrahn     bits64 low;
101608daf0c2Sdrahn } inputs_floatx80[ numInputs_floatx80 ] = {
101708daf0c2Sdrahn     { 0xC03F, LIT64( 0xA9BE15A19C1E8B62 ) },
101808daf0c2Sdrahn     { 0x8000, LIT64( 0x0000000000000000 ) },
101908daf0c2Sdrahn     { 0x75A8, LIT64( 0xE59591E4788957A5 ) },
102008daf0c2Sdrahn     { 0xBFFF, LIT64( 0xFFF0000000000040 ) },
102108daf0c2Sdrahn     { 0x0CD8, LIT64( 0xFC000000000007FE ) },
102208daf0c2Sdrahn     { 0x43BA, LIT64( 0x99A4000000000000 ) },
102308daf0c2Sdrahn     { 0x3FFF, LIT64( 0x8000000000000000 ) },
102408daf0c2Sdrahn     { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) },
102508daf0c2Sdrahn     { 0x403E, LIT64( 0xFFF0000000002000 ) },
102608daf0c2Sdrahn     { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) },
102708daf0c2Sdrahn     { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) },
102808daf0c2Sdrahn     { 0x737A, LIT64( 0x800000007FFDFFFE ) },
102908daf0c2Sdrahn     { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) },
103008daf0c2Sdrahn     { 0xBBFE, LIT64( 0x8000040000001FFE ) },
103108daf0c2Sdrahn     { 0xC002, LIT64( 0xFF80000000000020 ) },
103208daf0c2Sdrahn     { 0xDE8D, LIT64( 0xFFFFFFFFFFE00004 ) },
103308daf0c2Sdrahn     { 0xC004, LIT64( 0x8000000000003FFB ) },
103408daf0c2Sdrahn     { 0x407F, LIT64( 0x800000000003FFFE ) },
103508daf0c2Sdrahn     { 0xC000, LIT64( 0xA459EE6A5C16CA55 ) },
103608daf0c2Sdrahn     { 0x8003, LIT64( 0xC42CBF7399AEEB94 ) },
103708daf0c2Sdrahn     { 0xBF7F, LIT64( 0xF800000000000006 ) },
103808daf0c2Sdrahn     { 0xC07F, LIT64( 0xBF56BE8871F28FEA ) },
103908daf0c2Sdrahn     { 0xC07E, LIT64( 0xFFFF77FFFFFFFFFE ) },
104008daf0c2Sdrahn     { 0xADC9, LIT64( 0x8000000FFFFFFFDE ) },
104108daf0c2Sdrahn     { 0xC001, LIT64( 0xEFF7FFFFFFFFFFFF ) },
104208daf0c2Sdrahn     { 0x4001, LIT64( 0xBE84F30125C497A6 ) },
104308daf0c2Sdrahn     { 0xC06B, LIT64( 0xEFFFFFFFFFFFFFFF ) },
104408daf0c2Sdrahn     { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) },
104508daf0c2Sdrahn     { 0x87E9, LIT64( 0x81FFFFFFFFFFFBFF ) },
104608daf0c2Sdrahn     { 0xA63F, LIT64( 0x801FFFFFFEFFFFFE ) },
104708daf0c2Sdrahn     { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) },
104808daf0c2Sdrahn     { 0x4018, LIT64( 0x8000000000080003 ) }
104908daf0c2Sdrahn };
105008daf0c2Sdrahn 
time_a_floatx80_z_int32(int32 function (floatx80))105108daf0c2Sdrahn static void time_a_floatx80_z_int32( int32 function( floatx80 ) )
105208daf0c2Sdrahn {
105308daf0c2Sdrahn     clock_t startClock, endClock;
105408daf0c2Sdrahn     int32 count, i;
105508daf0c2Sdrahn     int8 inputNum;
105608daf0c2Sdrahn     floatx80 a;
105708daf0c2Sdrahn 
105808daf0c2Sdrahn     count = 0;
105908daf0c2Sdrahn     inputNum = 0;
106008daf0c2Sdrahn     startClock = clock();
106108daf0c2Sdrahn     do {
106208daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
106308daf0c2Sdrahn             a.low = inputs_floatx80[ inputNum ].low;
106408daf0c2Sdrahn             a.high = inputs_floatx80[ inputNum ].high;
106508daf0c2Sdrahn             function( a );
106608daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
106708daf0c2Sdrahn         }
106808daf0c2Sdrahn         count += minIterations;
106908daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
107008daf0c2Sdrahn     inputNum = 0;
107108daf0c2Sdrahn     startClock = clock();
107208daf0c2Sdrahn     for ( i = count; i; --i ) {
107308daf0c2Sdrahn         a.low = inputs_floatx80[ inputNum ].low;
107408daf0c2Sdrahn         a.high = inputs_floatx80[ inputNum ].high;
107508daf0c2Sdrahn         function( a );
107608daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
107708daf0c2Sdrahn     }
107808daf0c2Sdrahn     endClock = clock();
107908daf0c2Sdrahn     reportTime( count, endClock - startClock );
108008daf0c2Sdrahn 
108108daf0c2Sdrahn }
108208daf0c2Sdrahn 
time_a_floatx80_z_int64(int64 function (floatx80))108308daf0c2Sdrahn static void time_a_floatx80_z_int64( int64 function( floatx80 ) )
108408daf0c2Sdrahn {
108508daf0c2Sdrahn     clock_t startClock, endClock;
108608daf0c2Sdrahn     int32 count, i;
108708daf0c2Sdrahn     int8 inputNum;
108808daf0c2Sdrahn     floatx80 a;
108908daf0c2Sdrahn 
109008daf0c2Sdrahn     count = 0;
109108daf0c2Sdrahn     inputNum = 0;
109208daf0c2Sdrahn     startClock = clock();
109308daf0c2Sdrahn     do {
109408daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
109508daf0c2Sdrahn             a.low = inputs_floatx80[ inputNum ].low;
109608daf0c2Sdrahn             a.high = inputs_floatx80[ inputNum ].high;
109708daf0c2Sdrahn             function( a );
109808daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
109908daf0c2Sdrahn         }
110008daf0c2Sdrahn         count += minIterations;
110108daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
110208daf0c2Sdrahn     inputNum = 0;
110308daf0c2Sdrahn     startClock = clock();
110408daf0c2Sdrahn     for ( i = count; i; --i ) {
110508daf0c2Sdrahn         a.low = inputs_floatx80[ inputNum ].low;
110608daf0c2Sdrahn         a.high = inputs_floatx80[ inputNum ].high;
110708daf0c2Sdrahn         function( a );
110808daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
110908daf0c2Sdrahn     }
111008daf0c2Sdrahn     endClock = clock();
111108daf0c2Sdrahn     reportTime( count, endClock - startClock );
111208daf0c2Sdrahn 
111308daf0c2Sdrahn }
111408daf0c2Sdrahn 
time_a_floatx80_z_float32(float32 function (floatx80))111508daf0c2Sdrahn static void time_a_floatx80_z_float32( float32 function( floatx80 ) )
111608daf0c2Sdrahn {
111708daf0c2Sdrahn     clock_t startClock, endClock;
111808daf0c2Sdrahn     int32 count, i;
111908daf0c2Sdrahn     int8 inputNum;
112008daf0c2Sdrahn     floatx80 a;
112108daf0c2Sdrahn 
112208daf0c2Sdrahn     count = 0;
112308daf0c2Sdrahn     inputNum = 0;
112408daf0c2Sdrahn     startClock = clock();
112508daf0c2Sdrahn     do {
112608daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
112708daf0c2Sdrahn             a.low = inputs_floatx80[ inputNum ].low;
112808daf0c2Sdrahn             a.high = inputs_floatx80[ inputNum ].high;
112908daf0c2Sdrahn             function( a );
113008daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
113108daf0c2Sdrahn         }
113208daf0c2Sdrahn         count += minIterations;
113308daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
113408daf0c2Sdrahn     inputNum = 0;
113508daf0c2Sdrahn     startClock = clock();
113608daf0c2Sdrahn     for ( i = count; i; --i ) {
113708daf0c2Sdrahn         a.low = inputs_floatx80[ inputNum ].low;
113808daf0c2Sdrahn         a.high = inputs_floatx80[ inputNum ].high;
113908daf0c2Sdrahn         function( a );
114008daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
114108daf0c2Sdrahn     }
114208daf0c2Sdrahn     endClock = clock();
114308daf0c2Sdrahn     reportTime( count, endClock - startClock );
114408daf0c2Sdrahn 
114508daf0c2Sdrahn }
114608daf0c2Sdrahn 
time_a_floatx80_z_float64(float64 function (floatx80))114708daf0c2Sdrahn static void time_a_floatx80_z_float64( float64 function( floatx80 ) )
114808daf0c2Sdrahn {
114908daf0c2Sdrahn     clock_t startClock, endClock;
115008daf0c2Sdrahn     int32 count, i;
115108daf0c2Sdrahn     int8 inputNum;
115208daf0c2Sdrahn     floatx80 a;
115308daf0c2Sdrahn 
115408daf0c2Sdrahn     count = 0;
115508daf0c2Sdrahn     inputNum = 0;
115608daf0c2Sdrahn     startClock = clock();
115708daf0c2Sdrahn     do {
115808daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
115908daf0c2Sdrahn             a.low = inputs_floatx80[ inputNum ].low;
116008daf0c2Sdrahn             a.high = inputs_floatx80[ inputNum ].high;
116108daf0c2Sdrahn             function( a );
116208daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
116308daf0c2Sdrahn         }
116408daf0c2Sdrahn         count += minIterations;
116508daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
116608daf0c2Sdrahn     inputNum = 0;
116708daf0c2Sdrahn     startClock = clock();
116808daf0c2Sdrahn     for ( i = count; i; --i ) {
116908daf0c2Sdrahn         a.low = inputs_floatx80[ inputNum ].low;
117008daf0c2Sdrahn         a.high = inputs_floatx80[ inputNum ].high;
117108daf0c2Sdrahn         function( a );
117208daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
117308daf0c2Sdrahn     }
117408daf0c2Sdrahn     endClock = clock();
117508daf0c2Sdrahn     reportTime( count, endClock - startClock );
117608daf0c2Sdrahn 
117708daf0c2Sdrahn }
117808daf0c2Sdrahn 
117908daf0c2Sdrahn #ifdef FLOAT128
118008daf0c2Sdrahn 
time_a_floatx80_z_float128(float128 function (floatx80))118108daf0c2Sdrahn static void time_a_floatx80_z_float128( float128 function( floatx80 ) )
118208daf0c2Sdrahn {
118308daf0c2Sdrahn     clock_t startClock, endClock;
118408daf0c2Sdrahn     int32 count, i;
118508daf0c2Sdrahn     int8 inputNum;
118608daf0c2Sdrahn     floatx80 a;
118708daf0c2Sdrahn 
118808daf0c2Sdrahn     count = 0;
118908daf0c2Sdrahn     inputNum = 0;
119008daf0c2Sdrahn     startClock = clock();
119108daf0c2Sdrahn     do {
119208daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
119308daf0c2Sdrahn             a.low = inputs_floatx80[ inputNum ].low;
119408daf0c2Sdrahn             a.high = inputs_floatx80[ inputNum ].high;
119508daf0c2Sdrahn             function( a );
119608daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
119708daf0c2Sdrahn         }
119808daf0c2Sdrahn         count += minIterations;
119908daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
120008daf0c2Sdrahn     inputNum = 0;
120108daf0c2Sdrahn     startClock = clock();
120208daf0c2Sdrahn     for ( i = count; i; --i ) {
120308daf0c2Sdrahn         a.low = inputs_floatx80[ inputNum ].low;
120408daf0c2Sdrahn         a.high = inputs_floatx80[ inputNum ].high;
120508daf0c2Sdrahn         function( a );
120608daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
120708daf0c2Sdrahn     }
120808daf0c2Sdrahn     endClock = clock();
120908daf0c2Sdrahn     reportTime( count, endClock - startClock );
121008daf0c2Sdrahn 
121108daf0c2Sdrahn }
121208daf0c2Sdrahn 
121308daf0c2Sdrahn #endif
121408daf0c2Sdrahn 
time_az_floatx80(floatx80 function (floatx80))121508daf0c2Sdrahn static void time_az_floatx80( floatx80 function( floatx80 ) )
121608daf0c2Sdrahn {
121708daf0c2Sdrahn     clock_t startClock, endClock;
121808daf0c2Sdrahn     int32 count, i;
121908daf0c2Sdrahn     int8 inputNum;
122008daf0c2Sdrahn     floatx80 a;
122108daf0c2Sdrahn 
122208daf0c2Sdrahn     count = 0;
122308daf0c2Sdrahn     inputNum = 0;
122408daf0c2Sdrahn     startClock = clock();
122508daf0c2Sdrahn     do {
122608daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
122708daf0c2Sdrahn             a.low = inputs_floatx80[ inputNum ].low;
122808daf0c2Sdrahn             a.high = inputs_floatx80[ inputNum ].high;
122908daf0c2Sdrahn             function( a );
123008daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
123108daf0c2Sdrahn         }
123208daf0c2Sdrahn         count += minIterations;
123308daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
123408daf0c2Sdrahn     inputNum = 0;
123508daf0c2Sdrahn     startClock = clock();
123608daf0c2Sdrahn     for ( i = count; i; --i ) {
123708daf0c2Sdrahn         a.low = inputs_floatx80[ inputNum ].low;
123808daf0c2Sdrahn         a.high = inputs_floatx80[ inputNum ].high;
123908daf0c2Sdrahn         function( a );
124008daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
124108daf0c2Sdrahn     }
124208daf0c2Sdrahn     endClock = clock();
124308daf0c2Sdrahn     reportTime( count, endClock - startClock );
124408daf0c2Sdrahn 
124508daf0c2Sdrahn }
124608daf0c2Sdrahn 
time_ab_floatx80_z_flag(flag function (floatx80,floatx80))124708daf0c2Sdrahn static void time_ab_floatx80_z_flag( flag function( floatx80, floatx80 ) )
124808daf0c2Sdrahn {
124908daf0c2Sdrahn     clock_t startClock, endClock;
125008daf0c2Sdrahn     int32 count, i;
125108daf0c2Sdrahn     int8 inputNumA, inputNumB;
125208daf0c2Sdrahn     floatx80 a, b;
125308daf0c2Sdrahn 
125408daf0c2Sdrahn     count = 0;
125508daf0c2Sdrahn     inputNumA = 0;
125608daf0c2Sdrahn     inputNumB = 0;
125708daf0c2Sdrahn     startClock = clock();
125808daf0c2Sdrahn     do {
125908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
126008daf0c2Sdrahn             a.low = inputs_floatx80[ inputNumA ].low;
126108daf0c2Sdrahn             a.high = inputs_floatx80[ inputNumA ].high;
126208daf0c2Sdrahn             b.low = inputs_floatx80[ inputNumB ].low;
126308daf0c2Sdrahn             b.high = inputs_floatx80[ inputNumB ].high;
126408daf0c2Sdrahn             function( a, b );
126508daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
126608daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
126708daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
126808daf0c2Sdrahn         }
126908daf0c2Sdrahn         count += minIterations;
127008daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
127108daf0c2Sdrahn     inputNumA = 0;
127208daf0c2Sdrahn     inputNumB = 0;
127308daf0c2Sdrahn     startClock = clock();
127408daf0c2Sdrahn     for ( i = count; i; --i ) {
127508daf0c2Sdrahn         a.low = inputs_floatx80[ inputNumA ].low;
127608daf0c2Sdrahn         a.high = inputs_floatx80[ inputNumA ].high;
127708daf0c2Sdrahn         b.low = inputs_floatx80[ inputNumB ].low;
127808daf0c2Sdrahn         b.high = inputs_floatx80[ inputNumB ].high;
127908daf0c2Sdrahn         function( a, b );
128008daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
128108daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
128208daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
128308daf0c2Sdrahn     }
128408daf0c2Sdrahn     endClock = clock();
128508daf0c2Sdrahn     reportTime( count, endClock - startClock );
128608daf0c2Sdrahn 
128708daf0c2Sdrahn }
128808daf0c2Sdrahn 
time_abz_floatx80(floatx80 function (floatx80,floatx80))128908daf0c2Sdrahn static void time_abz_floatx80( floatx80 function( floatx80, floatx80 ) )
129008daf0c2Sdrahn {
129108daf0c2Sdrahn     clock_t startClock, endClock;
129208daf0c2Sdrahn     int32 count, i;
129308daf0c2Sdrahn     int8 inputNumA, inputNumB;
129408daf0c2Sdrahn     floatx80 a, b;
129508daf0c2Sdrahn 
129608daf0c2Sdrahn     count = 0;
129708daf0c2Sdrahn     inputNumA = 0;
129808daf0c2Sdrahn     inputNumB = 0;
129908daf0c2Sdrahn     startClock = clock();
130008daf0c2Sdrahn     do {
130108daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
130208daf0c2Sdrahn             a.low = inputs_floatx80[ inputNumA ].low;
130308daf0c2Sdrahn             a.high = inputs_floatx80[ inputNumA ].high;
130408daf0c2Sdrahn             b.low = inputs_floatx80[ inputNumB ].low;
130508daf0c2Sdrahn             b.high = inputs_floatx80[ inputNumB ].high;
130608daf0c2Sdrahn             function( a, b );
130708daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
130808daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
130908daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
131008daf0c2Sdrahn         }
131108daf0c2Sdrahn         count += minIterations;
131208daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
131308daf0c2Sdrahn     inputNumA = 0;
131408daf0c2Sdrahn     inputNumB = 0;
131508daf0c2Sdrahn     startClock = clock();
131608daf0c2Sdrahn     for ( i = count; i; --i ) {
131708daf0c2Sdrahn         a.low = inputs_floatx80[ inputNumA ].low;
131808daf0c2Sdrahn         a.high = inputs_floatx80[ inputNumA ].high;
131908daf0c2Sdrahn         b.low = inputs_floatx80[ inputNumB ].low;
132008daf0c2Sdrahn         b.high = inputs_floatx80[ inputNumB ].high;
132108daf0c2Sdrahn         function( a, b );
132208daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
132308daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
132408daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
132508daf0c2Sdrahn     }
132608daf0c2Sdrahn     endClock = clock();
132708daf0c2Sdrahn     reportTime( count, endClock - startClock );
132808daf0c2Sdrahn 
132908daf0c2Sdrahn }
133008daf0c2Sdrahn 
133108daf0c2Sdrahn static const struct {
133208daf0c2Sdrahn     bits16 high;
133308daf0c2Sdrahn     bits64 low;
133408daf0c2Sdrahn } inputs_floatx80_pos[ numInputs_floatx80 ] = {
133508daf0c2Sdrahn     { 0x403F, LIT64( 0xA9BE15A19C1E8B62 ) },
133608daf0c2Sdrahn     { 0x0000, LIT64( 0x0000000000000000 ) },
133708daf0c2Sdrahn     { 0x75A8, LIT64( 0xE59591E4788957A5 ) },
133808daf0c2Sdrahn     { 0x3FFF, LIT64( 0xFFF0000000000040 ) },
133908daf0c2Sdrahn     { 0x0CD8, LIT64( 0xFC000000000007FE ) },
134008daf0c2Sdrahn     { 0x43BA, LIT64( 0x99A4000000000000 ) },
134108daf0c2Sdrahn     { 0x3FFF, LIT64( 0x8000000000000000 ) },
134208daf0c2Sdrahn     { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) },
134308daf0c2Sdrahn     { 0x403E, LIT64( 0xFFF0000000002000 ) },
134408daf0c2Sdrahn     { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) },
134508daf0c2Sdrahn     { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) },
134608daf0c2Sdrahn     { 0x737A, LIT64( 0x800000007FFDFFFE ) },
134708daf0c2Sdrahn     { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) },
134808daf0c2Sdrahn     { 0x3BFE, LIT64( 0x8000040000001FFE ) },
134908daf0c2Sdrahn     { 0x4002, LIT64( 0xFF80000000000020 ) },
135008daf0c2Sdrahn     { 0x5E8D, LIT64( 0xFFFFFFFFFFE00004 ) },
135108daf0c2Sdrahn     { 0x4004, LIT64( 0x8000000000003FFB ) },
135208daf0c2Sdrahn     { 0x407F, LIT64( 0x800000000003FFFE ) },
135308daf0c2Sdrahn     { 0x4000, LIT64( 0xA459EE6A5C16CA55 ) },
135408daf0c2Sdrahn     { 0x0003, LIT64( 0xC42CBF7399AEEB94 ) },
135508daf0c2Sdrahn     { 0x3F7F, LIT64( 0xF800000000000006 ) },
135608daf0c2Sdrahn     { 0x407F, LIT64( 0xBF56BE8871F28FEA ) },
135708daf0c2Sdrahn     { 0x407E, LIT64( 0xFFFF77FFFFFFFFFE ) },
135808daf0c2Sdrahn     { 0x2DC9, LIT64( 0x8000000FFFFFFFDE ) },
135908daf0c2Sdrahn     { 0x4001, LIT64( 0xEFF7FFFFFFFFFFFF ) },
136008daf0c2Sdrahn     { 0x4001, LIT64( 0xBE84F30125C497A6 ) },
136108daf0c2Sdrahn     { 0x406B, LIT64( 0xEFFFFFFFFFFFFFFF ) },
136208daf0c2Sdrahn     { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) },
136308daf0c2Sdrahn     { 0x07E9, LIT64( 0x81FFFFFFFFFFFBFF ) },
136408daf0c2Sdrahn     { 0x263F, LIT64( 0x801FFFFFFEFFFFFE ) },
136508daf0c2Sdrahn     { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) },
136608daf0c2Sdrahn     { 0x4018, LIT64( 0x8000000000080003 ) }
136708daf0c2Sdrahn };
136808daf0c2Sdrahn 
time_az_floatx80_pos(floatx80 function (floatx80))136908daf0c2Sdrahn static void time_az_floatx80_pos( floatx80 function( floatx80 ) )
137008daf0c2Sdrahn {
137108daf0c2Sdrahn     clock_t startClock, endClock;
137208daf0c2Sdrahn     int32 count, i;
137308daf0c2Sdrahn     int8 inputNum;
137408daf0c2Sdrahn     floatx80 a;
137508daf0c2Sdrahn 
137608daf0c2Sdrahn     count = 0;
137708daf0c2Sdrahn     inputNum = 0;
137808daf0c2Sdrahn     startClock = clock();
137908daf0c2Sdrahn     do {
138008daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
138108daf0c2Sdrahn             a.low = inputs_floatx80_pos[ inputNum ].low;
138208daf0c2Sdrahn             a.high = inputs_floatx80_pos[ inputNum ].high;
138308daf0c2Sdrahn             function( a );
138408daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
138508daf0c2Sdrahn         }
138608daf0c2Sdrahn         count += minIterations;
138708daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
138808daf0c2Sdrahn     inputNum = 0;
138908daf0c2Sdrahn     startClock = clock();
139008daf0c2Sdrahn     for ( i = count; i; --i ) {
139108daf0c2Sdrahn         a.low = inputs_floatx80_pos[ inputNum ].low;
139208daf0c2Sdrahn         a.high = inputs_floatx80_pos[ inputNum ].high;
139308daf0c2Sdrahn         function( a );
139408daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
139508daf0c2Sdrahn     }
139608daf0c2Sdrahn     endClock = clock();
139708daf0c2Sdrahn     reportTime( count, endClock - startClock );
139808daf0c2Sdrahn 
139908daf0c2Sdrahn }
140008daf0c2Sdrahn 
140108daf0c2Sdrahn #endif
140208daf0c2Sdrahn 
140308daf0c2Sdrahn #ifdef FLOAT128
140408daf0c2Sdrahn 
140508daf0c2Sdrahn enum {
140608daf0c2Sdrahn     numInputs_float128 = 32
140708daf0c2Sdrahn };
140808daf0c2Sdrahn 
140908daf0c2Sdrahn static const struct {
141008daf0c2Sdrahn     bits64 high, low;
141108daf0c2Sdrahn } inputs_float128[ numInputs_float128 ] = {
141208daf0c2Sdrahn     { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) },
141308daf0c2Sdrahn     { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) },
141408daf0c2Sdrahn     { LIT64( 0x85F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) },
141508daf0c2Sdrahn     { LIT64( 0xF2B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) },
141608daf0c2Sdrahn     { LIT64( 0x8000000000000000 ), LIT64( 0x0000000000000000 ) },
141708daf0c2Sdrahn     { LIT64( 0xBFFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) },
141808daf0c2Sdrahn     { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) },
141908daf0c2Sdrahn     { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) },
142008daf0c2Sdrahn     { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) },
142108daf0c2Sdrahn     { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) },
142208daf0c2Sdrahn     { LIT64( 0xBF7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) },
142308daf0c2Sdrahn     { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) },
142408daf0c2Sdrahn     { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) },
142508daf0c2Sdrahn     { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) },
142608daf0c2Sdrahn     { LIT64( 0xBFFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) },
142708daf0c2Sdrahn     { LIT64( 0xBDB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) },
142808daf0c2Sdrahn     { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) },
142908daf0c2Sdrahn     { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) },
143008daf0c2Sdrahn     { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) },
143108daf0c2Sdrahn     { LIT64( 0x8001000000000000 ), LIT64( 0x0000001000000001 ) },
143208daf0c2Sdrahn     { LIT64( 0xC036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) },
143308daf0c2Sdrahn     { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) },
143408daf0c2Sdrahn     { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) },
143508daf0c2Sdrahn     { LIT64( 0xBFFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) },
143608daf0c2Sdrahn     { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) },
143708daf0c2Sdrahn     { LIT64( 0xB5CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) },
143808daf0c2Sdrahn     { LIT64( 0xE228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) },
143908daf0c2Sdrahn     { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) },
144008daf0c2Sdrahn     { LIT64( 0xC1AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) },
144108daf0c2Sdrahn     { LIT64( 0xC96F000000000000 ), LIT64( 0x00000001FFFBFFFF ) },
144208daf0c2Sdrahn     { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) },
144308daf0c2Sdrahn     { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) }
144408daf0c2Sdrahn };
144508daf0c2Sdrahn 
time_a_float128_z_int32(int32 function (float128))144608daf0c2Sdrahn static void time_a_float128_z_int32( int32 function( float128 ) )
144708daf0c2Sdrahn {
144808daf0c2Sdrahn     clock_t startClock, endClock;
144908daf0c2Sdrahn     int32 count, i;
145008daf0c2Sdrahn     int8 inputNum;
145108daf0c2Sdrahn     float128 a;
145208daf0c2Sdrahn 
145308daf0c2Sdrahn     count = 0;
145408daf0c2Sdrahn     inputNum = 0;
145508daf0c2Sdrahn     startClock = clock();
145608daf0c2Sdrahn     do {
145708daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
145808daf0c2Sdrahn             a.low = inputs_float128[ inputNum ].low;
145908daf0c2Sdrahn             a.high = inputs_float128[ inputNum ].high;
146008daf0c2Sdrahn             function( a );
146108daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
146208daf0c2Sdrahn         }
146308daf0c2Sdrahn         count += minIterations;
146408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
146508daf0c2Sdrahn     inputNum = 0;
146608daf0c2Sdrahn     startClock = clock();
146708daf0c2Sdrahn     for ( i = count; i; --i ) {
146808daf0c2Sdrahn         a.low = inputs_float128[ inputNum ].low;
146908daf0c2Sdrahn         a.high = inputs_float128[ inputNum ].high;
147008daf0c2Sdrahn         function( a );
147108daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
147208daf0c2Sdrahn     }
147308daf0c2Sdrahn     endClock = clock();
147408daf0c2Sdrahn     reportTime( count, endClock - startClock );
147508daf0c2Sdrahn 
147608daf0c2Sdrahn }
147708daf0c2Sdrahn 
time_a_float128_z_int64(int64 function (float128))147808daf0c2Sdrahn static void time_a_float128_z_int64( int64 function( float128 ) )
147908daf0c2Sdrahn {
148008daf0c2Sdrahn     clock_t startClock, endClock;
148108daf0c2Sdrahn     int32 count, i;
148208daf0c2Sdrahn     int8 inputNum;
148308daf0c2Sdrahn     float128 a;
148408daf0c2Sdrahn 
148508daf0c2Sdrahn     count = 0;
148608daf0c2Sdrahn     inputNum = 0;
148708daf0c2Sdrahn     startClock = clock();
148808daf0c2Sdrahn     do {
148908daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
149008daf0c2Sdrahn             a.low = inputs_float128[ inputNum ].low;
149108daf0c2Sdrahn             a.high = inputs_float128[ inputNum ].high;
149208daf0c2Sdrahn             function( a );
149308daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
149408daf0c2Sdrahn         }
149508daf0c2Sdrahn         count += minIterations;
149608daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
149708daf0c2Sdrahn     inputNum = 0;
149808daf0c2Sdrahn     startClock = clock();
149908daf0c2Sdrahn     for ( i = count; i; --i ) {
150008daf0c2Sdrahn         a.low = inputs_float128[ inputNum ].low;
150108daf0c2Sdrahn         a.high = inputs_float128[ inputNum ].high;
150208daf0c2Sdrahn         function( a );
150308daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
150408daf0c2Sdrahn     }
150508daf0c2Sdrahn     endClock = clock();
150608daf0c2Sdrahn     reportTime( count, endClock - startClock );
150708daf0c2Sdrahn 
150808daf0c2Sdrahn }
150908daf0c2Sdrahn 
time_a_float128_z_float32(float32 function (float128))151008daf0c2Sdrahn static void time_a_float128_z_float32( float32 function( float128 ) )
151108daf0c2Sdrahn {
151208daf0c2Sdrahn     clock_t startClock, endClock;
151308daf0c2Sdrahn     int32 count, i;
151408daf0c2Sdrahn     int8 inputNum;
151508daf0c2Sdrahn     float128 a;
151608daf0c2Sdrahn 
151708daf0c2Sdrahn     count = 0;
151808daf0c2Sdrahn     inputNum = 0;
151908daf0c2Sdrahn     startClock = clock();
152008daf0c2Sdrahn     do {
152108daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
152208daf0c2Sdrahn             a.low = inputs_float128[ inputNum ].low;
152308daf0c2Sdrahn             a.high = inputs_float128[ inputNum ].high;
152408daf0c2Sdrahn             function( a );
152508daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
152608daf0c2Sdrahn         }
152708daf0c2Sdrahn         count += minIterations;
152808daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
152908daf0c2Sdrahn     inputNum = 0;
153008daf0c2Sdrahn     startClock = clock();
153108daf0c2Sdrahn     for ( i = count; i; --i ) {
153208daf0c2Sdrahn         a.low = inputs_float128[ inputNum ].low;
153308daf0c2Sdrahn         a.high = inputs_float128[ inputNum ].high;
153408daf0c2Sdrahn         function( a );
153508daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
153608daf0c2Sdrahn     }
153708daf0c2Sdrahn     endClock = clock();
153808daf0c2Sdrahn     reportTime( count, endClock - startClock );
153908daf0c2Sdrahn 
154008daf0c2Sdrahn }
154108daf0c2Sdrahn 
time_a_float128_z_float64(float64 function (float128))154208daf0c2Sdrahn static void time_a_float128_z_float64( float64 function( float128 ) )
154308daf0c2Sdrahn {
154408daf0c2Sdrahn     clock_t startClock, endClock;
154508daf0c2Sdrahn     int32 count, i;
154608daf0c2Sdrahn     int8 inputNum;
154708daf0c2Sdrahn     float128 a;
154808daf0c2Sdrahn 
154908daf0c2Sdrahn     count = 0;
155008daf0c2Sdrahn     inputNum = 0;
155108daf0c2Sdrahn     startClock = clock();
155208daf0c2Sdrahn     do {
155308daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
155408daf0c2Sdrahn             a.low = inputs_float128[ inputNum ].low;
155508daf0c2Sdrahn             a.high = inputs_float128[ inputNum ].high;
155608daf0c2Sdrahn             function( a );
155708daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
155808daf0c2Sdrahn         }
155908daf0c2Sdrahn         count += minIterations;
156008daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
156108daf0c2Sdrahn     inputNum = 0;
156208daf0c2Sdrahn     startClock = clock();
156308daf0c2Sdrahn     for ( i = count; i; --i ) {
156408daf0c2Sdrahn         a.low = inputs_float128[ inputNum ].low;
156508daf0c2Sdrahn         a.high = inputs_float128[ inputNum ].high;
156608daf0c2Sdrahn         function( a );
156708daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
156808daf0c2Sdrahn     }
156908daf0c2Sdrahn     endClock = clock();
157008daf0c2Sdrahn     reportTime( count, endClock - startClock );
157108daf0c2Sdrahn 
157208daf0c2Sdrahn }
157308daf0c2Sdrahn 
157408daf0c2Sdrahn #ifdef FLOATX80
157508daf0c2Sdrahn 
time_a_float128_z_floatx80(floatx80 function (float128))157608daf0c2Sdrahn static void time_a_float128_z_floatx80( floatx80 function( float128 ) )
157708daf0c2Sdrahn {
157808daf0c2Sdrahn     clock_t startClock, endClock;
157908daf0c2Sdrahn     int32 count, i;
158008daf0c2Sdrahn     int8 inputNum;
158108daf0c2Sdrahn     float128 a;
158208daf0c2Sdrahn 
158308daf0c2Sdrahn     count = 0;
158408daf0c2Sdrahn     inputNum = 0;
158508daf0c2Sdrahn     startClock = clock();
158608daf0c2Sdrahn     do {
158708daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
158808daf0c2Sdrahn             a.low = inputs_float128[ inputNum ].low;
158908daf0c2Sdrahn             a.high = inputs_float128[ inputNum ].high;
159008daf0c2Sdrahn             function( a );
159108daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
159208daf0c2Sdrahn         }
159308daf0c2Sdrahn         count += minIterations;
159408daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
159508daf0c2Sdrahn     inputNum = 0;
159608daf0c2Sdrahn     startClock = clock();
159708daf0c2Sdrahn     for ( i = count; i; --i ) {
159808daf0c2Sdrahn         a.low = inputs_float128[ inputNum ].low;
159908daf0c2Sdrahn         a.high = inputs_float128[ inputNum ].high;
160008daf0c2Sdrahn         function( a );
160108daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
160208daf0c2Sdrahn     }
160308daf0c2Sdrahn     endClock = clock();
160408daf0c2Sdrahn     reportTime( count, endClock - startClock );
160508daf0c2Sdrahn 
160608daf0c2Sdrahn }
160708daf0c2Sdrahn 
160808daf0c2Sdrahn #endif
160908daf0c2Sdrahn 
time_az_float128(float128 function (float128))161008daf0c2Sdrahn static void time_az_float128( float128 function( float128 ) )
161108daf0c2Sdrahn {
161208daf0c2Sdrahn     clock_t startClock, endClock;
161308daf0c2Sdrahn     int32 count, i;
161408daf0c2Sdrahn     int8 inputNum;
161508daf0c2Sdrahn     float128 a;
161608daf0c2Sdrahn 
161708daf0c2Sdrahn     count = 0;
161808daf0c2Sdrahn     inputNum = 0;
161908daf0c2Sdrahn     startClock = clock();
162008daf0c2Sdrahn     do {
162108daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
162208daf0c2Sdrahn             a.low = inputs_float128[ inputNum ].low;
162308daf0c2Sdrahn             a.high = inputs_float128[ inputNum ].high;
162408daf0c2Sdrahn             function( a );
162508daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
162608daf0c2Sdrahn         }
162708daf0c2Sdrahn         count += minIterations;
162808daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
162908daf0c2Sdrahn     inputNum = 0;
163008daf0c2Sdrahn     startClock = clock();
163108daf0c2Sdrahn     for ( i = count; i; --i ) {
163208daf0c2Sdrahn         a.low = inputs_float128[ inputNum ].low;
163308daf0c2Sdrahn         a.high = inputs_float128[ inputNum ].high;
163408daf0c2Sdrahn         function( a );
163508daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
163608daf0c2Sdrahn     }
163708daf0c2Sdrahn     endClock = clock();
163808daf0c2Sdrahn     reportTime( count, endClock - startClock );
163908daf0c2Sdrahn 
164008daf0c2Sdrahn }
164108daf0c2Sdrahn 
time_ab_float128_z_flag(flag function (float128,float128))164208daf0c2Sdrahn static void time_ab_float128_z_flag( flag function( float128, float128 ) )
164308daf0c2Sdrahn {
164408daf0c2Sdrahn     clock_t startClock, endClock;
164508daf0c2Sdrahn     int32 count, i;
164608daf0c2Sdrahn     int8 inputNumA, inputNumB;
164708daf0c2Sdrahn     float128 a, b;
164808daf0c2Sdrahn 
164908daf0c2Sdrahn     count = 0;
165008daf0c2Sdrahn     inputNumA = 0;
165108daf0c2Sdrahn     inputNumB = 0;
165208daf0c2Sdrahn     startClock = clock();
165308daf0c2Sdrahn     do {
165408daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
165508daf0c2Sdrahn             a.low = inputs_float128[ inputNumA ].low;
165608daf0c2Sdrahn             a.high = inputs_float128[ inputNumA ].high;
165708daf0c2Sdrahn             b.low = inputs_float128[ inputNumB ].low;
165808daf0c2Sdrahn             b.high = inputs_float128[ inputNumB ].high;
165908daf0c2Sdrahn             function( a, b );
166008daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
166108daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
166208daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
166308daf0c2Sdrahn         }
166408daf0c2Sdrahn         count += minIterations;
166508daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
166608daf0c2Sdrahn     inputNumA = 0;
166708daf0c2Sdrahn     inputNumB = 0;
166808daf0c2Sdrahn     startClock = clock();
166908daf0c2Sdrahn     for ( i = count; i; --i ) {
167008daf0c2Sdrahn         a.low = inputs_float128[ inputNumA ].low;
167108daf0c2Sdrahn         a.high = inputs_float128[ inputNumA ].high;
167208daf0c2Sdrahn         b.low = inputs_float128[ inputNumB ].low;
167308daf0c2Sdrahn         b.high = inputs_float128[ inputNumB ].high;
167408daf0c2Sdrahn         function( a, b );
167508daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
167608daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
167708daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
167808daf0c2Sdrahn     }
167908daf0c2Sdrahn     endClock = clock();
168008daf0c2Sdrahn     reportTime( count, endClock - startClock );
168108daf0c2Sdrahn 
168208daf0c2Sdrahn }
168308daf0c2Sdrahn 
time_abz_float128(float128 function (float128,float128))168408daf0c2Sdrahn static void time_abz_float128( float128 function( float128, float128 ) )
168508daf0c2Sdrahn {
168608daf0c2Sdrahn     clock_t startClock, endClock;
168708daf0c2Sdrahn     int32 count, i;
168808daf0c2Sdrahn     int8 inputNumA, inputNumB;
168908daf0c2Sdrahn     float128 a, b;
169008daf0c2Sdrahn 
169108daf0c2Sdrahn     count = 0;
169208daf0c2Sdrahn     inputNumA = 0;
169308daf0c2Sdrahn     inputNumB = 0;
169408daf0c2Sdrahn     startClock = clock();
169508daf0c2Sdrahn     do {
169608daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
169708daf0c2Sdrahn             a.low = inputs_float128[ inputNumA ].low;
169808daf0c2Sdrahn             a.high = inputs_float128[ inputNumA ].high;
169908daf0c2Sdrahn             b.low = inputs_float128[ inputNumB ].low;
170008daf0c2Sdrahn             b.high = inputs_float128[ inputNumB ].high;
170108daf0c2Sdrahn             function( a, b );
170208daf0c2Sdrahn             inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
170308daf0c2Sdrahn             if ( inputNumA == 0 ) ++inputNumB;
170408daf0c2Sdrahn             inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
170508daf0c2Sdrahn         }
170608daf0c2Sdrahn         count += minIterations;
170708daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
170808daf0c2Sdrahn     inputNumA = 0;
170908daf0c2Sdrahn     inputNumB = 0;
171008daf0c2Sdrahn     startClock = clock();
171108daf0c2Sdrahn     for ( i = count; i; --i ) {
171208daf0c2Sdrahn         a.low = inputs_float128[ inputNumA ].low;
171308daf0c2Sdrahn         a.high = inputs_float128[ inputNumA ].high;
171408daf0c2Sdrahn         b.low = inputs_float128[ inputNumB ].low;
171508daf0c2Sdrahn         b.high = inputs_float128[ inputNumB ].high;
171608daf0c2Sdrahn         function( a, b );
171708daf0c2Sdrahn         inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
171808daf0c2Sdrahn         if ( inputNumA == 0 ) ++inputNumB;
171908daf0c2Sdrahn         inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
172008daf0c2Sdrahn     }
172108daf0c2Sdrahn     endClock = clock();
172208daf0c2Sdrahn     reportTime( count, endClock - startClock );
172308daf0c2Sdrahn 
172408daf0c2Sdrahn }
172508daf0c2Sdrahn 
172608daf0c2Sdrahn static const struct {
172708daf0c2Sdrahn     bits64 high, low;
172808daf0c2Sdrahn } inputs_float128_pos[ numInputs_float128 ] = {
172908daf0c2Sdrahn     { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) },
173008daf0c2Sdrahn     { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) },
173108daf0c2Sdrahn     { LIT64( 0x05F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) },
173208daf0c2Sdrahn     { LIT64( 0x72B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) },
173308daf0c2Sdrahn     { LIT64( 0x0000000000000000 ), LIT64( 0x0000000000000000 ) },
173408daf0c2Sdrahn     { LIT64( 0x3FFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) },
173508daf0c2Sdrahn     { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) },
173608daf0c2Sdrahn     { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) },
173708daf0c2Sdrahn     { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) },
173808daf0c2Sdrahn     { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) },
173908daf0c2Sdrahn     { LIT64( 0x3F7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) },
174008daf0c2Sdrahn     { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) },
174108daf0c2Sdrahn     { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) },
174208daf0c2Sdrahn     { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) },
174308daf0c2Sdrahn     { LIT64( 0x3FFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) },
174408daf0c2Sdrahn     { LIT64( 0x3DB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) },
174508daf0c2Sdrahn     { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) },
174608daf0c2Sdrahn     { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) },
174708daf0c2Sdrahn     { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) },
174808daf0c2Sdrahn     { LIT64( 0x0001000000000000 ), LIT64( 0x0000001000000001 ) },
174908daf0c2Sdrahn     { LIT64( 0x4036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) },
175008daf0c2Sdrahn     { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) },
175108daf0c2Sdrahn     { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) },
175208daf0c2Sdrahn     { LIT64( 0x3FFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) },
175308daf0c2Sdrahn     { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) },
175408daf0c2Sdrahn     { LIT64( 0x35CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) },
175508daf0c2Sdrahn     { LIT64( 0x6228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) },
175608daf0c2Sdrahn     { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) },
175708daf0c2Sdrahn     { LIT64( 0x41AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) },
175808daf0c2Sdrahn     { LIT64( 0x496F000000000000 ), LIT64( 0x00000001FFFBFFFF ) },
175908daf0c2Sdrahn     { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) },
176008daf0c2Sdrahn     { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) }
176108daf0c2Sdrahn };
176208daf0c2Sdrahn 
time_az_float128_pos(float128 function (float128))176308daf0c2Sdrahn static void time_az_float128_pos( float128 function( float128 ) )
176408daf0c2Sdrahn {
176508daf0c2Sdrahn     clock_t startClock, endClock;
176608daf0c2Sdrahn     int32 count, i;
176708daf0c2Sdrahn     int8 inputNum;
176808daf0c2Sdrahn     float128 a;
176908daf0c2Sdrahn 
177008daf0c2Sdrahn     count = 0;
177108daf0c2Sdrahn     inputNum = 0;
177208daf0c2Sdrahn     startClock = clock();
177308daf0c2Sdrahn     do {
177408daf0c2Sdrahn         for ( i = minIterations; i; --i ) {
177508daf0c2Sdrahn             a.low = inputs_float128_pos[ inputNum ].low;
177608daf0c2Sdrahn             a.high = inputs_float128_pos[ inputNum ].high;
177708daf0c2Sdrahn             function( a );
177808daf0c2Sdrahn             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
177908daf0c2Sdrahn         }
178008daf0c2Sdrahn         count += minIterations;
178108daf0c2Sdrahn     } while ( clock() - startClock < CLOCKS_PER_SEC );
178208daf0c2Sdrahn     inputNum = 0;
178308daf0c2Sdrahn     startClock = clock();
178408daf0c2Sdrahn     for ( i = count; i; --i ) {
178508daf0c2Sdrahn         a.low = inputs_float128_pos[ inputNum ].low;
178608daf0c2Sdrahn         a.high = inputs_float128_pos[ inputNum ].high;
178708daf0c2Sdrahn         function( a );
178808daf0c2Sdrahn         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
178908daf0c2Sdrahn     }
179008daf0c2Sdrahn     endClock = clock();
179108daf0c2Sdrahn     reportTime( count, endClock - startClock );
179208daf0c2Sdrahn 
179308daf0c2Sdrahn }
179408daf0c2Sdrahn 
179508daf0c2Sdrahn #endif
179608daf0c2Sdrahn 
179708daf0c2Sdrahn enum {
179808daf0c2Sdrahn     INT32_TO_FLOAT32 = 1,
179908daf0c2Sdrahn     INT32_TO_FLOAT64,
180008daf0c2Sdrahn #ifdef FLOATX80
180108daf0c2Sdrahn     INT32_TO_FLOATX80,
180208daf0c2Sdrahn #endif
180308daf0c2Sdrahn #ifdef FLOAT128
180408daf0c2Sdrahn     INT32_TO_FLOAT128,
180508daf0c2Sdrahn #endif
180608daf0c2Sdrahn     INT64_TO_FLOAT32,
180708daf0c2Sdrahn     INT64_TO_FLOAT64,
180808daf0c2Sdrahn #ifdef FLOATX80
180908daf0c2Sdrahn     INT64_TO_FLOATX80,
181008daf0c2Sdrahn #endif
181108daf0c2Sdrahn #ifdef FLOAT128
181208daf0c2Sdrahn     INT64_TO_FLOAT128,
181308daf0c2Sdrahn #endif
181408daf0c2Sdrahn     FLOAT32_TO_INT32,
181508daf0c2Sdrahn     FLOAT32_TO_INT32_ROUND_TO_ZERO,
181608daf0c2Sdrahn     FLOAT32_TO_INT64,
181708daf0c2Sdrahn     FLOAT32_TO_INT64_ROUND_TO_ZERO,
181808daf0c2Sdrahn     FLOAT32_TO_FLOAT64,
181908daf0c2Sdrahn #ifdef FLOATX80
182008daf0c2Sdrahn     FLOAT32_TO_FLOATX80,
182108daf0c2Sdrahn #endif
182208daf0c2Sdrahn #ifdef FLOAT128
182308daf0c2Sdrahn     FLOAT32_TO_FLOAT128,
182408daf0c2Sdrahn #endif
182508daf0c2Sdrahn     FLOAT32_ROUND_TO_INT,
182608daf0c2Sdrahn     FLOAT32_ADD,
182708daf0c2Sdrahn     FLOAT32_SUB,
182808daf0c2Sdrahn     FLOAT32_MUL,
182908daf0c2Sdrahn     FLOAT32_DIV,
183008daf0c2Sdrahn     FLOAT32_REM,
183108daf0c2Sdrahn     FLOAT32_SQRT,
183208daf0c2Sdrahn     FLOAT32_EQ,
183308daf0c2Sdrahn     FLOAT32_LE,
183408daf0c2Sdrahn     FLOAT32_LT,
183508daf0c2Sdrahn     FLOAT32_EQ_SIGNALING,
183608daf0c2Sdrahn     FLOAT32_LE_QUIET,
183708daf0c2Sdrahn     FLOAT32_LT_QUIET,
183808daf0c2Sdrahn     FLOAT64_TO_INT32,
183908daf0c2Sdrahn     FLOAT64_TO_INT32_ROUND_TO_ZERO,
184008daf0c2Sdrahn     FLOAT64_TO_INT64,
184108daf0c2Sdrahn     FLOAT64_TO_INT64_ROUND_TO_ZERO,
184208daf0c2Sdrahn     FLOAT64_TO_FLOAT32,
184308daf0c2Sdrahn #ifdef FLOATX80
184408daf0c2Sdrahn     FLOAT64_TO_FLOATX80,
184508daf0c2Sdrahn #endif
184608daf0c2Sdrahn #ifdef FLOAT128
184708daf0c2Sdrahn     FLOAT64_TO_FLOAT128,
184808daf0c2Sdrahn #endif
184908daf0c2Sdrahn     FLOAT64_ROUND_TO_INT,
185008daf0c2Sdrahn     FLOAT64_ADD,
185108daf0c2Sdrahn     FLOAT64_SUB,
185208daf0c2Sdrahn     FLOAT64_MUL,
185308daf0c2Sdrahn     FLOAT64_DIV,
185408daf0c2Sdrahn     FLOAT64_REM,
185508daf0c2Sdrahn     FLOAT64_SQRT,
185608daf0c2Sdrahn     FLOAT64_EQ,
185708daf0c2Sdrahn     FLOAT64_LE,
185808daf0c2Sdrahn     FLOAT64_LT,
185908daf0c2Sdrahn     FLOAT64_EQ_SIGNALING,
186008daf0c2Sdrahn     FLOAT64_LE_QUIET,
186108daf0c2Sdrahn     FLOAT64_LT_QUIET,
186208daf0c2Sdrahn #ifdef FLOATX80
186308daf0c2Sdrahn     FLOATX80_TO_INT32,
186408daf0c2Sdrahn     FLOATX80_TO_INT32_ROUND_TO_ZERO,
186508daf0c2Sdrahn     FLOATX80_TO_INT64,
186608daf0c2Sdrahn     FLOATX80_TO_INT64_ROUND_TO_ZERO,
186708daf0c2Sdrahn     FLOATX80_TO_FLOAT32,
186808daf0c2Sdrahn     FLOATX80_TO_FLOAT64,
186908daf0c2Sdrahn #ifdef FLOAT128
187008daf0c2Sdrahn     FLOATX80_TO_FLOAT128,
187108daf0c2Sdrahn #endif
187208daf0c2Sdrahn     FLOATX80_ROUND_TO_INT,
187308daf0c2Sdrahn     FLOATX80_ADD,
187408daf0c2Sdrahn     FLOATX80_SUB,
187508daf0c2Sdrahn     FLOATX80_MUL,
187608daf0c2Sdrahn     FLOATX80_DIV,
187708daf0c2Sdrahn     FLOATX80_REM,
187808daf0c2Sdrahn     FLOATX80_SQRT,
187908daf0c2Sdrahn     FLOATX80_EQ,
188008daf0c2Sdrahn     FLOATX80_LE,
188108daf0c2Sdrahn     FLOATX80_LT,
188208daf0c2Sdrahn     FLOATX80_EQ_SIGNALING,
188308daf0c2Sdrahn     FLOATX80_LE_QUIET,
188408daf0c2Sdrahn     FLOATX80_LT_QUIET,
188508daf0c2Sdrahn #endif
188608daf0c2Sdrahn #ifdef FLOAT128
188708daf0c2Sdrahn     FLOAT128_TO_INT32,
188808daf0c2Sdrahn     FLOAT128_TO_INT32_ROUND_TO_ZERO,
188908daf0c2Sdrahn     FLOAT128_TO_INT64,
189008daf0c2Sdrahn     FLOAT128_TO_INT64_ROUND_TO_ZERO,
189108daf0c2Sdrahn     FLOAT128_TO_FLOAT32,
189208daf0c2Sdrahn     FLOAT128_TO_FLOAT64,
189308daf0c2Sdrahn #ifdef FLOATX80
189408daf0c2Sdrahn     FLOAT128_TO_FLOATX80,
189508daf0c2Sdrahn #endif
189608daf0c2Sdrahn     FLOAT128_ROUND_TO_INT,
189708daf0c2Sdrahn     FLOAT128_ADD,
189808daf0c2Sdrahn     FLOAT128_SUB,
189908daf0c2Sdrahn     FLOAT128_MUL,
190008daf0c2Sdrahn     FLOAT128_DIV,
190108daf0c2Sdrahn     FLOAT128_REM,
190208daf0c2Sdrahn     FLOAT128_SQRT,
190308daf0c2Sdrahn     FLOAT128_EQ,
190408daf0c2Sdrahn     FLOAT128_LE,
190508daf0c2Sdrahn     FLOAT128_LT,
190608daf0c2Sdrahn     FLOAT128_EQ_SIGNALING,
190708daf0c2Sdrahn     FLOAT128_LE_QUIET,
190808daf0c2Sdrahn     FLOAT128_LT_QUIET,
190908daf0c2Sdrahn #endif
191008daf0c2Sdrahn     NUM_FUNCTIONS
191108daf0c2Sdrahn };
191208daf0c2Sdrahn 
191308daf0c2Sdrahn static struct {
191408daf0c2Sdrahn     char *name;
191508daf0c2Sdrahn     int8 numInputs;
191608daf0c2Sdrahn     flag roundingPrecision, roundingMode;
191708daf0c2Sdrahn     flag tininessMode, tininessModeAtReducedPrecision;
191808daf0c2Sdrahn } functions[ NUM_FUNCTIONS ] = {
191908daf0c2Sdrahn     { 0, 0, 0, 0, 0, 0 },
192008daf0c2Sdrahn     { "int32_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
192108daf0c2Sdrahn     { "int32_to_float64",                1, FALSE, FALSE, FALSE, FALSE },
192208daf0c2Sdrahn #ifdef FLOATX80
192308daf0c2Sdrahn     { "int32_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
192408daf0c2Sdrahn #endif
192508daf0c2Sdrahn #ifdef FLOAT128
192608daf0c2Sdrahn     { "int32_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
192708daf0c2Sdrahn #endif
192808daf0c2Sdrahn     { "int64_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
192908daf0c2Sdrahn     { "int64_to_float64",                1, FALSE, TRUE,  FALSE, FALSE },
193008daf0c2Sdrahn #ifdef FLOATX80
193108daf0c2Sdrahn     { "int64_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
193208daf0c2Sdrahn #endif
193308daf0c2Sdrahn #ifdef FLOAT128
193408daf0c2Sdrahn     { "int64_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
193508daf0c2Sdrahn #endif
193608daf0c2Sdrahn     { "float32_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
193708daf0c2Sdrahn     { "float32_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
193808daf0c2Sdrahn     { "float32_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
193908daf0c2Sdrahn     { "float32_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
194008daf0c2Sdrahn     { "float32_to_float64",              1, FALSE, FALSE, FALSE, FALSE },
194108daf0c2Sdrahn #ifdef FLOATX80
194208daf0c2Sdrahn     { "float32_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
194308daf0c2Sdrahn #endif
194408daf0c2Sdrahn #ifdef FLOAT128
194508daf0c2Sdrahn     { "float32_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
194608daf0c2Sdrahn #endif
194708daf0c2Sdrahn     { "float32_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
194808daf0c2Sdrahn     { "float32_add",                     2, FALSE, TRUE,  FALSE, FALSE },
194908daf0c2Sdrahn     { "float32_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
195008daf0c2Sdrahn     { "float32_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
195108daf0c2Sdrahn     { "float32_div",                     2, FALSE, TRUE,  FALSE, FALSE },
195208daf0c2Sdrahn     { "float32_rem",                     2, FALSE, FALSE, FALSE, FALSE },
195308daf0c2Sdrahn     { "float32_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
195408daf0c2Sdrahn     { "float32_eq",                      2, FALSE, FALSE, FALSE, FALSE },
195508daf0c2Sdrahn     { "float32_le",                      2, FALSE, FALSE, FALSE, FALSE },
195608daf0c2Sdrahn     { "float32_lt",                      2, FALSE, FALSE, FALSE, FALSE },
195708daf0c2Sdrahn     { "float32_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
195808daf0c2Sdrahn     { "float32_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
195908daf0c2Sdrahn     { "float32_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
196008daf0c2Sdrahn     { "float64_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
196108daf0c2Sdrahn     { "float64_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
196208daf0c2Sdrahn     { "float64_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
196308daf0c2Sdrahn     { "float64_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
196408daf0c2Sdrahn     { "float64_to_float32",              1, FALSE, TRUE,  TRUE,  FALSE },
196508daf0c2Sdrahn #ifdef FLOATX80
196608daf0c2Sdrahn     { "float64_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
196708daf0c2Sdrahn #endif
196808daf0c2Sdrahn #ifdef FLOAT128
196908daf0c2Sdrahn     { "float64_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
197008daf0c2Sdrahn #endif
197108daf0c2Sdrahn     { "float64_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
197208daf0c2Sdrahn     { "float64_add",                     2, FALSE, TRUE,  FALSE, FALSE },
197308daf0c2Sdrahn     { "float64_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
197408daf0c2Sdrahn     { "float64_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
197508daf0c2Sdrahn     { "float64_div",                     2, FALSE, TRUE,  FALSE, FALSE },
197608daf0c2Sdrahn     { "float64_rem",                     2, FALSE, FALSE, FALSE, FALSE },
197708daf0c2Sdrahn     { "float64_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
197808daf0c2Sdrahn     { "float64_eq",                      2, FALSE, FALSE, FALSE, FALSE },
197908daf0c2Sdrahn     { "float64_le",                      2, FALSE, FALSE, FALSE, FALSE },
198008daf0c2Sdrahn     { "float64_lt",                      2, FALSE, FALSE, FALSE, FALSE },
198108daf0c2Sdrahn     { "float64_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
198208daf0c2Sdrahn     { "float64_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
198308daf0c2Sdrahn     { "float64_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
198408daf0c2Sdrahn #ifdef FLOATX80
198508daf0c2Sdrahn     { "floatx80_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
198608daf0c2Sdrahn     { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
198708daf0c2Sdrahn     { "floatx80_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
198808daf0c2Sdrahn     { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
198908daf0c2Sdrahn     { "floatx80_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
199008daf0c2Sdrahn     { "floatx80_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
199108daf0c2Sdrahn #ifdef FLOAT128
199208daf0c2Sdrahn     { "floatx80_to_float128",            1, FALSE, FALSE, FALSE, FALSE },
199308daf0c2Sdrahn #endif
199408daf0c2Sdrahn     { "floatx80_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
199508daf0c2Sdrahn     { "floatx80_add",                    2, TRUE,  TRUE,  FALSE, TRUE  },
199608daf0c2Sdrahn     { "floatx80_sub",                    2, TRUE,  TRUE,  FALSE, TRUE  },
199708daf0c2Sdrahn     { "floatx80_mul",                    2, TRUE,  TRUE,  TRUE,  TRUE  },
199808daf0c2Sdrahn     { "floatx80_div",                    2, TRUE,  TRUE,  FALSE, TRUE  },
199908daf0c2Sdrahn     { "floatx80_rem",                    2, FALSE, FALSE, FALSE, FALSE },
200008daf0c2Sdrahn     { "floatx80_sqrt",                   1, TRUE,  TRUE,  FALSE, FALSE },
200108daf0c2Sdrahn     { "floatx80_eq",                     2, FALSE, FALSE, FALSE, FALSE },
200208daf0c2Sdrahn     { "floatx80_le",                     2, FALSE, FALSE, FALSE, FALSE },
200308daf0c2Sdrahn     { "floatx80_lt",                     2, FALSE, FALSE, FALSE, FALSE },
200408daf0c2Sdrahn     { "floatx80_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
200508daf0c2Sdrahn     { "floatx80_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
200608daf0c2Sdrahn     { "floatx80_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
200708daf0c2Sdrahn #endif
200808daf0c2Sdrahn #ifdef FLOAT128
200908daf0c2Sdrahn     { "float128_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
201008daf0c2Sdrahn     { "float128_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
201108daf0c2Sdrahn     { "float128_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
201208daf0c2Sdrahn     { "float128_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
201308daf0c2Sdrahn     { "float128_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
201408daf0c2Sdrahn     { "float128_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
201508daf0c2Sdrahn #ifdef FLOATX80
201608daf0c2Sdrahn     { "float128_to_floatx80",            1, FALSE, TRUE,  TRUE,  FALSE },
201708daf0c2Sdrahn #endif
201808daf0c2Sdrahn     { "float128_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
201908daf0c2Sdrahn     { "float128_add",                    2, FALSE, TRUE,  FALSE, FALSE },
202008daf0c2Sdrahn     { "float128_sub",                    2, FALSE, TRUE,  FALSE, FALSE },
202108daf0c2Sdrahn     { "float128_mul",                    2, FALSE, TRUE,  TRUE,  FALSE },
202208daf0c2Sdrahn     { "float128_div",                    2, FALSE, TRUE,  FALSE, FALSE },
202308daf0c2Sdrahn     { "float128_rem",                    2, FALSE, FALSE, FALSE, FALSE },
202408daf0c2Sdrahn     { "float128_sqrt",                   1, FALSE, TRUE,  FALSE, FALSE },
202508daf0c2Sdrahn     { "float128_eq",                     2, FALSE, FALSE, FALSE, FALSE },
202608daf0c2Sdrahn     { "float128_le",                     2, FALSE, FALSE, FALSE, FALSE },
202708daf0c2Sdrahn     { "float128_lt",                     2, FALSE, FALSE, FALSE, FALSE },
202808daf0c2Sdrahn     { "float128_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
202908daf0c2Sdrahn     { "float128_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
203008daf0c2Sdrahn     { "float128_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
203108daf0c2Sdrahn #endif
203208daf0c2Sdrahn };
203308daf0c2Sdrahn 
203408daf0c2Sdrahn enum {
203508daf0c2Sdrahn     ROUND_NEAREST_EVEN = 1,
203608daf0c2Sdrahn     ROUND_TO_ZERO,
203708daf0c2Sdrahn     ROUND_DOWN,
203808daf0c2Sdrahn     ROUND_UP,
203908daf0c2Sdrahn     NUM_ROUNDINGMODES
204008daf0c2Sdrahn };
204108daf0c2Sdrahn enum {
204208daf0c2Sdrahn     TININESS_BEFORE_ROUNDING = 1,
204308daf0c2Sdrahn     TININESS_AFTER_ROUNDING,
204408daf0c2Sdrahn     NUM_TININESSMODES
204508daf0c2Sdrahn };
204608daf0c2Sdrahn 
204708daf0c2Sdrahn static void
timeFunctionVariety(uint8 functionCode,int8 roundingPrecision,int8 roundingMode,int8 tininessMode)204808daf0c2Sdrahn  timeFunctionVariety(
204908daf0c2Sdrahn      uint8 functionCode,
205008daf0c2Sdrahn      int8 roundingPrecision,
205108daf0c2Sdrahn      int8 roundingMode,
205208daf0c2Sdrahn      int8 tininessMode
205308daf0c2Sdrahn  )
205408daf0c2Sdrahn {
205508daf0c2Sdrahn     uint8 roundingCode;
205608daf0c2Sdrahn     int8 tininessCode;
205708daf0c2Sdrahn 
205808daf0c2Sdrahn     functionName = functions[ functionCode ].name;
205908daf0c2Sdrahn     if ( roundingPrecision == 32 ) {
206008daf0c2Sdrahn         roundingPrecisionName = "32";
206108daf0c2Sdrahn     }
206208daf0c2Sdrahn     else if ( roundingPrecision == 64 ) {
206308daf0c2Sdrahn         roundingPrecisionName = "64";
206408daf0c2Sdrahn     }
206508daf0c2Sdrahn     else if ( roundingPrecision == 80 ) {
206608daf0c2Sdrahn         roundingPrecisionName = "80";
206708daf0c2Sdrahn     }
206808daf0c2Sdrahn     else {
206908daf0c2Sdrahn         roundingPrecisionName = 0;
207008daf0c2Sdrahn     }
207108daf0c2Sdrahn #ifdef FLOATX80
207208daf0c2Sdrahn     floatx80_rounding_precision = roundingPrecision;
207308daf0c2Sdrahn #endif
207408daf0c2Sdrahn     switch ( roundingMode ) {
207508daf0c2Sdrahn      case 0:
207608daf0c2Sdrahn         roundingModeName = 0;
207708daf0c2Sdrahn         roundingCode = float_round_nearest_even;
207808daf0c2Sdrahn         break;
207908daf0c2Sdrahn      case ROUND_NEAREST_EVEN:
208008daf0c2Sdrahn         roundingModeName = "nearest_even";
208108daf0c2Sdrahn         roundingCode = float_round_nearest_even;
208208daf0c2Sdrahn         break;
208308daf0c2Sdrahn      case ROUND_TO_ZERO:
208408daf0c2Sdrahn         roundingModeName = "to_zero";
208508daf0c2Sdrahn         roundingCode = float_round_to_zero;
208608daf0c2Sdrahn         break;
208708daf0c2Sdrahn      case ROUND_DOWN:
208808daf0c2Sdrahn         roundingModeName = "down";
208908daf0c2Sdrahn         roundingCode = float_round_down;
209008daf0c2Sdrahn         break;
209108daf0c2Sdrahn      case ROUND_UP:
209208daf0c2Sdrahn         roundingModeName = "up";
209308daf0c2Sdrahn         roundingCode = float_round_up;
209408daf0c2Sdrahn         break;
209508daf0c2Sdrahn     }
209608daf0c2Sdrahn     float_rounding_mode = roundingCode;
209708daf0c2Sdrahn     switch ( tininessMode ) {
209808daf0c2Sdrahn      case 0:
209908daf0c2Sdrahn         tininessModeName = 0;
210008daf0c2Sdrahn         tininessCode = float_tininess_after_rounding;
210108daf0c2Sdrahn         break;
210208daf0c2Sdrahn      case TININESS_BEFORE_ROUNDING:
210308daf0c2Sdrahn         tininessModeName = "before";
210408daf0c2Sdrahn         tininessCode = float_tininess_before_rounding;
210508daf0c2Sdrahn         break;
210608daf0c2Sdrahn      case TININESS_AFTER_ROUNDING:
210708daf0c2Sdrahn         tininessModeName = "after";
210808daf0c2Sdrahn         tininessCode = float_tininess_after_rounding;
210908daf0c2Sdrahn         break;
211008daf0c2Sdrahn     }
211108daf0c2Sdrahn     float_detect_tininess = tininessCode;
211208daf0c2Sdrahn     switch ( functionCode ) {
211308daf0c2Sdrahn      case INT32_TO_FLOAT32:
211408daf0c2Sdrahn         time_a_int32_z_float32( int32_to_float32 );
211508daf0c2Sdrahn         break;
211608daf0c2Sdrahn      case INT32_TO_FLOAT64:
211708daf0c2Sdrahn         time_a_int32_z_float64( int32_to_float64 );
211808daf0c2Sdrahn         break;
211908daf0c2Sdrahn #ifdef FLOATX80
212008daf0c2Sdrahn      case INT32_TO_FLOATX80:
212108daf0c2Sdrahn         time_a_int32_z_floatx80( int32_to_floatx80 );
212208daf0c2Sdrahn         break;
212308daf0c2Sdrahn #endif
212408daf0c2Sdrahn #ifdef FLOAT128
212508daf0c2Sdrahn      case INT32_TO_FLOAT128:
212608daf0c2Sdrahn         time_a_int32_z_float128( int32_to_float128 );
212708daf0c2Sdrahn         break;
212808daf0c2Sdrahn #endif
212908daf0c2Sdrahn      case INT64_TO_FLOAT32:
213008daf0c2Sdrahn         time_a_int64_z_float32( int64_to_float32 );
213108daf0c2Sdrahn         break;
213208daf0c2Sdrahn      case INT64_TO_FLOAT64:
213308daf0c2Sdrahn         time_a_int64_z_float64( int64_to_float64 );
213408daf0c2Sdrahn         break;
213508daf0c2Sdrahn #ifdef FLOATX80
213608daf0c2Sdrahn      case INT64_TO_FLOATX80:
213708daf0c2Sdrahn         time_a_int64_z_floatx80( int64_to_floatx80 );
213808daf0c2Sdrahn         break;
213908daf0c2Sdrahn #endif
214008daf0c2Sdrahn #ifdef FLOAT128
214108daf0c2Sdrahn      case INT64_TO_FLOAT128:
214208daf0c2Sdrahn         time_a_int64_z_float128( int64_to_float128 );
214308daf0c2Sdrahn         break;
214408daf0c2Sdrahn #endif
214508daf0c2Sdrahn      case FLOAT32_TO_INT32:
214608daf0c2Sdrahn         time_a_float32_z_int32( float32_to_int32 );
214708daf0c2Sdrahn         break;
214808daf0c2Sdrahn      case FLOAT32_TO_INT32_ROUND_TO_ZERO:
214908daf0c2Sdrahn         time_a_float32_z_int32( float32_to_int32_round_to_zero );
215008daf0c2Sdrahn         break;
215108daf0c2Sdrahn      case FLOAT32_TO_INT64:
215208daf0c2Sdrahn         time_a_float32_z_int64( float32_to_int64 );
215308daf0c2Sdrahn         break;
215408daf0c2Sdrahn      case FLOAT32_TO_INT64_ROUND_TO_ZERO:
215508daf0c2Sdrahn         time_a_float32_z_int64( float32_to_int64_round_to_zero );
215608daf0c2Sdrahn         break;
215708daf0c2Sdrahn      case FLOAT32_TO_FLOAT64:
215808daf0c2Sdrahn         time_a_float32_z_float64( float32_to_float64 );
215908daf0c2Sdrahn         break;
216008daf0c2Sdrahn #ifdef FLOATX80
216108daf0c2Sdrahn      case FLOAT32_TO_FLOATX80:
216208daf0c2Sdrahn         time_a_float32_z_floatx80( float32_to_floatx80 );
216308daf0c2Sdrahn         break;
216408daf0c2Sdrahn #endif
216508daf0c2Sdrahn #ifdef FLOAT128
216608daf0c2Sdrahn      case FLOAT32_TO_FLOAT128:
216708daf0c2Sdrahn         time_a_float32_z_float128( float32_to_float128 );
216808daf0c2Sdrahn         break;
216908daf0c2Sdrahn #endif
217008daf0c2Sdrahn      case FLOAT32_ROUND_TO_INT:
217108daf0c2Sdrahn         time_az_float32( float32_round_to_int );
217208daf0c2Sdrahn         break;
217308daf0c2Sdrahn      case FLOAT32_ADD:
217408daf0c2Sdrahn         time_abz_float32( float32_add );
217508daf0c2Sdrahn         break;
217608daf0c2Sdrahn      case FLOAT32_SUB:
217708daf0c2Sdrahn         time_abz_float32( float32_sub );
217808daf0c2Sdrahn         break;
217908daf0c2Sdrahn      case FLOAT32_MUL:
218008daf0c2Sdrahn         time_abz_float32( float32_mul );
218108daf0c2Sdrahn         break;
218208daf0c2Sdrahn      case FLOAT32_DIV:
218308daf0c2Sdrahn         time_abz_float32( float32_div );
218408daf0c2Sdrahn         break;
218508daf0c2Sdrahn      case FLOAT32_REM:
218608daf0c2Sdrahn         time_abz_float32( float32_rem );
218708daf0c2Sdrahn         break;
218808daf0c2Sdrahn      case FLOAT32_SQRT:
218908daf0c2Sdrahn         time_az_float32_pos( float32_sqrt );
219008daf0c2Sdrahn         break;
219108daf0c2Sdrahn      case FLOAT32_EQ:
219208daf0c2Sdrahn         time_ab_float32_z_flag( float32_eq );
219308daf0c2Sdrahn         break;
219408daf0c2Sdrahn      case FLOAT32_LE:
219508daf0c2Sdrahn         time_ab_float32_z_flag( float32_le );
219608daf0c2Sdrahn         break;
219708daf0c2Sdrahn      case FLOAT32_LT:
219808daf0c2Sdrahn         time_ab_float32_z_flag( float32_lt );
219908daf0c2Sdrahn         break;
220008daf0c2Sdrahn      case FLOAT32_EQ_SIGNALING:
220108daf0c2Sdrahn         time_ab_float32_z_flag( float32_eq_signaling );
220208daf0c2Sdrahn         break;
220308daf0c2Sdrahn      case FLOAT32_LE_QUIET:
220408daf0c2Sdrahn         time_ab_float32_z_flag( float32_le_quiet );
220508daf0c2Sdrahn         break;
220608daf0c2Sdrahn      case FLOAT32_LT_QUIET:
220708daf0c2Sdrahn         time_ab_float32_z_flag( float32_lt_quiet );
220808daf0c2Sdrahn         break;
220908daf0c2Sdrahn      case FLOAT64_TO_INT32:
221008daf0c2Sdrahn         time_a_float64_z_int32( float64_to_int32 );
221108daf0c2Sdrahn         break;
221208daf0c2Sdrahn      case FLOAT64_TO_INT32_ROUND_TO_ZERO:
221308daf0c2Sdrahn         time_a_float64_z_int32( float64_to_int32_round_to_zero );
221408daf0c2Sdrahn         break;
221508daf0c2Sdrahn      case FLOAT64_TO_INT64:
221608daf0c2Sdrahn         time_a_float64_z_int64( float64_to_int64 );
221708daf0c2Sdrahn         break;
221808daf0c2Sdrahn      case FLOAT64_TO_INT64_ROUND_TO_ZERO:
221908daf0c2Sdrahn         time_a_float64_z_int64( float64_to_int64_round_to_zero );
222008daf0c2Sdrahn         break;
222108daf0c2Sdrahn      case FLOAT64_TO_FLOAT32:
222208daf0c2Sdrahn         time_a_float64_z_float32( float64_to_float32 );
222308daf0c2Sdrahn         break;
222408daf0c2Sdrahn #ifdef FLOATX80
222508daf0c2Sdrahn      case FLOAT64_TO_FLOATX80:
222608daf0c2Sdrahn         time_a_float64_z_floatx80( float64_to_floatx80 );
222708daf0c2Sdrahn         break;
222808daf0c2Sdrahn #endif
222908daf0c2Sdrahn #ifdef FLOAT128
223008daf0c2Sdrahn      case FLOAT64_TO_FLOAT128:
223108daf0c2Sdrahn         time_a_float64_z_float128( float64_to_float128 );
223208daf0c2Sdrahn         break;
223308daf0c2Sdrahn #endif
223408daf0c2Sdrahn      case FLOAT64_ROUND_TO_INT:
223508daf0c2Sdrahn         time_az_float64( float64_round_to_int );
223608daf0c2Sdrahn         break;
223708daf0c2Sdrahn      case FLOAT64_ADD:
223808daf0c2Sdrahn         time_abz_float64( float64_add );
223908daf0c2Sdrahn         break;
224008daf0c2Sdrahn      case FLOAT64_SUB:
224108daf0c2Sdrahn         time_abz_float64( float64_sub );
224208daf0c2Sdrahn         break;
224308daf0c2Sdrahn      case FLOAT64_MUL:
224408daf0c2Sdrahn         time_abz_float64( float64_mul );
224508daf0c2Sdrahn         break;
224608daf0c2Sdrahn      case FLOAT64_DIV:
224708daf0c2Sdrahn         time_abz_float64( float64_div );
224808daf0c2Sdrahn         break;
224908daf0c2Sdrahn      case FLOAT64_REM:
225008daf0c2Sdrahn         time_abz_float64( float64_rem );
225108daf0c2Sdrahn         break;
225208daf0c2Sdrahn      case FLOAT64_SQRT:
225308daf0c2Sdrahn         time_az_float64_pos( float64_sqrt );
225408daf0c2Sdrahn         break;
225508daf0c2Sdrahn      case FLOAT64_EQ:
225608daf0c2Sdrahn         time_ab_float64_z_flag( float64_eq );
225708daf0c2Sdrahn         break;
225808daf0c2Sdrahn      case FLOAT64_LE:
225908daf0c2Sdrahn         time_ab_float64_z_flag( float64_le );
226008daf0c2Sdrahn         break;
226108daf0c2Sdrahn      case FLOAT64_LT:
226208daf0c2Sdrahn         time_ab_float64_z_flag( float64_lt );
226308daf0c2Sdrahn         break;
226408daf0c2Sdrahn      case FLOAT64_EQ_SIGNALING:
226508daf0c2Sdrahn         time_ab_float64_z_flag( float64_eq_signaling );
226608daf0c2Sdrahn         break;
226708daf0c2Sdrahn      case FLOAT64_LE_QUIET:
226808daf0c2Sdrahn         time_ab_float64_z_flag( float64_le_quiet );
226908daf0c2Sdrahn         break;
227008daf0c2Sdrahn      case FLOAT64_LT_QUIET:
227108daf0c2Sdrahn         time_ab_float64_z_flag( float64_lt_quiet );
227208daf0c2Sdrahn         break;
227308daf0c2Sdrahn #ifdef FLOATX80
227408daf0c2Sdrahn      case FLOATX80_TO_INT32:
227508daf0c2Sdrahn         time_a_floatx80_z_int32( floatx80_to_int32 );
227608daf0c2Sdrahn         break;
227708daf0c2Sdrahn      case FLOATX80_TO_INT32_ROUND_TO_ZERO:
227808daf0c2Sdrahn         time_a_floatx80_z_int32( floatx80_to_int32_round_to_zero );
227908daf0c2Sdrahn         break;
228008daf0c2Sdrahn      case FLOATX80_TO_INT64:
228108daf0c2Sdrahn         time_a_floatx80_z_int64( floatx80_to_int64 );
228208daf0c2Sdrahn         break;
228308daf0c2Sdrahn      case FLOATX80_TO_INT64_ROUND_TO_ZERO:
228408daf0c2Sdrahn         time_a_floatx80_z_int64( floatx80_to_int64_round_to_zero );
228508daf0c2Sdrahn         break;
228608daf0c2Sdrahn      case FLOATX80_TO_FLOAT32:
228708daf0c2Sdrahn         time_a_floatx80_z_float32( floatx80_to_float32 );
228808daf0c2Sdrahn         break;
228908daf0c2Sdrahn      case FLOATX80_TO_FLOAT64:
229008daf0c2Sdrahn         time_a_floatx80_z_float64( floatx80_to_float64 );
229108daf0c2Sdrahn         break;
229208daf0c2Sdrahn #ifdef FLOAT128
229308daf0c2Sdrahn      case FLOATX80_TO_FLOAT128:
229408daf0c2Sdrahn         time_a_floatx80_z_float128( floatx80_to_float128 );
229508daf0c2Sdrahn         break;
229608daf0c2Sdrahn #endif
229708daf0c2Sdrahn      case FLOATX80_ROUND_TO_INT:
229808daf0c2Sdrahn         time_az_floatx80( floatx80_round_to_int );
229908daf0c2Sdrahn         break;
230008daf0c2Sdrahn      case FLOATX80_ADD:
230108daf0c2Sdrahn         time_abz_floatx80( floatx80_add );
230208daf0c2Sdrahn         break;
230308daf0c2Sdrahn      case FLOATX80_SUB:
230408daf0c2Sdrahn         time_abz_floatx80( floatx80_sub );
230508daf0c2Sdrahn         break;
230608daf0c2Sdrahn      case FLOATX80_MUL:
230708daf0c2Sdrahn         time_abz_floatx80( floatx80_mul );
230808daf0c2Sdrahn         break;
230908daf0c2Sdrahn      case FLOATX80_DIV:
231008daf0c2Sdrahn         time_abz_floatx80( floatx80_div );
231108daf0c2Sdrahn         break;
231208daf0c2Sdrahn      case FLOATX80_REM:
231308daf0c2Sdrahn         time_abz_floatx80( floatx80_rem );
231408daf0c2Sdrahn         break;
231508daf0c2Sdrahn      case FLOATX80_SQRT:
231608daf0c2Sdrahn         time_az_floatx80_pos( floatx80_sqrt );
231708daf0c2Sdrahn         break;
231808daf0c2Sdrahn      case FLOATX80_EQ:
231908daf0c2Sdrahn         time_ab_floatx80_z_flag( floatx80_eq );
232008daf0c2Sdrahn         break;
232108daf0c2Sdrahn      case FLOATX80_LE:
232208daf0c2Sdrahn         time_ab_floatx80_z_flag( floatx80_le );
232308daf0c2Sdrahn         break;
232408daf0c2Sdrahn      case FLOATX80_LT:
232508daf0c2Sdrahn         time_ab_floatx80_z_flag( floatx80_lt );
232608daf0c2Sdrahn         break;
232708daf0c2Sdrahn      case FLOATX80_EQ_SIGNALING:
232808daf0c2Sdrahn         time_ab_floatx80_z_flag( floatx80_eq_signaling );
232908daf0c2Sdrahn         break;
233008daf0c2Sdrahn      case FLOATX80_LE_QUIET:
233108daf0c2Sdrahn         time_ab_floatx80_z_flag( floatx80_le_quiet );
233208daf0c2Sdrahn         break;
233308daf0c2Sdrahn      case FLOATX80_LT_QUIET:
233408daf0c2Sdrahn         time_ab_floatx80_z_flag( floatx80_lt_quiet );
233508daf0c2Sdrahn         break;
233608daf0c2Sdrahn #endif
233708daf0c2Sdrahn #ifdef FLOAT128
233808daf0c2Sdrahn      case FLOAT128_TO_INT32:
233908daf0c2Sdrahn         time_a_float128_z_int32( float128_to_int32 );
234008daf0c2Sdrahn         break;
234108daf0c2Sdrahn      case FLOAT128_TO_INT32_ROUND_TO_ZERO:
234208daf0c2Sdrahn         time_a_float128_z_int32( float128_to_int32_round_to_zero );
234308daf0c2Sdrahn         break;
234408daf0c2Sdrahn      case FLOAT128_TO_INT64:
234508daf0c2Sdrahn         time_a_float128_z_int64( float128_to_int64 );
234608daf0c2Sdrahn         break;
234708daf0c2Sdrahn      case FLOAT128_TO_INT64_ROUND_TO_ZERO:
234808daf0c2Sdrahn         time_a_float128_z_int64( float128_to_int64_round_to_zero );
234908daf0c2Sdrahn         break;
235008daf0c2Sdrahn      case FLOAT128_TO_FLOAT32:
235108daf0c2Sdrahn         time_a_float128_z_float32( float128_to_float32 );
235208daf0c2Sdrahn         break;
235308daf0c2Sdrahn      case FLOAT128_TO_FLOAT64:
235408daf0c2Sdrahn         time_a_float128_z_float64( float128_to_float64 );
235508daf0c2Sdrahn         break;
235608daf0c2Sdrahn #ifdef FLOATX80
235708daf0c2Sdrahn      case FLOAT128_TO_FLOATX80:
235808daf0c2Sdrahn         time_a_float128_z_floatx80( float128_to_floatx80 );
235908daf0c2Sdrahn         break;
236008daf0c2Sdrahn #endif
236108daf0c2Sdrahn      case FLOAT128_ROUND_TO_INT:
236208daf0c2Sdrahn         time_az_float128( float128_round_to_int );
236308daf0c2Sdrahn         break;
236408daf0c2Sdrahn      case FLOAT128_ADD:
236508daf0c2Sdrahn         time_abz_float128( float128_add );
236608daf0c2Sdrahn         break;
236708daf0c2Sdrahn      case FLOAT128_SUB:
236808daf0c2Sdrahn         time_abz_float128( float128_sub );
236908daf0c2Sdrahn         break;
237008daf0c2Sdrahn      case FLOAT128_MUL:
237108daf0c2Sdrahn         time_abz_float128( float128_mul );
237208daf0c2Sdrahn         break;
237308daf0c2Sdrahn      case FLOAT128_DIV:
237408daf0c2Sdrahn         time_abz_float128( float128_div );
237508daf0c2Sdrahn         break;
237608daf0c2Sdrahn      case FLOAT128_REM:
237708daf0c2Sdrahn         time_abz_float128( float128_rem );
237808daf0c2Sdrahn         break;
237908daf0c2Sdrahn      case FLOAT128_SQRT:
238008daf0c2Sdrahn         time_az_float128_pos( float128_sqrt );
238108daf0c2Sdrahn         break;
238208daf0c2Sdrahn      case FLOAT128_EQ:
238308daf0c2Sdrahn         time_ab_float128_z_flag( float128_eq );
238408daf0c2Sdrahn         break;
238508daf0c2Sdrahn      case FLOAT128_LE:
238608daf0c2Sdrahn         time_ab_float128_z_flag( float128_le );
238708daf0c2Sdrahn         break;
238808daf0c2Sdrahn      case FLOAT128_LT:
238908daf0c2Sdrahn         time_ab_float128_z_flag( float128_lt );
239008daf0c2Sdrahn         break;
239108daf0c2Sdrahn      case FLOAT128_EQ_SIGNALING:
239208daf0c2Sdrahn         time_ab_float128_z_flag( float128_eq_signaling );
239308daf0c2Sdrahn         break;
239408daf0c2Sdrahn      case FLOAT128_LE_QUIET:
239508daf0c2Sdrahn         time_ab_float128_z_flag( float128_le_quiet );
239608daf0c2Sdrahn         break;
239708daf0c2Sdrahn      case FLOAT128_LT_QUIET:
239808daf0c2Sdrahn         time_ab_float128_z_flag( float128_lt_quiet );
239908daf0c2Sdrahn         break;
240008daf0c2Sdrahn #endif
240108daf0c2Sdrahn     }
240208daf0c2Sdrahn 
240308daf0c2Sdrahn }
240408daf0c2Sdrahn 
240508daf0c2Sdrahn static void
timeFunction(uint8 functionCode,int8 roundingPrecisionIn,int8 roundingModeIn,int8 tininessModeIn)240608daf0c2Sdrahn  timeFunction(
240708daf0c2Sdrahn      uint8 functionCode,
240808daf0c2Sdrahn      int8 roundingPrecisionIn,
240908daf0c2Sdrahn      int8 roundingModeIn,
241008daf0c2Sdrahn      int8 tininessModeIn
241108daf0c2Sdrahn  )
241208daf0c2Sdrahn {
241308daf0c2Sdrahn     int8 roundingPrecision, roundingMode, tininessMode;
241408daf0c2Sdrahn 
241508daf0c2Sdrahn     roundingPrecision = 32;
241608daf0c2Sdrahn     for (;;) {
241708daf0c2Sdrahn         if ( ! functions[ functionCode ].roundingPrecision ) {
241808daf0c2Sdrahn             roundingPrecision = 0;
241908daf0c2Sdrahn         }
242008daf0c2Sdrahn         else if ( roundingPrecisionIn ) {
242108daf0c2Sdrahn             roundingPrecision = roundingPrecisionIn;
242208daf0c2Sdrahn         }
242308daf0c2Sdrahn         for ( roundingMode = 1;
242408daf0c2Sdrahn               roundingMode < NUM_ROUNDINGMODES;
242508daf0c2Sdrahn               ++roundingMode
242608daf0c2Sdrahn             ) {
242708daf0c2Sdrahn             if ( ! functions[ functionCode ].roundingMode ) {
242808daf0c2Sdrahn                 roundingMode = 0;
242908daf0c2Sdrahn             }
243008daf0c2Sdrahn             else if ( roundingModeIn ) {
243108daf0c2Sdrahn                 roundingMode = roundingModeIn;
243208daf0c2Sdrahn             }
243308daf0c2Sdrahn             for ( tininessMode = 1;
243408daf0c2Sdrahn                   tininessMode < NUM_TININESSMODES;
243508daf0c2Sdrahn                   ++tininessMode
243608daf0c2Sdrahn                 ) {
243708daf0c2Sdrahn                 if (    ( roundingPrecision == 32 )
243808daf0c2Sdrahn                      || ( roundingPrecision == 64 ) ) {
243908daf0c2Sdrahn                     if ( ! functions[ functionCode ]
244008daf0c2Sdrahn                                .tininessModeAtReducedPrecision
244108daf0c2Sdrahn                        ) {
244208daf0c2Sdrahn                         tininessMode = 0;
244308daf0c2Sdrahn                     }
244408daf0c2Sdrahn                     else if ( tininessModeIn ) {
244508daf0c2Sdrahn                         tininessMode = tininessModeIn;
244608daf0c2Sdrahn                     }
244708daf0c2Sdrahn                 }
244808daf0c2Sdrahn                 else {
244908daf0c2Sdrahn                     if ( ! functions[ functionCode ].tininessMode ) {
245008daf0c2Sdrahn                         tininessMode = 0;
245108daf0c2Sdrahn                     }
245208daf0c2Sdrahn                     else if ( tininessModeIn ) {
245308daf0c2Sdrahn                         tininessMode = tininessModeIn;
245408daf0c2Sdrahn                     }
245508daf0c2Sdrahn                 }
245608daf0c2Sdrahn                 timeFunctionVariety(
245708daf0c2Sdrahn                     functionCode, roundingPrecision, roundingMode, tininessMode
245808daf0c2Sdrahn                 );
245908daf0c2Sdrahn                 if ( tininessModeIn || ! tininessMode ) break;
246008daf0c2Sdrahn             }
246108daf0c2Sdrahn             if ( roundingModeIn || ! roundingMode ) break;
246208daf0c2Sdrahn         }
246308daf0c2Sdrahn         if ( roundingPrecisionIn || ! roundingPrecision ) break;
246408daf0c2Sdrahn         if ( roundingPrecision == 80 ) {
246508daf0c2Sdrahn             break;
246608daf0c2Sdrahn         }
246708daf0c2Sdrahn         else if ( roundingPrecision == 64 ) {
246808daf0c2Sdrahn             roundingPrecision = 80;
246908daf0c2Sdrahn         }
247008daf0c2Sdrahn         else if ( roundingPrecision == 32 ) {
247108daf0c2Sdrahn             roundingPrecision = 64;
247208daf0c2Sdrahn         }
247308daf0c2Sdrahn     }
247408daf0c2Sdrahn 
247508daf0c2Sdrahn }
247608daf0c2Sdrahn 
main(int argc,char ** argv)247708daf0c2Sdrahn main( int argc, char **argv )
247808daf0c2Sdrahn {
247908daf0c2Sdrahn     char *argPtr;
248008daf0c2Sdrahn     flag functionArgument;
248108daf0c2Sdrahn     uint8 functionCode;
248208daf0c2Sdrahn     int8 operands, roundingPrecision, roundingMode, tininessMode;
248308daf0c2Sdrahn 
248408daf0c2Sdrahn     if ( argc <= 1 ) goto writeHelpMessage;
248508daf0c2Sdrahn     functionArgument = FALSE;
248608daf0c2Sdrahn     functionCode = 0;
248708daf0c2Sdrahn     operands = 0;
248808daf0c2Sdrahn     roundingPrecision = 0;
248908daf0c2Sdrahn     roundingMode = 0;
249008daf0c2Sdrahn     tininessMode = 0;
249108daf0c2Sdrahn     --argc;
249208daf0c2Sdrahn     ++argv;
249308daf0c2Sdrahn     while ( argc && ( argPtr = argv[ 0 ] ) ) {
249408daf0c2Sdrahn         if ( argPtr[ 0 ] == '-' ) ++argPtr;
249508daf0c2Sdrahn         if ( strcmp( argPtr, "help" ) == 0 ) {
249608daf0c2Sdrahn  writeHelpMessage:
249708daf0c2Sdrahn             fputs(
249808daf0c2Sdrahn "timesoftfloat [<option>...] <function>\n"
249908daf0c2Sdrahn "  <option>:  (* is default)\n"
250008daf0c2Sdrahn "    -help            --Write this message and exit.\n"
250108daf0c2Sdrahn #ifdef FLOATX80
250208daf0c2Sdrahn "    -precision32     --Only time rounding precision equivalent to float32.\n"
250308daf0c2Sdrahn "    -precision64     --Only time rounding precision equivalent to float64.\n"
250408daf0c2Sdrahn "    -precision80     --Only time maximum rounding precision.\n"
250508daf0c2Sdrahn #endif
250608daf0c2Sdrahn "    -nearesteven     --Only time rounding to nearest/even.\n"
250708daf0c2Sdrahn "    -tozero          --Only time rounding to zero.\n"
250808daf0c2Sdrahn "    -down            --Only time rounding down.\n"
250908daf0c2Sdrahn "    -up              --Only time rounding up.\n"
251008daf0c2Sdrahn "    -tininessbefore  --Only time underflow tininess before rounding.\n"
251108daf0c2Sdrahn "    -tininessafter   --Only time underflow tininess after rounding.\n"
251208daf0c2Sdrahn "  <function>:\n"
251308daf0c2Sdrahn "    int32_to_<float>                 <float>_add   <float>_eq\n"
251408daf0c2Sdrahn "    <float>_to_int32                 <float>_sub   <float>_le\n"
251508daf0c2Sdrahn "    <float>_to_int32_round_to_zero   <float>_mul   <float>_lt\n"
251608daf0c2Sdrahn "    int64_to_<float>                 <float>_div   <float>_eq_signaling\n"
251708daf0c2Sdrahn "    <float>_to_int64                 <float>_rem   <float>_le_quiet\n"
251808daf0c2Sdrahn "    <float>_to_int64_round_to_zero                 <float>_lt_quiet\n"
251908daf0c2Sdrahn "    <float>_to_<float>\n"
252008daf0c2Sdrahn "    <float>_round_to_int\n"
252108daf0c2Sdrahn "    <float>_sqrt\n"
252208daf0c2Sdrahn "    -all1            --All 1-operand functions.\n"
252308daf0c2Sdrahn "    -all2            --All 2-operand functions.\n"
252408daf0c2Sdrahn "    -all             --All functions.\n"
252508daf0c2Sdrahn "  <float>:\n"
252608daf0c2Sdrahn "    float32          --Single precision.\n"
252708daf0c2Sdrahn "    float64          --Double precision.\n"
252808daf0c2Sdrahn #ifdef FLOATX80
252908daf0c2Sdrahn "    floatx80         --Extended double precision.\n"
253008daf0c2Sdrahn #endif
253108daf0c2Sdrahn #ifdef FLOAT128
253208daf0c2Sdrahn "    float128         --Quadruple precision.\n"
253308daf0c2Sdrahn #endif
253408daf0c2Sdrahn                 ,
253508daf0c2Sdrahn                 stdout
253608daf0c2Sdrahn             );
253708daf0c2Sdrahn             return EXIT_SUCCESS;
253808daf0c2Sdrahn         }
253908daf0c2Sdrahn #ifdef FLOATX80
254008daf0c2Sdrahn         else if ( strcmp( argPtr, "precision32" ) == 0 ) {
254108daf0c2Sdrahn             roundingPrecision = 32;
254208daf0c2Sdrahn         }
254308daf0c2Sdrahn         else if ( strcmp( argPtr, "precision64" ) == 0 ) {
254408daf0c2Sdrahn             roundingPrecision = 64;
254508daf0c2Sdrahn         }
254608daf0c2Sdrahn         else if ( strcmp( argPtr, "precision80" ) == 0 ) {
254708daf0c2Sdrahn             roundingPrecision = 80;
254808daf0c2Sdrahn         }
254908daf0c2Sdrahn #endif
255008daf0c2Sdrahn         else if (    ( strcmp( argPtr, "nearesteven" ) == 0 )
255108daf0c2Sdrahn                   || ( strcmp( argPtr, "nearest_even" ) == 0 ) ) {
255208daf0c2Sdrahn             roundingMode = ROUND_NEAREST_EVEN;
255308daf0c2Sdrahn         }
255408daf0c2Sdrahn         else if (    ( strcmp( argPtr, "tozero" ) == 0 )
255508daf0c2Sdrahn                   || ( strcmp( argPtr, "to_zero" ) == 0 ) ) {
255608daf0c2Sdrahn             roundingMode = ROUND_TO_ZERO;
255708daf0c2Sdrahn         }
255808daf0c2Sdrahn         else if ( strcmp( argPtr, "down" ) == 0 ) {
255908daf0c2Sdrahn             roundingMode = ROUND_DOWN;
256008daf0c2Sdrahn         }
256108daf0c2Sdrahn         else if ( strcmp( argPtr, "up" ) == 0 ) {
256208daf0c2Sdrahn             roundingMode = ROUND_UP;
256308daf0c2Sdrahn         }
256408daf0c2Sdrahn         else if ( strcmp( argPtr, "tininessbefore" ) == 0 ) {
256508daf0c2Sdrahn             tininessMode = TININESS_BEFORE_ROUNDING;
256608daf0c2Sdrahn         }
256708daf0c2Sdrahn         else if ( strcmp( argPtr, "tininessafter" ) == 0 ) {
256808daf0c2Sdrahn             tininessMode = TININESS_AFTER_ROUNDING;
256908daf0c2Sdrahn         }
257008daf0c2Sdrahn         else if ( strcmp( argPtr, "all1" ) == 0 ) {
257108daf0c2Sdrahn             functionArgument = TRUE;
257208daf0c2Sdrahn             functionCode = 0;
257308daf0c2Sdrahn             operands = 1;
257408daf0c2Sdrahn         }
257508daf0c2Sdrahn         else if ( strcmp( argPtr, "all2" ) == 0 ) {
257608daf0c2Sdrahn             functionArgument = TRUE;
257708daf0c2Sdrahn             functionCode = 0;
257808daf0c2Sdrahn             operands = 2;
257908daf0c2Sdrahn         }
258008daf0c2Sdrahn         else if ( strcmp( argPtr, "all" ) == 0 ) {
258108daf0c2Sdrahn             functionArgument = TRUE;
258208daf0c2Sdrahn             functionCode = 0;
258308daf0c2Sdrahn             operands = 0;
258408daf0c2Sdrahn         }
258508daf0c2Sdrahn         else {
258608daf0c2Sdrahn             for ( functionCode = 1;
258708daf0c2Sdrahn                   functionCode < NUM_FUNCTIONS;
258808daf0c2Sdrahn                   ++functionCode
258908daf0c2Sdrahn                 ) {
259008daf0c2Sdrahn                 if ( strcmp( argPtr, functions[ functionCode ].name ) == 0 ) {
259108daf0c2Sdrahn                     break;
259208daf0c2Sdrahn                 }
259308daf0c2Sdrahn             }
259408daf0c2Sdrahn             if ( functionCode == NUM_FUNCTIONS ) {
259508daf0c2Sdrahn                 fail( "Invalid option or function `%s'", argv[ 0 ] );
259608daf0c2Sdrahn             }
259708daf0c2Sdrahn             functionArgument = TRUE;
259808daf0c2Sdrahn         }
259908daf0c2Sdrahn         --argc;
260008daf0c2Sdrahn         ++argv;
260108daf0c2Sdrahn     }
260208daf0c2Sdrahn     if ( ! functionArgument ) fail( "Function argument required" );
260308daf0c2Sdrahn     if ( functionCode ) {
260408daf0c2Sdrahn         timeFunction(
260508daf0c2Sdrahn             functionCode, roundingPrecision, roundingMode, tininessMode );
260608daf0c2Sdrahn     }
260708daf0c2Sdrahn     else if ( operands == 1 ) {
260808daf0c2Sdrahn         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
260908daf0c2Sdrahn             ) {
261008daf0c2Sdrahn             if ( functions[ functionCode ].numInputs == 1 ) {
261108daf0c2Sdrahn                 timeFunction(
261208daf0c2Sdrahn                     functionCode, roundingPrecision, roundingMode, tininessMode
261308daf0c2Sdrahn                 );
261408daf0c2Sdrahn             }
261508daf0c2Sdrahn         }
261608daf0c2Sdrahn     }
261708daf0c2Sdrahn     else if ( operands == 2 ) {
261808daf0c2Sdrahn         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
261908daf0c2Sdrahn             ) {
262008daf0c2Sdrahn             if ( functions[ functionCode ].numInputs == 2 ) {
262108daf0c2Sdrahn                 timeFunction(
262208daf0c2Sdrahn                     functionCode, roundingPrecision, roundingMode, tininessMode
262308daf0c2Sdrahn                 );
262408daf0c2Sdrahn             }
262508daf0c2Sdrahn         }
262608daf0c2Sdrahn     }
262708daf0c2Sdrahn     else {
262808daf0c2Sdrahn         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
262908daf0c2Sdrahn             ) {
263008daf0c2Sdrahn             timeFunction(
263108daf0c2Sdrahn                 functionCode, roundingPrecision, roundingMode, tininessMode );
263208daf0c2Sdrahn         }
263308daf0c2Sdrahn     }
263408daf0c2Sdrahn     return EXIT_SUCCESS;
263508daf0c2Sdrahn 
263608daf0c2Sdrahn }
263708daf0c2Sdrahn 
2638