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