diff options
| author | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-01-05 20:30:40 +0000 |
|---|---|---|
| committer | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-01-05 20:30:40 +0000 |
| commit | 60cb217d0a5f389aff93d2cfa3fc75a3e18d2f9d (patch) | |
| tree | cd3bd6b19e670bfdf72cd1a246f86955d72cf95f | |
| parent | af295e6f6733b1a9650652f64f0d5cff91cba911 (diff) | |
| download | ppe42-gcc-60cb217d0a5f389aff93d2cfa3fc75a3e18d2f9d.tar.gz ppe42-gcc-60cb217d0a5f389aff93d2cfa3fc75a3e18d2f9d.zip | |
* config/sh/sh.md (movdf): When splitting load into pair of
registers, don't clobber the register used in the address too
early.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@38722 138bc75d-0d04-0410-961f-82ee72b054a4
| -rw-r--r-- | gcc/ChangeLog | 6 | ||||
| -rw-r--r-- | gcc/config/sh/sh.md | 32 |
2 files changed, 29 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cba6dea9484..95d38f2de6a 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 c40f7596f38..cd8c6d04f94 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; } } |

