https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63864
--- Comment #4 from Steven Bosscher <steven at gcc dot gnu.org> --- Code looks pretty much the same for "test_ok" and "test_slow" since GCC 6 for x86-64, and since GCC 7 for i686. GCC 6.3 x86-64: test_ok(float (*) [3], float, float, float, float, float): mulss %xmm3, %xmm0 movss 4(%rdi), %xmm6 mulss %xmm3, %xmm1 mulss %xmm3, %xmm2 movss 12(%rdi), %xmm3 movaps %xmm0, %xmm5 addss %xmm4, %xmm1 movss (%rdi), %xmm0 addss %xmm4, %xmm5 addss %xmm4, %xmm2 mulss %xmm1, %xmm3 mulss %xmm5, %xmm0 mulss %xmm5, %xmm6 mulss 8(%rdi), %xmm5 addss %xmm3, %xmm0 movss 24(%rdi), %xmm3 mulss %xmm2, %xmm3 addss %xmm3, %xmm0 movss 16(%rdi), %xmm3 mulss %xmm1, %xmm3 mulss 20(%rdi), %xmm1 addss %xmm3, %xmm6 movss 28(%rdi), %xmm3 mulss %xmm2, %xmm3 mulss 32(%rdi), %xmm2 addss %xmm1, %xmm5 addss %xmm3, %xmm6 addss %xmm2, %xmm5 addss %xmm6, %xmm0 addss %xmm5, %xmm0 ret test_slow(mat3&, float, float, float, float, float): mulss %xmm3, %xmm0 mulss %xmm3, %xmm1 mulss %xmm2, %xmm3 movss 16(%rdi), %xmm2 movaps %xmm0, %xmm6 addss %xmm4, %xmm1 movss 4(%rdi), %xmm0 addss %xmm4, %xmm6 addss %xmm3, %xmm4 movss (%rdi), %xmm3 mulss %xmm1, %xmm2 mulss %xmm6, %xmm0 mulss %xmm6, %xmm3 mulss 8(%rdi), %xmm6 addss %xmm2, %xmm0 movss 28(%rdi), %xmm2 mulss %xmm4, %xmm2 addss %xmm2, %xmm0 movss 12(%rdi), %xmm2 mulss %xmm1, %xmm2 mulss 20(%rdi), %xmm1 addss %xmm2, %xmm3 movss 24(%rdi), %xmm2 mulss %xmm4, %xmm2 mulss 32(%rdi), %xmm4 addss %xmm6, %xmm1 addss %xmm2, %xmm3 addss %xmm4, %xmm1 addss %xmm3, %xmm0 addss %xmm1, %xmm0 ret GCC 7.4 i686: test_ok(float (*) [3], float, float, float, float, float): flds 20(%esp) flds 8(%esp) fmul %st(1), %st movl 4(%esp), %eax fadds 24(%esp) flds 12(%esp) fmul %st(2), %st fadds 24(%esp) fxch %st(2) fmuls 16(%esp) fadds 24(%esp) flds (%eax) fmul %st(2), %st flds 12(%eax) fmul %st(4), %st faddp %st, %st(1) flds 24(%eax) fmul %st(2), %st faddp %st, %st(1) flds 4(%eax) fmul %st(3), %st flds 16(%eax) fmul %st(5), %st faddp %st, %st(1) flds 28(%eax) fmul %st(3), %st faddp %st, %st(1) faddp %st, %st(1) fxch %st(2) fmuls 8(%eax) fxch %st(3) fmuls 20(%eax) faddp %st, %st(3) fmuls 32(%eax) faddp %st, %st(2) faddp %st, %st(1) ret test_slow(mat3&, float, float, float, float, float): flds 20(%esp) flds 8(%esp) fmul %st(1), %st movl 4(%esp), %eax fadds 24(%esp) flds 12(%esp) fmul %st(2), %st fadds 24(%esp) fxch %st(2) fmuls 16(%esp) fadds 24(%esp) flds 4(%eax) fmul %st(2), %st flds 16(%eax) fmul %st(4), %st faddp %st, %st(1) flds 28(%eax) fmul %st(2), %st faddp %st, %st(1) flds (%eax) fmul %st(3), %st flds 12(%eax) fmul %st(5), %st faddp %st, %st(1) flds 24(%eax) fmul %st(3), %st faddp %st, %st(1) faddp %st, %st(1) fxch %st(2) fmuls 8(%eax) fxch %st(3) fmuls 20(%eax) faddp %st, %st(3) fmuls 32(%eax) faddp %st, %st(2) faddp %st, %st(1) ret