aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOleg Endo <olegendo@gcc.gnu.org>2012-08-21 23:34:54 +0000
committerOleg Endo <olegendo@gcc.gnu.org>2012-08-21 23:34:54 +0000
commit082ea1dcd5541bcbda512a1ba758997e54e3ae26 (patch)
tree08d8b1ddf0f7cf20cea6df24ddf79766ffaddf13 /gcc
parent1aee89910ada0e1d9ab68263e441341038bf9cad (diff)
downloadgcc-082ea1dcd5541bcbda512a1ba758997e54e3ae26.zip
gcc-082ea1dcd5541bcbda512a1ba758997e54e3ae26.tar.gz
gcc-082ea1dcd5541bcbda512a1ba758997e54e3ae26.tar.bz2
re PR target/39423 ([SH] performance regression: lost mov @(disp,Rn))
PR target/39423 * config/sh/sh.md (*movhi_index_disp): Add support for SH2A movu.w insn. PR target/39423 * gcc.target/sh/pr39423-2.c: New. From-SVN: r190579
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/sh/sh.md33
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/sh/pr39423-2.c14
4 files changed, 52 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7400fe8..30d2335 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-21 Oleg Endo <olegendo@gcc.gnu.org>
+
+ PR target/39423
+ * config/sh/sh.md (*movhi_index_disp): Add support for SH2A movu.w insn.
+
2012-08-21 H.J. Lu <hongjiu.lu@intel.com>
PR middle-end/54332
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index d38fd20..bc2a6c1 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -5793,12 +5793,35 @@ label:
(clobber (reg:SI T_REG))]
"TARGET_SH1"
"#"
- "&& 1"
- [(parallel [(set (match_dup 0) (sign_extend:SI (match_dup 1)))
- (clobber (reg:SI T_REG))])
- (set (match_dup 0) (zero_extend:SI (match_dup 2)))]
+ "&& can_create_pseudo_p ()"
+ [(const_int 0)]
{
- operands[2] = gen_lowpart (HImode, operands[0]);
+ rtx mem = operands[1];
+ rtx plus0_rtx = XEXP (mem, 0);
+ rtx plus1_rtx = XEXP (plus0_rtx, 0);
+ rtx mult_rtx = XEXP (plus1_rtx, 0);
+
+ rtx op_1 = XEXP (mult_rtx, 0);
+ rtx op_2 = GEN_INT (exact_log2 (INTVAL (XEXP (mult_rtx, 1))));
+ rtx op_3 = XEXP (plus1_rtx, 1);
+ rtx op_4 = XEXP (plus0_rtx, 1);
+ rtx op_5 = gen_reg_rtx (SImode);
+ rtx op_6 = gen_reg_rtx (SImode);
+ rtx op_7 = replace_equiv_address (mem, gen_rtx_PLUS (SImode, op_6, op_4));
+
+ emit_insn (gen_ashlsi3 (op_5, op_1, op_2));
+ emit_insn (gen_addsi3 (op_6, op_5, op_3));
+
+ /* On SH2A the movu.w insn can be used for zero extending loads. */
+ if (TARGET_SH2A)
+ emit_insn (gen_zero_extendhisi2 (operands[0], op_7));
+ else
+ {
+ emit_insn (gen_extendhisi2 (operands[0], op_7));
+ emit_insn (gen_zero_extendhisi2 (operands[0],
+ gen_lowpart (HImode, operands[0])));
+ }
+ DONE;
})
(define_insn_and_split "*movsi_index_disp"
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 9bdd4f8..6724380 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-08-21 Oleg Endo <olegendo@gcc.gnu.org>
+
+ PR target/39423
+ * gcc.target/sh/pr39423-2.c: New.
+
2012-08-21 Marc Glisse <marc.glisse@inria.fr>
* gcc.dg/tree-ssa/forwprop-19.c: New testcase.
diff --git a/gcc/testsuite/gcc.target/sh/pr39423-2.c b/gcc/testsuite/gcc.target/sh/pr39423-2.c
new file mode 100644
index 0000000..8e71505
--- /dev/null
+++ b/gcc/testsuite/gcc.target/sh/pr39423-2.c
@@ -0,0 +1,14 @@
+/* Check that displacement addressing is used for indexed addresses with a
+ small offset, instead of re-calculating the index and that the movu.w
+ instruction is used on SH2A. */
+/* { dg-do compile { target "sh*-*-*" } } */
+/* { dg-options "-O2" } */
+/* { dg-skip-if "" { "sh*-*-*" } { "*" } { "-m2a*" } } */
+/* { dg-final { scan-assembler-not "add\t#1" } } */
+/* { dg-final { scan-assembler "movu.w" } } */
+
+int
+test_00 (unsigned short tab[], int index)
+{
+ return tab[index + 1];
+}