diff options
author | Joseph Myers <joseph@codesourcery.com> | 2014-05-14 12:38:56 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2014-05-14 12:38:56 +0000 |
commit | 1a84c3d6d4bc43c92b6531b09d732e2e9c750dea (patch) | |
tree | f58a4fd81f814868dad8426ca0da232b618e0ac2 /sysdeps | |
parent | 01dbacd22a8d5e0053f8d0cf13a80286b6cfe79b (diff) | |
download | glibc-1a84c3d6d4bc43c92b6531b09d732e2e9c750dea.tar.gz |
Fix log1pl (LDBL_MAX) in FE_UPWARD mode (bug 16564).
Bug 16564 is spurious overflow of log1pl (LDBL_MAX) in FE_UPWARD mode,
resulting from log1pl adding 1 to its argument (for arguments not
close to 0), which overflows in that mode. This patch fixes this by
avoiding adding 1 to large arguments (precisely what counts as large
depends on the floating-point format).
Tested x86_64 and x86, and spot-checked log1pl tests on mips64 and
powerpc64.
[BZ #16564]
* sysdeps/i386/fpu/s_log1pl.S (__log1pl): Do not add 1 to positive
arguments with exponent 65 or above.
* sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Do not add 1 to
arguments 0x1p113L or above.
* sysdeps/ieee754/ldbl-128ibm/s_log1pl.c (__log1pl): Do not add 1
to arguments 0x1p107L or above.
* sysdeps/x86_64/fpu/s_log1pl.S (__log1pl): Do not add 1 to
positive arguments with exponent 65 or above.
* math/auto-libm-test-in: Add more tests of log1p.
* math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/i386/fpu/s_log1pl.S | 7 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_log1pl.c | 5 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/s_log1pl.c | 5 | ||||
-rw-r--r-- | sysdeps/x86_64/fpu/s_log1pl.S | 7 |
4 files changed, 20 insertions, 4 deletions
diff --git a/sysdeps/i386/fpu/s_log1pl.S b/sysdeps/i386/fpu/s_log1pl.S index 93c07b637c..d2d5d3bc7c 100644 --- a/sysdeps/i386/fpu/s_log1pl.S +++ b/sysdeps/i386/fpu/s_log1pl.S @@ -53,12 +53,17 @@ ENTRY(__log1pl) sahf jnc 2f + movzwl 4+8(%esp), %eax + xorb $0x80, %ah + cmpl $0xc040, %eax + jae 5f + #ifdef PIC faddl one@GOTOFF(%edx) #else faddl one #endif - fyl2x +5: fyl2x ret 2: fyl2xp1 diff --git a/sysdeps/ieee754/ldbl-128/s_log1pl.c b/sysdeps/ieee754/ldbl-128/s_log1pl.c index d8d89f0a8c..4a30af62fa 100644 --- a/sysdeps/ieee754/ldbl-128/s_log1pl.c +++ b/sysdeps/ieee754/ldbl-128/s_log1pl.c @@ -144,7 +144,10 @@ __log1pl (long double xm1) return xm1; } - x = xm1 + 1.0L; + if (xm1 >= 0x1p113L) + x = xm1; + else + x = xm1 + 1.0L; /* log1p(-1) = -inf */ if (x <= 0.0L) diff --git a/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c b/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c index a346383052..e4bb6e8d9b 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c @@ -140,7 +140,10 @@ __log1pl (long double xm1) if (((hx & 0x7fffffff) | lx) == 0) return xm1; - x = xm1 + 1.0L; + if (xm1 >= 0x1p107L) + x = xm1; + else + x = xm1 + 1.0L; /* log1p(-1) = -inf */ if (x <= 0.0L) diff --git a/sysdeps/x86_64/fpu/s_log1pl.S b/sysdeps/x86_64/fpu/s_log1pl.S index b4dbcdfa1a..af3024ad55 100644 --- a/sysdeps/x86_64/fpu/s_log1pl.S +++ b/sysdeps/x86_64/fpu/s_log1pl.S @@ -52,8 +52,13 @@ ENTRY(__log1pl) andb $1,%ah jz 2f + movzwl 8+8(%rsp), %eax + xorb $0x80, %ah + cmpl $0xc040, %eax + jae 5f + faddl MO(one) - fyl2x +5: fyl2x ret 2: fyl2xp1 |