History of Berkeley SoftFloat, to Release 3e
John R. Hauser
2018 January 20
Release 3e (2018 January)
-
Changed the default numeric code for optional rounding mode
odd
(round to odd, also known as jamming) from 5 to 6.
-
Modified the behavior of rounding mode
odd
when rounding to an
integer value (either conversion to an integer format or a
‘roundToInt
’ function).
Previously, for those cases only, rounding mode odd
acted the same
as rounding to minimum magnitude.
Now all operations are rounded consistently.
-
Fixed some errors in the specialization code modeling Intel x86 floating-point,
specifically the integers returned on invalid operations and the propagation of
NaN payloads in a few rare cases.
-
Added specialization code modeling ARM floating-point, conforming to VFPv2 or
later.
-
Added an example target for ARM processors.
-
Fixed a minor bug whereby function
f16_to_ui64
might return a
different integer than expected in the case that the floating-point operand is
negative.
-
Added example target-specific optimization for GCC, employing GCC instrinsics
and support for 128-bit integer arithmetic.
-
Made other minor improvements.
Release 3d (2017 August)
-
Fixed bugs in the square root functions for 64-bit
double-precision, 80-bit double-extended-precision, and
128-bit quadruple-precision.
For 64-bit double-precision (
f64_sqrt
), the result
could sometimes be off by 1 unit in the last place
(1 ulp) from what it should be.
For the larger formats, the square root could be wrong in a large portion of
the less-significant bits.
(A bug in f128_sqrt
was first reported by Alexei Sibidanov.)
Release 3c (2017 February)
-
Added optional rounding mode
odd
(round to odd, also known as
jamming).
-
Corrected the documentation concerning non-canonical representations in
80-bit double-extended-precision.
Release 3b (2016 July)
-
Implemented the common 16-bit “half-precision”
floating-point format (
float16_t
).
-
Made the integer values returned on invalid conversions to integer formats
be determined by the port-specific specialization instead of being the same for
all ports.
-
Added preprocessor macro
THREAD_LOCAL
to allow the floating-point
state (modes and exception flags) to be made per-thread.
-
Modified the provided Makefiles to allow some options to be overridden from the
make
command.
-
Made other minor improvements.
Release 3a (2015 October)
-
Replaced the license text supplied by the University of California, Berkeley.
Release 3 (2015 February)
-
Complete rewrite, funded by the University of California, Berkeley, and
consequently having a different use license than earlier releases.
Major changes included renaming most types and functions, upgrading some
algorithms, restructuring the source files, and making SoftFloat into a true
library.
-
Added functions to convert between floating-point and unsigned integers, both
32-bit and 64-bit (
uint32_t
and
uint64_t
).
-
Added functions for fused multiply-add, for all supported floating-point
formats except 80-bit double-extended-precision.
-
Added support for a fifth rounding mode,
near_maxMag
(round to
nearest, with ties to maximum magnitude, away from zero).
-
Dropped the
timesoftfloat
program (now part of the Berkeley
TestFloat package).
Release 2c (2015 January)
-
Fixed mistakes affecting some 64-bit processors.
-
Further improved the documentation and the wording for the legal restrictions
on using SoftFloat releases through 2c (not applicable to
Release 3 or later).
Release 2b (2002 May)
-
Made minor updates to the documentation, including improved wording for the
legal restrictions on using SoftFloat.
Release 2a (1998 December)
-
Added functions to convert between 64-bit integers
(
int64
) and all supported floating-point formats.
-
Fixed a bug in all 64-bit-version square root functions except
float32_sqrt
that caused the result sometimes to be off by
1 unit in the last place (1 ulp) from what it should
be.
(Bug discovered by Paul Donahue.)
-
Improved the Makefiles.
Release 2 (1997 June)
-
Created the 64-bit (
bits64
) version, adding the
floatx80
and float128
formats.
-
Changed the source directory structure, splitting the sources into a
bits32
and a bits64
version.
Renamed environment.h
to milieu.h
to avoid confusion
with environment variables.
-
Fixed a small error that caused
float64_round_to_int
often to
round the wrong way in nearest/even mode when the operand was between
220 and 221 and halfway between two integers.
Release 1a (1996 July)
-
Corrected a mistake that caused borderline underflow cases not to raise the
underflow flag when they should have.
(Problem reported by Doug Priest.)
-
Added the
float_detect_tininess
variable to control whether
tininess is detected before or after rounding.
Release 1 (1996 July)
-
Original release, based on work done for the International Computer Science
Institute (ICSI) in Berkeley, California.