xref: /freebsd/lib/libc/softfloat/timesoftfloat.c (revision 15144b0f960e6044ec23ad91c5f76f37d1de36ba)
115144b0fSOlivier Houchard /* $NetBSD: timesoftfloat.c,v 1.1 2000/06/06 08:15:11 bjh21 Exp $ */
215144b0fSOlivier Houchard 
315144b0fSOlivier Houchard /*
415144b0fSOlivier Houchard ===============================================================================
515144b0fSOlivier Houchard 
615144b0fSOlivier Houchard This C source file is part of the SoftFloat IEC/IEEE Floating-point
715144b0fSOlivier Houchard Arithmetic Package, Release 2a.
815144b0fSOlivier Houchard 
915144b0fSOlivier Houchard Written by John R. Hauser.  This work was made possible in part by the
1015144b0fSOlivier Houchard International Computer Science Institute, located at Suite 600, 1947 Center
1115144b0fSOlivier Houchard Street, Berkeley, California 94704.  Funding was partially provided by the
1215144b0fSOlivier Houchard National Science Foundation under grant MIP-9311980.  The original version
1315144b0fSOlivier Houchard of this code was written as part of a project to build a fixed-point vector
1415144b0fSOlivier Houchard processor in collaboration with the University of California at Berkeley,
1515144b0fSOlivier Houchard overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
1615144b0fSOlivier Houchard is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
1715144b0fSOlivier Houchard arithmetic/SoftFloat.html'.
1815144b0fSOlivier Houchard 
1915144b0fSOlivier Houchard THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
2015144b0fSOlivier Houchard has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
2115144b0fSOlivier Houchard TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
2215144b0fSOlivier Houchard PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
2315144b0fSOlivier Houchard AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
2415144b0fSOlivier Houchard 
2515144b0fSOlivier Houchard Derivative works are acceptable, even for commercial purposes, so long as
2615144b0fSOlivier Houchard (1) they include prominent notice that the work is derivative, and (2) they
2715144b0fSOlivier Houchard include prominent notice akin to these four paragraphs for those parts of
2815144b0fSOlivier Houchard this code that are retained.
2915144b0fSOlivier Houchard 
3015144b0fSOlivier Houchard ===============================================================================
3115144b0fSOlivier Houchard */
3215144b0fSOlivier Houchard 
3315144b0fSOlivier Houchard #include <sys/cdefs.h>
3415144b0fSOlivier Houchard __FBSDID("$FreeBSD$");
3515144b0fSOlivier Houchard 
3615144b0fSOlivier Houchard #include <stdlib.h>
3715144b0fSOlivier Houchard #include <stdarg.h>
3815144b0fSOlivier Houchard #include <string.h>
3915144b0fSOlivier Houchard #include <stdio.h>
4015144b0fSOlivier Houchard #include <time.h>
4115144b0fSOlivier Houchard #include "milieu.h"
4215144b0fSOlivier Houchard #include "softfloat.h"
4315144b0fSOlivier Houchard 
4415144b0fSOlivier Houchard enum {
4515144b0fSOlivier Houchard     minIterations = 1000
4615144b0fSOlivier Houchard };
4715144b0fSOlivier Houchard 
4815144b0fSOlivier Houchard static void fail( const char *message, ... )
4915144b0fSOlivier Houchard {
5015144b0fSOlivier Houchard     va_list varArgs;
5115144b0fSOlivier Houchard 
5215144b0fSOlivier Houchard     fputs( "timesoftfloat: ", stderr );
5315144b0fSOlivier Houchard     va_start( varArgs, message );
5415144b0fSOlivier Houchard     vfprintf( stderr, message, varArgs );
5515144b0fSOlivier Houchard     va_end( varArgs );
5615144b0fSOlivier Houchard     fputs( ".\n", stderr );
5715144b0fSOlivier Houchard     exit( EXIT_FAILURE );
5815144b0fSOlivier Houchard 
5915144b0fSOlivier Houchard }
6015144b0fSOlivier Houchard 
6115144b0fSOlivier Houchard static char *functionName;
6215144b0fSOlivier Houchard static char *roundingPrecisionName, *roundingModeName, *tininessModeName;
6315144b0fSOlivier Houchard 
6415144b0fSOlivier Houchard static void reportTime( int32 count, long clocks )
6515144b0fSOlivier Houchard {
6615144b0fSOlivier Houchard 
6715144b0fSOlivier Houchard     printf(
6815144b0fSOlivier Houchard         "%8.1f kops/s: %s",
6915144b0fSOlivier Houchard         ( count / ( ( (float) clocks ) / CLOCKS_PER_SEC ) ) / 1000,
7015144b0fSOlivier Houchard         functionName
7115144b0fSOlivier Houchard     );
7215144b0fSOlivier Houchard     if ( roundingModeName ) {
7315144b0fSOlivier Houchard         if ( roundingPrecisionName ) {
7415144b0fSOlivier Houchard             fputs( ", precision ", stdout );
7515144b0fSOlivier Houchard             fputs( roundingPrecisionName, stdout );
7615144b0fSOlivier Houchard         }
7715144b0fSOlivier Houchard         fputs( ", rounding ", stdout );
7815144b0fSOlivier Houchard         fputs( roundingModeName, stdout );
7915144b0fSOlivier Houchard         if ( tininessModeName ) {
8015144b0fSOlivier Houchard             fputs( ", tininess ", stdout );
8115144b0fSOlivier Houchard             fputs( tininessModeName, stdout );
8215144b0fSOlivier Houchard             fputs( " rounding", stdout );
8315144b0fSOlivier Houchard         }
8415144b0fSOlivier Houchard     }
8515144b0fSOlivier Houchard     fputc( '\n', stdout );
8615144b0fSOlivier Houchard 
8715144b0fSOlivier Houchard }
8815144b0fSOlivier Houchard 
8915144b0fSOlivier Houchard enum {
9015144b0fSOlivier Houchard     numInputs_int32 = 32
9115144b0fSOlivier Houchard };
9215144b0fSOlivier Houchard 
9315144b0fSOlivier Houchard static const int32 inputs_int32[ numInputs_int32 ] = {
9415144b0fSOlivier Houchard     0xFFFFBB79, 0x405CF80F, 0x00000000, 0xFFFFFD04,
9515144b0fSOlivier Houchard     0xFFF20002, 0x0C8EF795, 0xF00011FF, 0x000006CA,
9615144b0fSOlivier Houchard     0x00009BFE, 0xFF4862E3, 0x9FFFEFFE, 0xFFFFFFB7,
9715144b0fSOlivier Houchard     0x0BFF7FFF, 0x0000F37A, 0x0011DFFE, 0x00000006,
9815144b0fSOlivier Houchard     0xFFF02006, 0xFFFFF7D1, 0x10200003, 0xDE8DF765,
9915144b0fSOlivier Houchard     0x00003E02, 0x000019E8, 0x0008FFFE, 0xFFFFFB5C,
10015144b0fSOlivier Houchard     0xFFDF7FFE, 0x07C42FBF, 0x0FFFE3FF, 0x040B9F13,
10115144b0fSOlivier Houchard     0xBFFFFFF8, 0x0001BF56, 0x000017F6, 0x000A908A
10215144b0fSOlivier Houchard };
10315144b0fSOlivier Houchard 
10415144b0fSOlivier Houchard static void time_a_int32_z_float32( float32 function( int32 ) )
10515144b0fSOlivier Houchard {
10615144b0fSOlivier Houchard     clock_t startClock, endClock;
10715144b0fSOlivier Houchard     int32 count, i;
10815144b0fSOlivier Houchard     int8 inputNum;
10915144b0fSOlivier Houchard 
11015144b0fSOlivier Houchard     count = 0;
11115144b0fSOlivier Houchard     inputNum = 0;
11215144b0fSOlivier Houchard     startClock = clock();
11315144b0fSOlivier Houchard     do {
11415144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
11515144b0fSOlivier Houchard             function( inputs_int32[ inputNum ] );
11615144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
11715144b0fSOlivier Houchard         }
11815144b0fSOlivier Houchard         count += minIterations;
11915144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
12015144b0fSOlivier Houchard     inputNum = 0;
12115144b0fSOlivier Houchard     startClock = clock();
12215144b0fSOlivier Houchard     for ( i = count; i; --i ) {
12315144b0fSOlivier Houchard         function( inputs_int32[ inputNum ] );
12415144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
12515144b0fSOlivier Houchard     }
12615144b0fSOlivier Houchard     endClock = clock();
12715144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
12815144b0fSOlivier Houchard 
12915144b0fSOlivier Houchard }
13015144b0fSOlivier Houchard 
13115144b0fSOlivier Houchard static void time_a_int32_z_float64( float64 function( int32 ) )
13215144b0fSOlivier Houchard {
13315144b0fSOlivier Houchard     clock_t startClock, endClock;
13415144b0fSOlivier Houchard     int32 count, i;
13515144b0fSOlivier Houchard     int8 inputNum;
13615144b0fSOlivier Houchard 
13715144b0fSOlivier Houchard     count = 0;
13815144b0fSOlivier Houchard     inputNum = 0;
13915144b0fSOlivier Houchard     startClock = clock();
14015144b0fSOlivier Houchard     do {
14115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
14215144b0fSOlivier Houchard             function( inputs_int32[ inputNum ] );
14315144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
14415144b0fSOlivier Houchard         }
14515144b0fSOlivier Houchard         count += minIterations;
14615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
14715144b0fSOlivier Houchard     inputNum = 0;
14815144b0fSOlivier Houchard     startClock = clock();
14915144b0fSOlivier Houchard     for ( i = count; i; --i ) {
15015144b0fSOlivier Houchard         function( inputs_int32[ inputNum ] );
15115144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
15215144b0fSOlivier Houchard     }
15315144b0fSOlivier Houchard     endClock = clock();
15415144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
15515144b0fSOlivier Houchard 
15615144b0fSOlivier Houchard }
15715144b0fSOlivier Houchard 
15815144b0fSOlivier Houchard #ifdef FLOATX80
15915144b0fSOlivier Houchard 
16015144b0fSOlivier Houchard static void time_a_int32_z_floatx80( floatx80 function( int32 ) )
16115144b0fSOlivier Houchard {
16215144b0fSOlivier Houchard     clock_t startClock, endClock;
16315144b0fSOlivier Houchard     int32 count, i;
16415144b0fSOlivier Houchard     int8 inputNum;
16515144b0fSOlivier Houchard 
16615144b0fSOlivier Houchard     count = 0;
16715144b0fSOlivier Houchard     inputNum = 0;
16815144b0fSOlivier Houchard     startClock = clock();
16915144b0fSOlivier Houchard     do {
17015144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
17115144b0fSOlivier Houchard             function( inputs_int32[ inputNum ] );
17215144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
17315144b0fSOlivier Houchard         }
17415144b0fSOlivier Houchard         count += minIterations;
17515144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
17615144b0fSOlivier Houchard     inputNum = 0;
17715144b0fSOlivier Houchard     startClock = clock();
17815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
17915144b0fSOlivier Houchard         function( inputs_int32[ inputNum ] );
18015144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
18115144b0fSOlivier Houchard     }
18215144b0fSOlivier Houchard     endClock = clock();
18315144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
18415144b0fSOlivier Houchard 
18515144b0fSOlivier Houchard }
18615144b0fSOlivier Houchard 
18715144b0fSOlivier Houchard #endif
18815144b0fSOlivier Houchard 
18915144b0fSOlivier Houchard #ifdef FLOAT128
19015144b0fSOlivier Houchard 
19115144b0fSOlivier Houchard static void time_a_int32_z_float128( float128 function( int32 ) )
19215144b0fSOlivier Houchard {
19315144b0fSOlivier Houchard     clock_t startClock, endClock;
19415144b0fSOlivier Houchard     int32 count, i;
19515144b0fSOlivier Houchard     int8 inputNum;
19615144b0fSOlivier Houchard 
19715144b0fSOlivier Houchard     count = 0;
19815144b0fSOlivier Houchard     inputNum = 0;
19915144b0fSOlivier Houchard     startClock = clock();
20015144b0fSOlivier Houchard     do {
20115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
20215144b0fSOlivier Houchard             function( inputs_int32[ inputNum ] );
20315144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
20415144b0fSOlivier Houchard         }
20515144b0fSOlivier Houchard         count += minIterations;
20615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
20715144b0fSOlivier Houchard     inputNum = 0;
20815144b0fSOlivier Houchard     startClock = clock();
20915144b0fSOlivier Houchard     for ( i = count; i; --i ) {
21015144b0fSOlivier Houchard         function( inputs_int32[ inputNum ] );
21115144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int32 - 1 );
21215144b0fSOlivier Houchard     }
21315144b0fSOlivier Houchard     endClock = clock();
21415144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
21515144b0fSOlivier Houchard 
21615144b0fSOlivier Houchard }
21715144b0fSOlivier Houchard 
21815144b0fSOlivier Houchard #endif
21915144b0fSOlivier Houchard 
22015144b0fSOlivier Houchard enum {
22115144b0fSOlivier Houchard     numInputs_int64 = 32
22215144b0fSOlivier Houchard };
22315144b0fSOlivier Houchard 
22415144b0fSOlivier Houchard static const int64 inputs_int64[ numInputs_int64 ] = {
22515144b0fSOlivier Houchard     LIT64( 0xFBFFC3FFFFFFFFFF ),
22615144b0fSOlivier Houchard     LIT64( 0x0000000003C589BC ),
22715144b0fSOlivier Houchard     LIT64( 0x00000000400013FE ),
22815144b0fSOlivier Houchard     LIT64( 0x0000000000186171 ),
22915144b0fSOlivier Houchard     LIT64( 0xFFFFFFFFFFFEFBFA ),
23015144b0fSOlivier Houchard     LIT64( 0xFFFFFD79E6DFFC73 ),
23115144b0fSOlivier Houchard     LIT64( 0x0000000010001DFF ),
23215144b0fSOlivier Houchard     LIT64( 0xDD1A0F0C78513710 ),
23315144b0fSOlivier Houchard     LIT64( 0xFFFF83FFFFFEFFFE ),
23415144b0fSOlivier Houchard     LIT64( 0x00756EBD1AD0C1C7 ),
23515144b0fSOlivier Houchard     LIT64( 0x0003FDFFFFFFFFBE ),
23615144b0fSOlivier Houchard     LIT64( 0x0007D0FB2C2CA951 ),
23715144b0fSOlivier Houchard     LIT64( 0x0007FC0007FFFFFE ),
23815144b0fSOlivier Houchard     LIT64( 0x0000001F942B18BB ),
23915144b0fSOlivier Houchard     LIT64( 0x0000080101FFFFFE ),
24015144b0fSOlivier Houchard     LIT64( 0xFFFFFFFFFFFF0978 ),
24115144b0fSOlivier Houchard     LIT64( 0x000000000008BFFF ),
24215144b0fSOlivier Houchard     LIT64( 0x0000000006F5AF08 ),
24315144b0fSOlivier Houchard     LIT64( 0xFFDEFF7FFFFFFFFE ),
24415144b0fSOlivier Houchard     LIT64( 0x0000000000000003 ),
24515144b0fSOlivier Houchard     LIT64( 0x3FFFFFFFFF80007D ),
24615144b0fSOlivier Houchard     LIT64( 0x0000000000000078 ),
24715144b0fSOlivier Houchard     LIT64( 0xFFF80000007FDFFD ),
24815144b0fSOlivier Houchard     LIT64( 0x1BBC775B78016AB0 ),
24915144b0fSOlivier Houchard     LIT64( 0xFFF9001FFFFFFFFE ),
25015144b0fSOlivier Houchard     LIT64( 0xFFFD4767AB98E43F ),
25115144b0fSOlivier Houchard     LIT64( 0xFFFFFEFFFE00001E ),
25215144b0fSOlivier Houchard     LIT64( 0xFFFFFFFFFFF04EFD ),
25315144b0fSOlivier Houchard     LIT64( 0x07FFFFFFFFFFF7FF ),
25415144b0fSOlivier Houchard     LIT64( 0xFFFC9EAA38F89050 ),
25515144b0fSOlivier Houchard     LIT64( 0x00000020FBFFFFFE ),
25615144b0fSOlivier Houchard     LIT64( 0x0000099AE6455357 )
25715144b0fSOlivier Houchard };
25815144b0fSOlivier Houchard 
25915144b0fSOlivier Houchard static void time_a_int64_z_float32( float32 function( int64 ) )
26015144b0fSOlivier Houchard {
26115144b0fSOlivier Houchard     clock_t startClock, endClock;
26215144b0fSOlivier Houchard     int32 count, i;
26315144b0fSOlivier Houchard     int8 inputNum;
26415144b0fSOlivier Houchard 
26515144b0fSOlivier Houchard     count = 0;
26615144b0fSOlivier Houchard     inputNum = 0;
26715144b0fSOlivier Houchard     startClock = clock();
26815144b0fSOlivier Houchard     do {
26915144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
27015144b0fSOlivier Houchard             function( inputs_int64[ inputNum ] );
27115144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
27215144b0fSOlivier Houchard         }
27315144b0fSOlivier Houchard         count += minIterations;
27415144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
27515144b0fSOlivier Houchard     inputNum = 0;
27615144b0fSOlivier Houchard     startClock = clock();
27715144b0fSOlivier Houchard     for ( i = count; i; --i ) {
27815144b0fSOlivier Houchard         function( inputs_int64[ inputNum ] );
27915144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
28015144b0fSOlivier Houchard     }
28115144b0fSOlivier Houchard     endClock = clock();
28215144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
28315144b0fSOlivier Houchard 
28415144b0fSOlivier Houchard }
28515144b0fSOlivier Houchard 
28615144b0fSOlivier Houchard static void time_a_int64_z_float64( float64 function( int64 ) )
28715144b0fSOlivier Houchard {
28815144b0fSOlivier Houchard     clock_t startClock, endClock;
28915144b0fSOlivier Houchard     int32 count, i;
29015144b0fSOlivier Houchard     int8 inputNum;
29115144b0fSOlivier Houchard 
29215144b0fSOlivier Houchard     count = 0;
29315144b0fSOlivier Houchard     inputNum = 0;
29415144b0fSOlivier Houchard     startClock = clock();
29515144b0fSOlivier Houchard     do {
29615144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
29715144b0fSOlivier Houchard             function( inputs_int64[ inputNum ] );
29815144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
29915144b0fSOlivier Houchard         }
30015144b0fSOlivier Houchard         count += minIterations;
30115144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
30215144b0fSOlivier Houchard     inputNum = 0;
30315144b0fSOlivier Houchard     startClock = clock();
30415144b0fSOlivier Houchard     for ( i = count; i; --i ) {
30515144b0fSOlivier Houchard         function( inputs_int64[ inputNum ] );
30615144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
30715144b0fSOlivier Houchard     }
30815144b0fSOlivier Houchard     endClock = clock();
30915144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
31015144b0fSOlivier Houchard 
31115144b0fSOlivier Houchard }
31215144b0fSOlivier Houchard 
31315144b0fSOlivier Houchard #ifdef FLOATX80
31415144b0fSOlivier Houchard 
31515144b0fSOlivier Houchard static void time_a_int64_z_floatx80( floatx80 function( int64 ) )
31615144b0fSOlivier Houchard {
31715144b0fSOlivier Houchard     clock_t startClock, endClock;
31815144b0fSOlivier Houchard     int32 count, i;
31915144b0fSOlivier Houchard     int8 inputNum;
32015144b0fSOlivier Houchard 
32115144b0fSOlivier Houchard     count = 0;
32215144b0fSOlivier Houchard     inputNum = 0;
32315144b0fSOlivier Houchard     startClock = clock();
32415144b0fSOlivier Houchard     do {
32515144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
32615144b0fSOlivier Houchard             function( inputs_int64[ inputNum ] );
32715144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
32815144b0fSOlivier Houchard         }
32915144b0fSOlivier Houchard         count += minIterations;
33015144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
33115144b0fSOlivier Houchard     inputNum = 0;
33215144b0fSOlivier Houchard     startClock = clock();
33315144b0fSOlivier Houchard     for ( i = count; i; --i ) {
33415144b0fSOlivier Houchard         function( inputs_int64[ inputNum ] );
33515144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
33615144b0fSOlivier Houchard     }
33715144b0fSOlivier Houchard     endClock = clock();
33815144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
33915144b0fSOlivier Houchard 
34015144b0fSOlivier Houchard }
34115144b0fSOlivier Houchard 
34215144b0fSOlivier Houchard #endif
34315144b0fSOlivier Houchard 
34415144b0fSOlivier Houchard #ifdef FLOAT128
34515144b0fSOlivier Houchard 
34615144b0fSOlivier Houchard static void time_a_int64_z_float128( float128 function( int64 ) )
34715144b0fSOlivier Houchard {
34815144b0fSOlivier Houchard     clock_t startClock, endClock;
34915144b0fSOlivier Houchard     int32 count, i;
35015144b0fSOlivier Houchard     int8 inputNum;
35115144b0fSOlivier Houchard 
35215144b0fSOlivier Houchard     count = 0;
35315144b0fSOlivier Houchard     inputNum = 0;
35415144b0fSOlivier Houchard     startClock = clock();
35515144b0fSOlivier Houchard     do {
35615144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
35715144b0fSOlivier Houchard             function( inputs_int64[ inputNum ] );
35815144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
35915144b0fSOlivier Houchard         }
36015144b0fSOlivier Houchard         count += minIterations;
36115144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
36215144b0fSOlivier Houchard     inputNum = 0;
36315144b0fSOlivier Houchard     startClock = clock();
36415144b0fSOlivier Houchard     for ( i = count; i; --i ) {
36515144b0fSOlivier Houchard         function( inputs_int64[ inputNum ] );
36615144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_int64 - 1 );
36715144b0fSOlivier Houchard     }
36815144b0fSOlivier Houchard     endClock = clock();
36915144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
37015144b0fSOlivier Houchard 
37115144b0fSOlivier Houchard }
37215144b0fSOlivier Houchard 
37315144b0fSOlivier Houchard #endif
37415144b0fSOlivier Houchard 
37515144b0fSOlivier Houchard enum {
37615144b0fSOlivier Houchard     numInputs_float32 = 32
37715144b0fSOlivier Houchard };
37815144b0fSOlivier Houchard 
37915144b0fSOlivier Houchard static const float32 inputs_float32[ numInputs_float32 ] = {
38015144b0fSOlivier Houchard     0x4EFA0000, 0xC1D0B328, 0x80000000, 0x3E69A31E,
38115144b0fSOlivier Houchard     0xAF803EFF, 0x3F800000, 0x17BF8000, 0xE74A301A,
38215144b0fSOlivier Houchard     0x4E010003, 0x7EE3C75D, 0xBD803FE0, 0xBFFEFF00,
38315144b0fSOlivier Houchard     0x7981F800, 0x431FFFFC, 0xC100C000, 0x3D87EFFF,
38415144b0fSOlivier Houchard     0x4103FEFE, 0xBC000007, 0xBF01F7FF, 0x4E6C6B5C,
38515144b0fSOlivier Houchard     0xC187FFFE, 0xC58B9F13, 0x4F88007F, 0xDF004007,
38615144b0fSOlivier Houchard     0xB7FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000,
38715144b0fSOlivier Houchard     0xDB428661, 0x33F89B1F, 0xA3BFEFFF, 0x537BFFBE
38815144b0fSOlivier Houchard };
38915144b0fSOlivier Houchard 
39015144b0fSOlivier Houchard static void time_a_float32_z_int32( int32 function( float32 ) )
39115144b0fSOlivier Houchard {
39215144b0fSOlivier Houchard     clock_t startClock, endClock;
39315144b0fSOlivier Houchard     int32 count, i;
39415144b0fSOlivier Houchard     int8 inputNum;
39515144b0fSOlivier Houchard 
39615144b0fSOlivier Houchard     count = 0;
39715144b0fSOlivier Houchard     inputNum = 0;
39815144b0fSOlivier Houchard     startClock = clock();
39915144b0fSOlivier Houchard     do {
40015144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
40115144b0fSOlivier Houchard             function( inputs_float32[ inputNum ] );
40215144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
40315144b0fSOlivier Houchard         }
40415144b0fSOlivier Houchard         count += minIterations;
40515144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
40615144b0fSOlivier Houchard     inputNum = 0;
40715144b0fSOlivier Houchard     startClock = clock();
40815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
40915144b0fSOlivier Houchard         function( inputs_float32[ inputNum ] );
41015144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
41115144b0fSOlivier Houchard     }
41215144b0fSOlivier Houchard     endClock = clock();
41315144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
41415144b0fSOlivier Houchard 
41515144b0fSOlivier Houchard }
41615144b0fSOlivier Houchard 
41715144b0fSOlivier Houchard static void time_a_float32_z_int64( int64 function( float32 ) )
41815144b0fSOlivier Houchard {
41915144b0fSOlivier Houchard     clock_t startClock, endClock;
42015144b0fSOlivier Houchard     int32 count, i;
42115144b0fSOlivier Houchard     int8 inputNum;
42215144b0fSOlivier Houchard 
42315144b0fSOlivier Houchard     count = 0;
42415144b0fSOlivier Houchard     inputNum = 0;
42515144b0fSOlivier Houchard     startClock = clock();
42615144b0fSOlivier Houchard     do {
42715144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
42815144b0fSOlivier Houchard             function( inputs_float32[ inputNum ] );
42915144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
43015144b0fSOlivier Houchard         }
43115144b0fSOlivier Houchard         count += minIterations;
43215144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
43315144b0fSOlivier Houchard     inputNum = 0;
43415144b0fSOlivier Houchard     startClock = clock();
43515144b0fSOlivier Houchard     for ( i = count; i; --i ) {
43615144b0fSOlivier Houchard         function( inputs_float32[ inputNum ] );
43715144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
43815144b0fSOlivier Houchard     }
43915144b0fSOlivier Houchard     endClock = clock();
44015144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
44115144b0fSOlivier Houchard 
44215144b0fSOlivier Houchard }
44315144b0fSOlivier Houchard 
44415144b0fSOlivier Houchard static void time_a_float32_z_float64( float64 function( float32 ) )
44515144b0fSOlivier Houchard {
44615144b0fSOlivier Houchard     clock_t startClock, endClock;
44715144b0fSOlivier Houchard     int32 count, i;
44815144b0fSOlivier Houchard     int8 inputNum;
44915144b0fSOlivier Houchard 
45015144b0fSOlivier Houchard     count = 0;
45115144b0fSOlivier Houchard     inputNum = 0;
45215144b0fSOlivier Houchard     startClock = clock();
45315144b0fSOlivier Houchard     do {
45415144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
45515144b0fSOlivier Houchard             function( inputs_float32[ inputNum ] );
45615144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
45715144b0fSOlivier Houchard         }
45815144b0fSOlivier Houchard         count += minIterations;
45915144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
46015144b0fSOlivier Houchard     inputNum = 0;
46115144b0fSOlivier Houchard     startClock = clock();
46215144b0fSOlivier Houchard     for ( i = count; i; --i ) {
46315144b0fSOlivier Houchard         function( inputs_float32[ inputNum ] );
46415144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
46515144b0fSOlivier Houchard     }
46615144b0fSOlivier Houchard     endClock = clock();
46715144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
46815144b0fSOlivier Houchard 
46915144b0fSOlivier Houchard }
47015144b0fSOlivier Houchard 
47115144b0fSOlivier Houchard #ifdef FLOATX80
47215144b0fSOlivier Houchard 
47315144b0fSOlivier Houchard static void time_a_float32_z_floatx80( floatx80 function( float32 ) )
47415144b0fSOlivier Houchard {
47515144b0fSOlivier Houchard     clock_t startClock, endClock;
47615144b0fSOlivier Houchard     int32 count, i;
47715144b0fSOlivier Houchard     int8 inputNum;
47815144b0fSOlivier Houchard 
47915144b0fSOlivier Houchard     count = 0;
48015144b0fSOlivier Houchard     inputNum = 0;
48115144b0fSOlivier Houchard     startClock = clock();
48215144b0fSOlivier Houchard     do {
48315144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
48415144b0fSOlivier Houchard             function( inputs_float32[ inputNum ] );
48515144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
48615144b0fSOlivier Houchard         }
48715144b0fSOlivier Houchard         count += minIterations;
48815144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
48915144b0fSOlivier Houchard     inputNum = 0;
49015144b0fSOlivier Houchard     startClock = clock();
49115144b0fSOlivier Houchard     for ( i = count; i; --i ) {
49215144b0fSOlivier Houchard         function( inputs_float32[ inputNum ] );
49315144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
49415144b0fSOlivier Houchard     }
49515144b0fSOlivier Houchard     endClock = clock();
49615144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
49715144b0fSOlivier Houchard 
49815144b0fSOlivier Houchard }
49915144b0fSOlivier Houchard 
50015144b0fSOlivier Houchard #endif
50115144b0fSOlivier Houchard 
50215144b0fSOlivier Houchard #ifdef FLOAT128
50315144b0fSOlivier Houchard 
50415144b0fSOlivier Houchard static void time_a_float32_z_float128( float128 function( float32 ) )
50515144b0fSOlivier Houchard {
50615144b0fSOlivier Houchard     clock_t startClock, endClock;
50715144b0fSOlivier Houchard     int32 count, i;
50815144b0fSOlivier Houchard     int8 inputNum;
50915144b0fSOlivier Houchard 
51015144b0fSOlivier Houchard     count = 0;
51115144b0fSOlivier Houchard     inputNum = 0;
51215144b0fSOlivier Houchard     startClock = clock();
51315144b0fSOlivier Houchard     do {
51415144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
51515144b0fSOlivier Houchard             function( inputs_float32[ inputNum ] );
51615144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
51715144b0fSOlivier Houchard         }
51815144b0fSOlivier Houchard         count += minIterations;
51915144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
52015144b0fSOlivier Houchard     inputNum = 0;
52115144b0fSOlivier Houchard     startClock = clock();
52215144b0fSOlivier Houchard     for ( i = count; i; --i ) {
52315144b0fSOlivier Houchard         function( inputs_float32[ inputNum ] );
52415144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
52515144b0fSOlivier Houchard     }
52615144b0fSOlivier Houchard     endClock = clock();
52715144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
52815144b0fSOlivier Houchard 
52915144b0fSOlivier Houchard }
53015144b0fSOlivier Houchard 
53115144b0fSOlivier Houchard #endif
53215144b0fSOlivier Houchard 
53315144b0fSOlivier Houchard static void time_az_float32( float32 function( float32 ) )
53415144b0fSOlivier Houchard {
53515144b0fSOlivier Houchard     clock_t startClock, endClock;
53615144b0fSOlivier Houchard     int32 count, i;
53715144b0fSOlivier Houchard     int8 inputNum;
53815144b0fSOlivier Houchard 
53915144b0fSOlivier Houchard     count = 0;
54015144b0fSOlivier Houchard     inputNum = 0;
54115144b0fSOlivier Houchard     startClock = clock();
54215144b0fSOlivier Houchard     do {
54315144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
54415144b0fSOlivier Houchard             function( inputs_float32[ inputNum ] );
54515144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
54615144b0fSOlivier Houchard         }
54715144b0fSOlivier Houchard         count += minIterations;
54815144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
54915144b0fSOlivier Houchard     inputNum = 0;
55015144b0fSOlivier Houchard     startClock = clock();
55115144b0fSOlivier Houchard     for ( i = count; i; --i ) {
55215144b0fSOlivier Houchard         function( inputs_float32[ inputNum ] );
55315144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
55415144b0fSOlivier Houchard     }
55515144b0fSOlivier Houchard     endClock = clock();
55615144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
55715144b0fSOlivier Houchard 
55815144b0fSOlivier Houchard }
55915144b0fSOlivier Houchard 
56015144b0fSOlivier Houchard static void time_ab_float32_z_flag( flag function( float32, float32 ) )
56115144b0fSOlivier Houchard {
56215144b0fSOlivier Houchard     clock_t startClock, endClock;
56315144b0fSOlivier Houchard     int32 count, i;
56415144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
56515144b0fSOlivier Houchard 
56615144b0fSOlivier Houchard     count = 0;
56715144b0fSOlivier Houchard     inputNumA = 0;
56815144b0fSOlivier Houchard     inputNumB = 0;
56915144b0fSOlivier Houchard     startClock = clock();
57015144b0fSOlivier Houchard     do {
57115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
57215144b0fSOlivier Houchard             function(
57315144b0fSOlivier Houchard                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
57415144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
57515144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
57615144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
57715144b0fSOlivier Houchard         }
57815144b0fSOlivier Houchard         count += minIterations;
57915144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
58015144b0fSOlivier Houchard     inputNumA = 0;
58115144b0fSOlivier Houchard     inputNumB = 0;
58215144b0fSOlivier Houchard     startClock = clock();
58315144b0fSOlivier Houchard     for ( i = count; i; --i ) {
58415144b0fSOlivier Houchard             function(
58515144b0fSOlivier Houchard                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
58615144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
58715144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
58815144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
58915144b0fSOlivier Houchard     }
59015144b0fSOlivier Houchard     endClock = clock();
59115144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
59215144b0fSOlivier Houchard 
59315144b0fSOlivier Houchard }
59415144b0fSOlivier Houchard 
59515144b0fSOlivier Houchard static void time_abz_float32( float32 function( float32, float32 ) )
59615144b0fSOlivier Houchard {
59715144b0fSOlivier Houchard     clock_t startClock, endClock;
59815144b0fSOlivier Houchard     int32 count, i;
59915144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
60015144b0fSOlivier Houchard 
60115144b0fSOlivier Houchard     count = 0;
60215144b0fSOlivier Houchard     inputNumA = 0;
60315144b0fSOlivier Houchard     inputNumB = 0;
60415144b0fSOlivier Houchard     startClock = clock();
60515144b0fSOlivier Houchard     do {
60615144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
60715144b0fSOlivier Houchard             function(
60815144b0fSOlivier Houchard                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
60915144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
61015144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
61115144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
61215144b0fSOlivier Houchard         }
61315144b0fSOlivier Houchard         count += minIterations;
61415144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
61515144b0fSOlivier Houchard     inputNumA = 0;
61615144b0fSOlivier Houchard     inputNumB = 0;
61715144b0fSOlivier Houchard     startClock = clock();
61815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
61915144b0fSOlivier Houchard             function(
62015144b0fSOlivier Houchard                 inputs_float32[ inputNumA ], inputs_float32[ inputNumB ] );
62115144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_float32 - 1 );
62215144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
62315144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_float32 - 1 );
62415144b0fSOlivier Houchard     }
62515144b0fSOlivier Houchard     endClock = clock();
62615144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
62715144b0fSOlivier Houchard 
62815144b0fSOlivier Houchard }
62915144b0fSOlivier Houchard 
63015144b0fSOlivier Houchard static const float32 inputs_float32_pos[ numInputs_float32 ] = {
63115144b0fSOlivier Houchard     0x4EFA0000, 0x41D0B328, 0x00000000, 0x3E69A31E,
63215144b0fSOlivier Houchard     0x2F803EFF, 0x3F800000, 0x17BF8000, 0x674A301A,
63315144b0fSOlivier Houchard     0x4E010003, 0x7EE3C75D, 0x3D803FE0, 0x3FFEFF00,
63415144b0fSOlivier Houchard     0x7981F800, 0x431FFFFC, 0x4100C000, 0x3D87EFFF,
63515144b0fSOlivier Houchard     0x4103FEFE, 0x3C000007, 0x3F01F7FF, 0x4E6C6B5C,
63615144b0fSOlivier Houchard     0x4187FFFE, 0x458B9F13, 0x4F88007F, 0x5F004007,
63715144b0fSOlivier Houchard     0x37FFD7FE, 0x7E8001FB, 0x46EFFBFF, 0x31C10000,
63815144b0fSOlivier Houchard     0x5B428661, 0x33F89B1F, 0x23BFEFFF, 0x537BFFBE
63915144b0fSOlivier Houchard };
64015144b0fSOlivier Houchard 
64115144b0fSOlivier Houchard static void time_az_float32_pos( float32 function( float32 ) )
64215144b0fSOlivier Houchard {
64315144b0fSOlivier Houchard     clock_t startClock, endClock;
64415144b0fSOlivier Houchard     int32 count, i;
64515144b0fSOlivier Houchard     int8 inputNum;
64615144b0fSOlivier Houchard 
64715144b0fSOlivier Houchard     count = 0;
64815144b0fSOlivier Houchard     inputNum = 0;
64915144b0fSOlivier Houchard     startClock = clock();
65015144b0fSOlivier Houchard     do {
65115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
65215144b0fSOlivier Houchard             function( inputs_float32_pos[ inputNum ] );
65315144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
65415144b0fSOlivier Houchard         }
65515144b0fSOlivier Houchard         count += minIterations;
65615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
65715144b0fSOlivier Houchard     inputNum = 0;
65815144b0fSOlivier Houchard     startClock = clock();
65915144b0fSOlivier Houchard     for ( i = count; i; --i ) {
66015144b0fSOlivier Houchard         function( inputs_float32_pos[ inputNum ] );
66115144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float32 - 1 );
66215144b0fSOlivier Houchard     }
66315144b0fSOlivier Houchard     endClock = clock();
66415144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
66515144b0fSOlivier Houchard 
66615144b0fSOlivier Houchard }
66715144b0fSOlivier Houchard 
66815144b0fSOlivier Houchard enum {
66915144b0fSOlivier Houchard     numInputs_float64 = 32
67015144b0fSOlivier Houchard };
67115144b0fSOlivier Houchard 
67215144b0fSOlivier Houchard static const float64 inputs_float64[ numInputs_float64 ] = {
67315144b0fSOlivier Houchard     LIT64( 0x422FFFC008000000 ),
67415144b0fSOlivier Houchard     LIT64( 0xB7E0000480000000 ),
67515144b0fSOlivier Houchard     LIT64( 0xF3FD2546120B7935 ),
67615144b0fSOlivier Houchard     LIT64( 0x3FF0000000000000 ),
67715144b0fSOlivier Houchard     LIT64( 0xCE07F766F09588D6 ),
67815144b0fSOlivier Houchard     LIT64( 0x8000000000000000 ),
67915144b0fSOlivier Houchard     LIT64( 0x3FCE000400000000 ),
68015144b0fSOlivier Houchard     LIT64( 0x8313B60F0032BED8 ),
68115144b0fSOlivier Houchard     LIT64( 0xC1EFFFFFC0002000 ),
68215144b0fSOlivier Houchard     LIT64( 0x3FB3C75D224F2B0F ),
68315144b0fSOlivier Houchard     LIT64( 0x7FD00000004000FF ),
68415144b0fSOlivier Houchard     LIT64( 0xA12FFF8000001FFF ),
68515144b0fSOlivier Houchard     LIT64( 0x3EE0000000FE0000 ),
68615144b0fSOlivier Houchard     LIT64( 0x0010000080000004 ),
68715144b0fSOlivier Houchard     LIT64( 0x41CFFFFE00000020 ),
68815144b0fSOlivier Houchard     LIT64( 0x40303FFFFFFFFFFD ),
68915144b0fSOlivier Houchard     LIT64( 0x3FD000003FEFFFFF ),
69015144b0fSOlivier Houchard     LIT64( 0xBFD0000010000000 ),
69115144b0fSOlivier Houchard     LIT64( 0xB7FC6B5C16CA55CF ),
69215144b0fSOlivier Houchard     LIT64( 0x413EEB940B9D1301 ),
69315144b0fSOlivier Houchard     LIT64( 0xC7E00200001FFFFF ),
69415144b0fSOlivier Houchard     LIT64( 0x47F00021FFFFFFFE ),
69515144b0fSOlivier Houchard     LIT64( 0xBFFFFFFFF80000FF ),
69615144b0fSOlivier Houchard     LIT64( 0xC07FFFFFE00FFFFF ),
69715144b0fSOlivier Houchard     LIT64( 0x001497A63740C5E8 ),
69815144b0fSOlivier Houchard     LIT64( 0xC4BFFFE0001FFFFF ),
69915144b0fSOlivier Houchard     LIT64( 0x96FFDFFEFFFFFFFF ),
70015144b0fSOlivier Houchard     LIT64( 0x403FC000000001FE ),
70115144b0fSOlivier Houchard     LIT64( 0xFFD00000000001F6 ),
70215144b0fSOlivier Houchard     LIT64( 0x0640400002000000 ),
70315144b0fSOlivier Houchard     LIT64( 0x479CEE1E4F789FE0 ),
70415144b0fSOlivier Houchard     LIT64( 0xC237FFFFFFFFFDFE )
70515144b0fSOlivier Houchard };
70615144b0fSOlivier Houchard 
70715144b0fSOlivier Houchard static void time_a_float64_z_int32( int32 function( float64 ) )
70815144b0fSOlivier Houchard {
70915144b0fSOlivier Houchard     clock_t startClock, endClock;
71015144b0fSOlivier Houchard     int32 count, i;
71115144b0fSOlivier Houchard     int8 inputNum;
71215144b0fSOlivier Houchard 
71315144b0fSOlivier Houchard     count = 0;
71415144b0fSOlivier Houchard     inputNum = 0;
71515144b0fSOlivier Houchard     startClock = clock();
71615144b0fSOlivier Houchard     do {
71715144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
71815144b0fSOlivier Houchard             function( inputs_float64[ inputNum ] );
71915144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
72015144b0fSOlivier Houchard         }
72115144b0fSOlivier Houchard         count += minIterations;
72215144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
72315144b0fSOlivier Houchard     inputNum = 0;
72415144b0fSOlivier Houchard     startClock = clock();
72515144b0fSOlivier Houchard     for ( i = count; i; --i ) {
72615144b0fSOlivier Houchard         function( inputs_float64[ inputNum ] );
72715144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
72815144b0fSOlivier Houchard     }
72915144b0fSOlivier Houchard     endClock = clock();
73015144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
73115144b0fSOlivier Houchard 
73215144b0fSOlivier Houchard }
73315144b0fSOlivier Houchard 
73415144b0fSOlivier Houchard static void time_a_float64_z_int64( int64 function( float64 ) )
73515144b0fSOlivier Houchard {
73615144b0fSOlivier Houchard     clock_t startClock, endClock;
73715144b0fSOlivier Houchard     int32 count, i;
73815144b0fSOlivier Houchard     int8 inputNum;
73915144b0fSOlivier Houchard 
74015144b0fSOlivier Houchard     count = 0;
74115144b0fSOlivier Houchard     inputNum = 0;
74215144b0fSOlivier Houchard     startClock = clock();
74315144b0fSOlivier Houchard     do {
74415144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
74515144b0fSOlivier Houchard             function( inputs_float64[ inputNum ] );
74615144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
74715144b0fSOlivier Houchard         }
74815144b0fSOlivier Houchard         count += minIterations;
74915144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
75015144b0fSOlivier Houchard     inputNum = 0;
75115144b0fSOlivier Houchard     startClock = clock();
75215144b0fSOlivier Houchard     for ( i = count; i; --i ) {
75315144b0fSOlivier Houchard         function( inputs_float64[ inputNum ] );
75415144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
75515144b0fSOlivier Houchard     }
75615144b0fSOlivier Houchard     endClock = clock();
75715144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
75815144b0fSOlivier Houchard 
75915144b0fSOlivier Houchard }
76015144b0fSOlivier Houchard 
76115144b0fSOlivier Houchard static void time_a_float64_z_float32( float32 function( float64 ) )
76215144b0fSOlivier Houchard {
76315144b0fSOlivier Houchard     clock_t startClock, endClock;
76415144b0fSOlivier Houchard     int32 count, i;
76515144b0fSOlivier Houchard     int8 inputNum;
76615144b0fSOlivier Houchard 
76715144b0fSOlivier Houchard     count = 0;
76815144b0fSOlivier Houchard     inputNum = 0;
76915144b0fSOlivier Houchard     startClock = clock();
77015144b0fSOlivier Houchard     do {
77115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
77215144b0fSOlivier Houchard             function( inputs_float64[ inputNum ] );
77315144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
77415144b0fSOlivier Houchard         }
77515144b0fSOlivier Houchard         count += minIterations;
77615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
77715144b0fSOlivier Houchard     inputNum = 0;
77815144b0fSOlivier Houchard     startClock = clock();
77915144b0fSOlivier Houchard     for ( i = count; i; --i ) {
78015144b0fSOlivier Houchard         function( inputs_float64[ inputNum ] );
78115144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
78215144b0fSOlivier Houchard     }
78315144b0fSOlivier Houchard     endClock = clock();
78415144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
78515144b0fSOlivier Houchard 
78615144b0fSOlivier Houchard }
78715144b0fSOlivier Houchard 
78815144b0fSOlivier Houchard #ifdef FLOATX80
78915144b0fSOlivier Houchard 
79015144b0fSOlivier Houchard static void time_a_float64_z_floatx80( floatx80 function( float64 ) )
79115144b0fSOlivier Houchard {
79215144b0fSOlivier Houchard     clock_t startClock, endClock;
79315144b0fSOlivier Houchard     int32 count, i;
79415144b0fSOlivier Houchard     int8 inputNum;
79515144b0fSOlivier Houchard 
79615144b0fSOlivier Houchard     count = 0;
79715144b0fSOlivier Houchard     inputNum = 0;
79815144b0fSOlivier Houchard     startClock = clock();
79915144b0fSOlivier Houchard     do {
80015144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
80115144b0fSOlivier Houchard             function( inputs_float64[ inputNum ] );
80215144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
80315144b0fSOlivier Houchard         }
80415144b0fSOlivier Houchard         count += minIterations;
80515144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
80615144b0fSOlivier Houchard     inputNum = 0;
80715144b0fSOlivier Houchard     startClock = clock();
80815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
80915144b0fSOlivier Houchard         function( inputs_float64[ inputNum ] );
81015144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
81115144b0fSOlivier Houchard     }
81215144b0fSOlivier Houchard     endClock = clock();
81315144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
81415144b0fSOlivier Houchard 
81515144b0fSOlivier Houchard }
81615144b0fSOlivier Houchard 
81715144b0fSOlivier Houchard #endif
81815144b0fSOlivier Houchard 
81915144b0fSOlivier Houchard #ifdef FLOAT128
82015144b0fSOlivier Houchard 
82115144b0fSOlivier Houchard static void time_a_float64_z_float128( float128 function( float64 ) )
82215144b0fSOlivier Houchard {
82315144b0fSOlivier Houchard     clock_t startClock, endClock;
82415144b0fSOlivier Houchard     int32 count, i;
82515144b0fSOlivier Houchard     int8 inputNum;
82615144b0fSOlivier Houchard 
82715144b0fSOlivier Houchard     count = 0;
82815144b0fSOlivier Houchard     inputNum = 0;
82915144b0fSOlivier Houchard     startClock = clock();
83015144b0fSOlivier Houchard     do {
83115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
83215144b0fSOlivier Houchard             function( inputs_float64[ inputNum ] );
83315144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
83415144b0fSOlivier Houchard         }
83515144b0fSOlivier Houchard         count += minIterations;
83615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
83715144b0fSOlivier Houchard     inputNum = 0;
83815144b0fSOlivier Houchard     startClock = clock();
83915144b0fSOlivier Houchard     for ( i = count; i; --i ) {
84015144b0fSOlivier Houchard         function( inputs_float64[ inputNum ] );
84115144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
84215144b0fSOlivier Houchard     }
84315144b0fSOlivier Houchard     endClock = clock();
84415144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
84515144b0fSOlivier Houchard 
84615144b0fSOlivier Houchard }
84715144b0fSOlivier Houchard 
84815144b0fSOlivier Houchard #endif
84915144b0fSOlivier Houchard 
85015144b0fSOlivier Houchard static void time_az_float64( float64 function( float64 ) )
85115144b0fSOlivier Houchard {
85215144b0fSOlivier Houchard     clock_t startClock, endClock;
85315144b0fSOlivier Houchard     int32 count, i;
85415144b0fSOlivier Houchard     int8 inputNum;
85515144b0fSOlivier Houchard 
85615144b0fSOlivier Houchard     count = 0;
85715144b0fSOlivier Houchard     inputNum = 0;
85815144b0fSOlivier Houchard     startClock = clock();
85915144b0fSOlivier Houchard     do {
86015144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
86115144b0fSOlivier Houchard             function( inputs_float64[ inputNum ] );
86215144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
86315144b0fSOlivier Houchard         }
86415144b0fSOlivier Houchard         count += minIterations;
86515144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
86615144b0fSOlivier Houchard     inputNum = 0;
86715144b0fSOlivier Houchard     startClock = clock();
86815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
86915144b0fSOlivier Houchard         function( inputs_float64[ inputNum ] );
87015144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
87115144b0fSOlivier Houchard     }
87215144b0fSOlivier Houchard     endClock = clock();
87315144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
87415144b0fSOlivier Houchard 
87515144b0fSOlivier Houchard }
87615144b0fSOlivier Houchard 
87715144b0fSOlivier Houchard static void time_ab_float64_z_flag( flag function( float64, float64 ) )
87815144b0fSOlivier Houchard {
87915144b0fSOlivier Houchard     clock_t startClock, endClock;
88015144b0fSOlivier Houchard     int32 count, i;
88115144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
88215144b0fSOlivier Houchard 
88315144b0fSOlivier Houchard     count = 0;
88415144b0fSOlivier Houchard     inputNumA = 0;
88515144b0fSOlivier Houchard     inputNumB = 0;
88615144b0fSOlivier Houchard     startClock = clock();
88715144b0fSOlivier Houchard     do {
88815144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
88915144b0fSOlivier Houchard             function(
89015144b0fSOlivier Houchard                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
89115144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
89215144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
89315144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
89415144b0fSOlivier Houchard         }
89515144b0fSOlivier Houchard         count += minIterations;
89615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
89715144b0fSOlivier Houchard     inputNumA = 0;
89815144b0fSOlivier Houchard     inputNumB = 0;
89915144b0fSOlivier Houchard     startClock = clock();
90015144b0fSOlivier Houchard     for ( i = count; i; --i ) {
90115144b0fSOlivier Houchard             function(
90215144b0fSOlivier Houchard                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
90315144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
90415144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
90515144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
90615144b0fSOlivier Houchard     }
90715144b0fSOlivier Houchard     endClock = clock();
90815144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
90915144b0fSOlivier Houchard 
91015144b0fSOlivier Houchard }
91115144b0fSOlivier Houchard 
91215144b0fSOlivier Houchard static void time_abz_float64( float64 function( float64, float64 ) )
91315144b0fSOlivier Houchard {
91415144b0fSOlivier Houchard     clock_t startClock, endClock;
91515144b0fSOlivier Houchard     int32 count, i;
91615144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
91715144b0fSOlivier Houchard 
91815144b0fSOlivier Houchard     count = 0;
91915144b0fSOlivier Houchard     inputNumA = 0;
92015144b0fSOlivier Houchard     inputNumB = 0;
92115144b0fSOlivier Houchard     startClock = clock();
92215144b0fSOlivier Houchard     do {
92315144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
92415144b0fSOlivier Houchard             function(
92515144b0fSOlivier Houchard                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
92615144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
92715144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
92815144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
92915144b0fSOlivier Houchard         }
93015144b0fSOlivier Houchard         count += minIterations;
93115144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
93215144b0fSOlivier Houchard     inputNumA = 0;
93315144b0fSOlivier Houchard     inputNumB = 0;
93415144b0fSOlivier Houchard     startClock = clock();
93515144b0fSOlivier Houchard     for ( i = count; i; --i ) {
93615144b0fSOlivier Houchard             function(
93715144b0fSOlivier Houchard                 inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
93815144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
93915144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
94015144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
94115144b0fSOlivier Houchard     }
94215144b0fSOlivier Houchard     endClock = clock();
94315144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
94415144b0fSOlivier Houchard 
94515144b0fSOlivier Houchard }
94615144b0fSOlivier Houchard 
94715144b0fSOlivier Houchard static const float64 inputs_float64_pos[ numInputs_float64 ] = {
94815144b0fSOlivier Houchard     LIT64( 0x422FFFC008000000 ),
94915144b0fSOlivier Houchard     LIT64( 0x37E0000480000000 ),
95015144b0fSOlivier Houchard     LIT64( 0x73FD2546120B7935 ),
95115144b0fSOlivier Houchard     LIT64( 0x3FF0000000000000 ),
95215144b0fSOlivier Houchard     LIT64( 0x4E07F766F09588D6 ),
95315144b0fSOlivier Houchard     LIT64( 0x0000000000000000 ),
95415144b0fSOlivier Houchard     LIT64( 0x3FCE000400000000 ),
95515144b0fSOlivier Houchard     LIT64( 0x0313B60F0032BED8 ),
95615144b0fSOlivier Houchard     LIT64( 0x41EFFFFFC0002000 ),
95715144b0fSOlivier Houchard     LIT64( 0x3FB3C75D224F2B0F ),
95815144b0fSOlivier Houchard     LIT64( 0x7FD00000004000FF ),
95915144b0fSOlivier Houchard     LIT64( 0x212FFF8000001FFF ),
96015144b0fSOlivier Houchard     LIT64( 0x3EE0000000FE0000 ),
96115144b0fSOlivier Houchard     LIT64( 0x0010000080000004 ),
96215144b0fSOlivier Houchard     LIT64( 0x41CFFFFE00000020 ),
96315144b0fSOlivier Houchard     LIT64( 0x40303FFFFFFFFFFD ),
96415144b0fSOlivier Houchard     LIT64( 0x3FD000003FEFFFFF ),
96515144b0fSOlivier Houchard     LIT64( 0x3FD0000010000000 ),
96615144b0fSOlivier Houchard     LIT64( 0x37FC6B5C16CA55CF ),
96715144b0fSOlivier Houchard     LIT64( 0x413EEB940B9D1301 ),
96815144b0fSOlivier Houchard     LIT64( 0x47E00200001FFFFF ),
96915144b0fSOlivier Houchard     LIT64( 0x47F00021FFFFFFFE ),
97015144b0fSOlivier Houchard     LIT64( 0x3FFFFFFFF80000FF ),
97115144b0fSOlivier Houchard     LIT64( 0x407FFFFFE00FFFFF ),
97215144b0fSOlivier Houchard     LIT64( 0x001497A63740C5E8 ),
97315144b0fSOlivier Houchard     LIT64( 0x44BFFFE0001FFFFF ),
97415144b0fSOlivier Houchard     LIT64( 0x16FFDFFEFFFFFFFF ),
97515144b0fSOlivier Houchard     LIT64( 0x403FC000000001FE ),
97615144b0fSOlivier Houchard     LIT64( 0x7FD00000000001F6 ),
97715144b0fSOlivier Houchard     LIT64( 0x0640400002000000 ),
97815144b0fSOlivier Houchard     LIT64( 0x479CEE1E4F789FE0 ),
97915144b0fSOlivier Houchard     LIT64( 0x4237FFFFFFFFFDFE )
98015144b0fSOlivier Houchard };
98115144b0fSOlivier Houchard 
98215144b0fSOlivier Houchard static void time_az_float64_pos( float64 function( float64 ) )
98315144b0fSOlivier Houchard {
98415144b0fSOlivier Houchard     clock_t startClock, endClock;
98515144b0fSOlivier Houchard     int32 count, i;
98615144b0fSOlivier Houchard     int8 inputNum;
98715144b0fSOlivier Houchard 
98815144b0fSOlivier Houchard     count = 0;
98915144b0fSOlivier Houchard     inputNum = 0;
99015144b0fSOlivier Houchard     startClock = clock();
99115144b0fSOlivier Houchard     do {
99215144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
99315144b0fSOlivier Houchard             function( inputs_float64_pos[ inputNum ] );
99415144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
99515144b0fSOlivier Houchard         }
99615144b0fSOlivier Houchard         count += minIterations;
99715144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
99815144b0fSOlivier Houchard     inputNum = 0;
99915144b0fSOlivier Houchard     startClock = clock();
100015144b0fSOlivier Houchard     for ( i = count; i; --i ) {
100115144b0fSOlivier Houchard         function( inputs_float64_pos[ inputNum ] );
100215144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
100315144b0fSOlivier Houchard     }
100415144b0fSOlivier Houchard     endClock = clock();
100515144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
100615144b0fSOlivier Houchard 
100715144b0fSOlivier Houchard }
100815144b0fSOlivier Houchard 
100915144b0fSOlivier Houchard #ifdef FLOATX80
101015144b0fSOlivier Houchard 
101115144b0fSOlivier Houchard enum {
101215144b0fSOlivier Houchard     numInputs_floatx80 = 32
101315144b0fSOlivier Houchard };
101415144b0fSOlivier Houchard 
101515144b0fSOlivier Houchard static const struct {
101615144b0fSOlivier Houchard     bits16 high;
101715144b0fSOlivier Houchard     bits64 low;
101815144b0fSOlivier Houchard } inputs_floatx80[ numInputs_floatx80 ] = {
101915144b0fSOlivier Houchard     { 0xC03F, LIT64( 0xA9BE15A19C1E8B62 ) },
102015144b0fSOlivier Houchard     { 0x8000, LIT64( 0x0000000000000000 ) },
102115144b0fSOlivier Houchard     { 0x75A8, LIT64( 0xE59591E4788957A5 ) },
102215144b0fSOlivier Houchard     { 0xBFFF, LIT64( 0xFFF0000000000040 ) },
102315144b0fSOlivier Houchard     { 0x0CD8, LIT64( 0xFC000000000007FE ) },
102415144b0fSOlivier Houchard     { 0x43BA, LIT64( 0x99A4000000000000 ) },
102515144b0fSOlivier Houchard     { 0x3FFF, LIT64( 0x8000000000000000 ) },
102615144b0fSOlivier Houchard     { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) },
102715144b0fSOlivier Houchard     { 0x403E, LIT64( 0xFFF0000000002000 ) },
102815144b0fSOlivier Houchard     { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) },
102915144b0fSOlivier Houchard     { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) },
103015144b0fSOlivier Houchard     { 0x737A, LIT64( 0x800000007FFDFFFE ) },
103115144b0fSOlivier Houchard     { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) },
103215144b0fSOlivier Houchard     { 0xBBFE, LIT64( 0x8000040000001FFE ) },
103315144b0fSOlivier Houchard     { 0xC002, LIT64( 0xFF80000000000020 ) },
103415144b0fSOlivier Houchard     { 0xDE8D, LIT64( 0xFFFFFFFFFFE00004 ) },
103515144b0fSOlivier Houchard     { 0xC004, LIT64( 0x8000000000003FFB ) },
103615144b0fSOlivier Houchard     { 0x407F, LIT64( 0x800000000003FFFE ) },
103715144b0fSOlivier Houchard     { 0xC000, LIT64( 0xA459EE6A5C16CA55 ) },
103815144b0fSOlivier Houchard     { 0x8003, LIT64( 0xC42CBF7399AEEB94 ) },
103915144b0fSOlivier Houchard     { 0xBF7F, LIT64( 0xF800000000000006 ) },
104015144b0fSOlivier Houchard     { 0xC07F, LIT64( 0xBF56BE8871F28FEA ) },
104115144b0fSOlivier Houchard     { 0xC07E, LIT64( 0xFFFF77FFFFFFFFFE ) },
104215144b0fSOlivier Houchard     { 0xADC9, LIT64( 0x8000000FFFFFFFDE ) },
104315144b0fSOlivier Houchard     { 0xC001, LIT64( 0xEFF7FFFFFFFFFFFF ) },
104415144b0fSOlivier Houchard     { 0x4001, LIT64( 0xBE84F30125C497A6 ) },
104515144b0fSOlivier Houchard     { 0xC06B, LIT64( 0xEFFFFFFFFFFFFFFF ) },
104615144b0fSOlivier Houchard     { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) },
104715144b0fSOlivier Houchard     { 0x87E9, LIT64( 0x81FFFFFFFFFFFBFF ) },
104815144b0fSOlivier Houchard     { 0xA63F, LIT64( 0x801FFFFFFEFFFFFE ) },
104915144b0fSOlivier Houchard     { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) },
105015144b0fSOlivier Houchard     { 0x4018, LIT64( 0x8000000000080003 ) }
105115144b0fSOlivier Houchard };
105215144b0fSOlivier Houchard 
105315144b0fSOlivier Houchard static void time_a_floatx80_z_int32( int32 function( floatx80 ) )
105415144b0fSOlivier Houchard {
105515144b0fSOlivier Houchard     clock_t startClock, endClock;
105615144b0fSOlivier Houchard     int32 count, i;
105715144b0fSOlivier Houchard     int8 inputNum;
105815144b0fSOlivier Houchard     floatx80 a;
105915144b0fSOlivier Houchard 
106015144b0fSOlivier Houchard     count = 0;
106115144b0fSOlivier Houchard     inputNum = 0;
106215144b0fSOlivier Houchard     startClock = clock();
106315144b0fSOlivier Houchard     do {
106415144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
106515144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNum ].low;
106615144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNum ].high;
106715144b0fSOlivier Houchard             function( a );
106815144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
106915144b0fSOlivier Houchard         }
107015144b0fSOlivier Houchard         count += minIterations;
107115144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
107215144b0fSOlivier Houchard     inputNum = 0;
107315144b0fSOlivier Houchard     startClock = clock();
107415144b0fSOlivier Houchard     for ( i = count; i; --i ) {
107515144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNum ].low;
107615144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNum ].high;
107715144b0fSOlivier Houchard         function( a );
107815144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
107915144b0fSOlivier Houchard     }
108015144b0fSOlivier Houchard     endClock = clock();
108115144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
108215144b0fSOlivier Houchard 
108315144b0fSOlivier Houchard }
108415144b0fSOlivier Houchard 
108515144b0fSOlivier Houchard static void time_a_floatx80_z_int64( int64 function( floatx80 ) )
108615144b0fSOlivier Houchard {
108715144b0fSOlivier Houchard     clock_t startClock, endClock;
108815144b0fSOlivier Houchard     int32 count, i;
108915144b0fSOlivier Houchard     int8 inputNum;
109015144b0fSOlivier Houchard     floatx80 a;
109115144b0fSOlivier Houchard 
109215144b0fSOlivier Houchard     count = 0;
109315144b0fSOlivier Houchard     inputNum = 0;
109415144b0fSOlivier Houchard     startClock = clock();
109515144b0fSOlivier Houchard     do {
109615144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
109715144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNum ].low;
109815144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNum ].high;
109915144b0fSOlivier Houchard             function( a );
110015144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
110115144b0fSOlivier Houchard         }
110215144b0fSOlivier Houchard         count += minIterations;
110315144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
110415144b0fSOlivier Houchard     inputNum = 0;
110515144b0fSOlivier Houchard     startClock = clock();
110615144b0fSOlivier Houchard     for ( i = count; i; --i ) {
110715144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNum ].low;
110815144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNum ].high;
110915144b0fSOlivier Houchard         function( a );
111015144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
111115144b0fSOlivier Houchard     }
111215144b0fSOlivier Houchard     endClock = clock();
111315144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
111415144b0fSOlivier Houchard 
111515144b0fSOlivier Houchard }
111615144b0fSOlivier Houchard 
111715144b0fSOlivier Houchard static void time_a_floatx80_z_float32( float32 function( floatx80 ) )
111815144b0fSOlivier Houchard {
111915144b0fSOlivier Houchard     clock_t startClock, endClock;
112015144b0fSOlivier Houchard     int32 count, i;
112115144b0fSOlivier Houchard     int8 inputNum;
112215144b0fSOlivier Houchard     floatx80 a;
112315144b0fSOlivier Houchard 
112415144b0fSOlivier Houchard     count = 0;
112515144b0fSOlivier Houchard     inputNum = 0;
112615144b0fSOlivier Houchard     startClock = clock();
112715144b0fSOlivier Houchard     do {
112815144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
112915144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNum ].low;
113015144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNum ].high;
113115144b0fSOlivier Houchard             function( a );
113215144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
113315144b0fSOlivier Houchard         }
113415144b0fSOlivier Houchard         count += minIterations;
113515144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
113615144b0fSOlivier Houchard     inputNum = 0;
113715144b0fSOlivier Houchard     startClock = clock();
113815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
113915144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNum ].low;
114015144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNum ].high;
114115144b0fSOlivier Houchard         function( a );
114215144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
114315144b0fSOlivier Houchard     }
114415144b0fSOlivier Houchard     endClock = clock();
114515144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
114615144b0fSOlivier Houchard 
114715144b0fSOlivier Houchard }
114815144b0fSOlivier Houchard 
114915144b0fSOlivier Houchard static void time_a_floatx80_z_float64( float64 function( floatx80 ) )
115015144b0fSOlivier Houchard {
115115144b0fSOlivier Houchard     clock_t startClock, endClock;
115215144b0fSOlivier Houchard     int32 count, i;
115315144b0fSOlivier Houchard     int8 inputNum;
115415144b0fSOlivier Houchard     floatx80 a;
115515144b0fSOlivier Houchard 
115615144b0fSOlivier Houchard     count = 0;
115715144b0fSOlivier Houchard     inputNum = 0;
115815144b0fSOlivier Houchard     startClock = clock();
115915144b0fSOlivier Houchard     do {
116015144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
116115144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNum ].low;
116215144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNum ].high;
116315144b0fSOlivier Houchard             function( a );
116415144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
116515144b0fSOlivier Houchard         }
116615144b0fSOlivier Houchard         count += minIterations;
116715144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
116815144b0fSOlivier Houchard     inputNum = 0;
116915144b0fSOlivier Houchard     startClock = clock();
117015144b0fSOlivier Houchard     for ( i = count; i; --i ) {
117115144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNum ].low;
117215144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNum ].high;
117315144b0fSOlivier Houchard         function( a );
117415144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
117515144b0fSOlivier Houchard     }
117615144b0fSOlivier Houchard     endClock = clock();
117715144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
117815144b0fSOlivier Houchard 
117915144b0fSOlivier Houchard }
118015144b0fSOlivier Houchard 
118115144b0fSOlivier Houchard #ifdef FLOAT128
118215144b0fSOlivier Houchard 
118315144b0fSOlivier Houchard static void time_a_floatx80_z_float128( float128 function( floatx80 ) )
118415144b0fSOlivier Houchard {
118515144b0fSOlivier Houchard     clock_t startClock, endClock;
118615144b0fSOlivier Houchard     int32 count, i;
118715144b0fSOlivier Houchard     int8 inputNum;
118815144b0fSOlivier Houchard     floatx80 a;
118915144b0fSOlivier Houchard 
119015144b0fSOlivier Houchard     count = 0;
119115144b0fSOlivier Houchard     inputNum = 0;
119215144b0fSOlivier Houchard     startClock = clock();
119315144b0fSOlivier Houchard     do {
119415144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
119515144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNum ].low;
119615144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNum ].high;
119715144b0fSOlivier Houchard             function( a );
119815144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
119915144b0fSOlivier Houchard         }
120015144b0fSOlivier Houchard         count += minIterations;
120115144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
120215144b0fSOlivier Houchard     inputNum = 0;
120315144b0fSOlivier Houchard     startClock = clock();
120415144b0fSOlivier Houchard     for ( i = count; i; --i ) {
120515144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNum ].low;
120615144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNum ].high;
120715144b0fSOlivier Houchard         function( a );
120815144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
120915144b0fSOlivier Houchard     }
121015144b0fSOlivier Houchard     endClock = clock();
121115144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
121215144b0fSOlivier Houchard 
121315144b0fSOlivier Houchard }
121415144b0fSOlivier Houchard 
121515144b0fSOlivier Houchard #endif
121615144b0fSOlivier Houchard 
121715144b0fSOlivier Houchard static void time_az_floatx80( floatx80 function( floatx80 ) )
121815144b0fSOlivier Houchard {
121915144b0fSOlivier Houchard     clock_t startClock, endClock;
122015144b0fSOlivier Houchard     int32 count, i;
122115144b0fSOlivier Houchard     int8 inputNum;
122215144b0fSOlivier Houchard     floatx80 a;
122315144b0fSOlivier Houchard 
122415144b0fSOlivier Houchard     count = 0;
122515144b0fSOlivier Houchard     inputNum = 0;
122615144b0fSOlivier Houchard     startClock = clock();
122715144b0fSOlivier Houchard     do {
122815144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
122915144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNum ].low;
123015144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNum ].high;
123115144b0fSOlivier Houchard             function( a );
123215144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
123315144b0fSOlivier Houchard         }
123415144b0fSOlivier Houchard         count += minIterations;
123515144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
123615144b0fSOlivier Houchard     inputNum = 0;
123715144b0fSOlivier Houchard     startClock = clock();
123815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
123915144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNum ].low;
124015144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNum ].high;
124115144b0fSOlivier Houchard         function( a );
124215144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
124315144b0fSOlivier Houchard     }
124415144b0fSOlivier Houchard     endClock = clock();
124515144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
124615144b0fSOlivier Houchard 
124715144b0fSOlivier Houchard }
124815144b0fSOlivier Houchard 
124915144b0fSOlivier Houchard static void time_ab_floatx80_z_flag( flag function( floatx80, floatx80 ) )
125015144b0fSOlivier Houchard {
125115144b0fSOlivier Houchard     clock_t startClock, endClock;
125215144b0fSOlivier Houchard     int32 count, i;
125315144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
125415144b0fSOlivier Houchard     floatx80 a, b;
125515144b0fSOlivier Houchard 
125615144b0fSOlivier Houchard     count = 0;
125715144b0fSOlivier Houchard     inputNumA = 0;
125815144b0fSOlivier Houchard     inputNumB = 0;
125915144b0fSOlivier Houchard     startClock = clock();
126015144b0fSOlivier Houchard     do {
126115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
126215144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNumA ].low;
126315144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNumA ].high;
126415144b0fSOlivier Houchard             b.low = inputs_floatx80[ inputNumB ].low;
126515144b0fSOlivier Houchard             b.high = inputs_floatx80[ inputNumB ].high;
126615144b0fSOlivier Houchard             function( a, b );
126715144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
126815144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
126915144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
127015144b0fSOlivier Houchard         }
127115144b0fSOlivier Houchard         count += minIterations;
127215144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
127315144b0fSOlivier Houchard     inputNumA = 0;
127415144b0fSOlivier Houchard     inputNumB = 0;
127515144b0fSOlivier Houchard     startClock = clock();
127615144b0fSOlivier Houchard     for ( i = count; i; --i ) {
127715144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNumA ].low;
127815144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNumA ].high;
127915144b0fSOlivier Houchard         b.low = inputs_floatx80[ inputNumB ].low;
128015144b0fSOlivier Houchard         b.high = inputs_floatx80[ inputNumB ].high;
128115144b0fSOlivier Houchard         function( a, b );
128215144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
128315144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
128415144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
128515144b0fSOlivier Houchard     }
128615144b0fSOlivier Houchard     endClock = clock();
128715144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
128815144b0fSOlivier Houchard 
128915144b0fSOlivier Houchard }
129015144b0fSOlivier Houchard 
129115144b0fSOlivier Houchard static void time_abz_floatx80( floatx80 function( floatx80, floatx80 ) )
129215144b0fSOlivier Houchard {
129315144b0fSOlivier Houchard     clock_t startClock, endClock;
129415144b0fSOlivier Houchard     int32 count, i;
129515144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
129615144b0fSOlivier Houchard     floatx80 a, b;
129715144b0fSOlivier Houchard 
129815144b0fSOlivier Houchard     count = 0;
129915144b0fSOlivier Houchard     inputNumA = 0;
130015144b0fSOlivier Houchard     inputNumB = 0;
130115144b0fSOlivier Houchard     startClock = clock();
130215144b0fSOlivier Houchard     do {
130315144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
130415144b0fSOlivier Houchard             a.low = inputs_floatx80[ inputNumA ].low;
130515144b0fSOlivier Houchard             a.high = inputs_floatx80[ inputNumA ].high;
130615144b0fSOlivier Houchard             b.low = inputs_floatx80[ inputNumB ].low;
130715144b0fSOlivier Houchard             b.high = inputs_floatx80[ inputNumB ].high;
130815144b0fSOlivier Houchard             function( a, b );
130915144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
131015144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
131115144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
131215144b0fSOlivier Houchard         }
131315144b0fSOlivier Houchard         count += minIterations;
131415144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
131515144b0fSOlivier Houchard     inputNumA = 0;
131615144b0fSOlivier Houchard     inputNumB = 0;
131715144b0fSOlivier Houchard     startClock = clock();
131815144b0fSOlivier Houchard     for ( i = count; i; --i ) {
131915144b0fSOlivier Houchard         a.low = inputs_floatx80[ inputNumA ].low;
132015144b0fSOlivier Houchard         a.high = inputs_floatx80[ inputNumA ].high;
132115144b0fSOlivier Houchard         b.low = inputs_floatx80[ inputNumB ].low;
132215144b0fSOlivier Houchard         b.high = inputs_floatx80[ inputNumB ].high;
132315144b0fSOlivier Houchard         function( a, b );
132415144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_floatx80 - 1 );
132515144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
132615144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_floatx80 - 1 );
132715144b0fSOlivier Houchard     }
132815144b0fSOlivier Houchard     endClock = clock();
132915144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
133015144b0fSOlivier Houchard 
133115144b0fSOlivier Houchard }
133215144b0fSOlivier Houchard 
133315144b0fSOlivier Houchard static const struct {
133415144b0fSOlivier Houchard     bits16 high;
133515144b0fSOlivier Houchard     bits64 low;
133615144b0fSOlivier Houchard } inputs_floatx80_pos[ numInputs_floatx80 ] = {
133715144b0fSOlivier Houchard     { 0x403F, LIT64( 0xA9BE15A19C1E8B62 ) },
133815144b0fSOlivier Houchard     { 0x0000, LIT64( 0x0000000000000000 ) },
133915144b0fSOlivier Houchard     { 0x75A8, LIT64( 0xE59591E4788957A5 ) },
134015144b0fSOlivier Houchard     { 0x3FFF, LIT64( 0xFFF0000000000040 ) },
134115144b0fSOlivier Houchard     { 0x0CD8, LIT64( 0xFC000000000007FE ) },
134215144b0fSOlivier Houchard     { 0x43BA, LIT64( 0x99A4000000000000 ) },
134315144b0fSOlivier Houchard     { 0x3FFF, LIT64( 0x8000000000000000 ) },
134415144b0fSOlivier Houchard     { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) },
134515144b0fSOlivier Houchard     { 0x403E, LIT64( 0xFFF0000000002000 ) },
134615144b0fSOlivier Houchard     { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) },
134715144b0fSOlivier Houchard     { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) },
134815144b0fSOlivier Houchard     { 0x737A, LIT64( 0x800000007FFDFFFE ) },
134915144b0fSOlivier Houchard     { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) },
135015144b0fSOlivier Houchard     { 0x3BFE, LIT64( 0x8000040000001FFE ) },
135115144b0fSOlivier Houchard     { 0x4002, LIT64( 0xFF80000000000020 ) },
135215144b0fSOlivier Houchard     { 0x5E8D, LIT64( 0xFFFFFFFFFFE00004 ) },
135315144b0fSOlivier Houchard     { 0x4004, LIT64( 0x8000000000003FFB ) },
135415144b0fSOlivier Houchard     { 0x407F, LIT64( 0x800000000003FFFE ) },
135515144b0fSOlivier Houchard     { 0x4000, LIT64( 0xA459EE6A5C16CA55 ) },
135615144b0fSOlivier Houchard     { 0x0003, LIT64( 0xC42CBF7399AEEB94 ) },
135715144b0fSOlivier Houchard     { 0x3F7F, LIT64( 0xF800000000000006 ) },
135815144b0fSOlivier Houchard     { 0x407F, LIT64( 0xBF56BE8871F28FEA ) },
135915144b0fSOlivier Houchard     { 0x407E, LIT64( 0xFFFF77FFFFFFFFFE ) },
136015144b0fSOlivier Houchard     { 0x2DC9, LIT64( 0x8000000FFFFFFFDE ) },
136115144b0fSOlivier Houchard     { 0x4001, LIT64( 0xEFF7FFFFFFFFFFFF ) },
136215144b0fSOlivier Houchard     { 0x4001, LIT64( 0xBE84F30125C497A6 ) },
136315144b0fSOlivier Houchard     { 0x406B, LIT64( 0xEFFFFFFFFFFFFFFF ) },
136415144b0fSOlivier Houchard     { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) },
136515144b0fSOlivier Houchard     { 0x07E9, LIT64( 0x81FFFFFFFFFFFBFF ) },
136615144b0fSOlivier Houchard     { 0x263F, LIT64( 0x801FFFFFFEFFFFFE ) },
136715144b0fSOlivier Houchard     { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) },
136815144b0fSOlivier Houchard     { 0x4018, LIT64( 0x8000000000080003 ) }
136915144b0fSOlivier Houchard };
137015144b0fSOlivier Houchard 
137115144b0fSOlivier Houchard static void time_az_floatx80_pos( floatx80 function( floatx80 ) )
137215144b0fSOlivier Houchard {
137315144b0fSOlivier Houchard     clock_t startClock, endClock;
137415144b0fSOlivier Houchard     int32 count, i;
137515144b0fSOlivier Houchard     int8 inputNum;
137615144b0fSOlivier Houchard     floatx80 a;
137715144b0fSOlivier Houchard 
137815144b0fSOlivier Houchard     count = 0;
137915144b0fSOlivier Houchard     inputNum = 0;
138015144b0fSOlivier Houchard     startClock = clock();
138115144b0fSOlivier Houchard     do {
138215144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
138315144b0fSOlivier Houchard             a.low = inputs_floatx80_pos[ inputNum ].low;
138415144b0fSOlivier Houchard             a.high = inputs_floatx80_pos[ inputNum ].high;
138515144b0fSOlivier Houchard             function( a );
138615144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
138715144b0fSOlivier Houchard         }
138815144b0fSOlivier Houchard         count += minIterations;
138915144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
139015144b0fSOlivier Houchard     inputNum = 0;
139115144b0fSOlivier Houchard     startClock = clock();
139215144b0fSOlivier Houchard     for ( i = count; i; --i ) {
139315144b0fSOlivier Houchard         a.low = inputs_floatx80_pos[ inputNum ].low;
139415144b0fSOlivier Houchard         a.high = inputs_floatx80_pos[ inputNum ].high;
139515144b0fSOlivier Houchard         function( a );
139615144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
139715144b0fSOlivier Houchard     }
139815144b0fSOlivier Houchard     endClock = clock();
139915144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
140015144b0fSOlivier Houchard 
140115144b0fSOlivier Houchard }
140215144b0fSOlivier Houchard 
140315144b0fSOlivier Houchard #endif
140415144b0fSOlivier Houchard 
140515144b0fSOlivier Houchard #ifdef FLOAT128
140615144b0fSOlivier Houchard 
140715144b0fSOlivier Houchard enum {
140815144b0fSOlivier Houchard     numInputs_float128 = 32
140915144b0fSOlivier Houchard };
141015144b0fSOlivier Houchard 
141115144b0fSOlivier Houchard static const struct {
141215144b0fSOlivier Houchard     bits64 high, low;
141315144b0fSOlivier Houchard } inputs_float128[ numInputs_float128 ] = {
141415144b0fSOlivier Houchard     { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) },
141515144b0fSOlivier Houchard     { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) },
141615144b0fSOlivier Houchard     { LIT64( 0x85F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) },
141715144b0fSOlivier Houchard     { LIT64( 0xF2B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) },
141815144b0fSOlivier Houchard     { LIT64( 0x8000000000000000 ), LIT64( 0x0000000000000000 ) },
141915144b0fSOlivier Houchard     { LIT64( 0xBFFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) },
142015144b0fSOlivier Houchard     { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) },
142115144b0fSOlivier Houchard     { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) },
142215144b0fSOlivier Houchard     { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) },
142315144b0fSOlivier Houchard     { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) },
142415144b0fSOlivier Houchard     { LIT64( 0xBF7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) },
142515144b0fSOlivier Houchard     { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) },
142615144b0fSOlivier Houchard     { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) },
142715144b0fSOlivier Houchard     { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) },
142815144b0fSOlivier Houchard     { LIT64( 0xBFFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) },
142915144b0fSOlivier Houchard     { LIT64( 0xBDB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) },
143015144b0fSOlivier Houchard     { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) },
143115144b0fSOlivier Houchard     { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) },
143215144b0fSOlivier Houchard     { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) },
143315144b0fSOlivier Houchard     { LIT64( 0x8001000000000000 ), LIT64( 0x0000001000000001 ) },
143415144b0fSOlivier Houchard     { LIT64( 0xC036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) },
143515144b0fSOlivier Houchard     { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) },
143615144b0fSOlivier Houchard     { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) },
143715144b0fSOlivier Houchard     { LIT64( 0xBFFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) },
143815144b0fSOlivier Houchard     { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) },
143915144b0fSOlivier Houchard     { LIT64( 0xB5CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) },
144015144b0fSOlivier Houchard     { LIT64( 0xE228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) },
144115144b0fSOlivier Houchard     { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) },
144215144b0fSOlivier Houchard     { LIT64( 0xC1AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) },
144315144b0fSOlivier Houchard     { LIT64( 0xC96F000000000000 ), LIT64( 0x00000001FFFBFFFF ) },
144415144b0fSOlivier Houchard     { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) },
144515144b0fSOlivier Houchard     { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) }
144615144b0fSOlivier Houchard };
144715144b0fSOlivier Houchard 
144815144b0fSOlivier Houchard static void time_a_float128_z_int32( int32 function( float128 ) )
144915144b0fSOlivier Houchard {
145015144b0fSOlivier Houchard     clock_t startClock, endClock;
145115144b0fSOlivier Houchard     int32 count, i;
145215144b0fSOlivier Houchard     int8 inputNum;
145315144b0fSOlivier Houchard     float128 a;
145415144b0fSOlivier Houchard 
145515144b0fSOlivier Houchard     count = 0;
145615144b0fSOlivier Houchard     inputNum = 0;
145715144b0fSOlivier Houchard     startClock = clock();
145815144b0fSOlivier Houchard     do {
145915144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
146015144b0fSOlivier Houchard             a.low = inputs_float128[ inputNum ].low;
146115144b0fSOlivier Houchard             a.high = inputs_float128[ inputNum ].high;
146215144b0fSOlivier Houchard             function( a );
146315144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
146415144b0fSOlivier Houchard         }
146515144b0fSOlivier Houchard         count += minIterations;
146615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
146715144b0fSOlivier Houchard     inputNum = 0;
146815144b0fSOlivier Houchard     startClock = clock();
146915144b0fSOlivier Houchard     for ( i = count; i; --i ) {
147015144b0fSOlivier Houchard         a.low = inputs_float128[ inputNum ].low;
147115144b0fSOlivier Houchard         a.high = inputs_float128[ inputNum ].high;
147215144b0fSOlivier Houchard         function( a );
147315144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
147415144b0fSOlivier Houchard     }
147515144b0fSOlivier Houchard     endClock = clock();
147615144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
147715144b0fSOlivier Houchard 
147815144b0fSOlivier Houchard }
147915144b0fSOlivier Houchard 
148015144b0fSOlivier Houchard static void time_a_float128_z_int64( int64 function( float128 ) )
148115144b0fSOlivier Houchard {
148215144b0fSOlivier Houchard     clock_t startClock, endClock;
148315144b0fSOlivier Houchard     int32 count, i;
148415144b0fSOlivier Houchard     int8 inputNum;
148515144b0fSOlivier Houchard     float128 a;
148615144b0fSOlivier Houchard 
148715144b0fSOlivier Houchard     count = 0;
148815144b0fSOlivier Houchard     inputNum = 0;
148915144b0fSOlivier Houchard     startClock = clock();
149015144b0fSOlivier Houchard     do {
149115144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
149215144b0fSOlivier Houchard             a.low = inputs_float128[ inputNum ].low;
149315144b0fSOlivier Houchard             a.high = inputs_float128[ inputNum ].high;
149415144b0fSOlivier Houchard             function( a );
149515144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
149615144b0fSOlivier Houchard         }
149715144b0fSOlivier Houchard         count += minIterations;
149815144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
149915144b0fSOlivier Houchard     inputNum = 0;
150015144b0fSOlivier Houchard     startClock = clock();
150115144b0fSOlivier Houchard     for ( i = count; i; --i ) {
150215144b0fSOlivier Houchard         a.low = inputs_float128[ inputNum ].low;
150315144b0fSOlivier Houchard         a.high = inputs_float128[ inputNum ].high;
150415144b0fSOlivier Houchard         function( a );
150515144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
150615144b0fSOlivier Houchard     }
150715144b0fSOlivier Houchard     endClock = clock();
150815144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
150915144b0fSOlivier Houchard 
151015144b0fSOlivier Houchard }
151115144b0fSOlivier Houchard 
151215144b0fSOlivier Houchard static void time_a_float128_z_float32( float32 function( float128 ) )
151315144b0fSOlivier Houchard {
151415144b0fSOlivier Houchard     clock_t startClock, endClock;
151515144b0fSOlivier Houchard     int32 count, i;
151615144b0fSOlivier Houchard     int8 inputNum;
151715144b0fSOlivier Houchard     float128 a;
151815144b0fSOlivier Houchard 
151915144b0fSOlivier Houchard     count = 0;
152015144b0fSOlivier Houchard     inputNum = 0;
152115144b0fSOlivier Houchard     startClock = clock();
152215144b0fSOlivier Houchard     do {
152315144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
152415144b0fSOlivier Houchard             a.low = inputs_float128[ inputNum ].low;
152515144b0fSOlivier Houchard             a.high = inputs_float128[ inputNum ].high;
152615144b0fSOlivier Houchard             function( a );
152715144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
152815144b0fSOlivier Houchard         }
152915144b0fSOlivier Houchard         count += minIterations;
153015144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
153115144b0fSOlivier Houchard     inputNum = 0;
153215144b0fSOlivier Houchard     startClock = clock();
153315144b0fSOlivier Houchard     for ( i = count; i; --i ) {
153415144b0fSOlivier Houchard         a.low = inputs_float128[ inputNum ].low;
153515144b0fSOlivier Houchard         a.high = inputs_float128[ inputNum ].high;
153615144b0fSOlivier Houchard         function( a );
153715144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
153815144b0fSOlivier Houchard     }
153915144b0fSOlivier Houchard     endClock = clock();
154015144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
154115144b0fSOlivier Houchard 
154215144b0fSOlivier Houchard }
154315144b0fSOlivier Houchard 
154415144b0fSOlivier Houchard static void time_a_float128_z_float64( float64 function( float128 ) )
154515144b0fSOlivier Houchard {
154615144b0fSOlivier Houchard     clock_t startClock, endClock;
154715144b0fSOlivier Houchard     int32 count, i;
154815144b0fSOlivier Houchard     int8 inputNum;
154915144b0fSOlivier Houchard     float128 a;
155015144b0fSOlivier Houchard 
155115144b0fSOlivier Houchard     count = 0;
155215144b0fSOlivier Houchard     inputNum = 0;
155315144b0fSOlivier Houchard     startClock = clock();
155415144b0fSOlivier Houchard     do {
155515144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
155615144b0fSOlivier Houchard             a.low = inputs_float128[ inputNum ].low;
155715144b0fSOlivier Houchard             a.high = inputs_float128[ inputNum ].high;
155815144b0fSOlivier Houchard             function( a );
155915144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
156015144b0fSOlivier Houchard         }
156115144b0fSOlivier Houchard         count += minIterations;
156215144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
156315144b0fSOlivier Houchard     inputNum = 0;
156415144b0fSOlivier Houchard     startClock = clock();
156515144b0fSOlivier Houchard     for ( i = count; i; --i ) {
156615144b0fSOlivier Houchard         a.low = inputs_float128[ inputNum ].low;
156715144b0fSOlivier Houchard         a.high = inputs_float128[ inputNum ].high;
156815144b0fSOlivier Houchard         function( a );
156915144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
157015144b0fSOlivier Houchard     }
157115144b0fSOlivier Houchard     endClock = clock();
157215144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
157315144b0fSOlivier Houchard 
157415144b0fSOlivier Houchard }
157515144b0fSOlivier Houchard 
157615144b0fSOlivier Houchard #ifdef FLOATX80
157715144b0fSOlivier Houchard 
157815144b0fSOlivier Houchard static void time_a_float128_z_floatx80( floatx80 function( float128 ) )
157915144b0fSOlivier Houchard {
158015144b0fSOlivier Houchard     clock_t startClock, endClock;
158115144b0fSOlivier Houchard     int32 count, i;
158215144b0fSOlivier Houchard     int8 inputNum;
158315144b0fSOlivier Houchard     float128 a;
158415144b0fSOlivier Houchard 
158515144b0fSOlivier Houchard     count = 0;
158615144b0fSOlivier Houchard     inputNum = 0;
158715144b0fSOlivier Houchard     startClock = clock();
158815144b0fSOlivier Houchard     do {
158915144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
159015144b0fSOlivier Houchard             a.low = inputs_float128[ inputNum ].low;
159115144b0fSOlivier Houchard             a.high = inputs_float128[ inputNum ].high;
159215144b0fSOlivier Houchard             function( a );
159315144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
159415144b0fSOlivier Houchard         }
159515144b0fSOlivier Houchard         count += minIterations;
159615144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
159715144b0fSOlivier Houchard     inputNum = 0;
159815144b0fSOlivier Houchard     startClock = clock();
159915144b0fSOlivier Houchard     for ( i = count; i; --i ) {
160015144b0fSOlivier Houchard         a.low = inputs_float128[ inputNum ].low;
160115144b0fSOlivier Houchard         a.high = inputs_float128[ inputNum ].high;
160215144b0fSOlivier Houchard         function( a );
160315144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
160415144b0fSOlivier Houchard     }
160515144b0fSOlivier Houchard     endClock = clock();
160615144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
160715144b0fSOlivier Houchard 
160815144b0fSOlivier Houchard }
160915144b0fSOlivier Houchard 
161015144b0fSOlivier Houchard #endif
161115144b0fSOlivier Houchard 
161215144b0fSOlivier Houchard static void time_az_float128( float128 function( float128 ) )
161315144b0fSOlivier Houchard {
161415144b0fSOlivier Houchard     clock_t startClock, endClock;
161515144b0fSOlivier Houchard     int32 count, i;
161615144b0fSOlivier Houchard     int8 inputNum;
161715144b0fSOlivier Houchard     float128 a;
161815144b0fSOlivier Houchard 
161915144b0fSOlivier Houchard     count = 0;
162015144b0fSOlivier Houchard     inputNum = 0;
162115144b0fSOlivier Houchard     startClock = clock();
162215144b0fSOlivier Houchard     do {
162315144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
162415144b0fSOlivier Houchard             a.low = inputs_float128[ inputNum ].low;
162515144b0fSOlivier Houchard             a.high = inputs_float128[ inputNum ].high;
162615144b0fSOlivier Houchard             function( a );
162715144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
162815144b0fSOlivier Houchard         }
162915144b0fSOlivier Houchard         count += minIterations;
163015144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
163115144b0fSOlivier Houchard     inputNum = 0;
163215144b0fSOlivier Houchard     startClock = clock();
163315144b0fSOlivier Houchard     for ( i = count; i; --i ) {
163415144b0fSOlivier Houchard         a.low = inputs_float128[ inputNum ].low;
163515144b0fSOlivier Houchard         a.high = inputs_float128[ inputNum ].high;
163615144b0fSOlivier Houchard         function( a );
163715144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
163815144b0fSOlivier Houchard     }
163915144b0fSOlivier Houchard     endClock = clock();
164015144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
164115144b0fSOlivier Houchard 
164215144b0fSOlivier Houchard }
164315144b0fSOlivier Houchard 
164415144b0fSOlivier Houchard static void time_ab_float128_z_flag( flag function( float128, float128 ) )
164515144b0fSOlivier Houchard {
164615144b0fSOlivier Houchard     clock_t startClock, endClock;
164715144b0fSOlivier Houchard     int32 count, i;
164815144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
164915144b0fSOlivier Houchard     float128 a, b;
165015144b0fSOlivier Houchard 
165115144b0fSOlivier Houchard     count = 0;
165215144b0fSOlivier Houchard     inputNumA = 0;
165315144b0fSOlivier Houchard     inputNumB = 0;
165415144b0fSOlivier Houchard     startClock = clock();
165515144b0fSOlivier Houchard     do {
165615144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
165715144b0fSOlivier Houchard             a.low = inputs_float128[ inputNumA ].low;
165815144b0fSOlivier Houchard             a.high = inputs_float128[ inputNumA ].high;
165915144b0fSOlivier Houchard             b.low = inputs_float128[ inputNumB ].low;
166015144b0fSOlivier Houchard             b.high = inputs_float128[ inputNumB ].high;
166115144b0fSOlivier Houchard             function( a, b );
166215144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
166315144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
166415144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
166515144b0fSOlivier Houchard         }
166615144b0fSOlivier Houchard         count += minIterations;
166715144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
166815144b0fSOlivier Houchard     inputNumA = 0;
166915144b0fSOlivier Houchard     inputNumB = 0;
167015144b0fSOlivier Houchard     startClock = clock();
167115144b0fSOlivier Houchard     for ( i = count; i; --i ) {
167215144b0fSOlivier Houchard         a.low = inputs_float128[ inputNumA ].low;
167315144b0fSOlivier Houchard         a.high = inputs_float128[ inputNumA ].high;
167415144b0fSOlivier Houchard         b.low = inputs_float128[ inputNumB ].low;
167515144b0fSOlivier Houchard         b.high = inputs_float128[ inputNumB ].high;
167615144b0fSOlivier Houchard         function( a, b );
167715144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
167815144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
167915144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
168015144b0fSOlivier Houchard     }
168115144b0fSOlivier Houchard     endClock = clock();
168215144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
168315144b0fSOlivier Houchard 
168415144b0fSOlivier Houchard }
168515144b0fSOlivier Houchard 
168615144b0fSOlivier Houchard static void time_abz_float128( float128 function( float128, float128 ) )
168715144b0fSOlivier Houchard {
168815144b0fSOlivier Houchard     clock_t startClock, endClock;
168915144b0fSOlivier Houchard     int32 count, i;
169015144b0fSOlivier Houchard     int8 inputNumA, inputNumB;
169115144b0fSOlivier Houchard     float128 a, b;
169215144b0fSOlivier Houchard 
169315144b0fSOlivier Houchard     count = 0;
169415144b0fSOlivier Houchard     inputNumA = 0;
169515144b0fSOlivier Houchard     inputNumB = 0;
169615144b0fSOlivier Houchard     startClock = clock();
169715144b0fSOlivier Houchard     do {
169815144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
169915144b0fSOlivier Houchard             a.low = inputs_float128[ inputNumA ].low;
170015144b0fSOlivier Houchard             a.high = inputs_float128[ inputNumA ].high;
170115144b0fSOlivier Houchard             b.low = inputs_float128[ inputNumB ].low;
170215144b0fSOlivier Houchard             b.high = inputs_float128[ inputNumB ].high;
170315144b0fSOlivier Houchard             function( a, b );
170415144b0fSOlivier Houchard             inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
170515144b0fSOlivier Houchard             if ( inputNumA == 0 ) ++inputNumB;
170615144b0fSOlivier Houchard             inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
170715144b0fSOlivier Houchard         }
170815144b0fSOlivier Houchard         count += minIterations;
170915144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
171015144b0fSOlivier Houchard     inputNumA = 0;
171115144b0fSOlivier Houchard     inputNumB = 0;
171215144b0fSOlivier Houchard     startClock = clock();
171315144b0fSOlivier Houchard     for ( i = count; i; --i ) {
171415144b0fSOlivier Houchard         a.low = inputs_float128[ inputNumA ].low;
171515144b0fSOlivier Houchard         a.high = inputs_float128[ inputNumA ].high;
171615144b0fSOlivier Houchard         b.low = inputs_float128[ inputNumB ].low;
171715144b0fSOlivier Houchard         b.high = inputs_float128[ inputNumB ].high;
171815144b0fSOlivier Houchard         function( a, b );
171915144b0fSOlivier Houchard         inputNumA = ( inputNumA + 1 ) & ( numInputs_float128 - 1 );
172015144b0fSOlivier Houchard         if ( inputNumA == 0 ) ++inputNumB;
172115144b0fSOlivier Houchard         inputNumB = ( inputNumB + 1 ) & ( numInputs_float128 - 1 );
172215144b0fSOlivier Houchard     }
172315144b0fSOlivier Houchard     endClock = clock();
172415144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
172515144b0fSOlivier Houchard 
172615144b0fSOlivier Houchard }
172715144b0fSOlivier Houchard 
172815144b0fSOlivier Houchard static const struct {
172915144b0fSOlivier Houchard     bits64 high, low;
173015144b0fSOlivier Houchard } inputs_float128_pos[ numInputs_float128 ] = {
173115144b0fSOlivier Houchard     { LIT64( 0x3FDA200000100000 ), LIT64( 0x0000000000000000 ) },
173215144b0fSOlivier Houchard     { LIT64( 0x3FFF000000000000 ), LIT64( 0x0000000000000000 ) },
173315144b0fSOlivier Houchard     { LIT64( 0x05F14776190C8306 ), LIT64( 0xD8715F4E3D54BB92 ) },
173415144b0fSOlivier Houchard     { LIT64( 0x72B00000007FFFFF ), LIT64( 0xFFFFFFFFFFF7FFFF ) },
173515144b0fSOlivier Houchard     { LIT64( 0x0000000000000000 ), LIT64( 0x0000000000000000 ) },
173615144b0fSOlivier Houchard     { LIT64( 0x3FFFFFFFFFE00000 ), LIT64( 0x0000008000000000 ) },
173715144b0fSOlivier Houchard     { LIT64( 0x407F1719CE722F3E ), LIT64( 0xDA6B3FE5FF29425B ) },
173815144b0fSOlivier Houchard     { LIT64( 0x43FFFF8000000000 ), LIT64( 0x0000000000400000 ) },
173915144b0fSOlivier Houchard     { LIT64( 0x401E000000000100 ), LIT64( 0x0000000000002000 ) },
174015144b0fSOlivier Houchard     { LIT64( 0x3FFED71DACDA8E47 ), LIT64( 0x4860E3C75D224F28 ) },
174115144b0fSOlivier Houchard     { LIT64( 0x3F7ECFC1E90647D1 ), LIT64( 0x7A124FE55623EE44 ) },
174215144b0fSOlivier Houchard     { LIT64( 0x0DF7007FFFFFFFFF ), LIT64( 0xFFFFFFFFEFFFFFFF ) },
174315144b0fSOlivier Houchard     { LIT64( 0x3FE5FFEFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFEFFF ) },
174415144b0fSOlivier Houchard     { LIT64( 0x403FFFFFFFFFFFFF ), LIT64( 0xFFFFFFFFFFFFFBFE ) },
174515144b0fSOlivier Houchard     { LIT64( 0x3FFB2FBF7399AFEB ), LIT64( 0xA459EE6A5C16CA55 ) },
174615144b0fSOlivier Houchard     { LIT64( 0x3DB8FFFFFFFFFFFC ), LIT64( 0x0000000000000400 ) },
174715144b0fSOlivier Houchard     { LIT64( 0x3FC8FFDFFFFFFFFF ), LIT64( 0xFFFFFFFFF0000000 ) },
174815144b0fSOlivier Houchard     { LIT64( 0x3FFBFFFFFFDFFFFF ), LIT64( 0xFFF8000000000000 ) },
174915144b0fSOlivier Houchard     { LIT64( 0x407043C11737BE84 ), LIT64( 0xDDD58212ADC937F4 ) },
175015144b0fSOlivier Houchard     { LIT64( 0x0001000000000000 ), LIT64( 0x0000001000000001 ) },
175115144b0fSOlivier Houchard     { LIT64( 0x4036FFFFFFFFFFFF ), LIT64( 0xFE40000000000000 ) },
175215144b0fSOlivier Houchard     { LIT64( 0x4002FFFFFE000002 ), LIT64( 0x0000000000000000 ) },
175315144b0fSOlivier Houchard     { LIT64( 0x4000C3FEDE897773 ), LIT64( 0x326AC4FD8EFBE6DC ) },
175415144b0fSOlivier Houchard     { LIT64( 0x3FFF0000000FFFFF ), LIT64( 0xFFFFFE0000000000 ) },
175515144b0fSOlivier Houchard     { LIT64( 0x62C3E502146E426D ), LIT64( 0x43F3CAA0DC7DF1A0 ) },
175615144b0fSOlivier Houchard     { LIT64( 0x35CBD32E52BB570E ), LIT64( 0xBCC477CB11C6236C ) },
175715144b0fSOlivier Houchard     { LIT64( 0x6228FFFFFFC00000 ), LIT64( 0x0000000000000000 ) },
175815144b0fSOlivier Houchard     { LIT64( 0x3F80000000000000 ), LIT64( 0x0000000080000008 ) },
175915144b0fSOlivier Houchard     { LIT64( 0x41AFFFDFFFFFFFFF ), LIT64( 0xFFFC000000000000 ) },
176015144b0fSOlivier Houchard     { LIT64( 0x496F000000000000 ), LIT64( 0x00000001FFFBFFFF ) },
176115144b0fSOlivier Houchard     { LIT64( 0x3DE09BFE7923A338 ), LIT64( 0xBCC8FBBD7CEC1F4F ) },
176215144b0fSOlivier Houchard     { LIT64( 0x401CFFFFFFFFFFFF ), LIT64( 0xFFFFFFFEFFFFFF80 ) }
176315144b0fSOlivier Houchard };
176415144b0fSOlivier Houchard 
176515144b0fSOlivier Houchard static void time_az_float128_pos( float128 function( float128 ) )
176615144b0fSOlivier Houchard {
176715144b0fSOlivier Houchard     clock_t startClock, endClock;
176815144b0fSOlivier Houchard     int32 count, i;
176915144b0fSOlivier Houchard     int8 inputNum;
177015144b0fSOlivier Houchard     float128 a;
177115144b0fSOlivier Houchard 
177215144b0fSOlivier Houchard     count = 0;
177315144b0fSOlivier Houchard     inputNum = 0;
177415144b0fSOlivier Houchard     startClock = clock();
177515144b0fSOlivier Houchard     do {
177615144b0fSOlivier Houchard         for ( i = minIterations; i; --i ) {
177715144b0fSOlivier Houchard             a.low = inputs_float128_pos[ inputNum ].low;
177815144b0fSOlivier Houchard             a.high = inputs_float128_pos[ inputNum ].high;
177915144b0fSOlivier Houchard             function( a );
178015144b0fSOlivier Houchard             inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
178115144b0fSOlivier Houchard         }
178215144b0fSOlivier Houchard         count += minIterations;
178315144b0fSOlivier Houchard     } while ( clock() - startClock < CLOCKS_PER_SEC );
178415144b0fSOlivier Houchard     inputNum = 0;
178515144b0fSOlivier Houchard     startClock = clock();
178615144b0fSOlivier Houchard     for ( i = count; i; --i ) {
178715144b0fSOlivier Houchard         a.low = inputs_float128_pos[ inputNum ].low;
178815144b0fSOlivier Houchard         a.high = inputs_float128_pos[ inputNum ].high;
178915144b0fSOlivier Houchard         function( a );
179015144b0fSOlivier Houchard         inputNum = ( inputNum + 1 ) & ( numInputs_float128 - 1 );
179115144b0fSOlivier Houchard     }
179215144b0fSOlivier Houchard     endClock = clock();
179315144b0fSOlivier Houchard     reportTime( count, endClock - startClock );
179415144b0fSOlivier Houchard 
179515144b0fSOlivier Houchard }
179615144b0fSOlivier Houchard 
179715144b0fSOlivier Houchard #endif
179815144b0fSOlivier Houchard 
179915144b0fSOlivier Houchard enum {
180015144b0fSOlivier Houchard     INT32_TO_FLOAT32 = 1,
180115144b0fSOlivier Houchard     INT32_TO_FLOAT64,
180215144b0fSOlivier Houchard #ifdef FLOATX80
180315144b0fSOlivier Houchard     INT32_TO_FLOATX80,
180415144b0fSOlivier Houchard #endif
180515144b0fSOlivier Houchard #ifdef FLOAT128
180615144b0fSOlivier Houchard     INT32_TO_FLOAT128,
180715144b0fSOlivier Houchard #endif
180815144b0fSOlivier Houchard     INT64_TO_FLOAT32,
180915144b0fSOlivier Houchard     INT64_TO_FLOAT64,
181015144b0fSOlivier Houchard #ifdef FLOATX80
181115144b0fSOlivier Houchard     INT64_TO_FLOATX80,
181215144b0fSOlivier Houchard #endif
181315144b0fSOlivier Houchard #ifdef FLOAT128
181415144b0fSOlivier Houchard     INT64_TO_FLOAT128,
181515144b0fSOlivier Houchard #endif
181615144b0fSOlivier Houchard     FLOAT32_TO_INT32,
181715144b0fSOlivier Houchard     FLOAT32_TO_INT32_ROUND_TO_ZERO,
181815144b0fSOlivier Houchard     FLOAT32_TO_INT64,
181915144b0fSOlivier Houchard     FLOAT32_TO_INT64_ROUND_TO_ZERO,
182015144b0fSOlivier Houchard     FLOAT32_TO_FLOAT64,
182115144b0fSOlivier Houchard #ifdef FLOATX80
182215144b0fSOlivier Houchard     FLOAT32_TO_FLOATX80,
182315144b0fSOlivier Houchard #endif
182415144b0fSOlivier Houchard #ifdef FLOAT128
182515144b0fSOlivier Houchard     FLOAT32_TO_FLOAT128,
182615144b0fSOlivier Houchard #endif
182715144b0fSOlivier Houchard     FLOAT32_ROUND_TO_INT,
182815144b0fSOlivier Houchard     FLOAT32_ADD,
182915144b0fSOlivier Houchard     FLOAT32_SUB,
183015144b0fSOlivier Houchard     FLOAT32_MUL,
183115144b0fSOlivier Houchard     FLOAT32_DIV,
183215144b0fSOlivier Houchard     FLOAT32_REM,
183315144b0fSOlivier Houchard     FLOAT32_SQRT,
183415144b0fSOlivier Houchard     FLOAT32_EQ,
183515144b0fSOlivier Houchard     FLOAT32_LE,
183615144b0fSOlivier Houchard     FLOAT32_LT,
183715144b0fSOlivier Houchard     FLOAT32_EQ_SIGNALING,
183815144b0fSOlivier Houchard     FLOAT32_LE_QUIET,
183915144b0fSOlivier Houchard     FLOAT32_LT_QUIET,
184015144b0fSOlivier Houchard     FLOAT64_TO_INT32,
184115144b0fSOlivier Houchard     FLOAT64_TO_INT32_ROUND_TO_ZERO,
184215144b0fSOlivier Houchard     FLOAT64_TO_INT64,
184315144b0fSOlivier Houchard     FLOAT64_TO_INT64_ROUND_TO_ZERO,
184415144b0fSOlivier Houchard     FLOAT64_TO_FLOAT32,
184515144b0fSOlivier Houchard #ifdef FLOATX80
184615144b0fSOlivier Houchard     FLOAT64_TO_FLOATX80,
184715144b0fSOlivier Houchard #endif
184815144b0fSOlivier Houchard #ifdef FLOAT128
184915144b0fSOlivier Houchard     FLOAT64_TO_FLOAT128,
185015144b0fSOlivier Houchard #endif
185115144b0fSOlivier Houchard     FLOAT64_ROUND_TO_INT,
185215144b0fSOlivier Houchard     FLOAT64_ADD,
185315144b0fSOlivier Houchard     FLOAT64_SUB,
185415144b0fSOlivier Houchard     FLOAT64_MUL,
185515144b0fSOlivier Houchard     FLOAT64_DIV,
185615144b0fSOlivier Houchard     FLOAT64_REM,
185715144b0fSOlivier Houchard     FLOAT64_SQRT,
185815144b0fSOlivier Houchard     FLOAT64_EQ,
185915144b0fSOlivier Houchard     FLOAT64_LE,
186015144b0fSOlivier Houchard     FLOAT64_LT,
186115144b0fSOlivier Houchard     FLOAT64_EQ_SIGNALING,
186215144b0fSOlivier Houchard     FLOAT64_LE_QUIET,
186315144b0fSOlivier Houchard     FLOAT64_LT_QUIET,
186415144b0fSOlivier Houchard #ifdef FLOATX80
186515144b0fSOlivier Houchard     FLOATX80_TO_INT32,
186615144b0fSOlivier Houchard     FLOATX80_TO_INT32_ROUND_TO_ZERO,
186715144b0fSOlivier Houchard     FLOATX80_TO_INT64,
186815144b0fSOlivier Houchard     FLOATX80_TO_INT64_ROUND_TO_ZERO,
186915144b0fSOlivier Houchard     FLOATX80_TO_FLOAT32,
187015144b0fSOlivier Houchard     FLOATX80_TO_FLOAT64,
187115144b0fSOlivier Houchard #ifdef FLOAT128
187215144b0fSOlivier Houchard     FLOATX80_TO_FLOAT128,
187315144b0fSOlivier Houchard #endif
187415144b0fSOlivier Houchard     FLOATX80_ROUND_TO_INT,
187515144b0fSOlivier Houchard     FLOATX80_ADD,
187615144b0fSOlivier Houchard     FLOATX80_SUB,
187715144b0fSOlivier Houchard     FLOATX80_MUL,
187815144b0fSOlivier Houchard     FLOATX80_DIV,
187915144b0fSOlivier Houchard     FLOATX80_REM,
188015144b0fSOlivier Houchard     FLOATX80_SQRT,
188115144b0fSOlivier Houchard     FLOATX80_EQ,
188215144b0fSOlivier Houchard     FLOATX80_LE,
188315144b0fSOlivier Houchard     FLOATX80_LT,
188415144b0fSOlivier Houchard     FLOATX80_EQ_SIGNALING,
188515144b0fSOlivier Houchard     FLOATX80_LE_QUIET,
188615144b0fSOlivier Houchard     FLOATX80_LT_QUIET,
188715144b0fSOlivier Houchard #endif
188815144b0fSOlivier Houchard #ifdef FLOAT128
188915144b0fSOlivier Houchard     FLOAT128_TO_INT32,
189015144b0fSOlivier Houchard     FLOAT128_TO_INT32_ROUND_TO_ZERO,
189115144b0fSOlivier Houchard     FLOAT128_TO_INT64,
189215144b0fSOlivier Houchard     FLOAT128_TO_INT64_ROUND_TO_ZERO,
189315144b0fSOlivier Houchard     FLOAT128_TO_FLOAT32,
189415144b0fSOlivier Houchard     FLOAT128_TO_FLOAT64,
189515144b0fSOlivier Houchard #ifdef FLOATX80
189615144b0fSOlivier Houchard     FLOAT128_TO_FLOATX80,
189715144b0fSOlivier Houchard #endif
189815144b0fSOlivier Houchard     FLOAT128_ROUND_TO_INT,
189915144b0fSOlivier Houchard     FLOAT128_ADD,
190015144b0fSOlivier Houchard     FLOAT128_SUB,
190115144b0fSOlivier Houchard     FLOAT128_MUL,
190215144b0fSOlivier Houchard     FLOAT128_DIV,
190315144b0fSOlivier Houchard     FLOAT128_REM,
190415144b0fSOlivier Houchard     FLOAT128_SQRT,
190515144b0fSOlivier Houchard     FLOAT128_EQ,
190615144b0fSOlivier Houchard     FLOAT128_LE,
190715144b0fSOlivier Houchard     FLOAT128_LT,
190815144b0fSOlivier Houchard     FLOAT128_EQ_SIGNALING,
190915144b0fSOlivier Houchard     FLOAT128_LE_QUIET,
191015144b0fSOlivier Houchard     FLOAT128_LT_QUIET,
191115144b0fSOlivier Houchard #endif
191215144b0fSOlivier Houchard     NUM_FUNCTIONS
191315144b0fSOlivier Houchard };
191415144b0fSOlivier Houchard 
191515144b0fSOlivier Houchard static struct {
191615144b0fSOlivier Houchard     char *name;
191715144b0fSOlivier Houchard     int8 numInputs;
191815144b0fSOlivier Houchard     flag roundingPrecision, roundingMode;
191915144b0fSOlivier Houchard     flag tininessMode, tininessModeAtReducedPrecision;
192015144b0fSOlivier Houchard } functions[ NUM_FUNCTIONS ] = {
192115144b0fSOlivier Houchard     { 0, 0, 0, 0, 0, 0 },
192215144b0fSOlivier Houchard     { "int32_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
192315144b0fSOlivier Houchard     { "int32_to_float64",                1, FALSE, FALSE, FALSE, FALSE },
192415144b0fSOlivier Houchard #ifdef FLOATX80
192515144b0fSOlivier Houchard     { "int32_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
192615144b0fSOlivier Houchard #endif
192715144b0fSOlivier Houchard #ifdef FLOAT128
192815144b0fSOlivier Houchard     { "int32_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
192915144b0fSOlivier Houchard #endif
193015144b0fSOlivier Houchard     { "int64_to_float32",                1, FALSE, TRUE,  FALSE, FALSE },
193115144b0fSOlivier Houchard     { "int64_to_float64",                1, FALSE, TRUE,  FALSE, FALSE },
193215144b0fSOlivier Houchard #ifdef FLOATX80
193315144b0fSOlivier Houchard     { "int64_to_floatx80",               1, FALSE, FALSE, FALSE, FALSE },
193415144b0fSOlivier Houchard #endif
193515144b0fSOlivier Houchard #ifdef FLOAT128
193615144b0fSOlivier Houchard     { "int64_to_float128",               1, FALSE, FALSE, FALSE, FALSE },
193715144b0fSOlivier Houchard #endif
193815144b0fSOlivier Houchard     { "float32_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
193915144b0fSOlivier Houchard     { "float32_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
194015144b0fSOlivier Houchard     { "float32_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
194115144b0fSOlivier Houchard     { "float32_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
194215144b0fSOlivier Houchard     { "float32_to_float64",              1, FALSE, FALSE, FALSE, FALSE },
194315144b0fSOlivier Houchard #ifdef FLOATX80
194415144b0fSOlivier Houchard     { "float32_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
194515144b0fSOlivier Houchard #endif
194615144b0fSOlivier Houchard #ifdef FLOAT128
194715144b0fSOlivier Houchard     { "float32_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
194815144b0fSOlivier Houchard #endif
194915144b0fSOlivier Houchard     { "float32_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
195015144b0fSOlivier Houchard     { "float32_add",                     2, FALSE, TRUE,  FALSE, FALSE },
195115144b0fSOlivier Houchard     { "float32_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
195215144b0fSOlivier Houchard     { "float32_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
195315144b0fSOlivier Houchard     { "float32_div",                     2, FALSE, TRUE,  FALSE, FALSE },
195415144b0fSOlivier Houchard     { "float32_rem",                     2, FALSE, FALSE, FALSE, FALSE },
195515144b0fSOlivier Houchard     { "float32_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
195615144b0fSOlivier Houchard     { "float32_eq",                      2, FALSE, FALSE, FALSE, FALSE },
195715144b0fSOlivier Houchard     { "float32_le",                      2, FALSE, FALSE, FALSE, FALSE },
195815144b0fSOlivier Houchard     { "float32_lt",                      2, FALSE, FALSE, FALSE, FALSE },
195915144b0fSOlivier Houchard     { "float32_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
196015144b0fSOlivier Houchard     { "float32_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
196115144b0fSOlivier Houchard     { "float32_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
196215144b0fSOlivier Houchard     { "float64_to_int32",                1, FALSE, TRUE,  FALSE, FALSE },
196315144b0fSOlivier Houchard     { "float64_to_int32_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
196415144b0fSOlivier Houchard     { "float64_to_int64",                1, FALSE, TRUE,  FALSE, FALSE },
196515144b0fSOlivier Houchard     { "float64_to_int64_round_to_zero",  1, FALSE, FALSE, FALSE, FALSE },
196615144b0fSOlivier Houchard     { "float64_to_float32",              1, FALSE, TRUE,  TRUE,  FALSE },
196715144b0fSOlivier Houchard #ifdef FLOATX80
196815144b0fSOlivier Houchard     { "float64_to_floatx80",             1, FALSE, FALSE, FALSE, FALSE },
196915144b0fSOlivier Houchard #endif
197015144b0fSOlivier Houchard #ifdef FLOAT128
197115144b0fSOlivier Houchard     { "float64_to_float128",             1, FALSE, FALSE, FALSE, FALSE },
197215144b0fSOlivier Houchard #endif
197315144b0fSOlivier Houchard     { "float64_round_to_int",            1, FALSE, TRUE,  FALSE, FALSE },
197415144b0fSOlivier Houchard     { "float64_add",                     2, FALSE, TRUE,  FALSE, FALSE },
197515144b0fSOlivier Houchard     { "float64_sub",                     2, FALSE, TRUE,  FALSE, FALSE },
197615144b0fSOlivier Houchard     { "float64_mul",                     2, FALSE, TRUE,  TRUE,  FALSE },
197715144b0fSOlivier Houchard     { "float64_div",                     2, FALSE, TRUE,  FALSE, FALSE },
197815144b0fSOlivier Houchard     { "float64_rem",                     2, FALSE, FALSE, FALSE, FALSE },
197915144b0fSOlivier Houchard     { "float64_sqrt",                    1, FALSE, TRUE,  FALSE, FALSE },
198015144b0fSOlivier Houchard     { "float64_eq",                      2, FALSE, FALSE, FALSE, FALSE },
198115144b0fSOlivier Houchard     { "float64_le",                      2, FALSE, FALSE, FALSE, FALSE },
198215144b0fSOlivier Houchard     { "float64_lt",                      2, FALSE, FALSE, FALSE, FALSE },
198315144b0fSOlivier Houchard     { "float64_eq_signaling",            2, FALSE, FALSE, FALSE, FALSE },
198415144b0fSOlivier Houchard     { "float64_le_quiet",                2, FALSE, FALSE, FALSE, FALSE },
198515144b0fSOlivier Houchard     { "float64_lt_quiet",                2, FALSE, FALSE, FALSE, FALSE },
198615144b0fSOlivier Houchard #ifdef FLOATX80
198715144b0fSOlivier Houchard     { "floatx80_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
198815144b0fSOlivier Houchard     { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
198915144b0fSOlivier Houchard     { "floatx80_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
199015144b0fSOlivier Houchard     { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
199115144b0fSOlivier Houchard     { "floatx80_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
199215144b0fSOlivier Houchard     { "floatx80_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
199315144b0fSOlivier Houchard #ifdef FLOAT128
199415144b0fSOlivier Houchard     { "floatx80_to_float128",            1, FALSE, FALSE, FALSE, FALSE },
199515144b0fSOlivier Houchard #endif
199615144b0fSOlivier Houchard     { "floatx80_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
199715144b0fSOlivier Houchard     { "floatx80_add",                    2, TRUE,  TRUE,  FALSE, TRUE  },
199815144b0fSOlivier Houchard     { "floatx80_sub",                    2, TRUE,  TRUE,  FALSE, TRUE  },
199915144b0fSOlivier Houchard     { "floatx80_mul",                    2, TRUE,  TRUE,  TRUE,  TRUE  },
200015144b0fSOlivier Houchard     { "floatx80_div",                    2, TRUE,  TRUE,  FALSE, TRUE  },
200115144b0fSOlivier Houchard     { "floatx80_rem",                    2, FALSE, FALSE, FALSE, FALSE },
200215144b0fSOlivier Houchard     { "floatx80_sqrt",                   1, TRUE,  TRUE,  FALSE, FALSE },
200315144b0fSOlivier Houchard     { "floatx80_eq",                     2, FALSE, FALSE, FALSE, FALSE },
200415144b0fSOlivier Houchard     { "floatx80_le",                     2, FALSE, FALSE, FALSE, FALSE },
200515144b0fSOlivier Houchard     { "floatx80_lt",                     2, FALSE, FALSE, FALSE, FALSE },
200615144b0fSOlivier Houchard     { "floatx80_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
200715144b0fSOlivier Houchard     { "floatx80_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
200815144b0fSOlivier Houchard     { "floatx80_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
200915144b0fSOlivier Houchard #endif
201015144b0fSOlivier Houchard #ifdef FLOAT128
201115144b0fSOlivier Houchard     { "float128_to_int32",               1, FALSE, TRUE,  FALSE, FALSE },
201215144b0fSOlivier Houchard     { "float128_to_int32_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
201315144b0fSOlivier Houchard     { "float128_to_int64",               1, FALSE, TRUE,  FALSE, FALSE },
201415144b0fSOlivier Houchard     { "float128_to_int64_round_to_zero", 1, FALSE, FALSE, FALSE, FALSE },
201515144b0fSOlivier Houchard     { "float128_to_float32",             1, FALSE, TRUE,  TRUE,  FALSE },
201615144b0fSOlivier Houchard     { "float128_to_float64",             1, FALSE, TRUE,  TRUE,  FALSE },
201715144b0fSOlivier Houchard #ifdef FLOATX80
201815144b0fSOlivier Houchard     { "float128_to_floatx80",            1, FALSE, TRUE,  TRUE,  FALSE },
201915144b0fSOlivier Houchard #endif
202015144b0fSOlivier Houchard     { "float128_round_to_int",           1, FALSE, TRUE,  FALSE, FALSE },
202115144b0fSOlivier Houchard     { "float128_add",                    2, FALSE, TRUE,  FALSE, FALSE },
202215144b0fSOlivier Houchard     { "float128_sub",                    2, FALSE, TRUE,  FALSE, FALSE },
202315144b0fSOlivier Houchard     { "float128_mul",                    2, FALSE, TRUE,  TRUE,  FALSE },
202415144b0fSOlivier Houchard     { "float128_div",                    2, FALSE, TRUE,  FALSE, FALSE },
202515144b0fSOlivier Houchard     { "float128_rem",                    2, FALSE, FALSE, FALSE, FALSE },
202615144b0fSOlivier Houchard     { "float128_sqrt",                   1, FALSE, TRUE,  FALSE, FALSE },
202715144b0fSOlivier Houchard     { "float128_eq",                     2, FALSE, FALSE, FALSE, FALSE },
202815144b0fSOlivier Houchard     { "float128_le",                     2, FALSE, FALSE, FALSE, FALSE },
202915144b0fSOlivier Houchard     { "float128_lt",                     2, FALSE, FALSE, FALSE, FALSE },
203015144b0fSOlivier Houchard     { "float128_eq_signaling",           2, FALSE, FALSE, FALSE, FALSE },
203115144b0fSOlivier Houchard     { "float128_le_quiet",               2, FALSE, FALSE, FALSE, FALSE },
203215144b0fSOlivier Houchard     { "float128_lt_quiet",               2, FALSE, FALSE, FALSE, FALSE },
203315144b0fSOlivier Houchard #endif
203415144b0fSOlivier Houchard };
203515144b0fSOlivier Houchard 
203615144b0fSOlivier Houchard enum {
203715144b0fSOlivier Houchard     ROUND_NEAREST_EVEN = 1,
203815144b0fSOlivier Houchard     ROUND_TO_ZERO,
203915144b0fSOlivier Houchard     ROUND_DOWN,
204015144b0fSOlivier Houchard     ROUND_UP,
204115144b0fSOlivier Houchard     NUM_ROUNDINGMODES
204215144b0fSOlivier Houchard };
204315144b0fSOlivier Houchard enum {
204415144b0fSOlivier Houchard     TININESS_BEFORE_ROUNDING = 1,
204515144b0fSOlivier Houchard     TININESS_AFTER_ROUNDING,
204615144b0fSOlivier Houchard     NUM_TININESSMODES
204715144b0fSOlivier Houchard };
204815144b0fSOlivier Houchard 
204915144b0fSOlivier Houchard static void
205015144b0fSOlivier Houchard  timeFunctionVariety(
205115144b0fSOlivier Houchard      uint8 functionCode,
205215144b0fSOlivier Houchard      int8 roundingPrecision,
205315144b0fSOlivier Houchard      int8 roundingMode,
205415144b0fSOlivier Houchard      int8 tininessMode
205515144b0fSOlivier Houchard  )
205615144b0fSOlivier Houchard {
205715144b0fSOlivier Houchard     uint8 roundingCode;
205815144b0fSOlivier Houchard     int8 tininessCode;
205915144b0fSOlivier Houchard 
206015144b0fSOlivier Houchard     functionName = functions[ functionCode ].name;
206115144b0fSOlivier Houchard     if ( roundingPrecision == 32 ) {
206215144b0fSOlivier Houchard         roundingPrecisionName = "32";
206315144b0fSOlivier Houchard     }
206415144b0fSOlivier Houchard     else if ( roundingPrecision == 64 ) {
206515144b0fSOlivier Houchard         roundingPrecisionName = "64";
206615144b0fSOlivier Houchard     }
206715144b0fSOlivier Houchard     else if ( roundingPrecision == 80 ) {
206815144b0fSOlivier Houchard         roundingPrecisionName = "80";
206915144b0fSOlivier Houchard     }
207015144b0fSOlivier Houchard     else {
207115144b0fSOlivier Houchard         roundingPrecisionName = 0;
207215144b0fSOlivier Houchard     }
207315144b0fSOlivier Houchard #ifdef FLOATX80
207415144b0fSOlivier Houchard     floatx80_rounding_precision = roundingPrecision;
207515144b0fSOlivier Houchard #endif
207615144b0fSOlivier Houchard     switch ( roundingMode ) {
207715144b0fSOlivier Houchard      case 0:
207815144b0fSOlivier Houchard         roundingModeName = 0;
207915144b0fSOlivier Houchard         roundingCode = float_round_nearest_even;
208015144b0fSOlivier Houchard         break;
208115144b0fSOlivier Houchard      case ROUND_NEAREST_EVEN:
208215144b0fSOlivier Houchard         roundingModeName = "nearest_even";
208315144b0fSOlivier Houchard         roundingCode = float_round_nearest_even;
208415144b0fSOlivier Houchard         break;
208515144b0fSOlivier Houchard      case ROUND_TO_ZERO:
208615144b0fSOlivier Houchard         roundingModeName = "to_zero";
208715144b0fSOlivier Houchard         roundingCode = float_round_to_zero;
208815144b0fSOlivier Houchard         break;
208915144b0fSOlivier Houchard      case ROUND_DOWN:
209015144b0fSOlivier Houchard         roundingModeName = "down";
209115144b0fSOlivier Houchard         roundingCode = float_round_down;
209215144b0fSOlivier Houchard         break;
209315144b0fSOlivier Houchard      case ROUND_UP:
209415144b0fSOlivier Houchard         roundingModeName = "up";
209515144b0fSOlivier Houchard         roundingCode = float_round_up;
209615144b0fSOlivier Houchard         break;
209715144b0fSOlivier Houchard     }
209815144b0fSOlivier Houchard     float_rounding_mode = roundingCode;
209915144b0fSOlivier Houchard     switch ( tininessMode ) {
210015144b0fSOlivier Houchard      case 0:
210115144b0fSOlivier Houchard         tininessModeName = 0;
210215144b0fSOlivier Houchard         tininessCode = float_tininess_after_rounding;
210315144b0fSOlivier Houchard         break;
210415144b0fSOlivier Houchard      case TININESS_BEFORE_ROUNDING:
210515144b0fSOlivier Houchard         tininessModeName = "before";
210615144b0fSOlivier Houchard         tininessCode = float_tininess_before_rounding;
210715144b0fSOlivier Houchard         break;
210815144b0fSOlivier Houchard      case TININESS_AFTER_ROUNDING:
210915144b0fSOlivier Houchard         tininessModeName = "after";
211015144b0fSOlivier Houchard         tininessCode = float_tininess_after_rounding;
211115144b0fSOlivier Houchard         break;
211215144b0fSOlivier Houchard     }
211315144b0fSOlivier Houchard     float_detect_tininess = tininessCode;
211415144b0fSOlivier Houchard     switch ( functionCode ) {
211515144b0fSOlivier Houchard      case INT32_TO_FLOAT32:
211615144b0fSOlivier Houchard         time_a_int32_z_float32( int32_to_float32 );
211715144b0fSOlivier Houchard         break;
211815144b0fSOlivier Houchard      case INT32_TO_FLOAT64:
211915144b0fSOlivier Houchard         time_a_int32_z_float64( int32_to_float64 );
212015144b0fSOlivier Houchard         break;
212115144b0fSOlivier Houchard #ifdef FLOATX80
212215144b0fSOlivier Houchard      case INT32_TO_FLOATX80:
212315144b0fSOlivier Houchard         time_a_int32_z_floatx80( int32_to_floatx80 );
212415144b0fSOlivier Houchard         break;
212515144b0fSOlivier Houchard #endif
212615144b0fSOlivier Houchard #ifdef FLOAT128
212715144b0fSOlivier Houchard      case INT32_TO_FLOAT128:
212815144b0fSOlivier Houchard         time_a_int32_z_float128( int32_to_float128 );
212915144b0fSOlivier Houchard         break;
213015144b0fSOlivier Houchard #endif
213115144b0fSOlivier Houchard      case INT64_TO_FLOAT32:
213215144b0fSOlivier Houchard         time_a_int64_z_float32( int64_to_float32 );
213315144b0fSOlivier Houchard         break;
213415144b0fSOlivier Houchard      case INT64_TO_FLOAT64:
213515144b0fSOlivier Houchard         time_a_int64_z_float64( int64_to_float64 );
213615144b0fSOlivier Houchard         break;
213715144b0fSOlivier Houchard #ifdef FLOATX80
213815144b0fSOlivier Houchard      case INT64_TO_FLOATX80:
213915144b0fSOlivier Houchard         time_a_int64_z_floatx80( int64_to_floatx80 );
214015144b0fSOlivier Houchard         break;
214115144b0fSOlivier Houchard #endif
214215144b0fSOlivier Houchard #ifdef FLOAT128
214315144b0fSOlivier Houchard      case INT64_TO_FLOAT128:
214415144b0fSOlivier Houchard         time_a_int64_z_float128( int64_to_float128 );
214515144b0fSOlivier Houchard         break;
214615144b0fSOlivier Houchard #endif
214715144b0fSOlivier Houchard      case FLOAT32_TO_INT32:
214815144b0fSOlivier Houchard         time_a_float32_z_int32( float32_to_int32 );
214915144b0fSOlivier Houchard         break;
215015144b0fSOlivier Houchard      case FLOAT32_TO_INT32_ROUND_TO_ZERO:
215115144b0fSOlivier Houchard         time_a_float32_z_int32( float32_to_int32_round_to_zero );
215215144b0fSOlivier Houchard         break;
215315144b0fSOlivier Houchard      case FLOAT32_TO_INT64:
215415144b0fSOlivier Houchard         time_a_float32_z_int64( float32_to_int64 );
215515144b0fSOlivier Houchard         break;
215615144b0fSOlivier Houchard      case FLOAT32_TO_INT64_ROUND_TO_ZERO:
215715144b0fSOlivier Houchard         time_a_float32_z_int64( float32_to_int64_round_to_zero );
215815144b0fSOlivier Houchard         break;
215915144b0fSOlivier Houchard      case FLOAT32_TO_FLOAT64:
216015144b0fSOlivier Houchard         time_a_float32_z_float64( float32_to_float64 );
216115144b0fSOlivier Houchard         break;
216215144b0fSOlivier Houchard #ifdef FLOATX80
216315144b0fSOlivier Houchard      case FLOAT32_TO_FLOATX80:
216415144b0fSOlivier Houchard         time_a_float32_z_floatx80( float32_to_floatx80 );
216515144b0fSOlivier Houchard         break;
216615144b0fSOlivier Houchard #endif
216715144b0fSOlivier Houchard #ifdef FLOAT128
216815144b0fSOlivier Houchard      case FLOAT32_TO_FLOAT128:
216915144b0fSOlivier Houchard         time_a_float32_z_float128( float32_to_float128 );
217015144b0fSOlivier Houchard         break;
217115144b0fSOlivier Houchard #endif
217215144b0fSOlivier Houchard      case FLOAT32_ROUND_TO_INT:
217315144b0fSOlivier Houchard         time_az_float32( float32_round_to_int );
217415144b0fSOlivier Houchard         break;
217515144b0fSOlivier Houchard      case FLOAT32_ADD:
217615144b0fSOlivier Houchard         time_abz_float32( float32_add );
217715144b0fSOlivier Houchard         break;
217815144b0fSOlivier Houchard      case FLOAT32_SUB:
217915144b0fSOlivier Houchard         time_abz_float32( float32_sub );
218015144b0fSOlivier Houchard         break;
218115144b0fSOlivier Houchard      case FLOAT32_MUL:
218215144b0fSOlivier Houchard         time_abz_float32( float32_mul );
218315144b0fSOlivier Houchard         break;
218415144b0fSOlivier Houchard      case FLOAT32_DIV:
218515144b0fSOlivier Houchard         time_abz_float32( float32_div );
218615144b0fSOlivier Houchard         break;
218715144b0fSOlivier Houchard      case FLOAT32_REM:
218815144b0fSOlivier Houchard         time_abz_float32( float32_rem );
218915144b0fSOlivier Houchard         break;
219015144b0fSOlivier Houchard      case FLOAT32_SQRT:
219115144b0fSOlivier Houchard         time_az_float32_pos( float32_sqrt );
219215144b0fSOlivier Houchard         break;
219315144b0fSOlivier Houchard      case FLOAT32_EQ:
219415144b0fSOlivier Houchard         time_ab_float32_z_flag( float32_eq );
219515144b0fSOlivier Houchard         break;
219615144b0fSOlivier Houchard      case FLOAT32_LE:
219715144b0fSOlivier Houchard         time_ab_float32_z_flag( float32_le );
219815144b0fSOlivier Houchard         break;
219915144b0fSOlivier Houchard      case FLOAT32_LT:
220015144b0fSOlivier Houchard         time_ab_float32_z_flag( float32_lt );
220115144b0fSOlivier Houchard         break;
220215144b0fSOlivier Houchard      case FLOAT32_EQ_SIGNALING:
220315144b0fSOlivier Houchard         time_ab_float32_z_flag( float32_eq_signaling );
220415144b0fSOlivier Houchard         break;
220515144b0fSOlivier Houchard      case FLOAT32_LE_QUIET:
220615144b0fSOlivier Houchard         time_ab_float32_z_flag( float32_le_quiet );
220715144b0fSOlivier Houchard         break;
220815144b0fSOlivier Houchard      case FLOAT32_LT_QUIET:
220915144b0fSOlivier Houchard         time_ab_float32_z_flag( float32_lt_quiet );
221015144b0fSOlivier Houchard         break;
221115144b0fSOlivier Houchard      case FLOAT64_TO_INT32:
221215144b0fSOlivier Houchard         time_a_float64_z_int32( float64_to_int32 );
221315144b0fSOlivier Houchard         break;
221415144b0fSOlivier Houchard      case FLOAT64_TO_INT32_ROUND_TO_ZERO:
221515144b0fSOlivier Houchard         time_a_float64_z_int32( float64_to_int32_round_to_zero );
221615144b0fSOlivier Houchard         break;
221715144b0fSOlivier Houchard      case FLOAT64_TO_INT64:
221815144b0fSOlivier Houchard         time_a_float64_z_int64( float64_to_int64 );
221915144b0fSOlivier Houchard         break;
222015144b0fSOlivier Houchard      case FLOAT64_TO_INT64_ROUND_TO_ZERO:
222115144b0fSOlivier Houchard         time_a_float64_z_int64( float64_to_int64_round_to_zero );
222215144b0fSOlivier Houchard         break;
222315144b0fSOlivier Houchard      case FLOAT64_TO_FLOAT32:
222415144b0fSOlivier Houchard         time_a_float64_z_float32( float64_to_float32 );
222515144b0fSOlivier Houchard         break;
222615144b0fSOlivier Houchard #ifdef FLOATX80
222715144b0fSOlivier Houchard      case FLOAT64_TO_FLOATX80:
222815144b0fSOlivier Houchard         time_a_float64_z_floatx80( float64_to_floatx80 );
222915144b0fSOlivier Houchard         break;
223015144b0fSOlivier Houchard #endif
223115144b0fSOlivier Houchard #ifdef FLOAT128
223215144b0fSOlivier Houchard      case FLOAT64_TO_FLOAT128:
223315144b0fSOlivier Houchard         time_a_float64_z_float128( float64_to_float128 );
223415144b0fSOlivier Houchard         break;
223515144b0fSOlivier Houchard #endif
223615144b0fSOlivier Houchard      case FLOAT64_ROUND_TO_INT:
223715144b0fSOlivier Houchard         time_az_float64( float64_round_to_int );
223815144b0fSOlivier Houchard         break;
223915144b0fSOlivier Houchard      case FLOAT64_ADD:
224015144b0fSOlivier Houchard         time_abz_float64( float64_add );
224115144b0fSOlivier Houchard         break;
224215144b0fSOlivier Houchard      case FLOAT64_SUB:
224315144b0fSOlivier Houchard         time_abz_float64( float64_sub );
224415144b0fSOlivier Houchard         break;
224515144b0fSOlivier Houchard      case FLOAT64_MUL:
224615144b0fSOlivier Houchard         time_abz_float64( float64_mul );
224715144b0fSOlivier Houchard         break;
224815144b0fSOlivier Houchard      case FLOAT64_DIV:
224915144b0fSOlivier Houchard         time_abz_float64( float64_div );
225015144b0fSOlivier Houchard         break;
225115144b0fSOlivier Houchard      case FLOAT64_REM:
225215144b0fSOlivier Houchard         time_abz_float64( float64_rem );
225315144b0fSOlivier Houchard         break;
225415144b0fSOlivier Houchard      case FLOAT64_SQRT:
225515144b0fSOlivier Houchard         time_az_float64_pos( float64_sqrt );
225615144b0fSOlivier Houchard         break;
225715144b0fSOlivier Houchard      case FLOAT64_EQ:
225815144b0fSOlivier Houchard         time_ab_float64_z_flag( float64_eq );
225915144b0fSOlivier Houchard         break;
226015144b0fSOlivier Houchard      case FLOAT64_LE:
226115144b0fSOlivier Houchard         time_ab_float64_z_flag( float64_le );
226215144b0fSOlivier Houchard         break;
226315144b0fSOlivier Houchard      case FLOAT64_LT:
226415144b0fSOlivier Houchard         time_ab_float64_z_flag( float64_lt );
226515144b0fSOlivier Houchard         break;
226615144b0fSOlivier Houchard      case FLOAT64_EQ_SIGNALING:
226715144b0fSOlivier Houchard         time_ab_float64_z_flag( float64_eq_signaling );
226815144b0fSOlivier Houchard         break;
226915144b0fSOlivier Houchard      case FLOAT64_LE_QUIET:
227015144b0fSOlivier Houchard         time_ab_float64_z_flag( float64_le_quiet );
227115144b0fSOlivier Houchard         break;
227215144b0fSOlivier Houchard      case FLOAT64_LT_QUIET:
227315144b0fSOlivier Houchard         time_ab_float64_z_flag( float64_lt_quiet );
227415144b0fSOlivier Houchard         break;
227515144b0fSOlivier Houchard #ifdef FLOATX80
227615144b0fSOlivier Houchard      case FLOATX80_TO_INT32:
227715144b0fSOlivier Houchard         time_a_floatx80_z_int32( floatx80_to_int32 );
227815144b0fSOlivier Houchard         break;
227915144b0fSOlivier Houchard      case FLOATX80_TO_INT32_ROUND_TO_ZERO:
228015144b0fSOlivier Houchard         time_a_floatx80_z_int32( floatx80_to_int32_round_to_zero );
228115144b0fSOlivier Houchard         break;
228215144b0fSOlivier Houchard      case FLOATX80_TO_INT64:
228315144b0fSOlivier Houchard         time_a_floatx80_z_int64( floatx80_to_int64 );
228415144b0fSOlivier Houchard         break;
228515144b0fSOlivier Houchard      case FLOATX80_TO_INT64_ROUND_TO_ZERO:
228615144b0fSOlivier Houchard         time_a_floatx80_z_int64( floatx80_to_int64_round_to_zero );
228715144b0fSOlivier Houchard         break;
228815144b0fSOlivier Houchard      case FLOATX80_TO_FLOAT32:
228915144b0fSOlivier Houchard         time_a_floatx80_z_float32( floatx80_to_float32 );
229015144b0fSOlivier Houchard         break;
229115144b0fSOlivier Houchard      case FLOATX80_TO_FLOAT64:
229215144b0fSOlivier Houchard         time_a_floatx80_z_float64( floatx80_to_float64 );
229315144b0fSOlivier Houchard         break;
229415144b0fSOlivier Houchard #ifdef FLOAT128
229515144b0fSOlivier Houchard      case FLOATX80_TO_FLOAT128:
229615144b0fSOlivier Houchard         time_a_floatx80_z_float128( floatx80_to_float128 );
229715144b0fSOlivier Houchard         break;
229815144b0fSOlivier Houchard #endif
229915144b0fSOlivier Houchard      case FLOATX80_ROUND_TO_INT:
230015144b0fSOlivier Houchard         time_az_floatx80( floatx80_round_to_int );
230115144b0fSOlivier Houchard         break;
230215144b0fSOlivier Houchard      case FLOATX80_ADD:
230315144b0fSOlivier Houchard         time_abz_floatx80( floatx80_add );
230415144b0fSOlivier Houchard         break;
230515144b0fSOlivier Houchard      case FLOATX80_SUB:
230615144b0fSOlivier Houchard         time_abz_floatx80( floatx80_sub );
230715144b0fSOlivier Houchard         break;
230815144b0fSOlivier Houchard      case FLOATX80_MUL:
230915144b0fSOlivier Houchard         time_abz_floatx80( floatx80_mul );
231015144b0fSOlivier Houchard         break;
231115144b0fSOlivier Houchard      case FLOATX80_DIV:
231215144b0fSOlivier Houchard         time_abz_floatx80( floatx80_div );
231315144b0fSOlivier Houchard         break;
231415144b0fSOlivier Houchard      case FLOATX80_REM:
231515144b0fSOlivier Houchard         time_abz_floatx80( floatx80_rem );
231615144b0fSOlivier Houchard         break;
231715144b0fSOlivier Houchard      case FLOATX80_SQRT:
231815144b0fSOlivier Houchard         time_az_floatx80_pos( floatx80_sqrt );
231915144b0fSOlivier Houchard         break;
232015144b0fSOlivier Houchard      case FLOATX80_EQ:
232115144b0fSOlivier Houchard         time_ab_floatx80_z_flag( floatx80_eq );
232215144b0fSOlivier Houchard         break;
232315144b0fSOlivier Houchard      case FLOATX80_LE:
232415144b0fSOlivier Houchard         time_ab_floatx80_z_flag( floatx80_le );
232515144b0fSOlivier Houchard         break;
232615144b0fSOlivier Houchard      case FLOATX80_LT:
232715144b0fSOlivier Houchard         time_ab_floatx80_z_flag( floatx80_lt );
232815144b0fSOlivier Houchard         break;
232915144b0fSOlivier Houchard      case FLOATX80_EQ_SIGNALING:
233015144b0fSOlivier Houchard         time_ab_floatx80_z_flag( floatx80_eq_signaling );
233115144b0fSOlivier Houchard         break;
233215144b0fSOlivier Houchard      case FLOATX80_LE_QUIET:
233315144b0fSOlivier Houchard         time_ab_floatx80_z_flag( floatx80_le_quiet );
233415144b0fSOlivier Houchard         break;
233515144b0fSOlivier Houchard      case FLOATX80_LT_QUIET:
233615144b0fSOlivier Houchard         time_ab_floatx80_z_flag( floatx80_lt_quiet );
233715144b0fSOlivier Houchard         break;
233815144b0fSOlivier Houchard #endif
233915144b0fSOlivier Houchard #ifdef FLOAT128
234015144b0fSOlivier Houchard      case FLOAT128_TO_INT32:
234115144b0fSOlivier Houchard         time_a_float128_z_int32( float128_to_int32 );
234215144b0fSOlivier Houchard         break;
234315144b0fSOlivier Houchard      case FLOAT128_TO_INT32_ROUND_TO_ZERO:
234415144b0fSOlivier Houchard         time_a_float128_z_int32( float128_to_int32_round_to_zero );
234515144b0fSOlivier Houchard         break;
234615144b0fSOlivier Houchard      case FLOAT128_TO_INT64:
234715144b0fSOlivier Houchard         time_a_float128_z_int64( float128_to_int64 );
234815144b0fSOlivier Houchard         break;
234915144b0fSOlivier Houchard      case FLOAT128_TO_INT64_ROUND_TO_ZERO:
235015144b0fSOlivier Houchard         time_a_float128_z_int64( float128_to_int64_round_to_zero );
235115144b0fSOlivier Houchard         break;
235215144b0fSOlivier Houchard      case FLOAT128_TO_FLOAT32:
235315144b0fSOlivier Houchard         time_a_float128_z_float32( float128_to_float32 );
235415144b0fSOlivier Houchard         break;
235515144b0fSOlivier Houchard      case FLOAT128_TO_FLOAT64:
235615144b0fSOlivier Houchard         time_a_float128_z_float64( float128_to_float64 );
235715144b0fSOlivier Houchard         break;
235815144b0fSOlivier Houchard #ifdef FLOATX80
235915144b0fSOlivier Houchard      case FLOAT128_TO_FLOATX80:
236015144b0fSOlivier Houchard         time_a_float128_z_floatx80( float128_to_floatx80 );
236115144b0fSOlivier Houchard         break;
236215144b0fSOlivier Houchard #endif
236315144b0fSOlivier Houchard      case FLOAT128_ROUND_TO_INT:
236415144b0fSOlivier Houchard         time_az_float128( float128_round_to_int );
236515144b0fSOlivier Houchard         break;
236615144b0fSOlivier Houchard      case FLOAT128_ADD:
236715144b0fSOlivier Houchard         time_abz_float128( float128_add );
236815144b0fSOlivier Houchard         break;
236915144b0fSOlivier Houchard      case FLOAT128_SUB:
237015144b0fSOlivier Houchard         time_abz_float128( float128_sub );
237115144b0fSOlivier Houchard         break;
237215144b0fSOlivier Houchard      case FLOAT128_MUL:
237315144b0fSOlivier Houchard         time_abz_float128( float128_mul );
237415144b0fSOlivier Houchard         break;
237515144b0fSOlivier Houchard      case FLOAT128_DIV:
237615144b0fSOlivier Houchard         time_abz_float128( float128_div );
237715144b0fSOlivier Houchard         break;
237815144b0fSOlivier Houchard      case FLOAT128_REM:
237915144b0fSOlivier Houchard         time_abz_float128( float128_rem );
238015144b0fSOlivier Houchard         break;
238115144b0fSOlivier Houchard      case FLOAT128_SQRT:
238215144b0fSOlivier Houchard         time_az_float128_pos( float128_sqrt );
238315144b0fSOlivier Houchard         break;
238415144b0fSOlivier Houchard      case FLOAT128_EQ:
238515144b0fSOlivier Houchard         time_ab_float128_z_flag( float128_eq );
238615144b0fSOlivier Houchard         break;
238715144b0fSOlivier Houchard      case FLOAT128_LE:
238815144b0fSOlivier Houchard         time_ab_float128_z_flag( float128_le );
238915144b0fSOlivier Houchard         break;
239015144b0fSOlivier Houchard      case FLOAT128_LT:
239115144b0fSOlivier Houchard         time_ab_float128_z_flag( float128_lt );
239215144b0fSOlivier Houchard         break;
239315144b0fSOlivier Houchard      case FLOAT128_EQ_SIGNALING:
239415144b0fSOlivier Houchard         time_ab_float128_z_flag( float128_eq_signaling );
239515144b0fSOlivier Houchard         break;
239615144b0fSOlivier Houchard      case FLOAT128_LE_QUIET:
239715144b0fSOlivier Houchard         time_ab_float128_z_flag( float128_le_quiet );
239815144b0fSOlivier Houchard         break;
239915144b0fSOlivier Houchard      case FLOAT128_LT_QUIET:
240015144b0fSOlivier Houchard         time_ab_float128_z_flag( float128_lt_quiet );
240115144b0fSOlivier Houchard         break;
240215144b0fSOlivier Houchard #endif
240315144b0fSOlivier Houchard     }
240415144b0fSOlivier Houchard 
240515144b0fSOlivier Houchard }
240615144b0fSOlivier Houchard 
240715144b0fSOlivier Houchard static void
240815144b0fSOlivier Houchard  timeFunction(
240915144b0fSOlivier Houchard      uint8 functionCode,
241015144b0fSOlivier Houchard      int8 roundingPrecisionIn,
241115144b0fSOlivier Houchard      int8 roundingModeIn,
241215144b0fSOlivier Houchard      int8 tininessModeIn
241315144b0fSOlivier Houchard  )
241415144b0fSOlivier Houchard {
241515144b0fSOlivier Houchard     int8 roundingPrecision, roundingMode, tininessMode;
241615144b0fSOlivier Houchard 
241715144b0fSOlivier Houchard     roundingPrecision = 32;
241815144b0fSOlivier Houchard     for (;;) {
241915144b0fSOlivier Houchard         if ( ! functions[ functionCode ].roundingPrecision ) {
242015144b0fSOlivier Houchard             roundingPrecision = 0;
242115144b0fSOlivier Houchard         }
242215144b0fSOlivier Houchard         else if ( roundingPrecisionIn ) {
242315144b0fSOlivier Houchard             roundingPrecision = roundingPrecisionIn;
242415144b0fSOlivier Houchard         }
242515144b0fSOlivier Houchard         for ( roundingMode = 1;
242615144b0fSOlivier Houchard               roundingMode < NUM_ROUNDINGMODES;
242715144b0fSOlivier Houchard               ++roundingMode
242815144b0fSOlivier Houchard             ) {
242915144b0fSOlivier Houchard             if ( ! functions[ functionCode ].roundingMode ) {
243015144b0fSOlivier Houchard                 roundingMode = 0;
243115144b0fSOlivier Houchard             }
243215144b0fSOlivier Houchard             else if ( roundingModeIn ) {
243315144b0fSOlivier Houchard                 roundingMode = roundingModeIn;
243415144b0fSOlivier Houchard             }
243515144b0fSOlivier Houchard             for ( tininessMode = 1;
243615144b0fSOlivier Houchard                   tininessMode < NUM_TININESSMODES;
243715144b0fSOlivier Houchard                   ++tininessMode
243815144b0fSOlivier Houchard                 ) {
243915144b0fSOlivier Houchard                 if (    ( roundingPrecision == 32 )
244015144b0fSOlivier Houchard                      || ( roundingPrecision == 64 ) ) {
244115144b0fSOlivier Houchard                     if ( ! functions[ functionCode ]
244215144b0fSOlivier Houchard                                .tininessModeAtReducedPrecision
244315144b0fSOlivier Houchard                        ) {
244415144b0fSOlivier Houchard                         tininessMode = 0;
244515144b0fSOlivier Houchard                     }
244615144b0fSOlivier Houchard                     else if ( tininessModeIn ) {
244715144b0fSOlivier Houchard                         tininessMode = tininessModeIn;
244815144b0fSOlivier Houchard                     }
244915144b0fSOlivier Houchard                 }
245015144b0fSOlivier Houchard                 else {
245115144b0fSOlivier Houchard                     if ( ! functions[ functionCode ].tininessMode ) {
245215144b0fSOlivier Houchard                         tininessMode = 0;
245315144b0fSOlivier Houchard                     }
245415144b0fSOlivier Houchard                     else if ( tininessModeIn ) {
245515144b0fSOlivier Houchard                         tininessMode = tininessModeIn;
245615144b0fSOlivier Houchard                     }
245715144b0fSOlivier Houchard                 }
245815144b0fSOlivier Houchard                 timeFunctionVariety(
245915144b0fSOlivier Houchard                     functionCode, roundingPrecision, roundingMode, tininessMode
246015144b0fSOlivier Houchard                 );
246115144b0fSOlivier Houchard                 if ( tininessModeIn || ! tininessMode ) break;
246215144b0fSOlivier Houchard             }
246315144b0fSOlivier Houchard             if ( roundingModeIn || ! roundingMode ) break;
246415144b0fSOlivier Houchard         }
246515144b0fSOlivier Houchard         if ( roundingPrecisionIn || ! roundingPrecision ) break;
246615144b0fSOlivier Houchard         if ( roundingPrecision == 80 ) {
246715144b0fSOlivier Houchard             break;
246815144b0fSOlivier Houchard         }
246915144b0fSOlivier Houchard         else if ( roundingPrecision == 64 ) {
247015144b0fSOlivier Houchard             roundingPrecision = 80;
247115144b0fSOlivier Houchard         }
247215144b0fSOlivier Houchard         else if ( roundingPrecision == 32 ) {
247315144b0fSOlivier Houchard             roundingPrecision = 64;
247415144b0fSOlivier Houchard         }
247515144b0fSOlivier Houchard     }
247615144b0fSOlivier Houchard 
247715144b0fSOlivier Houchard }
247815144b0fSOlivier Houchard 
247915144b0fSOlivier Houchard main( int argc, char **argv )
248015144b0fSOlivier Houchard {
248115144b0fSOlivier Houchard     char *argPtr;
248215144b0fSOlivier Houchard     flag functionArgument;
248315144b0fSOlivier Houchard     uint8 functionCode;
248415144b0fSOlivier Houchard     int8 operands, roundingPrecision, roundingMode, tininessMode;
248515144b0fSOlivier Houchard 
248615144b0fSOlivier Houchard     if ( argc <= 1 ) goto writeHelpMessage;
248715144b0fSOlivier Houchard     functionArgument = FALSE;
248815144b0fSOlivier Houchard     functionCode = 0;
248915144b0fSOlivier Houchard     operands = 0;
249015144b0fSOlivier Houchard     roundingPrecision = 0;
249115144b0fSOlivier Houchard     roundingMode = 0;
249215144b0fSOlivier Houchard     tininessMode = 0;
249315144b0fSOlivier Houchard     --argc;
249415144b0fSOlivier Houchard     ++argv;
249515144b0fSOlivier Houchard     while ( argc && ( argPtr = argv[ 0 ] ) ) {
249615144b0fSOlivier Houchard         if ( argPtr[ 0 ] == '-' ) ++argPtr;
249715144b0fSOlivier Houchard         if ( strcmp( argPtr, "help" ) == 0 ) {
249815144b0fSOlivier Houchard  writeHelpMessage:
249915144b0fSOlivier Houchard             fputs(
250015144b0fSOlivier Houchard "timesoftfloat [<option>...] <function>\n"
250115144b0fSOlivier Houchard "  <option>:  (* is default)\n"
250215144b0fSOlivier Houchard "    -help            --Write this message and exit.\n"
250315144b0fSOlivier Houchard #ifdef FLOATX80
250415144b0fSOlivier Houchard "    -precision32     --Only time rounding precision equivalent to float32.\n"
250515144b0fSOlivier Houchard "    -precision64     --Only time rounding precision equivalent to float64.\n"
250615144b0fSOlivier Houchard "    -precision80     --Only time maximum rounding precision.\n"
250715144b0fSOlivier Houchard #endif
250815144b0fSOlivier Houchard "    -nearesteven     --Only time rounding to nearest/even.\n"
250915144b0fSOlivier Houchard "    -tozero          --Only time rounding to zero.\n"
251015144b0fSOlivier Houchard "    -down            --Only time rounding down.\n"
251115144b0fSOlivier Houchard "    -up              --Only time rounding up.\n"
251215144b0fSOlivier Houchard "    -tininessbefore  --Only time underflow tininess before rounding.\n"
251315144b0fSOlivier Houchard "    -tininessafter   --Only time underflow tininess after rounding.\n"
251415144b0fSOlivier Houchard "  <function>:\n"
251515144b0fSOlivier Houchard "    int32_to_<float>                 <float>_add   <float>_eq\n"
251615144b0fSOlivier Houchard "    <float>_to_int32                 <float>_sub   <float>_le\n"
251715144b0fSOlivier Houchard "    <float>_to_int32_round_to_zero   <float>_mul   <float>_lt\n"
251815144b0fSOlivier Houchard "    int64_to_<float>                 <float>_div   <float>_eq_signaling\n"
251915144b0fSOlivier Houchard "    <float>_to_int64                 <float>_rem   <float>_le_quiet\n"
252015144b0fSOlivier Houchard "    <float>_to_int64_round_to_zero                 <float>_lt_quiet\n"
252115144b0fSOlivier Houchard "    <float>_to_<float>\n"
252215144b0fSOlivier Houchard "    <float>_round_to_int\n"
252315144b0fSOlivier Houchard "    <float>_sqrt\n"
252415144b0fSOlivier Houchard "    -all1            --All 1-operand functions.\n"
252515144b0fSOlivier Houchard "    -all2            --All 2-operand functions.\n"
252615144b0fSOlivier Houchard "    -all             --All functions.\n"
252715144b0fSOlivier Houchard "  <float>:\n"
252815144b0fSOlivier Houchard "    float32          --Single precision.\n"
252915144b0fSOlivier Houchard "    float64          --Double precision.\n"
253015144b0fSOlivier Houchard #ifdef FLOATX80
253115144b0fSOlivier Houchard "    floatx80         --Extended double precision.\n"
253215144b0fSOlivier Houchard #endif
253315144b0fSOlivier Houchard #ifdef FLOAT128
253415144b0fSOlivier Houchard "    float128         --Quadruple precision.\n"
253515144b0fSOlivier Houchard #endif
253615144b0fSOlivier Houchard                 ,
253715144b0fSOlivier Houchard                 stdout
253815144b0fSOlivier Houchard             );
253915144b0fSOlivier Houchard             return EXIT_SUCCESS;
254015144b0fSOlivier Houchard         }
254115144b0fSOlivier Houchard #ifdef FLOATX80
254215144b0fSOlivier Houchard         else if ( strcmp( argPtr, "precision32" ) == 0 ) {
254315144b0fSOlivier Houchard             roundingPrecision = 32;
254415144b0fSOlivier Houchard         }
254515144b0fSOlivier Houchard         else if ( strcmp( argPtr, "precision64" ) == 0 ) {
254615144b0fSOlivier Houchard             roundingPrecision = 64;
254715144b0fSOlivier Houchard         }
254815144b0fSOlivier Houchard         else if ( strcmp( argPtr, "precision80" ) == 0 ) {
254915144b0fSOlivier Houchard             roundingPrecision = 80;
255015144b0fSOlivier Houchard         }
255115144b0fSOlivier Houchard #endif
255215144b0fSOlivier Houchard         else if (    ( strcmp( argPtr, "nearesteven" ) == 0 )
255315144b0fSOlivier Houchard                   || ( strcmp( argPtr, "nearest_even" ) == 0 ) ) {
255415144b0fSOlivier Houchard             roundingMode = ROUND_NEAREST_EVEN;
255515144b0fSOlivier Houchard         }
255615144b0fSOlivier Houchard         else if (    ( strcmp( argPtr, "tozero" ) == 0 )
255715144b0fSOlivier Houchard                   || ( strcmp( argPtr, "to_zero" ) == 0 ) ) {
255815144b0fSOlivier Houchard             roundingMode = ROUND_TO_ZERO;
255915144b0fSOlivier Houchard         }
256015144b0fSOlivier Houchard         else if ( strcmp( argPtr, "down" ) == 0 ) {
256115144b0fSOlivier Houchard             roundingMode = ROUND_DOWN;
256215144b0fSOlivier Houchard         }
256315144b0fSOlivier Houchard         else if ( strcmp( argPtr, "up" ) == 0 ) {
256415144b0fSOlivier Houchard             roundingMode = ROUND_UP;
256515144b0fSOlivier Houchard         }
256615144b0fSOlivier Houchard         else if ( strcmp( argPtr, "tininessbefore" ) == 0 ) {
256715144b0fSOlivier Houchard             tininessMode = TININESS_BEFORE_ROUNDING;
256815144b0fSOlivier Houchard         }
256915144b0fSOlivier Houchard         else if ( strcmp( argPtr, "tininessafter" ) == 0 ) {
257015144b0fSOlivier Houchard             tininessMode = TININESS_AFTER_ROUNDING;
257115144b0fSOlivier Houchard         }
257215144b0fSOlivier Houchard         else if ( strcmp( argPtr, "all1" ) == 0 ) {
257315144b0fSOlivier Houchard             functionArgument = TRUE;
257415144b0fSOlivier Houchard             functionCode = 0;
257515144b0fSOlivier Houchard             operands = 1;
257615144b0fSOlivier Houchard         }
257715144b0fSOlivier Houchard         else if ( strcmp( argPtr, "all2" ) == 0 ) {
257815144b0fSOlivier Houchard             functionArgument = TRUE;
257915144b0fSOlivier Houchard             functionCode = 0;
258015144b0fSOlivier Houchard             operands = 2;
258115144b0fSOlivier Houchard         }
258215144b0fSOlivier Houchard         else if ( strcmp( argPtr, "all" ) == 0 ) {
258315144b0fSOlivier Houchard             functionArgument = TRUE;
258415144b0fSOlivier Houchard             functionCode = 0;
258515144b0fSOlivier Houchard             operands = 0;
258615144b0fSOlivier Houchard         }
258715144b0fSOlivier Houchard         else {
258815144b0fSOlivier Houchard             for ( functionCode = 1;
258915144b0fSOlivier Houchard                   functionCode < NUM_FUNCTIONS;
259015144b0fSOlivier Houchard                   ++functionCode
259115144b0fSOlivier Houchard                 ) {
259215144b0fSOlivier Houchard                 if ( strcmp( argPtr, functions[ functionCode ].name ) == 0 ) {
259315144b0fSOlivier Houchard                     break;
259415144b0fSOlivier Houchard                 }
259515144b0fSOlivier Houchard             }
259615144b0fSOlivier Houchard             if ( functionCode == NUM_FUNCTIONS ) {
259715144b0fSOlivier Houchard                 fail( "Invalid option or function `%s'", argv[ 0 ] );
259815144b0fSOlivier Houchard             }
259915144b0fSOlivier Houchard             functionArgument = TRUE;
260015144b0fSOlivier Houchard         }
260115144b0fSOlivier Houchard         --argc;
260215144b0fSOlivier Houchard         ++argv;
260315144b0fSOlivier Houchard     }
260415144b0fSOlivier Houchard     if ( ! functionArgument ) fail( "Function argument required" );
260515144b0fSOlivier Houchard     if ( functionCode ) {
260615144b0fSOlivier Houchard         timeFunction(
260715144b0fSOlivier Houchard             functionCode, roundingPrecision, roundingMode, tininessMode );
260815144b0fSOlivier Houchard     }
260915144b0fSOlivier Houchard     else if ( operands == 1 ) {
261015144b0fSOlivier Houchard         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
261115144b0fSOlivier Houchard             ) {
261215144b0fSOlivier Houchard             if ( functions[ functionCode ].numInputs == 1 ) {
261315144b0fSOlivier Houchard                 timeFunction(
261415144b0fSOlivier Houchard                     functionCode, roundingPrecision, roundingMode, tininessMode
261515144b0fSOlivier Houchard                 );
261615144b0fSOlivier Houchard             }
261715144b0fSOlivier Houchard         }
261815144b0fSOlivier Houchard     }
261915144b0fSOlivier Houchard     else if ( operands == 2 ) {
262015144b0fSOlivier Houchard         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
262115144b0fSOlivier Houchard             ) {
262215144b0fSOlivier Houchard             if ( functions[ functionCode ].numInputs == 2 ) {
262315144b0fSOlivier Houchard                 timeFunction(
262415144b0fSOlivier Houchard                     functionCode, roundingPrecision, roundingMode, tininessMode
262515144b0fSOlivier Houchard                 );
262615144b0fSOlivier Houchard             }
262715144b0fSOlivier Houchard         }
262815144b0fSOlivier Houchard     }
262915144b0fSOlivier Houchard     else {
263015144b0fSOlivier Houchard         for ( functionCode = 1; functionCode < NUM_FUNCTIONS; ++functionCode
263115144b0fSOlivier Houchard             ) {
263215144b0fSOlivier Houchard             timeFunction(
263315144b0fSOlivier Houchard                 functionCode, roundingPrecision, roundingMode, tininessMode );
263415144b0fSOlivier Houchard         }
263515144b0fSOlivier Houchard     }
263615144b0fSOlivier Houchard     return EXIT_SUCCESS;
263715144b0fSOlivier Houchard 
263815144b0fSOlivier Houchard }
263915144b0fSOlivier Houchard 
2640