freebsd-dev/lib/msun
Dimitry Andric 83fa0a287f The fdlibm hypot() implementations shouldn't potentially left-shift
negative numbers (invoking undefined behavior)

Summary:
Various paths through hypot(x, y) will multiply x and y by a power of
two, perform the calculation in a range where IEEE-754 provides greater
precision, then undo the multiplication to determine the true result.
Undoing that multiplication is implemented as t1*w, where t1=2**k.

2**k is often computed by taking the high word of 1.0, then adding k<<20
(for doubles or long doubles) or k<<23 (for floats) to it, then
overwriting that high word. But when k is negative this left-shifts a
negative value -- and that's undefined behavior in many editions of C
and C++.

This patch should fix all hypot implementations to compute 2**k without
triggering this particular bit of undefined behavior.

Test Plan: I've only very lightly tested out the hypot(double, double)
change, in SpiderMonkey's JavaScript engine, for consistency with prior
behavior.  The other functions' changes have more or less only been
eyeballed.  Careful examination appreciated!  Do note, however, that an
error in any of these changes would most likely produce a value that is
incorrect by a factor of two, so any mistake would most likely be
glaring if invoked.

Submitted by:	Jeff Walden <jwalden@mit.edu>
Obtained from:	https://github.com/freebsd/freebsd/pull/414
Reviewed by:	dim, lwhsu
MFC after:	1 week
Differential Revision: https://reviews.freebsd.org/D22354
2019-11-26 22:01:09 +00:00
..
aarch64 Add the fe* symbols to libm for arm64. 2015-03-31 19:07:28 +00:00
amd64 libm: Add missing END() directives for amd64 routines 2019-10-23 16:05:52 +00:00
arm lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
bsdsrc Remove an unused incude from lib/msun/bsdsrc/b_log.c. 2017-12-07 20:41:23 +00:00
i387 Resolve conflicts between macros in fenv.h and ieeefp.h 2018-05-31 20:22:47 +00:00
ld80 Recommit r336497: Fix powl, cpow, cpowf, and cpowl imports from OpenBSD 2018-07-20 18:27:30 +00:00
ld128 msun: Fix some old typos. 2018-12-31 15:43:06 +00:00
man Introduce <sys/qmath.h>, a fixed-point math library from Netflix. 2019-08-27 11:46:22 +00:00
mips lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
powerpc lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
riscv Replace SOFTFLOAT with __riscv_float_abi_*. 2018-04-19 20:36:15 +00:00
sparc64 lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
src The fdlibm hypot() implementations shouldn't potentially left-shift 2019-11-26 22:01:09 +00:00
tests Unskip test cases from netbsd-tests by defining __HAVE_FENV 2019-08-31 20:45:45 +00:00
x86 Resolve conflicts between macros in fenv.h and ieeefp.h 2018-05-31 20:22:47 +00:00
Makefile libm: squelch -Woverflow from gcc6 2019-02-01 23:15:54 +00:00
Makefile.depend DIRDEPS_BUILD: Update dependencies. 2017-10-31 00:07:04 +00:00
Symbol.map msun: add ld80/ld128 powl, cpow, cpowf, cpowl from openbsd 2018-07-15 00:23:10 +00:00