diff options
author | Richard Stallman <rms@gnu.org> | 1993-10-06 22:06:21 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1993-10-06 22:06:21 +0000 |
commit | 33724a9fb2d8f62576e56d51b9182bf7a2a939f2 (patch) | |
tree | e70e3222a110079afd6989d692bef548e156e13f /gcc/config | |
parent | ac7d29191de09ad944ab33023d4eb6852403c70c (diff) | |
download | gcc-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.c | 18 |
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); |