freebsd-nq/lib/msun/src
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
..
catrig.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
catrigf.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
catrigl.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
e_acos.c
e_acosf.c
e_acosh.c
e_acoshf.c
e_acoshl.c
e_acosl.c
e_asin.c msun: Remove trailing space in Sunsoft copyright statement. 2017-04-23 22:31:12 +00:00
e_asinf.c
e_asinl.c
e_atan2.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
e_atan2f.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
e_atan2l.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
e_atanh.c
e_atanhf.c
e_atanhl.c
e_cosh.c
e_coshf.c
e_coshl.c libm: remove unused variables for LDBL_MANT_DIG != 113 2016-09-30 20:20:07 +00:00
e_exp.c Do not left-shift a negative number (inducing undefined behavior in 2019-09-25 18:50:57 +00:00
e_expf.c Do not left-shift a negative number (inducing undefined behavior in 2019-09-25 18:50:57 +00:00
e_fmod.c Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
e_fmodf.c Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
e_fmodl.c Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
e_gamma_r.c
e_gamma.c
e_gammaf_r.c
e_gammaf.c
e_hypot.c The fdlibm hypot() implementations shouldn't potentially left-shift 2019-11-26 22:01:09 +00:00
e_hypotf.c The fdlibm hypot() implementations shouldn't potentially left-shift 2019-11-26 22:01:09 +00:00
e_hypotl.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
e_j0.c Replace calls to sin(x) and cos(x) with a single call to sincos(). 2019-02-10 08:46:07 +00:00
e_j0f.c Replace calls to sin(x) and cos(x) with a single call to sincos(). 2019-02-10 08:46:07 +00:00
e_j1.c Replace calls to sin(x) and cos(x) with a single call to sincos(). 2019-02-10 08:46:07 +00:00
e_j1f.c Replace calls to sin(x) and cos(x) with a single call to sincos(). 2019-02-10 08:46:07 +00:00
e_jn.c Replace calls to sin(x) and cos(x) with a single call to sincos(). 2019-02-10 08:46:07 +00:00
e_jnf.c According to POSIX.1-2008, the Bessel functions of second kind 2015-03-10 17:10:54 +00:00
e_lgamma_r.c The value small=2**-(p+3), where p is the precision, can be determine from 2014-10-09 22:39:52 +00:00
e_lgamma.c
e_lgammaf_r.c libm: remove unused variables 2016-10-05 17:04:58 +00:00
e_lgammaf.c
e_lgammal.c
e_log2.c
e_log2f.c
e_log10.c
e_log10f.c
e_log.c
e_logf.c
e_pow.c pow(3): Workaround possible signed shift Undefined Behavior. 2019-01-07 17:35:09 +00:00
e_powf.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
e_rem_pio2.c Centralize the complications for special efficient rounding to integers. 2018-07-20 12:42:24 +00:00
e_rem_pio2f.c Centralize the complications for special efficient rounding to integers. 2018-07-20 12:42:24 +00:00
e_remainder.c Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
e_remainderf.c Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
e_remainderl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
e_scalb.c
e_scalbf.c
e_sinh.c
e_sinhf.c
e_sinhl.c libm: remove unused variables for LDBL_MANT_DIG != 113 2016-09-30 20:20:07 +00:00
e_sqrt.c
e_sqrtf.c
e_sqrtl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
fenv-softfloat.h lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
imprecise.c msun: add ld80/ld128 powl, cpow, cpowf, cpowl from openbsd 2018-07-15 00:23:10 +00:00
k_cos.c
k_cosf.c
k_exp.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
k_expf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
k_log.h
k_logf.h
k_rem_pio2.c msun: Fix some old typos. 2018-12-31 15:43:06 +00:00
k_sin.c
k_sincos.h Implement sincos, sincosf, and sincosl. 2017-05-28 06:13:38 +00:00
k_sincosf.h Implement sincos, sincosf, and sincosl. 2017-05-28 06:13:38 +00:00
k_sincosl.h Get the fix in back by reverting the part accidentally included in r354491. 2019-11-07 23:57:48 +00:00
k_sinf.c
k_tan.c
k_tanf.c
math_private.h Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
math.h Add __isnan()/__isnanf() aliases for compatibility with glibc and CUDA 2019-11-02 16:59:53 +00:00
s_asinh.c
s_asinhf.c
s_asinhl.c
s_atan.c
s_atanf.c
s_atanl.c
s_carg.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cargf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cargl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cbrt.c libm: Include float.h to get LDBL_MANT_DIG 2018-12-28 01:34:08 +00:00
s_cbrtf.c
s_cbrtl.c
s_ccosh.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
s_ccoshf.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
s_ceil.c
s_ceilf.c
s_ceill.c
s_cexp.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cexpf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cimag.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cimagf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cimagl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_clog.c Add implementations for clog(3), clogf(3), and clog(3). 2018-05-13 09:54:34 +00:00
s_clogf.c Add implementations for clog(3), clogf(3), and clog(3). 2018-05-13 09:54:34 +00:00
s_clogl.c Add implementations for clog(3), clogf(3), and clog(3). 2018-05-13 09:54:34 +00:00
s_conj.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_conjf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_conjl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_copysign.c
s_copysignf.c
s_copysignl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cos.c
s_cosf.c
s_cosl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cpow.c Recommit r336497: Fix powl, cpow, cpowf, and cpowl imports from OpenBSD 2018-07-20 18:27:30 +00:00
s_cpowf.c Recommit r336497: Fix powl, cpow, cpowf, and cpowl imports from OpenBSD 2018-07-20 18:27:30 +00:00
s_cpowl.c Recommit r336497: Fix powl, cpow, cpowf, and cpowl imports from OpenBSD 2018-07-20 18:27:30 +00:00
s_cproj.c libm: Include float.h to get LDBL_MANT_DIG 2018-12-28 01:34:08 +00:00
s_cprojf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_cprojl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_creal.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_crealf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_creall.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_csinh.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
s_csinhf.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
s_csqrt.c Fix spurious and extra underflows and resulting inaccuracies for some cases 2018-07-19 15:04:10 +00:00
s_csqrtf.c Minor cleanups to csqrt*(), mostly in comments. 2018-07-17 12:01:59 +00:00
s_csqrtl.c Fix spurious and extra underflows and resulting inaccuracies for some cases 2018-07-19 15:04:10 +00:00
s_ctanh.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
s_ctanhf.c Add a macro nan_mix() and use it to get NaN results that are (bitwise) 2018-07-17 07:42:14 +00:00
s_erf.c libm: Include float.h to get LDBL_MANT_DIG 2018-12-28 01:34:08 +00:00
s_erff.c
s_exp2.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_exp2f.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_expm1.c Do not left-shift a negative number (inducing undefined behavior in 2019-09-25 18:50:57 +00:00
s_expm1f.c Do not left-shift a negative number (inducing undefined behavior in 2019-09-25 18:50:57 +00:00
s_fabs.c libm: fix some unused variable (rcsid) and dangling else warnings 2016-09-28 14:48:34 +00:00
s_fabsf.c
s_fabsl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fdim.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_finite.c
s_finitef.c
s_floor.c
s_floorf.c
s_floorl.c
s_fma.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fmaf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fmal.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fmax.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fmaxf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fmaxl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fmin.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fminf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_fminl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_frexp.c
s_frexpf.c
s_frexpl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_ilogb.c
s_ilogbf.c
s_ilogbl.c
s_isfinite.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_isnan.c Add __isnan()/__isnanf() aliases for compatibility with glibc and CUDA 2019-11-02 16:59:53 +00:00
s_isnormal.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_llrint.c
s_llrintf.c
s_llrintl.c
s_llround.c
s_llroundf.c
s_llroundl.c
s_log1p.c
s_log1pf.c
s_logb.c
s_logbf.c
s_logbl.c libm: fix some unused variable (rcsid) and dangling else warnings 2016-09-28 14:48:34 +00:00
s_lrint.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_lrintf.c
s_lrintl.c
s_lround.c msun: Silence new harmless -Wimplicit-int-float-conversion warnings 2019-10-08 21:39:51 +00:00
s_lroundf.c
s_lroundl.c
s_modf.c
s_modff.c
s_modfl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_nan.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_nearbyint.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_nextafter.c
s_nextafterf.c
s_nextafterl.c
s_nexttoward.c
s_nexttowardf.c
s_remquo.c Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
s_remquof.c Fix the conversion to use nan_mix() in r336362. fmod*(x, y), 2018-07-24 10:10:16 +00:00
s_remquol.c In C remquol() and thus also in C remainderl(), don't clobber the sign bit 2018-07-24 11:50:05 +00:00
s_rint.c
s_rintf.c
s_rintl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_round.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_roundf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_roundl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_scalbln.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_scalbn.c libm: fix some unused variable (rcsid) and dangling else warnings 2016-09-28 14:48:34 +00:00
s_scalbnf.c libm: fix some unused variable (rcsid) and dangling else warnings 2016-09-28 14:48:34 +00:00
s_scalbnl.c libm: fix some unused variable (rcsid) and dangling else warnings 2016-09-28 14:48:34 +00:00
s_signbit.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_signgam.c
s_significand.c
s_significandf.c
s_sin.c
s_sincos.c Implement sincos, sincosf, and sincosl. 2017-05-28 06:13:38 +00:00
s_sincosf.c Implement sincos, sincosf, and sincosl. 2017-05-28 06:13:38 +00:00
s_sincosl.c Implement sincos, sincosf, and sincosl. 2017-05-28 06:13:38 +00:00
s_sinf.c
s_sinl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_tan.c
s_tanf.c
s_tanh.c
s_tanhf.c
s_tanhl.c libm: remove unused variables for LDBL_MANT_DIG != 113 2016-09-30 20:20:07 +00:00
s_tanl.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_tgammaf.c lib: further adoption of SPDX licensing ID tags. 2017-11-26 02:00:33 +00:00
s_trunc.c
s_truncf.c
s_truncl.c
w_cabs.c
w_cabsf.c
w_cabsl.c
w_drem.c
w_dremf.c