aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2001-01-05 20:30:40 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2001-01-05 20:30:40 +0000
commit18a7c2a7a1fd3ef6f769e9374931103589197f1d (patch)
treecd3bd6b19e670bfdf72cd1a246f86955d72cf95f /gcc
parentfcbd8ef220090816ab831029cf83dc50caa6a5b1 (diff)
downloadgcc-18a7c2a7a1fd3ef6f769e9374931103589197f1d.zip
gcc-18a7c2a7a1fd3ef6f769e9374931103589197f1d.tar.gz
gcc-18a7c2a7a1fd3ef6f769e9374931103589197f1d.tar.bz2
sh.md (movdf): When splitting load into pair of registers...
* config/sh/sh.md (movdf): When splitting load into pair of registers, don't clobber the register used in the address too early. From-SVN: r38722
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/sh/sh.md32
2 files changed, 29 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cba6dea..95d38f2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2001-01-05 Alexandre Oliva <aoliva@redhat.com>
+
+ * config/sh/sh.md (movdf): When splitting load into pair of
+ registers, don't clobber the register used in the address too
+ early.
+
2001-01-05 Jeffrey Oldham <oldham@codesourcery.com>
* varasm.c (mark_constant_pool): Improve initial comments.
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index c40f759..cd8c6d0 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -2745,15 +2745,29 @@
offset = 4;
mem = copy_rtx (mem);
PUT_MODE (mem, SImode);
- word0 = gen_rtx(SUBREG, SImode, regop, 0);
- emit_insn (store_p
- ? gen_movsi_ie (mem, word0) : gen_movsi_ie (word0, mem));
- emit_insn (gen_addsi3 (reg0, reg0, GEN_INT (offset)));
- mem = copy_rtx (mem);
- word1 = gen_rtx(SUBREG, SImode, regop, 1);
- emit_insn (store_p
- ? gen_movsi_ie (mem, word1) : gen_movsi_ie (word1, mem));
- emit_insn (gen_addsi3 (reg0, reg0, GEN_INT (-offset)));
+ word0 = alter_subreg (gen_rtx (SUBREG, SImode, regop, 0));
+ word1 = alter_subreg (gen_rtx (SUBREG, SImode, regop, 1));
+ if (store_p || ! refers_to_regno_p (REGNO (word0),
+ REGNO (word0) + 1, addr, 0))
+ {
+ emit_insn (store_p
+ ? gen_movsi_ie (mem, word0)
+ : gen_movsi_ie (word0, mem));
+ emit_insn (gen_addsi3 (reg0, reg0, GEN_INT (offset)));
+ mem = copy_rtx (mem);
+ emit_insn (store_p
+ ? gen_movsi_ie (mem, word1)
+ : gen_movsi_ie (word1, mem));
+ emit_insn (gen_addsi3 (reg0, reg0, GEN_INT (-offset)));
+ }
+ else
+ {
+ emit_insn (gen_addsi3 (reg0, reg0, GEN_INT (offset)));
+ emit_insn (gen_movsi_ie (word1, mem));
+ emit_insn (gen_addsi3 (reg0, reg0, GEN_INT (-offset)));
+ mem = copy_rtx (mem);
+ emit_insn (gen_movsi_ie (word0, mem));
+ }
DONE;
}
}