Оптимизация кода SSE2
Я использую встроенные функции SSE2 для оптимизации узких мест моего приложения и у меня следующий вопрос:
ddata = _mm_xor_si128(_mm_xor_si128(
_mm_sll_epi32(xdata, 0x7u), _mm_srl_epi32(tdata, 0x19u)), xdata);
На Microsoft C++ Compiler это не скомпилируется, потому что типы __m128i
а также unsigned int
(передано _mm_sll_epi32
инструкция) не являются взаимозаменяемыми.
Почему это так и как я должен пройти произвольный unsigned int
значение для _mm_sll_epi32
?
_m128i
является:
typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128i {
__int8 m128i_i8[16];
__int16 m128i_i16[8];
__int32 m128i_i32[4];
__int64 m128i_i64[2];
unsigned __int8 m128i_u8[16];
unsigned __int16 m128i_u16[8];
unsigned __int32 m128i_u32[4];
unsigned __int64 m128i_u64[2];
} __m128i;
2 ответа
Решение
Так должно быть:
ddata = _mm_xor_si128(_mm_xor_si128(
_mm_slli_epi32(xdata, 0x7), _mm_srli_epi32(tdata, 0x19)), xdata);
Обратите внимание i
для "немедленного". Без этого внутренняя смена ожидает вектор как второй аргумент.
Ты можешь использовать _mm_slli_epi32
(обратите внимание на I) и аналогично _mm_srli_epi32
, Требуется целочисленный аргумент, а не __m128i
,