議論を始めるにあたり、_mm_mul_epu32 と _mm_mul_epi32 の基本的な違いは次のとおりです。
_mm_mul_epu32は SSE2 で利用可能で、符号なし整数を取り、生成します (32 ビット -> 64 ビット)
_mm_mul_epi32は SSE4.1 で使用可能で、符号付き整数 (32 ビット -> 64 ビット) を取得および生成します。
私が理解できないのは、どのような状況で_mm_mul_epu32を使用する必要があるかということです。_mm_set[1]_epi32 のような set 命令はないようです。この例のように: SSE multiplication of 4 32-bit integers、最良の答えは次のように書きます:
static inline __m128i muly(const __m128i &a, const __m128i &b)
{
__m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32( _mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */
return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); /* shuffle results to [63..0] and pack */
}
_mm_mul_epu32 は、_epi32 命令で使用されます。符号付き整数と符号なし整数の違いを無視するのは危険ではありませんか?
_mm_mul_epu32 を安全に使用できる場所の例を教えてください。ありがとう!