b09fefd1f6
currently supporting sparc64. After a `make depend all` there are three programs; testsoftfloat for testing against the SoftFloat in src/lib/libc/softfloat for reference purposes, testemufloat for testing the emulator source in src/lib/libc/sparc64/fpu and testfloat for testing with the installed libc. Support for other architectures can be added as needed. PR: 144900 Submitted by: Peter Jeremy
324 lines
16 KiB
Plaintext
324 lines
16 KiB
Plaintext
|
|
Known Floating-point Bugs Detected by TestFloat
|
|
|
|
John R. Hauser
|
|
1997 December 15
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
Introduction
|
|
|
|
Several popular systems have bugs that TestFloat is very likely to run
|
|
across. The ones I know of are documented here. First off, TestFloat finds
|
|
no errors in the following processors/machines:
|
|
|
|
AMD 486 DX4's
|
|
Sun UltraSPARC 1's and 2's
|
|
|
|
On the other hand, bugs are found in these processors/machines:
|
|
|
|
Older Intel Pentiums (with the divide bug)
|
|
Intel Pentium Pros
|
|
Sun SPARCstation 1's and IPX's
|
|
Sun SPARCstation 10's
|
|
HP Precision Architecture processors, with HP-UX prior to version 10.10
|
|
|
|
For some reason, most of the bugs found involve conversions from floating-
|
|
point to integer formats.
|
|
|
|
The bugs are shown as actual TestFloat error lines, along with a brief
|
|
explanation. The error lines given are not necesarily exhaustive and were
|
|
not necessarily output in the order shown.
|
|
|
|
This document does not pretend to be an authoritative bug listing for all
|
|
commercial processors. The vast majority of processors are absent from this
|
|
list because I have never run TestFloat on such machines and I thus have no
|
|
knowledge of what bugs TestFloat might find in them.
|
|
|
|
The latest version of this file can be found at the Web page `http://
|
|
http.cs.berkeley.edu/~jhauser/arithmetic/testfloat.html'.
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
Older Intel Pentiums (with the divide bug)
|
|
|
|
The following conversion problems are found on Pentiums that also suffer
|
|
from the infamous floating-point divide bug. These bugs have been fixed on
|
|
newer Pentiums. (TestFloat does not find the divide bug.)
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
floatx80_to_int32
|
|
|
|
-- A few small fractions are treated as though they were zero.
|
|
|
|
Errors found in floatx80_to_int32, rounding nearest_even:
|
|
3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
Errors found in floatx80_to_int32, rounding to_zero:
|
|
3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
BFFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
Errors found in floatx80_to_int32, rounding down:
|
|
3FFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
3FFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
3FFC.C000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
BFFB.8000000000000000 soft: FFFFFFFF ....x syst: 00000000 .....
|
|
BFFC.8000000000000000 soft: FFFFFFFF ....x syst: 00000000 .....
|
|
BFFC.C000000000000000 soft: FFFFFFFF ....x syst: 00000000 .....
|
|
Errors found in floatx80_to_int32, rounding up:
|
|
3FFB.8000000000000000 soft: 00000001 ....x syst: 00000000 .....
|
|
3FFC.8000000000000000 soft: 00000001 ....x syst: 00000000 .....
|
|
3FFC.C000000000000000 soft: 00000001 ....x syst: 00000000 .....
|
|
BFFB.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
BFFC.8000000000000000 soft: 00000000 ....x syst: 00000000 .....
|
|
|
|
3FFB.8000000000000000 is the fraction 1/16; 3FFC.8000000000000000 is 1/8;
|
|
and 3FFC.C000000000000000 is 3/16. Both positive and negative inputs are
|
|
affected.
|
|
|
|
-- Some (all?) positive floating-point values between 2^32 - 1/2
|
|
(401E.FFFFFFFF00000000) and 2^32 (401F.0000000000000000) are rounded to
|
|
zero when the rounding mode is nearest/even or up.
|
|
|
|
Errors found in floatx80_to_int32, rounding nearest_even:
|
|
401E.FFFFFFFF80000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFC00001FE soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFF8000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFEC00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFF002000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFC00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFE00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFFD7FFE soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFFFFFFE soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFFFFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
Errors found in floatx80_to_int32, rounding up:
|
|
401E.FFFFFFFF00800000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFF80000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFEFFFC000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFC000000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFE7FFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFF00000 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFFE0800 soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFFF7FFB soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFFFFFFE soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
401E.FFFFFFFFFFFFFFFF soft: 7FFFFFFF v.... syst: 00000000 ....x
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
Intel Pentium Pros
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
floatx80_to_int32
|
|
|
|
-- The inexact flag is sometimes raised instead of the invalid flag for
|
|
floating-point inputs under -(2^32) (C01F.0000000000000000). This bug is
|
|
sporadic. It appears to be deterministic but dependent on the sequence
|
|
of operations executed.
|
|
|
|
Errors found in floatx80_to_int32, rounding nearest_even:
|
|
C01F.C000000000000002 soft: 80000000 v.... syst: 80000000 ....x
|
|
C021.F00000000000003F soft: 80000000 v.... syst: 80000000 ....x
|
|
Errors found in floatx80_to_int32, rounding to_zero:
|
|
C021.F00000000000003F soft: 80000000 v.... syst: 80000000 ....x
|
|
Errors found in floatx80_to_int32, rounding up:
|
|
C01F.C000000000000007 soft: 80000000 v.... syst: 80000000 ....x
|
|
C01F.C000000000001000 soft: 80000000 v.... syst: 80000000 ....x
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
Sun SPARCstation 1's and IPX's
|
|
|
|
Some older SPARCstations appear confused about whether underflow tininess is
|
|
detected before or after rounding. For conversions from double precision
|
|
to single precision, tininess is detected after rounding, while for all
|
|
quadruple-precision operations it is detected before rounding. Single- and
|
|
double-precision multipies go both ways:
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
float32_mul, float64_mul
|
|
|
|
-- For multiplies, underflow tininess is detected _before_ rounding if one
|
|
of the inputs is subnormal, and _after_ rounding otherwise. If tininess
|
|
is assumed to be detected before rounding, the following errors are
|
|
generated:
|
|
|
|
Errors found in float32_mul, rounding nearest_even:
|
|
001.000001 07E.7FFFFE soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
001.000001 87E.7FFFFE soft: 801.000000 ...ux syst: 801.000000 ....x
|
|
001.000002 07E.7FFFFC soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
001.000002 87E.7FFFFC soft: 801.000000 ...ux syst: 801.000000 ....x
|
|
001.000004 07E.7FFFF8 soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
Errors found in float32_mul, rounding down:
|
|
001.000001 87E.7FFFFE soft: 801.000000 ...ux syst: 801.000000 ....x
|
|
001.000002 87E.7FFFFC soft: 801.000000 ...ux syst: 801.000000 ....x
|
|
001.000004 87E.7FFFF8 soft: 801.000000 ...ux syst: 801.000000 ....x
|
|
001.000008 87E.7FFFF0 soft: 801.000000 ...ux syst: 801.000000 ....x
|
|
001.000010 87E.7FFFE0 soft: 801.000000 ...ux syst: 801.000000 ....x
|
|
Errors found in float32_mul, rounding up:
|
|
001.000001 07E.7FFFFE soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
001.000002 07E.7FFFFC soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
001.000004 07E.7FFFF8 soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
001.000008 07E.7FFFF0 soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
001.000010 07E.7FFFE0 soft: 001.000000 ...ux syst: 001.000000 ....x
|
|
Errors found in float64_mul, rounding nearest_even:
|
|
001.0000000000001 3FE.FFFFFFFFFFFFE
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
001.0000000000001 BFE.FFFFFFFFFFFFE
|
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
|
|
001.0000000000002 3FE.FFFFFFFFFFFFC
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
001.0000000000002 BFE.FFFFFFFFFFFFC
|
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
|
|
001.0000000000004 3FE.FFFFFFFFFFFF8
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
Errors found in float64_mul, rounding down:
|
|
001.0000000000001 BFE.FFFFFFFFFFFFE
|
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
|
|
001.0000000000002 BFE.FFFFFFFFFFFFC
|
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
|
|
001.0000000000004 BFE.FFFFFFFFFFFF8
|
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
|
|
001.0000000000008 BFE.FFFFFFFFFFFF0
|
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
|
|
001.0000000000010 BFE.FFFFFFFFFFFE0
|
|
soft: 801.0000000000000 ...ux syst: 801.0000000000000 ....x
|
|
Errors found in float64_mul, rounding up:
|
|
001.0000000000001 3FE.FFFFFFFFFFFFE
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
001.0000000000002 3FE.FFFFFFFFFFFFC
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
001.0000000000004 3FE.FFFFFFFFFFFF8
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
001.0000000000008 3FE.FFFFFFFFFFFF0
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
001.0000000000010 3FE.FFFFFFFFFFFE0
|
|
soft: 001.0000000000000 ...ux syst: 001.0000000000000 ....x
|
|
|
|
If we assume tininess should be detected after rounding, we get the
|
|
following errors:
|
|
|
|
Errors found in float32_mul, rounding nearest_even:
|
|
000.7FFC00 07F.000400 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
000.7FFC00 87F.000400 soft: 801.000000 ....x syst: 801.000000 ...ux
|
|
000.7FFE00 07F.000200 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
000.7FFE00 87F.000200 soft: 801.000000 ....x syst: 801.000000 ...ux
|
|
000.7FFF00 07F.000100 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
Errors found in float32_mul, rounding down:
|
|
000.7FFC00 87F.000400 soft: 801.000000 ....x syst: 801.000000 ...ux
|
|
000.7FFE00 87F.000200 soft: 801.000000 ....x syst: 801.000000 ...ux
|
|
000.7FFF00 87F.000100 soft: 801.000000 ....x syst: 801.000000 ...ux
|
|
000.7FFF80 87F.000080 soft: 801.000000 ....x syst: 801.000000 ...ux
|
|
000.7FFFC0 87F.000040 soft: 801.000000 ....x syst: 801.000000 ...ux
|
|
Errors found in float32_mul, rounding up:
|
|
000.7FFC00 07F.000400 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
000.7FFE00 07F.000200 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
000.7FFF00 07F.000100 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
000.7FFF80 07F.000080 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
000.7FFFC0 07F.000040 soft: 001.000000 ....x syst: 001.000000 ...ux
|
|
Errors found in float64_mul, rounding nearest_even:
|
|
000.FFFFFFE000000 3FF.0000002000000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
000.FFFFFFE000000 BFF.0000002000000
|
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
|
|
000.FFFFFFF000000 3FF.0000001000000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
000.FFFFFFF000000 BFF.0000001000000
|
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
|
|
000.FFFFFFF800000 3FF.0000000800000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
Errors found in float64_mul, rounding down:
|
|
000.FFFFFFE000000 BFF.0000002000000
|
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
|
|
000.FFFFFFF000000 BFF.0000001000000
|
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
|
|
000.FFFFFFF800000 BFF.0000000800000
|
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
|
|
000.FFFFFFFC00000 BFF.0000000400000
|
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
|
|
000.FFFFFFFE00000 BFF.0000000200000
|
|
soft: 801.0000000000000 ....x syst: 801.0000000000000 ...ux
|
|
Errors found in float64_mul, rounding up:
|
|
000.FFFFFFE000000 3FF.0000002000000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
000.FFFFFFF000000 3FF.0000001000000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
000.FFFFFFF800000 3FF.0000000800000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
000.FFFFFFFC00000 3FF.0000000400000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
000.FFFFFFFE00000 3FF.0000000200000
|
|
soft: 001.0000000000000 ....x syst: 001.0000000000000 ...ux
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
Sun SPARCstation 10's
|
|
|
|
Like other SPARCstations, some SPARCstation 10's are inconsistent regarding
|
|
underflow tininess, detecting it after rounding for single- and double-
|
|
precision operations and before rounding for quadruple-precision operations.
|
|
The following bug has also been observed.
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
float32_to_int32_round_to_zero, float64_to_int32_round_to_zero
|
|
|
|
-- Single- and double-precision NaNs are converted to the integer zero.
|
|
(The invalid exception flag is raised correctly.)
|
|
|
|
Errors found in float32_to_int32_round_to_zero:
|
|
8FF.5D36AC soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
0FF.7FFFC0 soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
8FF.7C0000 soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
0FF.2AB7ED soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
0FF.03FFFF soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
Errors found in float64_to_int32_round_to_zero:
|
|
7FF.45AD84DB2524A soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
7FF.CFEE063EE0512 soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
7FF.89FF03AB7DBA2 soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
7FF.FFFFFFFFFF800 soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
FFF.68A6410E91BF6 soft: 7FFFFFFF v.... syst: 00000000 v....
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|
|
-------------------------------------------------------------------------------
|
|
HP Precision Architecture processors, with HP-UX prior to version 10.10
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
float32_to_int32_round_to_zero, float64_to_int32_round_to_zero
|
|
|
|
-- When the floating-point value is too large, the overflow and inexact
|
|
exception flags are raised instead of the invalid flag.
|
|
|
|
Errors found in float32_to_int32_round_to_zero:
|
|
89E.000007 soft: 80000000 v.... syst: 80000000 ..o.x
|
|
0A2.000020 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
|
|
8FA.7C0000 soft: 80000000 v.... syst: 80000000 ..o.x
|
|
Errors found in float64_to_int32_round_to_zero:
|
|
7FD.0448700002F1C soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
|
|
DAA.F000000000000 soft: 80000000 v.... syst: 80000000 ..o.x
|
|
41E.063DA00005E65 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
|
|
47E.FFFF800000000 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
|
|
51F.0000000000004 soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
|
|
DDA.0000001FFFFFF soft: 80000000 v.... syst: 80000000 ..o.x
|
|
D70.00000000003FF soft: 80000000 v.... syst: 80000000 ..o.x
|
|
C7E.0000100000000 soft: 80000000 v.... syst: 80000000 ..o.x
|
|
47E.000000000007F soft: 7FFFFFFF v.... syst: 7FFFFFFF ..o.x
|
|
D57.000000000FFFF soft: 80000000 v.... syst: 80000000 ..o.x
|
|
|
|
|
|
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
|
|
|