diff options
author | Nick Clifton <nickc@redhat.com> | 2002-09-17 19:29:12 +0000 |
---|---|---|
committer | Nick Clifton <nickc@gcc.gnu.org> | 2002-09-17 19:29:12 +0000 |
commit | f1acdf8b0f9af8020d8eccc2862822e650e1b6d4 (patch) | |
tree | b463659545c5f10cfd49ff43db2507b17c483ef0 /gcc | |
parent | 24491a09505847e6e42b50917948ac5dc5780715 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 13 |
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) { |