OSDN Git Service

2009-01-30 Kai Tietz <kai.tietz@onevision.com>
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 30 Jan 2009 08:45:35 +0000 (08:45 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 30 Jan 2009 08:45:35 +0000 (08:45 +0000)
PR/39002
* config/i386/i386.c (ix86_can_use_return_insn_p): Check for nsseregs.
(ix86_expand_epilogue): Take nsseregs in account to use proper restore
method.

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

gcc/ChangeLog
gcc/config/i386/i386.c

index 4c928fc..a6ae126 100644 (file)
@@ -1,3 +1,10 @@
+2009-01-30  Kai Tietz  <kai.tietz@onevision.com>
+
+       PR/39002
+       * config/i386/i386.c (ix86_can_use_return_insn_p): Check for nsseregs.
+       (ix86_expand_epilogue): Take nsseregs in account to use proper restore
+       method.
+
 2009-01-29  H.J. Lu  <hongjiu.lu@intel.com>
 
        * ira-color.c (allocno_reload_assign): Update comments.
index d7e56bd..c60ec5a 100644 (file)
@@ -7138,7 +7138,7 @@ ix86_can_use_return_insn_p (void)
     return 0;
 
   ix86_compute_frame_layout (&frame);
-  return frame.to_allocate == 0 && frame.nregs == 0;
+  return frame.to_allocate == 0 && (frame.nregs + frame.nsseregs) == 0;
 }
 \f
 /* Value should be nonzero if functions must have frame pointers.
@@ -8293,14 +8293,14 @@ ix86_expand_epilogue (int style)
      are no registers to restore.  We also use this code when TARGET_USE_LEAVE
      and there is exactly one register to pop. This heuristic may need some
      tuning in future.  */
-  if ((!sp_valid && frame.nregs <= 1)
+  if ((!sp_valid && (frame.nregs + frame.nsseregs) <= 1)
       || (TARGET_EPILOGUE_USING_MOVE
          && cfun->machine->use_fast_prologue_epilogue
-         && (frame.nregs > 1 || frame.to_allocate))
-      || (frame_pointer_needed && !frame.nregs && frame.to_allocate)
+         && ((frame.nregs + frame.nsseregs) > 1 || frame.to_allocate))
+      || (frame_pointer_needed && !(frame.nregs + frame.nsseregs) && frame.to_allocate)
       || (frame_pointer_needed && TARGET_USE_LEAVE
          && cfun->machine->use_fast_prologue_epilogue
-         && frame.nregs == 1)
+         && (frame.nregs + frame.nsseregs) == 1)
       || crtl->calls_eh_return)
     {
       /* Restore registers.  We can use ebp or esp to address the memory