gcc 3.4 で -mno-sse が効かない

何故?

  • -mno-sse2 で SSE のバージョンを明示しても駄目.
  • -mfpmath=387 で使用する浮動小数点演算レジスタを指定しても駄目.
  • -O0 で最適化を無効にしても駄目.

ちなみに cvtsi2sd, mulsd, cvttsd2si などが SSE2 の命令.

テストプログラム

$ cat test_fp.c
int test_fp(int n)
{
    return (int)(n * 0.1);
}

gcc 4.1.2 (SSE 有効 (-msse))

$ gcc-4.1.2 -O3 -S -msse test_fp.c
$ cat test_fp.s
(中略)
test_fp:
.LFB2:
        cvtsi2sd        %edi, %xmm0
        mulsd   .LC0(%rip), %xmm0
        cvttsd2si       %xmm0, %eax
        ret
(後略)

gcc 4.1.2 (SSE 無効 (-mno-sse))

問題なく SSE が無効化される.

$ gcc-4.1.2 -O3 -S -mno-sse test_fp.c
$ cat test_fp.s
(中略)
test_fp:
.LFB2:
        movl    %edi, -128(%rsp)
        fnstcw  -2(%rsp)
        movzwl  -2(%rsp), %eax
        fildl   -128(%rsp)
        fmull   .LC0(%rip)
        orb     $12, %ah
        movw    %ax, -4(%rsp)
        fldcw   -4(%rsp)
        fistpl  -8(%rsp)
        fldcw   -2(%rsp)
        movl    -8(%rsp), %eax
        ret
(後略)

gcc 3.4.6 (SSE 有効 (-msse))

$ gcc-3.4.6 -O3 -S -msse test_fp.c
$ cat test_fp.s
(中略)
test_fp:
.LFB2:
        cvtsi2sd        %edi, %xmm0
        mulsd   .LC0(%rip), %xmm0
        cvttsd2si       %xmm0, %eax
        ret
(後略)

gcc 3.4.6 (SSE 無効 (-mno-sse))

なぜか SSE が無効化されず,コンパイル結果が SSE 有効時と同じ.

$ gcc-3.4.6 -O3 -S -mno-sse test_fp.c
$ cat test_fp.s
(中略)
test_fp:
.LFB2:
        cvtsi2sd        %edi, %xmm0
        mulsd   .LC0(%rip), %xmm0
        cvttsd2si       %xmm0, %eax
        ret
(後略)