https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63864
--- Comment #4 from Steven Bosscher ---
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):
flds20(%esp)
flds8(%esp)
fmul%st(1), %st
movl4(%esp), %eax
fadds 24(%esp)
flds12(%esp)
fmul%st(2), %st
fadds 24(%esp)
fxch%st(2)
fmuls 16(%esp)
fadds 24(%esp)
flds(%eax)
fmul%st(2), %st
flds12(%eax)
fmul%st(4), %st
faddp %st, %st(1)
flds24(%eax)
fmul%st(2), %st
faddp %st, %st(1)
flds4(%eax)
fmul%st(3), %st
flds16(%eax)
fmul%st(5), %st
faddp %st, %st(1)
flds28(%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):
flds20(%esp)
flds8(%esp)
fmul%st(1), %st
movl4(%esp), %eax
fadds 24(%esp)
flds12(%esp)
fmul%st(2), %st
fadds 24(%esp)
fxch%st(2)
fmuls 16(%esp)
fadds 24(%esp)
flds4(%eax)
fmul%st(2), %st
flds16(%eax)
fmul%st(4), %st
faddp %st, %st(1)
flds28(%eax)
fmul%st(2), %st
faddp %st, %st(1)
flds(%eax)
fmul%st(3), %st
flds12(%eax)
fmul%st(5), %st
faddp %st, %st(1)
flds24(%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