This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/15301] New: gcc does not pass __m128 arguments correctly


#include "xmmintrin.h"
typedef struct {
        __m128 x;
} SS_struct_mi128;

typedef union {
        __m128 x;
} SS_union_mi128;
SS_union_mi128  un;
SS_struct_mi128 st;
test()
{

   bar(un);
   foo(st);
}

For the given program the Union and Struct have the same fields.  gcc passes 
the struct according to document but does not do the right thing for Union. 
See output from gcc below

/*****************************************
        .file   "m128.c"
        .text
.globl test
        .type   test,@function
test:
.LFB378:
        pushq   %rbp
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movq    un(%rip), %xmm0
        movq    un+8(%rip), %xmm1
        movl    $1, %eax
        call    bar
        movaps  st(%rip), %xmm0
        movl    $1, %eax
        call    foo
        leave
        ret
.LFE378:
.Lfe1:
        .size   test,.Lfe1-test
        .comm   un,16,16
        .comm   st,16,16
        .section        .eh_frame,"a",@progbits
.Lframe1:
        .long   .LECIE1-.LSCIE1
.LSCIE1:

-- 
           Summary: gcc does not pass __m128 arguments correctly
           Product: gcc
           Version: 3.4.1
            Status: UNCONFIRMED
          Severity: critical
          Priority: P2
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hjl at lucon dot org
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: x86_64-pc-linux-gnu
  GCC host triplet: x86_64-pc-linux-gnu
GCC target triplet: x86_64-pc-linux-gnu


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]