diff options
author | Oleg Endo <olegendo@gcc.gnu.org> | 2012-08-16 23:13:11 +0000 |
---|---|---|
committer | Oleg Endo <olegendo@gcc.gnu.org> | 2012-08-16 23:13:11 +0000 |
commit | 043d627e0661cd1e09bfcfcdf90658ffef04af60 (patch) | |
tree | f17e8ff4cfc3a616f74cfd1d078d44e147ebd96c /gcc/config | |
parent | f5a53fc7af14e981a5a6f1d6d9753673f04401f2 (diff) | |
download | gcc-043d627e0661cd1e09bfcfcdf90658ffef04af60.zip gcc-043d627e0661cd1e09bfcfcdf90658ffef04af60.tar.gz gcc-043d627e0661cd1e09bfcfcdf90658ffef04af60.tar.bz2 |
re PR target/54089 ([SH] Refactor shift patterns)
PR target/54089
* config/sh/sh.md (ashlsi3_d): Do not split if it would result
in a T_REG clobber. Correct comment.
(ashlsi3_n): Correct comment.
From-SVN: r190457
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/sh/sh.md | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index 5d6fc84..f3c0a8e 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -3746,7 +3746,8 @@ label: (match_operand:SI 2 "shift_count_operand" "r")))] "TARGET_DYNSHIFT" "shld %2,%0" - "&& (CONST_INT_P (operands[2]) && ! sh_dynamicalize_shift_p (operands[2]))" + "&& CONST_INT_P (operands[2]) && ! sh_dynamicalize_shift_p (operands[2]) + && ! sh_ashlsi_clobbers_t_reg_p (operands[2])" [(const_int 0)] { if (satisfies_constraint_P27 (operands[2])) @@ -3759,7 +3760,9 @@ label: /* This must happen before reload, otherwise the constant will be moved into a register due to the "r" constraint, after which this split cannot be done anymore. - Unfortunately the move insn will not always be eliminated. */ + Unfortunately the move insn will not always be eliminated. + Also, here we must not create a shift sequence that clobbers the + T_REG. */ emit_move_insn (operands[0], operands[1]); gen_shifty_op (ASHIFT, operands); DONE; @@ -3782,8 +3785,7 @@ label: if (sh_dynamicalize_shift_p (operands[2]) && can_create_pseudo_p ()) { /* If this pattern was picked and dynamic shifts are supported, switch - to dynamic shift pattern before reload. However, we must not - create a shift sequence that clobbers the T_REG. */ + to dynamic shift pattern before reload. */ operands[2] = force_reg (SImode, operands[2]); emit_insn (gen_ashlsi3_d (operands[0], operands[1], operands[2])); } |