2011-11-03 46 views
8

Tôi đang sử dụng intrinsics SSE2 để tối ưu hóa sự vướng mắc của ứng dụng của tôi và có những câu dưới đây:SSE2 tối ưu hóa mã

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

Trên Microsoft C++ Compiler này sẽ không biên dịch vì các loại __m128iunsigned int (truyền cho _mm_sll_epi32 hướng dẫn) không thể hoán đổi cho nhau.

Tại sao lại như vậy và làm cách nào tôi nên chuyển giá trị unsigned int tùy ý cho _mm_sll_epi32?


_m128i là:

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; 

Trả lời

11

Nó nên là:

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

Lưu ý i cho "ngay lập tức". Nếu không có sự thay đổi nội tại này, một vector sẽ là đối số thứ hai.