命名と使用する構文

ほとんどの組込み関数名は、次の表記規則に従います。

_mm_<intrin_op>_<suffix>

<intrin_op> 組込み関数の基本操作を示します。例えば、加算の場合は add、減算の場合は sub になります。
<suffix> 命令の操作対象となるデータの型を示します。各サフィックスの最初の1文字または2文字は、データがパックドデータ(p)、拡張パックドデータ(ep)、またはスカラデータ(s)であることを示します。その他の文字は、次のとおりデータ型を示します。
  • s 単精度浮動小数点値
  • d 倍精度浮動小数点値
  • i128 符号付き128ビット整数
  • i64 符号付き64ビット整数
  • u64 符号なし64ビット整数
  • i32 符号付き32ビット整数
  • u32 符号なし32ビット整数
  • i16 符号付き16ビット整数
  • u16 符号なし16ビット整数
  • i8 符号付き8ビット整数
  • u8 符号なし8ビット整数

変数名を付加した数字は、パックされたオブジェクトの要素を示します。例えば、r0rの最下位ワードです。一部の組込み関数は、2つ以上の命令で実行するため、「複合組込み関数」と呼ばれます。

パックされた値は、右から左の順序で表現し、最下位の値がスカラ操作に使用されます。次の操作の例について考えます。

double a[2] = {1.0, 2.0};

__m128d t = _mm_load_pd(a);

上の操作の結果は、次のそれぞれの操作と同じになります。

__m128d t = _mm_set_pd(2.0, 1.0);

__m128d t = _mm_setr_pd(1.0, 2.0);

つまり、値tを保持するxmmレジスタは、次のようになります。

「スカラ」要素は 1. 0です。一部の組込み関数では、命令の性質上、
引数として即値(定数整数リテラル)を指定しなければなりません。

組込み関数の構文

コードの中で組込み関数を使用するには、次の構文の行を挿入します。

data_type intrinsic_name (parameters)

各項の意味は次のとおりです。

data_type 戻りデータ型。voidint__m64__m128__m128d__m128i__int64のうちのいずれかです。すべてのインテル・アーキテクチャでサポートする組込み関数は、組込み関数の構文の定義に従って、その他のデータ型を返す場合があります。
intrinsic_name この名前は、実際の命令をインライン展開する代わりに C++ コード内で使用できる関数として機能します。
parameters 各組込み関数が要求するパラメータを表します。