aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Christopher <echristo@apple.com>2007-05-27 19:13:07 +0000
committerEric Christopher <echristo@gcc.gnu.org>2007-05-27 19:13:07 +0000
commitbcb2d7014243ff98890679761404ba7648c98450 (patch)
tree124c16f290771ff78dd41f61de46963b36b7755c /gcc
parentd51157deeeaa2095a645626d4136ba9dd02285c4 (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rs6000/rs6000.c14
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. */