有没有办法用gcc自动生成MMX指令(而不是SSE)

有没有办法用gcc自动生成MMX指令(而不是SSE),gcc,sse,mmx,auto-vectorization,Gcc,Sse,Mmx,Auto Vectorization,看来gcc会很高兴地自动向量化简单的示例,并发出SSE指令。有没有办法只发出MMX指令 例如,如果我在Godbolt上尝试以下示例: int sumint(int *arr) { int sum = 0; for (int i=0 ; i<2048 ; i++){ sum += arr[i]; } return sum; } 但如果没有sse(即mmmx-O3-m32-mno-sse2),它只能使用通用寄存器,而不使用mmx指令: sumi

看来gcc会很高兴地自动向量化简单的示例,并发出SSE指令。有没有办法只发出MMX指令

例如,如果我在Godbolt上尝试以下示例:

int sumint(int *arr) {
    int sum = 0;
    for (int i=0 ; i<2048 ; i++){
        sum += arr[i];
    }
    return sum;
}
但如果没有sse(即mmmx-O3-m32-mno-sse2),它只能使用通用寄存器,而不使用mmx指令:

sumint:
        mov     eax, DWORD PTR [esp+4]
        xor     edx, edx
        lea     ecx, [eax+8192]
.L2:
        add     edx, DWORD PTR [eax]
        add     eax, 4
        cmp     eax, ecx
        jne     .L2
        mov     eax, edx
        ret

我想运行一些基准测试,比较仅使用x87 fpu、MMX、SSE和SSE2运行的效果,但是如果gcc不会发出MMX指令,那么为x87和x87+MMX编译就不会有任何区别。

gcc不能使用MMX或3DNow自动矢量化!因为它缺乏正确插入EMM/FEMM的能力。您必须为MMX使用ICC。如果GCC的旧版本知道如何为MMX自动矢量化,请参见

IDK。也许可以尝试Godbolt上最旧的GCC,尽管这可能仍然不起作用。添加标志
-fopt info vec missed
给出:
missed:not vectorized:related stmt not supported:sum_10=\u 4+sum_15
因此,在使用YMM寄存器(在AVX指令中)之后,MMX自动矢量化可能没有实现
vzeroupper
,这与现在解决的问题是相同的。如果有人关心过时的MMX,那么修改GCC以同样的方式插入EMM并允许重新启用MMX auto-vec(如果它在禁用15年后未被删除或因位腐烂而变得无用)可能不是一项巨大的工作。在现实生活中,任何人的时间都不值得,只是观察而已。谢谢你发这个帖子;我有时想知道,为什么现代GCC似乎无法使用MMX自动生成vec,即使使用
-march=pmmx
sumint:
        mov     eax, DWORD PTR [esp+4]
        xor     edx, edx
        lea     ecx, [eax+8192]
.L2:
        add     edx, DWORD PTR [eax]
        add     eax, 4
        cmp     eax, ecx
        jne     .L2
        mov     eax, edx
        ret