diff --git a/ChangeLog b/ChangeLog index d671b11533..081e0b5f0f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2015-01-12 Joseph Myers + + [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 Stefani Seibold diff --git a/NEWS b/NEWS index 35d397d151..e5fb0a0c43 100644 --- a/NEWS +++ b/NEWS @@ -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 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))