2011-11-03 13 views
8

मैं SSE2 intrinsics उपयोग कर रहा हूँ अपने आवेदन की बाधाओं का अनुकूलन और निम्नलिखित प्रश्न के लिए:SSE2 कोड अनुकूलन

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

माइक्रोसॉफ्ट सी ++ संकलक पर इस संकलन नहीं करेगा क्योंकि प्रकार __m128i और unsigned 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। इसके बिना शिफ्ट intrinsics दूसरे तर्क के रूप में एक वेक्टर की उम्मीद है।

6

आप _mm_slli_epi32 का उपयोग कर सकते हैं (i पर ध्यान दें) और इसी तरह _mm_srli_epi32। यह __m128i की बजाय एक पूर्णांक तर्क लेता है।

संबंधित मुद्दे