Oracle® Solaris Studio 12.4: C ユーザーガイド

印刷ビューの終了

更新: 2014 年 12 月
 
 

2.19.1 SIMD 組み込み関数

SPARC64X および SPARC64X+ によって提供される SIMD データは、double または unsigned long long の値のペアを保持することができます。コンパイラには、これらのデータを処理するためのいくつかの組み込み関数タイプおよび機能があります。

2.19.1.1 型と演算

sparcace_types.h ヘッダーファイルで宣言されるプロトタイプは、SPARC64X および SPARC64X+ が提供する次の 2 つの SIMD データ型をサポートします。

__m128d

倍精度の浮動小数点数のペア

__m128i

符号付き/符号なし 64 ビット整数のペア

SIMD データ型

  • 集約でなく基本型として処理され、内部構造はありません。データの一部を取得する組み込み関数を使用する必要があります。

  • 型修飾子 const または volatile、あるいはその両方で変更できます。

  • ストレージクラス指定子 autostaticregisterextern、および typedef あるいはこれらのいずれかで指定できます。

  • 集合 arraystruct、および union あるいはこれらのいずれかの要素とすることができます。

SIMD データ型の変数

  • 関数の仮パラメータとなることができます。

  • 関数呼び出しの実引数となることができます。

  • 関数の戻り値となることができます。

  • 代入演算子「=」の左辺または右辺となることができます。

  • アドレス演算子「&」のオペランドとなることができます。

  • sizeof 演算子のオペランドとなることができます。

  • typeof 演算子のオペランドとなることができます。

SIMD データ型に対してリテラル構文はサポートされていません。正しい組み込み関数を使用して SIMD データ型を構築することができます。

2.19.1.2 アプリケーションバイナリインタフェースの拡張

関数に対する SIMD 値の受け渡し

最初の 8 つまでの SIMD 引数が浮動小数点レジスタ経由で渡されます。SIMD 引数の最初の半分は、%d0%d4%d8、...、%d28 に入ります。SIMD 引数の残り半分は、%d256%d260%d264、...、%d284 に入ります。9 つ以上の SIMD 引数がある場合、これらはスタック領域経由で渡されます。

関数からの SIMD 戻り値

SIMD 戻り値の最初の半分は、%d0 に表示されます。残りの半分は、%d256 に表示されます。

メモリー内での SIMD 値の保管

SIMD load(ldd,s)/store(std,s) でロードまたは保管するには、SIMD 型の値を 16 バイトに整列されたアドレスに保管する必要があります。

2.19.1.3 組み込み関数

sparcace_types.h ヘッダーファイル内で宣言される組み込み関数は、次のようになります。

__m128d __sparcace_set_m128d(double a, double b)

この関数は、倍精度浮動小数点数のペアから __m128d 型データを構築し、オブジェクトを返します。

__m128i __sparcace_set_m128i(unsigned long long a, unsigned long long b)

この関数は、unsigned long long 型の数のペアから __m128i 型のデータを構築し、オブジェクトを返します。

double __sparcace_extract_m128d(__m128d a, int imm

この関数は、最初のパラメータとして渡された __m128d 型のデータから、倍精度浮動小数点数を抽出します。抽出される値は 2 番目のパラメータによって制御されます。2 番目のパラメータは整数である必要があり、0 または 1 の定数である必要があります。

unsigned long long __sparcace_extract_m128i(__m128i a, int imm)

この関数は、最初のパラメータとして渡された __m128i 型のデータから unsigned long long 型の数を抽出します。抽出される値は 2 番目のパラメータによって制御されます。2 番目のパラメータは整数である必要があり、0 または 1 の定数である必要があります。