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 | |
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')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/sh/sh.md | 10 |
2 files changed, 14 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0d094a4..af3bb6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,11 @@ -2012-08-17 Hans-Peter Nilsson <hp@axis.com> +2012-08-16 Oleg Endo <olegendo@gcc.gnu.org> + + 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. + +2012-08-16 Hans-Peter Nilsson <hp@axis.com> PR middle-end/54261 * optabs.c (expand_atomic_fetch_op): Save and restore code when 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])); } |