インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス

乗算組込み関数

このインテル® ストリーミング SIMD 拡張命令 3 補足命令 (インテル® SSSE3) 組込み関数は、乗算に使用されます。これらの組込み関数のプロトタイプは、tmmintrin.h 内にあります。これらの組込み関数に対して ia32intrin.h ヘッダーファイルを使用することもできます。

_mm_maddubs_epi16

extern __m128i _mm_maddubs_epi16(__m128i a, __m128i b);

符号付きバイトと符号なしバイトを乗算し、符号付きワードのペアを水平加算し、飽和された符号付きワードをパックします。

a を符号なし 8 ビット整数の配列、b を符号付き 8 ビット整数の配列、r を符号付き 16 ビット整数の配列として解釈します。

for (i = 0; i < 8; i++) {
r[i] = signed_saturate_to_word(a[2*i+1] * b[2*i+1] + a[2*i]*b[2*i]);
}

_mm_maddubs_pi16

extern __m64 _mm_maddubs_pi16(__m64 a, __m64 b);

符号付きバイトと符号なしバイトを乗算し、符号付きワードのペアを水平加算し、飽和された符号付きワードをパックします。

a を符号なし 8 ビット整数の配列、b を符号付き 8 ビット整数の配列、r を符号付き 16 ビット整数の配列として解釈します。

for (i = 0; i < 4; i++) {
r[i] = signed_saturate_to_word(a[2*i+1] * b[2*i+1] + a[2*i]*b[2*i]);
}

_mm_mulhrs_epi16

extern __m128i _mm_mulhrs_epi16(__m128i a, __m128i b);

符号付きワードを乗算し、符号付きダブルワードをスケーリングして丸め、上位 16 ビットをパックします。

符号付き 16 ビット整数の配列として abr を解釈します。

for (i = 0; i < 8; i++) {
r[i] =  (( (int32)((a[i] * b[i]) >> 14) + 1) >> 1) & 0xFFFF;
}

_mm_mulhrs_pi16

extern __m64 _mm_mulhrs_pi16(__m64 a, __m64 b);

符号付きワードを乗算し、符号付きダブルワードをスケーリングして丸め、上位 16 ビットをパックします。

符号付き 16 ビット整数の配列として abr を解釈します。

for (i = 0; i < 4; i++) {
r[i] =  (( (int32)((a[i] * b[i]) >> 14) + 1) >> 1) & 0xFFFF;
}