インテル® C++ コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
整数演算用のインテル® ストリーミング SIMD 拡張命令 (インテル® SSE) の組込み関数のプロトタイプは、ヘッダーファイル xmmintrin.h 内にあります。
これらの組込み関数を使用する場合、次のように immintrin.h ファイルをインクルードします。
#include <immintrin.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 |
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);
a と b のワードについて、要素ごとに最大値を計算します。
R0 |
R1 |
R2 |
R3 |
---|---|---|---|
min(a0, b0) |
min(a1, b1) |
min(a2, b2) |
min(a3, b3) |
__m64 _mm_max_pu8(__m64 a, __m64 b);
a と b の符号なしバイトについて、要素ごとに最大値を計算します。
R0 |
R1 |
... |
R7 |
---|---|---|---|
min(a0, b0) |
min(a1, b1) |
... |
min(a7, b7) |
__m64 _mm_min_pi16(__m64 a, __m64 b);
a と b のワードについて、要素ごとに最小値を計算します。
R0 |
R1 |
R2 |
R3 |
---|---|---|---|
min(a0, b0) |
min(a1, b1) |
min(a2, b2) |
min(a3, b3) |
__m64 _mm_min_pu8(__m64 a, __m64 b);
a と b の符号なしバイトについて、要素ごとに最小値を計算します。
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);
a と b の対応する符号なしワードを乗算し、得られた 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 にストアします。セレクター p の各バイトの最上位ビットによって、それに対応する 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);
a と b の対応する符号なしバイトについて、(丸め) 平均を計算します。
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);
a と b の対応する符号なし 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 |