Есть ли способ автоматически генерировать инструкции MMX (не SSE) с помощью gcc

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


person Ant6n    schedule 29.09.2019    source источник
comment
IDK, если старые версии GCC когда-либо знали, как автоматизировать векторизацию для MMX. Возможно, попробуйте самый старый GCC на Godbolt, хотя это, вероятно, все равно не сработает.   -  person Peter Cordes    schedule 29.09.2019
comment
Добавление флага -fopt-info-vec-missed выдаёт: missed: not vectorized: relevant stmt not supported: sum_10 = _4 + sum_15; так что, вероятно, MMX-автовекторизация просто не реализована   -  person chtz    schedule 29.09.2019


Ответы (1)


GCC не может выполнять автовекторизацию с помощью MMX или 3DNow! потому что ему не хватает возможности правильно вставить EMMS / FEMMS. Вы должны использовать ICC для MMX. См. https://gcc.gnu.org/ml/gcc-patches/2004-12/msg01955.html

person Zuxy    schedule 12.01.2020
comment
vzeroupper после использования регистров YMM (в инструкциях AVX) - это проблема того же типа, которая уже решена. Если кого-то заботит устаревший MMX, возможно, не будет огромным объемом работы по изменению GCC для вставки EMMS таким же образом, позволяя повторно включить MMX auto-vec (если это не так. была обрезана или сделана бесполезной из-за гнили после того, как была выведена из строя в течение 15 лет). Вряд ли стоит тратить время в реальной жизни, просто наблюдение. И спасибо, что разместили это; Я иногда задавался вопросом, почему современный GCC, похоже, не может автоматически использовать MMX даже с -march=pmmx - person Peter Cordes; 12.01.2020