このセクションでは、ロード操作、設定操作、およびストア操作を行う組込み関数について説明します。ロード組込み関数と設定組込み関数はよく似ており、いずれも __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 命令には対応付けられません。