海湾合作委员会不会在32位使用SSE

时间:2014-06-24 12:22:29

标签: gcc sse gcc4.8

在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。为什么会这样?

1 个答案:

答案 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。