ストリーミング SIMD 拡張命令 2 の浮動小数点ロード操作

次のロード操作組み込み関数とそれに対応する命令は、ストリーミング SIMD 拡張命令 2 (SSE2) をサポートするプロセッサー上で有効です。

ロード組み込み関数と設定組み込み関数はよく似ており、いずれも __m128d 型のデータを初期化します。しかし、設定組み込み関数は、データを定数で初期化するための関数で、double 引数を使用します。ロード組み込み関数は、メモリーからデータをロードする命令を模倣するための関数で、double ポインター引数を使用します。

次の表の組み込み関数名をクリックすると、その組み込み関数の詳細が表示されます。

各組み込み関数演算の結果はレジスターに配置されます。各レジスターに配置される値については、次の表の関数名の詳細で示します。R0 および R1 は、結果が配置されるレジスターを表します。

SSE2 の組み込み関数のプロトタイプは、ヘッダーファイル emmintrin.h 内にあります。

サンプルコード Double Complex では、これらの組み込み関数の使用方法を紹介しています。

組み込み関数名 操作 対応する SSE2 命令
_mm_load_pd 2 つの倍精度浮動小数点値をロードする MOVAPD
_mm_load1_pd 1 つの倍精度浮動小数点値をロードして、その値を両方の要素にコピーする MOVSD + Shuffling
_mm_loadr_pd 2 つの倍精度浮動小数点値を逆順でロードする MOVAPD + Shuffling
_mm_loadu_pd 2 つの倍精度浮動小数点値をロードする MOVUPD
_mm_load_sd 倍精度浮動小数点値をロードして、上位の倍精度浮動小数点値を 0 に設定する  MOVSD
_mm_loadh_pd 結果の上位の倍精度浮動小数点値として、1 つの倍精度浮動小数点値をロードする MOVHPD
_mm_loadl_pd 結果の下位の倍精度浮動小数点値として、1 つの倍精度浮動小数点値をロードする MOVLPD

 

__m128d _mm_load_pd(double const*dp)

2 つの倍精度浮動小数点値をロードします。アドレス p は、16 バイトにアライメントが合っていなければなりません。

R0 R1
p[0] p[1]

 

__m128d _mm_load1_pd(double const*dp)

 1 つの倍精度浮動小数点値をロードして、その値を両方の要素にコピーします。アドレス p は、16 バイトにアライメントが合っていなくてもかまいません。

R0 R1
*p *p

 

__m128d _mm_loadr_pd(double const*dp)

2 つの倍精度浮動小数点値を逆順でロードします。アドレス p は、16 バイトにアライメントが合っていなければなりません。

R0 R1
p[1] p[0]

 

__m128d _mm_loadu_pd(double const*dp)

2 つの倍精度浮動小数点値をロードします。アドレス p は、16 バイトにアライメントが合っていなくてもかまいません。

R0 R1
p[0] p[1]

 

__m128d _mm_load_sd(double const*dp)

1 つの倍精度浮動小数点値をロードします。上位の倍精度浮動小数点値は 0 に設定されます。アドレス p は、16 バイトにアライメントが合っていなくてもかまいません。

R0 R1
*p 0.0

 

__m128d _mm_loadh_pd(__m128d a, double const*dp)

結果の上位の倍精度浮動小数点値として、1 つの倍精度浮動小数点値をロードします。下位の倍精度浮動小数点値は、a からそのまま渡されます。アドレス p は、16 バイトにアライメントが合っていなくてもかまいません。

R0 R1
a0 *p

 

__m128d _mm_loadl_pd(__m128d a, double const*dp)

結果の下位の倍精度浮動小数点値として、1 つの倍精度浮動小数点値をロードします。上位の倍精度浮動小数点値は、a からそのまま渡されます。アドレス p は、16 バイトにアライメントが合っていなくてもかまいません。

R0 R1
*p a1