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