В старом автономном руководстве по встроенным функциям _mm_storeu_si32
был указан в разделе «прочее».Теперь в онлайн-руководстве intrinsics оно указано в SSE2, но еще не все компиляторы его реализовали.В качестве переносного обходного пути (store_b
) вы можете использовать:
#include<immintrin.h>
void storeu_a(void* mem_addr, __m128i a) {
_mm_storeu_si32(mem_addr, a);
return;
}
void storeu_b(void* mem_addr, __m128i a) {
_mm_store_ss((float*)mem_addr, _mm_castsi128_ps(a));
return;
}
С помощью clang это компилируется в идентичный код , но другой компилятор может выбрать movd
вместо movss
с store_a
и / или store_b
:
storeu_a(void*, long long __vector(2)): # @storeu_a(void*, long long __vector(2))
movss dword ptr [rdi], xmm0
ret
storeu_b(void*, long long __vector(2)): # @storeu_b(void*, long long __vector(2))
movss dword ptr [rdi], xmm0
ret