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