about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-10-06 17:37:49 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-10-06 17:37:49 +0000
commit6c9678ebd42358f931100130a368fafe375a0ba2 (patch)
tree31a8266da420a9aacd6054bb0ec9c29b5223ea7d
parentb3364d05892be0170e8f67689736bb9b7597bc94 (diff)
downloadglibc-6c9678ebd42358f931100130a368fafe375a0ba2.tar.gz
glibc-6c9678ebd42358f931100130a368fafe375a0ba2.tar.xz
glibc-6c9678ebd42358f931100130a368fafe375a0ba2.zip
Fix ldbl-128ibm expl overflow in non-default rounding modes (bug 19078).
The ldbl-128ibm expl wrapper checks the argument to determine when to
call __kernel_standard_l, thereby overriding overflowing results from
__ieee754_expl that could otherwise (given appropriately patched
libgcc) be correct for the rounding mode.  This patch changes it to
check the result of __ieee754_expl instead, as other versions of this
wrapper do.

Tested for powerpc.

	[BZ #19078]
	* sysdeps/ieee754/ldbl-128ibm/w_expl.c (o_thres): Remove variable.
	(u_thres): Likewise.
	(__expl): Determine whether to call __kernel_standard_l based on
	value of result, not argument.
-rw-r--r--ChangeLog6
-rw-r--r--NEWS2
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/w_expl.c7
3 files changed, 9 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index 2752bd2323..9b762b3a0c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2015-10-06  Joseph Myers  <joseph@codesourcery.com>
 
+	[BZ #19078]
+	* sysdeps/ieee754/ldbl-128ibm/w_expl.c (o_thres): Remove variable.
+	(u_thres): Likewise.
+	(__expl): Determine whether to call __kernel_standard_l based on
+	value of result, not argument.
+
 	* math/libm-test.inc (scalb_test_data): Add more expectations for
 	the "inexact" exception.
 
diff --git a/NEWS b/NEWS
index e3c0795fe5..5ad75a32fd 100644
--- a/NEWS
+++ b/NEWS
@@ -18,7 +18,7 @@ Version 2.23
   18820, 18823, 18824, 18825, 18857, 18863, 18870, 18872, 18873, 18875,
   18887, 18921, 18951, 18952, 18956, 18961, 18966, 18967, 18969, 18970,
   18977, 18980, 18981, 18985, 19003, 19012, 19016, 19018, 19032, 19046,
-  19049, 19050, 19059, 19071, 19076, 19077.
+  19049, 19050, 19059, 19071, 19076, 19077, 19078.
 
 * The obsolete header <regexp.h> has been removed.  Programs that require
   this header must be updated to use <regex.h> instead.
diff --git a/sysdeps/ieee754/ldbl-128ibm/w_expl.c b/sysdeps/ieee754/ldbl-128ibm/w_expl.c
index fb5c8d3629..c9d44b61dd 100644
--- a/sysdeps/ieee754/ldbl-128ibm/w_expl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/w_expl.c
@@ -2,9 +2,6 @@
 #include <math_private.h>
 #include <math_ldbl_opt.h>
 
-static const long double o_thres = 709.78271289338399678773454114191496482L;
-static const long double u_thres = -744.44007192138126231410729844608163411L;
-
 long double __expl(long double x)	/* wrapper exp  */
 {
   long double z;
@@ -13,9 +10,9 @@ long double __expl(long double x)	/* wrapper exp  */
     return z;
   if (isfinite(x))
     {
-      if (x >= o_thres)
+      if (!isfinite (z))
 	return __kernel_standard_l(x,x,206); /* exp overflow  */
-      else if (x <= u_thres)
+      else if (z == 0.0L)
 	return __kernel_standard_l(x,x,207); /* exp underflow  */
     }
   return z;