aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2002-09-17 19:29:12 +0000
committerNick Clifton <nickc@gcc.gnu.org>2002-09-17 19:29:12 +0000
commitf1acdf8b0f9af8020d8eccc2862822e650e1b6d4 (patch)
treeb463659545c5f10cfd49ff43db2507b17c483ef0 /gcc
parent24491a09505847e6e42b50917948ac5dc5780715 (diff)
downloadgcc-f1acdf8b0f9af8020d8eccc2862822e650e1b6d4.zip
gcc-f1acdf8b0f9af8020d8eccc2862822e650e1b6d4.tar.gz
gcc-f1acdf8b0f9af8020d8eccc2862822e650e1b6d4.tar.bz2
(output_return_instruction): Do not writeback the stack pointer when it is being loaded.
(output_return_instruction): Do not writeback the stack pointer when it is being loaded. (arm_output_epilogue): Likewise. From-SVN: r57256
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c13
2 files changed, 18 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 34852fe..7834815 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-09-17 Nick Clifton <nickc@redhat.com>
+
+ * config/arm/arm.c (output_return_instruction): Do not
+ writeback the stack pointer when it is being loaded.
+ (arm_output_epilogue): Likewise.
+
2002-09-17 Kazu Hirata <kazu@cs.umass.edu>
* optabs.c (prepare_cmp_insn): Let emit_library_call_value
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index acdce8e..41eb93a 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -7325,6 +7325,8 @@ output_return_instruction (operand, really_return, reverse)
/* Generate the load multiple instruction to restore the registers. */
if (frame_pointer_needed)
sprintf (instr, "ldm%sea\t%%|fp, {", conditional);
+ else if (live_regs_mask & (1 << SP_REGNUM))
+ sprintf (instr, "ldm%sfd\t%%|sp, {", conditional);
else
sprintf (instr, "ldm%sfd\t%%|sp!, {", conditional);
@@ -7736,7 +7738,16 @@ arm_output_epilogue (really_return)
asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM);
}
else if (saved_regs_mask)
- print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
+ {
+ if (saved_regs_mask & (1 << SP_REGNUM))
+ /* Note - write back to the stack register is not enabled
+ (ie "ldmfd sp!..."). We know that the stack pointer is
+ in the list of registers and if we add writeback the
+ instruction becomes UNPREDICTABLE. */
+ print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
+ else
+ print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
+ }
if (current_function_pretend_args_size)
{