about summary refs log tree commit diff
path: root/sysdeps/ieee754/ldbl-128
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-10-23 21:37:33 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-10-23 21:37:33 +0000
commitc643db8792102d1a2efad109f58139977d8608d6 (patch)
tree174813e539b6cdf509201237756ec2b02e2247ce /sysdeps/ieee754/ldbl-128
parent846d9a4a3acdb4939ca7bf6aed48f9f6f26911be (diff)
downloadglibc-c643db8792102d1a2efad109f58139977d8608d6.tar.gz
glibc-c643db8792102d1a2efad109f58139977d8608d6.tar.xz
glibc-c643db8792102d1a2efad109f58139977d8608d6.zip
Fix j1, jn missing errno setting on underflow (bug 18611).
j1 and jn can underflow for small arguments, but fail to set errno
when underflowing to 0.  This patch fixes them to set errno in that
case.

Tested for x86_64, x86, mips64 and powerpc.

	[BZ #18611]
	* sysdeps/ieee754/dbl-64/e_j1.c (__ieee754_j1): Set errno and
	avoid excess range and precision on underflow.
	* sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_jn): Likewise.
	* sysdeps/ieee754/flt-32/e_j1f.c (__ieee754_j1f): Likewise.
	* sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_jnf): Likewise.
	* sysdeps/ieee754/ldbl-128/e_j1l.c (__ieee754_j1l): Set errno on
	underflow.
	* sysdeps/ieee754/ldbl-128/e_jnl.c (__ieee754_jnl): Likewise.
	* sysdeps/ieee754/ldbl-128ibm/e_jnl.c (__ieee754_jnl): Likewise.
	* sysdeps/ieee754/ldbl-96/e_j1l.c (__ieee754_j1l): Likewise.
	* sysdeps/ieee754/ldbl-96/e_jnl.c (__ieee754_jnl): Likewise.
	* math/auto-libm-test-in: Do not allow missing errno setting for
	tests of j1 and jn.
	* math/auto-libm-test-out: Regenerated.
Diffstat (limited to 'sysdeps/ieee754/ldbl-128')
-rw-r--r--sysdeps/ieee754/ldbl-128/e_j1l.c2
-rw-r--r--sysdeps/ieee754/ldbl-128/e_jnl.c5
2 files changed, 6 insertions, 1 deletions
diff --git a/sysdeps/ieee754/ldbl-128/e_j1l.c b/sysdeps/ieee754/ldbl-128/e_j1l.c
index 70ecf5eae3..f5b04c073d 100644
--- a/sysdeps/ieee754/ldbl-128/e_j1l.c
+++ b/sysdeps/ieee754/ldbl-128/e_j1l.c
@@ -701,6 +701,8 @@ __ieee754_j1l (long double x)
     {
       long double ret = x * 0.5L;
       math_check_force_underflow (ret);
+      if (ret == 0)
+	__set_errno (ERANGE);
       return ret;
     }
   if (xx <= 2.0L)
diff --git a/sysdeps/ieee754/ldbl-128/e_jnl.c b/sysdeps/ieee754/ldbl-128/e_jnl.c
index ee5a16b62e..98669e6e3e 100644
--- a/sysdeps/ieee754/ldbl-128/e_jnl.c
+++ b/sysdeps/ieee754/ldbl-128/e_jnl.c
@@ -296,7 +296,10 @@ __ieee754_jnl (int n, long double x)
       ret = b;
   }
   if (ret == 0)
-    ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
+    {
+      ret = __copysignl (LDBL_MIN, ret) * LDBL_MIN;
+      __set_errno (ERANGE);
+    }
   else
     math_check_force_underflow (ret);
   return ret;