------- Comment #4 from dominiq at lps dot ens dot fr 2009-05-12 16:18 -------
Assembly code for the inlined inner loop:
L123:
movsd (%rdx), %xmm15
movsd 8(%rdx), %xmm6
mulsd (%rax), %xmm15
mulsd 1200(%rax), %xmm6
movsd 16(%rdx), %xmm4
movsd 24(%rdx), %xmm3
mulsd 2400(%rax), %xmm4
mulsd 3600(%rax), %xmm3
addsd %xmm15, %xmm0
movsd 32(%rdx), %xmm9
movsd 40(%rdx), %xmm1
mulsd 4800(%rax), %xmm9
mulsd 6000(%rax), %xmm1
addsd %xmm6, %xmm0
movsd 48(%rdx), %xmm7
movsd 56(%rdx), %xmm2
addq $64, %rdx
mulsd 7200(%rax), %xmm7
mulsd 8400(%rax), %xmm2
addq $9600, %rax
addsd %xmm4, %xmm0
cmpq %rax, %rcx
addsd %xmm3, %xmm0
addsd %xmm9, %xmm0
addsd %xmm1, %xmm0
addsd %xmm7, %xmm0
addsd %xmm2, %xmm0
jne L123
and in the subroutine DERIVX:
L953:
movsd (%rax), %xmm9
addl $8, %ebx
movsd 8(%rax), %xmm8
mulsd (%rcx), %xmm9
mulsd 1200(%rcx), %xmm8
movsd 16(%rax), %xmm7
movsd 24(%rax), %xmm6
mulsd 2400(%rcx), %xmm7
mulsd 3600(%rcx), %xmm6
addsd %xmm9, %xmm0
movsd 32(%rax), %xmm5
movsd 40(%rax), %xmm4
mulsd 4800(%rcx), %xmm5
mulsd 6000(%rcx), %xmm4
addsd %xmm8, %xmm0
movsd 48(%rax), %xmm3
movsd 56(%rax), %xmm1
addq $64, %rax
mulsd 7200(%rcx), %xmm3
mulsd 8400(%rcx), %xmm1
addq $9600, %rcx
cmpl %edi, %ebx
addsd %xmm7, %xmm0
addsd %xmm6, %xmm0
addsd %xmm5, %xmm0
addsd %xmm4, %xmm0
addsd %xmm3, %xmm0
addsd %xmm1, %xmm0
jne L953
The structure of the outer loops seems quite comparable in both cases.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40106