GCC赢得';不要在32位中使用SSE

GCC赢得';不要在32位中使用SSE,gcc,sse,gcc4.8,Gcc,Sse,Gcc4.8,在linux x64上,如果我以这种方式使用gcc编译代码 gcc-m32-march=native-mfpmath=sse-c-ftree矢量化myfile.c 如果我看一下程序集,我没有看到使用任何SSE指令或寄存器,代码结果与生成的代码完全相同,没有任何标记gcc myfile.c 在我的代码中,许多操作都是使用浮点数组和矩阵的,所以gcc不使用SSE,并且与基本编译相比,不执行任何优化,这非常奇怪 为什么??这是编译器的错误吗 编辑 如果我添加标志-msse2编译器也使用SSE指令,但是

在linux x64上,如果我以这种方式使用gcc编译代码

gcc-m32-march=native-mfpmath=sse-c-ftree矢量化myfile.c

如果我看一下程序集,我没有看到使用任何SSE指令或寄存器,代码结果与生成的代码完全相同,没有任何标记
gcc myfile.c

在我的代码中,许多操作都是使用浮点数组和矩阵的,所以gcc不使用SSE,并且与基本编译相比,不执行任何优化,这非常奇怪

为什么??这是编译器的错误吗

编辑


如果我添加标志
-msse2
编译器也使用SSE指令,但是
march=native
应该包括当前CPU支持的所有指令,因此也使用SSE2。为什么会这样

适用于gcc 4.9.2。(Ubuntu amd64)

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。

您可能想尝试添加
-msse2
。如果我使用march=native,则未启用?如果您使用优化(如
-O3
)进行编译会发生什么?这没有意义。它展示了什么?在我的系统上使用
-m32
显示SSE2已启用。什么是您的CPU?
-march=native
在某些虚拟机上往往表现不好,因为这些虚拟机可能会将自己宣传为不可能的机器(如64位奔腾2)。然而,如果它说sse2已启用,我真的看不出-msse2有什么不同。
    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