2011-11-03 108 views
8

我使用SSE2內在函數來優化我的應用程序的瓶頸,有以下問題:SSE2代碼優化

ddata = _mm_xor_si128(_mm_xor_si128(
    _mm_sll_epi32(xdata, 0x7u), _mm_srl_epi32(tdata, 0x19u)), xdata); 

在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; 

回答

11

它應該是:

ddata = _mm_xor_si128(_mm_xor_si128(
    _mm_slli_epi32(xdata, 0x7), _mm_srli_epi32(tdata, 0x19)), xdata); 

注意i 「立即」。如果沒有這種情況,轉移內在因素需要一個向量作爲第二個參數。