PR libgcc/55451
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Dec 2012 09:38:56 +0000 (09:38 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 12 Dec 2012 09:38:56 +0000 (09:38 +0000)
* fixed-bit.c (FIXED_SSADD, FIXED_SSSUB, FIXED_SSNEG): Avoid
undefined signed overflows.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194439 138bc75d-0d04-0410-961f-82ee72b054a4

libgcc/ChangeLog
libgcc/fixed-bit.c

index 115dca9..95b95b1 100644 (file)
@@ -1,3 +1,9 @@
+2012-12-12  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libgcc/55451
+       * fixed-bit.c (FIXED_SSADD, FIXED_SSSUB, FIXED_SSNEG): Avoid
+       undefined signed overflows.
+
 2012-12-09  Uros Bizjak  <ubizjak@gmail.com>
 
        PR target/55344
index 84e5815..71243c1 100644 (file)
@@ -1,5 +1,5 @@
 /* This is a software fixed-point library.
-   Copyright (C) 2007, 2009, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2007, 2009, 2011, 2012 Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -80,15 +80,14 @@ FIXED_SSADD (FIXED_C_TYPE a, FIXED_C_TYPE b)
   INT_C_TYPE x, y, z;
   memcpy (&x, &a, FIXED_SIZE);
   memcpy (&y, &b, FIXED_SIZE);
-  z = x + y;
+  z = x + (UINT_C_TYPE) y;
   if ((((x ^ y) >> I_F_BITS) & 1) == 0)
     {
       if (((z ^ x) >> I_F_BITS) & 1)
         {
-          z = 1;
-          z = z << I_F_BITS;
-          if (x >= 0)
-            z--;
+         z = ((UINT_C_TYPE) 1) << I_F_BITS;
+         if (x >= 0)
+           z -= (UINT_C_TYPE) 1;
         }
     }
 #if HAVE_PADDING_BITS
@@ -152,15 +151,14 @@ FIXED_SSSUB (FIXED_C_TYPE a, FIXED_C_TYPE b)
   INT_C_TYPE x, y, z;
   memcpy (&x, &a, FIXED_SIZE);
   memcpy (&y, &b, FIXED_SIZE);
-  z = x - y;
+  z = x - (UINT_C_TYPE) y;
   if (((x ^ y) >> I_F_BITS) & 1)
     {
       if (((z ^ x) >> I_F_BITS) & 1)
         {
-          z = 1;
-          z = z << I_F_BITS;
-          if (x >= 0)
-            z--;
+         z = ((UINT_C_TYPE) 1) << I_F_BITS;
+         if (x >= 0)
+           z -= (UINT_C_TYPE) 1;
         }
     }
 #if HAVE_PADDING_BITS
@@ -569,16 +567,11 @@ FIXED_SSNEG (FIXED_C_TYPE a)
   INT_C_TYPE x, y, z;
   memcpy (&y, &a, FIXED_SIZE);
   x = 0;
-  z = x - y;
+  z = x - (UINT_C_TYPE) y;
   if (((x ^ y) >> I_F_BITS) & 1)
     {
       if (((z ^ x) >> I_F_BITS) & 1)
-        {
-          z = 1;
-          z = z << I_F_BITS;
-          if (x >= 0)
-            z--;
-        }
+       z = (((UINT_C_TYPE) 1) << I_F_BITS) - 1;
     }
 #if HAVE_PADDING_BITS
   z = z << PADDING_BITS;