about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--NEWS2
-rw-r--r--math/libm-test.inc22
-rw-r--r--sysdeps/ieee754/ldbl-96/s_scalblnl.c4
4 files changed, 35 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index d671b11533..081e0b5f0f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
 
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 <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))