https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85667
Bug ID: 85667 Summary: (x86_64) ms_abi rules aren't followed when returning short structs with float values Product: gcc Version: 8.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: green at redhat dot com Target Milestone: --- Structs 8 bytes or shorter with floating point values should return in eax. GCC 8.0.1 (at least) doesn't follow those rules. It is using the sysv ABI rules instead. See this code, for example: typedef struct { float x; } Float; Float __attribute__((ms_abi)) fn1() { Float v; v.x = 3.145; return v; } Float fn2 () { Float v; v.x = 3.145; return v; } GCC's output for fn1 and fn2 are similar: fn1: movss .LC0(%rip), %xmm0 ret fn2: movss .LC0(%rip), %xmm0 ret Clang does this correctly, however, and fn1 looks like this: fn1: movl $1078544302, %eax retq fn2: movss .LCPI1_0(%rip), %xmm0 retq