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.