Похоже, что 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 .
-fopt-info-vec-missed
выдаёт:missed: not vectorized: relevant stmt not supported: sum_10 = _4 + sum_15;
так что, вероятно, MMX-автовекторизация просто не реализована - person chtz   schedule 29.09.2019