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

整数演算組込み関数

整数演算用のインテル® ストリーミング SIMD 拡張命令 (インテル® SSE) の組込み関数のプロトタイプは、ヘッダーファイル xmmintrin.h 内にあります。

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

これらの組込み関数を使用する前に、MMX レジスターのマルチメディア・ステートを空にする必要があります。詳細については、「EMMS 命令: 必要な理由」を参照してください。

組込み関数名

演算

対応するインテル® SSE 命令

_mm_extract_pi16

4 ワードのうち 1 つを抽出する

PEXTRW

_mm_insert_pi16

1 ワードを挿入する

PINSRW

_mm_max_pi16

最大値を計算する

PMAXSW

_mm_max_pu8

最大値を計算する (符号なし)

PMAXUB

_mm_min_pi16

最小値を計算する

PMINSW

_mm_min_pu8

最小値を計算する (符号なし)

PMINUB

_mm_movemask_pi8

8 ビット・マスクを作成する

PMOVMSKB

_mm_mulhi_pu16

乗算 (上位ビットを返す)

PMULHUW

_mm_shuffle_pi16

4 ワードを組み合わせて返す

PSHUFW

_mm_maskmove_si64

条件付きストア

MASKMOVQ

_mm_avg_pu8

丸め平均を計算する

PAVGB

_mm_avg_pu16

丸め平均を計算する

PAVGW

_mm_sad_pu8

差分絶対値和を計算する

PSADBW

_mm_extract_pi16

int _mm_extract_pi16(__m64 a, int n);

a の 4 ワードのうち 1 つを抽出します。セレクター n は即値でなければなりません。

R

(n==0) ? a0 : ( (n==1) ? a1 : ( (n==2) ? a2 : a3 ) )

_mm_insert_pi16

__m64 _mm_insert_pi16(__m64 a, int d, int n);

a の 4 ワードのうち 1 つに、ワード d を挿入します。セレクター n は即値でなければなりません。

R0

R1

R2

R3

(n==0) ? d : a0;

(n==1) ? d : a1;

(n==2) ? d : a2;

(n==3) ? d : a3;

_mm_max_pi16

__m64 _mm_max_pi16(__m64 a, __m64 b);

ab のワードについて、要素ごとに最大値を計算します。

R0

R1

R2

R3

min(a0, b0)

min(a1, b1)

min(a2, b2)

min(a3, b3)

_mm_max_pu8

__m64 _mm_max_pu8(__m64 a, __m64 b);

ab の符号なしバイトについて、要素ごとに最大値を計算します。

R0

R1

...

R7

min(a0, b0)

min(a1, b1)

...

min(a7, b7)

_mm_min_pi16

__m64 _mm_min_pi16(__m64 a, __m64 b);

ab のワードについて、要素ごとに最小値を計算します。

R0

R1

R2

R3

min(a0, b0)

min(a1, b1)

min(a2, b2)

min(a3, b3)

_mm_min_pu8

__m64 _mm_min_pu8(__m64 a, __m64 b);

ab の符号なしバイトについて、要素ごとに最小値を計算します。

R0

R1

...

R7

min(a0, b0)

min(a1, b1)

...

min(a7, b7)

_mm_movemask_pi8

__m64 _mm_movemask_pi8(__m64 b);

a の各バイトの最上位ビットから、8 ビット・マスクを作成します。

R

sign(a7)<<7 | sign(a6)<<6 |...| sign(a0)

_mm_mulhi_pu16

__m64 _mm_mulhi_pu16(__m64 a, __m64 b);

ab の対応する符号なしワードを乗算し、得られた 32 ビットの中間結果の上位 16 ビットを返します。

R0

R1

R2

R3

hiword(a0 * b0)

hiword(a1 * b1)

hiword(a2 * b2)

hiword(a3 * b3)

_mm_shuffle_pi16

__m64 _mm_shuffle_pi16(__m64 a, int n);

a の 4 ワードを組み合わせて返します。セレクター n は即値でなければなりません。

R0

R1

R2

R3

a のワード (n&0x3)

a のワード ((n>>2)&0x3)

a のワード ((n>>4)&0x3)

a のワード ((n>>6)&0x3)

_mm_maskmove_si64

void _mm_maskmove_si64(__m64 d, __m64 n, char *p);

d のバイト要素を、条件付きでアドレス p にストアします。セレクター p の各バイトの最上位ビットによって、それに対応する d の各バイトがストアされるかどうかが決まります。

if (sign(n0))

if (sign(n1))

...

if (sign(n7))

p[0] := d0

p[1] := d1

...

p[7] := d7

_mm_avg_pu8

__m64 _mm_avg_pu8(__m64 a, __m64 b);

ab の対応する符号なしバイトについて、(丸め) 平均を計算します。

R0

R1

...

R7

(t >> 1) | (t & 0x01)t = (unsigned char)a0 + (unsigned char)b0

(t >> 1) | (t & 0x01)t = (unsigned char)a1 + (unsigned char)b1

...

((t >> 1) | (t & 0x01))t = (unsigned char)a7 + (unsigned char)b7

_mm_avg_pu16

__m64 _mm_avg_pu16(__m64 a, __m64 b);

ab の対応する符号なし short について、(丸め) 平均を計算します。

R0

R1

...

R7

(t >> 1) | (t & 0x01)t = (unsigned int)a0 + (unsigned int)b0

(t >> 1) | (t & 0x01)t = (unsigned int)a1 + (unsigned int)b1

...

(t >> 1) | (t & 0x01)t = (unsigned int)a7 + (unsigned int)b7

_mm_sad_pu8

__m64 _mm_sad_pu8(__m64 a, __m64 b);

ab の対応する符号なしバイトの差分絶対値和を計算し、最下位ワードの値を返します。上位 3 ワードはクリアされます。

R0

R1

R2

R3

abs(a0-b0) +...+ abs(a7-b7)

0

0

0