有没有一种方法可以用gcc自动生成MMX指令(不是SSE)

问题描述 投票:2回答:1

看来gcc会很乐意自动将简单的示例向量化,并发出SSE指令。有什么方法只能发出MMX指令吗?

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

int sumint(int *arr) {
    int sum = 0;
    for (int i=0 ; i<2048 ; i++){
        sum += arr[i];
    }
    return sum;
}

在[-mmmx -O3 -m32 -msse2的GCC 9.2上编译,我得到

sumint:
        mov     eax, DWORD PTR [esp+4]
        pxor    xmm0, xmm0
        lea     edx, [eax+8192]
.L2:
        movdqu  xmm2, XMMWORD PTR [eax]
        add     eax, 16
        paddd   xmm0, xmm2
        cmp     edx, eax
        jne     .L2
        movdqa  xmm1, xmm0
        psrldq  xmm1, 8
        paddd   xmm0, xmm1
        movdqa  xmm1, xmm0
        psrldq  xmm1, 4
        paddd   xmm0, xmm1
        movd    eax, xmm0
        ret

但是没有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 sse mmx auto-vectorization
1个回答
0
投票

GCC无法使用MMX或3DNow自动矢量化!因为它缺乏正确插入EMMS / FEMMS的能力。您必须将ICC用于MMX。参见https://gcc.gnu.org/ml/gcc-patches/2004-12/msg01955.html

© www.soinside.com 2019 - 2024. All rights reserved.