在Linux x64上,如果我用这种方式用gcc编译代码
gcc -m32 -march=native -mfpmath=sse -c -ftree-vectorize myfile.c
如果我看看程序集,我看不到任何SSE构造或寄存器使用,代码结果完全相同生成的代码没有任何标记gcc myfile.c
在我的代码中使用浮点数组和矩阵进行许多操作,因此gcc不使用SSE并且与基本编译相比不执行任何优化,这很奇怪。
为什么呢?这是编译器的错误吗?
修改
如果我添加标志-msse2
,编译器也使用SSE指令,但march=native
应该包括当前CPU支持的所有指令,因此也包括SSE2。为什么会这样?
答案 0 :(得分:0)
使用gcc 4.9.2为我工作。 (Ubuntu amd64)
// fp-simple.c
double fp_func (double a, double b)
{
return a*b + 32;
}
gcc -m32 -march=native -ftree-vectorize -S -o-
:
blah blah a lot of mov insns because we didn't use -O3
fldl -8(%ebp)
fmull -16(%ebp)
fldl .LC0
faddp %st, %st(1)
leave
ret
gcc -m32 -march=native -mfpmath=sse -ftree-vectorize -S -o- fp-simple.c
:
mov ... copy from args to locals on the stack
vmovsd -8(%ebp), %xmm0
vmulsd -16(%ebp), %xmm0, %xmm1
vmovsd .LC0, %xmm0
vaddsd %xmm0, %xmm1, %xmm0
vmovsd %xmm0, -24(%ebp)
fldl -24(%ebp)
leave
ret
(使用-march=nehalem
,您可以获得相同的代码,但是SSE指令的非VEX版本。)
因此,如果gcc4.8没有这样的行为,那听起来就像是一个bug。