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
(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
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
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
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
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
Corrected the documentation concerning non-canonical representations in
Release 3b (2016 July)
Implemented the common 16-bit “half-precision”
floating-point format (
Made the integer values returned on invalid conversions to integer formats
be determined by the port-specific specialization instead of being the same for
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
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
Added functions to convert between floating-point and unsigned integers, both
32-bit and 64-bit (
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).
timesoftfloat program (now part of the Berkeley
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
(Bug discovered by Paul Donahue.)
Improved the Makefiles.
Release 2 (1997 June)
Created the 64-bit (
bits64) version, adding the
Changed the source directory structure, splitting the sources into a
bits32 and a
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.)
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.