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