aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-10-06 22:06:21 +0000
committerRichard Stallman <rms@gnu.org>1993-10-06 22:06:21 +0000
commit33724a9fb2d8f62576e56d51b9182bf7a2a939f2 (patch)
treee70e3222a110079afd6989d692bef548e156e13f /gcc/config
parentac7d29191de09ad944ab33023d4eb6852403c70c (diff)
downloadgcc-33724a9fb2d8f62576e56d51b9182bf7a2a939f2.zip
gcc-33724a9fb2d8f62576e56d51b9182bf7a2a939f2.tar.gz
gcc-33724a9fb2d8f62576e56d51b9182bf7a2a939f2.tar.bz2
(output_move_double): Special code for pushing from an address that uses the sp.
(output_move_double): Special code for pushing from an address that uses the sp. Use PUSHOP for pushes, not POPOP. From-SVN: r5647
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/ns32k/ns32k.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/gcc/config/ns32k/ns32k.c b/gcc/config/ns32k/ns32k.c
index b4a4931..2abe404 100644
--- a/gcc/config/ns32k/ns32k.c
+++ b/gcc/config/ns32k/ns32k.c
@@ -244,7 +244,7 @@ char *
output_move_double (operands)
rtx *operands;
{
- enum anon1 { REGOP, OFFSOP, POPOP, CNSTOP, RNDOP } optype0, optype1;
+ enum anon1 { REGOP, OFFSOP, PUSHOP, CNSTOP, RNDOP } optype0, optype1;
rtx latehalf[2];
/* First classify both operands. */
@@ -254,7 +254,7 @@ output_move_double (operands)
else if (offsettable_memref_p (operands[0]))
optype0 = OFFSOP;
else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
- optype0 = POPOP;
+ optype0 = PUSHOP;
else
optype0 = RNDOP;
@@ -266,7 +266,7 @@ output_move_double (operands)
else if (offsettable_memref_p (operands[1]))
optype1 = OFFSOP;
else if (GET_CODE (XEXP (operands[1], 0)) == PRE_DEC)
- optype1 = POPOP;
+ optype1 = PUSHOP;
else
optype1 = RNDOP;
@@ -307,10 +307,18 @@ output_move_double (operands)
else
latehalf[1] = operands[1];
+ /* If insn is effectively movd N(sp),tos then we will do the
+ high word first. We should use the adjusted operand 1 (which is N+4(sp))
+ for the low word as well, to compensate for the first decrement of sp.
+ Given this, it doesn't matter which half we do "first". */
+ if (optype0 == PUSHOP
+ && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
+ && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
+ operands[1] = latehalf[1];
+
/* If one or both operands autodecrementing,
do the two words, high-numbered first. */
-
- if (optype0 == POPOP || optype1 == POPOP)
+ else if (optype0 == PUSHOP || optype1 == PUSHOP)
{
output_asm_insn (singlemove_string (latehalf), latehalf);
return singlemove_string (operands);