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