diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/expmed.c | 12 |
2 files changed, 15 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1a359d..5842b6a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-05-08 Richard Guenther <rguenther@suse.de> + + PR middle-end/48908 + PR middle-end/48905 + * expmed.c (expand_shift_1): Compute adjusted constant shift + amount manually. + 2011-05-08 Eric Botcazou <ebotcazou@adacore.com> * config/avr/avr.c (print_operand_address): Fix invalid RTL access. diff --git a/gcc/expmed.c b/gcc/expmed.c index 4e1ea3a..18a6592 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -2142,10 +2142,14 @@ expand_shift_1 (enum tree_code code, enum machine_mode mode, rtx shifted, rtx temp1; new_amount = op1; - other_amount - = simplify_gen_binary (MINUS, GET_MODE (op1), - GEN_INT (GET_MODE_BITSIZE (mode)), - op1); + if (CONST_INT_P (op1)) + other_amount = GEN_INT (GET_MODE_BITSIZE (mode) + - INTVAL (op1)); + else + other_amount + = simplify_gen_binary (MINUS, GET_MODE (op1), + GEN_INT (GET_MODE_BITSIZE (mode)), + op1); shifted = force_reg (mode, shifted); |