From ce9c5b3e955746a9187ffde9b16feea4a357c86a Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Mon, 30 Jun 2014 17:38:16 +0000 Subject: [PATCH] Fix ldbl-128 expm1l spurious underflow (bug 16539). This patch fixes spurious underflows from ldbl-128 expm1l, as reported in and exposed by the tests added for such a bug in the x86 / x86-64 version. The bug and fix are essentially the same, so no separate bug is filed in Bugzilla. Tested for mips64. [BZ #16539] * sysdeps/ieee754/ldbl-128/s_expm1l.c: Include . (__expm1l): Return argument unchanged when small but not subnormal. --- ChangeLog | 5 +++++ sysdeps/ieee754/ldbl-128/s_expm1l.c | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/ChangeLog b/ChangeLog index 2ef0a7489d..8897d9ce14 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2014-06-30 Joseph Myers + [BZ #16539] + * sysdeps/ieee754/ldbl-128/s_expm1l.c: Include . + (__expm1l): Return argument unchanged when small but not + subnormal. + * soft-fp/op-1.h (_FP_UNPACK_RAW_1): Rename local variables to include macro name. (_FP_UNPACK_RAW_1_P): Likewise. diff --git a/sysdeps/ieee754/ldbl-128/s_expm1l.c b/sysdeps/ieee754/ldbl-128/s_expm1l.c index 1c12109511..f708af504c 100644 --- a/sysdeps/ieee754/ldbl-128/s_expm1l.c +++ b/sysdeps/ieee754/ldbl-128/s_expm1l.c @@ -54,6 +54,7 @@ #include +#include #include #include @@ -136,6 +137,10 @@ __expm1l (long double x) if (x < minarg) return (4.0/big - 1.0L); + /* Avoid internal underflow when result does not underflow. */ + if (fabsl (x) < 0x1p-113L && fabsl (x) >= LDBL_MIN) + return x; + /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */ xx = C1 + C2; /* ln 2. */ px = __floorl (0.5 + x / xx);