diff options
author | Eric Christopher <echristo@apple.com> | 2007-05-27 19:13:07 +0000 |
---|---|---|
committer | Eric Christopher <echristo@gcc.gnu.org> | 2007-05-27 19:13:07 +0000 |
commit | bcb2d7014243ff98890679761404ba7648c98450 (patch) | |
tree | 124c16f290771ff78dd41f61de46963b36b7755c | |
parent | d51157deeeaa2095a645626d4136ba9dd02285c4 (diff) | |
download | gcc-bcb2d7014243ff98890679761404ba7648c98450.zip gcc-bcb2d7014243ff98890679761404ba7648c98450.tar.gz gcc-bcb2d7014243ff98890679761404ba7648c98450.tar.bz2 |
rs6000.c (rs6000_emit_prologue): Update sp_offset depending on stack size.
2007-05-27 Eric Christopher <echristo@apple.com>
* config/rs6000/rs6000.c (rs6000_emit_prologue): Update
sp_offset depending on stack size. Save r12 depending
on registers we're saving later.
(rs6000_emit_epilogue): Update sp_offset depending only
on stack size.
From-SVN: r125116
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 14 |
2 files changed, 19 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d162264..890bb51 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2007-05-27 Eric Christopher <echristo@apple.com> + + * config/rs6000/rs6000.c (rs6000_emit_prologue): Update + sp_offset depending on stack size. Save r12 depending + on registers we're saving later. + (rs6000_emit_epilogue): Update sp_offset depending only + on stack size. + 2007-05-27 Zdenek Dvorak <dvorakz@suse.cz> * tree-vrp.c (execute_vrp): Do not check whether current_loops == NULL. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2d7b2f2..f7d76ea 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -15050,8 +15050,17 @@ rs6000_emit_prologue (void) if (!WORLD_SAVE_P (info) && info->push_p && !(DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return)) { - rs6000_emit_allocate_stack (info->total_size, FALSE); + if (info->total_size < 32767) sp_offset = info->total_size; + else + frame_reg_rtx = frame_ptr_rtx; + rs6000_emit_allocate_stack (info->total_size, + (frame_reg_rtx != sp_reg_rtx + && ((info->altivec_size != 0) + || (info->vrsave_mask != 0) + ))); + if (frame_reg_rtx != sp_reg_rtx) + rs6000_emit_stack_tie (); } /* Set frame pointer, if needed. */ @@ -15392,8 +15401,7 @@ rs6000_emit_epilogue (int sibcall) } /* Set sp_offset based on the stack push from the prologue. */ - if ((DEFAULT_ABI == ABI_V4 || current_function_calls_eh_return) - && info->total_size < 32767) + if (info->total_size < 32767) sp_offset = info->total_size; /* Restore AltiVec registers if needed. */ |