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