Home | History | Annotate | Line # | Download | only in testfloat
testLoops.c revision 1.2
      1  1.2  ross /* $NetBSD: testLoops.c,v 1.2 2001/03/13 06:48:56 ross Exp $ */
      2  1.1  ross 
      3  1.1  ross /*
      4  1.1  ross ===============================================================================
      5  1.1  ross 
      6  1.1  ross This C source file is part of TestFloat, Release 2a, a package of programs
      7  1.1  ross for testing the correctness of floating-point arithmetic complying to the
      8  1.1  ross IEC/IEEE Standard for Floating-Point.
      9  1.1  ross 
     10  1.1  ross Written by John R. Hauser.  More information is available through the Web
     11  1.1  ross page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
     12  1.1  ross 
     13  1.1  ross THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
     14  1.1  ross has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
     15  1.1  ross TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
     16  1.1  ross PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
     17  1.1  ross AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
     18  1.1  ross 
     19  1.1  ross Derivative works are acceptable, even for commercial purposes, so long as
     20  1.1  ross (1) they include prominent notice that the work is derivative, and (2) they
     21  1.1  ross include prominent notice akin to these four paragraphs for those parts of
     22  1.1  ross this code that are retained.
     23  1.1  ross 
     24  1.1  ross ===============================================================================
     25  1.1  ross */
     26  1.1  ross 
     27  1.1  ross #include <stdlib.h>
     28  1.1  ross #include <stdio.h>
     29  1.1  ross #include "milieu.h"
     30  1.1  ross #include "softfloat.h"
     31  1.1  ross #include "testCases.h"
     32  1.1  ross #include "writeHex.h"
     33  1.1  ross #include "testLoops.h"
     34  1.1  ross 
     35  1.1  ross volatile flag stop = FALSE;
     36  1.1  ross 
     37  1.2  ross const char *trueName, *testName;
     38  1.1  ross flag forever, errorStop;
     39  1.1  ross uint32 maxErrorCount = 0;
     40  1.1  ross flag checkNaNs = FALSE;
     41  1.1  ross int8 *trueFlagsPtr;
     42  1.1  ross int8 ( *testFlagsFunctionPtr )( void );
     43  1.2  ross const char *functionName;
     44  1.2  ross const char *roundingPrecisionName, *roundingModeName, *tininessModeName;
     45  1.1  ross flag anyErrors = FALSE;
     46  1.1  ross 
     47  1.1  ross void writeFunctionName( FILE *stream )
     48  1.1  ross {
     49  1.1  ross 
     50  1.1  ross     fputs( functionName, stream );
     51  1.1  ross     if ( roundingModeName ) {
     52  1.1  ross         if ( roundingPrecisionName ) {
     53  1.1  ross             fputs( ", precision ", stream );
     54  1.1  ross             fputs( roundingPrecisionName, stream );
     55  1.1  ross         }
     56  1.1  ross         fputs( ", rounding ", stream );
     57  1.1  ross         fputs( roundingModeName, stream );
     58  1.1  ross         if ( tininessModeName ) {
     59  1.1  ross             fputs( ", tininess ", stream );
     60  1.1  ross             fputs( tininessModeName, stream );
     61  1.1  ross             fputs( " rounding", stream );
     62  1.1  ross         }
     63  1.1  ross     }
     64  1.1  ross 
     65  1.1  ross }
     66  1.1  ross 
     67  1.1  ross void exitWithStatus( void )
     68  1.1  ross {
     69  1.1  ross 
     70  1.1  ross     exit( anyErrors ? EXIT_FAILURE : EXIT_SUCCESS );
     71  1.1  ross 
     72  1.1  ross }
     73  1.1  ross 
     74  1.1  ross static uint32 tenthousandsCount, errorCount = 0;
     75  1.1  ross 
     76  1.1  ross static void writeTestsTotal( void )
     77  1.1  ross {
     78  1.1  ross 
     79  1.1  ross     if ( forever ) {
     80  1.1  ross         fputs( "Unbounded tests.\n", stderr );
     81  1.1  ross     }
     82  1.1  ross     else {
     83  1.2  ross         fprintf( stderr, "%d tests total.\n", testCases_total );
     84  1.1  ross     }
     85  1.1  ross 
     86  1.1  ross }
     87  1.1  ross 
     88  1.1  ross static void writeTestsPerformed( int16 count )
     89  1.1  ross {
     90  1.1  ross 
     91  1.1  ross     if ( tenthousandsCount ) {
     92  1.1  ross         fprintf(
     93  1.2  ross             stderr, "%d%04d tests performed", tenthousandsCount, count );
     94  1.1  ross     }
     95  1.1  ross     else {
     96  1.2  ross         fprintf( stderr, "%d tests performed", count );
     97  1.1  ross     }
     98  1.1  ross     if ( errorCount ) {
     99  1.1  ross         fprintf(
    100  1.1  ross             stderr,
    101  1.1  ross             "; %d error%s found.\n",
    102  1.1  ross             errorCount,
    103  1.1  ross             ( errorCount == 1 ) ? "" : "s"
    104  1.1  ross         );
    105  1.1  ross     }
    106  1.1  ross     else {
    107  1.1  ross         fputs( ".\n", stderr );
    108  1.1  ross         fputs( "No errors found in ", stdout );
    109  1.1  ross         writeFunctionName( stdout );
    110  1.1  ross         fputs( ".\n", stdout );
    111  1.1  ross         fflush( stdout );
    112  1.1  ross     }
    113  1.1  ross 
    114  1.1  ross }
    115  1.1  ross 
    116  1.1  ross static void checkEarlyExit( void )
    117  1.1  ross {
    118  1.1  ross 
    119  1.1  ross     ++tenthousandsCount;
    120  1.1  ross     if ( stop ) {
    121  1.1  ross         writeTestsPerformed( 0 );
    122  1.1  ross         exitWithStatus();
    123  1.1  ross     }
    124  1.2  ross     fprintf( stderr, "%3d0000", tenthousandsCount );
    125  1.1  ross 
    126  1.1  ross }
    127  1.1  ross 
    128  1.1  ross static void writeErrorFound( int16 count )
    129  1.1  ross {
    130  1.1  ross 
    131  1.1  ross     if ( errorCount == 1 ) {
    132  1.1  ross         fputs( "Errors found in ", stdout );
    133  1.1  ross         writeFunctionName( stdout );
    134  1.1  ross         fputs( ":\n", stdout );
    135  1.1  ross     }
    136  1.1  ross     if ( stop ) {
    137  1.1  ross         writeTestsPerformed( count );
    138  1.1  ross         exitWithStatus();
    139  1.1  ross     }
    140  1.1  ross     anyErrors = TRUE;
    141  1.1  ross 
    142  1.1  ross }
    143  1.1  ross 
    144  1.1  ross INLINE void writeInput_a_int32( void )
    145  1.1  ross {
    146  1.1  ross 
    147  1.1  ross     writeHex_bits32( testCases_a_int32, stdout );
    148  1.1  ross 
    149  1.1  ross }
    150  1.1  ross 
    151  1.1  ross #ifdef BITS64
    152  1.1  ross 
    153  1.1  ross INLINE void writeInput_a_int64( void )
    154  1.1  ross {
    155  1.1  ross 
    156  1.1  ross     writeHex_bits64( testCases_a_int64, stdout );
    157  1.1  ross 
    158  1.1  ross }
    159  1.1  ross 
    160  1.1  ross #endif
    161  1.1  ross 
    162  1.1  ross INLINE void writeInput_a_float32( void )
    163  1.1  ross {
    164  1.1  ross 
    165  1.1  ross     writeHex_float32( testCases_a_float32, stdout );
    166  1.1  ross 
    167  1.1  ross }
    168  1.1  ross 
    169  1.1  ross static void writeInputs_ab_float32( void )
    170  1.1  ross {
    171  1.1  ross 
    172  1.1  ross     writeHex_float32( testCases_a_float32, stdout );
    173  1.1  ross     fputs( "  ", stdout );
    174  1.1  ross     writeHex_float32( testCases_b_float32, stdout );
    175  1.1  ross 
    176  1.1  ross }
    177  1.1  ross 
    178  1.1  ross INLINE void writeInput_a_float64( void )
    179  1.1  ross {
    180  1.1  ross 
    181  1.1  ross     writeHex_float64( testCases_a_float64, stdout );
    182  1.1  ross 
    183  1.1  ross }
    184  1.1  ross 
    185  1.1  ross static void writeInputs_ab_float64( void )
    186  1.1  ross {
    187  1.1  ross 
    188  1.1  ross     writeHex_float64( testCases_a_float64, stdout );
    189  1.1  ross     fputs( "  ", stdout );
    190  1.1  ross     writeHex_float64( testCases_b_float64, stdout );
    191  1.1  ross 
    192  1.1  ross }
    193  1.1  ross 
    194  1.1  ross #ifdef FLOATX80
    195  1.1  ross 
    196  1.1  ross INLINE void writeInput_a_floatx80( void )
    197  1.1  ross {
    198  1.1  ross 
    199  1.1  ross     writeHex_floatx80( testCases_a_floatx80, stdout );
    200  1.1  ross 
    201  1.1  ross }
    202  1.1  ross 
    203  1.1  ross static void writeInputs_ab_floatx80( void )
    204  1.1  ross {
    205  1.1  ross 
    206  1.1  ross     writeHex_floatx80( testCases_a_floatx80, stdout );
    207  1.1  ross     fputs( "  ", stdout );
    208  1.1  ross     writeHex_floatx80( testCases_b_floatx80, stdout );
    209  1.1  ross 
    210  1.1  ross }
    211  1.1  ross 
    212  1.1  ross #endif
    213  1.1  ross 
    214  1.1  ross #ifdef FLOAT128
    215  1.1  ross 
    216  1.1  ross INLINE void writeInput_a_float128( void )
    217  1.1  ross {
    218  1.1  ross 
    219  1.1  ross     writeHex_float128( testCases_a_float128, stdout );
    220  1.1  ross 
    221  1.1  ross }
    222  1.1  ross 
    223  1.1  ross static void writeInputs_ab_float128( void )
    224  1.1  ross {
    225  1.1  ross 
    226  1.1  ross     writeHex_float128( testCases_a_float128, stdout );
    227  1.1  ross     fputs( "  ", stdout );
    228  1.1  ross     writeHex_float128( testCases_b_float128, stdout );
    229  1.1  ross 
    230  1.1  ross }
    231  1.1  ross 
    232  1.1  ross #endif
    233  1.1  ross 
    234  1.1  ross static void
    235  1.1  ross  writeOutputs_z_flag(
    236  1.1  ross      flag trueZ, uint8 trueFlags, flag testZ, uint8 testFlags )
    237  1.1  ross {
    238  1.1  ross 
    239  1.1  ross     fputs( trueName, stdout );
    240  1.1  ross     fputs( ": ", stdout );
    241  1.1  ross     writeHex_flag( trueZ, stdout );
    242  1.1  ross     fputc( ' ', stdout );
    243  1.1  ross     writeHex_float_flags( trueFlags, stdout );
    244  1.1  ross     fputs( "  ", stdout );
    245  1.1  ross     fputs( testName, stdout );
    246  1.1  ross     fputs( ": ", stdout );
    247  1.1  ross     writeHex_flag( testZ, stdout );
    248  1.1  ross     fputc( ' ', stdout );
    249  1.1  ross     writeHex_float_flags( testFlags, stdout );
    250  1.1  ross     fputc( '\n', stdout );
    251  1.1  ross 
    252  1.1  ross }
    253  1.1  ross 
    254  1.1  ross static void
    255  1.1  ross  writeOutputs_z_int32(
    256  1.1  ross      int32 trueZ, uint8 trueFlags, int32 testZ, uint8 testFlags )
    257  1.1  ross {
    258  1.1  ross 
    259  1.1  ross     fputs( trueName, stdout );
    260  1.1  ross     fputs( ": ", stdout );
    261  1.1  ross     writeHex_bits32( trueZ, stdout );
    262  1.1  ross     fputc( ' ', stdout );
    263  1.1  ross     writeHex_float_flags( trueFlags, stdout );
    264  1.1  ross     fputs( "  ", stdout );
    265  1.1  ross     fputs( testName, stdout );
    266  1.1  ross     fputs( ": ", stdout );
    267  1.1  ross     writeHex_bits32( testZ, stdout );
    268  1.1  ross     fputc( ' ', stdout );
    269  1.1  ross     writeHex_float_flags( testFlags, stdout );
    270  1.1  ross     fputc( '\n', stdout );
    271  1.1  ross 
    272  1.1  ross }
    273  1.1  ross 
    274  1.1  ross #ifdef BITS64
    275  1.1  ross 
    276  1.1  ross static void
    277  1.1  ross  writeOutputs_z_int64(
    278  1.1  ross      int64 trueZ, uint8 trueFlags, int64 testZ, uint8 testFlags )
    279  1.1  ross {
    280  1.1  ross 
    281  1.1  ross     fputs( trueName, stdout );
    282  1.1  ross     fputs( ": ", stdout );
    283  1.1  ross     writeHex_bits64( trueZ, stdout );
    284  1.1  ross     fputc( ' ', stdout );
    285  1.1  ross     writeHex_float_flags( trueFlags, stdout );
    286  1.1  ross     fputs( "  ", stdout );
    287  1.1  ross     fputs( testName, stdout );
    288  1.1  ross     fputs( ": ", stdout );
    289  1.1  ross     writeHex_bits64( testZ, stdout );
    290  1.1  ross     fputc( ' ', stdout );
    291  1.1  ross     writeHex_float_flags( testFlags, stdout );
    292  1.1  ross     fputc( '\n', stdout );
    293  1.1  ross 
    294  1.1  ross }
    295  1.1  ross 
    296  1.1  ross #endif
    297  1.1  ross 
    298  1.1  ross static void
    299  1.1  ross  writeOutputs_z_float32(
    300  1.1  ross      float32 trueZ, uint8 trueFlags, float32 testZ, uint8 testFlags )
    301  1.1  ross {
    302  1.1  ross 
    303  1.1  ross     fputs( trueName, stdout );
    304  1.1  ross     fputs( ": ", stdout );
    305  1.1  ross     writeHex_float32( trueZ, stdout );
    306  1.1  ross     fputc( ' ', stdout );
    307  1.1  ross     writeHex_float_flags( trueFlags, stdout );
    308  1.1  ross     fputs( "  ", stdout );
    309  1.1  ross     fputs( testName, stdout );
    310  1.1  ross     fputs( ": ", stdout );
    311  1.1  ross     writeHex_float32( testZ, stdout );
    312  1.1  ross     fputc( ' ', stdout );
    313  1.1  ross     writeHex_float_flags( testFlags, stdout );
    314  1.1  ross     fputc( '\n', stdout );
    315  1.1  ross 
    316  1.1  ross }
    317  1.1  ross 
    318  1.1  ross static void
    319  1.1  ross  writeOutputs_z_float64(
    320  1.1  ross      float64 trueZ, uint8 trueFlags, float64 testZ, uint8 testFlags )
    321  1.1  ross {
    322  1.1  ross 
    323  1.1  ross     fputs( trueName, stdout );
    324  1.1  ross     fputs( ": ", stdout );
    325  1.1  ross     writeHex_float64( trueZ, stdout );
    326  1.1  ross     fputc( ' ', stdout );
    327  1.1  ross     writeHex_float_flags( trueFlags, stdout );
    328  1.1  ross     fputs( "  ", stdout );
    329  1.1  ross     fputs( testName, stdout );
    330  1.1  ross     fputs( ": ", stdout );
    331  1.1  ross     writeHex_float64( testZ, stdout );
    332  1.1  ross     fputc( ' ', stdout );
    333  1.1  ross     writeHex_float_flags( testFlags, stdout );
    334  1.1  ross     fputc( '\n', stdout );
    335  1.1  ross 
    336  1.1  ross }
    337  1.1  ross 
    338  1.1  ross #ifdef FLOATX80
    339  1.1  ross 
    340  1.1  ross static void
    341  1.1  ross  writeOutputs_z_floatx80(
    342  1.1  ross      floatx80 trueZ, uint8 trueFlags, floatx80 testZ, uint8 testFlags )
    343  1.1  ross {
    344  1.1  ross 
    345  1.1  ross     fputs( trueName, stdout );
    346  1.1  ross     fputs( ": ", stdout );
    347  1.1  ross     writeHex_floatx80( trueZ, stdout );
    348  1.1  ross     fputc( ' ', stdout );
    349  1.1  ross     writeHex_float_flags( trueFlags, stdout );
    350  1.1  ross     fputs( "  ", stdout );
    351  1.1  ross     fputs( testName, stdout );
    352  1.1  ross     fputs( ": ", stdout );
    353  1.1  ross     writeHex_floatx80( testZ, stdout );
    354  1.1  ross     fputc( ' ', stdout );
    355  1.1  ross     writeHex_float_flags( testFlags, stdout );
    356  1.1  ross     fputc( '\n', stdout );
    357  1.1  ross 
    358  1.1  ross }
    359  1.1  ross 
    360  1.1  ross #endif
    361  1.1  ross 
    362  1.1  ross #ifdef FLOAT128
    363  1.1  ross 
    364  1.1  ross static void
    365  1.1  ross  writeOutputs_z_float128(
    366  1.1  ross      float128 trueZ, uint8 trueFlags, float128 testZ, uint8 testFlags )
    367  1.1  ross {
    368  1.1  ross 
    369  1.1  ross     fputs( trueName, stdout );
    370  1.1  ross     fputs( ": ", stdout );
    371  1.1  ross     writeHex_float128( trueZ, stdout );
    372  1.1  ross     fputc( ' ', stdout );
    373  1.1  ross     writeHex_float_flags( trueFlags, stdout );
    374  1.1  ross     fputs( "\n\t", stdout );
    375  1.1  ross     fputs( testName, stdout );
    376  1.1  ross     fputs( ": ", stdout );
    377  1.1  ross     writeHex_float128( testZ, stdout );
    378  1.1  ross     fputc( ' ', stdout );
    379  1.1  ross     writeHex_float_flags( testFlags, stdout );
    380  1.1  ross     fputc( '\n', stdout );
    381  1.1  ross 
    382  1.1  ross }
    383  1.1  ross 
    384  1.1  ross #endif
    385  1.1  ross 
    386  1.1  ross INLINE flag float32_isNaN( float32 a )
    387  1.1  ross {
    388  1.1  ross 
    389  1.1  ross     return 0x7F800000 < ( a & 0x7FFFFFFF );
    390  1.1  ross 
    391  1.1  ross }
    392  1.1  ross 
    393  1.1  ross #ifdef BITS64
    394  1.1  ross 
    395  1.1  ross INLINE flag float64_same( float64 a, float64 b )
    396  1.1  ross {
    397  1.1  ross 
    398  1.1  ross     return a == b;
    399  1.1  ross 
    400  1.1  ross }
    401  1.1  ross 
    402  1.1  ross INLINE flag float64_isNaN( float64 a )
    403  1.1  ross {
    404  1.1  ross 
    405  1.1  ross     return LIT64( 0x7FF0000000000000 ) < ( a & LIT64( 0x7FFFFFFFFFFFFFFF ) );
    406  1.1  ross 
    407  1.1  ross }
    408  1.1  ross 
    409  1.1  ross #else
    410  1.1  ross 
    411  1.1  ross INLINE flag float64_same( float64 a, float64 b )
    412  1.1  ross {
    413  1.1  ross 
    414  1.1  ross     return ( a.high == b.high ) && ( a.low == b.low );
    415  1.1  ross 
    416  1.1  ross }
    417  1.1  ross 
    418  1.1  ross INLINE flag float64_isNaN( float64 a )
    419  1.1  ross {
    420  1.1  ross     bits32 absAHigh;
    421  1.1  ross 
    422  1.1  ross     absAHigh = a.high & 0x7FFFFFFF;
    423  1.1  ross     return
    424  1.1  ross         ( 0x7FF00000 < absAHigh ) || ( ( absAHigh == 0x7FF00000 ) && a.low );
    425  1.1  ross 
    426  1.1  ross }
    427  1.1  ross 
    428  1.1  ross #endif
    429  1.1  ross 
    430  1.1  ross #ifdef FLOATX80
    431  1.1  ross 
    432  1.1  ross INLINE flag floatx80_same( floatx80 a, floatx80 b )
    433  1.1  ross {
    434  1.1  ross 
    435  1.1  ross     return ( a.high == b.high ) && ( a.low == b.low );
    436  1.1  ross 
    437  1.1  ross }
    438  1.1  ross 
    439  1.1  ross INLINE flag floatx80_isNaN( floatx80 a )
    440  1.1  ross {
    441  1.1  ross 
    442  1.1  ross     return ( ( a.high & 0x7FFF ) == 0x7FFF ) && a.low;
    443  1.1  ross 
    444  1.1  ross }
    445  1.1  ross 
    446  1.1  ross #endif
    447  1.1  ross 
    448  1.1  ross #ifdef FLOAT128
    449  1.1  ross 
    450  1.1  ross INLINE flag float128_same( float128 a, float128 b )
    451  1.1  ross {
    452  1.1  ross 
    453  1.1  ross     return ( a.high == b.high ) && ( a.low == b.low );
    454  1.1  ross 
    455  1.1  ross }
    456  1.1  ross 
    457  1.1  ross INLINE flag float128_isNaN( float128 a )
    458  1.1  ross {
    459  1.1  ross     bits64 absAHigh;
    460  1.1  ross 
    461  1.1  ross     absAHigh = a.high & LIT64( 0x7FFFFFFFFFFFFFFF );
    462  1.1  ross     return
    463  1.1  ross            ( LIT64( 0x7FFF000000000000 ) < absAHigh )
    464  1.1  ross         || ( ( absAHigh == LIT64( 0x7FFF000000000000 ) ) && a.low );
    465  1.1  ross 
    466  1.1  ross }
    467  1.1  ross 
    468  1.1  ross #endif
    469  1.1  ross 
    470  1.1  ross void
    471  1.1  ross  test_a_int32_z_float32(
    472  1.1  ross      float32 trueFunction( int32 ), float32 testFunction( int32 ) )
    473  1.1  ross {
    474  1.1  ross     int16 count;
    475  1.1  ross     float32 trueZ, testZ;
    476  1.1  ross     uint8 trueFlags, testFlags;
    477  1.1  ross 
    478  1.1  ross     errorCount = 0;
    479  1.1  ross     tenthousandsCount = 0;
    480  1.1  ross     count = 10000;
    481  1.1  ross     testCases_initSequence( testCases_sequence_a_int32 );
    482  1.1  ross     writeTestsTotal();
    483  1.1  ross     while ( ! testCases_done || forever ) {
    484  1.1  ross         testCases_next();
    485  1.1  ross         *trueFlagsPtr = 0;
    486  1.1  ross         trueZ = trueFunction( testCases_a_int32 );
    487  1.1  ross         trueFlags = *trueFlagsPtr;
    488  1.1  ross         (void) testFlagsFunctionPtr();
    489  1.1  ross         testZ = testFunction( testCases_a_int32 );
    490  1.1  ross         testFlags = testFlagsFunctionPtr();
    491  1.1  ross         --count;
    492  1.1  ross         if ( count == 0 ) {
    493  1.1  ross             checkEarlyExit();
    494  1.1  ross             count = 10000;
    495  1.1  ross         }
    496  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
    497  1.1  ross             if (    ! checkNaNs
    498  1.1  ross                  && float32_isNaN( trueZ )
    499  1.1  ross                  && float32_isNaN( testZ )
    500  1.1  ross                  && ! float32_is_signaling_nan( testZ )
    501  1.1  ross                  && ( trueFlags == testFlags )
    502  1.1  ross                ) {
    503  1.1  ross                 /* no problem */
    504  1.1  ross             }
    505  1.1  ross             else {
    506  1.1  ross                 ++errorCount;
    507  1.1  ross                 writeErrorFound( 10000 - count );
    508  1.1  ross                 writeInput_a_int32();
    509  1.1  ross                 fputs( "  ", stdout );
    510  1.1  ross                 writeOutputs_z_float32( trueZ, trueFlags, testZ, testFlags );
    511  1.1  ross                 fflush( stdout );
    512  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    513  1.1  ross             }
    514  1.1  ross         }
    515  1.1  ross     }
    516  1.1  ross  exit:
    517  1.1  ross     writeTestsPerformed( 10000 - count );
    518  1.1  ross 
    519  1.1  ross }
    520  1.1  ross 
    521  1.1  ross void
    522  1.1  ross  test_a_int32_z_float64(
    523  1.1  ross      float64 trueFunction( int32 ), float64 testFunction( int32 ) )
    524  1.1  ross {
    525  1.1  ross     int16 count;
    526  1.1  ross     float64 trueZ, testZ;
    527  1.1  ross     uint8 trueFlags, testFlags;
    528  1.1  ross 
    529  1.1  ross     errorCount = 0;
    530  1.1  ross     tenthousandsCount = 0;
    531  1.1  ross     count = 10000;
    532  1.1  ross     testCases_initSequence( testCases_sequence_a_int32 );
    533  1.1  ross     writeTestsTotal();
    534  1.1  ross     while ( ! testCases_done || forever ) {
    535  1.1  ross         testCases_next();
    536  1.1  ross         *trueFlagsPtr = 0;
    537  1.1  ross         trueZ = trueFunction( testCases_a_int32 );
    538  1.1  ross         trueFlags = *trueFlagsPtr;
    539  1.1  ross         (void) testFlagsFunctionPtr();
    540  1.1  ross         testZ = testFunction( testCases_a_int32 );
    541  1.1  ross         testFlags = testFlagsFunctionPtr();
    542  1.1  ross         --count;
    543  1.1  ross         if ( count == 0 ) {
    544  1.1  ross             checkEarlyExit();
    545  1.1  ross             count = 10000;
    546  1.1  ross         }
    547  1.1  ross         if ( ! float64_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
    548  1.1  ross             if (    ! checkNaNs
    549  1.1  ross                  && float64_isNaN( trueZ )
    550  1.1  ross                  && float64_isNaN( testZ )
    551  1.1  ross                  && ! float64_is_signaling_nan( testZ )
    552  1.1  ross                  && ( trueFlags == testFlags )
    553  1.1  ross                ) {
    554  1.1  ross                 /* no problem */
    555  1.1  ross             }
    556  1.1  ross             else {
    557  1.1  ross                 ++errorCount;
    558  1.1  ross                 writeErrorFound( 10000 - count );
    559  1.1  ross                 writeInput_a_int32();
    560  1.1  ross                 fputs( "  ", stdout );
    561  1.1  ross                 writeOutputs_z_float64( trueZ, trueFlags, testZ, testFlags );
    562  1.1  ross                 fflush( stdout );
    563  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    564  1.1  ross             }
    565  1.1  ross         }
    566  1.1  ross     }
    567  1.1  ross  exit:
    568  1.1  ross     writeTestsPerformed( 10000 - count );
    569  1.1  ross 
    570  1.1  ross }
    571  1.1  ross 
    572  1.1  ross #ifdef FLOATX80
    573  1.1  ross 
    574  1.1  ross void
    575  1.1  ross  test_a_int32_z_floatx80(
    576  1.1  ross      floatx80 trueFunction( int32 ), floatx80 testFunction( int32 ) )
    577  1.1  ross {
    578  1.1  ross     int16 count;
    579  1.1  ross     floatx80 trueZ, testZ;
    580  1.1  ross     uint8 trueFlags, testFlags;
    581  1.1  ross 
    582  1.1  ross     errorCount = 0;
    583  1.1  ross     tenthousandsCount = 0;
    584  1.1  ross     count = 10000;
    585  1.1  ross     testCases_initSequence( testCases_sequence_a_int32 );
    586  1.1  ross     writeTestsTotal();
    587  1.1  ross     while ( ! testCases_done || forever ) {
    588  1.1  ross         testCases_next();
    589  1.1  ross         *trueFlagsPtr = 0;
    590  1.1  ross         trueZ = trueFunction( testCases_a_int32 );
    591  1.1  ross         trueFlags = *trueFlagsPtr;
    592  1.1  ross         (void) testFlagsFunctionPtr();
    593  1.1  ross         testZ = testFunction( testCases_a_int32 );
    594  1.1  ross         testFlags = testFlagsFunctionPtr();
    595  1.1  ross         --count;
    596  1.1  ross         if ( count == 0 ) {
    597  1.1  ross             checkEarlyExit();
    598  1.1  ross             count = 10000;
    599  1.1  ross         }
    600  1.1  ross         if ( ! floatx80_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
    601  1.1  ross             if (    ! checkNaNs
    602  1.1  ross                  && floatx80_isNaN( trueZ )
    603  1.1  ross                  && floatx80_isNaN( testZ )
    604  1.1  ross                  && ! floatx80_is_signaling_nan( testZ )
    605  1.1  ross                  && ( trueFlags == testFlags )
    606  1.1  ross                ) {
    607  1.1  ross                 /* no problem */
    608  1.1  ross             }
    609  1.1  ross             else {
    610  1.1  ross                 ++errorCount;
    611  1.1  ross                 writeErrorFound( 10000 - count );
    612  1.1  ross                 writeInput_a_int32();
    613  1.1  ross                 fputs( "  ", stdout );
    614  1.1  ross                 writeOutputs_z_floatx80( trueZ, trueFlags, testZ, testFlags );
    615  1.1  ross                 fflush( stdout );
    616  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    617  1.1  ross             }
    618  1.1  ross         }
    619  1.1  ross     }
    620  1.1  ross  exit:
    621  1.1  ross     writeTestsPerformed( 10000 - count );
    622  1.1  ross 
    623  1.1  ross }
    624  1.1  ross 
    625  1.1  ross #endif
    626  1.1  ross 
    627  1.1  ross #ifdef FLOAT128
    628  1.1  ross 
    629  1.1  ross void
    630  1.1  ross  test_a_int32_z_float128(
    631  1.1  ross      float128 trueFunction( int32 ), float128 testFunction( int32 ) )
    632  1.1  ross {
    633  1.1  ross     int16 count;
    634  1.1  ross     float128 trueZ, testZ;
    635  1.1  ross     uint8 trueFlags, testFlags;
    636  1.1  ross 
    637  1.1  ross     errorCount = 0;
    638  1.1  ross     tenthousandsCount = 0;
    639  1.1  ross     count = 10000;
    640  1.1  ross     testCases_initSequence( testCases_sequence_a_int32 );
    641  1.1  ross     writeTestsTotal();
    642  1.1  ross     while ( ! testCases_done || forever ) {
    643  1.1  ross         testCases_next();
    644  1.1  ross         *trueFlagsPtr = 0;
    645  1.1  ross         trueZ = trueFunction( testCases_a_int32 );
    646  1.1  ross         trueFlags = *trueFlagsPtr;
    647  1.1  ross         (void) testFlagsFunctionPtr();
    648  1.1  ross         testZ = testFunction( testCases_a_int32 );
    649  1.1  ross         testFlags = testFlagsFunctionPtr();
    650  1.1  ross         --count;
    651  1.1  ross         if ( count == 0 ) {
    652  1.1  ross             checkEarlyExit();
    653  1.1  ross             count = 10000;
    654  1.1  ross         }
    655  1.1  ross         if ( ! float128_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
    656  1.1  ross             if (    ! checkNaNs
    657  1.1  ross                  && float128_isNaN( trueZ )
    658  1.1  ross                  && float128_isNaN( testZ )
    659  1.1  ross                  && ! float128_is_signaling_nan( testZ )
    660  1.1  ross                  && ( trueFlags == testFlags )
    661  1.1  ross                ) {
    662  1.1  ross                 /* no problem */
    663  1.1  ross             }
    664  1.1  ross             else {
    665  1.1  ross                 ++errorCount;
    666  1.1  ross                 writeErrorFound( 10000 - count );
    667  1.1  ross                 writeInput_a_int32();
    668  1.1  ross                 fputs( "\n\t", stdout );
    669  1.1  ross                 writeOutputs_z_float128( trueZ, trueFlags, testZ, testFlags );
    670  1.1  ross                 fflush( stdout );
    671  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    672  1.1  ross             }
    673  1.1  ross         }
    674  1.1  ross     }
    675  1.1  ross  exit:
    676  1.1  ross     writeTestsPerformed( 10000 - count );
    677  1.1  ross 
    678  1.1  ross }
    679  1.1  ross 
    680  1.1  ross #endif
    681  1.1  ross 
    682  1.1  ross #ifdef BITS64
    683  1.1  ross 
    684  1.1  ross void
    685  1.1  ross  test_a_int64_z_float32(
    686  1.1  ross      float32 trueFunction( int64 ), float32 testFunction( int64 ) )
    687  1.1  ross {
    688  1.1  ross     int16 count;
    689  1.1  ross     float32 trueZ, testZ;
    690  1.1  ross     uint8 trueFlags, testFlags;
    691  1.1  ross 
    692  1.1  ross     errorCount = 0;
    693  1.1  ross     tenthousandsCount = 0;
    694  1.1  ross     count = 10000;
    695  1.1  ross     testCases_initSequence( testCases_sequence_a_int64 );
    696  1.1  ross     writeTestsTotal();
    697  1.1  ross     while ( ! testCases_done || forever ) {
    698  1.1  ross         testCases_next();
    699  1.1  ross         *trueFlagsPtr = 0;
    700  1.1  ross         trueZ = trueFunction( testCases_a_int64 );
    701  1.1  ross         trueFlags = *trueFlagsPtr;
    702  1.1  ross         (void) testFlagsFunctionPtr();
    703  1.1  ross         testZ = testFunction( testCases_a_int64 );
    704  1.1  ross         testFlags = testFlagsFunctionPtr();
    705  1.1  ross         --count;
    706  1.1  ross         if ( count == 0 ) {
    707  1.1  ross             checkEarlyExit();
    708  1.1  ross             count = 10000;
    709  1.1  ross         }
    710  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
    711  1.1  ross             if (    ! checkNaNs
    712  1.1  ross                  && float32_isNaN( trueZ )
    713  1.1  ross                  && float32_isNaN( testZ )
    714  1.1  ross                  && ! float32_is_signaling_nan( testZ )
    715  1.1  ross                  && ( trueFlags == testFlags )
    716  1.1  ross                ) {
    717  1.1  ross                 /* no problem */
    718  1.1  ross             }
    719  1.1  ross             else {
    720  1.1  ross                 ++errorCount;
    721  1.1  ross                 writeErrorFound( 10000 - count );
    722  1.1  ross                 writeInput_a_int64();
    723  1.1  ross                 fputs( "  ", stdout );
    724  1.1  ross                 writeOutputs_z_float32( trueZ, trueFlags, testZ, testFlags );
    725  1.1  ross                 fflush( stdout );
    726  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    727  1.1  ross             }
    728  1.1  ross         }
    729  1.1  ross     }
    730  1.1  ross  exit:
    731  1.1  ross     writeTestsPerformed( 10000 - count );
    732  1.1  ross 
    733  1.1  ross }
    734  1.1  ross 
    735  1.1  ross void
    736  1.1  ross  test_a_int64_z_float64(
    737  1.1  ross      float64 trueFunction( int64 ), float64 testFunction( int64 ) )
    738  1.1  ross {
    739  1.1  ross     int16 count;
    740  1.1  ross     float64 trueZ, testZ;
    741  1.1  ross     uint8 trueFlags, testFlags;
    742  1.1  ross 
    743  1.1  ross     errorCount = 0;
    744  1.1  ross     tenthousandsCount = 0;
    745  1.1  ross     count = 10000;
    746  1.1  ross     testCases_initSequence( testCases_sequence_a_int64 );
    747  1.1  ross     writeTestsTotal();
    748  1.1  ross     while ( ! testCases_done || forever ) {
    749  1.1  ross         testCases_next();
    750  1.1  ross         *trueFlagsPtr = 0;
    751  1.1  ross         trueZ = trueFunction( testCases_a_int64 );
    752  1.1  ross         trueFlags = *trueFlagsPtr;
    753  1.1  ross         (void) testFlagsFunctionPtr();
    754  1.1  ross         testZ = testFunction( testCases_a_int64 );
    755  1.1  ross         testFlags = testFlagsFunctionPtr();
    756  1.1  ross         --count;
    757  1.1  ross         if ( count == 0 ) {
    758  1.1  ross             checkEarlyExit();
    759  1.1  ross             count = 10000;
    760  1.1  ross         }
    761  1.1  ross         if ( ! float64_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
    762  1.1  ross             if (    ! checkNaNs
    763  1.1  ross                  && float64_isNaN( trueZ )
    764  1.1  ross                  && float64_isNaN( testZ )
    765  1.1  ross                  && ! float64_is_signaling_nan( testZ )
    766  1.1  ross                  && ( trueFlags == testFlags )
    767  1.1  ross                ) {
    768  1.1  ross                 /* no problem */
    769  1.1  ross             }
    770  1.1  ross             else {
    771  1.1  ross                 ++errorCount;
    772  1.1  ross                 writeErrorFound( 10000 - count );
    773  1.1  ross                 writeInput_a_int64();
    774  1.1  ross                 fputs( "  ", stdout );
    775  1.1  ross                 writeOutputs_z_float64( trueZ, trueFlags, testZ, testFlags );
    776  1.1  ross                 fflush( stdout );
    777  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    778  1.1  ross             }
    779  1.1  ross         }
    780  1.1  ross     }
    781  1.1  ross  exit:
    782  1.1  ross     writeTestsPerformed( 10000 - count );
    783  1.1  ross 
    784  1.1  ross }
    785  1.1  ross 
    786  1.1  ross #ifdef FLOATX80
    787  1.1  ross 
    788  1.1  ross void
    789  1.1  ross  test_a_int64_z_floatx80(
    790  1.1  ross      floatx80 trueFunction( int64 ), floatx80 testFunction( int64 ) )
    791  1.1  ross {
    792  1.1  ross     int16 count;
    793  1.1  ross     floatx80 trueZ, testZ;
    794  1.1  ross     uint8 trueFlags, testFlags;
    795  1.1  ross 
    796  1.1  ross     errorCount = 0;
    797  1.1  ross     tenthousandsCount = 0;
    798  1.1  ross     count = 10000;
    799  1.1  ross     testCases_initSequence( testCases_sequence_a_int64 );
    800  1.1  ross     writeTestsTotal();
    801  1.1  ross     while ( ! testCases_done || forever ) {
    802  1.1  ross         testCases_next();
    803  1.1  ross         *trueFlagsPtr = 0;
    804  1.1  ross         trueZ = trueFunction( testCases_a_int64 );
    805  1.1  ross         trueFlags = *trueFlagsPtr;
    806  1.1  ross         (void) testFlagsFunctionPtr();
    807  1.1  ross         testZ = testFunction( testCases_a_int64 );
    808  1.1  ross         testFlags = testFlagsFunctionPtr();
    809  1.1  ross         --count;
    810  1.1  ross         if ( count == 0 ) {
    811  1.1  ross             checkEarlyExit();
    812  1.1  ross             count = 10000;
    813  1.1  ross         }
    814  1.1  ross         if ( ! floatx80_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
    815  1.1  ross             if (    ! checkNaNs
    816  1.1  ross                  && floatx80_isNaN( trueZ )
    817  1.1  ross                  && floatx80_isNaN( testZ )
    818  1.1  ross                  && ! floatx80_is_signaling_nan( testZ )
    819  1.1  ross                  && ( trueFlags == testFlags )
    820  1.1  ross                ) {
    821  1.1  ross                 /* no problem */
    822  1.1  ross             }
    823  1.1  ross             else {
    824  1.1  ross                 ++errorCount;
    825  1.1  ross                 writeErrorFound( 10000 - count );
    826  1.1  ross                 writeInput_a_int64();
    827  1.1  ross                 fputs( "  ", stdout );
    828  1.1  ross                 writeOutputs_z_floatx80( trueZ, trueFlags, testZ, testFlags );
    829  1.1  ross                 fflush( stdout );
    830  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    831  1.1  ross             }
    832  1.1  ross         }
    833  1.1  ross     }
    834  1.1  ross  exit:
    835  1.1  ross     writeTestsPerformed( 10000 - count );
    836  1.1  ross 
    837  1.1  ross }
    838  1.1  ross 
    839  1.1  ross #endif
    840  1.1  ross 
    841  1.1  ross #ifdef FLOAT128
    842  1.1  ross 
    843  1.1  ross void
    844  1.1  ross  test_a_int64_z_float128(
    845  1.1  ross      float128 trueFunction( int64 ), float128 testFunction( int64 ) )
    846  1.1  ross {
    847  1.1  ross     int16 count;
    848  1.1  ross     float128 trueZ, testZ;
    849  1.1  ross     uint8 trueFlags, testFlags;
    850  1.1  ross 
    851  1.1  ross     errorCount = 0;
    852  1.1  ross     tenthousandsCount = 0;
    853  1.1  ross     count = 10000;
    854  1.1  ross     testCases_initSequence( testCases_sequence_a_int64 );
    855  1.1  ross     writeTestsTotal();
    856  1.1  ross     while ( ! testCases_done || forever ) {
    857  1.1  ross         testCases_next();
    858  1.1  ross         *trueFlagsPtr = 0;
    859  1.1  ross         trueZ = trueFunction( testCases_a_int64 );
    860  1.1  ross         trueFlags = *trueFlagsPtr;
    861  1.1  ross         (void) testFlagsFunctionPtr();
    862  1.1  ross         testZ = testFunction( testCases_a_int64 );
    863  1.1  ross         testFlags = testFlagsFunctionPtr();
    864  1.1  ross         --count;
    865  1.1  ross         if ( count == 0 ) {
    866  1.1  ross             checkEarlyExit();
    867  1.1  ross             count = 10000;
    868  1.1  ross         }
    869  1.1  ross         if ( ! float128_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
    870  1.1  ross             if (    ! checkNaNs
    871  1.1  ross                  && float128_isNaN( trueZ )
    872  1.1  ross                  && float128_isNaN( testZ )
    873  1.1  ross                  && ! float128_is_signaling_nan( testZ )
    874  1.1  ross                  && ( trueFlags == testFlags )
    875  1.1  ross                ) {
    876  1.1  ross                 /* no problem */
    877  1.1  ross             }
    878  1.1  ross             else {
    879  1.1  ross                 ++errorCount;
    880  1.1  ross                 writeErrorFound( 10000 - count );
    881  1.1  ross                 writeInput_a_int64();
    882  1.1  ross                 fputs( "\n\t", stdout );
    883  1.1  ross                 writeOutputs_z_float128( trueZ, trueFlags, testZ, testFlags );
    884  1.1  ross                 fflush( stdout );
    885  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    886  1.1  ross             }
    887  1.1  ross         }
    888  1.1  ross     }
    889  1.1  ross  exit:
    890  1.1  ross     writeTestsPerformed( 10000 - count );
    891  1.1  ross 
    892  1.1  ross }
    893  1.1  ross 
    894  1.1  ross #endif
    895  1.1  ross 
    896  1.1  ross #endif
    897  1.1  ross 
    898  1.1  ross void
    899  1.1  ross  test_a_float32_z_int32(
    900  1.1  ross      int32 trueFunction( float32 ), int32 testFunction( float32 ) )
    901  1.1  ross {
    902  1.1  ross     int16 count;
    903  1.1  ross     int32 trueZ, testZ;
    904  1.1  ross     uint8 trueFlags, testFlags;
    905  1.1  ross 
    906  1.1  ross     errorCount = 0;
    907  1.1  ross     tenthousandsCount = 0;
    908  1.1  ross     count = 10000;
    909  1.1  ross     testCases_initSequence( testCases_sequence_a_float32 );
    910  1.1  ross     writeTestsTotal();
    911  1.1  ross     while ( ! testCases_done || forever ) {
    912  1.1  ross         testCases_next();
    913  1.1  ross         *trueFlagsPtr = 0;
    914  1.1  ross         trueZ = trueFunction( testCases_a_float32 );
    915  1.1  ross         trueFlags = *trueFlagsPtr;
    916  1.1  ross         (void) testFlagsFunctionPtr();
    917  1.1  ross         testZ = testFunction( testCases_a_float32 );
    918  1.1  ross         testFlags = testFlagsFunctionPtr();
    919  1.1  ross         --count;
    920  1.1  ross         if ( count == 0 ) {
    921  1.1  ross             checkEarlyExit();
    922  1.1  ross             count = 10000;
    923  1.1  ross         }
    924  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
    925  1.1  ross             if (    ! checkNaNs
    926  1.1  ross                  && float32_is_signaling_nan( testCases_a_float32 ) ) {
    927  1.1  ross                 trueFlags |= float_flag_invalid;
    928  1.1  ross             }
    929  1.1  ross             if (    ( trueZ == 0x7FFFFFFF )
    930  1.1  ross                  && (    ( testZ == 0x7FFFFFFF )
    931  1.1  ross                       || ( testZ == (sbits32) 0x80000000 ) )
    932  1.1  ross                  && ( trueFlags == float_flag_invalid )
    933  1.1  ross                  && ( testFlags == float_flag_invalid )
    934  1.1  ross                ) {
    935  1.1  ross                 /* no problem */
    936  1.1  ross             }
    937  1.1  ross             else {
    938  1.1  ross                 ++errorCount;
    939  1.1  ross                 writeErrorFound( 10000 - count );
    940  1.1  ross                 writeInput_a_float32();
    941  1.1  ross                 fputs( "  ", stdout );
    942  1.1  ross                 writeOutputs_z_int32( trueZ, trueFlags, testZ, testFlags );
    943  1.1  ross                 fflush( stdout );
    944  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
    945  1.1  ross             }
    946  1.1  ross         }
    947  1.1  ross     }
    948  1.1  ross  exit:
    949  1.1  ross     writeTestsPerformed( 10000 - count );
    950  1.1  ross 
    951  1.1  ross }
    952  1.1  ross 
    953  1.1  ross #ifdef BITS64
    954  1.1  ross 
    955  1.1  ross void
    956  1.1  ross  test_a_float32_z_int64(
    957  1.1  ross      int64 trueFunction( float32 ), int64 testFunction( float32 ) )
    958  1.1  ross {
    959  1.1  ross     int16 count;
    960  1.1  ross     int64 trueZ, testZ;
    961  1.1  ross     uint8 trueFlags, testFlags;
    962  1.1  ross 
    963  1.1  ross     errorCount = 0;
    964  1.1  ross     tenthousandsCount = 0;
    965  1.1  ross     count = 10000;
    966  1.1  ross     testCases_initSequence( testCases_sequence_a_float32 );
    967  1.1  ross     writeTestsTotal();
    968  1.1  ross     while ( ! testCases_done || forever ) {
    969  1.1  ross         testCases_next();
    970  1.1  ross         *trueFlagsPtr = 0;
    971  1.1  ross         trueZ = trueFunction( testCases_a_float32 );
    972  1.1  ross         trueFlags = *trueFlagsPtr;
    973  1.1  ross         (void) testFlagsFunctionPtr();
    974  1.1  ross         testZ = testFunction( testCases_a_float32 );
    975  1.1  ross         testFlags = testFlagsFunctionPtr();
    976  1.1  ross         --count;
    977  1.1  ross         if ( count == 0 ) {
    978  1.1  ross             checkEarlyExit();
    979  1.1  ross             count = 10000;
    980  1.1  ross         }
    981  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
    982  1.1  ross             if (    ! checkNaNs
    983  1.1  ross                  && float32_is_signaling_nan( testCases_a_float32 ) ) {
    984  1.1  ross                 trueFlags |= float_flag_invalid;
    985  1.1  ross             }
    986  1.1  ross             if (    ( trueZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
    987  1.1  ross                  && (    ( testZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
    988  1.1  ross                       || ( testZ == (sbits64) LIT64( 0x8000000000000000 ) ) )
    989  1.1  ross                  && ( trueFlags == float_flag_invalid )
    990  1.1  ross                  && ( testFlags == float_flag_invalid )
    991  1.1  ross                ) {
    992  1.1  ross                 /* no problem */
    993  1.1  ross             }
    994  1.1  ross             else {
    995  1.1  ross                 ++errorCount;
    996  1.1  ross                 writeErrorFound( 10000 - count );
    997  1.1  ross                 writeInput_a_float32();
    998  1.1  ross                 fputs( "  ", stdout );
    999  1.1  ross                 writeOutputs_z_int64( trueZ, trueFlags, testZ, testFlags );
   1000  1.1  ross                 fflush( stdout );
   1001  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1002  1.1  ross             }
   1003  1.1  ross         }
   1004  1.1  ross     }
   1005  1.1  ross  exit:
   1006  1.1  ross     writeTestsPerformed( 10000 - count );
   1007  1.1  ross 
   1008  1.1  ross }
   1009  1.1  ross 
   1010  1.1  ross #endif
   1011  1.1  ross 
   1012  1.1  ross void
   1013  1.1  ross  test_a_float32_z_float64(
   1014  1.1  ross      float64 trueFunction( float32 ), float64 testFunction( float32 ) )
   1015  1.1  ross {
   1016  1.1  ross     int16 count;
   1017  1.1  ross     float64 trueZ, testZ;
   1018  1.1  ross     uint8 trueFlags, testFlags;
   1019  1.1  ross 
   1020  1.1  ross     errorCount = 0;
   1021  1.1  ross     tenthousandsCount = 0;
   1022  1.1  ross     count = 10000;
   1023  1.1  ross     testCases_initSequence( testCases_sequence_a_float32 );
   1024  1.1  ross     writeTestsTotal();
   1025  1.1  ross     while ( ! testCases_done || forever ) {
   1026  1.1  ross         testCases_next();
   1027  1.1  ross         *trueFlagsPtr = 0;
   1028  1.1  ross         trueZ = trueFunction( testCases_a_float32 );
   1029  1.1  ross         trueFlags = *trueFlagsPtr;
   1030  1.1  ross         (void) testFlagsFunctionPtr();
   1031  1.1  ross         testZ = testFunction( testCases_a_float32 );
   1032  1.1  ross         testFlags = testFlagsFunctionPtr();
   1033  1.1  ross         --count;
   1034  1.1  ross         if ( count == 0 ) {
   1035  1.1  ross             checkEarlyExit();
   1036  1.1  ross             count = 10000;
   1037  1.1  ross         }
   1038  1.1  ross         if ( ! float64_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   1039  1.1  ross             if (    ! checkNaNs
   1040  1.1  ross                  && float32_is_signaling_nan( testCases_a_float32 ) ) {
   1041  1.1  ross                 trueFlags |= float_flag_invalid;
   1042  1.1  ross             }
   1043  1.1  ross             if (    ! checkNaNs
   1044  1.1  ross                  && float64_isNaN( trueZ )
   1045  1.1  ross                  && float64_isNaN( testZ )
   1046  1.1  ross                  && ! float64_is_signaling_nan( testZ )
   1047  1.1  ross                  && ( trueFlags == testFlags )
   1048  1.1  ross                ) {
   1049  1.1  ross                 /* no problem */
   1050  1.1  ross             }
   1051  1.1  ross             else {
   1052  1.1  ross                 ++errorCount;
   1053  1.1  ross                 writeErrorFound( 10000 - count );
   1054  1.1  ross                 writeInput_a_float32();
   1055  1.1  ross                 fputs( "  ", stdout );
   1056  1.1  ross                 writeOutputs_z_float64( trueZ, trueFlags, testZ, testFlags );
   1057  1.1  ross                 fflush( stdout );
   1058  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1059  1.1  ross             }
   1060  1.1  ross         }
   1061  1.1  ross     }
   1062  1.1  ross  exit:
   1063  1.1  ross     writeTestsPerformed( 10000 - count );
   1064  1.1  ross 
   1065  1.1  ross }
   1066  1.1  ross 
   1067  1.1  ross #ifdef FLOATX80
   1068  1.1  ross 
   1069  1.1  ross void
   1070  1.1  ross  test_a_float32_z_floatx80(
   1071  1.1  ross      floatx80 trueFunction( float32 ), floatx80 testFunction( float32 ) )
   1072  1.1  ross {
   1073  1.1  ross     int16 count;
   1074  1.1  ross     floatx80 trueZ, testZ;
   1075  1.1  ross     uint8 trueFlags, testFlags;
   1076  1.1  ross 
   1077  1.1  ross     errorCount = 0;
   1078  1.1  ross     tenthousandsCount = 0;
   1079  1.1  ross     count = 10000;
   1080  1.1  ross     testCases_initSequence( testCases_sequence_a_float32 );
   1081  1.1  ross     writeTestsTotal();
   1082  1.1  ross     while ( ! testCases_done || forever ) {
   1083  1.1  ross         testCases_next();
   1084  1.1  ross         *trueFlagsPtr = 0;
   1085  1.1  ross         trueZ = trueFunction( testCases_a_float32 );
   1086  1.1  ross         trueFlags = *trueFlagsPtr;
   1087  1.1  ross         (void) testFlagsFunctionPtr();
   1088  1.1  ross         testZ = testFunction( testCases_a_float32 );
   1089  1.1  ross         testFlags = testFlagsFunctionPtr();
   1090  1.1  ross         --count;
   1091  1.1  ross         if ( count == 0 ) {
   1092  1.1  ross             checkEarlyExit();
   1093  1.1  ross             count = 10000;
   1094  1.1  ross         }
   1095  1.1  ross         if ( ! floatx80_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   1096  1.1  ross             if (    ! checkNaNs
   1097  1.1  ross                  && float32_is_signaling_nan( testCases_a_float32 ) ) {
   1098  1.1  ross                 trueFlags |= float_flag_invalid;
   1099  1.1  ross             }
   1100  1.1  ross             if (    ! checkNaNs
   1101  1.1  ross                  && floatx80_isNaN( trueZ )
   1102  1.1  ross                  && floatx80_isNaN( testZ )
   1103  1.1  ross                  && ! floatx80_is_signaling_nan( testZ )
   1104  1.1  ross                  && ( trueFlags == testFlags )
   1105  1.1  ross                ) {
   1106  1.1  ross                 /* no problem */
   1107  1.1  ross             }
   1108  1.1  ross             else {
   1109  1.1  ross                 ++errorCount;
   1110  1.1  ross                 writeErrorFound( 10000 - count );
   1111  1.1  ross                 writeInput_a_float32();
   1112  1.1  ross                 fputs( "\n\t", stdout );
   1113  1.1  ross                 writeOutputs_z_floatx80( trueZ, trueFlags, testZ, testFlags );
   1114  1.1  ross                 fflush( stdout );
   1115  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1116  1.1  ross             }
   1117  1.1  ross         }
   1118  1.1  ross     }
   1119  1.1  ross  exit:
   1120  1.1  ross     writeTestsPerformed( 10000 - count );
   1121  1.1  ross 
   1122  1.1  ross }
   1123  1.1  ross 
   1124  1.1  ross #endif
   1125  1.1  ross 
   1126  1.1  ross #ifdef FLOAT128
   1127  1.1  ross 
   1128  1.1  ross void
   1129  1.1  ross  test_a_float32_z_float128(
   1130  1.1  ross      float128 trueFunction( float32 ), float128 testFunction( float32 ) )
   1131  1.1  ross {
   1132  1.1  ross     int16 count;
   1133  1.1  ross     float128 trueZ, testZ;
   1134  1.1  ross     uint8 trueFlags, testFlags;
   1135  1.1  ross 
   1136  1.1  ross     errorCount = 0;
   1137  1.1  ross     tenthousandsCount = 0;
   1138  1.1  ross     count = 10000;
   1139  1.1  ross     testCases_initSequence( testCases_sequence_a_float32 );
   1140  1.1  ross     writeTestsTotal();
   1141  1.1  ross     while ( ! testCases_done || forever ) {
   1142  1.1  ross         testCases_next();
   1143  1.1  ross         *trueFlagsPtr = 0;
   1144  1.1  ross         trueZ = trueFunction( testCases_a_float32 );
   1145  1.1  ross         trueFlags = *trueFlagsPtr;
   1146  1.1  ross         (void) testFlagsFunctionPtr();
   1147  1.1  ross         testZ = testFunction( testCases_a_float32 );
   1148  1.1  ross         testFlags = testFlagsFunctionPtr();
   1149  1.1  ross         --count;
   1150  1.1  ross         if ( count == 0 ) {
   1151  1.1  ross             checkEarlyExit();
   1152  1.1  ross             count = 10000;
   1153  1.1  ross         }
   1154  1.1  ross         if ( ! float128_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   1155  1.1  ross             if (    ! checkNaNs
   1156  1.1  ross                  && float32_is_signaling_nan( testCases_a_float32 ) ) {
   1157  1.1  ross                 trueFlags |= float_flag_invalid;
   1158  1.1  ross             }
   1159  1.1  ross             if (    ! checkNaNs
   1160  1.1  ross                  && float128_isNaN( trueZ )
   1161  1.1  ross                  && float128_isNaN( testZ )
   1162  1.1  ross                  && ! float128_is_signaling_nan( testZ )
   1163  1.1  ross                  && ( trueFlags == testFlags )
   1164  1.1  ross                ) {
   1165  1.1  ross                 /* no problem */
   1166  1.1  ross             }
   1167  1.1  ross             else {
   1168  1.1  ross                 ++errorCount;
   1169  1.1  ross                 writeErrorFound( 10000 - count );
   1170  1.1  ross                 writeInput_a_float32();
   1171  1.1  ross                 fputs( "\n\t", stdout );
   1172  1.1  ross                 writeOutputs_z_float128( trueZ, trueFlags, testZ, testFlags );
   1173  1.1  ross                 fflush( stdout );
   1174  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1175  1.1  ross             }
   1176  1.1  ross         }
   1177  1.1  ross     }
   1178  1.1  ross  exit:
   1179  1.1  ross     writeTestsPerformed( 10000 - count );
   1180  1.1  ross 
   1181  1.1  ross }
   1182  1.1  ross 
   1183  1.1  ross #endif
   1184  1.1  ross 
   1185  1.1  ross void
   1186  1.1  ross  test_az_float32(
   1187  1.1  ross      float32 trueFunction( float32 ), float32 testFunction( float32 ) )
   1188  1.1  ross {
   1189  1.1  ross     int16 count;
   1190  1.1  ross     float32 trueZ, testZ;
   1191  1.1  ross     uint8 trueFlags, testFlags;
   1192  1.1  ross 
   1193  1.1  ross     errorCount = 0;
   1194  1.1  ross     tenthousandsCount = 0;
   1195  1.1  ross     count = 10000;
   1196  1.1  ross     testCases_initSequence( testCases_sequence_a_float32 );
   1197  1.1  ross     writeTestsTotal();
   1198  1.1  ross     while ( ! testCases_done || forever ) {
   1199  1.1  ross         testCases_next();
   1200  1.1  ross         *trueFlagsPtr = 0;
   1201  1.1  ross         trueZ = trueFunction( testCases_a_float32 );
   1202  1.1  ross         trueFlags = *trueFlagsPtr;
   1203  1.1  ross         (void) testFlagsFunctionPtr();
   1204  1.1  ross         testZ = testFunction( testCases_a_float32 );
   1205  1.1  ross         testFlags = testFlagsFunctionPtr();
   1206  1.1  ross         --count;
   1207  1.1  ross         if ( count == 0 ) {
   1208  1.1  ross             checkEarlyExit();
   1209  1.1  ross             count = 10000;
   1210  1.1  ross         }
   1211  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1212  1.1  ross             if (    ! checkNaNs
   1213  1.1  ross                  && float32_is_signaling_nan( testCases_a_float32 ) ) {
   1214  1.1  ross                 trueFlags |= float_flag_invalid;
   1215  1.1  ross             }
   1216  1.1  ross             if (    ! checkNaNs
   1217  1.1  ross                  && float32_isNaN( trueZ )
   1218  1.1  ross                  && float32_isNaN( testZ )
   1219  1.1  ross                  && ! float32_is_signaling_nan( testZ )
   1220  1.1  ross                  && ( trueFlags == testFlags )
   1221  1.1  ross                ) {
   1222  1.1  ross                 /* no problem */
   1223  1.1  ross             }
   1224  1.1  ross             else {
   1225  1.1  ross                 ++errorCount;
   1226  1.1  ross                 writeErrorFound( 10000 - count );
   1227  1.1  ross                 writeInput_a_float32();
   1228  1.1  ross                 fputs( "  ", stdout );
   1229  1.1  ross                 writeOutputs_z_float32( trueZ, trueFlags, testZ, testFlags );
   1230  1.1  ross                 fflush( stdout );
   1231  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1232  1.1  ross             }
   1233  1.1  ross         }
   1234  1.1  ross     }
   1235  1.1  ross  exit:
   1236  1.1  ross     writeTestsPerformed( 10000 - count );
   1237  1.1  ross 
   1238  1.1  ross }
   1239  1.1  ross 
   1240  1.1  ross void
   1241  1.1  ross  test_ab_float32_z_flag(
   1242  1.1  ross      flag trueFunction( float32, float32 ),
   1243  1.1  ross      flag testFunction( float32, float32 )
   1244  1.1  ross  )
   1245  1.1  ross {
   1246  1.1  ross     int16 count;
   1247  1.1  ross     flag trueZ, testZ;
   1248  1.1  ross     uint8 trueFlags, testFlags;
   1249  1.1  ross 
   1250  1.1  ross     errorCount = 0;
   1251  1.1  ross     tenthousandsCount = 0;
   1252  1.1  ross     count = 10000;
   1253  1.1  ross     testCases_initSequence( testCases_sequence_ab_float32 );
   1254  1.1  ross     writeTestsTotal();
   1255  1.1  ross     while ( ! testCases_done || forever ) {
   1256  1.1  ross         testCases_next();
   1257  1.1  ross         *trueFlagsPtr = 0;
   1258  1.1  ross         trueZ = trueFunction( testCases_a_float32, testCases_b_float32 );
   1259  1.1  ross         trueFlags = *trueFlagsPtr;
   1260  1.1  ross         (void) testFlagsFunctionPtr();
   1261  1.1  ross         testZ = testFunction( testCases_a_float32, testCases_b_float32 );
   1262  1.1  ross         testFlags = testFlagsFunctionPtr();
   1263  1.1  ross         --count;
   1264  1.1  ross         if ( count == 0 ) {
   1265  1.1  ross             checkEarlyExit();
   1266  1.1  ross             count = 10000;
   1267  1.1  ross         }
   1268  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1269  1.1  ross             if (    ! checkNaNs
   1270  1.1  ross                  && (    float32_is_signaling_nan( testCases_a_float32 )
   1271  1.1  ross                       || float32_is_signaling_nan( testCases_b_float32 ) )
   1272  1.1  ross                ) {
   1273  1.1  ross                 trueFlags |= float_flag_invalid;
   1274  1.1  ross             }
   1275  1.1  ross             if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1276  1.1  ross                 ++errorCount;
   1277  1.1  ross                 writeErrorFound( 10000 - count );
   1278  1.1  ross                 writeInputs_ab_float32();
   1279  1.1  ross                 fputs( "  ", stdout );
   1280  1.1  ross                 writeOutputs_z_flag( trueZ, trueFlags, testZ, testFlags );
   1281  1.1  ross                 fflush( stdout );
   1282  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1283  1.1  ross             }
   1284  1.1  ross         }
   1285  1.1  ross     }
   1286  1.1  ross  exit:
   1287  1.1  ross     writeTestsPerformed( 10000 - count );
   1288  1.1  ross     return;
   1289  1.1  ross 
   1290  1.1  ross }
   1291  1.1  ross 
   1292  1.1  ross void
   1293  1.1  ross  test_abz_float32(
   1294  1.1  ross      float32 trueFunction( float32, float32 ),
   1295  1.1  ross      float32 testFunction( float32, float32 )
   1296  1.1  ross  )
   1297  1.1  ross {
   1298  1.1  ross     int16 count;
   1299  1.1  ross     float32 trueZ, testZ;
   1300  1.1  ross     uint8 trueFlags, testFlags;
   1301  1.1  ross 
   1302  1.1  ross     errorCount = 0;
   1303  1.1  ross     tenthousandsCount = 0;
   1304  1.1  ross     count = 10000;
   1305  1.1  ross     testCases_initSequence( testCases_sequence_ab_float32 );
   1306  1.1  ross     writeTestsTotal();
   1307  1.1  ross     while ( ! testCases_done || forever ) {
   1308  1.1  ross         testCases_next();
   1309  1.1  ross         *trueFlagsPtr = 0;
   1310  1.1  ross         trueZ = trueFunction( testCases_a_float32, testCases_b_float32 );
   1311  1.1  ross         trueFlags = *trueFlagsPtr;
   1312  1.1  ross         (void) testFlagsFunctionPtr();
   1313  1.1  ross         testZ = testFunction( testCases_a_float32, testCases_b_float32 );
   1314  1.1  ross         testFlags = testFlagsFunctionPtr();
   1315  1.1  ross         --count;
   1316  1.1  ross         if ( count == 0 ) {
   1317  1.1  ross             checkEarlyExit();
   1318  1.1  ross             count = 10000;
   1319  1.1  ross         }
   1320  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1321  1.1  ross             if (    ! checkNaNs
   1322  1.1  ross                  && (    float32_is_signaling_nan( testCases_a_float32 )
   1323  1.1  ross                       || float32_is_signaling_nan( testCases_b_float32 ) )
   1324  1.1  ross                ) {
   1325  1.1  ross                 trueFlags |= float_flag_invalid;
   1326  1.1  ross             }
   1327  1.1  ross             if (    ! checkNaNs
   1328  1.1  ross                  && float32_isNaN( trueZ )
   1329  1.1  ross                  && float32_isNaN( testZ )
   1330  1.1  ross                  && ! float32_is_signaling_nan( testZ )
   1331  1.1  ross                  && ( trueFlags == testFlags )
   1332  1.1  ross                ) {
   1333  1.1  ross                 /* no problem */
   1334  1.1  ross             }
   1335  1.1  ross             else {
   1336  1.1  ross                 ++errorCount;
   1337  1.1  ross                 writeErrorFound( 10000 - count );
   1338  1.1  ross                 writeInputs_ab_float32();
   1339  1.1  ross                 fputs( "  ", stdout );
   1340  1.1  ross                 writeOutputs_z_float32( trueZ, trueFlags, testZ, testFlags );
   1341  1.1  ross                 fflush( stdout );
   1342  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1343  1.1  ross             }
   1344  1.1  ross         }
   1345  1.1  ross     }
   1346  1.1  ross  exit:
   1347  1.1  ross     writeTestsPerformed( 10000 - count );
   1348  1.1  ross     return;
   1349  1.1  ross 
   1350  1.1  ross }
   1351  1.1  ross 
   1352  1.1  ross void
   1353  1.1  ross  test_a_float64_z_int32(
   1354  1.1  ross      int32 trueFunction( float64 ), int32 testFunction( float64 ) )
   1355  1.1  ross {
   1356  1.1  ross     int16 count;
   1357  1.1  ross     int32 trueZ, testZ;
   1358  1.1  ross     uint8 trueFlags, testFlags;
   1359  1.1  ross 
   1360  1.1  ross     errorCount = 0;
   1361  1.1  ross     tenthousandsCount = 0;
   1362  1.1  ross     count = 10000;
   1363  1.1  ross     testCases_initSequence( testCases_sequence_a_float64 );
   1364  1.1  ross     writeTestsTotal();
   1365  1.1  ross     while ( ! testCases_done || forever ) {
   1366  1.1  ross         testCases_next();
   1367  1.1  ross         *trueFlagsPtr = 0;
   1368  1.1  ross         trueZ = trueFunction( testCases_a_float64 );
   1369  1.1  ross         trueFlags = *trueFlagsPtr;
   1370  1.1  ross         (void) testFlagsFunctionPtr();
   1371  1.1  ross         testZ = testFunction( testCases_a_float64 );
   1372  1.1  ross         testFlags = testFlagsFunctionPtr();
   1373  1.1  ross         --count;
   1374  1.1  ross         if ( count == 0 ) {
   1375  1.1  ross             checkEarlyExit();
   1376  1.1  ross             count = 10000;
   1377  1.1  ross         }
   1378  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1379  1.1  ross             if (    ! checkNaNs
   1380  1.1  ross                  && float64_is_signaling_nan( testCases_a_float64 ) ) {
   1381  1.1  ross                 trueFlags |= float_flag_invalid;
   1382  1.1  ross             }
   1383  1.1  ross             if (    ( trueZ == 0x7FFFFFFF )
   1384  1.1  ross                  && (    ( testZ == 0x7FFFFFFF )
   1385  1.1  ross                       || ( testZ == (sbits32) 0x80000000 ) )
   1386  1.1  ross                  && ( trueFlags == float_flag_invalid )
   1387  1.1  ross                  && ( testFlags == float_flag_invalid )
   1388  1.1  ross                ) {
   1389  1.1  ross                 /* no problem */
   1390  1.1  ross             }
   1391  1.1  ross             else {
   1392  1.1  ross                 ++errorCount;
   1393  1.1  ross                 writeErrorFound( 10000 - count );
   1394  1.1  ross                 writeInput_a_float64();
   1395  1.1  ross                 fputs( "  ", stdout );
   1396  1.1  ross                 writeOutputs_z_int32( trueZ, trueFlags, testZ, testFlags );
   1397  1.1  ross                 fflush( stdout );
   1398  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1399  1.1  ross             }
   1400  1.1  ross         }
   1401  1.1  ross     }
   1402  1.1  ross  exit:
   1403  1.1  ross     writeTestsPerformed( 10000 - count );
   1404  1.1  ross 
   1405  1.1  ross }
   1406  1.1  ross 
   1407  1.1  ross #ifdef BITS64
   1408  1.1  ross 
   1409  1.1  ross void
   1410  1.1  ross  test_a_float64_z_int64(
   1411  1.1  ross      int64 trueFunction( float64 ), int64 testFunction( float64 ) )
   1412  1.1  ross {
   1413  1.1  ross     int16 count;
   1414  1.1  ross     int64 trueZ, testZ;
   1415  1.1  ross     uint8 trueFlags, testFlags;
   1416  1.1  ross 
   1417  1.1  ross     errorCount = 0;
   1418  1.1  ross     tenthousandsCount = 0;
   1419  1.1  ross     count = 10000;
   1420  1.1  ross     testCases_initSequence( testCases_sequence_a_float64 );
   1421  1.1  ross     writeTestsTotal();
   1422  1.1  ross     while ( ! testCases_done || forever ) {
   1423  1.1  ross         testCases_next();
   1424  1.1  ross         *trueFlagsPtr = 0;
   1425  1.1  ross         trueZ = trueFunction( testCases_a_float64 );
   1426  1.1  ross         trueFlags = *trueFlagsPtr;
   1427  1.1  ross         (void) testFlagsFunctionPtr();
   1428  1.1  ross         testZ = testFunction( testCases_a_float64 );
   1429  1.1  ross         testFlags = testFlagsFunctionPtr();
   1430  1.1  ross         --count;
   1431  1.1  ross         if ( count == 0 ) {
   1432  1.1  ross             checkEarlyExit();
   1433  1.1  ross             count = 10000;
   1434  1.1  ross         }
   1435  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1436  1.1  ross             if (    ! checkNaNs
   1437  1.1  ross                  && float64_is_signaling_nan( testCases_a_float64 ) ) {
   1438  1.1  ross                 trueFlags |= float_flag_invalid;
   1439  1.1  ross             }
   1440  1.1  ross             if (    ( trueZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
   1441  1.1  ross                  && (    ( testZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
   1442  1.1  ross                       || ( testZ == (sbits64) LIT64( 0x8000000000000000 ) ) )
   1443  1.1  ross                  && ( trueFlags == float_flag_invalid )
   1444  1.1  ross                  && ( testFlags == float_flag_invalid )
   1445  1.1  ross                ) {
   1446  1.1  ross                 /* no problem */
   1447  1.1  ross             }
   1448  1.1  ross             else {
   1449  1.1  ross                 ++errorCount;
   1450  1.1  ross                 writeErrorFound( 10000 - count );
   1451  1.1  ross                 writeInput_a_float64();
   1452  1.1  ross                 fputs( "  ", stdout );
   1453  1.1  ross                 writeOutputs_z_int64( trueZ, trueFlags, testZ, testFlags );
   1454  1.1  ross                 fflush( stdout );
   1455  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1456  1.1  ross             }
   1457  1.1  ross         }
   1458  1.1  ross     }
   1459  1.1  ross  exit:
   1460  1.1  ross     writeTestsPerformed( 10000 - count );
   1461  1.1  ross 
   1462  1.1  ross }
   1463  1.1  ross 
   1464  1.1  ross #endif
   1465  1.1  ross 
   1466  1.1  ross void
   1467  1.1  ross  test_a_float64_z_float32(
   1468  1.1  ross      float32 trueFunction( float64 ), float32 testFunction( float64 ) )
   1469  1.1  ross {
   1470  1.1  ross     int16 count;
   1471  1.1  ross     float32 trueZ, testZ;
   1472  1.1  ross     uint8 trueFlags, testFlags;
   1473  1.1  ross 
   1474  1.1  ross     errorCount = 0;
   1475  1.1  ross     tenthousandsCount = 0;
   1476  1.1  ross     count = 10000;
   1477  1.1  ross     testCases_initSequence( testCases_sequence_a_float64 );
   1478  1.1  ross     writeTestsTotal();
   1479  1.1  ross     while ( ! testCases_done || forever ) {
   1480  1.1  ross         testCases_next();
   1481  1.1  ross         *trueFlagsPtr = 0;
   1482  1.1  ross         trueZ = trueFunction( testCases_a_float64 );
   1483  1.1  ross         trueFlags = *trueFlagsPtr;
   1484  1.1  ross         (void) testFlagsFunctionPtr();
   1485  1.1  ross         testZ = testFunction( testCases_a_float64 );
   1486  1.1  ross         testFlags = testFlagsFunctionPtr();
   1487  1.1  ross         --count;
   1488  1.1  ross         if ( count == 0 ) {
   1489  1.1  ross             checkEarlyExit();
   1490  1.1  ross             count = 10000;
   1491  1.1  ross         }
   1492  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1493  1.1  ross             if (    ! checkNaNs
   1494  1.1  ross                  && float64_is_signaling_nan( testCases_a_float64 ) ) {
   1495  1.1  ross                 trueFlags |= float_flag_invalid;
   1496  1.1  ross             }
   1497  1.1  ross             if (    ! checkNaNs
   1498  1.1  ross                  && float32_isNaN( trueZ )
   1499  1.1  ross                  && float32_isNaN( testZ )
   1500  1.1  ross                  && ! float32_is_signaling_nan( testZ )
   1501  1.1  ross                  && ( trueFlags == testFlags )
   1502  1.1  ross                ) {
   1503  1.1  ross                 /* no problem */
   1504  1.1  ross             }
   1505  1.1  ross             else {
   1506  1.1  ross                 ++errorCount;
   1507  1.1  ross                 writeErrorFound( 10000 - count );
   1508  1.1  ross                 writeInput_a_float64();
   1509  1.1  ross                 fputs( "  ", stdout );
   1510  1.1  ross                 writeOutputs_z_float32( trueZ, trueFlags, testZ, testFlags );
   1511  1.1  ross                 fflush( stdout );
   1512  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1513  1.1  ross             }
   1514  1.1  ross         }
   1515  1.1  ross     }
   1516  1.1  ross  exit:
   1517  1.1  ross     writeTestsPerformed( 10000 - count );
   1518  1.1  ross 
   1519  1.1  ross }
   1520  1.1  ross 
   1521  1.1  ross #ifdef FLOATX80
   1522  1.1  ross 
   1523  1.1  ross void
   1524  1.1  ross  test_a_float64_z_floatx80(
   1525  1.1  ross      floatx80 trueFunction( float64 ), floatx80 testFunction( float64 ) )
   1526  1.1  ross {
   1527  1.1  ross     int16 count;
   1528  1.1  ross     floatx80 trueZ, testZ;
   1529  1.1  ross     uint8 trueFlags, testFlags;
   1530  1.1  ross 
   1531  1.1  ross     errorCount = 0;
   1532  1.1  ross     tenthousandsCount = 0;
   1533  1.1  ross     count = 10000;
   1534  1.1  ross     testCases_initSequence( testCases_sequence_a_float64 );
   1535  1.1  ross     writeTestsTotal();
   1536  1.1  ross     while ( ! testCases_done || forever ) {
   1537  1.1  ross         testCases_next();
   1538  1.1  ross         *trueFlagsPtr = 0;
   1539  1.1  ross         trueZ = trueFunction( testCases_a_float64 );
   1540  1.1  ross         trueFlags = *trueFlagsPtr;
   1541  1.1  ross         (void) testFlagsFunctionPtr();
   1542  1.1  ross         testZ = testFunction( testCases_a_float64 );
   1543  1.1  ross         testFlags = testFlagsFunctionPtr();
   1544  1.1  ross         --count;
   1545  1.1  ross         if ( count == 0 ) {
   1546  1.1  ross             checkEarlyExit();
   1547  1.1  ross             count = 10000;
   1548  1.1  ross         }
   1549  1.1  ross         if ( ! floatx80_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   1550  1.1  ross             if (    ! checkNaNs
   1551  1.1  ross                  && float64_is_signaling_nan( testCases_a_float64 ) ) {
   1552  1.1  ross                 trueFlags |= float_flag_invalid;
   1553  1.1  ross             }
   1554  1.1  ross             if (    ! checkNaNs
   1555  1.1  ross                  && floatx80_isNaN( trueZ )
   1556  1.1  ross                  && floatx80_isNaN( testZ )
   1557  1.1  ross                  && ! floatx80_is_signaling_nan( testZ )
   1558  1.1  ross                  && ( trueFlags == testFlags )
   1559  1.1  ross                ) {
   1560  1.1  ross                 /* no problem */
   1561  1.1  ross             }
   1562  1.1  ross             else {
   1563  1.1  ross                 ++errorCount;
   1564  1.1  ross                 writeErrorFound( 10000 - count );
   1565  1.1  ross                 writeInput_a_float64();
   1566  1.1  ross                 fputs( "\n\t", stdout );
   1567  1.1  ross                 writeOutputs_z_floatx80( trueZ, trueFlags, testZ, testFlags );
   1568  1.1  ross                 fflush( stdout );
   1569  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1570  1.1  ross             }
   1571  1.1  ross         }
   1572  1.1  ross     }
   1573  1.1  ross  exit:
   1574  1.1  ross     writeTestsPerformed( 10000 - count );
   1575  1.1  ross 
   1576  1.1  ross }
   1577  1.1  ross 
   1578  1.1  ross #endif
   1579  1.1  ross 
   1580  1.1  ross #ifdef FLOAT128
   1581  1.1  ross 
   1582  1.1  ross void
   1583  1.1  ross  test_a_float64_z_float128(
   1584  1.1  ross      float128 trueFunction( float64 ), float128 testFunction( float64 ) )
   1585  1.1  ross {
   1586  1.1  ross     int16 count;
   1587  1.1  ross     float128 trueZ, testZ;
   1588  1.1  ross     uint8 trueFlags, testFlags;
   1589  1.1  ross 
   1590  1.1  ross     errorCount = 0;
   1591  1.1  ross     tenthousandsCount = 0;
   1592  1.1  ross     count = 10000;
   1593  1.1  ross     testCases_initSequence( testCases_sequence_a_float64 );
   1594  1.1  ross     writeTestsTotal();
   1595  1.1  ross     while ( ! testCases_done || forever ) {
   1596  1.1  ross         testCases_next();
   1597  1.1  ross         *trueFlagsPtr = 0;
   1598  1.1  ross         trueZ = trueFunction( testCases_a_float64 );
   1599  1.1  ross         trueFlags = *trueFlagsPtr;
   1600  1.1  ross         (void) testFlagsFunctionPtr();
   1601  1.1  ross         testZ = testFunction( testCases_a_float64 );
   1602  1.1  ross         testFlags = testFlagsFunctionPtr();
   1603  1.1  ross         --count;
   1604  1.1  ross         if ( count == 0 ) {
   1605  1.1  ross             checkEarlyExit();
   1606  1.1  ross             count = 10000;
   1607  1.1  ross         }
   1608  1.1  ross         if ( ! float128_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   1609  1.1  ross             if (    ! checkNaNs
   1610  1.1  ross                  && float64_is_signaling_nan( testCases_a_float64 ) ) {
   1611  1.1  ross                 trueFlags |= float_flag_invalid;
   1612  1.1  ross             }
   1613  1.1  ross             if (    ! checkNaNs
   1614  1.1  ross                  && float128_isNaN( trueZ )
   1615  1.1  ross                  && float128_isNaN( testZ )
   1616  1.1  ross                  && ! float128_is_signaling_nan( testZ )
   1617  1.1  ross                  && ( trueFlags == testFlags )
   1618  1.1  ross                ) {
   1619  1.1  ross                 /* no problem */
   1620  1.1  ross             }
   1621  1.1  ross             else {
   1622  1.1  ross                 ++errorCount;
   1623  1.1  ross                 writeErrorFound( 10000 - count );
   1624  1.1  ross                 writeInput_a_float64();
   1625  1.1  ross                 fputs( "\n\t", stdout );
   1626  1.1  ross                 writeOutputs_z_float128( trueZ, trueFlags, testZ, testFlags );
   1627  1.1  ross                 fflush( stdout );
   1628  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1629  1.1  ross             }
   1630  1.1  ross         }
   1631  1.1  ross     }
   1632  1.1  ross  exit:
   1633  1.1  ross     writeTestsPerformed( 10000 - count );
   1634  1.1  ross 
   1635  1.1  ross }
   1636  1.1  ross 
   1637  1.1  ross #endif
   1638  1.1  ross 
   1639  1.1  ross void
   1640  1.1  ross  test_az_float64(
   1641  1.1  ross      float64 trueFunction( float64 ), float64 testFunction( float64 ) )
   1642  1.1  ross {
   1643  1.1  ross     int16 count;
   1644  1.1  ross     float64 trueZ, testZ;
   1645  1.1  ross     uint8 trueFlags, testFlags;
   1646  1.1  ross 
   1647  1.1  ross     errorCount = 0;
   1648  1.1  ross     tenthousandsCount = 0;
   1649  1.1  ross     count = 10000;
   1650  1.1  ross     testCases_initSequence( testCases_sequence_a_float64 );
   1651  1.1  ross     writeTestsTotal();
   1652  1.1  ross     while ( ! testCases_done || forever ) {
   1653  1.1  ross         testCases_next();
   1654  1.1  ross         *trueFlagsPtr = 0;
   1655  1.1  ross         trueZ = trueFunction( testCases_a_float64 );
   1656  1.1  ross         trueFlags = *trueFlagsPtr;
   1657  1.1  ross         (void) testFlagsFunctionPtr();
   1658  1.1  ross         testZ = testFunction( testCases_a_float64 );
   1659  1.1  ross         testFlags = testFlagsFunctionPtr();
   1660  1.1  ross         --count;
   1661  1.1  ross         if ( count == 0 ) {
   1662  1.1  ross             checkEarlyExit();
   1663  1.1  ross             count = 10000;
   1664  1.1  ross         }
   1665  1.1  ross         if ( ! float64_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   1666  1.1  ross             if (    ! checkNaNs
   1667  1.1  ross                  && float64_is_signaling_nan( testCases_a_float64 ) ) {
   1668  1.1  ross                 trueFlags |= float_flag_invalid;
   1669  1.1  ross             }
   1670  1.1  ross             if (    ! checkNaNs
   1671  1.1  ross                  && float64_isNaN( trueZ )
   1672  1.1  ross                  && float64_isNaN( testZ )
   1673  1.1  ross                  && ! float64_is_signaling_nan( testZ )
   1674  1.1  ross                  && ( trueFlags == testFlags )
   1675  1.1  ross                ) {
   1676  1.1  ross                 /* no problem */
   1677  1.1  ross             }
   1678  1.1  ross             else {
   1679  1.1  ross                 ++errorCount;
   1680  1.1  ross                 writeErrorFound( 10000 - count );
   1681  1.1  ross                 writeInput_a_float64();
   1682  1.1  ross                 fputs( "  ", stdout );
   1683  1.1  ross                 writeOutputs_z_float64( trueZ, trueFlags, testZ, testFlags );
   1684  1.1  ross                 fflush( stdout );
   1685  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1686  1.1  ross             }
   1687  1.1  ross         }
   1688  1.1  ross     }
   1689  1.1  ross  exit:
   1690  1.1  ross     writeTestsPerformed( 10000 - count );
   1691  1.1  ross 
   1692  1.1  ross }
   1693  1.1  ross 
   1694  1.1  ross void
   1695  1.1  ross  test_ab_float64_z_flag(
   1696  1.1  ross      flag trueFunction( float64, float64 ),
   1697  1.1  ross      flag testFunction( float64, float64 )
   1698  1.1  ross  )
   1699  1.1  ross {
   1700  1.1  ross     int16 count;
   1701  1.1  ross     flag trueZ, testZ;
   1702  1.1  ross     uint8 trueFlags, testFlags;
   1703  1.1  ross 
   1704  1.1  ross     errorCount = 0;
   1705  1.1  ross     tenthousandsCount = 0;
   1706  1.1  ross     count = 10000;
   1707  1.1  ross     testCases_initSequence( testCases_sequence_ab_float64 );
   1708  1.1  ross     writeTestsTotal();
   1709  1.1  ross     while ( ! testCases_done || forever ) {
   1710  1.1  ross         testCases_next();
   1711  1.1  ross         *trueFlagsPtr = 0;
   1712  1.1  ross         trueZ = trueFunction( testCases_a_float64, testCases_b_float64 );
   1713  1.1  ross         trueFlags = *trueFlagsPtr;
   1714  1.1  ross         (void) testFlagsFunctionPtr();
   1715  1.1  ross         testZ = testFunction( testCases_a_float64, testCases_b_float64 );
   1716  1.1  ross         testFlags = testFlagsFunctionPtr();
   1717  1.1  ross         --count;
   1718  1.1  ross         if ( count == 0 ) {
   1719  1.1  ross             checkEarlyExit();
   1720  1.1  ross             count = 10000;
   1721  1.1  ross         }
   1722  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1723  1.1  ross             if (    ! checkNaNs
   1724  1.1  ross                  && (    float64_is_signaling_nan( testCases_a_float64 )
   1725  1.1  ross                       || float64_is_signaling_nan( testCases_b_float64 ) )
   1726  1.1  ross                ) {
   1727  1.1  ross                 trueFlags |= float_flag_invalid;
   1728  1.1  ross             }
   1729  1.1  ross             if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1730  1.1  ross                 ++errorCount;
   1731  1.1  ross                 writeErrorFound( 10000 - count );
   1732  1.1  ross                 writeInputs_ab_float64();
   1733  1.1  ross                 fputs( "  ", stdout );
   1734  1.1  ross                 writeOutputs_z_flag( trueZ, trueFlags, testZ, testFlags );
   1735  1.1  ross                 fflush( stdout );
   1736  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1737  1.1  ross             }
   1738  1.1  ross         }
   1739  1.1  ross     }
   1740  1.1  ross  exit:
   1741  1.1  ross     writeTestsPerformed( 10000 - count );
   1742  1.1  ross     return;
   1743  1.1  ross 
   1744  1.1  ross }
   1745  1.1  ross 
   1746  1.1  ross void
   1747  1.1  ross  test_abz_float64(
   1748  1.1  ross      float64 trueFunction( float64, float64 ),
   1749  1.1  ross      float64 testFunction( float64, float64 )
   1750  1.1  ross  )
   1751  1.1  ross {
   1752  1.1  ross     int16 count;
   1753  1.1  ross     float64 trueZ, testZ;
   1754  1.1  ross     uint8 trueFlags, testFlags;
   1755  1.1  ross 
   1756  1.1  ross     errorCount = 0;
   1757  1.1  ross     tenthousandsCount = 0;
   1758  1.1  ross     count = 10000;
   1759  1.1  ross     testCases_initSequence( testCases_sequence_ab_float64 );
   1760  1.1  ross     writeTestsTotal();
   1761  1.1  ross     while ( ! testCases_done || forever ) {
   1762  1.1  ross         testCases_next();
   1763  1.1  ross         *trueFlagsPtr = 0;
   1764  1.1  ross         trueZ = trueFunction( testCases_a_float64, testCases_b_float64 );
   1765  1.1  ross         trueFlags = *trueFlagsPtr;
   1766  1.1  ross         (void) testFlagsFunctionPtr();
   1767  1.1  ross         testZ = testFunction( testCases_a_float64, testCases_b_float64 );
   1768  1.1  ross         testFlags = testFlagsFunctionPtr();
   1769  1.1  ross         --count;
   1770  1.1  ross         if ( count == 0 ) {
   1771  1.1  ross             checkEarlyExit();
   1772  1.1  ross             count = 10000;
   1773  1.1  ross         }
   1774  1.1  ross         if ( ! float64_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   1775  1.1  ross             if (    ! checkNaNs
   1776  1.1  ross                  && (    float64_is_signaling_nan( testCases_a_float64 )
   1777  1.1  ross                       || float64_is_signaling_nan( testCases_b_float64 ) )
   1778  1.1  ross                ) {
   1779  1.1  ross                 trueFlags |= float_flag_invalid;
   1780  1.1  ross             }
   1781  1.1  ross             if (    ! checkNaNs
   1782  1.1  ross                  && float64_isNaN( trueZ )
   1783  1.1  ross                  && float64_isNaN( testZ )
   1784  1.1  ross                  && ! float64_is_signaling_nan( testZ )
   1785  1.1  ross                  && ( trueFlags == testFlags )
   1786  1.1  ross                ) {
   1787  1.1  ross                 /* no problem */
   1788  1.1  ross             }
   1789  1.1  ross             else {
   1790  1.1  ross                 ++errorCount;
   1791  1.1  ross                 writeErrorFound( 10000 - count );
   1792  1.1  ross                 writeInputs_ab_float64();
   1793  1.1  ross                 fputs( "\n\t", stdout );
   1794  1.1  ross                 writeOutputs_z_float64( trueZ, trueFlags, testZ, testFlags );
   1795  1.1  ross                 fflush( stdout );
   1796  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1797  1.1  ross             }
   1798  1.1  ross         }
   1799  1.1  ross     }
   1800  1.1  ross  exit:
   1801  1.1  ross     writeTestsPerformed( 10000 - count );
   1802  1.1  ross     return;
   1803  1.1  ross 
   1804  1.1  ross }
   1805  1.1  ross 
   1806  1.1  ross #ifdef FLOATX80
   1807  1.1  ross 
   1808  1.1  ross void
   1809  1.1  ross  test_a_floatx80_z_int32(
   1810  1.1  ross      int32 trueFunction( floatx80 ), int32 testFunction( floatx80 ) )
   1811  1.1  ross {
   1812  1.1  ross     int16 count;
   1813  1.1  ross     int32 trueZ, testZ;
   1814  1.1  ross     uint8 trueFlags, testFlags;
   1815  1.1  ross 
   1816  1.1  ross     errorCount = 0;
   1817  1.1  ross     tenthousandsCount = 0;
   1818  1.1  ross     count = 10000;
   1819  1.1  ross     testCases_initSequence( testCases_sequence_a_floatx80 );
   1820  1.1  ross     writeTestsTotal();
   1821  1.1  ross     while ( ! testCases_done || forever ) {
   1822  1.1  ross         testCases_next();
   1823  1.1  ross         *trueFlagsPtr = 0;
   1824  1.1  ross         trueZ = trueFunction( testCases_a_floatx80 );
   1825  1.1  ross         trueFlags = *trueFlagsPtr;
   1826  1.1  ross         (void) testFlagsFunctionPtr();
   1827  1.1  ross         testZ = testFunction( testCases_a_floatx80 );
   1828  1.1  ross         testFlags = testFlagsFunctionPtr();
   1829  1.1  ross         --count;
   1830  1.1  ross         if ( count == 0 ) {
   1831  1.1  ross             checkEarlyExit();
   1832  1.1  ross             count = 10000;
   1833  1.1  ross         }
   1834  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1835  1.1  ross             if (    ! checkNaNs
   1836  1.1  ross                  && floatx80_is_signaling_nan( testCases_a_floatx80 ) ) {
   1837  1.1  ross                 trueFlags |= float_flag_invalid;
   1838  1.1  ross             }
   1839  1.1  ross             if (    ( trueZ == 0x7FFFFFFF )
   1840  1.1  ross                  && (    ( testZ == 0x7FFFFFFF )
   1841  1.1  ross                       || ( testZ == (sbits32) 0x80000000 ) )
   1842  1.1  ross                  && ( trueFlags == float_flag_invalid )
   1843  1.1  ross                  && ( testFlags == float_flag_invalid )
   1844  1.1  ross                ) {
   1845  1.1  ross                 /* no problem */
   1846  1.1  ross             }
   1847  1.1  ross             else {
   1848  1.1  ross                 ++errorCount;
   1849  1.1  ross                 writeErrorFound( 10000 - count );
   1850  1.1  ross                 writeInput_a_floatx80();
   1851  1.1  ross                 fputs( "  ", stdout );
   1852  1.1  ross                 writeOutputs_z_int32( trueZ, trueFlags, testZ, testFlags );
   1853  1.1  ross                 fflush( stdout );
   1854  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1855  1.1  ross             }
   1856  1.1  ross         }
   1857  1.1  ross     }
   1858  1.1  ross  exit:
   1859  1.1  ross     writeTestsPerformed( 10000 - count );
   1860  1.1  ross 
   1861  1.1  ross }
   1862  1.1  ross 
   1863  1.1  ross #ifdef BITS64
   1864  1.1  ross 
   1865  1.1  ross void
   1866  1.1  ross  test_a_floatx80_z_int64(
   1867  1.1  ross      int64 trueFunction( floatx80 ), int64 testFunction( floatx80 ) )
   1868  1.1  ross {
   1869  1.1  ross     int16 count;
   1870  1.1  ross     int64 trueZ, testZ;
   1871  1.1  ross     uint8 trueFlags, testFlags;
   1872  1.1  ross 
   1873  1.1  ross     errorCount = 0;
   1874  1.1  ross     tenthousandsCount = 0;
   1875  1.1  ross     count = 10000;
   1876  1.1  ross     testCases_initSequence( testCases_sequence_a_floatx80 );
   1877  1.1  ross     writeTestsTotal();
   1878  1.1  ross     while ( ! testCases_done || forever ) {
   1879  1.1  ross         testCases_next();
   1880  1.1  ross         *trueFlagsPtr = 0;
   1881  1.1  ross         trueZ = trueFunction( testCases_a_floatx80 );
   1882  1.1  ross         trueFlags = *trueFlagsPtr;
   1883  1.1  ross         (void) testFlagsFunctionPtr();
   1884  1.1  ross         testZ = testFunction( testCases_a_floatx80 );
   1885  1.1  ross         testFlags = testFlagsFunctionPtr();
   1886  1.1  ross         --count;
   1887  1.1  ross         if ( count == 0 ) {
   1888  1.1  ross             checkEarlyExit();
   1889  1.1  ross             count = 10000;
   1890  1.1  ross         }
   1891  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1892  1.1  ross             if (    ! checkNaNs
   1893  1.1  ross                  && floatx80_is_signaling_nan( testCases_a_floatx80 ) ) {
   1894  1.1  ross                 trueFlags |= float_flag_invalid;
   1895  1.1  ross             }
   1896  1.1  ross             if (    ( trueZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
   1897  1.1  ross                  && (    ( testZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
   1898  1.1  ross                       || ( testZ == (sbits64) LIT64( 0x8000000000000000 ) ) )
   1899  1.1  ross                  && ( trueFlags == float_flag_invalid )
   1900  1.1  ross                  && ( testFlags == float_flag_invalid )
   1901  1.1  ross                ) {
   1902  1.1  ross                 /* no problem */
   1903  1.1  ross             }
   1904  1.1  ross             else {
   1905  1.1  ross                 ++errorCount;
   1906  1.1  ross                 writeErrorFound( 10000 - count );
   1907  1.1  ross                 writeInput_a_floatx80();
   1908  1.1  ross                 fputs( "  ", stdout );
   1909  1.1  ross                 writeOutputs_z_int64( trueZ, trueFlags, testZ, testFlags );
   1910  1.1  ross                 fflush( stdout );
   1911  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1912  1.1  ross             }
   1913  1.1  ross         }
   1914  1.1  ross     }
   1915  1.1  ross  exit:
   1916  1.1  ross     writeTestsPerformed( 10000 - count );
   1917  1.1  ross 
   1918  1.1  ross }
   1919  1.1  ross 
   1920  1.1  ross #endif
   1921  1.1  ross 
   1922  1.1  ross void
   1923  1.1  ross  test_a_floatx80_z_float32(
   1924  1.1  ross      float32 trueFunction( floatx80 ), float32 testFunction( floatx80 ) )
   1925  1.1  ross {
   1926  1.1  ross     int16 count;
   1927  1.1  ross     float32 trueZ, testZ;
   1928  1.1  ross     uint8 trueFlags, testFlags;
   1929  1.1  ross 
   1930  1.1  ross     errorCount = 0;
   1931  1.1  ross     tenthousandsCount = 0;
   1932  1.1  ross     count = 10000;
   1933  1.1  ross     testCases_initSequence( testCases_sequence_a_floatx80 );
   1934  1.1  ross     writeTestsTotal();
   1935  1.1  ross     while ( ! testCases_done || forever ) {
   1936  1.1  ross         testCases_next();
   1937  1.1  ross         *trueFlagsPtr = 0;
   1938  1.1  ross         trueZ = trueFunction( testCases_a_floatx80 );
   1939  1.1  ross         trueFlags = *trueFlagsPtr;
   1940  1.1  ross         (void) testFlagsFunctionPtr();
   1941  1.1  ross         testZ = testFunction( testCases_a_floatx80 );
   1942  1.1  ross         testFlags = testFlagsFunctionPtr();
   1943  1.1  ross         --count;
   1944  1.1  ross         if ( count == 0 ) {
   1945  1.1  ross             checkEarlyExit();
   1946  1.1  ross             count = 10000;
   1947  1.1  ross         }
   1948  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   1949  1.1  ross             if (    ! checkNaNs
   1950  1.1  ross                  && floatx80_is_signaling_nan( testCases_a_floatx80 ) ) {
   1951  1.1  ross                 trueFlags |= float_flag_invalid;
   1952  1.1  ross             }
   1953  1.1  ross             if (    ! checkNaNs
   1954  1.1  ross                  && float32_isNaN( trueZ )
   1955  1.1  ross                  && float32_isNaN( testZ )
   1956  1.1  ross                  && ! float32_is_signaling_nan( testZ )
   1957  1.1  ross                  && ( trueFlags == testFlags )
   1958  1.1  ross                ) {
   1959  1.1  ross                 /* no problem */
   1960  1.1  ross             }
   1961  1.1  ross             else {
   1962  1.1  ross                 ++errorCount;
   1963  1.1  ross                 writeErrorFound( 10000 - count );
   1964  1.1  ross                 writeInput_a_floatx80();
   1965  1.1  ross                 fputs( "  ", stdout );
   1966  1.1  ross                 writeOutputs_z_float32( trueZ, trueFlags, testZ, testFlags );
   1967  1.1  ross                 fflush( stdout );
   1968  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   1969  1.1  ross             }
   1970  1.1  ross         }
   1971  1.1  ross     }
   1972  1.1  ross  exit:
   1973  1.1  ross     writeTestsPerformed( 10000 - count );
   1974  1.1  ross 
   1975  1.1  ross }
   1976  1.1  ross 
   1977  1.1  ross void
   1978  1.1  ross  test_a_floatx80_z_float64(
   1979  1.1  ross      float64 trueFunction( floatx80 ), float64 testFunction( floatx80 ) )
   1980  1.1  ross {
   1981  1.1  ross     int16 count;
   1982  1.1  ross     float64 trueZ, testZ;
   1983  1.1  ross     uint8 trueFlags, testFlags;
   1984  1.1  ross 
   1985  1.1  ross     errorCount = 0;
   1986  1.1  ross     tenthousandsCount = 0;
   1987  1.1  ross     count = 10000;
   1988  1.1  ross     testCases_initSequence( testCases_sequence_a_floatx80 );
   1989  1.1  ross     writeTestsTotal();
   1990  1.1  ross     while ( ! testCases_done || forever ) {
   1991  1.1  ross         testCases_next();
   1992  1.1  ross         *trueFlagsPtr = 0;
   1993  1.1  ross         trueZ = trueFunction( testCases_a_floatx80 );
   1994  1.1  ross         trueFlags = *trueFlagsPtr;
   1995  1.1  ross         (void) testFlagsFunctionPtr();
   1996  1.1  ross         testZ = testFunction( testCases_a_floatx80 );
   1997  1.1  ross         testFlags = testFlagsFunctionPtr();
   1998  1.1  ross         --count;
   1999  1.1  ross         if ( count == 0 ) {
   2000  1.1  ross             checkEarlyExit();
   2001  1.1  ross             count = 10000;
   2002  1.1  ross         }
   2003  1.1  ross         if ( ! float64_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2004  1.1  ross             if (    ! checkNaNs
   2005  1.1  ross                  && floatx80_is_signaling_nan( testCases_a_floatx80 ) ) {
   2006  1.1  ross                 trueFlags |= float_flag_invalid;
   2007  1.1  ross             }
   2008  1.1  ross             if (    ! checkNaNs
   2009  1.1  ross                  && float64_isNaN( trueZ )
   2010  1.1  ross                  && float64_isNaN( testZ )
   2011  1.1  ross                  && ! float64_is_signaling_nan( testZ )
   2012  1.1  ross                  && ( trueFlags == testFlags )
   2013  1.1  ross                ) {
   2014  1.1  ross                 /* no problem */
   2015  1.1  ross             }
   2016  1.1  ross             else {
   2017  1.1  ross                 ++errorCount;
   2018  1.1  ross                 writeErrorFound( 10000 - count );
   2019  1.1  ross                 writeInput_a_floatx80();
   2020  1.1  ross                 fputs( "\n\t", stdout );
   2021  1.1  ross                 writeOutputs_z_float64( trueZ, trueFlags, testZ, testFlags );
   2022  1.1  ross                 fflush( stdout );
   2023  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2024  1.1  ross             }
   2025  1.1  ross         }
   2026  1.1  ross     }
   2027  1.1  ross  exit:
   2028  1.1  ross     writeTestsPerformed( 10000 - count );
   2029  1.1  ross 
   2030  1.1  ross }
   2031  1.1  ross 
   2032  1.1  ross #ifdef FLOAT128
   2033  1.1  ross 
   2034  1.1  ross void
   2035  1.1  ross  test_a_floatx80_z_float128(
   2036  1.1  ross      float128 trueFunction( floatx80 ), float128 testFunction( floatx80 ) )
   2037  1.1  ross {
   2038  1.1  ross     int16 count;
   2039  1.1  ross     float128 trueZ, testZ;
   2040  1.1  ross     uint8 trueFlags, testFlags;
   2041  1.1  ross 
   2042  1.1  ross     errorCount = 0;
   2043  1.1  ross     tenthousandsCount = 0;
   2044  1.1  ross     count = 10000;
   2045  1.1  ross     testCases_initSequence( testCases_sequence_a_floatx80 );
   2046  1.1  ross     writeTestsTotal();
   2047  1.1  ross     while ( ! testCases_done || forever ) {
   2048  1.1  ross         testCases_next();
   2049  1.1  ross         *trueFlagsPtr = 0;
   2050  1.1  ross         trueZ = trueFunction( testCases_a_floatx80 );
   2051  1.1  ross         trueFlags = *trueFlagsPtr;
   2052  1.1  ross         (void) testFlagsFunctionPtr();
   2053  1.1  ross         testZ = testFunction( testCases_a_floatx80 );
   2054  1.1  ross         testFlags = testFlagsFunctionPtr();
   2055  1.1  ross         --count;
   2056  1.1  ross         if ( count == 0 ) {
   2057  1.1  ross             checkEarlyExit();
   2058  1.1  ross             count = 10000;
   2059  1.1  ross         }
   2060  1.1  ross         if ( ! float128_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2061  1.1  ross             if (    ! checkNaNs
   2062  1.1  ross                  && floatx80_is_signaling_nan( testCases_a_floatx80 ) ) {
   2063  1.1  ross                 trueFlags |= float_flag_invalid;
   2064  1.1  ross             }
   2065  1.1  ross             if (    ! checkNaNs
   2066  1.1  ross                  && float128_isNaN( trueZ )
   2067  1.1  ross                  && float128_isNaN( testZ )
   2068  1.1  ross                  && ! float128_is_signaling_nan( testZ )
   2069  1.1  ross                  && ( trueFlags == testFlags )
   2070  1.1  ross                ) {
   2071  1.1  ross                 /* no problem */
   2072  1.1  ross             }
   2073  1.1  ross             else {
   2074  1.1  ross                 ++errorCount;
   2075  1.1  ross                 writeErrorFound( 10000 - count );
   2076  1.1  ross                 writeInput_a_floatx80();
   2077  1.1  ross                 fputs( "\n\t", stdout );
   2078  1.1  ross                 writeOutputs_z_float128( trueZ, trueFlags, testZ, testFlags );
   2079  1.1  ross                 fflush( stdout );
   2080  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2081  1.1  ross             }
   2082  1.1  ross         }
   2083  1.1  ross     }
   2084  1.1  ross  exit:
   2085  1.1  ross     writeTestsPerformed( 10000 - count );
   2086  1.1  ross 
   2087  1.1  ross }
   2088  1.1  ross 
   2089  1.1  ross #endif
   2090  1.1  ross 
   2091  1.1  ross void
   2092  1.1  ross  test_az_floatx80(
   2093  1.1  ross      floatx80 trueFunction( floatx80 ), floatx80 testFunction( floatx80 ) )
   2094  1.1  ross {
   2095  1.1  ross     int16 count;
   2096  1.1  ross     floatx80 trueZ, testZ;
   2097  1.1  ross     uint8 trueFlags, testFlags;
   2098  1.1  ross 
   2099  1.1  ross     errorCount = 0;
   2100  1.1  ross     tenthousandsCount = 0;
   2101  1.1  ross     count = 10000;
   2102  1.1  ross     testCases_initSequence( testCases_sequence_a_floatx80 );
   2103  1.1  ross     writeTestsTotal();
   2104  1.1  ross     while ( ! testCases_done || forever ) {
   2105  1.1  ross         testCases_next();
   2106  1.1  ross         *trueFlagsPtr = 0;
   2107  1.1  ross         trueZ = trueFunction( testCases_a_floatx80 );
   2108  1.1  ross         trueFlags = *trueFlagsPtr;
   2109  1.1  ross         (void) testFlagsFunctionPtr();
   2110  1.1  ross         testZ = testFunction( testCases_a_floatx80 );
   2111  1.1  ross         testFlags = testFlagsFunctionPtr();
   2112  1.1  ross         --count;
   2113  1.1  ross         if ( count == 0 ) {
   2114  1.1  ross             checkEarlyExit();
   2115  1.1  ross             count = 10000;
   2116  1.1  ross         }
   2117  1.1  ross         if ( ! floatx80_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2118  1.1  ross             if (    ! checkNaNs
   2119  1.1  ross                  && floatx80_is_signaling_nan( testCases_a_floatx80 ) ) {
   2120  1.1  ross                 trueFlags |= float_flag_invalid;
   2121  1.1  ross             }
   2122  1.1  ross             if (    ! checkNaNs
   2123  1.1  ross                  && floatx80_isNaN( trueZ )
   2124  1.1  ross                  && floatx80_isNaN( testZ )
   2125  1.1  ross                  && ! floatx80_is_signaling_nan( testZ )
   2126  1.1  ross                  && ( trueFlags == testFlags )
   2127  1.1  ross                ) {
   2128  1.1  ross                 /* no problem */
   2129  1.1  ross             }
   2130  1.1  ross             else {
   2131  1.1  ross                 ++errorCount;
   2132  1.1  ross                 writeErrorFound( 10000 - count );
   2133  1.1  ross                 writeInput_a_floatx80();
   2134  1.1  ross                 fputs( "\n\t", stdout );
   2135  1.1  ross                 writeOutputs_z_floatx80( trueZ, trueFlags, testZ, testFlags );
   2136  1.1  ross                 fflush( stdout );
   2137  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2138  1.1  ross             }
   2139  1.1  ross         }
   2140  1.1  ross     }
   2141  1.1  ross  exit:
   2142  1.1  ross     writeTestsPerformed( 10000 - count );
   2143  1.1  ross 
   2144  1.1  ross }
   2145  1.1  ross 
   2146  1.1  ross void
   2147  1.1  ross  test_ab_floatx80_z_flag(
   2148  1.1  ross      flag trueFunction( floatx80, floatx80 ),
   2149  1.1  ross      flag testFunction( floatx80, floatx80 )
   2150  1.1  ross  )
   2151  1.1  ross {
   2152  1.1  ross     int16 count;
   2153  1.1  ross     flag trueZ, testZ;
   2154  1.1  ross     uint8 trueFlags, testFlags;
   2155  1.1  ross 
   2156  1.1  ross     errorCount = 0;
   2157  1.1  ross     tenthousandsCount = 0;
   2158  1.1  ross     count = 10000;
   2159  1.1  ross     testCases_initSequence( testCases_sequence_ab_floatx80 );
   2160  1.1  ross     writeTestsTotal();
   2161  1.1  ross     while ( ! testCases_done || forever ) {
   2162  1.1  ross         testCases_next();
   2163  1.1  ross         *trueFlagsPtr = 0;
   2164  1.1  ross         trueZ = trueFunction( testCases_a_floatx80, testCases_b_floatx80 );
   2165  1.1  ross         trueFlags = *trueFlagsPtr;
   2166  1.1  ross         (void) testFlagsFunctionPtr();
   2167  1.1  ross         testZ = testFunction( testCases_a_floatx80, testCases_b_floatx80 );
   2168  1.1  ross         testFlags = testFlagsFunctionPtr();
   2169  1.1  ross         --count;
   2170  1.1  ross         if ( count == 0 ) {
   2171  1.1  ross             checkEarlyExit();
   2172  1.1  ross             count = 10000;
   2173  1.1  ross         }
   2174  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   2175  1.1  ross             if (    ! checkNaNs
   2176  1.1  ross                  && (    floatx80_is_signaling_nan( testCases_a_floatx80 )
   2177  1.1  ross                       || floatx80_is_signaling_nan( testCases_b_floatx80 ) )
   2178  1.1  ross                ) {
   2179  1.1  ross                 trueFlags |= float_flag_invalid;
   2180  1.1  ross             }
   2181  1.1  ross             if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   2182  1.1  ross                 ++errorCount;
   2183  1.1  ross                 writeErrorFound( 10000 - count );
   2184  1.1  ross                 writeInputs_ab_floatx80();
   2185  1.1  ross                 fputs( "  ", stdout );
   2186  1.1  ross                 writeOutputs_z_flag( trueZ, trueFlags, testZ, testFlags );
   2187  1.1  ross                 fflush( stdout );
   2188  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2189  1.1  ross             }
   2190  1.1  ross         }
   2191  1.1  ross     }
   2192  1.1  ross  exit:
   2193  1.1  ross     writeTestsPerformed( 10000 - count );
   2194  1.1  ross     return;
   2195  1.1  ross 
   2196  1.1  ross }
   2197  1.1  ross 
   2198  1.1  ross void
   2199  1.1  ross  test_abz_floatx80(
   2200  1.1  ross      floatx80 trueFunction( floatx80, floatx80 ),
   2201  1.1  ross      floatx80 testFunction( floatx80, floatx80 )
   2202  1.1  ross  )
   2203  1.1  ross {
   2204  1.1  ross     int16 count;
   2205  1.1  ross     floatx80 trueZ, testZ;
   2206  1.1  ross     uint8 trueFlags, testFlags;
   2207  1.1  ross 
   2208  1.1  ross     errorCount = 0;
   2209  1.1  ross     tenthousandsCount = 0;
   2210  1.1  ross     count = 10000;
   2211  1.1  ross     testCases_initSequence( testCases_sequence_ab_floatx80 );
   2212  1.1  ross     writeTestsTotal();
   2213  1.1  ross     while ( ! testCases_done || forever ) {
   2214  1.1  ross         testCases_next();
   2215  1.1  ross         *trueFlagsPtr = 0;
   2216  1.1  ross         trueZ = trueFunction( testCases_a_floatx80, testCases_b_floatx80 );
   2217  1.1  ross         trueFlags = *trueFlagsPtr;
   2218  1.1  ross         (void) testFlagsFunctionPtr();
   2219  1.1  ross         testZ = testFunction( testCases_a_floatx80, testCases_b_floatx80 );
   2220  1.1  ross         testFlags = testFlagsFunctionPtr();
   2221  1.1  ross         --count;
   2222  1.1  ross         if ( count == 0 ) {
   2223  1.1  ross             checkEarlyExit();
   2224  1.1  ross             count = 10000;
   2225  1.1  ross         }
   2226  1.1  ross         if ( ! floatx80_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2227  1.1  ross             if (    ! checkNaNs
   2228  1.1  ross                  && (    floatx80_is_signaling_nan( testCases_a_floatx80 )
   2229  1.1  ross                       || floatx80_is_signaling_nan( testCases_b_floatx80 ) )
   2230  1.1  ross                ) {
   2231  1.1  ross                 trueFlags |= float_flag_invalid;
   2232  1.1  ross             }
   2233  1.1  ross             if (    ! checkNaNs
   2234  1.1  ross                  && floatx80_isNaN( trueZ )
   2235  1.1  ross                  && floatx80_isNaN( testZ )
   2236  1.1  ross                  && ! floatx80_is_signaling_nan( testZ )
   2237  1.1  ross                  && ( trueFlags == testFlags )
   2238  1.1  ross                ) {
   2239  1.1  ross                 /* no problem */
   2240  1.1  ross             }
   2241  1.1  ross             else {
   2242  1.1  ross                 ++errorCount;
   2243  1.1  ross                 writeErrorFound( 10000 - count );
   2244  1.1  ross                 writeInputs_ab_floatx80();
   2245  1.1  ross                 fputs( "\n\t", stdout );
   2246  1.1  ross                 writeOutputs_z_floatx80( trueZ, trueFlags, testZ, testFlags );
   2247  1.1  ross                 fflush( stdout );
   2248  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2249  1.1  ross             }
   2250  1.1  ross         }
   2251  1.1  ross     }
   2252  1.1  ross  exit:
   2253  1.1  ross     writeTestsPerformed( 10000 - count );
   2254  1.1  ross     return;
   2255  1.1  ross 
   2256  1.1  ross }
   2257  1.1  ross 
   2258  1.1  ross #endif
   2259  1.1  ross 
   2260  1.1  ross #ifdef FLOAT128
   2261  1.1  ross 
   2262  1.1  ross void
   2263  1.1  ross  test_a_float128_z_int32(
   2264  1.1  ross      int32 trueFunction( float128 ), int32 testFunction( float128 ) )
   2265  1.1  ross {
   2266  1.1  ross     int16 count;
   2267  1.1  ross     int32 trueZ, testZ;
   2268  1.1  ross     uint8 trueFlags, testFlags;
   2269  1.1  ross 
   2270  1.1  ross     errorCount = 0;
   2271  1.1  ross     tenthousandsCount = 0;
   2272  1.1  ross     count = 10000;
   2273  1.1  ross     testCases_initSequence( testCases_sequence_a_float128 );
   2274  1.1  ross     writeTestsTotal();
   2275  1.1  ross     while ( ! testCases_done || forever ) {
   2276  1.1  ross         testCases_next();
   2277  1.1  ross         *trueFlagsPtr = 0;
   2278  1.1  ross         trueZ = trueFunction( testCases_a_float128 );
   2279  1.1  ross         trueFlags = *trueFlagsPtr;
   2280  1.1  ross         (void) testFlagsFunctionPtr();
   2281  1.1  ross         testZ = testFunction( testCases_a_float128 );
   2282  1.1  ross         testFlags = testFlagsFunctionPtr();
   2283  1.1  ross         --count;
   2284  1.1  ross         if ( count == 0 ) {
   2285  1.1  ross             checkEarlyExit();
   2286  1.1  ross             count = 10000;
   2287  1.1  ross         }
   2288  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   2289  1.1  ross             if (    ! checkNaNs
   2290  1.1  ross                  && float128_is_signaling_nan( testCases_a_float128 ) ) {
   2291  1.1  ross                 trueFlags |= float_flag_invalid;
   2292  1.1  ross             }
   2293  1.1  ross             if (    ( trueZ == 0x7FFFFFFF )
   2294  1.1  ross                  && (    ( testZ == 0x7FFFFFFF )
   2295  1.1  ross                       || ( testZ == (sbits32) 0x80000000 ) )
   2296  1.1  ross                  && ( trueFlags == float_flag_invalid )
   2297  1.1  ross                  && ( testFlags == float_flag_invalid )
   2298  1.1  ross                ) {
   2299  1.1  ross                 /* no problem */
   2300  1.1  ross             }
   2301  1.1  ross             else {
   2302  1.1  ross                 ++errorCount;
   2303  1.1  ross                 writeErrorFound( 10000 - count );
   2304  1.1  ross                 writeInput_a_float128();
   2305  1.1  ross                 fputs( "  ", stdout );
   2306  1.1  ross                 writeOutputs_z_int32( trueZ, trueFlags, testZ, testFlags );
   2307  1.1  ross                 fflush( stdout );
   2308  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2309  1.1  ross             }
   2310  1.1  ross         }
   2311  1.1  ross     }
   2312  1.1  ross  exit:
   2313  1.1  ross     writeTestsPerformed( 10000 - count );
   2314  1.1  ross 
   2315  1.1  ross }
   2316  1.1  ross 
   2317  1.1  ross #ifdef BITS64
   2318  1.1  ross 
   2319  1.1  ross void
   2320  1.1  ross  test_a_float128_z_int64(
   2321  1.1  ross      int64 trueFunction( float128 ), int64 testFunction( float128 ) )
   2322  1.1  ross {
   2323  1.1  ross     int16 count;
   2324  1.1  ross     int64 trueZ, testZ;
   2325  1.1  ross     uint8 trueFlags, testFlags;
   2326  1.1  ross 
   2327  1.1  ross     errorCount = 0;
   2328  1.1  ross     tenthousandsCount = 0;
   2329  1.1  ross     count = 10000;
   2330  1.1  ross     testCases_initSequence( testCases_sequence_a_float128 );
   2331  1.1  ross     writeTestsTotal();
   2332  1.1  ross     while ( ! testCases_done || forever ) {
   2333  1.1  ross         testCases_next();
   2334  1.1  ross         *trueFlagsPtr = 0;
   2335  1.1  ross         trueZ = trueFunction( testCases_a_float128 );
   2336  1.1  ross         trueFlags = *trueFlagsPtr;
   2337  1.1  ross         (void) testFlagsFunctionPtr();
   2338  1.1  ross         testZ = testFunction( testCases_a_float128 );
   2339  1.1  ross         testFlags = testFlagsFunctionPtr();
   2340  1.1  ross         --count;
   2341  1.1  ross         if ( count == 0 ) {
   2342  1.1  ross             checkEarlyExit();
   2343  1.1  ross             count = 10000;
   2344  1.1  ross         }
   2345  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   2346  1.1  ross             if (    ! checkNaNs
   2347  1.1  ross                  && float128_is_signaling_nan( testCases_a_float128 ) ) {
   2348  1.1  ross                 trueFlags |= float_flag_invalid;
   2349  1.1  ross             }
   2350  1.1  ross             if (    ( trueZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
   2351  1.1  ross                  && (    ( testZ == LIT64( 0x7FFFFFFFFFFFFFFF ) )
   2352  1.1  ross                       || ( testZ == (sbits64) LIT64( 0x8000000000000000 ) ) )
   2353  1.1  ross                  && ( trueFlags == float_flag_invalid )
   2354  1.1  ross                  && ( testFlags == float_flag_invalid )
   2355  1.1  ross                ) {
   2356  1.1  ross                 /* no problem */
   2357  1.1  ross             }
   2358  1.1  ross             else {
   2359  1.1  ross                 ++errorCount;
   2360  1.1  ross                 writeErrorFound( 10000 - count );
   2361  1.1  ross                 writeInput_a_float128();
   2362  1.1  ross                 fputs( "\n\t", stdout );
   2363  1.1  ross                 writeOutputs_z_int64( trueZ, trueFlags, testZ, testFlags );
   2364  1.1  ross                 fflush( stdout );
   2365  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2366  1.1  ross             }
   2367  1.1  ross         }
   2368  1.1  ross     }
   2369  1.1  ross  exit:
   2370  1.1  ross     writeTestsPerformed( 10000 - count );
   2371  1.1  ross 
   2372  1.1  ross }
   2373  1.1  ross 
   2374  1.1  ross #endif
   2375  1.1  ross 
   2376  1.1  ross void
   2377  1.1  ross  test_a_float128_z_float32(
   2378  1.1  ross      float32 trueFunction( float128 ), float32 testFunction( float128 ) )
   2379  1.1  ross {
   2380  1.1  ross     int16 count;
   2381  1.1  ross     float32 trueZ, testZ;
   2382  1.1  ross     uint8 trueFlags, testFlags;
   2383  1.1  ross 
   2384  1.1  ross     errorCount = 0;
   2385  1.1  ross     tenthousandsCount = 0;
   2386  1.1  ross     count = 10000;
   2387  1.1  ross     testCases_initSequence( testCases_sequence_a_float128 );
   2388  1.1  ross     writeTestsTotal();
   2389  1.1  ross     while ( ! testCases_done || forever ) {
   2390  1.1  ross         testCases_next();
   2391  1.1  ross         *trueFlagsPtr = 0;
   2392  1.1  ross         trueZ = trueFunction( testCases_a_float128 );
   2393  1.1  ross         trueFlags = *trueFlagsPtr;
   2394  1.1  ross         (void) testFlagsFunctionPtr();
   2395  1.1  ross         testZ = testFunction( testCases_a_float128 );
   2396  1.1  ross         testFlags = testFlagsFunctionPtr();
   2397  1.1  ross         --count;
   2398  1.1  ross         if ( count == 0 ) {
   2399  1.1  ross             checkEarlyExit();
   2400  1.1  ross             count = 10000;
   2401  1.1  ross         }
   2402  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   2403  1.1  ross             if (    ! checkNaNs
   2404  1.1  ross                  && float128_is_signaling_nan( testCases_a_float128 ) ) {
   2405  1.1  ross                 trueFlags |= float_flag_invalid;
   2406  1.1  ross             }
   2407  1.1  ross             if (    ! checkNaNs
   2408  1.1  ross                  && float32_isNaN( trueZ )
   2409  1.1  ross                  && float32_isNaN( testZ )
   2410  1.1  ross                  && ! float32_is_signaling_nan( testZ )
   2411  1.1  ross                  && ( trueFlags == testFlags )
   2412  1.1  ross                ) {
   2413  1.1  ross                 /* no problem */
   2414  1.1  ross             }
   2415  1.1  ross             else {
   2416  1.1  ross                 ++errorCount;
   2417  1.1  ross                 writeErrorFound( 10000 - count );
   2418  1.1  ross                 writeInput_a_float128();
   2419  1.1  ross                 fputs( "  ", stdout );
   2420  1.1  ross                 writeOutputs_z_float32( trueZ, trueFlags, testZ, testFlags );
   2421  1.1  ross                 fflush( stdout );
   2422  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2423  1.1  ross             }
   2424  1.1  ross         }
   2425  1.1  ross     }
   2426  1.1  ross  exit:
   2427  1.1  ross     writeTestsPerformed( 10000 - count );
   2428  1.1  ross 
   2429  1.1  ross }
   2430  1.1  ross 
   2431  1.1  ross void
   2432  1.1  ross  test_a_float128_z_float64(
   2433  1.1  ross      float64 trueFunction( float128 ), float64 testFunction( float128 ) )
   2434  1.1  ross {
   2435  1.1  ross     int16 count;
   2436  1.1  ross     float64 trueZ, testZ;
   2437  1.1  ross     uint8 trueFlags, testFlags;
   2438  1.1  ross 
   2439  1.1  ross     errorCount = 0;
   2440  1.1  ross     tenthousandsCount = 0;
   2441  1.1  ross     count = 10000;
   2442  1.1  ross     testCases_initSequence( testCases_sequence_a_float128 );
   2443  1.1  ross     writeTestsTotal();
   2444  1.1  ross     while ( ! testCases_done || forever ) {
   2445  1.1  ross         testCases_next();
   2446  1.1  ross         *trueFlagsPtr = 0;
   2447  1.1  ross         trueZ = trueFunction( testCases_a_float128 );
   2448  1.1  ross         trueFlags = *trueFlagsPtr;
   2449  1.1  ross         (void) testFlagsFunctionPtr();
   2450  1.1  ross         testZ = testFunction( testCases_a_float128 );
   2451  1.1  ross         testFlags = testFlagsFunctionPtr();
   2452  1.1  ross         --count;
   2453  1.1  ross         if ( count == 0 ) {
   2454  1.1  ross             checkEarlyExit();
   2455  1.1  ross             count = 10000;
   2456  1.1  ross         }
   2457  1.1  ross         if ( ! float64_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2458  1.1  ross             if (    ! checkNaNs
   2459  1.1  ross                  && float128_is_signaling_nan( testCases_a_float128 ) ) {
   2460  1.1  ross                 trueFlags |= float_flag_invalid;
   2461  1.1  ross             }
   2462  1.1  ross             if (    ! checkNaNs
   2463  1.1  ross                  && float64_isNaN( trueZ )
   2464  1.1  ross                  && float64_isNaN( testZ )
   2465  1.1  ross                  && ! float64_is_signaling_nan( testZ )
   2466  1.1  ross                  && ( trueFlags == testFlags )
   2467  1.1  ross                ) {
   2468  1.1  ross                 /* no problem */
   2469  1.1  ross             }
   2470  1.1  ross             else {
   2471  1.1  ross                 ++errorCount;
   2472  1.1  ross                 writeErrorFound( 10000 - count );
   2473  1.1  ross                 writeInput_a_float128();
   2474  1.1  ross                 fputs( "\n\t", stdout );
   2475  1.1  ross                 writeOutputs_z_float64( trueZ, trueFlags, testZ, testFlags );
   2476  1.1  ross                 fflush( stdout );
   2477  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2478  1.1  ross             }
   2479  1.1  ross         }
   2480  1.1  ross     }
   2481  1.1  ross  exit:
   2482  1.1  ross     writeTestsPerformed( 10000 - count );
   2483  1.1  ross 
   2484  1.1  ross }
   2485  1.1  ross 
   2486  1.1  ross #ifdef FLOATX80
   2487  1.1  ross 
   2488  1.1  ross void
   2489  1.1  ross  test_a_float128_z_floatx80(
   2490  1.1  ross      floatx80 trueFunction( float128 ), floatx80 testFunction( float128 ) )
   2491  1.1  ross {
   2492  1.1  ross     int16 count;
   2493  1.1  ross     floatx80 trueZ, testZ;
   2494  1.1  ross     uint8 trueFlags, testFlags;
   2495  1.1  ross 
   2496  1.1  ross     errorCount = 0;
   2497  1.1  ross     tenthousandsCount = 0;
   2498  1.1  ross     count = 10000;
   2499  1.1  ross     testCases_initSequence( testCases_sequence_a_float128 );
   2500  1.1  ross     writeTestsTotal();
   2501  1.1  ross     while ( ! testCases_done || forever ) {
   2502  1.1  ross         testCases_next();
   2503  1.1  ross         *trueFlagsPtr = 0;
   2504  1.1  ross         trueZ = trueFunction( testCases_a_float128 );
   2505  1.1  ross         trueFlags = *trueFlagsPtr;
   2506  1.1  ross         (void) testFlagsFunctionPtr();
   2507  1.1  ross         testZ = testFunction( testCases_a_float128 );
   2508  1.1  ross         testFlags = testFlagsFunctionPtr();
   2509  1.1  ross         --count;
   2510  1.1  ross         if ( count == 0 ) {
   2511  1.1  ross             checkEarlyExit();
   2512  1.1  ross             count = 10000;
   2513  1.1  ross         }
   2514  1.1  ross         if ( ! floatx80_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2515  1.1  ross             if (    ! checkNaNs
   2516  1.1  ross                  && float128_is_signaling_nan( testCases_a_float128 ) ) {
   2517  1.1  ross                 trueFlags |= float_flag_invalid;
   2518  1.1  ross             }
   2519  1.1  ross             if (    ! checkNaNs
   2520  1.1  ross                  && floatx80_isNaN( trueZ )
   2521  1.1  ross                  && floatx80_isNaN( testZ )
   2522  1.1  ross                  && ! floatx80_is_signaling_nan( testZ )
   2523  1.1  ross                  && ( trueFlags == testFlags )
   2524  1.1  ross                ) {
   2525  1.1  ross                 /* no problem */
   2526  1.1  ross             }
   2527  1.1  ross             else {
   2528  1.1  ross                 ++errorCount;
   2529  1.1  ross                 writeErrorFound( 10000 - count );
   2530  1.1  ross                 writeInput_a_float128();
   2531  1.1  ross                 fputs( "\n\t", stdout );
   2532  1.1  ross                 writeOutputs_z_floatx80( trueZ, trueFlags, testZ, testFlags );
   2533  1.1  ross                 fflush( stdout );
   2534  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2535  1.1  ross             }
   2536  1.1  ross         }
   2537  1.1  ross     }
   2538  1.1  ross  exit:
   2539  1.1  ross     writeTestsPerformed( 10000 - count );
   2540  1.1  ross 
   2541  1.1  ross }
   2542  1.1  ross 
   2543  1.1  ross #endif
   2544  1.1  ross 
   2545  1.1  ross void
   2546  1.1  ross  test_az_float128(
   2547  1.1  ross      float128 trueFunction( float128 ), float128 testFunction( float128 ) )
   2548  1.1  ross {
   2549  1.1  ross     int16 count;
   2550  1.1  ross     float128 trueZ, testZ;
   2551  1.1  ross     uint8 trueFlags, testFlags;
   2552  1.1  ross 
   2553  1.1  ross     errorCount = 0;
   2554  1.1  ross     tenthousandsCount = 0;
   2555  1.1  ross     count = 10000;
   2556  1.1  ross     testCases_initSequence( testCases_sequence_a_float128 );
   2557  1.1  ross     writeTestsTotal();
   2558  1.1  ross     while ( ! testCases_done || forever ) {
   2559  1.1  ross         testCases_next();
   2560  1.1  ross         *trueFlagsPtr = 0;
   2561  1.1  ross         trueZ = trueFunction( testCases_a_float128 );
   2562  1.1  ross         trueFlags = *trueFlagsPtr;
   2563  1.1  ross         (void) testFlagsFunctionPtr();
   2564  1.1  ross         testZ = testFunction( testCases_a_float128 );
   2565  1.1  ross         testFlags = testFlagsFunctionPtr();
   2566  1.1  ross         --count;
   2567  1.1  ross         if ( count == 0 ) {
   2568  1.1  ross             checkEarlyExit();
   2569  1.1  ross             count = 10000;
   2570  1.1  ross         }
   2571  1.1  ross         if ( ! float128_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2572  1.1  ross             if (    ! checkNaNs
   2573  1.1  ross                  && float128_is_signaling_nan( testCases_a_float128 ) ) {
   2574  1.1  ross                 trueFlags |= float_flag_invalid;
   2575  1.1  ross             }
   2576  1.1  ross             if (    ! checkNaNs
   2577  1.1  ross                  && float128_isNaN( trueZ )
   2578  1.1  ross                  && float128_isNaN( testZ )
   2579  1.1  ross                  && ! float128_is_signaling_nan( testZ )
   2580  1.1  ross                  && ( trueFlags == testFlags )
   2581  1.1  ross                ) {
   2582  1.1  ross                 /* no problem */
   2583  1.1  ross             }
   2584  1.1  ross             else {
   2585  1.1  ross                 ++errorCount;
   2586  1.1  ross                 writeErrorFound( 10000 - count );
   2587  1.1  ross                 writeInput_a_float128();
   2588  1.1  ross                 fputs( "\n\t", stdout );
   2589  1.1  ross                 writeOutputs_z_float128( trueZ, trueFlags, testZ, testFlags );
   2590  1.1  ross                 fflush( stdout );
   2591  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2592  1.1  ross             }
   2593  1.1  ross         }
   2594  1.1  ross     }
   2595  1.1  ross  exit:
   2596  1.1  ross     writeTestsPerformed( 10000 - count );
   2597  1.1  ross 
   2598  1.1  ross }
   2599  1.1  ross 
   2600  1.1  ross void
   2601  1.1  ross  test_ab_float128_z_flag(
   2602  1.1  ross      flag trueFunction( float128, float128 ),
   2603  1.1  ross      flag testFunction( float128, float128 )
   2604  1.1  ross  )
   2605  1.1  ross {
   2606  1.1  ross     int16 count;
   2607  1.1  ross     flag trueZ, testZ;
   2608  1.1  ross     uint8 trueFlags, testFlags;
   2609  1.1  ross 
   2610  1.1  ross     errorCount = 0;
   2611  1.1  ross     tenthousandsCount = 0;
   2612  1.1  ross     count = 10000;
   2613  1.1  ross     testCases_initSequence( testCases_sequence_ab_float128 );
   2614  1.1  ross     writeTestsTotal();
   2615  1.1  ross     while ( ! testCases_done || forever ) {
   2616  1.1  ross         testCases_next();
   2617  1.1  ross         *trueFlagsPtr = 0;
   2618  1.1  ross         trueZ = trueFunction( testCases_a_float128, testCases_b_float128 );
   2619  1.1  ross         trueFlags = *trueFlagsPtr;
   2620  1.1  ross         (void) testFlagsFunctionPtr();
   2621  1.1  ross         testZ = testFunction( testCases_a_float128, testCases_b_float128 );
   2622  1.1  ross         testFlags = testFlagsFunctionPtr();
   2623  1.1  ross         --count;
   2624  1.1  ross         if ( count == 0 ) {
   2625  1.1  ross             checkEarlyExit();
   2626  1.1  ross             count = 10000;
   2627  1.1  ross         }
   2628  1.1  ross         if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   2629  1.1  ross             if (    ! checkNaNs
   2630  1.1  ross                  && (    float128_is_signaling_nan( testCases_a_float128 )
   2631  1.1  ross                       || float128_is_signaling_nan( testCases_b_float128 ) )
   2632  1.1  ross                ) {
   2633  1.1  ross                 trueFlags |= float_flag_invalid;
   2634  1.1  ross             }
   2635  1.1  ross             if ( ( trueZ != testZ ) || ( trueFlags != testFlags ) ) {
   2636  1.1  ross                 ++errorCount;
   2637  1.1  ross                 writeErrorFound( 10000 - count );
   2638  1.1  ross                 writeInputs_ab_float128();
   2639  1.1  ross                 fputs( "\n\t", stdout );
   2640  1.1  ross                 writeOutputs_z_flag( trueZ, trueFlags, testZ, testFlags );
   2641  1.1  ross                 fflush( stdout );
   2642  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2643  1.1  ross             }
   2644  1.1  ross         }
   2645  1.1  ross     }
   2646  1.1  ross  exit:
   2647  1.1  ross     writeTestsPerformed( 10000 - count );
   2648  1.1  ross     return;
   2649  1.1  ross 
   2650  1.1  ross }
   2651  1.1  ross 
   2652  1.1  ross void
   2653  1.1  ross  test_abz_float128(
   2654  1.1  ross      float128 trueFunction( float128, float128 ),
   2655  1.1  ross      float128 testFunction( float128, float128 )
   2656  1.1  ross  )
   2657  1.1  ross {
   2658  1.1  ross     int16 count;
   2659  1.1  ross     float128 trueZ, testZ;
   2660  1.1  ross     uint8 trueFlags, testFlags;
   2661  1.1  ross 
   2662  1.1  ross     errorCount = 0;
   2663  1.1  ross     tenthousandsCount = 0;
   2664  1.1  ross     count = 10000;
   2665  1.1  ross     testCases_initSequence( testCases_sequence_ab_float128 );
   2666  1.1  ross     writeTestsTotal();
   2667  1.1  ross     while ( ! testCases_done || forever ) {
   2668  1.1  ross         testCases_next();
   2669  1.1  ross         *trueFlagsPtr = 0;
   2670  1.1  ross         trueZ = trueFunction( testCases_a_float128, testCases_b_float128 );
   2671  1.1  ross         trueFlags = *trueFlagsPtr;
   2672  1.1  ross         (void) testFlagsFunctionPtr();
   2673  1.1  ross         testZ = testFunction( testCases_a_float128, testCases_b_float128 );
   2674  1.1  ross         testFlags = testFlagsFunctionPtr();
   2675  1.1  ross         --count;
   2676  1.1  ross         if ( count == 0 ) {
   2677  1.1  ross             checkEarlyExit();
   2678  1.1  ross             count = 10000;
   2679  1.1  ross         }
   2680  1.1  ross         if ( ! float128_same( trueZ, testZ ) || ( trueFlags != testFlags ) ) {
   2681  1.1  ross             if (    ! checkNaNs
   2682  1.1  ross                  && (    float128_is_signaling_nan( testCases_a_float128 )
   2683  1.1  ross                       || float128_is_signaling_nan( testCases_b_float128 ) )
   2684  1.1  ross                ) {
   2685  1.1  ross                 trueFlags |= float_flag_invalid;
   2686  1.1  ross             }
   2687  1.1  ross             if (    ! checkNaNs
   2688  1.1  ross                  && float128_isNaN( trueZ )
   2689  1.1  ross                  && float128_isNaN( testZ )
   2690  1.1  ross                  && ! float128_is_signaling_nan( testZ )
   2691  1.1  ross                  && ( trueFlags == testFlags )
   2692  1.1  ross                ) {
   2693  1.1  ross                 /* no problem */
   2694  1.1  ross             }
   2695  1.1  ross             else {
   2696  1.1  ross                 ++errorCount;
   2697  1.1  ross                 writeErrorFound( 10000 - count );
   2698  1.1  ross                 writeInputs_ab_float128();
   2699  1.1  ross                 fputs( "\n\t", stdout );
   2700  1.1  ross                 writeOutputs_z_float128( trueZ, trueFlags, testZ, testFlags );
   2701  1.1  ross                 fflush( stdout );
   2702  1.1  ross                 if ( errorCount == maxErrorCount ) goto exit;
   2703  1.1  ross             }
   2704  1.1  ross         }
   2705  1.1  ross     }
   2706  1.1  ross  exit:
   2707  1.1  ross     writeTestsPerformed( 10000 - count );
   2708  1.1  ross     return;
   2709  1.1  ross 
   2710  1.1  ross }
   2711  1.1  ross 
   2712  1.1  ross #endif
   2713  1.1  ross 
   2714