diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-12-12 09:38:56 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-12-12 09:38:56 +0000 |
commit | 990457e26d9133fd068b39388fd68508fa83f840 (patch) | |
tree | 4987c888aa436f9bb7c2a6b24dc960bd3d0a5118 /libgcc | |
parent | cc2263b151d5eb3bf06dcd774a07a088bfdda296 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | libgcc/fixed-bit.c | 29 |
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; |