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