diff options
author | David S. Miller <davem@pierdol.cobaltmicro.com> | 1998-08-22 00:11:24 +0000 |
---|---|---|
committer | David S. Miller <davem@gcc.gnu.org> | 1998-08-21 17:11:24 -0700 |
commit | 994099bb20f7487fff0ec18b343245cc33191696 (patch) | |
tree | fc4876e2233b0960b9ca3a698aa3735aaf83b426 /gcc | |
parent | a00c936aaa8321a03b82ce0e394c8ebab4c6c9a4 (diff) | |
download | gcc-994099bb20f7487fff0ec18b343245cc33191696.zip gcc-994099bb20f7487fff0ec18b343245cc33191696.tar.gz gcc-994099bb20f7487fff0ec18b343245cc33191696.tar.bz2 |
sparc.md (TFmode splits): Handle destination registers being referenced in the address correctly.
* config/sparc/sparc.md (TFmode splits): Handle destination
registers being referenced in the address correctly.
From-SVN: r21901
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.md | 18 |
2 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0c72f92..319d314 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Fri Aug 21 23:07:46 1998 David S. Miller <davem@pierdol.cobaltmicro.com> + + * config/sparc/sparc.md (TFmode splits): Handle destination + registers being referenced in the address correctly. + Fri Aug 21 19:31:31 1998 Alexandre Petit-Bianco <apbianco@cygnus.com> * tree.def (LABELED_BLOCK_EXPR, EXIT_BLOCK_EXPR): New tree nodes. diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index 365d163..9796ec7 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -3333,12 +3333,26 @@ rtx word1 = change_address (operands[1], DFmode, plus_constant_for_output (XEXP (word0, 0), 8)); rtx dest1, dest2; + int self_reference = reg_mentioned_p (operands[0], + XEXP (XEXP (word1, 0), 0)); /* Ugly, but gen_highpart will crap out here for 32-bit targets. */ dest1 = gen_rtx_SUBREG (DFmode, operands[0], WORDS_BIG_ENDIAN == 0); dest2 = gen_rtx_SUBREG (DFmode, operands[0], WORDS_BIG_ENDIAN != 0); - emit_insn (gen_movdf (dest1, word0)); - emit_insn (gen_movdf (dest2, word1)); + + /* Now output, ordering such that we don't clobber any registers + mentioned in the address. */ + if (self_reference != 0 + && WORDS_BIG_ENDIAN) + { + emit_insn (gen_movdf (dest2, word1)); + emit_insn (gen_movdf (dest1, word0)); + } + else + { + emit_insn (gen_movdf (dest1, word0)); + emit_insn (gen_movdf (dest2, word1)); + } DONE; }") |