2011-11-03 23 views
8
benim uygulamanın darboğazları optimize etmek ve şu soruyu olması SSE2 intrinsics kullanıyorum

: Microsoft C++ derleyicisi üzerindeSSE2 kod optimizasyonu

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

tip __m128i ve unsigned int (_mm_sll_epi32 talimat geçti çünkü bu derleme olmaz) değiştirilemez.

Bu neden böyledir ve nasıl _mm_sll_epi32 için keyfi unsigned int değeri geçmesi gerekir?


_m128i geçerli:

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; 

cevap

11

Olmalıdır:

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

Not "acil" için i. Bu olmadan vardiya içselliği bir vektörü ikinci argüman olarak bekler.