この節では、ロード操作、設定操作、およびストア操作を行う組込み関数について説明します。ロード組込み関数と設定組込み関数はよく似ており、いずれも __m128 型のデータを初期化します。しかし、設定組込み関数は、データを定数で初期化するための関数で、float引数を使用します。 ロード組込み関数は、メモリからデータをロードする命令を模倣するための関数で、浮動小数点引数を使用します。ストア組込み関数は、初期化したデータを、指定したアドレスに割り当てます。
次の表に、各種の組込み関数のリストを示します。以降の項には、各組込み関数の構文と簡単な説明を示します。
ストリーミングSIMD拡張命令の組込み関数のプロトタイプは、ヘッダ・ファイルxmmintrin.h内にあります。
組込み関数名 | 別名 | 操作 | 対応する命令 |
---|---|---|---|
_mm_load_ss | 最下位の値をロードして、上位3つの値をクリアする。 | MOVSS | |
_mm_load_ps1 | _mm_load1_ps | 1つの値を4ワードすべてにロードする。 | MOVSS + シャッフリング |
_mm_load_ps | 4つの値をロードする(アドレスのアライメントが合っていなければならない)。 | MOVAPS | |
_mm_loadu_ps | 4つの値をロードする(アドレスのアライメントが合っている必要はない)。 | MOVUPS | |
_mm_loadr_ps | 4つの値を逆順でロードする。 | MOVAPS + シャッフリング | |
_mm_set_ss | 最下位の値を設定し、上位3つの値をクリアする。 | 複合 | |
_mm_set_ps1 | _mm_set1_ps | 4ワードすべてを同じ値に設定する。 | 複合 |
_mm_set_ps | 4つの値を設定する(アドレスのアライメントが合っていなければならない)。 | 複合 | |
_mm_setr_ps | 4つの値を逆順で設定する。 | 複合 | |
_mm_setzero_ps | 4つの値をすべてクリアする。 | 複合 | |
_mm_store_ss | 最下位の値をストアする。 | MOVSS | |
_mm_store_ps1 | _mm_store1_ps | 最下位の値を4ワードすべてにストアする。アドレスは、16バイトにアライメントが合っていなければなりません。 | Shuffling + MOVSS |
_mm_store_ps | 4つの値をストアする(アドレスのアライメントが合っていなければならない)。 | MOVAPS | |
_mm_storeu_ps | 4つの値をストアする(アドレスのアライメントが合っている必要はない)。 | MOVUPS | |
_mm_storer_ps | 4つの値を逆順でストアする。 | MOVAPS + シャッフリング | |
_mm_move_ss | 最下位ワードを設定し、上位3つの値はそのまま渡す。 | MOVSS | |
_mm_getcsr | レジスタの内容を返す | STMXCSR | |
_mm_setcsr | コントロール・レジスタ | LDMXCSR | |
_mm_prefetch | |||
_mm_stream_pi | |||
_mm_stream_ps | |||
_mm_sfence |
__m128 _mm_load_ss(float const*a)
単精度浮動小数点値を最下位ワードにロードし、上位3ワードをクリアします。
r0 := *a
r1 := 0.0 ; r2 := 0.0 ; r3 := 0.0
__m128 _mm_load_ps1(float const*a)
1個の単精度浮動小数点値をロードして、その値を4ワードすべてにコピーします。
r0 := *a
r1 := *a
r2 := *a
r3 := *a
__m128 _mm_load_ps(float const*a)
4つの単精度浮動小数点値をロードします。アドレスは16バイトにアライメントが合っていなければなりません。
r0 := a[0]
r1 := a[1]
r2 := a[2]
r3 := a[3]
__m128 _mm_loadu_ps(float const*a)
4つの単精度浮動小数点値をロードします。アドレスは16バイトにアライメントが合っていなくてもかまいません。
r0 := a[0]
r1 := a[1]
r2 := a[2]
r3 := a[3]
__m128 _mm_loadr_ps(float const*a)
4つの単精度浮動小数点値を逆順でロードします。アドレスは16バイトにアライメントが合っていなければなりません。
r0 := a[3]
r1 := a[2]
r2 := a[1]
r3 := a[0]
__m128 _mm_set_ss ( float w)
単精度浮動小数点値の最下位ワードをaに設定し、上位3ワードをクリアします。
r0 := c
r1 := r2 := r3 := 0.0
__m128 _mm_set_ss ( float w)
4個の単精度浮動小数点値をaに設定します。
r0 := r1 := r2 := r3 := a
__m128 _mm_set_ps ( float z, float y, float x, float w)
4つの単精度浮動小数点値を、4つの入力値に設定します。
r0 := a
r1 := b
r2 := c
r3 := d
__m128 _mm_setr_ps(float a, float b, float c, float d)
4つの単精度浮動小数点値を、逆順で4つの入力値に設定します。
r0 := d
r1 := c
r2 := b
r3 := a
__m128 _mm_setzero_ps(void)
4つの単精度浮動小数点値をクリアします。
r0 := r1 := r2 := r3 := 0.0
void _mm_store_ss(float *v, __m128 a)
最下位の単精度浮動小数点値をストアします。
*v := a0
void _mm_store_ps1(float *v, __m128 a)
最下位の単精度浮動小数点値を、4ワードにストアします。
v[0] := a0
v[1] := a0
v[2] := a0
v[3] := a0
void _mm_store_ps(float *v, __m128 a)
4個の単精度浮動小数点値をストアします。アドレスは16バイトにアライメントが合っていなければなりません。
v[0] := a0
v[1] := a1
v[2] := a2
v[3] := a3
void _mm_storeu_ps(float *v, __m128 a)
4個の単精度浮動小数点値をストアします。アドレスは16バイトにアライメントが合っていなくてもかまいません。
v[0] := a0
v[1] := a1
v[2] := a2
v[3] := a3
void _mm_store_ss(float *v, __m128 a)
4個の単精度浮動小数点値を逆順でストアします。アドレスは16バイトにアライメントが合っていなければなりません。
v[0] := a3
v[1] := a2
v[2] := a1
v[3] := a0
__m128 _mm_move_ss(__m128 a, __m128 b)
最下位ワードを、bの単精度浮動小数点値に設定します。上位3個の単精度浮動小数点値は、aからそのまま渡されます。
r0 := b0
r1 := a1
r2 := a2
r3 := a3
unsigned int _mm_getcsr(void)
コントロール・レジスタの内容を返します。
void _mm_setcsr(unsigned int i)
コントロール・レジスタを指定された値に設定します。
void _mm_prefetch(char const*a, int sel)
(PREFETCH を使用)1キャッシュ・ライン分のデータを、アドレスaからプロセッサに「近い」位置にロードします。sel の値は、プリフェッチ操作のタイプを指定します。 この値には、プリフェッチ命令のタイプに応じて、定数_MM_HINT_T0、_MM_HINT_T1、_MM_HINT_T2、または_MM_HINT_NTAを指定してください。
void _mm_stream_pi(__m64 *p, __m64 a)
(MOVNTQを使用)a のデータを、キャッシュを介さずに、アドレス p にストアします。この組込み関数を使用する前に、mmxレジスタのマルチメディア・ステートを空にする必要があります。詳細は、「EMMS命令:必要な理由」を参照してください。
void _mm_stream_ps(float *p, __m128 a)
(MOVNTPS を参照)a のデータを、キャッシュを介さずに、アドレス p にストアします。アドレスは16バイトにアライメントが合っていなければなりません。
void _mm_sfence(void)
(SFENCEを使用)すべての先行するストアが、後に続くストアより前に、グローバルにアクセス可能になるのを保証します。