aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOleg Endo <olegendo@gcc.gnu.org>2012-08-16 23:13:11 +0000
committerOleg Endo <olegendo@gcc.gnu.org>2012-08-16 23:13:11 +0000
commit043d627e0661cd1e09bfcfcdf90658ffef04af60 (patch)
treef17e8ff4cfc3a616f74cfd1d078d44e147ebd96c /gcc
parentf5a53fc7af14e981a5a6f1d6d9753673f04401f2 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/config/sh/sh.md10
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]));
}