OSDN Git Service

2007-05-27 Eric Christopher <echristo@apple.com>
authorechristo <echristo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 27 May 2007 19:13:07 +0000 (19:13 +0000)
committerechristo <echristo@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 27 May 2007 19:13:07 +0000 (19:13 +0000)
    * 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@125116 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index d162264..890bb51 100644 (file)
@@ -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.
index 2d7b2f2..f7d76ea 100644 (file)
@@ -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.  */