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

このセクションでは、ロード操作、設定操作、およびストア操作を行う組込み関数について説明します。ロード組込み関数と設定組込み関数はよく似ており、いずれも __m128 型のデータを初期化します。しかし、設定組込み関数は、データを定数で初期化するための関数で、float 引数を使用します。ロード組込み関数は、メモリからデータをロードする命令を模倣するための関数で、浮動小数点引数を使用します。ストア組込み関数は、初期化したデータを、指定したアドレスに割り当てます。

次の表に、各種の組込み関数のリストを示します。以降の項には、各組込み関数の構文と簡単な説明を示します。

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

組込み関数
別名
操作 対応する
命令
_mm_load_ss   最下位の値をロードして、上位 3 つの値をクリアする MOVSS
_mm_load_ps1 _mm_load1_ps 1 つの値を 4 ワードすべてにロードする MOVSS + Shuffling
_mm_load_ps   4 つの値をロードする (アドレスのアライメントが合っていなければなりません) MOVAPS
_mm_loadu_ps   4 つの値をロードする (アドレスのアライメントが合っている必要はありません) MOVUPS
_mm_loadr_ps   4 つの値を逆順でロードする MOVAPS + Shuffling
_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 + Shuffling
_mm_move_ss   最下位ワードを設定し、上位 3 つの値はそのまま渡す MOVSS
_mm_getcsr   レジスタの内容を返す STMXCSR
_mm_setcsr   コントロール・レジスタ LDMXCSR
_mm_prefetch      
_mm_stream_pi      
_mm_stream_ps      
_mm_sfence      
_mm_cvtss_f32      

__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 a)

単精度浮動小数点値の最下位ワードを a に設定し、上位 3 ワードをクリアします。
r0 := c
r1 := r2 := r3 := 0.0

__m128 _mm_set_ps1(float a)

4 つの単精度浮動小数点値を a に設定します。
r0 := r1 := r2 := r3 := a

__m128 _mm_set_ps(float a, float b, float c, float d)

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_storer_ps(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 の値は、プリフェッチ操作のタイプを指定します。IA-32 の場合、この値には、プリフェッチ命令のタイプに応じて、定数 _MM_HINT_T0_MM_HINT_T1_MM_HINT_T2、または _MM_HINT_NTA を指定してください。Itanium® ベース・システムの場合、定数 _MM_HINT_T1_MM_HINT_NT1_MM_HINT_NT2、または_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 を使用) すべての先行するストアが、後に続くストアより前に、グローバルにアクセス可能になるのを保証します。

float _mm_cvtss_f32(__m128 a)

この組込み関数は __m128 の最初のベクトル要素から単精度浮動小数点値を抽出します。使用されるコンテキストで可能な最も効率的な方法で行われます。この組込み関数は特定の SSE 命令には対応付けられません。