Есть ли способ автоматически генерировать инструкции MMX (не SSE) с помощью gcc - PullRequest
2 голосов
/ 29 сентября 2019

Похоже, 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

Я хотел запустить несколько тестов, сравнивая эффектработает только с x87-fpu, MMX, SSE и SSE2, но если gcc не будет выдавать инструкции MMX, то между компиляцией для x87 и x87 + mmx не будет никакой разницы.

...