Fix overflow condition.
authordrepper <drepper>
Tue, 11 Nov 1997 23:45:44 +0000 (23:45 +0000)
committerdrepper <drepper>
Tue, 11 Nov 1997 23:45:44 +0000 (23:45 +0000)
sysdeps/libm-ieee754/s_llrintf.c
sysdeps/libm-ieee754/s_llrintl.c
sysdeps/libm-ieee754/s_llround.c
sysdeps/libm-ieee754/s_llroundf.c
sysdeps/libm-ieee754/s_llroundl.c
sysdeps/libm-ieee754/s_lrint.c
sysdeps/libm-ieee754/s_lrintf.c
sysdeps/libm-ieee754/s_lrintl.c
sysdeps/libm-ieee754/s_lround.c
sysdeps/libm-ieee754/s_lroundf.c
sysdeps/libm-ieee754/s_lroundl.c

index f73afd0..83cb7fd 100644 (file)
@@ -47,7 +47,7 @@ __llrintf (float x)
   i0 = i & 0x7fffff;
   i0 |= 0x800000;
 
-  if (j0 < (int32_t) (sizeof (long long int) * 8))
+  if (j0 < (int32_t) (sizeof (long long int) * 8) - 1)
     {
       if (j0 < -1)
        return 0;
index d3b9b12..2aeaa1e 100644 (file)
@@ -45,12 +45,12 @@ __llrintl (long double x)
   sx = (se >> 15) & 1;
   j0 = (se & 0x7fff) - 0x3fff;
 
-  if (j0 < (int32_t) (8 * sizeof (long long int)))
+  if (j0 < (int32_t) (8 * sizeof (long long int)) - 1)
     {
       if (j0 < -1)
        return 0;
       else if (j0 >= 63)
-       result = ((long long int) i0 << (j0 - 31)) | (i1 << (j0 - 63));
+       result = (((long long int) i0 << 32) | i1) << (j0 - 63);
       else
        {
          w = two63[sx] + x;
index 1deb630..92ce10f 100644 (file)
@@ -48,17 +48,20 @@ __llround (double x)
          result = i0 >> (20 - j0);
        }
     }
-  else if (j0 < (int32_t) (8 * sizeof (long long int)))
+  else if (j0 < (int32_t) (8 * sizeof (long long int)) - 1)
     {
       if (j0 >= 52)
-       result = ((long long int) i0 << (j0 - 20)) | (i1 << (j0 - 52));
+       result = (((long long int) i0 << 32) | i1) << (j0 - 52);
       else
        {
          u_int32_t j = i1 + (0x80000000 >> (j0 - 20));
          if (j < i1)
            ++i0;
 
-         result = ((long long int) i0 << (j0 - 20)) | (j >> (52 - j0));
+         if (j0 == 20)
+           result = (long long int) i0;
+         else
+           result = ((long long int) i0 << (j0 - 20)) | (j >> (52 - j0));
        }
     }
   else
index 87ed1a3..9aad81f 100644 (file)
@@ -37,12 +37,12 @@ __llroundf (float x)
   i &= 0x7fffff;
   i |= 0x800000;
 
-  if (j0 < (int32_t) (8 * sizeof (long long int)))
+  if (j0 < (int32_t) (8 * sizeof (long long int)) - 1)
     {
       if (j0 < 0)
        return j0 < -1 ? 0 : sign;
       else if (j0 >= 23)
-       result = (long int) i << (j0 - 23);
+       result = (long long int) i << (j0 - 23);
       else
        {
          i += 0x400000 >> j0;
index 959b1e3..4a537c8 100644 (file)
@@ -52,17 +52,20 @@ __llroundl (long double x)
          result = j >> (31 - j0);
        }
     }
-  else if (j0 < (int32_t) (8 * sizeof (long long int)))
+  else if (j0 < (int32_t) (8 * sizeof (long long int)) - 1)
     {
       if (j0 >= 63)
-       result = ((long long int) i0 << (j0 - 31)) | (i1 << (j0 - 63));
+       result = (((long long int) i0 << 32) | i1) << (j0 - 63);
       else
        {
          u_int32_t j = i1 + (0x80000000 >> (j0 - 31));
          if (j < i1)
            ++i0;
 
-         result = ((long long int) i0 << (j0 - 31)) | (j >> (63 - j0));
+         if (j0 == 31)
+           result = (long long int) i0;
+         else
+           result = ((long long int) i0 << (j0 - 31)) | (j >> (63 - j0));
        }
     }
   else
index 0ccd06a..8fe7d24 100644 (file)
@@ -62,7 +62,7 @@ __lrint (double x)
          result = i0 >> (20 - j0);
        }
     }
-  else if (j0 < (int32_t) (8 * sizeof (long int)))
+  else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
     {
       if (j0 >= 52)
        result = ((long int) i0 << (j0 - 20)) | (i1 << (j0 - 52));
@@ -75,7 +75,7 @@ __lrint (double x)
          i0 |= 0x100000;
          j0 = ((i0 >> 20) & 0x7ff) - 0x3ff;
 
-         result = ((long int) i0 << (j0 - 20)) | (j >> (52 - j0));
+         result = ((long int) i0 << (j0 - 20)) | (i1 >> (52 - j0));
        }
     }
   else
index 6d74b36..d80d81a 100644 (file)
@@ -47,7 +47,7 @@ __lrintf (float x)
   i0 = i & 0x7fffff;
   i0 |= 0x800000;
 
-  if (j0 < (int32_t) (sizeof (long int) * 8))
+  if (j0 < (int32_t) (sizeof (long int) * 8) - 1)
     {
       if (j0 < -1)
        return 0;
index 5a41427..673cf3d 100644 (file)
@@ -59,7 +59,7 @@ __lrintl (long double x)
          result = i0 >> (31 - j0);
        }
     }
-  else if (j0 < (int32_t) (8 * sizeof (long int)))
+  else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
     {
       if (j0 >= 63)
        result = ((long int) i0 << (j0 - 31)) | (i1 << (j0 - 63));
index a6468ba..49be12f 100644 (file)
@@ -48,7 +48,7 @@ __lround (double x)
          result = i0 >> (20 - j0);
        }
     }
-  else if (j0 < (int32_t) (8 * sizeof (long int)))
+  else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
     {
       if (j0 >= 52)
        result = ((long int) i0 << (j0 - 20)) | (i1 << (j0 - 52));
index 0d3889c..df1d242 100644 (file)
@@ -37,7 +37,7 @@ __lroundf (float x)
   i &= 0x7fffff;
   i |= 0x800000;
 
-  if (j0 < (int32_t) (8 * sizeof (long int)))
+  if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
     {
       if (j0 < 0)
        return j0 < -1 ? 0 : sign;
index d8b7db4..3bdac83 100644 (file)
@@ -52,7 +52,7 @@ __lroundl (long double x)
          result = j >> (31 - j0);
        }
     }
-  else if (j0 < (int32_t) (8 * sizeof (long int)))
+  else if (j0 < (int32_t) (8 * sizeof (long int)) - 1)
     {
       if (j0 >= 63)
        result = ((long int) i0 << (j0 - 31)) | (i1 << (j0 - 63));