aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1993-12-25 09:28:45 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1993-12-25 09:28:45 -0500
commit9e69be8c656d6bc4a6159e546c2297d28b844572 (patch)
treea6ee34070916a92b0ece4bc1e3fc039eca36712b /gcc
parent14d4a67a3239f8bd5ec0d1b327e6c3118cc5ce74 (diff)
downloadgcc-9e69be8c656d6bc4a6159e546c2297d28b844572.zip
gcc-9e69be8c656d6bc4a6159e546c2297d28b844572.tar.gz
gcc-9e69be8c656d6bc4a6159e546c2297d28b844572.tar.bz2
(set_nonzero_bits_and_sign_copies, nonzero_bits): Fix errors in
SHORT_IMMEDIATES_SIGN_EXTEND code. From-SVN: r6315
Diffstat (limited to 'gcc')
-rw-r--r--gcc/combine.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/gcc/combine.c b/gcc/combine.c
index 801d26c..8c27d89 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -728,7 +728,7 @@ set_nonzero_bits_and_sign_copies (x, set)
&& INTVAL (src) > 0
&& 0 != (INTVAL (src)
& ((HOST_WIDE_INT) 1
- << GET_MODE_BITSIZE (GET_MODE (x)))))
+ << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
src = GEN_INT (INTVAL (src)
| ((HOST_WIDE_INT) (-1)
<< GET_MODE_BITSIZE (GET_MODE (x))));
@@ -6559,7 +6559,7 @@ nonzero_bits (x, mode)
&& INTVAL (tem) > 0
&& 0 != (INTVAL (tem)
& ((HOST_WIDE_INT) 1
- << GET_MODE_BITSIZE (GET_MODE (x)))))
+ << (GET_MODE_BITSIZE (GET_MODE (x)) - 1))))
tem = GEN_INT (INTVAL (tem)
| ((HOST_WIDE_INT) (-1)
<< GET_MODE_BITSIZE (GET_MODE (x))));
@@ -6574,11 +6574,9 @@ nonzero_bits (x, mode)
case CONST_INT:
#ifdef SHORT_IMMEDIATES_SIGN_EXTEND
/* If X is negative in MODE, sign-extend the value. */
- if (INTVAL (x) > 0
- && 0 != (INTVAL (x)
- & ((HOST_WIDE_INT) 1 << GET_MODE_BITSIZE (GET_MODE (x)))))
- return (INTVAL (x)
- | ((HOST_WIDE_INT) (-1) << GET_MODE_BITSIZE (GET_MODE (x))));
+ if (INTVAL (x) > 0 && mode_width < BITS_PER_WORD
+ && 0 != (INTVAL (x) & ((HOST_WIDE_INT) 1 << (mode_width - 1))))
+ return (INTVAL (x) | ((HOST_WIDE_INT) (-1) << mode_width));
#endif
return INTVAL (x);