18

4つの32ビット整数に別の4つの整数を掛ける方法は?それができる命令は見つかりませんでした。

4

2 に答える 2

25

符号付きの32x32ビット整数乗算が必要な場合は、 software.intel.comの次の例で、必要な処理が実行されるように見えます。

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 */
}

古いCPU用と最近のCPU用の2つのビルドが必要になる場合があります。その場合、次のように実行できます。

static inline __m128i muly(const __m128i &a, const __m128i &b)
{
#ifdef __SSE4_1__  // modern CPU - use SSE 4.1
    return _mm_mullo_epi32(a, b);
#else               // old CPU - use SSE 2
    __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 */
#endif
}
于 2012-05-08T15:19:23.873 に答える
8

SSE 4.1のPMULLDは、これを実行します。

説明は少し誤解を招きやすく、符号付き乗算について説明していますが、格納されるのは下位32ビットのみであるため、実際には、のように両方に使用できる符号を無視する命令ですIMUL

于 2012-05-08T14:42:16.120 に答える