diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | math/libm-test.inc | 22 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-96/s_scalblnl.c | 4 |
4 files changed, 35 insertions, 3 deletions
@@ -1,3 +1,13 @@ +2015-01-12 Joseph Myers <joseph@codesourcery.com> + + [BZ #17834] + * sysdeps/ieee754/ldbl-96/s_scalblnl.c (two63): Change value to + 0x1p63L. + (__scalblnl): Get new exponent of adjusted subnormal value from ES + not HX. + * math/libm-test.inc (scalbn_test_data): Add more tests. + (scalbln_test_data): Likewise. + 2015-01-12 Adhemerval Zanella <azanella@linux.vnet.ibm.com> Stefani Seibold <stefani@seibold.net> @@ -17,7 +17,7 @@ Version 2.21 17633, 17634, 17635, 17647, 17653, 17657, 17658, 17664, 17665, 17668, 17682, 17717, 17719, 17722, 17723, 17724, 17725, 17732, 17733, 17744, 17745, 17746, 17747, 17748, 17775, 17777, 17780, 17781, 17782, 17791, - 17793, 17796, 17797, 17806 + 17793, 17796, 17797, 17806, 17834 * Added support for TSX lock elision of pthread mutexes on powerpc32, powerpc64 and powerpc64le. This may improve lock scaling of existing programs on diff --git a/math/libm-test.inc b/math/libm-test.inc index 8db1dd00a3..34f83c64f6 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -9124,6 +9124,17 @@ static const struct test_fi_f_data scalbn_test_data[] = TEST_fi_f (scalbn, 1, 0L, 1, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, min_value / 2, 0, min_value / 2, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, -min_value / 2, 0, -min_value / 2, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, min_value / 2, 1, min_value, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, -min_value / 2, 1, -min_value, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, min_value * 0x0.ffffp0, 0, min_value * 0x0.ffffp0, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, -min_value * 0x0.ffffp0, 0, -min_value * 0x0.ffffp0, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, min_subnorm_value, 0, min_subnorm_value, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, -min_subnorm_value, 0, -min_subnorm_value, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, min_subnorm_value, MANT_DIG, min_value, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, -min_subnorm_value, MANT_DIG, -min_value, NO_INEXACT_EXCEPTION), + TEST_fi_f (scalbn, 1, INT_MAX, plus_oflow, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION), TEST_fi_f (scalbn, 1, INT_MIN, plus_uflow, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION), TEST_fi_f (scalbn, max_value, INT_MAX, plus_oflow, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION), @@ -9171,6 +9182,17 @@ static const struct test_fl_f_data scalbln_test_data[] = TEST_fl_f (scalbln, 1, 0L, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_fl_f (scalbln, min_value / 2, 0, min_value / 2, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, -min_value / 2, 0, -min_value / 2, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, min_value / 2, 1, min_value, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, -min_value / 2, 1, -min_value, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, min_value * 0x0.ffffp0, 0, min_value * 0x0.ffffp0, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, -min_value * 0x0.ffffp0, 0, -min_value * 0x0.ffffp0, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, min_subnorm_value, 0, min_subnorm_value, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, -min_subnorm_value, 0, -min_subnorm_value, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, min_subnorm_value, MANT_DIG, min_value, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, -min_subnorm_value, MANT_DIG, -min_value, NO_INEXACT_EXCEPTION), + TEST_fl_f (scalbln, 1, INT_MAX, plus_oflow, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION|ERRNO_PLUS_OFLOW), TEST_fl_f (scalbln, 1, INT_MIN, plus_uflow, INEXACT_EXCEPTION|UNDERFLOW_EXCEPTION|ERRNO_PLUS_UFLOW), TEST_fl_f (scalbln, max_value, INT_MAX, plus_oflow, INEXACT_EXCEPTION|OVERFLOW_EXCEPTION|ERRNO_PLUS_OFLOW), diff --git a/sysdeps/ieee754/ldbl-96/s_scalblnl.c b/sysdeps/ieee754/ldbl-96/s_scalblnl.c index fca8470cdc..5c2f38eafd 100644 --- a/sysdeps/ieee754/ldbl-96/s_scalblnl.c +++ b/sysdeps/ieee754/ldbl-96/s_scalblnl.c @@ -25,7 +25,7 @@ #include <math_private.h> static const long double -two63 = 4.50359962737049600000e+15, +two63 = 0x1p63L, twom63 = 1.08420217248550443400e-19, huge = 1.0e+4900L, tiny = 1.0e-4900L; @@ -40,7 +40,7 @@ __scalblnl (long double x, long int n) if ((lx|(hx&0x7fffffff))==0) return x; /* +-0 */ x *= two63; GET_LDOUBLE_EXP(es,x); - k = (hx&0x7fff) - 63; + k = (es&0x7fff) - 63; } if (__builtin_expect(k==0x7fff, 0)) return x+x; /* NaN or Inf */ if (__builtin_expect(n< -50000, 0)) |