about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2018-01-10 17:59:01 +0000
committerJoseph Myers <joseph@codesourcery.com>2018-01-10 17:59:01 +0000
commitb303185df9b4f3d097956fe566a32aed4f85b127 (patch)
tree27e9766663018a3a577bceafea04a9b17d0cbe6d
parentee61d0285029d35ebb03bdd548ccce948ebfaea5 (diff)
downloadglibc-b303185df9b4f3d097956fe566a32aed4f85b127.tar.gz
glibc-b303185df9b4f3d097956fe566a32aed4f85b127.tar.xz
glibc-b303185df9b4f3d097956fe566a32aed4f85b127.zip
Fix ldbl-128ibm log1pl (-qNaN) spurious "invalid" exception (bug 22693).
The ldbl-128ibm implementation of log1pl does ordered comparisons on a
negative qNaN argument, so resulting in spurious "invalid" exceptions
(for soft-float powerpc; hard-float only avoids this because of GCC
bug 58684 meaning ordered comparison instructions never get
generated).  This patch fixes this by arranging for the test for NaN
or infinity arguments to handle negative arguments as well.

Tested for powerpc (soft float).

	[BZ #22693]
	* sysdeps/ieee754/ldbl-128ibm/s_log1pl.c (__log1pl): Handle
	negative arguments in test for NaN or infinity argument.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_log1pl.c4
2 files changed, 8 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index ceb8333dd1..3025edf83a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2018-01-10  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #22693]
+	* sysdeps/ieee754/ldbl-128ibm/s_log1pl.c (__log1pl): Handle
+	negative arguments in test for NaN or infinity argument.
+
 2018-01-10  Dmitry V. Levin  <ldv@altlinux.org>
 
 	* po/libc.pot: Regenerate.
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c b/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c
index 5457892a98..e499c9f604 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_log1pl.c
@@ -131,8 +131,8 @@ __log1pl (long double xm1)
   /* Test for NaN or infinity input. */
   xhi = ldbl_high (xm1);
   EXTRACT_WORDS (hx, lx, xhi);
-  if (hx >= 0x7ff00000)
-    return xm1 + xm1;
+  if ((hx & 0x7fffffff) >= 0x7ff00000)
+    return xm1 + xm1 * xm1;
 
   /* log1p(+- 0) = +- 0.  */
   if (((hx & 0x7fffffff) | lx) == 0)