1 /* $NetBSD: testFunction.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 "milieu.h" 66 #include "softfloat.h" 67 #include "testCases.h" 68 #include "testLoops.h" 69 #include "systmodes.h" 70 #include "systflags.h" 71 #include "systfloat.h" 72 #include "testFunction.h" 73 74 const functionT functions[ NUM_FUNCTIONS ] = { 75 { 0, 0, 0, 0 }, 76 { "int32_to_float32", 1, FALSE, TRUE }, 77 { "int32_to_float64", 1, FALSE, FALSE }, 78 { "int32_to_floatx80", 1, FALSE, FALSE }, 79 { "int32_to_float128", 1, FALSE, FALSE }, 80 { "int64_to_float32", 1, FALSE, TRUE }, 81 { "int64_to_float64", 1, FALSE, TRUE }, 82 { "int64_to_floatx80", 1, FALSE, FALSE }, 83 { "int64_to_float128", 1, FALSE, FALSE }, 84 { "float32_to_int32", 1, FALSE, TRUE }, 85 { "float32_to_int32_round_to_zero", 1, FALSE, FALSE }, 86 { "float32_to_int64", 1, FALSE, TRUE }, 87 { "float32_to_int64_round_to_zero", 1, FALSE, FALSE }, 88 { "float32_to_float64", 1, FALSE, FALSE }, 89 { "float32_to_floatx80", 1, FALSE, FALSE }, 90 { "float32_to_float128", 1, FALSE, FALSE }, 91 { "float32_round_to_int", 1, FALSE, TRUE }, 92 { "float32_add", 2, FALSE, TRUE }, 93 { "float32_sub", 2, FALSE, TRUE }, 94 { "float32_mul", 2, FALSE, TRUE }, 95 { "float32_div", 2, FALSE, TRUE }, 96 { "float32_rem", 2, FALSE, FALSE }, 97 { "float32_sqrt", 1, FALSE, TRUE }, 98 { "float32_eq", 2, FALSE, FALSE }, 99 { "float32_le", 2, FALSE, FALSE }, 100 { "float32_lt", 2, FALSE, FALSE }, 101 { "float32_eq_signaling", 2, FALSE, FALSE }, 102 { "float32_le_quiet", 2, FALSE, FALSE }, 103 { "float32_lt_quiet", 2, FALSE, FALSE }, 104 { "float64_to_int32", 1, FALSE, TRUE }, 105 { "float64_to_int32_round_to_zero", 1, FALSE, FALSE }, 106 { "float64_to_int64", 1, FALSE, TRUE }, 107 { "float64_to_int64_round_to_zero", 1, FALSE, FALSE }, 108 { "float64_to_float32", 1, FALSE, TRUE }, 109 { "float64_to_floatx80", 1, FALSE, FALSE }, 110 { "float64_to_float128", 1, FALSE, FALSE }, 111 { "float64_round_to_int", 1, FALSE, TRUE }, 112 { "float64_add", 2, FALSE, TRUE }, 113 { "float64_sub", 2, FALSE, TRUE }, 114 { "float64_mul", 2, FALSE, TRUE }, 115 { "float64_div", 2, FALSE, TRUE }, 116 { "float64_rem", 2, FALSE, FALSE }, 117 { "float64_sqrt", 1, FALSE, TRUE }, 118 { "float64_eq", 2, FALSE, FALSE }, 119 { "float64_le", 2, FALSE, FALSE }, 120 { "float64_lt", 2, FALSE, FALSE }, 121 { "float64_eq_signaling", 2, FALSE, FALSE }, 122 { "float64_le_quiet", 2, FALSE, FALSE }, 123 { "float64_lt_quiet", 2, FALSE, FALSE }, 124 { "floatx80_to_int32", 1, FALSE, TRUE }, 125 { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE }, 126 { "floatx80_to_int64", 1, FALSE, TRUE }, 127 { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE }, 128 { "floatx80_to_float32", 1, FALSE, TRUE }, 129 { "floatx80_to_float64", 1, FALSE, TRUE }, 130 { "floatx80_to_float128", 1, FALSE, FALSE }, 131 { "floatx80_round_to_int", 1, FALSE, TRUE }, 132 { "floatx80_add", 2, TRUE, TRUE }, 133 { "floatx80_sub", 2, TRUE, TRUE }, 134 { "floatx80_mul", 2, TRUE, TRUE }, 135 { "floatx80_div", 2, TRUE, TRUE }, 136 { "floatx80_rem", 2, FALSE, FALSE }, 137 { "floatx80_sqrt", 1, TRUE, TRUE }, 138 { "floatx80_eq", 2, FALSE, FALSE }, 139 { "floatx80_le", 2, FALSE, FALSE }, 140 { "floatx80_lt", 2, FALSE, FALSE }, 141 { "floatx80_eq_signaling", 2, FALSE, FALSE }, 142 { "floatx80_le_quiet", 2, FALSE, FALSE }, 143 { "floatx80_lt_quiet", 2, FALSE, FALSE }, 144 { "float128_to_int32", 1, FALSE, TRUE }, 145 { "float128_to_int32_round_to_zero", 1, FALSE, FALSE }, 146 { "float128_to_int64", 1, FALSE, TRUE }, 147 { "float128_to_int64_round_to_zero", 1, FALSE, FALSE }, 148 { "float128_to_float32", 1, FALSE, TRUE }, 149 { "float128_to_float64", 1, FALSE, TRUE }, 150 { "float128_to_floatx80", 1, FALSE, TRUE }, 151 { "float128_round_to_int", 1, FALSE, TRUE }, 152 { "float128_add", 2, FALSE, TRUE }, 153 { "float128_sub", 2, FALSE, TRUE }, 154 { "float128_mul", 2, FALSE, TRUE }, 155 { "float128_div", 2, FALSE, TRUE }, 156 { "float128_rem", 2, FALSE, FALSE }, 157 { "float128_sqrt", 1, FALSE, TRUE }, 158 { "float128_eq", 2, FALSE, FALSE }, 159 { "float128_le", 2, FALSE, FALSE }, 160 { "float128_lt", 2, FALSE, FALSE }, 161 { "float128_eq_signaling", 2, FALSE, FALSE }, 162 { "float128_le_quiet", 2, FALSE, FALSE }, 163 { "float128_lt_quiet", 2, FALSE, FALSE }, 164 }; 165 166 const flag functionExists[ NUM_FUNCTIONS ] = { 167 0, 168 #ifdef SYST_INT32_TO_FLOAT32 169 1, 170 #else 171 0, 172 #endif 173 #ifdef SYST_INT32_TO_FLOAT64 174 1, 175 #else 176 0, 177 #endif 178 #ifdef SYST_INT32_TO_FLOATX80 179 1, 180 #else 181 0, 182 #endif 183 #ifdef SYST_INT32_TO_FLOAT128 184 1, 185 #else 186 0, 187 #endif 188 #ifdef SYST_INT64_TO_FLOAT32 189 1, 190 #else 191 0, 192 #endif 193 #ifdef SYST_INT64_TO_FLOAT64 194 1, 195 #else 196 0, 197 #endif 198 #ifdef SYST_INT64_TO_FLOATX80 199 1, 200 #else 201 0, 202 #endif 203 #ifdef SYST_INT64_TO_FLOAT128 204 1, 205 #else 206 0, 207 #endif 208 #ifdef SYST_FLOAT32_TO_INT32 209 1, 210 #else 211 0, 212 #endif 213 #ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO 214 1, 215 #else 216 0, 217 #endif 218 #ifdef SYST_FLOAT32_TO_INT64 219 1, 220 #else 221 0, 222 #endif 223 #ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO 224 1, 225 #else 226 0, 227 #endif 228 #ifdef SYST_FLOAT32_TO_FLOAT64 229 1, 230 #else 231 0, 232 #endif 233 #ifdef SYST_FLOAT32_TO_FLOATX80 234 1, 235 #else 236 0, 237 #endif 238 #ifdef SYST_FLOAT32_TO_FLOAT128 239 1, 240 #else 241 0, 242 #endif 243 #ifdef SYST_FLOAT32_ROUND_TO_INT 244 1, 245 #else 246 0, 247 #endif 248 #ifdef SYST_FLOAT32_ADD 249 1, 250 #else 251 0, 252 #endif 253 #ifdef SYST_FLOAT32_SUB 254 1, 255 #else 256 0, 257 #endif 258 #ifdef SYST_FLOAT32_MUL 259 1, 260 #else 261 0, 262 #endif 263 #ifdef SYST_FLOAT32_DIV 264 1, 265 #else 266 0, 267 #endif 268 #ifdef SYST_FLOAT32_REM 269 1, 270 #else 271 0, 272 #endif 273 #ifdef SYST_FLOAT32_SQRT 274 1, 275 #else 276 0, 277 #endif 278 #ifdef SYST_FLOAT32_EQ 279 1, 280 #else 281 0, 282 #endif 283 #ifdef SYST_FLOAT32_LE 284 1, 285 #else 286 0, 287 #endif 288 #ifdef SYST_FLOAT32_LT 289 1, 290 #else 291 0, 292 #endif 293 #ifdef SYST_FLOAT32_EQ_SIGNALING 294 1, 295 #else 296 0, 297 #endif 298 #ifdef SYST_FLOAT32_LE_QUIET 299 1, 300 #else 301 0, 302 #endif 303 #ifdef SYST_FLOAT32_LT_QUIET 304 1, 305 #else 306 0, 307 #endif 308 #ifdef SYST_FLOAT64_TO_INT32 309 1, 310 #else 311 0, 312 #endif 313 #ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO 314 1, 315 #else 316 0, 317 #endif 318 #ifdef SYST_FLOAT64_TO_INT64 319 1, 320 #else 321 0, 322 #endif 323 #ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO 324 1, 325 #else 326 0, 327 #endif 328 #ifdef SYST_FLOAT64_TO_FLOAT32 329 1, 330 #else 331 0, 332 #endif 333 #ifdef SYST_FLOAT64_TO_FLOATX80 334 1, 335 #else 336 0, 337 #endif 338 #ifdef SYST_FLOAT64_TO_FLOAT128 339 1, 340 #else 341 0, 342 #endif 343 #ifdef SYST_FLOAT64_ROUND_TO_INT 344 1, 345 #else 346 0, 347 #endif 348 #ifdef SYST_FLOAT64_ADD 349 1, 350 #else 351 0, 352 #endif 353 #ifdef SYST_FLOAT64_SUB 354 1, 355 #else 356 0, 357 #endif 358 #ifdef SYST_FLOAT64_MUL 359 1, 360 #else 361 0, 362 #endif 363 #ifdef SYST_FLOAT64_DIV 364 1, 365 #else 366 0, 367 #endif 368 #ifdef SYST_FLOAT64_REM 369 1, 370 #else 371 0, 372 #endif 373 #ifdef SYST_FLOAT64_SQRT 374 1, 375 #else 376 0, 377 #endif 378 #ifdef SYST_FLOAT64_EQ 379 1, 380 #else 381 0, 382 #endif 383 #ifdef SYST_FLOAT64_LE 384 1, 385 #else 386 0, 387 #endif 388 #ifdef SYST_FLOAT64_LT 389 1, 390 #else 391 0, 392 #endif 393 #ifdef SYST_FLOAT64_EQ_SIGNALING 394 1, 395 #else 396 0, 397 #endif 398 #ifdef SYST_FLOAT64_LE_QUIET 399 1, 400 #else 401 0, 402 #endif 403 #ifdef SYST_FLOAT64_LT_QUIET 404 1, 405 #else 406 0, 407 #endif 408 #ifdef SYST_FLOATX80_TO_INT32 409 1, 410 #else 411 0, 412 #endif 413 #ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO 414 1, 415 #else 416 0, 417 #endif 418 #ifdef SYST_FLOATX80_TO_INT64 419 1, 420 #else 421 0, 422 #endif 423 #ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO 424 1, 425 #else 426 0, 427 #endif 428 #ifdef SYST_FLOATX80_TO_FLOAT32 429 1, 430 #else 431 0, 432 #endif 433 #ifdef SYST_FLOATX80_TO_FLOAT64 434 1, 435 #else 436 0, 437 #endif 438 #ifdef SYST_FLOATX80_TO_FLOAT128 439 1, 440 #else 441 0, 442 #endif 443 #ifdef SYST_FLOATX80_ROUND_TO_INT 444 1, 445 #else 446 0, 447 #endif 448 #ifdef SYST_FLOATX80_ADD 449 1, 450 #else 451 0, 452 #endif 453 #ifdef SYST_FLOATX80_SUB 454 1, 455 #else 456 0, 457 #endif 458 #ifdef SYST_FLOATX80_MUL 459 1, 460 #else 461 0, 462 #endif 463 #ifdef SYST_FLOATX80_DIV 464 1, 465 #else 466 0, 467 #endif 468 #ifdef SYST_FLOATX80_REM 469 1, 470 #else 471 0, 472 #endif 473 #ifdef SYST_FLOATX80_SQRT 474 1, 475 #else 476 0, 477 #endif 478 #ifdef SYST_FLOATX80_EQ 479 1, 480 #else 481 0, 482 #endif 483 #ifdef SYST_FLOATX80_LE 484 1, 485 #else 486 0, 487 #endif 488 #ifdef SYST_FLOATX80_LT 489 1, 490 #else 491 0, 492 #endif 493 #ifdef SYST_FLOATX80_EQ_SIGNALING 494 1, 495 #else 496 0, 497 #endif 498 #ifdef SYST_FLOATX80_LE_QUIET 499 1, 500 #else 501 0, 502 #endif 503 #ifdef SYST_FLOATX80_LT_QUIET 504 1, 505 #else 506 0, 507 #endif 508 #ifdef SYST_FLOAT128_TO_INT32 509 1, 510 #else 511 0, 512 #endif 513 #ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO 514 1, 515 #else 516 0, 517 #endif 518 #ifdef SYST_FLOAT128_TO_INT64 519 1, 520 #else 521 0, 522 #endif 523 #ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO 524 1, 525 #else 526 0, 527 #endif 528 #ifdef SYST_FLOAT128_TO_FLOAT32 529 1, 530 #else 531 0, 532 #endif 533 #ifdef SYST_FLOAT128_TO_FLOAT64 534 1, 535 #else 536 0, 537 #endif 538 #ifdef SYST_FLOAT128_TO_FLOATX80 539 1, 540 #else 541 0, 542 #endif 543 #ifdef SYST_FLOAT128_ROUND_TO_INT 544 1, 545 #else 546 0, 547 #endif 548 #ifdef SYST_FLOAT128_ADD 549 1, 550 #else 551 0, 552 #endif 553 #ifdef SYST_FLOAT128_SUB 554 1, 555 #else 556 0, 557 #endif 558 #ifdef SYST_FLOAT128_MUL 559 1, 560 #else 561 0, 562 #endif 563 #ifdef SYST_FLOAT128_DIV 564 1, 565 #else 566 0, 567 #endif 568 #ifdef SYST_FLOAT128_REM 569 1, 570 #else 571 0, 572 #endif 573 #ifdef SYST_FLOAT128_SQRT 574 1, 575 #else 576 0, 577 #endif 578 #ifdef SYST_FLOAT128_EQ 579 1, 580 #else 581 0, 582 #endif 583 #ifdef SYST_FLOAT128_LE 584 1, 585 #else 586 0, 587 #endif 588 #ifdef SYST_FLOAT128_LT 589 1, 590 #else 591 0, 592 #endif 593 #ifdef SYST_FLOAT128_EQ_SIGNALING 594 1, 595 #else 596 0, 597 #endif 598 #ifdef SYST_FLOAT128_LE_QUIET 599 1, 600 #else 601 0, 602 #endif 603 #ifdef SYST_FLOAT128_LT_QUIET 604 1, 605 #else 606 0, 607 #endif 608 }; 609 610 static void 611 testFunctionVariety( 612 uint8 functionCode, int8 roundingPrecision, int8 roundingMode ) 613 { 614 uint8 roundingCode; 615 616 functionName = functions[ functionCode ].name; 617 #ifdef FLOATX80 618 if ( roundingPrecision == 32 ) { 619 roundingPrecisionName = "32"; 620 } 621 else if ( roundingPrecision == 64 ) { 622 roundingPrecisionName = "64"; 623 } 624 else if ( roundingPrecision == 80 ) { 625 roundingPrecisionName = "80"; 626 } 627 else { 628 roundingPrecision = 80; 629 roundingPrecisionName = 0; 630 } 631 floatx80_rounding_precision = roundingPrecision; 632 syst_float_set_rounding_precision( roundingPrecision ); 633 #endif 634 switch ( roundingMode ) { 635 case 0: 636 roundingModeName = 0; 637 roundingCode = float_round_nearest_even; 638 break; 639 case ROUND_NEAREST_EVEN: 640 roundingModeName = "nearest_even"; 641 roundingCode = float_round_nearest_even; 642 break; 643 case ROUND_TO_ZERO: 644 roundingModeName = "to_zero"; 645 roundingCode = float_round_to_zero; 646 break; 647 case ROUND_DOWN: 648 roundingModeName = "down"; 649 roundingCode = float_round_down; 650 break; 651 case ROUND_UP: 652 roundingModeName = "up"; 653 roundingCode = float_round_up; 654 break; 655 } 656 float_rounding_mode = roundingCode; 657 syst_float_set_rounding_mode( roundingCode ); 658 fputs( "Testing ", stderr ); 659 writeFunctionName( stderr ); 660 fputs( ".\n", stderr ); 661 switch ( functionCode ) { 662 #ifdef SYST_INT32_TO_FLOAT32 663 case INT32_TO_FLOAT32: 664 test_a_int32_z_float32( int32_to_float32, syst_int32_to_float32 ); 665 break; 666 #endif 667 #ifdef SYST_INT32_TO_FLOAT64 668 case INT32_TO_FLOAT64: 669 test_a_int32_z_float64( int32_to_float64, syst_int32_to_float64 ); 670 break; 671 #endif 672 #ifdef SYST_INT32_TO_FLOATX80 673 case INT32_TO_FLOATX80: 674 test_a_int32_z_floatx80( int32_to_floatx80, syst_int32_to_floatx80 ); 675 break; 676 #endif 677 #ifdef SYST_INT32_TO_FLOAT128 678 case INT32_TO_FLOAT128: 679 test_a_int32_z_float128( int32_to_float128, syst_int32_to_float128 ); 680 break; 681 #endif 682 #ifdef SYST_INT64_TO_FLOAT32 683 case INT64_TO_FLOAT32: 684 test_a_int64_z_float32( int64_to_float32, syst_int64_to_float32 ); 685 break; 686 #endif 687 #ifdef SYST_INT64_TO_FLOAT64 688 case INT64_TO_FLOAT64: 689 test_a_int64_z_float64( int64_to_float64, syst_int64_to_float64 ); 690 break; 691 #endif 692 #ifdef SYST_INT64_TO_FLOATX80 693 case INT64_TO_FLOATX80: 694 test_a_int64_z_floatx80( int64_to_floatx80, syst_int64_to_floatx80 ); 695 break; 696 #endif 697 #ifdef SYST_INT64_TO_FLOAT128 698 case INT64_TO_FLOAT128: 699 test_a_int64_z_float128( int64_to_float128, syst_int64_to_float128 ); 700 break; 701 #endif 702 #ifdef SYST_FLOAT32_TO_INT32 703 case FLOAT32_TO_INT32: 704 test_a_float32_z_int32( float32_to_int32, syst_float32_to_int32 ); 705 break; 706 #endif 707 #ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO 708 case FLOAT32_TO_INT32_ROUND_TO_ZERO: 709 test_a_float32_z_int32( 710 float32_to_int32_round_to_zero, 711 syst_float32_to_int32_round_to_zero 712 ); 713 break; 714 #endif 715 #ifdef SYST_FLOAT32_TO_INT64 716 case FLOAT32_TO_INT64: 717 test_a_float32_z_int64( float32_to_int64, syst_float32_to_int64 ); 718 break; 719 #endif 720 #ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO 721 case FLOAT32_TO_INT64_ROUND_TO_ZERO: 722 test_a_float32_z_int64( 723 float32_to_int64_round_to_zero, 724 syst_float32_to_int64_round_to_zero 725 ); 726 break; 727 #endif 728 #ifdef SYST_FLOAT32_TO_FLOAT64 729 case FLOAT32_TO_FLOAT64: 730 test_a_float32_z_float64( 731 float32_to_float64, syst_float32_to_float64 ); 732 break; 733 #endif 734 #ifdef SYST_FLOAT32_TO_FLOATX80 735 case FLOAT32_TO_FLOATX80: 736 test_a_float32_z_floatx80( 737 float32_to_floatx80, syst_float32_to_floatx80 ); 738 break; 739 #endif 740 #ifdef SYST_FLOAT32_TO_FLOAT128 741 case FLOAT32_TO_FLOAT128: 742 test_a_float32_z_float128( 743 float32_to_float128, syst_float32_to_float128 ); 744 break; 745 #endif 746 #ifdef SYST_FLOAT32_ROUND_TO_INT 747 case FLOAT32_ROUND_TO_INT: 748 test_az_float32( float32_round_to_int, syst_float32_round_to_int ); 749 break; 750 #endif 751 #ifdef SYST_FLOAT32_ADD 752 case FLOAT32_ADD: 753 test_abz_float32( float32_add, syst_float32_add ); 754 break; 755 #endif 756 #ifdef SYST_FLOAT32_SUB 757 case FLOAT32_SUB: 758 test_abz_float32( float32_sub, syst_float32_sub ); 759 break; 760 #endif 761 #ifdef SYST_FLOAT32_MUL 762 case FLOAT32_MUL: 763 test_abz_float32( float32_mul, syst_float32_mul ); 764 break; 765 #endif 766 #ifdef SYST_FLOAT32_DIV 767 case FLOAT32_DIV: 768 test_abz_float32( float32_div, syst_float32_div ); 769 break; 770 #endif 771 #ifdef SYST_FLOAT32_REM 772 case FLOAT32_REM: 773 test_abz_float32( float32_rem, syst_float32_rem ); 774 break; 775 #endif 776 #ifdef SYST_FLOAT32_SQRT 777 case FLOAT32_SQRT: 778 test_az_float32( float32_sqrt, syst_float32_sqrt ); 779 break; 780 #endif 781 #ifdef SYST_FLOAT32_EQ 782 case FLOAT32_EQ: 783 test_ab_float32_z_flag( float32_eq, syst_float32_eq ); 784 break; 785 #endif 786 #ifdef SYST_FLOAT32_LE 787 case FLOAT32_LE: 788 test_ab_float32_z_flag( float32_le, syst_float32_le ); 789 break; 790 #endif 791 #ifdef SYST_FLOAT32_LT 792 case FLOAT32_LT: 793 test_ab_float32_z_flag( float32_lt, syst_float32_lt ); 794 break; 795 #endif 796 #ifdef SYST_FLOAT32_EQ_SIGNALING 797 case FLOAT32_EQ_SIGNALING: 798 test_ab_float32_z_flag( 799 float32_eq_signaling, syst_float32_eq_signaling ); 800 break; 801 #endif 802 #ifdef SYST_FLOAT32_LE_QUIET 803 case FLOAT32_LE_QUIET: 804 test_ab_float32_z_flag( float32_le_quiet, syst_float32_le_quiet ); 805 break; 806 #endif 807 #ifdef SYST_FLOAT32_LT_QUIET 808 case FLOAT32_LT_QUIET: 809 test_ab_float32_z_flag( float32_lt_quiet, syst_float32_lt_quiet ); 810 break; 811 #endif 812 #ifdef SYST_FLOAT64_TO_INT32 813 case FLOAT64_TO_INT32: 814 test_a_float64_z_int32( float64_to_int32, syst_float64_to_int32 ); 815 break; 816 #endif 817 #ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO 818 case FLOAT64_TO_INT32_ROUND_TO_ZERO: 819 test_a_float64_z_int32( 820 float64_to_int32_round_to_zero, 821 syst_float64_to_int32_round_to_zero 822 ); 823 break; 824 #endif 825 #ifdef SYST_FLOAT64_TO_INT64 826 case FLOAT64_TO_INT64: 827 test_a_float64_z_int64( float64_to_int64, syst_float64_to_int64 ); 828 break; 829 #endif 830 #ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO 831 case FLOAT64_TO_INT64_ROUND_TO_ZERO: 832 test_a_float64_z_int64( 833 float64_to_int64_round_to_zero, 834 syst_float64_to_int64_round_to_zero 835 ); 836 break; 837 #endif 838 #ifdef SYST_FLOAT64_TO_FLOAT32 839 case FLOAT64_TO_FLOAT32: 840 test_a_float64_z_float32( 841 float64_to_float32, syst_float64_to_float32 ); 842 break; 843 #endif 844 #ifdef SYST_FLOAT64_TO_FLOATX80 845 case FLOAT64_TO_FLOATX80: 846 test_a_float64_z_floatx80( 847 float64_to_floatx80, syst_float64_to_floatx80 ); 848 break; 849 #endif 850 #ifdef SYST_FLOAT64_TO_FLOAT128 851 case FLOAT64_TO_FLOAT128: 852 test_a_float64_z_float128( 853 float64_to_float128, syst_float64_to_float128 ); 854 break; 855 #endif 856 #ifdef SYST_FLOAT64_ROUND_TO_INT 857 case FLOAT64_ROUND_TO_INT: 858 test_az_float64( float64_round_to_int, syst_float64_round_to_int ); 859 break; 860 #endif 861 #ifdef SYST_FLOAT64_ADD 862 case FLOAT64_ADD: 863 test_abz_float64( float64_add, syst_float64_add ); 864 break; 865 #endif 866 #ifdef SYST_FLOAT64_SUB 867 case FLOAT64_SUB: 868 test_abz_float64( float64_sub, syst_float64_sub ); 869 break; 870 #endif 871 #ifdef SYST_FLOAT64_MUL 872 case FLOAT64_MUL: 873 test_abz_float64( float64_mul, syst_float64_mul ); 874 break; 875 #endif 876 #ifdef SYST_FLOAT64_DIV 877 case FLOAT64_DIV: 878 test_abz_float64( float64_div, syst_float64_div ); 879 break; 880 #endif 881 #ifdef SYST_FLOAT64_REM 882 case FLOAT64_REM: 883 test_abz_float64( float64_rem, syst_float64_rem ); 884 break; 885 #endif 886 #ifdef SYST_FLOAT64_SQRT 887 case FLOAT64_SQRT: 888 test_az_float64( float64_sqrt, syst_float64_sqrt ); 889 break; 890 #endif 891 #ifdef SYST_FLOAT64_EQ 892 case FLOAT64_EQ: 893 test_ab_float64_z_flag( float64_eq, syst_float64_eq ); 894 break; 895 #endif 896 #ifdef SYST_FLOAT64_LE 897 case FLOAT64_LE: 898 test_ab_float64_z_flag( float64_le, syst_float64_le ); 899 break; 900 #endif 901 #ifdef SYST_FLOAT64_LT 902 case FLOAT64_LT: 903 test_ab_float64_z_flag( float64_lt, syst_float64_lt ); 904 break; 905 #endif 906 #ifdef SYST_FLOAT64_EQ_SIGNALING 907 case FLOAT64_EQ_SIGNALING: 908 test_ab_float64_z_flag( 909 float64_eq_signaling, syst_float64_eq_signaling ); 910 break; 911 #endif 912 #ifdef SYST_FLOAT64_LE_QUIET 913 case FLOAT64_LE_QUIET: 914 test_ab_float64_z_flag( float64_le_quiet, syst_float64_le_quiet ); 915 break; 916 #endif 917 #ifdef SYST_FLOAT64_LT_QUIET 918 case FLOAT64_LT_QUIET: 919 test_ab_float64_z_flag( float64_lt_quiet, syst_float64_lt_quiet ); 920 break; 921 #endif 922 #ifdef SYST_FLOATX80_TO_INT32 923 case FLOATX80_TO_INT32: 924 test_a_floatx80_z_int32( floatx80_to_int32, syst_floatx80_to_int32 ); 925 break; 926 #endif 927 #ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO 928 case FLOATX80_TO_INT32_ROUND_TO_ZERO: 929 test_a_floatx80_z_int32( 930 floatx80_to_int32_round_to_zero, 931 syst_floatx80_to_int32_round_to_zero 932 ); 933 break; 934 #endif 935 #ifdef SYST_FLOATX80_TO_INT64 936 case FLOATX80_TO_INT64: 937 test_a_floatx80_z_int64( floatx80_to_int64, syst_floatx80_to_int64 ); 938 break; 939 #endif 940 #ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO 941 case FLOATX80_TO_INT64_ROUND_TO_ZERO: 942 test_a_floatx80_z_int64( 943 floatx80_to_int64_round_to_zero, 944 syst_floatx80_to_int64_round_to_zero 945 ); 946 break; 947 #endif 948 #ifdef SYST_FLOATX80_TO_FLOAT32 949 case FLOATX80_TO_FLOAT32: 950 test_a_floatx80_z_float32( 951 floatx80_to_float32, syst_floatx80_to_float32 ); 952 break; 953 #endif 954 #ifdef SYST_FLOATX80_TO_FLOAT64 955 case FLOATX80_TO_FLOAT64: 956 test_a_floatx80_z_float64( 957 floatx80_to_float64, syst_floatx80_to_float64 ); 958 break; 959 #endif 960 #ifdef SYST_FLOATX80_TO_FLOAT128 961 case FLOATX80_TO_FLOAT128: 962 test_a_floatx80_z_float128( 963 floatx80_to_float128, syst_floatx80_to_float128 ); 964 break; 965 #endif 966 #ifdef SYST_FLOATX80_ROUND_TO_INT 967 case FLOATX80_ROUND_TO_INT: 968 test_az_floatx80( floatx80_round_to_int, syst_floatx80_round_to_int ); 969 break; 970 #endif 971 #ifdef SYST_FLOATX80_ADD 972 case FLOATX80_ADD: 973 test_abz_floatx80( floatx80_add, syst_floatx80_add ); 974 break; 975 #endif 976 #ifdef SYST_FLOATX80_SUB 977 case FLOATX80_SUB: 978 test_abz_floatx80( floatx80_sub, syst_floatx80_sub ); 979 break; 980 #endif 981 #ifdef SYST_FLOATX80_MUL 982 case FLOATX80_MUL: 983 test_abz_floatx80( floatx80_mul, syst_floatx80_mul ); 984 break; 985 #endif 986 #ifdef SYST_FLOATX80_DIV 987 case FLOATX80_DIV: 988 test_abz_floatx80( floatx80_div, syst_floatx80_div ); 989 break; 990 #endif 991 #ifdef SYST_FLOATX80_REM 992 case FLOATX80_REM: 993 test_abz_floatx80( floatx80_rem, syst_floatx80_rem ); 994 break; 995 #endif 996 #ifdef SYST_FLOATX80_SQRT 997 case FLOATX80_SQRT: 998 test_az_floatx80( floatx80_sqrt, syst_floatx80_sqrt ); 999 break; 1000 #endif 1001 #ifdef SYST_FLOATX80_EQ 1002 case FLOATX80_EQ: 1003 test_ab_floatx80_z_flag( floatx80_eq, syst_floatx80_eq ); 1004 break; 1005 #endif 1006 #ifdef SYST_FLOATX80_LE 1007 case FLOATX80_LE: 1008 test_ab_floatx80_z_flag( floatx80_le, syst_floatx80_le ); 1009 break; 1010 #endif 1011 #ifdef SYST_FLOATX80_LT 1012 case FLOATX80_LT: 1013 test_ab_floatx80_z_flag( floatx80_lt, syst_floatx80_lt ); 1014 break; 1015 #endif 1016 #ifdef SYST_FLOATX80_EQ_SIGNALING 1017 case FLOATX80_EQ_SIGNALING: 1018 test_ab_floatx80_z_flag( 1019 floatx80_eq_signaling, syst_floatx80_eq_signaling ); 1020 break; 1021 #endif 1022 #ifdef SYST_FLOATX80_LE_QUIET 1023 case FLOATX80_LE_QUIET: 1024 test_ab_floatx80_z_flag( floatx80_le_quiet, syst_floatx80_le_quiet ); 1025 break; 1026 #endif 1027 #ifdef SYST_FLOATX80_LT_QUIET 1028 case FLOATX80_LT_QUIET: 1029 test_ab_floatx80_z_flag( floatx80_lt_quiet, syst_floatx80_lt_quiet ); 1030 break; 1031 #endif 1032 #ifdef SYST_FLOAT128_TO_INT32 1033 case FLOAT128_TO_INT32: 1034 test_a_float128_z_int32( float128_to_int32, syst_float128_to_int32 ); 1035 break; 1036 #endif 1037 #ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO 1038 case FLOAT128_TO_INT32_ROUND_TO_ZERO: 1039 test_a_float128_z_int32( 1040 float128_to_int32_round_to_zero, 1041 syst_float128_to_int32_round_to_zero 1042 ); 1043 break; 1044 #endif 1045 #ifdef SYST_FLOAT128_TO_INT64 1046 case FLOAT128_TO_INT64: 1047 test_a_float128_z_int64( float128_to_int64, syst_float128_to_int64 ); 1048 break; 1049 #endif 1050 #ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO 1051 case FLOAT128_TO_INT64_ROUND_TO_ZERO: 1052 test_a_float128_z_int64( 1053 float128_to_int64_round_to_zero, 1054 syst_float128_to_int64_round_to_zero 1055 ); 1056 break; 1057 #endif 1058 #ifdef SYST_FLOAT128_TO_FLOAT32 1059 case FLOAT128_TO_FLOAT32: 1060 test_a_float128_z_float32( 1061 float128_to_float32, syst_float128_to_float32 ); 1062 break; 1063 #endif 1064 #ifdef SYST_FLOAT128_TO_FLOAT64 1065 case FLOAT128_TO_FLOAT64: 1066 test_a_float128_z_float64( 1067 float128_to_float64, syst_float128_to_float64 ); 1068 break; 1069 #endif 1070 #ifdef SYST_FLOAT128_TO_FLOATX80 1071 case FLOAT128_TO_FLOATX80: 1072 test_a_float128_z_floatx80( 1073 float128_to_floatx80, syst_float128_to_floatx80 ); 1074 break; 1075 #endif 1076 #ifdef SYST_FLOAT128_ROUND_TO_INT 1077 case FLOAT128_ROUND_TO_INT: 1078 test_az_float128( float128_round_to_int, syst_float128_round_to_int ); 1079 break; 1080 #endif 1081 #ifdef SYST_FLOAT128_ADD 1082 case FLOAT128_ADD: 1083 test_abz_float128( float128_add, syst_float128_add ); 1084 break; 1085 #endif 1086 #ifdef SYST_FLOAT128_SUB 1087 case FLOAT128_SUB: 1088 test_abz_float128( float128_sub, syst_float128_sub ); 1089 break; 1090 #endif 1091 #ifdef SYST_FLOAT128_MUL 1092 case FLOAT128_MUL: 1093 test_abz_float128( float128_mul, syst_float128_mul ); 1094 break; 1095 #endif 1096 #ifdef SYST_FLOAT128_DIV 1097 case FLOAT128_DIV: 1098 test_abz_float128( float128_div, syst_float128_div ); 1099 break; 1100 #endif 1101 #ifdef SYST_FLOAT128_REM 1102 case FLOAT128_REM: 1103 test_abz_float128( float128_rem, syst_float128_rem ); 1104 break; 1105 #endif 1106 #ifdef SYST_FLOAT128_SQRT 1107 case FLOAT128_SQRT: 1108 test_az_float128( float128_sqrt, syst_float128_sqrt ); 1109 break; 1110 #endif 1111 #ifdef SYST_FLOAT128_EQ 1112 case FLOAT128_EQ: 1113 test_ab_float128_z_flag( float128_eq, syst_float128_eq ); 1114 break; 1115 #endif 1116 #ifdef SYST_FLOAT128_LE 1117 case FLOAT128_LE: 1118 test_ab_float128_z_flag( float128_le, syst_float128_le ); 1119 break; 1120 #endif 1121 #ifdef SYST_FLOAT128_LT 1122 case FLOAT128_LT: 1123 test_ab_float128_z_flag( float128_lt, syst_float128_lt ); 1124 break; 1125 #endif 1126 #ifdef SYST_FLOAT128_EQ_SIGNALING 1127 case FLOAT128_EQ_SIGNALING: 1128 test_ab_float128_z_flag( 1129 float128_eq_signaling, syst_float128_eq_signaling ); 1130 break; 1131 #endif 1132 #ifdef SYST_FLOAT128_LE_QUIET 1133 case FLOAT128_LE_QUIET: 1134 test_ab_float128_z_flag( float128_le_quiet, syst_float128_le_quiet ); 1135 break; 1136 #endif 1137 #ifdef SYST_FLOAT128_LT_QUIET 1138 case FLOAT128_LT_QUIET: 1139 test_ab_float128_z_flag( float128_lt_quiet, syst_float128_lt_quiet ); 1140 break; 1141 #endif 1142 } 1143 if ( ( errorStop && anyErrors ) || stop ) exitWithStatus(); 1144 1145 } 1146 1147 void 1148 testFunction( 1149 uint8 functionCode, int8 roundingPrecisionIn, int8 roundingModeIn ) 1150 { 1151 int8 roundingPrecision, roundingMode; 1152 1153 roundingPrecision = 32; 1154 for (;;) { 1155 if ( ! functions[ functionCode ].roundingPrecision ) { 1156 roundingPrecision = 0; 1157 } 1158 else if ( roundingPrecisionIn ) { 1159 roundingPrecision = roundingPrecisionIn; 1160 } 1161 for ( roundingMode = 1; 1162 roundingMode < NUM_ROUNDINGMODES; 1163 ++roundingMode 1164 ) { 1165 if ( ! functions[ functionCode ].roundingMode ) { 1166 roundingMode = 0; 1167 } 1168 else if ( roundingModeIn ) { 1169 roundingMode = roundingModeIn; 1170 } 1171 testFunctionVariety( 1172 functionCode, roundingPrecision, roundingMode ); 1173 if ( roundingModeIn || ! roundingMode ) break; 1174 } 1175 if ( roundingPrecisionIn || ! roundingPrecision ) break; 1176 if ( roundingPrecision == 80 ) { 1177 break; 1178 } 1179 else if ( roundingPrecision == 64 ) { 1180 roundingPrecision = 80; 1181 } 1182 else if ( roundingPrecision == 32 ) { 1183 roundingPrecision = 64; 1184 } 1185 } 1186 1187 } 1188 1189