This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Fix ldbl-128ibm expl overflow in non-default rounding modes (bug 19078) [committed]
- From: Joseph Myers <joseph at codesourcery dot com>
- To: <libc-alpha at sourceware dot org>
- Date: Tue, 6 Oct 2015 17:38:32 +0000
- Subject: Fix ldbl-128ibm expl overflow in non-default rounding modes (bug 19078) [committed]
- Authentication-results: sourceware.org; auth=none
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. Committed.
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.
diff --git a/sysdeps/ieee754/ldbl-128ibm/w_expl.c b/sysdeps/ieee754/ldbl-128ibm/w_expl.c
index fb5c8d3..c9d44b6 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;
--
Joseph S. Myers
joseph@codesourcery.com