インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
ここでは、整数演算用のインテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) の組込み関数について説明します。インテル® SSE2 の組込み関数のプロトタイプは、ヘッダーファイル emmintrin.h 内にあります。
各組込み関数演算の結果はレジスターに配置されます。各レジスターに配置される値については、次の表の関数名の詳細で示します。R、R0、R1、... R15 は、結果が配置されるレジスターを表します。
組込み関数名 |
演算 |
対応するインテル® SSE2 命令 |
---|---|---|
_mm_add_epi8 |
加算 |
PADDB |
_mm_add_epi16 |
加算 |
PADDW |
_mm_add_epi32 |
加算 |
PADDD |
_mm_add_si64 |
加算 |
PADDQ |
_mm_add_epi64 |
加算 |
PADDQ |
_mm_adds_epi8 |
加算 |
PADDSB |
_mm_adds_epi16 |
加算 |
PADDSW |
_mm_adds_epu8 |
加算 |
PADDUSB |
_mm_adds_epu16 |
加算 |
PADDUSW |
_mm_avg_epu8 |
平均値の計算 |
PAVGB |
_mm_avg_epu16 |
平均値の計算 |
PAVGW |
_mm_madd_epi16 |
積和 |
PMADDWD |
_mm_max_epi16 |
最大値の計算 |
PMAXSW |
_mm_max_epu8 |
最大値の計算 |
PMAXUB |
_mm_min_epi16 |
最小値の計算 |
PMINSW |
_mm_min_epu8 |
最小値の計算 |
PMINUB |
_mm_mulhi_epi16 |
乗算 |
PMULHW |
_mm_mulhi_epu16 |
乗算 |
PMULHUW |
_mm_mullo_epi16 |
乗算 |
PMULLW |
_mm_mul_su32 |
乗算 |
PMULUDQ |
_mm_mul_epu32 |
乗算 |
PMULUDQ |
_mm_sad_epu8 |
差分絶対値和の計算 |
PSADBW |
_mm_sub_epi8 |
減算 |
PSUBB |
_mm_sub_epi16 |
減算 |
PSUBW |
_mm_sub_epi32 |
減算 |
PSUBD |
_mm_sub_si64 |
減算 |
PSUBQ |
_mm_sub_epi64 |
減算 |
PSUBQ |
_mm_subs_epi8 |
減算 |
PSUBSB |
_mm_subs_epi16 |
減算 |
PSUBSW |
_mm_subs_epu8 |
減算 |
PSUBUSB |
_mm_subs_epu16 |
減算 |
PSUBUSW |
__m128i _mm_add_epi8(__m128i a, __m128i b);
a の 16 の符号付きまたは符号なし 8 ビット整数を、b の 16 の符号付きまたは符号なし 8 ビット整数に加算します。
R0 |
R1 |
... |
R15 |
---|---|---|---|
a0 + b0 |
a1 + b1; |
... |
a15 + b15 |
__m128i _mm_add_epi16(__m128i a, __m128i b);
a の 8 つの符号付きまたは符号なし 16 ビット整数を、b の 8 つの符号付きまたは符号なし 16 ビット整数に加算します。
R0 |
R1 |
... |
R7 |
---|---|---|---|
a0 + b0 |
a1 + b1 |
... |
a7 + b7 |
__m128i _mm_add_epi32(__m128i a, __m128i b);
a の 4 つの符号付きまたは符号なし 32 ビット整数を、b の 4 つの符号付きまたは符号なし 32 ビット整数に加算します。
R0 |
R1 |
R2 |
R3 |
---|---|---|---|
a0 + b0 |
a1 + b1 |
a2 + b2 |
a3 + b3 |
__m64 _mm_add_si64(__m64 a, __m64 b);
a の符号付きまたは符号なし 64 ビット整数を、b の符号付きまたは符号なし 64 ビット整数に加算します。
R0 |
---|
a + b |
__m128i _mm_add_epi64(__m128i a, __m128i b);
a の 2 つの符号付きまたは符号なし 64 ビット整数を、b の 2 つの符号付きまたは符号なし 64 ビット整数に加算します。
R0 |
R1 |
---|---|
a0 + b0 |
a1 + b1 |
__m128i _mm_adds_epi8(__m128i a, __m128i b);
飽和演算を使用して、a の 16 の符号付き 8 ビット整数を、b の 16 の符号付き 8 ビット整数に加算します。
R0 |
R1 |
... |
R15 |
---|---|---|---|
SignedSaturate (a0 + b0) |
SignedSaturate (a1 + b1) |
... |
SignedSaturate (a15 + b15) |
__m128i _mm_adds_epi16(__m128i a, __m128i b);
飽和演算を使用して、a の 8 つの符号付き 16 ビット整数を、b の 8 つの符号付き 16 ビット整数に加算します。
R0 |
R1 |
... |
R7 |
---|---|---|---|
SignedSaturate (a0 + b0) |
SignedSaturate (a1 + b1) |
... |
SignedSaturate (a7 + b7) |
__m128i _mm_adds_epu8(__m128i a, __m128i b);
飽和演算を使用して、a の 16 の符号なし 8 ビット整数を、b の 16 の符号なし 8 ビット整数に加算します。
R0 |
R1 |
... |
R15 |
---|---|---|---|
UnsignedSaturate (a0 + b0) |
UnsignedSaturate (a1 + b1) |
... |
UnsignedSaturate (a15 + b15) |
__m128i _mm_adds_epu16(__m128i a, __m128i b);
飽和演算を使用して、a の 8 つの符号なし 16 ビット整数を、b の 8 つの符号なし 16 ビット整数に加算します。
R0 |
R1 |
... |
R7 |
---|---|---|---|
UnsignedSaturate (a0 + b0) |
UnsignedSaturate (a1 + b1) |
... |
UnsignedSaturate (a7 + b7) |
__m128i _mm_avg_epu8(__m128i a, __m128i b);
a の 16 の符号なし 8 ビット整数と b の 16 の符号なし 8 ビット整数について、対応する値の平均値を計算し、その結果を丸めます。
R0 |
R1 |
... |
R15 |
---|---|---|---|
(a0 + b0) / 2 |
(a1 + b1) / 2 |
... |
(a15 + b15) / 2 |
__m128i _mm_avg_epu16(__m128i a, __m128i b);
a の 8 つの符号なし 16 ビット整数と b の 8 つの符号なし 16 ビット整数について、対応する値の平均値を計算し、その結果を丸めます。
R0 |
R1 |
... |
R7 |
---|---|---|---|
(a0 + b0) / 2 |
(a1 + b1) / 2 |
... |
(a7 + b7) / 2 |
__m128i _mm_madd_epi16(__m128i a, __m128i b);
a の 8 つの符号付き 16 ビット整数に、b の 8 つの符号付き 16 ビット整数を掛けます。得られた符号付き 32 ビット整数を 2 つずつ加算して、4 つの符号付き 32 ビット整数としてパックします。
R0 |
R1 |
R2 |
R3 |
---|---|---|---|
(a0 * b0) + (a1 * b1) |
(a2 * b2) + (a3 * b3) |
(a4 * b4) + (a5 * b5) |
(a6 * b6) + (a7 * b7) |
__m128i _mm_max_epi16(__m128i a, __m128i b);
a の 8 つの符号付き 16 ビット整数と b の 8 つの符号付き 16 ビット整数について、それぞれの値のペアの最大値を計算します。
R0 |
R1 |
... |
R7 |
---|---|---|---|
max(a0, b0) |
max(a1, b1) |
... |
max(a7, b7) |
__m128i _mm_max_epu8(__m128i a, __m128i b);
a の 16 の符号なし 8 ビット整数と b の 16 の符号なし 8 ビット整数について、それぞれの値のペアの最大値を計算します。
R0 |
R1 |
... |
R15 |
---|---|---|---|
max(a0, b0) |
max(a1, b1) |
... |
max(a15, b15) |
__m128i _mm_min_epi16(__m128i a, __m128i b);
a の 8 つの符号付き 16 ビット整数と b の 8 つの符号付き 16 ビット整数について、それぞれの値のペアの最小値を計算します。
R0 |
R1 |
... |
R7 |
---|---|---|---|
min(a0, b0) |
min(a1, b1) |
... |
min(a7, b7) |
__m128i _mm_min_epu8(__m128i a, __m128i b);
a の 16 の符号なし 8 ビット整数と b の 16 の符号なし 8 ビット整数について、それぞれの値のペアの最小値を計算します。
R0 |
R1 |
... |
R15 |
---|---|---|---|
min(a0, b0) |
min(a1, b1) |
... |
min(a15, b15) |
__m128i _mm_mulhi_epi16(__m128i a, __m128i b);
a の 8 つの符号付き 16 ビット整数に、b の 8 つの符号付き 16 ビット整数を掛けます。得られた 8 つの符号付き 32 ビット整数の上位 16 ビットをパックします。
R0 |
R1 |
... |
R7 |
---|---|---|---|
(a0 * b0)[31:16] |
(a1 * b1)[31:16] |
... |
(a7 * b7)[31:16] |
__m128i _mm_mulhi_epu16(__m128i a, __m128i b);
a の 8 つの符号なし 16 ビット整数に、b の 8 つの符号なし 16 ビット整数を掛けます。得られた 8 つの符号なし 32 ビット整数の上位 16 ビットをパックします。
R0 |
R1 |
... |
R7 |
---|---|---|---|
(a0 * b0)[31:16] |
(a1 * b1)[31:16] |
... |
(a7 * b7)[31:16] |
__m128i _mm_mullo_epi16(__m128i a, __m128i b);
a の 8 つの符号付きまたは符号なし 16 ビット整数に、b の 8 つの符号付きまたは符号なし 16 ビット整数を掛けます。得られた 8 つの符号付きまたは符号なし 32 ビット整数の下位 16 ビットをパックします。
R0 |
R1 |
... |
R7 |
---|---|---|---|
(a0 * b0)[15:0] |
(a1 * b1)[15:0] |
... |
(a7 * b7)[15:0] |
__m64 _mm_mul_su32(__m64 a, __m64 b);
a の下位の 32 ビット整数に、b の下位の 32 ビット整数を掛けて、64 ビット整数の結果を返します。
R0 |
---|
a0 * b0 |
__m128i _mm_mul_epu32(__m128i a, __m128i b);
a の 2 つの符号なし 32 ビット整数に、b の 2 つの符号なし 32 ビット整数を掛けます。得られた 2 つの符号なし 64 ビット整数をパックします。
R0 |
R1 |
---|---|
a0 * b0 |
a2 * b2 |
__m128i _mm_sad_epu8(__m128i a, __m128i b);
a の 16 の符号なし 8 ビット整数と b の 16 の符号なし 8 ビット整数について、それぞれの差の絶対値を計算します。上位の 8 つの差と下位の 8 つの差をそれぞれに合計して、得られた 2 つの符号なし 16 ビット整数を、結果の上位および下位の 64 ビット要素の中にパックします。
R0 |
R1 ~ R3 |
R4 |
R5 ~ R7 |
---|---|---|---|
abs(a0 - b0) + abs(a1 - b1) +...+ abs(a7 - b7) |
0x0 |
abs(a8 - b8) + abs(a9 - b9) +...+ abs(a15 - b15) |
0x0 |
__m128i _mm_sub_epi8(__m128i a, __m128i b);
a の 16 の符号付きまたは符号なし 8 ビット整数から、b の 16 の符号付きまたは符号なし 8 ビット整数を引きます。
R0 |
R1 |
... |
R15 |
---|---|---|---|
a0 - b0 |
a1 - b1 |
... |
a15 - b15 |
__m128i _mm_sub_epi16(__m128i a, __m128i b);
a の 8 つの符号付きまたは符号なし 16 ビット整数から、b の 8 つの符号付きまたは符号なし 16 ビット整数を引きます。
R0 |
R1 |
... |
R7 |
---|---|---|---|
a0 - b0 |
a1 - b1 |
... |
a7 - b7 |
__m128i _mm_sub_epi32(__m128i a, __m128i b);
a の 4 つの符号付きまたは符号なし 32 ビット整数から、b の 4 つの符号付きまたは符号なし 32 ビット整数を引きます。
R0 |
R1 |
R2 |
R3 |
---|---|---|---|
a0 - b0 |
a1 - b1 |
a2 - b2 |
a3 - b3 |
__m64 _mm_sub_si64 (__m64 a, __m64 b);
a の符号付きまたは符号なし 64 ビット整数から、b の符号付きまたは符号なし 64 ビット整数を引きます。
R |
---|
a - b |
__m128i _mm_sub_epi64(__m128i a, __m128i b);
a の 2 つの符号付きまたは符号なし 64 ビット整数から、b の 2 つの符号付きまたは符号なし 64 ビット整数を引きます。
R0 |
R1 |
---|---|
a0 - b0 |
a1 - b1 |
__m128i _mm_subs_epi8(__m128i a, __m128i b);
飽和演算を使用して、a の 16 の符号付き 8 ビット整数から、b の 16 の符号付き 8 ビット整数を引きます。
R0 |
R1 |
... |
R15 |
---|---|---|---|
SignedSaturate (a0 - b0) |
SignedSaturate (a1 - b1) |
... |
SignedSaturate (a15 - b15) |
__m128i _mm_subs_epi16(__m128i a, __m128i b);
飽和演算を使用して、a の 8 つの符号付き 16 ビット整数から、b の 8 つの符号付き 16 ビット整数を引きます。
R0 |
R1 |
... |
R15 |
---|---|---|---|
SignedSaturate (a0 - b0) |
SignedSaturate (a1 - b1) |
... |
SignedSaturate (a7 - b7) |
__m128i _mm_subs_epu8(__m128i a, __m128i b);
飽和演算を使用して、a の 16 の符号なし 8 ビット整数から、b の 16 の符号なし 8 ビット整数を引きます。
R0 |
R1 |
... |
R15 |
---|---|---|---|
UnsignedSaturate (a0 - b0) |
UnsignedSaturate (a1 - b1) |
... |
UnsignedSaturate (a15 - b15) |
__m128i _mm_subs_epu16(__m128i a, __m128i b);
飽和演算を使用して、a の 8 つの符号なし 16 ビット整数から、b の 8 つの符号なし 16 ビット整数を引きます。
R0 |
R1 |
... |
R7 |
---|---|---|---|
UnsignedSaturate (a0 - b0) |
UnsignedSaturate (a1 - b1) |
... |
UnsignedSaturate (a7 - b7) |