我正在使用SSE2本质优化我的应用程序的瓶颈,并有以下问题:
ddata = _mm_xor_si128(_mm_xor_si128(
_mm_sll_epi32(xdata, 0x7u), _mm_srl_epi32(tdata, 0x19u)), xdata);在Microsoft C++编译器上,这不会编译,因为类型__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;发布于 2011-11-03 13:35:50
它应该是:
ddata = _mm_xor_si128(_mm_xor_si128(
_mm_slli_epi32(xdata, 0x7), _mm_srli_epi32(tdata, 0x19)), xdata);注意i中的“立即”。如果没有这一点,shift本质就需要一个向量作为第二个参数。
发布于 2011-11-03 13:36:34
您可以使用_mm_slli_epi32 (注意i),也可以使用_mm_srli_epi32。它使用的是整数参数,而不是__m128i。
https://stackoverflow.com/questions/7995790
复制相似问题