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

算術演算組込み関数

ここでは、整数演算用のインテル® ストリーミング SIMD 拡張命令 2 (インテル® SSE2) の組込み関数について説明します。インテル® SSE2 の組込み関数のプロトタイプは、ヘッダーファイル emmintrin.h 内にあります。

各組込み関数演算の結果はレジスターに配置されます。各レジスターに配置される値については、次の表の関数名の詳細で示します。RR0R1、... 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

_mm_add_epi8

__m128i _mm_add_epi8(__m128i a, __m128i b);

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

R0

R1

...

R15

a0 + b0

a1 + b1;

...

a15 + b15

_mm_add_epi16

__m128i _mm_add_epi16(__m128i a, __m128i b);

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

R0

R1

...

R7

a0 + b0

a1 + b1

...

a7 + b7

_mm_add_epi32

__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

_mm_add_si64

__m64 _mm_add_si64(__m64 a, __m64 b);

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

R0

a + b

_mm_add_epi64

__m128i _mm_add_epi64(__m128i a, __m128i b);

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

R0

R1

a0 + b0

a1 + b1

_mm_adds_epi8

__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)

_mm_adds_epi16

__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)

_mm_adds_epu8

__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)

_mm_adds_epu16

__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)

_mm_avg_epu8

__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

_mm_avg_epi16

__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

_mm_madd_epi16

__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)

_mm_max_epi16

__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)

_mm_max_epu8

__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)

_mm_min_epi16

__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)

_mm_min_epu8

__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)

_mm_mulhi_epi16

__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]

_mm_mulhi_epu16

__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]

_mm_mullo_epi16

__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]

_mm_mul_su32

__m64 _mm_mul_su32(__m64 a, __m64 b);

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

R0

a0 * b0

_mm_mul_epu32

__m128i _mm_mul_epu32(__m128i a, __m128i b);

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

R0

R1

a0 * b0

a2 * b2

_mm_sad_epu8

__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

_mm_sub_epi8

__m128i _mm_sub_epi8(__m128i a, __m128i b);

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

R0

R1

...

R15

a0 - b0

a1 - b1

...

a15 - b15

_mm_sub_epi16

__m128i _mm_sub_epi16(__m128i a, __m128i b);

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

R0

R1

...

R7

a0 - b0

a1 - b1

...

a7 - b7

_mm_sub_epi32

__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

_mm_sub_si64

__m64 _mm_sub_si64 (__m64 a, __m64 b);

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

R

a - b

_mm_sub_epi64

__m128i _mm_sub_epi64(__m128i a, __m128i b);

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

R0

R1

a0 - b0

a1 - b1

_mm_subs_epi8

__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)

_mm_subs_epi16

__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)

_mm_subs_epu8

__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)

_mm_subs_epu16

__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)