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

次の表に、整数演算組込み関数のリストを示します。表の後に、最新のニーモニック命名規則に従って、各組込み関数の説明を示します。

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

組込み関数
の名前
別名 操作 対応する
命令
_m_pextrw _mm_extract_pi16 4 ワードのうち 1 つを抽出する PEXTRW
_m_pinsrw _mm_insert_pi16 1 ワードを挿入する PINSRW
_m_pmaxsw _mm_max_pi16 最大値を計算する PMAXSW
_m_pmaxub _mm_max_pu8 最大値を計算する (符号なし) PMAXUB
_m_pminsw _mm_min_pi16 最小値を計算する PMINSW
_m_pminub _mm_min_pu8 最小値を計算する (符号なし) PMINUB
_m_pmovmskb _mm_movemask_pi8 8 ビットマスクを作成する PMOVMSKB
_m_pmulhuw _mm_mulhi_pu16 乗算 (上位ビットを返す) PMULHUW
_m_pshufw _mm_shuffle_pi16 4 ワードを組み合わせて返す PSHUFW
_m_maskmovq _mm_maskmove_si64 条件付きストア MASKMOVQ
_m_pavgb _mm_avg_pu8 丸め平均を計算する PAVGB
_m_pavgw _mm_avg_pu16 丸め平均を計算する PAVGW
_m_psadbw _mm_sad_pu8 差の絶対値の合計を計算する PSADBW

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

int _m_pextrw(__m64 a, int n)

a の 4 ワードのうち 1 つを抽出します。セレクタ n は即値でなければなりません。
r := (n==0) ? a0 : ( (n==1) ? a1 : ( (n==2) ? a2 : a3 ) )

__m64 _m_pinsrw(__m64 a, int d, int n)

a の 4 ワードのうち 1 つに、ワード d を挿入します。セレクタ n は即値でなければなりません。
r0 := (n==0) ? d : a0;
r1 := (n==1) ? d : a1;
r2 := (n==2) ? d : a2;
r3 := (n==3) ? d : a3;

__m64 _m_pmaxsw(__m64 a, __m64 b)

ab のワードについて、要素ごとに最大値を計算します。
r0 := min(a0, b0)
r1 := min(a1, b1)
r2 := min(a2, b2)
r3 := min(a3, b3)

__m64 _m_pmaxub(__m64 a, __m64 b)

ab の符号なしバイトについて、要素ごとに最大値を計算します。
r0 := min(a0, b0)
r1 := min(a1, b1)
...
r7 := min(a7, b7)

__m64 _m_pminsw(__m64 a, __m64 b)

ab のワードについて、要素ごとに最小値を計算します。
r0 := min(a0, b0)
r1 := min(a1, b1)
r2 := min(a2, b2)
r3 := min(a3, b3)

__m64 _m_pminub(__m64 a, __m64 b)

ab の符号なしバイトについて、要素ごとに最小値を計算します。
r0 := min(a0, b0)
r1 := min(a1, b1)
...
r7 := min(a7, b7)

int _m_pmovmskb(__m64 a)

a の各バイトの最上位ビットから、8 ビットマスクを作成します。
r := sign(a7)<<7 | sign(a6)<<6 |... | sign(a0)

__m64 _m_pmulhuw(__m64 a, __m64 b)

ab の対応する符号なしワードを乗算し、得られた 32 ビットの中間結果の上位 16 ビットを返します。
r0 := hiword(a0 * b0)
r1 := hiword(a1 * b1)
r2 := hiword(a2 * b2)
r3 := hiword(a3 * b3)

__m64 _m_pshufw(__m64 a, int n)

a の 4 ワードを組み合わせて返します。セレクタ n は即値でなければなりません。
r0 := word (n&0x3) of a
r1 := word ((n>>2)&0x3) of a
r2 := word ((n>>4)&0x3) of a
r3 := word ((n>>6)&0x3) of a

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

d のバイト要素を、条件付きでアドレス p にストアします。セレクタ n の各バイトの最上位ビットによって、それに対応する d の各バイトがストアされるかどうかが決まります。
if (sign(n0)) p[0] := d0
if (sign(n1)) p[1] := d1
...
if (sign(n7)) p[7] := d7

__m64 _m_pavgb(__m64 a, __m64 b)

ab の対応する符号なしバイトについて、(丸め) 平均を計算します。
t = (unsigned short)a0 + (unsigned short)b0
r0 = (t >> 1) | (t & 0x01)
...
t = (unsigned short)a7 + (unsigned short)b7
r7 = (unsigned char)((t >> 1) | (t & 0x01))

__m64 _m_pavgw(__m64 a, __m64 b)

ab の対応する符号なしワードについて、(丸め) 平均を計算します。
t = (unsigned int)a0 + (unsigned int)b0
r0 = (t >> 1) | (t & 0x01)
...
t = (unsigned word)a7 + (unsigned word)b7
r7 = (unsigned short)((t >> 1) | (t & 0x01))

__m64 _m_psadbw(__m64 a, __m64 b)

ab の対応する符号なしバイトの差の絶対値の合計を計算し、最下位ワードの値を返します。上位 3 ワードはクリアされます。
r0 = abs(a0-b0) +... + abs(a7-b7)
r1 = r2 = r3 = 0