2

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

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

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

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

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

我想跑一些 Benchmarks,比较只用 x87-fpu、MMX、SSE 和 SSE2 运行的效果,但是如果 gcc 不会发出 MMX 指令,那么为 x87 和 x87+mmx 编译不会有任何区别.

4

1 回答 1

1

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

于 2020-01-12T06:51:37.370 回答