8

アプリケーションのボトルネックを最適化するために SSE2 組み込み関数を使用していますが、次の質問があります。

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

__m128iMicrosoft C++ コンパイラでは、型と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;
4

2 に答える 2

11

そのはず:

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

i「即時」の に注意してください。これがないと、シフト組み込み関数は 2 番目の引数としてベクトルを期待します。

于 2011-11-03T13:35:50.033 に答える
6

( i_mm_slli_epi32に注意してください)と同様に使用できます。ではなく整数の引数を取ります。_mm_srli_epi32__m128i

于 2011-11-03T13:36:34.623 に答える