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