ストリーミングSIMD拡張命令を使用するメモリ操作と初期化操作

この節では、ロード操作、設定操作、およびストア操作を行う組込み関数について説明します。ロード組込み関数と設定組込み関数はよく似ており、いずれも __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を使用)すべての先行するストアが、後に続くストアより前に、グローバルにアクセス可能になるのを保証します。