http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53383

--- Comment #9 from H.J. Lu <hjl.tools at gmail dot com> 2012-05-19 21:03:10 
UTC ---
With this patch:

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index eca542c..3e4e768 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3660,9 +3660,14 @@ ix86_option_override_internal (bool main_args_p)
   ix86_preferred_stack_boundary = PREFERRED_STACK_BOUNDARY_DEFAULT;
   if (global_options_set.x_ix86_preferred_stack_boundary_arg)
     {
-      int min = (TARGET_64BIT ? 4 : 2);
+      int min;
       int max = (TARGET_SEH ? 4 : 12);

+      if (TARGET_64BIT)
+    min = TARGET_SSE ? 4 : 3;
+      else
+    min = 2;
+
       if (ix86_preferred_stack_boundary_arg < min
       || ix86_preferred_stack_boundary_arg > max)
     {
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index ddb3645..f7f13d2 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -708,7 +708,7 @@ enum target_cpu_default
 #define MAIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)

 /* Minimum stack boundary.  */
-#define MIN_STACK_BOUNDARY (TARGET_64BIT ? 128 : 32)
+#define MIN_STACK_BOUNDARY (TARGET_64BIT ? (TARGET_SSE ? 128 : 64) : 32)

 /* Boundary (in *bits*) on which the stack pointer prefers to be
    aligned; the compiler cannot rely on having this alignment.  */

I got

[hjl@gnu-mic-2 gcc]$ cat /tmp/x.c
extern __int128 x;

extern void bar (int, int, int, int, int, __int128);
void
foo (void)
{
  bar (1, 2, 3, 4, 5, x);
}
[hjl@gnu-mic-2 gcc]$ ./xgcc -B./ -S -O2 /tmp/x.c -mpreferred-stack-boundary=3 
-mno-sse
[hjl@gnu-mic-2 gcc]$ cat x.s
    .file    "x.c"
    .text
    .p2align 4,,15
    .globl    foo
    .type    foo, @function
foo:
.LFB0:
    .cfi_startproc
    pushq    %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movl    $5, %r8d
    movl    $4, %ecx
    movl    $2, %esi
    movl    $1, %edi
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    andq    $-16, %rsp
    subq    $16, %rsp
    movq    x+8(%rip), %rdx
    movq    x(%rip), %rax
    movq    %rdx, 8(%rsp)
    movq    %rax, (%rsp)
    movl    $3, %edx
    call    bar
    leave
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
.LFE0:
    .size    foo, .-foo
    .ident    "GCC: (GNU) 4.8.0 20120519 (experimental)"
    .section    .note.GNU-stack,"",@progbits
[hjl@gnu-mic-2 gcc]$ 

It looks OK to me.

Reply via email to