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

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

ストリーミングSIMD拡張命令2の組込み関数のプロトタイプは、ヘッダ・ファイル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 減算
 

__m128i _mm_add_epi8 (__m128i a,__m128i b )

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

r0 := a0 + b0
r1 := a1 + b1
...
r15 := a15 + b15

__mm128i _mm_add_epi16(__m128i a, __m128i b)

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

r0 := a0 + b0
r1 := a1 + b1
...
r7 := a7 + b7

__m128i _mm_add_epi32(__m128i a, __m128i b)

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

r0 := a0 + b0
r1 := a1 + b1
r2 := a2 + b2
r3 := a3 + b3

__m64 _mm_add_si64(__m64 a, __m64 b)

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

r := a + b

__m128i _mm_add_epi64(__m128i a, __m128i b)

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

r0 := a0 + b0
r1 := a1 + b1

__m128i _mm_adds_epi8(__m128i a, __m128i b)

飽和演算を使用して、aの16個の符号付き8ビット整数を、bの16個の符号付き8ビット整数に加算します。

r0 := SignedSaturate(a0 + b0)
r1 := SignedSaturate(a1 + b1)
...
r15 := SignedSaturate(a15 + b15)

__m128i _mm_adds_epi16(__m128i a, __m128i b)

飽和演算を使用して、aの8個の符号付き16ビット整数を、bの8個の符号付き16ビット整数に加算します。

r0 := SignedSaturate(a0 + b0)
r1 := SignedSaturate(a1 + b1)
...
r7 := SignedSaturate(a7 + b7)

__m128i _mm_adds_epu8(__m128i a, __m128i b)

飽和演算を使用して、aの16個の符号なし8ビット整数を、bの16個の符号なし8ビット整数に加算します。

r0 := UnsignedSaturate(a0 + b0)
r1 := UnsignedSaturate(a1 + b1)
...
r15 := UnsignedSaturate(a15 + b15)

__m128i _mm_adds_epu16(__m128i a, __m128i b)

飽和演算を使用して、aの8個の符号なし16ビット整数を、bの8個の符号なし16ビット整数に加算します。

r0 := UnsignedSaturate(a0 + b0)
r1 := UnsignedSaturate(a1 + b1)
...
r15 := UnsignedSaturate(a7 + b7)

__m128i _mm_avg_epu8(__m128i a, __m128i b)

aの16個の符号なし8ビット整数とbの16個の符号なし8ビット整数について、対応する値の平均値を計算し、その結果を丸めます。

r0 := (a0 + b0) / 2
r1 := (a1 + b1) / 2
...
r15 := (a15 + b15) / 2

__m128i _mm_avg_epu16(__m128i a, __m128i b)

aの8個の符号なし16ビット整数とbの8個の符号なし16ビット整数について、対応する値の平均値を計算し、その結果を丸めます。

r0 := (a0 + b0) / 2
r1 := (a1 + b1) / 2
...
r7 := (a7 + b7) / 2

__m128i _mm_madd_epi16(__m128i a, __m128i b)

aの8個の符号付き16ビット整数に、bの8個の符号付き16ビット整数を掛けます。得られた符号付き32ビット整数を2つずつ加算して、4個の符号付き32ビット整数としてパックします。

r0 := (a0 * b0) + (a1 * b1)
r1 := (a2 * b2) + (a3 * b3)
r2 := (a4 * b4) + (a5 * b5)
r3 := (a6 * b6) + (a7 * b7)

__m128i _mm_max_epi16(__m128i a, __m128i b)

aの8個の符号付き16ビット整数とbの8個の符号付き16ビット整数について、それぞれの値のペアの最大値を計算します。

r0 := max(a0, b0)
r1 := max(a1, b1)
...
r7 := max(a7, b7)

__m128i _mm_max_epu8(__m128i a, __m128i b)

aの16個の符号なし8ビット整数とbの16個の符号なし8ビット整数について、それぞれの値のペアの最大値を計算します。

r0 := max(a0, b0)
r1 := max(a1, b1)
...
r15 := max(a15, b15)

__m128i _mm_min_epi16(__m128i a, __m128i b)

aの8個の符号付き16ビット整数とbの8個の符号付き16ビット整数について、それぞれの値のペアの最小値を計算します。

r0 := min(a0, b0)
r1 := min(a1, b1)
...
r7 := min(a7, b7)

__m128i _mm_min_epu8(__m128i a, __m128i b)

aの16個の符号なし8ビット整数とbの16個の符号なし8ビット整数について、それぞれの値のペアの最小値を計算します。

r0 := min(a0, b0)
r1 := min(a1, b1)
...
r15 := min(a15, b15)

__m128i _mm_mulhi_epi16(__m128i a, __m128i b)

aの8個の符号付き16ビット整数に、bの8個の符号付き16ビット整数を掛けます。得られた8個の符号付き32ビット整数の上位16ビットをパックします。

r0 := (a0 * b0)[31:16]
r1 := (a1 * b1)[31:16]
...
r7 := (a7 * b7)[31:16]

__m128i _mm_mulhi_epu16(__m128i a, __m128i b)

aの8個の符号なし16ビット整数に、bの8個の符号なし16ビット整数を掛けます。得られた8個の符号なし32ビット整数の上位16ビットをパックします。

r0 := (a0 * b0)[31:16]
r1 := (a1 * b1)[31:16]
...
r7 := (a7 * b7)[31:16]

__m128i_mm_mullo_epi16(__m128i a, __m128i b)

aの8個の符号付きまたは符号なし16ビット整数に、bの8個の符号付きまたは符号なし16ビット整数を掛けます。得られた8個の符号付きまたは符号なし32ビット整数の下位16ビットをパックします。

r0 := (a0 * b0)[15:0]
r1 := (a1 * b1)[15:0]
...
r7 := (a7 * b7)[15:0]

__m64 _mm_mul_su32(__m64 a, __m64 b)

aの下位の32ビット整数に、bの下位の32ビット整数を掛けて、64ビット整数の結果を返します。

r := a0 * b0

__m128i _mm_mul_epu32(__m128i a, __m128i b)

aの2個の符号なし32ビット整数に、bの2個の符号なし32ビット整数を掛けます。得られた2個の符号なし64ビット整数をパックします。

r0 := a0 * b0
r1 := a2 * b2

__m128i _mm_sad_epu8(__m128i a, __m128i b)

aの16個の符号なし8ビット整数とbの16個の符号なし8ビット整数について、それぞれの差の絶対値を計算します。上位の8つの差と下位の8つの差をそれぞれに合計して、得られた2個の符号なし16ビット整数を、結果の上位および下位の64ビット要素の中にパックします。

r0 := abs(a0 - b0) + abs(a1 - b1) +...+ abs(a7 - b7)
r1 := 0x0 ; r2 := 0x0 ; r3 := 0x0
r4 := abs(a8 - b8) + abs(a9 - b9) +...+ abs(a15 - b15)
r5 := 0x0 ; r6 := 0x0 ; r7 := 0x0

__m128i _mm_sub_epi8(__m128i a, __m128i b)

aの16個の符号付きまたは符号なし8ビット整数から、bの16個の符号付きまたは符号なし8ビット整数を引きます。

r0 := a0 - b0
r1 := a1 - b1
...
r15 := a15 - b15

__m128i_mm_sub_epi16(__m128i a, __m128i b)

aの8個の符号付きまたは符号なし16ビット整数から、bの8個の符号付きまたは符号なし16ビット整数を引きます。

r0 := a0 - b0
r1 := a1 - b1
...
r7 := a7 - b7

__m128i _mm_sub_epi32(__m128i a, __m128i b)

aの4個の符号付きまたは符号なし32ビット整数から、bの4個の符号付きまたは符号なし32ビット整数を引きます。

r0 := a0 - b0
r1 := a1 - b1
r2 := a2 - b2
r3 := 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 := a0 - b0
r1 := a1 - b1

__m128i _mm_subs_epi8(__m128i a, __m128i b)

飽和演算を使用して、aの16個の符号付き8ビット整数から、bの16個の符号付き8ビット整数を引きます。

r0 := SignedSaturate(a0 - b0)
r1 := SignedSaturate(a1 - b1)
...
r15 := SignedSaturate(a15 - b15)

__m128i _mm_subs_epi16(__m128i a, __m128i b)

飽和演算を使用して、aの8個の符号付き16ビット整数から、bの8個の符号付き16ビット整数を引きます。

r0 := SignedSaturate(a0 - b0)
r1 := SignedSaturate(a1 - b1)
...
r7 := SignedSaturate(a7 - b7)

__m128i _mm_subs_epu8(__m128i a, __m128i b)

飽和演算を使用して、aの16個の符号なし8ビット整数から、bの16個の符号なし8ビット整数を引きます。

r0 := UnsignedSaturate(a0 - b0)
r1 := UnsignedSaturate(a1 - b1)
...
r15 := UnsignedSaturate(a15 - b15)

__m128i _mm_subs_epu16(__m128i a, __m128i b)

飽和演算を使用して、aの8個の符号なし16ビット整数から、bの8個の符号なし16ビット整数を引きます。

r0 := UnsignedSaturate(a0 - b0)
r1 := UnsignedSaturate(a1 - b1)
...
r7 := UnsignedSaturate(a7 - b7)