https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96895
--- Comment #7 from Michael Matz <matz at gcc dot gnu.org> --- (In reply to Richard Biener from comment #5) > So vector types with element type T and N, a power-of-two, not otherwise > specified are passes the same as > > struct S { T a[N] }; > > ? No. structs, if they are larger than 16 bytes are of class memory. vector types larger than 16 bytes (which came only after the original psABI was written) are passed different than the corresponding struct would have been (namely in the appropriate vector registers, when those types are native to the hardware!). That also explains your other observation: > Ugh. We pass struct S { double a[4]; } in %rdi _and_ on the stack?! And > return by invisible reference _and_ in %eax? Yes, a double[4] is larger than 16 bytes, hence memory, hence passed on the stack and returned via implicit reference. You're mis-reading the assembler code when you think it's passed in %rdi and stack. %rdi contains the address of the caller allocated return slot, i.e. the implicit reference. %rax contains that same address on return.