aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2014-01-03 13:57:45 +0000
committerAndreas Schwab <schwab@gcc.gnu.org>2014-01-03 13:57:45 +0000
commite864837ad6b324d0025bc4a1a06cf480da34deb3 (patch)
treec542c3c6c56003a7d08bcf086a2d360f5ad21eb2
parent56a34230f19c63e9203c3d1b2c3ff8c3f6e0bb7f (diff)
downloadgcc-e864837ad6b324d0025bc4a1a06cf480da34deb3.zip
gcc-e864837ad6b324d0025bc4a1a06cf480da34deb3.tar.gz
gcc-e864837ad6b324d0025bc4a1a06cf480da34deb3.tar.bz2
m68k.c (handle_move_double): Handle pushes with overlapping registers also for registers other than the...
* config/m68k/m68k.c (handle_move_double): Handle pushes with overlapping registers also for registers other than the stack pointer. From-SVN: r206317
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/m68k/m68k.c10
2 files changed, 11 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a5e8ee2..1cb81b7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-01-03 Andreas Schwab <schwab@linux-m68k.org>
+
+ * config/m68k/m68k.c (handle_move_double): Handle pushes with
+ overlapping registers also for registers other than the stack
+ pointer.
+
2014-01-03 Marek Polacek <polacek@redhat.com>
PR other/59661
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 25b8580..f20d071 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -3328,12 +3328,12 @@ handle_move_double (rtx operands[2],
latehalf[1] = adjust_address (operands[1], SImode, 0);
}
- /* If insn is effectively movd N(sp),-(sp) 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. */
+ /* If insn is effectively movd N(REG),-(REG) then we will do the high
+ word first. We should use the adjusted operand 1 (which is N+4(REG))
+ for the low word as well, to compensate for the first decrement of
+ REG. */
if (optype0 == PUSHOP
- && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
- && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
+ && reg_overlap_mentioned_p (XEXP (XEXP (operands[0], 0), 0), operands[1]))
operands[1] = middlehalf[1] = latehalf[1];
/* For (set (reg:DI N) (mem:DI ... (reg:SI N) ...)),