testFunction.c revision 206917
1178825Sdfr 2233294Sstas/* 3233294Sstas=============================================================================== 4233294Sstas 5178825SdfrThis C source file is part of TestFloat, Release 2a, a package of programs 6233294Sstasfor testing the correctness of floating-point arithmetic complying to the 7233294SstasIEC/IEEE Standard for Floating-Point. 8233294Sstas 9178825SdfrWritten by John R. Hauser. More information is available through the Web 10233294Sstaspage `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'. 11233294Sstas 12178825SdfrTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 13233294Sstashas been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 14233294SstasTIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 15233294SstasPERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 16178825SdfrAND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 17233294Sstas 18233294SstasDerivative works are acceptable, even for commercial purposes, so long as 19233294Sstas(1) they include prominent notice that the work is derivative, and (2) they 20178825Sdfrinclude prominent notice akin to these four paragraphs for those parts of 21233294Sstasthis code that are retained. 22233294Sstas 23233294Sstas=============================================================================== 24233294Sstas*/ 25233294Sstas 26233294Sstas#include "milieu.h" 27233294Sstas#include "softfloat.h" 28233294Sstas#include "testCases.h" 29233294Sstas#include "testLoops.h" 30233294Sstas#include "systmodes.h" 31233294Sstas#include "systflags.h" 32178825Sdfr#include "systfloat.h" 33178825Sdfr#include "testFunction.h" 34178825Sdfr 35178825Sdfrconst functionT functions[ NUM_FUNCTIONS ] = { 36178825Sdfr { 0, 0, 0, 0 }, 37178825Sdfr { "int32_to_float32", 1, FALSE, TRUE }, 38178825Sdfr { "int32_to_float64", 1, FALSE, FALSE }, 39178825Sdfr { "int32_to_floatx80", 1, FALSE, FALSE }, 40233294Sstas { "int32_to_float128", 1, FALSE, FALSE }, 41178825Sdfr { "int64_to_float32", 1, FALSE, TRUE }, 42178825Sdfr { "int64_to_float64", 1, FALSE, TRUE }, 43178825Sdfr { "int64_to_floatx80", 1, FALSE, FALSE }, 44178825Sdfr { "int64_to_float128", 1, FALSE, FALSE }, 45233294Sstas { "float32_to_int32", 1, FALSE, TRUE }, 46178825Sdfr { "float32_to_int32_round_to_zero", 1, FALSE, FALSE }, 47178825Sdfr { "float32_to_int64", 1, FALSE, TRUE }, 48178825Sdfr { "float32_to_int64_round_to_zero", 1, FALSE, FALSE }, 49178825Sdfr { "float32_to_float64", 1, FALSE, FALSE }, 50233294Sstas { "float32_to_floatx80", 1, FALSE, FALSE }, 51178825Sdfr { "float32_to_float128", 1, FALSE, FALSE }, 52178825Sdfr { "float32_round_to_int", 1, FALSE, TRUE }, 53178825Sdfr { "float32_add", 2, FALSE, TRUE }, 54233294Sstas { "float32_sub", 2, FALSE, TRUE }, 55233294Sstas { "float32_mul", 2, FALSE, TRUE }, 56233294Sstas { "float32_div", 2, FALSE, TRUE }, 57178825Sdfr { "float32_rem", 2, FALSE, FALSE }, 58178825Sdfr { "float32_sqrt", 1, FALSE, TRUE }, 59178825Sdfr { "float32_eq", 2, FALSE, FALSE }, 60178825Sdfr { "float32_le", 2, FALSE, FALSE }, 61178825Sdfr { "float32_lt", 2, FALSE, FALSE }, 62178825Sdfr { "float32_eq_signaling", 2, FALSE, FALSE }, 63178825Sdfr { "float32_le_quiet", 2, FALSE, FALSE }, 64178825Sdfr { "float32_lt_quiet", 2, FALSE, FALSE }, 65178825Sdfr { "float64_to_int32", 1, FALSE, TRUE }, 66233294Sstas { "float64_to_int32_round_to_zero", 1, FALSE, FALSE }, 67178825Sdfr { "float64_to_int64", 1, FALSE, TRUE }, 68178825Sdfr { "float64_to_int64_round_to_zero", 1, FALSE, FALSE }, 69178825Sdfr { "float64_to_float32", 1, FALSE, TRUE }, 70178825Sdfr { "float64_to_floatx80", 1, FALSE, FALSE }, 71178825Sdfr { "float64_to_float128", 1, FALSE, FALSE }, 72233294Sstas { "float64_round_to_int", 1, FALSE, TRUE }, 73178825Sdfr { "float64_add", 2, FALSE, TRUE }, 74178825Sdfr { "float64_sub", 2, FALSE, TRUE }, 75178825Sdfr { "float64_mul", 2, FALSE, TRUE }, 76178825Sdfr { "float64_div", 2, FALSE, TRUE }, 77178825Sdfr { "float64_rem", 2, FALSE, FALSE }, 78178825Sdfr { "float64_sqrt", 1, FALSE, TRUE }, 79178825Sdfr { "float64_eq", 2, FALSE, FALSE }, 80178825Sdfr { "float64_le", 2, FALSE, FALSE }, 81178825Sdfr { "float64_lt", 2, FALSE, FALSE }, 82178825Sdfr { "float64_eq_signaling", 2, FALSE, FALSE }, 83178825Sdfr { "float64_le_quiet", 2, FALSE, FALSE }, 84233294Sstas { "float64_lt_quiet", 2, FALSE, FALSE }, 85233294Sstas { "floatx80_to_int32", 1, FALSE, TRUE }, 86178825Sdfr { "floatx80_to_int32_round_to_zero", 1, FALSE, FALSE }, 87178825Sdfr { "floatx80_to_int64", 1, FALSE, TRUE }, 88178825Sdfr { "floatx80_to_int64_round_to_zero", 1, FALSE, FALSE }, 89178825Sdfr { "floatx80_to_float32", 1, FALSE, TRUE }, 90178825Sdfr { "floatx80_to_float64", 1, FALSE, TRUE }, 91178825Sdfr { "floatx80_to_float128", 1, FALSE, FALSE }, 92178825Sdfr { "floatx80_round_to_int", 1, FALSE, TRUE }, 93178825Sdfr { "floatx80_add", 2, TRUE, TRUE }, 94178825Sdfr { "floatx80_sub", 2, TRUE, TRUE }, 95178825Sdfr { "floatx80_mul", 2, TRUE, TRUE }, 96178825Sdfr { "floatx80_div", 2, TRUE, TRUE }, 97233294Sstas { "floatx80_rem", 2, FALSE, FALSE }, 98178825Sdfr { "floatx80_sqrt", 1, TRUE, TRUE }, 99178825Sdfr { "floatx80_eq", 2, FALSE, FALSE }, 100178825Sdfr { "floatx80_le", 2, FALSE, FALSE }, 101178825Sdfr { "floatx80_lt", 2, FALSE, FALSE }, 102178825Sdfr { "floatx80_eq_signaling", 2, FALSE, FALSE }, 103233294Sstas { "floatx80_le_quiet", 2, FALSE, FALSE }, 104178825Sdfr { "floatx80_lt_quiet", 2, FALSE, FALSE }, 105178825Sdfr { "float128_to_int32", 1, FALSE, TRUE }, 106178825Sdfr { "float128_to_int32_round_to_zero", 1, FALSE, FALSE }, 107178825Sdfr { "float128_to_int64", 1, FALSE, TRUE }, 108178825Sdfr { "float128_to_int64_round_to_zero", 1, FALSE, FALSE }, 109178825Sdfr { "float128_to_float32", 1, FALSE, TRUE }, 110178825Sdfr { "float128_to_float64", 1, FALSE, TRUE }, 111178825Sdfr { "float128_to_floatx80", 1, FALSE, TRUE }, 112178825Sdfr { "float128_round_to_int", 1, FALSE, TRUE }, 113178825Sdfr { "float128_add", 2, FALSE, TRUE }, 114178825Sdfr { "float128_sub", 2, FALSE, TRUE }, 115233294Sstas { "float128_mul", 2, FALSE, TRUE }, 116178825Sdfr { "float128_div", 2, FALSE, TRUE }, 117178825Sdfr { "float128_rem", 2, FALSE, FALSE }, 118178825Sdfr { "float128_sqrt", 1, FALSE, TRUE }, 119178825Sdfr { "float128_eq", 2, FALSE, FALSE }, 120178825Sdfr { "float128_le", 2, FALSE, FALSE }, 121178825Sdfr { "float128_lt", 2, FALSE, FALSE }, 122233294Sstas { "float128_eq_signaling", 2, FALSE, FALSE }, 123233294Sstas { "float128_le_quiet", 2, FALSE, FALSE }, 124178825Sdfr { "float128_lt_quiet", 2, FALSE, FALSE }, 125178825Sdfr}; 126178825Sdfr 127178825Sdfrconst flag functionExists[ NUM_FUNCTIONS ] = { 128178825Sdfr 0, 129178825Sdfr#ifdef SYST_INT32_TO_FLOAT32 130178825Sdfr 1, 131178825Sdfr#else 132178825Sdfr 0, 133178825Sdfr#endif 134178825Sdfr#ifdef SYST_INT32_TO_FLOAT64 135178825Sdfr 1, 136178825Sdfr#else 137178825Sdfr 0, 138233294Sstas#endif 139233294Sstas#ifdef SYST_INT32_TO_FLOATX80 140178825Sdfr 1, 141178825Sdfr#else 142178825Sdfr 0, 143178825Sdfr#endif 144178825Sdfr#ifdef SYST_INT32_TO_FLOAT128 145178825Sdfr 1, 146178825Sdfr#else 147178825Sdfr 0, 148178825Sdfr#endif 149178825Sdfr#ifdef SYST_INT64_TO_FLOAT32 150178825Sdfr 1, 151178825Sdfr#else 152178825Sdfr 0, 153178825Sdfr#endif 154178825Sdfr#ifdef SYST_INT64_TO_FLOAT64 155233294Sstas 1, 156233294Sstas#else 157178825Sdfr 0, 158178825Sdfr#endif 159178825Sdfr#ifdef SYST_INT64_TO_FLOATX80 160233294Sstas 1, 161178825Sdfr#else 162178825Sdfr 0, 163233294Sstas#endif 164178825Sdfr#ifdef SYST_INT64_TO_FLOAT128 165178825Sdfr 1, 166178825Sdfr#else 167178825Sdfr 0, 168178825Sdfr#endif 169178825Sdfr#ifdef SYST_FLOAT32_TO_INT32 170178825Sdfr 1, 171178825Sdfr#else 172178825Sdfr 0, 173233294Sstas#endif 174178825Sdfr#ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO 175178825Sdfr 1, 176178825Sdfr#else 177178825Sdfr 0, 178178825Sdfr#endif 179233294Sstas#ifdef SYST_FLOAT32_TO_INT64 180233294Sstas 1, 181178825Sdfr#else 182178825Sdfr 0, 183233294Sstas#endif 184178825Sdfr#ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO 185178825Sdfr 1, 186178825Sdfr#else 187178825Sdfr 0, 188178825Sdfr#endif 189233294Sstas#ifdef SYST_FLOAT32_TO_FLOAT64 190178825Sdfr 1, 191178825Sdfr#else 192178825Sdfr 0, 193178825Sdfr#endif 194178825Sdfr#ifdef SYST_FLOAT32_TO_FLOATX80 195178825Sdfr 1, 196178825Sdfr#else 197178825Sdfr 0, 198178825Sdfr#endif 199178825Sdfr#ifdef SYST_FLOAT32_TO_FLOAT128 200178825Sdfr 1, 201178825Sdfr#else 202178825Sdfr 0, 203178825Sdfr#endif 204178825Sdfr#ifdef SYST_FLOAT32_ROUND_TO_INT 205178825Sdfr 1, 206178825Sdfr#else 207178825Sdfr 0, 208178825Sdfr#endif 209178825Sdfr#ifdef SYST_FLOAT32_ADD 210178825Sdfr 1, 211178825Sdfr#else 212178825Sdfr 0, 213178825Sdfr#endif 214178825Sdfr#ifdef SYST_FLOAT32_SUB 215178825Sdfr 1, 216178825Sdfr#else 217178825Sdfr 0, 218178825Sdfr#endif 219178825Sdfr#ifdef SYST_FLOAT32_MUL 220178825Sdfr 1, 221178825Sdfr#else 222178825Sdfr 0, 223178825Sdfr#endif 224178825Sdfr#ifdef SYST_FLOAT32_DIV 225178825Sdfr 1, 226178825Sdfr#else 227178825Sdfr 0, 228178825Sdfr#endif 229178825Sdfr#ifdef SYST_FLOAT32_REM 230178825Sdfr 1, 231178825Sdfr#else 232178825Sdfr 0, 233178825Sdfr#endif 234178825Sdfr#ifdef SYST_FLOAT32_SQRT 235178825Sdfr 1, 236233294Sstas#else 237233294Sstas 0, 238233294Sstas#endif 239233294Sstas#ifdef SYST_FLOAT32_EQ 240233294Sstas 1, 241233294Sstas#else 242233294Sstas 0, 243233294Sstas#endif 244233294Sstas#ifdef SYST_FLOAT32_LE 245233294Sstas 1, 246233294Sstas#else 247233294Sstas 0, 248233294Sstas#endif 249233294Sstas#ifdef SYST_FLOAT32_LT 250178825Sdfr 1, 251178825Sdfr#else 252178825Sdfr 0, 253178825Sdfr#endif 254178825Sdfr#ifdef SYST_FLOAT32_EQ_SIGNALING 255178825Sdfr 1, 256178825Sdfr#else 257178825Sdfr 0, 258178825Sdfr#endif 259178825Sdfr#ifdef SYST_FLOAT32_LE_QUIET 260178825Sdfr 1, 261178825Sdfr#else 262178825Sdfr 0, 263178825Sdfr#endif 264233294Sstas#ifdef SYST_FLOAT32_LT_QUIET 265178825Sdfr 1, 266178825Sdfr#else 267178825Sdfr 0, 268178825Sdfr#endif 269178825Sdfr#ifdef SYST_FLOAT64_TO_INT32 270178825Sdfr 1, 271178825Sdfr#else 272178825Sdfr 0, 273178825Sdfr#endif 274178825Sdfr#ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO 275178825Sdfr 1, 276178825Sdfr#else 277178825Sdfr 0, 278178825Sdfr#endif 279178825Sdfr#ifdef SYST_FLOAT64_TO_INT64 280233294Sstas 1, 281178825Sdfr#else 282178825Sdfr 0, 283178825Sdfr#endif 284178825Sdfr#ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO 285178825Sdfr 1, 286178825Sdfr#else 287178825Sdfr 0, 288178825Sdfr#endif 289233294Sstas#ifdef SYST_FLOAT64_TO_FLOAT32 290178825Sdfr 1, 291178825Sdfr#else 292178825Sdfr 0, 293178825Sdfr#endif 294178825Sdfr#ifdef SYST_FLOAT64_TO_FLOATX80 295233294Sstas 1, 296178825Sdfr#else 297178825Sdfr 0, 298178825Sdfr#endif 299233294Sstas#ifdef SYST_FLOAT64_TO_FLOAT128 300233294Sstas 1, 301233294Sstas#else 302178825Sdfr 0, 303178825Sdfr#endif 304178825Sdfr#ifdef SYST_FLOAT64_ROUND_TO_INT 305178825Sdfr 1, 306178825Sdfr#else 307178825Sdfr 0, 308178825Sdfr#endif 309178825Sdfr#ifdef SYST_FLOAT64_ADD 310178825Sdfr 1, 311178825Sdfr#else 312178825Sdfr 0, 313233294Sstas#endif 314178825Sdfr#ifdef SYST_FLOAT64_SUB 315178825Sdfr 1, 316178825Sdfr#else 317233294Sstas 0, 318233294Sstas#endif 319233294Sstas#ifdef SYST_FLOAT64_MUL 320178825Sdfr 1, 321178825Sdfr#else 322178825Sdfr 0, 323233294Sstas#endif 324178825Sdfr#ifdef SYST_FLOAT64_DIV 325178825Sdfr 1, 326178825Sdfr#else 327233294Sstas 0, 328178825Sdfr#endif 329178825Sdfr#ifdef SYST_FLOAT64_REM 330178825Sdfr 1, 331178825Sdfr#else 332178825Sdfr 0, 333178825Sdfr#endif 334178825Sdfr#ifdef SYST_FLOAT64_SQRT 335233294Sstas 1, 336233294Sstas#else 337178825Sdfr 0, 338233294Sstas#endif 339233294Sstas#ifdef SYST_FLOAT64_EQ 340178825Sdfr 1, 341178825Sdfr#else 342178825Sdfr 0, 343178825Sdfr#endif 344178825Sdfr#ifdef SYST_FLOAT64_LE 345233294Sstas 1, 346178825Sdfr#else 347178825Sdfr 0, 348178825Sdfr#endif 349178825Sdfr#ifdef SYST_FLOAT64_LT 350178825Sdfr 1, 351178825Sdfr#else 352178825Sdfr 0, 353178825Sdfr#endif 354178825Sdfr#ifdef SYST_FLOAT64_EQ_SIGNALING 355178825Sdfr 1, 356178825Sdfr#else 357178825Sdfr 0, 358178825Sdfr#endif 359233294Sstas#ifdef SYST_FLOAT64_LE_QUIET 360233294Sstas 1, 361233294Sstas#else 362178825Sdfr 0, 363178825Sdfr#endif 364178825Sdfr#ifdef SYST_FLOAT64_LT_QUIET 365178825Sdfr 1, 366233294Sstas#else 367178825Sdfr 0, 368178825Sdfr#endif 369178825Sdfr#ifdef SYST_FLOATX80_TO_INT32 370178825Sdfr 1, 371233294Sstas#else 372178825Sdfr 0, 373178825Sdfr#endif 374178825Sdfr#ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO 375233294Sstas 1, 376178825Sdfr#else 377178825Sdfr 0, 378178825Sdfr#endif 379178825Sdfr#ifdef SYST_FLOATX80_TO_INT64 380178825Sdfr 1, 381178825Sdfr#else 382178825Sdfr 0, 383233294Sstas#endif 384178825Sdfr#ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO 385178825Sdfr 1, 386233294Sstas#else 387178825Sdfr 0, 388178825Sdfr#endif 389178825Sdfr#ifdef SYST_FLOATX80_TO_FLOAT32 390178825Sdfr 1, 391178825Sdfr#else 392178825Sdfr 0, 393178825Sdfr#endif 394178825Sdfr#ifdef SYST_FLOATX80_TO_FLOAT64 395178825Sdfr 1, 396178825Sdfr#else 397178825Sdfr 0, 398178825Sdfr#endif 399178825Sdfr#ifdef SYST_FLOATX80_TO_FLOAT128 400178825Sdfr 1, 401178825Sdfr#else 402233294Sstas 0, 403178825Sdfr#endif 404178825Sdfr#ifdef SYST_FLOATX80_ROUND_TO_INT 405178825Sdfr 1, 406178825Sdfr#else 407233294Sstas 0, 408178825Sdfr#endif 409178825Sdfr#ifdef SYST_FLOATX80_ADD 410178825Sdfr 1, 411178825Sdfr#else 412233294Sstas 0, 413178825Sdfr#endif 414178825Sdfr#ifdef SYST_FLOATX80_SUB 415178825Sdfr 1, 416178825Sdfr#else 417178825Sdfr 0, 418178825Sdfr#endif 419178825Sdfr#ifdef SYST_FLOATX80_MUL 420178825Sdfr 1, 421178825Sdfr#else 422178825Sdfr 0, 423178825Sdfr#endif 424178825Sdfr#ifdef SYST_FLOATX80_DIV 425178825Sdfr 1, 426178825Sdfr#else 427178825Sdfr 0, 428178825Sdfr#endif 429178825Sdfr#ifdef SYST_FLOATX80_REM 430178825Sdfr 1, 431178825Sdfr#else 432178825Sdfr 0, 433178825Sdfr#endif 434178825Sdfr#ifdef SYST_FLOATX80_SQRT 435 1, 436#else 437 0, 438#endif 439#ifdef SYST_FLOATX80_EQ 440 1, 441#else 442 0, 443#endif 444#ifdef SYST_FLOATX80_LE 445 1, 446#else 447 0, 448#endif 449#ifdef SYST_FLOATX80_LT 450 1, 451#else 452 0, 453#endif 454#ifdef SYST_FLOATX80_EQ_SIGNALING 455 1, 456#else 457 0, 458#endif 459#ifdef SYST_FLOATX80_LE_QUIET 460 1, 461#else 462 0, 463#endif 464#ifdef SYST_FLOATX80_LT_QUIET 465 1, 466#else 467 0, 468#endif 469#ifdef SYST_FLOAT128_TO_INT32 470 1, 471#else 472 0, 473#endif 474#ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO 475 1, 476#else 477 0, 478#endif 479#ifdef SYST_FLOAT128_TO_INT64 480 1, 481#else 482 0, 483#endif 484#ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO 485 1, 486#else 487 0, 488#endif 489#ifdef SYST_FLOAT128_TO_FLOAT32 490 1, 491#else 492 0, 493#endif 494#ifdef SYST_FLOAT128_TO_FLOAT64 495 1, 496#else 497 0, 498#endif 499#ifdef SYST_FLOAT128_TO_FLOATX80 500 1, 501#else 502 0, 503#endif 504#ifdef SYST_FLOAT128_ROUND_TO_INT 505 1, 506#else 507 0, 508#endif 509#ifdef SYST_FLOAT128_ADD 510 1, 511#else 512 0, 513#endif 514#ifdef SYST_FLOAT128_SUB 515 1, 516#else 517 0, 518#endif 519#ifdef SYST_FLOAT128_MUL 520 1, 521#else 522 0, 523#endif 524#ifdef SYST_FLOAT128_DIV 525 1, 526#else 527 0, 528#endif 529#ifdef SYST_FLOAT128_REM 530 1, 531#else 532 0, 533#endif 534#ifdef SYST_FLOAT128_SQRT 535 1, 536#else 537 0, 538#endif 539#ifdef SYST_FLOAT128_EQ 540 1, 541#else 542 0, 543#endif 544#ifdef SYST_FLOAT128_LE 545 1, 546#else 547 0, 548#endif 549#ifdef SYST_FLOAT128_LT 550 1, 551#else 552 0, 553#endif 554#ifdef SYST_FLOAT128_EQ_SIGNALING 555 1, 556#else 557 0, 558#endif 559#ifdef SYST_FLOAT128_LE_QUIET 560 1, 561#else 562 0, 563#endif 564#ifdef SYST_FLOAT128_LT_QUIET 565 1, 566#else 567 0, 568#endif 569}; 570 571static void 572 testFunctionVariety( 573 uint8 functionCode, int8 roundingPrecision, int8 roundingMode ) 574{ 575 uint8 roundingCode; 576 577 functionName = functions[ functionCode ].name; 578#ifdef FLOATX80 579 if ( roundingPrecision == 32 ) { 580 roundingPrecisionName = "32"; 581 } 582 else if ( roundingPrecision == 64 ) { 583 roundingPrecisionName = "64"; 584 } 585 else if ( roundingPrecision == 80 ) { 586 roundingPrecisionName = "80"; 587 } 588 else { 589 roundingPrecision = 80; 590 roundingPrecisionName = 0; 591 } 592 floatx80_rounding_precision = roundingPrecision; 593 syst_float_set_rounding_precision( roundingPrecision ); 594#endif 595 switch ( roundingMode ) { 596 case 0: 597 roundingModeName = 0; 598 roundingCode = float_round_nearest_even; 599 break; 600 case ROUND_NEAREST_EVEN: 601 roundingModeName = "nearest_even"; 602 roundingCode = float_round_nearest_even; 603 break; 604 case ROUND_TO_ZERO: 605 roundingModeName = "to_zero"; 606 roundingCode = float_round_to_zero; 607 break; 608 case ROUND_DOWN: 609 roundingModeName = "down"; 610 roundingCode = float_round_down; 611 break; 612 case ROUND_UP: 613 roundingModeName = "up"; 614 roundingCode = float_round_up; 615 break; 616 } 617 float_rounding_mode = roundingCode; 618 syst_float_set_rounding_mode( roundingCode ); 619 fputs( "Testing ", stderr ); 620 writeFunctionName( stderr ); 621 fputs( ".\n", stderr ); 622 switch ( functionCode ) { 623#ifdef SYST_INT32_TO_FLOAT32 624 case INT32_TO_FLOAT32: 625 test_a_int32_z_float32( int32_to_float32, syst_int32_to_float32 ); 626 break; 627#endif 628#ifdef SYST_INT32_TO_FLOAT64 629 case INT32_TO_FLOAT64: 630 test_a_int32_z_float64( int32_to_float64, syst_int32_to_float64 ); 631 break; 632#endif 633#ifdef SYST_INT32_TO_FLOATX80 634 case INT32_TO_FLOATX80: 635 test_a_int32_z_floatx80( int32_to_floatx80, syst_int32_to_floatx80 ); 636 break; 637#endif 638#ifdef SYST_INT32_TO_FLOAT128 639 case INT32_TO_FLOAT128: 640 test_a_int32_z_float128( int32_to_float128, syst_int32_to_float128 ); 641 break; 642#endif 643#ifdef SYST_INT64_TO_FLOAT32 644 case INT64_TO_FLOAT32: 645 test_a_int64_z_float32( int64_to_float32, syst_int64_to_float32 ); 646 break; 647#endif 648#ifdef SYST_INT64_TO_FLOAT64 649 case INT64_TO_FLOAT64: 650 test_a_int64_z_float64( int64_to_float64, syst_int64_to_float64 ); 651 break; 652#endif 653#ifdef SYST_INT64_TO_FLOATX80 654 case INT64_TO_FLOATX80: 655 test_a_int64_z_floatx80( int64_to_floatx80, syst_int64_to_floatx80 ); 656 break; 657#endif 658#ifdef SYST_INT64_TO_FLOAT128 659 case INT64_TO_FLOAT128: 660 test_a_int64_z_float128( int64_to_float128, syst_int64_to_float128 ); 661 break; 662#endif 663#ifdef SYST_FLOAT32_TO_INT32 664 case FLOAT32_TO_INT32: 665 test_a_float32_z_int32( float32_to_int32, syst_float32_to_int32 ); 666 break; 667#endif 668#ifdef SYST_FLOAT32_TO_INT32_ROUND_TO_ZERO 669 case FLOAT32_TO_INT32_ROUND_TO_ZERO: 670 test_a_float32_z_int32( 671 float32_to_int32_round_to_zero, 672 syst_float32_to_int32_round_to_zero 673 ); 674 break; 675#endif 676#ifdef SYST_FLOAT32_TO_INT64 677 case FLOAT32_TO_INT64: 678 test_a_float32_z_int64( float32_to_int64, syst_float32_to_int64 ); 679 break; 680#endif 681#ifdef SYST_FLOAT32_TO_INT64_ROUND_TO_ZERO 682 case FLOAT32_TO_INT64_ROUND_TO_ZERO: 683 test_a_float32_z_int64( 684 float32_to_int64_round_to_zero, 685 syst_float32_to_int64_round_to_zero 686 ); 687 break; 688#endif 689#ifdef SYST_FLOAT32_TO_FLOAT64 690 case FLOAT32_TO_FLOAT64: 691 test_a_float32_z_float64( 692 float32_to_float64, syst_float32_to_float64 ); 693 break; 694#endif 695#ifdef SYST_FLOAT32_TO_FLOATX80 696 case FLOAT32_TO_FLOATX80: 697 test_a_float32_z_floatx80( 698 float32_to_floatx80, syst_float32_to_floatx80 ); 699 break; 700#endif 701#ifdef SYST_FLOAT32_TO_FLOAT128 702 case FLOAT32_TO_FLOAT128: 703 test_a_float32_z_float128( 704 float32_to_float128, syst_float32_to_float128 ); 705 break; 706#endif 707#ifdef SYST_FLOAT32_ROUND_TO_INT 708 case FLOAT32_ROUND_TO_INT: 709 test_az_float32( float32_round_to_int, syst_float32_round_to_int ); 710 break; 711#endif 712#ifdef SYST_FLOAT32_ADD 713 case FLOAT32_ADD: 714 test_abz_float32( float32_add, syst_float32_add ); 715 break; 716#endif 717#ifdef SYST_FLOAT32_SUB 718 case FLOAT32_SUB: 719 test_abz_float32( float32_sub, syst_float32_sub ); 720 break; 721#endif 722#ifdef SYST_FLOAT32_MUL 723 case FLOAT32_MUL: 724 test_abz_float32( float32_mul, syst_float32_mul ); 725 break; 726#endif 727#ifdef SYST_FLOAT32_DIV 728 case FLOAT32_DIV: 729 test_abz_float32( float32_div, syst_float32_div ); 730 break; 731#endif 732#ifdef SYST_FLOAT32_REM 733 case FLOAT32_REM: 734 test_abz_float32( float32_rem, syst_float32_rem ); 735 break; 736#endif 737#ifdef SYST_FLOAT32_SQRT 738 case FLOAT32_SQRT: 739 test_az_float32( float32_sqrt, syst_float32_sqrt ); 740 break; 741#endif 742#ifdef SYST_FLOAT32_EQ 743 case FLOAT32_EQ: 744 test_ab_float32_z_flag( float32_eq, syst_float32_eq ); 745 break; 746#endif 747#ifdef SYST_FLOAT32_LE 748 case FLOAT32_LE: 749 test_ab_float32_z_flag( float32_le, syst_float32_le ); 750 break; 751#endif 752#ifdef SYST_FLOAT32_LT 753 case FLOAT32_LT: 754 test_ab_float32_z_flag( float32_lt, syst_float32_lt ); 755 break; 756#endif 757#ifdef SYST_FLOAT32_EQ_SIGNALING 758 case FLOAT32_EQ_SIGNALING: 759 test_ab_float32_z_flag( 760 float32_eq_signaling, syst_float32_eq_signaling ); 761 break; 762#endif 763#ifdef SYST_FLOAT32_LE_QUIET 764 case FLOAT32_LE_QUIET: 765 test_ab_float32_z_flag( float32_le_quiet, syst_float32_le_quiet ); 766 break; 767#endif 768#ifdef SYST_FLOAT32_LT_QUIET 769 case FLOAT32_LT_QUIET: 770 test_ab_float32_z_flag( float32_lt_quiet, syst_float32_lt_quiet ); 771 break; 772#endif 773#ifdef SYST_FLOAT64_TO_INT32 774 case FLOAT64_TO_INT32: 775 test_a_float64_z_int32( float64_to_int32, syst_float64_to_int32 ); 776 break; 777#endif 778#ifdef SYST_FLOAT64_TO_INT32_ROUND_TO_ZERO 779 case FLOAT64_TO_INT32_ROUND_TO_ZERO: 780 test_a_float64_z_int32( 781 float64_to_int32_round_to_zero, 782 syst_float64_to_int32_round_to_zero 783 ); 784 break; 785#endif 786#ifdef SYST_FLOAT64_TO_INT64 787 case FLOAT64_TO_INT64: 788 test_a_float64_z_int64( float64_to_int64, syst_float64_to_int64 ); 789 break; 790#endif 791#ifdef SYST_FLOAT64_TO_INT64_ROUND_TO_ZERO 792 case FLOAT64_TO_INT64_ROUND_TO_ZERO: 793 test_a_float64_z_int64( 794 float64_to_int64_round_to_zero, 795 syst_float64_to_int64_round_to_zero 796 ); 797 break; 798#endif 799#ifdef SYST_FLOAT64_TO_FLOAT32 800 case FLOAT64_TO_FLOAT32: 801 test_a_float64_z_float32( 802 float64_to_float32, syst_float64_to_float32 ); 803 break; 804#endif 805#ifdef SYST_FLOAT64_TO_FLOATX80 806 case FLOAT64_TO_FLOATX80: 807 test_a_float64_z_floatx80( 808 float64_to_floatx80, syst_float64_to_floatx80 ); 809 break; 810#endif 811#ifdef SYST_FLOAT64_TO_FLOAT128 812 case FLOAT64_TO_FLOAT128: 813 test_a_float64_z_float128( 814 float64_to_float128, syst_float64_to_float128 ); 815 break; 816#endif 817#ifdef SYST_FLOAT64_ROUND_TO_INT 818 case FLOAT64_ROUND_TO_INT: 819 test_az_float64( float64_round_to_int, syst_float64_round_to_int ); 820 break; 821#endif 822#ifdef SYST_FLOAT64_ADD 823 case FLOAT64_ADD: 824 test_abz_float64( float64_add, syst_float64_add ); 825 break; 826#endif 827#ifdef SYST_FLOAT64_SUB 828 case FLOAT64_SUB: 829 test_abz_float64( float64_sub, syst_float64_sub ); 830 break; 831#endif 832#ifdef SYST_FLOAT64_MUL 833 case FLOAT64_MUL: 834 test_abz_float64( float64_mul, syst_float64_mul ); 835 break; 836#endif 837#ifdef SYST_FLOAT64_DIV 838 case FLOAT64_DIV: 839 test_abz_float64( float64_div, syst_float64_div ); 840 break; 841#endif 842#ifdef SYST_FLOAT64_REM 843 case FLOAT64_REM: 844 test_abz_float64( float64_rem, syst_float64_rem ); 845 break; 846#endif 847#ifdef SYST_FLOAT64_SQRT 848 case FLOAT64_SQRT: 849 test_az_float64( float64_sqrt, syst_float64_sqrt ); 850 break; 851#endif 852#ifdef SYST_FLOAT64_EQ 853 case FLOAT64_EQ: 854 test_ab_float64_z_flag( float64_eq, syst_float64_eq ); 855 break; 856#endif 857#ifdef SYST_FLOAT64_LE 858 case FLOAT64_LE: 859 test_ab_float64_z_flag( float64_le, syst_float64_le ); 860 break; 861#endif 862#ifdef SYST_FLOAT64_LT 863 case FLOAT64_LT: 864 test_ab_float64_z_flag( float64_lt, syst_float64_lt ); 865 break; 866#endif 867#ifdef SYST_FLOAT64_EQ_SIGNALING 868 case FLOAT64_EQ_SIGNALING: 869 test_ab_float64_z_flag( 870 float64_eq_signaling, syst_float64_eq_signaling ); 871 break; 872#endif 873#ifdef SYST_FLOAT64_LE_QUIET 874 case FLOAT64_LE_QUIET: 875 test_ab_float64_z_flag( float64_le_quiet, syst_float64_le_quiet ); 876 break; 877#endif 878#ifdef SYST_FLOAT64_LT_QUIET 879 case FLOAT64_LT_QUIET: 880 test_ab_float64_z_flag( float64_lt_quiet, syst_float64_lt_quiet ); 881 break; 882#endif 883#ifdef SYST_FLOATX80_TO_INT32 884 case FLOATX80_TO_INT32: 885 test_a_floatx80_z_int32( floatx80_to_int32, syst_floatx80_to_int32 ); 886 break; 887#endif 888#ifdef SYST_FLOATX80_TO_INT32_ROUND_TO_ZERO 889 case FLOATX80_TO_INT32_ROUND_TO_ZERO: 890 test_a_floatx80_z_int32( 891 floatx80_to_int32_round_to_zero, 892 syst_floatx80_to_int32_round_to_zero 893 ); 894 break; 895#endif 896#ifdef SYST_FLOATX80_TO_INT64 897 case FLOATX80_TO_INT64: 898 test_a_floatx80_z_int64( floatx80_to_int64, syst_floatx80_to_int64 ); 899 break; 900#endif 901#ifdef SYST_FLOATX80_TO_INT64_ROUND_TO_ZERO 902 case FLOATX80_TO_INT64_ROUND_TO_ZERO: 903 test_a_floatx80_z_int64( 904 floatx80_to_int64_round_to_zero, 905 syst_floatx80_to_int64_round_to_zero 906 ); 907 break; 908#endif 909#ifdef SYST_FLOATX80_TO_FLOAT32 910 case FLOATX80_TO_FLOAT32: 911 test_a_floatx80_z_float32( 912 floatx80_to_float32, syst_floatx80_to_float32 ); 913 break; 914#endif 915#ifdef SYST_FLOATX80_TO_FLOAT64 916 case FLOATX80_TO_FLOAT64: 917 test_a_floatx80_z_float64( 918 floatx80_to_float64, syst_floatx80_to_float64 ); 919 break; 920#endif 921#ifdef SYST_FLOATX80_TO_FLOAT128 922 case FLOATX80_TO_FLOAT128: 923 test_a_floatx80_z_float128( 924 floatx80_to_float128, syst_floatx80_to_float128 ); 925 break; 926#endif 927#ifdef SYST_FLOATX80_ROUND_TO_INT 928 case FLOATX80_ROUND_TO_INT: 929 test_az_floatx80( floatx80_round_to_int, syst_floatx80_round_to_int ); 930 break; 931#endif 932#ifdef SYST_FLOATX80_ADD 933 case FLOATX80_ADD: 934 test_abz_floatx80( floatx80_add, syst_floatx80_add ); 935 break; 936#endif 937#ifdef SYST_FLOATX80_SUB 938 case FLOATX80_SUB: 939 test_abz_floatx80( floatx80_sub, syst_floatx80_sub ); 940 break; 941#endif 942#ifdef SYST_FLOATX80_MUL 943 case FLOATX80_MUL: 944 test_abz_floatx80( floatx80_mul, syst_floatx80_mul ); 945 break; 946#endif 947#ifdef SYST_FLOATX80_DIV 948 case FLOATX80_DIV: 949 test_abz_floatx80( floatx80_div, syst_floatx80_div ); 950 break; 951#endif 952#ifdef SYST_FLOATX80_REM 953 case FLOATX80_REM: 954 test_abz_floatx80( floatx80_rem, syst_floatx80_rem ); 955 break; 956#endif 957#ifdef SYST_FLOATX80_SQRT 958 case FLOATX80_SQRT: 959 test_az_floatx80( floatx80_sqrt, syst_floatx80_sqrt ); 960 break; 961#endif 962#ifdef SYST_FLOATX80_EQ 963 case FLOATX80_EQ: 964 test_ab_floatx80_z_flag( floatx80_eq, syst_floatx80_eq ); 965 break; 966#endif 967#ifdef SYST_FLOATX80_LE 968 case FLOATX80_LE: 969 test_ab_floatx80_z_flag( floatx80_le, syst_floatx80_le ); 970 break; 971#endif 972#ifdef SYST_FLOATX80_LT 973 case FLOATX80_LT: 974 test_ab_floatx80_z_flag( floatx80_lt, syst_floatx80_lt ); 975 break; 976#endif 977#ifdef SYST_FLOATX80_EQ_SIGNALING 978 case FLOATX80_EQ_SIGNALING: 979 test_ab_floatx80_z_flag( 980 floatx80_eq_signaling, syst_floatx80_eq_signaling ); 981 break; 982#endif 983#ifdef SYST_FLOATX80_LE_QUIET 984 case FLOATX80_LE_QUIET: 985 test_ab_floatx80_z_flag( floatx80_le_quiet, syst_floatx80_le_quiet ); 986 break; 987#endif 988#ifdef SYST_FLOATX80_LT_QUIET 989 case FLOATX80_LT_QUIET: 990 test_ab_floatx80_z_flag( floatx80_lt_quiet, syst_floatx80_lt_quiet ); 991 break; 992#endif 993#ifdef SYST_FLOAT128_TO_INT32 994 case FLOAT128_TO_INT32: 995 test_a_float128_z_int32( float128_to_int32, syst_float128_to_int32 ); 996 break; 997#endif 998#ifdef SYST_FLOAT128_TO_INT32_ROUND_TO_ZERO 999 case FLOAT128_TO_INT32_ROUND_TO_ZERO: 1000 test_a_float128_z_int32( 1001 float128_to_int32_round_to_zero, 1002 syst_float128_to_int32_round_to_zero 1003 ); 1004 break; 1005#endif 1006#ifdef SYST_FLOAT128_TO_INT64 1007 case FLOAT128_TO_INT64: 1008 test_a_float128_z_int64( float128_to_int64, syst_float128_to_int64 ); 1009 break; 1010#endif 1011#ifdef SYST_FLOAT128_TO_INT64_ROUND_TO_ZERO 1012 case FLOAT128_TO_INT64_ROUND_TO_ZERO: 1013 test_a_float128_z_int64( 1014 float128_to_int64_round_to_zero, 1015 syst_float128_to_int64_round_to_zero 1016 ); 1017 break; 1018#endif 1019#ifdef SYST_FLOAT128_TO_FLOAT32 1020 case FLOAT128_TO_FLOAT32: 1021 test_a_float128_z_float32( 1022 float128_to_float32, syst_float128_to_float32 ); 1023 break; 1024#endif 1025#ifdef SYST_FLOAT128_TO_FLOAT64 1026 case FLOAT128_TO_FLOAT64: 1027 test_a_float128_z_float64( 1028 float128_to_float64, syst_float128_to_float64 ); 1029 break; 1030#endif 1031#ifdef SYST_FLOAT128_TO_FLOATX80 1032 case FLOAT128_TO_FLOATX80: 1033 test_a_float128_z_floatx80( 1034 float128_to_floatx80, syst_float128_to_floatx80 ); 1035 break; 1036#endif 1037#ifdef SYST_FLOAT128_ROUND_TO_INT 1038 case FLOAT128_ROUND_TO_INT: 1039 test_az_float128( float128_round_to_int, syst_float128_round_to_int ); 1040 break; 1041#endif 1042#ifdef SYST_FLOAT128_ADD 1043 case FLOAT128_ADD: 1044 test_abz_float128( float128_add, syst_float128_add ); 1045 break; 1046#endif 1047#ifdef SYST_FLOAT128_SUB 1048 case FLOAT128_SUB: 1049 test_abz_float128( float128_sub, syst_float128_sub ); 1050 break; 1051#endif 1052#ifdef SYST_FLOAT128_MUL 1053 case FLOAT128_MUL: 1054 test_abz_float128( float128_mul, syst_float128_mul ); 1055 break; 1056#endif 1057#ifdef SYST_FLOAT128_DIV 1058 case FLOAT128_DIV: 1059 test_abz_float128( float128_div, syst_float128_div ); 1060 break; 1061#endif 1062#ifdef SYST_FLOAT128_REM 1063 case FLOAT128_REM: 1064 test_abz_float128( float128_rem, syst_float128_rem ); 1065 break; 1066#endif 1067#ifdef SYST_FLOAT128_SQRT 1068 case FLOAT128_SQRT: 1069 test_az_float128( float128_sqrt, syst_float128_sqrt ); 1070 break; 1071#endif 1072#ifdef SYST_FLOAT128_EQ 1073 case FLOAT128_EQ: 1074 test_ab_float128_z_flag( float128_eq, syst_float128_eq ); 1075 break; 1076#endif 1077#ifdef SYST_FLOAT128_LE 1078 case FLOAT128_LE: 1079 test_ab_float128_z_flag( float128_le, syst_float128_le ); 1080 break; 1081#endif 1082#ifdef SYST_FLOAT128_LT 1083 case FLOAT128_LT: 1084 test_ab_float128_z_flag( float128_lt, syst_float128_lt ); 1085 break; 1086#endif 1087#ifdef SYST_FLOAT128_EQ_SIGNALING 1088 case FLOAT128_EQ_SIGNALING: 1089 test_ab_float128_z_flag( 1090 float128_eq_signaling, syst_float128_eq_signaling ); 1091 break; 1092#endif 1093#ifdef SYST_FLOAT128_LE_QUIET 1094 case FLOAT128_LE_QUIET: 1095 test_ab_float128_z_flag( float128_le_quiet, syst_float128_le_quiet ); 1096 break; 1097#endif 1098#ifdef SYST_FLOAT128_LT_QUIET 1099 case FLOAT128_LT_QUIET: 1100 test_ab_float128_z_flag( float128_lt_quiet, syst_float128_lt_quiet ); 1101 break; 1102#endif 1103 } 1104 if ( ( errorStop && anyErrors ) || stop ) exitWithStatus(); 1105 1106} 1107 1108void 1109 testFunction( 1110 uint8 functionCode, int8 roundingPrecisionIn, int8 roundingModeIn ) 1111{ 1112 int8 roundingPrecision, roundingMode; 1113 1114 roundingPrecision = 32; 1115 for (;;) { 1116 if ( ! functions[ functionCode ].roundingPrecision ) { 1117 roundingPrecision = 0; 1118 } 1119 else if ( roundingPrecisionIn ) { 1120 roundingPrecision = roundingPrecisionIn; 1121 } 1122 for ( roundingMode = 1; 1123 roundingMode < NUM_ROUNDINGMODES; 1124 ++roundingMode 1125 ) { 1126 if ( ! functions[ functionCode ].roundingMode ) { 1127 roundingMode = 0; 1128 } 1129 else if ( roundingModeIn ) { 1130 roundingMode = roundingModeIn; 1131 } 1132 testFunctionVariety( 1133 functionCode, roundingPrecision, roundingMode ); 1134 if ( roundingModeIn || ! roundingMode ) break; 1135 } 1136 if ( roundingPrecisionIn || ! roundingPrecision ) break; 1137 if ( roundingPrecision == 80 ) { 1138 break; 1139 } 1140 else if ( roundingPrecision == 64 ) { 1141 roundingPrecision = 80; 1142 } 1143 else if ( roundingPrecision == 32 ) { 1144 roundingPrecision = 64; 1145 } 1146 } 1147 1148} 1149 1150