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



             Bug #: 56186

           Summary: [4.8 regression] function return ABI change for

                    128-bit types on Win64

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Severity: major

          Priority: P3

         Component: target

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: ebotca...@gcc.gnu.org

            Target: x86_64-*-mingw





Some 128-bit wide types are returned differently with 4.8 than with 4.7 because

of the introduction of MAX_FIXED_MODE_SIZE in the x86 back-end.  For example:



struct S {

  long long int l1, l2;

};



struct S foo (void)

{

  struct S s = { 0, 0 };

  return s;

}



with 4.7.x:



        movq    %rcx, 16(%rbp)

        movq    $0, -16(%rbp)

        movq    $0, -8(%rbp)

        movq    16(%rbp), %rax

        movq    -16(%rbp), %rdx

        movq    %rdx, (%rax)

        movq    -8(%rbp), %rdx

        movq    %rdx, 8(%rax)

        movq    16(%rbp), %rax

        addq    $16, %rsp

        popq    %rbp

        ret



with 4.8.0:



        movq    $0, -16(%rbp)

        movq    $0, -8(%rbp)

        movq    -16(%rbp), %rax

        movq    -8(%rbp), %rdx

        movq    %rax, -32(%rbp)

        movq    %rdx, -24(%rbp)

        movdqa  -32(%rbp), %xmm0

        addq    $32, %rsp

        popq    %rbp

        ret



The implementation in function_value_ms_64 is too fragile and only looks at

modes instead of looking at types first.

Reply via email to