gcc-4.2, 4.3〜における複素数演算について腑に落ちないことがあるので
どなたかご存じであれば教えてください。
複素数の掛け算をコンパイルすると、
7.1-STABLEのgcc(gcc (GCC) 4.2.1 20070719 [FreeBSD])では、
浮動小数点命令を使った掛け算のコードをはいてくれるのですが、
portsから入れたgcc43(gcc43 (GCC) 4.3.3 20090101 (prerelease))では、
関数コールになります。
インラインで掛け算コードを展開してくれれば10命令強ですむものを
パラメータをスタックに積んだ上での関数コールというのは明らかに
無駄だと思うのですが、どうしてこうなってしまったのでしょうか?
ちなみにgcc43では加減算ではインライン展開ですが、乗除算では
関数コールになります。
大澤@自宅
#include <complex.h>
complex cmulti(complex a, complex b)
{
return a*b;
}
を
> gcc -S -O3 complex.c
でコンパイルすると、
7.1-STABLEのgcc(gcc (GCC) 4.2.1 20070719 [FreeBSD])では、
.file "complex.c"
.text
.p2align 4,,15
.globl cmulti
.type cmulti, @function
cmulti:
pushl %ebp
movl %esp, %ebp
fldl 12(%ebp)
fldl 20(%ebp)
fldl 28(%ebp)
fldl 36(%ebp)
fld %st(3)
movl 8(%ebp), %eax
fmul %st(2), %st
fld %st(3)
fmul %st(2), %st
fsubrp %st, %st(1)
fstpl (%eax)
fmulp %st, %st(3)
fmulp %st, %st(1)
faddp %st, %st(1)
fstpl 8(%eax)
popl %ebp
ret $4
.size cmulti, .-cmulti
.ident "GCC: (GNU) 4.2.1 20070719 [FreeBSD]"
gcc43(gcc43 (GCC) 4.3.3 20090101 (prerelease))では、
.file "complex.c"
.text
.p2align 2,,3
.globl cmulti
.type cmulti, @function
cmulti:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $32, %esp
movl 8(%ebp), %ebx
leal -24(%ebp), %eax
pushl 40(%ebp)
pushl 36(%ebp)
pushl 32(%ebp)
pushl 28(%ebp)
pushl 24(%ebp)
pushl 20(%ebp)
pushl 16(%ebp)
pushl 12(%ebp)
pushl %eax
call __muldc3
movl -24(%ebp), %eax
movl -20(%ebp), %edx
movl %eax, (%ebx)
movl %edx, 4(%ebx)
movl -16(%ebp), %eax
movl -12(%ebp), %edx
movl %eax, 8(%ebx)
movl %edx, 12(%ebx)
movl %ebx, %eax
movl -4(%ebp), %ebx
leave
ret $4
.size cmulti, .-cmulti
.ident "GCC: (GNU) 4.3.3 20090101 (prerelease)"