about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-10-29 23:09:51 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-10-29 23:09:51 +0000
commitaf1b2fd08388a3beec3ee7eaa30646d9c002824e (patch)
treeecf8b652021682fc9054064b8ae504b93f72155d
parent68b7f7df0cc9f13a0f6c182208fe7e74c3387412 (diff)
downloadglibc-af1b2fd08388a3beec3ee7eaa30646d9c002824e.tar.gz
glibc-af1b2fd08388a3beec3ee7eaa30646d9c002824e.tar.xz
glibc-af1b2fd08388a3beec3ee7eaa30646d9c002824e.zip
Fix ldbl-128 log1pl (-qNaN) spurious "invalid" exception (bug 19189).
The ldbl-128 version of log1pl raises a spurious "invalid" exception
for a -qNaN argument.  This patch fixes this by making the initial
check for infinities and NaNs handle arguments of both signs in such a
way that NaNs result in a NaN being returned (quietly if the input NaN
was quiet) while +Inf results in +Inf being returned and -Inf results
in a qNaN being returned with "invalid" exception raised.

Tested for mips64.

	[BZ #19189]
	* sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Make check for
	non-finite argument handle arguments with negative sign.
-rw-r--r--ChangeLog4
-rw-r--r--NEWS2
-rw-r--r--sysdeps/ieee754/ldbl-128/s_log1pl.c4
3 files changed, 7 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 42c1701131..3d3440fe64 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2015-10-29  Joseph Myers  <joseph@codesourcery.com>
 
+	[BZ #19189]
+	* sysdeps/ieee754/ldbl-128/s_log1pl.c (__log1pl): Make check for
+	non-finite argument handle arguments with negative sign.
+
 	* math/libm-test.inc (j0_test_data): Do not test sign of zero
 	result from infinite argument.
 	(j1_test_data): Likewise.
diff --git a/NEWS b/NEWS
index ae89162d81..654217c49f 100644
--- a/NEWS
+++ b/NEWS
@@ -21,7 +21,7 @@ Version 2.23
   18966, 18967, 18969, 18970, 18977, 18980, 18981, 18982, 18985, 19003,
   19007, 19012, 19016, 19018, 19032, 19046, 19048, 19049, 19050, 19059,
   19071, 19074, 19076, 19077, 19078, 19079, 19085, 19086, 19088, 19094,
-  19095, 19124, 19125, 19129, 19134, 19137, 19156, 19174, 19181.
+  19095, 19124, 19125, 19129, 19134, 19137, 19156, 19174, 19181, 19189.
 
 * A defect in the malloc implementation, present since glibc 2.15 (2012) or
   glibc 2.10 via --enable-experimental-malloc (2009), could result in the
diff --git a/sysdeps/ieee754/ldbl-128/s_log1pl.c b/sysdeps/ieee754/ldbl-128/s_log1pl.c
index 9806ab6d63..b348f41e55 100644
--- a/sysdeps/ieee754/ldbl-128/s_log1pl.c
+++ b/sysdeps/ieee754/ldbl-128/s_log1pl.c
@@ -130,8 +130,8 @@ __log1pl (long double xm1)
   /* Test for NaN or infinity input. */
   u.value = xm1;
   hx = u.parts32.w0;
-  if (hx >= 0x7fff0000)
-    return xm1;
+  if ((hx & 0x7fffffff) >= 0x7fff0000)
+    return xm1 + fabsl (xm1);
 
   /* log1p(+- 0) = +- 0.  */
   if (((hx & 0x7fffffff) == 0)