about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2015-06-24 15:12:03 +0000
committerJoseph Myers <joseph@codesourcery.com>2015-06-24 15:12:03 +0000
commit8475ab16848cf2adb6ce3446749c2f1d10233286 (patch)
treece32b378b0e67c8d52f6a6a63347ae4b3711d159
parent36870482d2a33e3b703bd74b52063594389e827a (diff)
downloadglibc-8475ab16848cf2adb6ce3446749c2f1d10233286.tar.gz
glibc-8475ab16848cf2adb6ce3446749c2f1d10233286.tar.xz
glibc-8475ab16848cf2adb6ce3446749c2f1d10233286.zip
Fix ldbl-128 expl missing underflows (bug 18586).
Similar to various other bugs in this area, the ldbl-128 expl
implementation does not raise the underflow exception for all
subnormal results, if the scaling down is exact although the actual
result is inexact.  This patch fixes this by forcing the exception in
this case (the tests that failed before and pass after the test are
already in the testsuite).

Tested for mips64.

	[BZ #18586]
	* sysdeps/ieee754/ldbl-128/e_expl.c (__ieee754_expl): Force
	underflow exception for small results.
-rw-r--r--ChangeLog6
-rw-r--r--NEWS2
-rw-r--r--sysdeps/ieee754/ldbl-128/e_expl.c10
3 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index b5e19b1817..b103dcdc26 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-24  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #18586]
+	* sysdeps/ieee754/ldbl-128/e_expl.c (__ieee754_expl): Force
+	underflow exception for small results.
+
 2015-06-24  Andrew Senkevich  <andrew.senkevich@intel.com>
 
 	* sysdeps/x86_64/fpu/Makefile (libmvec-support): Fixed files list.
diff --git a/NEWS b/NEWS
index aacd894c82..e8c84b88e0 100644
--- a/NEWS
+++ b/NEWS
@@ -24,7 +24,7 @@ Version 2.22
   18444, 18468, 18469, 18470, 18479, 18483, 18495, 18496, 18497, 18498,
   18507, 18512, 18513, 18519, 18520, 18522, 18527, 18528, 18529, 18530,
   18532, 18533, 18534, 18536, 18539, 18540, 18542, 18544, 18545, 18546,
-  18547, 18553, 18558, 18569, 18583.
+  18547, 18553, 18558, 18569, 18583, 18586.
 
 * Cache information can be queried via sysconf() function on s390 e.g. with
   _SC_LEVEL1_ICACHE_SIZE as argument.
diff --git a/sysdeps/ieee754/ldbl-128/e_expl.c b/sysdeps/ieee754/ldbl-128/e_expl.c
index b4b789658a..1cd095cb77 100644
--- a/sysdeps/ieee754/ldbl-128/e_expl.c
+++ b/sysdeps/ieee754/ldbl-128/e_expl.c
@@ -230,7 +230,15 @@ __ieee754_expl (long double x)
       if (!unsafe)
 	return result;
       else
-	return result * scale_u.d;
+	{
+	  result *= scale_u.d;
+	  if (result < LDBL_MIN)
+	    {
+	      long double force_underflow = result * result;
+	      math_force_eval (force_underflow);
+	    }
+	  return result;
+	}
     }
   /* Exceptional cases:  */
   else if (isless (x, himark))