x86-64 psABI says:

The 64-bit mantissa of arguments of type {long double
belongs to class X87, the 16-bit exponent plus 6 bytes of padding
belongs to class X87UP.

...

If one of the classes is X87, X87UP, COMPLEX\_X87 class,
MEMORY is used as class.

But I got

[...@gnu-6 avx-abi]$ cat u4.i
union sse2
{
  int i;
  long double x;
};

long double
bar2 (union sse2 x)
{
  return x.x;
}

long double
foo2 (long double x)
{
  union sse2 y;
  y.x = x;
  return bar2 (y);
}
[...@gnu-6 avx-abi]$ gcc -S  u4.i -O -fno-asynchronous-unwind-tables
[...@gnu-6 avx-abi]$ cat u4.s
        .file   "u4.i"
        .text
.globl bar2
        .type   bar2, @function
bar2:
        movq    %rdi, -24(%rsp)
        movq    %xmm0, -16(%rsp)
        fldt    -24(%rsp)
        ret
        .size   bar2, .-bar2
.globl foo2
        .type   foo2, @function
foo2:
        subq    $24, %rsp
        movq    32(%rsp), %rax
        movl    40(%rsp), %edx
        movq    %rax, (%rsp)
        movl    %edx, 8(%rsp)
        movq    (%rsp), %rdi
        movq    8(%rsp), %xmm0
        call    bar2
        addq    $24, %rsp
        ret
        .size   foo2, .-foo2

Dave, does icc follow psABI?


-- 
           Summary: union with long double doesn't follow x86-64 psABI
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hjl dot tools at gmail dot com
GCC target triplet: x86_64-*-linux-gnu


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

Reply via email to