aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i860/i860.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-06-28 17:51:19 +0000
committerRichard Stallman <rms@gnu.org>1993-06-28 17:51:19 +0000
commite58d5c618e71aad29c552a33e22056b1453f73fc (patch)
tree70b9596cd653891e1d483cf7a9a52e6d7190709d /gcc/config/i860/i860.c
parentd7473723961b29eb3e6c99079f7e427e2417794e (diff)
downloadgcc-e58d5c618e71aad29c552a33e22056b1453f73fc.zip
gcc-e58d5c618e71aad29c552a33e22056b1453f73fc.tar.gz
gcc-e58d5c618e71aad29c552a33e22056b1453f73fc.tar.bz2
(output_move_double): Handle reg[n,n+1] = mem[reg[n] + reg[n+1]].
From-SVN: r4786
Diffstat (limited to 'gcc/config/i860/i860.c')
-rw-r--r--gcc/config/i860/i860.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/config/i860/i860.c b/gcc/config/i860/i860.c
index 0652e08..e8f20cc 100644
--- a/gcc/config/i860/i860.c
+++ b/gcc/config/i860/i860.c
@@ -680,6 +680,19 @@ output_move_double (operands)
else if (optype0 == REGOP && optype1 != REGOP
&& reg_overlap_mentioned_p (operands[0], operands[1]))
{
+ if (reg_mentioned_p (op0, XEXP (op1, 0))
+ && reg_mentioned_p (latehalf[0], XEXP (op1, 0)))
+ {
+ /* If both halves of dest are used in the src memory address,
+ add the two regs and put them in the low reg (op0).
+ Then it works to load latehalf first. */
+ rtx xops[2];
+ xops[0] = latehalf[0];
+ xops[1] = op0;
+ output_asm_insn ("adds %1,%0,%1", xops);
+ operands[1] = gen_rtx (MEM, DImode, latehalf[0]);
+ latehalf[1] = adj_offsettable_operand (operands[1], 4);
+ }
/* Do the late half first. */
output_asm_insn (singlemove_string (latehalf), latehalf);
/* Then clobber. */