ストリーミング SIMD 拡張命令 2 の整数算術演算

次の表に、ストリーミング SIMD 拡張命令 2 (SSE2) の整数算術演算組み込み関数のリストを示します。表の後に、各組み込み関数の説明を示します。SSE2 の浮動小数点パックド算術演算組み込み関数については、「ストリーミング SIMD 拡張命令 2 の浮動小数点算術演算」を参照してください。

次の表の組み込み関数名をクリックすると、その組み込み関数の詳細が表示されます。

各組み込み関数演算の結果はレジスターに配置されます。各レジスターに配置される値については、次の表の関数名の詳細で示します。R、R0、R1 〜 R15 は、結果が配置されるレジスターを表します。

SSE2 の組み込み関数のプロトタイプは、ヘッダーファイル emmintrin.h 内にあります。

組み込み関数 操作 命令
_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

 

__mm128i _mm_add_epi8(__m128i a, __m128i b)

a の 16 の符号付きまたは符号なし 8 ビット整数を、b の 16 の符号付きまたは符号なし 8 ビット整数に加算します。

R0 R1 ... R15
a0 + b0 a1 + b1; ... a15 + b15

 

__mm128i _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 R2 R3 R4 R5 R6 R7
abs(a0 - b0) + abs(a1 - b1) +...+ abs(a7 - b7) 0x0 0x0 0x0 abs(a8 - b8) + abs(a9 - b9) +...+ abs(a15 - b15) 0x0 0x0 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)