aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid S. Miller <davem@pierdol.cobaltmicro.com>1998-08-22 00:11:24 +0000
committerDavid S. Miller <davem@gcc.gnu.org>1998-08-21 17:11:24 -0700
commit994099bb20f7487fff0ec18b343245cc33191696 (patch)
treefc4876e2233b0960b9ca3a698aa3735aaf83b426 /gcc
parenta00c936aaa8321a03b82ce0e394c8ebab4c6c9a4 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/sparc/sparc.md18
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;
}")