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 floatingpoint,
specifically the integers returned on invalid operations and the propagation of
NaN payloads in a few rare cases.

Added specialization code modeling ARM floatingpoint, 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 floatingpoint operand is
negative.

Added example targetspecific optimization for GCC, employing GCC instrinsics
and support for 128bit integer arithmetic.

Made other minor improvements.
Release 3d (2017 August)

Fixed bugs in the square root functions for 64bit
doubleprecision, 80bit doubleextendedprecision, and
128bit quadrupleprecision.
For 64bit doubleprecision (
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 lesssignificant 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 noncanonical representations in
80bit doubleextendedprecision.
Release 3b (2016 July)

Implemented the common 16bit “halfprecision”
floatingpoint format (
float16_t
).

Made the integer values returned on invalid conversions to integer formats
be determined by the portspecific specialization instead of being the same for
all ports.

Added preprocessor macro
THREAD_LOCAL
to allow the floatingpoint
state (modes and exception flags) to be made perthread.

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 floatingpoint and unsigned integers, both
32bit and 64bit (
uint32_t
and
uint64_t
).

Added functions for fused multiplyadd, for all supported floatingpoint
formats except 80bit doubleextendedprecision.

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 64bit 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 64bit integers
(
int64
) and all supported floatingpoint formats.

Fixed a bug in all 64bitversion 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 64bit (
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
2^{20} and 2^{21} 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.