summaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-12 09:38:56 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-12-12 09:38:56 +0000
commit990457e26d9133fd068b39388fd68508fa83f840 (patch)
tree4987c888aa436f9bb7c2a6b24dc960bd3d0a5118 /libgcc
parentcc2263b151d5eb3bf06dcd774a07a088bfdda296 (diff)
downloadgcc-990457e26d9133fd068b39388fd68508fa83f840.tar.gz
PR libgcc/55451
* 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
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog6
-rw-r--r--libgcc/fixed-bit.c29
2 files changed, 17 insertions, 18 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 115dca98cf6..95b95b1d193 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -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
diff --git a/libgcc/fixed-bit.c b/libgcc/fixed-bit.c
index 84e58155ccd..71243c1295a 100644
--- a/libgcc/fixed-bit.c
+++ b/libgcc/fixed-bit.c
@@ -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;