diff options
author | Jeffrey A Law <law@cygnus.com> | 1997-10-21 16:04:57 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-10-21 10:04:57 -0600 |
commit | 5d29a95f92918a9354b8b23624a67d2d08ffa6bb (patch) | |
tree | c1ab6b7233fd0f7a9cd9724226f10e227f1c0856 | |
parent | 3bf1b08254ade026581bee54226b2f42d7ec3482 (diff) | |
download | gcc-5d29a95f92918a9354b8b23624a67d2d08ffa6bb.zip gcc-5d29a95f92918a9354b8b23624a67d2d08ffa6bb.tar.gz gcc-5d29a95f92918a9354b8b23624a67d2d08ffa6bb.tar.bz2 |
mn10300.c (expand_epilogue): Rework to handle register restores in "ret" and "retf" instructions correctly.
* mn10300.c (expand_epilogue): Rework to handle register restores
in "ret" and "retf" instructions correctly.
From-SVN: r16132
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/mn10300/mn10300.c | 20 |
2 files changed, 22 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e50aab8..c349ff9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Tue Oct 21 10:06:40 1997 Jeffrey A Law (law@cygnus.com) + + * mn10300.c (expand_epilogue): Rework to handle register restores + in "ret" and "retf" instructions correctly. + Mon Oct 20 16:47:08 1997 Jim Wilson <wilson@cygnus.com> * expmed.c (extract_bit_field): Don't make flag_force_mem disable diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c index d6fd820..7706061 100644 --- a/gcc/config/mn10300/mn10300.c +++ b/gcc/config/mn10300/mn10300.c @@ -535,7 +535,21 @@ expand_epilogue () size = get_frame_size () + current_function_outgoing_args_size; size += (current_function_outgoing_args_size ? 4 : 0); - /* Cut back the stack. */ + /* Maybe cut back the stack, except for the register save area. + + If the frame pointer exists, then use the frame pointer to + cut back the stack. + + If the stack size + register save area is more than 255 bytes, + then the stack must be cut back here since the size + register + save size is too big for a ret/retf instruction. + + Else leave it alone, it will be cut back as part of the + ret/retf instruction, or there wasn't any stack to begin with. + + Under no circumstanes should the register save area be + deallocated here, that would leave a window where an interrupt + could occur and trash the register save area. */ if (frame_pointer_needed) { emit_move_insn (stack_pointer_rtx, frame_pointer_rtx); @@ -543,7 +557,7 @@ expand_epilogue () } else if ((regs_ever_live[2] || regs_ever_live[3] || regs_ever_live[6] || regs_ever_live[7]) - && size > 255) + && size + 16 > 255) { emit_insn (gen_addsi3 (stack_pointer_rtx, stack_pointer_rtx, @@ -559,7 +573,7 @@ expand_epilogue () if (regs_ever_live[2] || regs_ever_live[3] || regs_ever_live[6] || regs_ever_live[7] || frame_pointer_needed) - emit_jump_insn (gen_return_internal_regs (GEN_INT (size))); + emit_jump_insn (gen_return_internal_regs (GEN_INT (size + 16))); else { if (size) |