]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix ldbl-128 lrintl, lroundl missing exceptions for 32-bit long (bug 19085).
authorJoseph Myers <joseph@codesourcery.com>
Wed, 7 Oct 2015 16:10:59 +0000 (16:10 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Wed, 7 Oct 2015 16:10:59 +0000 (16:10 +0000)
The ldbl-128 implementations of lrintl and lroundl miss "invalid"
exceptions on systems with 32-bit long for arguments that overflow
long but have exponent below 48.  This patch fixes this by rearranging
the sequence of tests in the code so the exponent < 48 case is only
used for exponents that don't overflow long.

Tested for mips64 (n32 and n64).

[BZ #19085]
* sysdeps/ieee754/ldbl-128/s_lrintl.c (__lrintl): Move test for
exponent below 48 inside case for non-overflowing exponent.
* sysdeps/ieee754/ldbl-128/s_lroundl.c (__lroundl): Likewise.

ChangeLog
NEWS
sysdeps/ieee754/ldbl-128/s_lrintl.c
sysdeps/ieee754/ldbl-128/s_lroundl.c

index e1761b946bde3bda5d3c8e14bfc66443e7688226..1f461c33926c7111c218c38331dc3e36fc2fefb0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2015-10-07  Joseph Myers  <joseph@codesourcery.com>
+
+       [BZ #19085]
+       * sysdeps/ieee754/ldbl-128/s_lrintl.c (__lrintl): Move test for
+       exponent below 48 inside case for non-overflowing exponent.
+       * sysdeps/ieee754/ldbl-128/s_lroundl.c (__lroundl): Likewise.
+
 2015-10-07  Florian Weimer  <fweimer@redhat.com>
 
        * iconvdata/cp737.h (from_idx): Add const.
diff --git a/NEWS b/NEWS
index a0a91b5cd9f7ec6fda340e6994f3b3dbb5b8a3e3..30284ba6a33e3e858011b8dabbc0ba5958f8f860 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -18,7 +18,7 @@ Version 2.23
   18820, 18823, 18824, 18825, 18857, 18863, 18870, 18872, 18873, 18875,
   18887, 18921, 18951, 18952, 18956, 18961, 18966, 18967, 18969, 18970,
   18977, 18980, 18981, 18985, 19003, 19012, 19016, 19018, 19032, 19046,
-  19049, 19050, 19059, 19071, 19076, 19077, 19078, 19079.
+  19049, 19050, 19059, 19071, 19076, 19077, 19078, 19079, 19085.
 
 * The obsolete header <regexp.h> has been removed.  Programs that require
   this header must be updated to use <regex.h> instead.
index b0e0cfc16b7d953997915df8b48f6a326324be9c..d0b0aeb5c99fb8cd37d2d7649967ea7ab8769a9b 100644 (file)
@@ -45,20 +45,20 @@ __lrintl (long double x)
   i0 &= 0x0000ffffffffffffLL;
   i0 |= 0x0001000000000000LL;
 
-  if (j0 < 48)
+  if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
     {
-      w = two112[sx] + x;
-      t = w - two112[sx];
-      GET_LDOUBLE_WORDS64 (i0, i1, t);
-      j0 = ((i0 >> 48) & 0x7fff) - 0x3fff;
-      i0 &= 0x0000ffffffffffffLL;
-      i0 |= 0x0001000000000000LL;
+      if (j0 < 48)
+       {
+         w = two112[sx] + x;
+         t = w - two112[sx];
+         GET_LDOUBLE_WORDS64 (i0, i1, t);
+         j0 = ((i0 >> 48) & 0x7fff) - 0x3fff;
+         i0 &= 0x0000ffffffffffffLL;
+         i0 |= 0x0001000000000000LL;
 
-      result = (j0 < 0 ? 0 : i0 >> (48 - j0));
-    }
-  else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
-    {
-      if (j0 >= 112)
+         result = (j0 < 0 ? 0 : i0 >> (48 - j0));
+       }
+      else if (j0 >= 112)
        result = ((long int) i0 << (j0 - 48)) | (i1 << (j0 - 112));
       else
        {
index 8421609676dcb2878a2c0b5d7016c14383cabbb1..64b285e2916feb9109f4983c8cdeeab04cba822b 100644 (file)
@@ -37,19 +37,19 @@ __lroundl (long double x)
   i0 &= 0x0000ffffffffffffLL;
   i0 |= 0x0001000000000000LL;
 
-  if (j0 < 48)
+  if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
     {
-      if (j0 < 0)
-       return j0 < -1 ? 0 : sign;
-      else
+      if (j0 < 48)
        {
-         i0 += 0x0000800000000000LL >> j0;
-         result = i0 >> (48 - j0);
+         if (j0 < 0)
+           return j0 < -1 ? 0 : sign;
+         else
+           {
+             i0 += 0x0000800000000000LL >> j0;
+             result = i0 >> (48 - j0);
+           }
        }
-    }
-  else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
-    {
-      if (j0 >= 112)
+      else if (j0 >= 112)
        result = ((long int) i0 << (j0 - 48)) | (i1 << (j0 - 112));
       else
        {