------- Comment #5 from hjl at lucon dot org  2007-10-06 15:21 -------
(In reply to comment #3)
> The testcase is slightly uninformative.
> 
> Note, that %esp is aligned here and %ebp is potentially not (thus locals are
> accessed via %esp).
> 
> What if:
> 
> 1. We have dinamic size alloca() call
> 2. We have incoming arguments. How are they referenced? Via %ebp?

%ebp isn't really required since -fomit-frame-pointer works for x86. We
have the original stack pointer in %ebp, which can be used to access
arguments. The aligned stack pointer in %esp can be used for local.

[EMAIL PROTECTED] align-4]$ cat x.c
#include <emmintrin.h>

extern void bar (char *);

char *
e1 (float x, char *p)
{
  volatile __m128 dummy = _mm_set_ps1(x);
  char foo [0];
  bar (foo);
  return p;
}
[EMAIL PROTECTED] align-4]$ /opt/intel/cc/10.0/bin/icc -S -O x.c
[EMAIL PROTECTED] align-4]$ cat icc.s
e1:
        pushl     %ebp
        movl      %esp, %ebp
        andl      $-16, %esp
        subl      $32, %esp
        movss     8(%ebp), %xmm0
        lea       16(%esp), %eax
        unpcklps  %xmm0, %xmm0
        unpcklps  %xmm0, %xmm0
        movaps    %xmm0, (%esp)
        pushl     %eax
        call      bar
        popl      %ecx
        movl      12(%ebp), %eax
        movl      %ebp, %esp
        popl      %ebp
        ret
[EMAIL PROTECTED] align-4]$ /usr/gcc-4.3/bin/gcc -m32 -O -msse2 -S 
-mstackrealign x.c
[EMAIL PROTECTED] align-4]$ cat gcc.s
e1:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        subl    $40, %esp
        movl    %ecx, -8(%ebp)
        movl    %ebx, -4(%ebp)
        movss   (%ecx), %xmm0
        movl    4(%ecx), %ebx
        shufps  $0, %xmm0, %xmm0
        movaps  %xmm0, -24(%ebp)
        leal    -24(%ebp), %eax
        movl    %eax, (%esp)
        call    bar
        movl    %ebx, %eax
        movl    -8(%ebp), %ecx
        movl    -4(%ebp), %ebx
        movl    %ebp, %esp
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
[EMAIL PROTECTED] align-4]$

As you can see, icc generate much cleaner codes than gcc.


-- 

hjl at lucon dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |xuepeng dot guo at intel dot
                   |                            |com


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

Reply via email to