SSE2代码优化

Yip*_*Yay 8 c++ sse simd intrinsics sse2

我正在使用SSE2内在函数来优化我的应用程序的瓶颈,并提出以下问题:

ddata = _mm_xor_si128(_mm_xor_si128(
    _mm_sll_epi32(xdata, 0x7u), _mm_srl_epi32(tdata, 0x19u)), xdata);
Run Code Online (Sandbox Code Playgroud)

在Microsoft C++编译器上,这将无法编译,因为类型__m128iunsigned 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;
Run Code Online (Sandbox Code Playgroud)

Pau*_*l R 11

它应该是:

ddata = _mm_xor_si128(_mm_xor_si128(
    _mm_slli_epi32(xdata, 0x7), _mm_srli_epi32(tdata, 0x19)), xdata);
Run Code Online (Sandbox Code Playgroud)

注意i"立即".如果没有这个,移位内在函数会将向量作为第二个参数.


use*_*116 6

你也可以使用_mm_slli_epi32(注意i)_mm_srli_epi32.它需要一个整数参数而不是一个__m128i.