]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* config/sh/sh.md (movdf): When splitting load into pair of
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Jan 2001 20:30:40 +0000 (20:30 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Jan 2001 20:30:40 +0000 (20:30 +0000)
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

gcc/ChangeLog
gcc/config/sh/sh.md

index cba6dea9484fbd42691acafff1d8c4991f2aef05..95d38f2de6a000bd8a4542230319ee6fdf8601c2 100644 (file)
@@ -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.
index c40f7596f388c2f37c85e83c5d958942e798f893..cd8c6d04f94b918b1a7bb0e52505a4749d003ba3 100644 (file)
            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;
        }
     }