diff options
author | Joseph Myers <joseph@codesourcery.com> | 2015-10-06 17:37:49 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2015-10-06 17:37:49 +0000 |
commit | 6c9678ebd42358f931100130a368fafe375a0ba2 (patch) | |
tree | 31a8266da420a9aacd6054bb0ec9c29b5223ea7d /sysdeps/ieee754/ldbl-128ibm/w_expl.c | |
parent | b3364d05892be0170e8f67689736bb9b7597bc94 (diff) | |
download | glibc-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.c | 7 |
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; |