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