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)"


メールによる返信