ストリーミング SIMD 拡張命令の組込み関数によって、Itanium® アーキテクチャ上でストリーミング SIMD 拡張命令を利用できます。IA-32 アーキテクチャとのソースコードの互換性を保つために、これらの組込み関数の名前と機能は、IA-32 ベースのストリーミング SIMD 拡張命令の組込み関数セットと同等になっています。
これらの組込み関数を使用してプログラムを作成するには、ストリーミング SIMD 拡張命令によって提供されるハードウェア機能をよく理解している必要があります。特に、次の点に注意してください:
ストリーミング SIMD 拡張命令の組込み関数は、新しいデータ型の __m128 を使用します。このデータ型は、4 つの単精度浮動小数点値で構成される 128 ビットデータを表します。これは 128 ビットの IA-32 ストリーミング SIMD 拡張命令レジスタに対応します。
コンパイラは、__m128 型のローカルデータのアライメントを、スタック上の 16 バイト境界に合わせます。これらのデータ型のグローバル・データも、16 バイトにアライメントを合わせます。integer 型、float 型、または double 型の配列のアライメントを合わせるには、declspec ディレクティブを使用できます。
Itanium 命令は、パックドデータの操作でもスカラデータの操作でも、同じ方法でストリーミング SIMD 拡張命令レジスタを操作します。したがって、スカラデータを表す __m32 データ型はありません。スカラ操作には、__m128 オブジェクトと "スカラ" 形式の組込み関数を使用します。コンパイラとプロセッサは、32 ビットのメモリ参照によって、これらの操作を実行します。ただし、パフォーマンス上の理由で、できるだけスカラ形式の操作をパックド形式の操作で置き換えることをお勧めします。
__m128 オブジェクトのアドレスを指定できます。
詳細については、『IA-32 インテル® アーキテクチャ・ソフトウェア・デべロッパーズ・マニュアル、中巻:命令セット・リファレンス』インテル社、資料番号245471J を参照してください。
Itanium ベース・システム上での実装手法
ストリーミング SIMD 拡張命令の組込み関数は、__m128 データ型について定義しています。このデータ型は、4 つの単精度浮動小数点値で構成される 128 ビットデータです。Itanium ベースのシステム用の SIMD 命令は、2 つの単精度浮動小数点値を保持する 64 ビット浮動小数点レジスタのデータを操作します。したがって、それぞれの __m128 オペランドは、実際には浮動小数点レジスタのペアになります。このため、各組込み関数は、浮動小数点レジスタ・オペランドのペアを操作する、少なくとも 2 つの Itanium 命令に対応します。
Itanium ベースのシステム用のストリーミング SIMD 拡張命令の組込み関数はほとんど、パフォーマンスの向上のためではなく、既存の IA-32 組込み関数との互換性を保つために用意されたものです。IA-32 システム上でパフォーマンスを向上させる組込み関数を使用しても、Itanium ベースのシステム上ではパフォーマンスが向上しない場合もあります。この理由の 1 つとして、一部の組込み関数は、IA-32 命令セットには厳密に対応付けられますが、Itanium 命令セットには対応付けられていない場合があります。したがって、Itanium ベースのシステム上でのパフォーマンスの向上のために用意している組込み関数と、単に既存の IA-32 コードとの互換性を保つために用意している組込み関数は、区別して使用する必要があります。
次の組込み関数を使用すると、パフォーマンスが低下する可能性があります。これらの組込み関数は、既存のコードを移植する場合や、重要でないコード・セクションにのみ使用してください。
精度が多少低下してもかまわない場合は、真の div 組込み関数や sqrt 組込み関数の代わりに、逆数の近似値を計算する SIMD の組込み関数 (rcp) や逆数の平方根の近似値を計算する SIMD の組込み関数 (rsqrt) を使用すれば、処理速度が大幅に向上します。