ストリーミング SIMD 拡張命令を使用する整数演算組み込み関数

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

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

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

これらの組み込み関数を使用する前に、MMX(R) テクノロジー・レジスターのマルチメディア・ステートを空にする必要があります。詳細については、「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

 

int _mm_extract_pi16(__m64 a, int n)

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

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

 

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

 

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

 

__m64 _mm_max_pu8(__m64 a, __m64 b)

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

R0 R1 ... R7
min(a0, b0) min(a1, b1) ... min(a7, b7)

 

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

 

__m64 _mm_min_pu8(__m64 a, __m64 b)

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

R0 R1 ... R7
min(a0, b0) min(a1, b1) ... min(a7, b7)

 

__m64 _mm_movemask_pi8(__m64 b)

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

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

 

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

 

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

 

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

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

if (sign(n0)) if (sign(n1)) ... if (sign(n7))
p[0] := d0 p[1] := d1 ... p[7] := d7

 

__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

 

__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

 

__m64 _mm_sad_pu8(__m64 a, __m64 b)

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

R0 R1 R2 R3

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

0

0

0