2011-11-03 9 views
8
내 응용 프로그램의 병목 현상을 최적화하고 다음과 같은 질문하도록 SSE2의 내장 함수를 사용하고

: 마이크로 소프트 C++ 컴파일러에SSE2 코드 최적화

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

유형 __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. 이 함수가 없으면 시프트 내장 함수는 벡터를 두 번째 인수로 기대합니다.