Я использую GCC 13.2.0 и собираю приложение с флагами -msse4.2 -march=native -mtune=generic -Ofast, почему компилятор старается беречь xmm регистры и использует всего 2? У меня в проце явно больше 2-х xmm регистров.
для примера:
#include <experimental/simd>
using floatv = stdx::native_simd<float>;
void func(floatv& a, const floatv& b, const floatv& c, const floatv& d) {
a = a * b + c * d;
}
результат для sse4.2:
movaps xmm0, xmmword ptr [rsi]
mulps xmm0, xmmword ptr [rdi]
movaps xmm1, xmmword ptr [rcx]
mulps xmm1, xmmword ptr [rdx]
addps xmm1, xmm0
movaps xmmword ptr [rdi], xmm1
ret
Если собирать для AVX, то будет так:
vmovaps zmm1, ZMMWORD PTR [rdi]
vmulps zmm0, zmm1, ZMMWORD PTR [rsi]
vmovaps zmm2, ZMMWORD PTR [rdx]
vfmadd231ps zmm0, zmm2, ZMMWORD PTR [rcx]
vmovaps ZMMWORD PTR [rdi], zmm0
vzeroupper
ret
Что это значит, для AVX оптимизатор лучше написан? В clang тот же результат, берутся только xmm0 и xmm1. Во всех местах компиль юзает только по два xmm