about summary refs log tree commit diff
path: root/sysdeps/ieee754/ldbl-128ibm/w_expl.c
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 /sysdeps/ieee754/ldbl-128ibm/w_expl.c
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.
Diffstat (limited to 'sysdeps/ieee754/ldbl-128ibm/w_expl.c')
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/w_expl.c7
1 files changed, 2 insertions, 5 deletions
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;