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

--- Comment #1 from John Salmon <john.salmon at deshaw dot com> 2011-09-25 
15:22:07 UTC ---
Here's a slightly smaller test case.  The problem is the 'movdqa'.  According
the x86-64 ABI, rsp+8 is 16-bit aligned at the entry to main, and therefore so
is %rdi when we try to execute 
   movdqa %xmm0, (%rdi)
resulting in segv.


thsalm...@drdlogin0039.en.desres$ cat e2.c
#include <stdint.h>
#include <emmintrin.h>
#include <string.h>
struct a4x32{
      uint32_t v[4];
};
struct a1xm128i{
      __m128i m;
};
static struct a4x32 zero () {
    struct a1xm128i c1x128;
    struct a4x32 c4x32;
    c1x128.m = _mm_setzero_si128();
    memcpy (&c4x32.v[0], &c1x128.m, sizeof (c4x32));
    return c4x32;
}
struct S {
     struct a4x32 v;
};
void method (struct S * e) {
     e->v = zero ();
}
int main (int argc, char **argv) {
    struct S e;
    method(&e);
    return e.v.v[0];
}
salm...@drdlogin0039.en.desres$ desres-cleanenv -m gcc/4.6.1-23A/bin gcc -Wall
-O -std=c99 -pedantic -S e2.c
salm...@drdlogin0039.en.desres$ desres-cleanenv -m gcc/4.6.1-23A/bin gcc e2.s
salm...@drdlogin0039.en.desres$ ./a.out
Segmentation fault (core dumped)
salm...@drdlogin0039.en.desres$ cat e2.s
    .file    "e2.c"
    .text
    .globl    method
    .type    method, @function
method:
.LFB522:
    .cfi_startproc
    pxor    %xmm0, %xmm0
    movdqa    %xmm0, (%rdi)
    ret
    .cfi_endproc
.LFE522:
    .size    method, .-method
    .globl    main
    .type    main, @function
main:
.LFB523:
    .cfi_startproc
    subq    $16, %rsp
    .cfi_def_cfa_offset 24
    movq    %rsp, %rdi
    call    method
    movl    (%rsp), %eax
    addq    $16, %rsp
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE523:
    .size    main, .-main
    .ident    "GCC: (GNU) 4.6.1"
    .section    .note.GNU-stack,"",@progbits
salm...@drdlogin0039.en.desres$

Reply via email to