Round up the SSE register save area only if needed
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 8 Oct 2015 18:57:11 +0000 (18:57 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 8 Oct 2015 18:57:11 +0000 (11:57 -0700)
There is is no point to round up the SSE register save area to 16 bytes if
the incoming stack boundary is less than 16 bytes.

* config/i386/i386.c (ix86_compute_frame_layout): Round up the
SSE register save area to 16 bytes only if the incoming stack
boundary is no less than 16 bytes.

From-SVN: r228621

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

index 9f84b6ef8372ad11f44f988ec0a00983cde3f668..428649149456d6d84437bbada6d172eef9254a93 100644 (file)
@@ -1,3 +1,9 @@
+2015-10-08  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/i386/i386.c (ix86_compute_frame_layout): Round up the
+       SSE register save area to 16 bytes only if the incoming stack
+       boundary is no less than 16 bytes.
+
 2015-10-08  Jeff Law  <law@redhat.com>
 
        * tree-ssa-phiopt.c (factor_out_conversion): Add missing calls to
index a24bd26c96a05d8e5aae4049cab4901943b78d59..4806a7cffa2950fc6dc36f98174a0597d3f4f33b 100644 (file)
@@ -11383,9 +11383,14 @@ ix86_compute_frame_layout (struct ix86_frame *frame)
   if (frame->nsseregs)
     {
       /* The only ABI that has saved SSE registers (Win64) also has a
-         16-byte aligned default stack, and thus we don't need to be
-        within the re-aligned local stack frame to save them.  */
-      offset = ROUND_UP (offset, 16);
+        16-byte aligned default stack, and thus we don't need to be
+        within the re-aligned local stack frame to save them.  In case
+        incoming stack boundary is aligned to less than 16 bytes,
+        unaligned move of SSE register will be emitted, so there is
+        no point to round up the SSE register save area outside the
+        re-aligned local stack frame to 16 bytes.  */
+      if (ix86_incoming_stack_boundary >= 128)
+       offset = ROUND_UP (offset, 16);
       offset += frame->nsseregs * 16;
     }
   frame->sse_reg_save_offset = offset;