Oracle® Developer Studio 12.5: C ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

2.20 SPARC64X および SPARC64X+ プラットフォーム組み込み関数のためのコンパイラサポート

Oracle Developer Studio コンパイラは、SPARC64X や SPARC64X+ が持っている特殊な機能、つまり SIMD データおよび 10 進浮動小数点数をサポートするための組み込み型と組み込み関数を提供しています。

これらの組み込み関数を使用するソースファイルをコンパイルするには、-xarch=[sparcace|sparcaceplus] オプションおよび -m64 オプションを両方指定する必要があります。

2.20.1 SIMD 組み込み関数

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

2.20.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.20.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.20.1.3 組み込み関数

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

__m128d __sparcace_set_m128d(double a, double b)

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

__m128d _mm_set_pd(double z, double y)

これは __sparcace_set_m128d() の別名です。

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

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

__m128i _mm_set_epi64x(long long a, long long b)

これは __sparcace_set_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 の定数である必要があります。

long long _mm_extract_epi64(__m128i a, const int imm)

これは __sparcace_extract_m128i() の別名です。

__m128i __sparcace_cast_m128d_m128i(__m128d a)

この関数は、パラメータとまったく同じビットパターンを持つ __m128i 型の値を返します。

__m128i _mm_castpd_si128(__m128d in)

これは __sparcace_cast_m128d_m128i() の別名です。

__m128d __sparcace_cast_m128i_m128d(__m128i a)

この関数は、パラメータとまったく同じビットパターンを持つ __m128d 型の値を返します。

__m128d _mm_castsi128_pd(__m128i in)

これは __sparcace_cast_m128i_m128d() の別名です。

__m128d __sparcace_fdivd_m128d(__m128d a, __m128d b)

この関数は 2 倍精度除算を順次に実行し、最初のパラメータを 2 番目のパラメータで割った値の __m128d の結果を生成します。

__m128d _mm_div_pd(__m128d a, __m128d b)

これは __sparcace_fdivd_m128d() の別名です。

__m128d __sparcace_fshiftorx_m128d(__m128d a, __m128d b, __m128d c)

この関数は、最初のパラメータと 2 番目のパラメータに対して右または左論理シフトを実行し、それらのフラグメントをマスクしてからそのビット単位の論理和をとって、__m128d の結果を生成します。シフト幅、マスク幅、およびマスクオフセットが 3 番目のパラメータとして指定されます。

__m128i __sparcace_fshiftorx_m128i(__m128i a, __m128i b, __m128i c)

この関数は、最初のパラメータと 2 番目のパラメータに対して右または左論理シフトを実行し、それらのフラグメントをマスクしてからそのビット単位の論理和をとって、__m128i の結果を生成します。シフト幅、マスク幅、およびマスクオフセットが 3 番目のパラメータとして指定されます。

void __sparcace_stdfr_m128d(__m128d a, __m128d b, __m128d *p)

この関数は、2 番目のパラメータの対応する浮動小数点数の MSB が 1 である場合、最初のパラメータの各倍精度浮動小数点数を 3 番目のパラメータが指し示す 16 バイトに整列されたアドレスに格納します。それ以外の場合は何もしません。

void __sparcace_stdfr_m128i(__m128i a, __m128i b, __m128i *p)

この関数は、2 番目のパラメータの対応する unsigned long long 型の数値の MSB が 1 である場合、最初のパラメータの各 unsigned long long 型の数値を 3 番目のパラメータが指し示す 16 バイトに整列されたアドレスに格納します。それ以外の場合は何もしません。

__m128d __sparcace_fandnot1_m128d(__m128d a, __m128d b)

この関数は、反転された最初のパラメータと 2 番目のパラメータの間でビット単位の AND 演算を実行して、__m128d の結果を生成します。

__m128d __sparcace_fandnot1_m128d(__m128d a, __m128d b)

この関数は、反転された最初のパラメータと 2 番目のパラメータの間でビット単位の AND 演算を実行して、__m128d の結果を生成します。

__m128d _mm_andnot_pd(__m128d a, __m128d b)

これは __sparcace_fandnot1_m128d() の別名です。

__m128i __sparcace_fandnot1_m128i(__m128i a, __m128i b)

この関数は、反転された最初のパラメータと 2 番目のパラメータの間でビット単位の AND 演算を実行して、__m128i の結果を生成します。

__m128i _mm_andnot_si128(__m128i a, __m128i b)

これは __sparcace_fandnot1_m128i() の別名です。

__m128i _mm_andnot_si128(__m128i a, __m128i b)

これは __sparcace_fandnot1_m128i() の別名です。

__m128d __sparcace_fand_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の AND 演算を実行して、a__m128d の結果を生成します。

__m128d _mm_and_pd(__m128d a, __m128d b)

これは __sparcace_fand_m128d() の別名です。

__m128i __sparcace_fand_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の AND 演算を実行して、__m128i の結果を生成します。

__m128i _mm_and_si128(__m128i a, __m128i b)

これは __sparcace_fand_m128i() の別名です。

__m128d __sparcace_fnand_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の NAND 演算を実行して、__m128d の結果を生成します。

__m128i __sparcace_fnand_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の NAND 演算を実行して、a__m128i の結果を生成します。

__m128d __sparcace_fnor_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の NOR 演算を実行して、__m128d の結果を生成します。

__m128i __sparcace_fnor_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の NOR 演算を実行して、a__m128i の結果を生成します。

__m128d __sparcace_fnot1_m128d(__m128d a)

この関数は、最初のパラメータのビット単位の反転演算を実行して、__m128d の結果を生成します。

__m128i __sparcace_fnot1_m128i(__m128i a)

この関数は、最初のパラメータのビット単位の反転演算を実行して、__m128i の結果を生成します。

__m128d __sparcace_fone_m128d()

この関数は、ビットがすべて 1 である __m128d の結果を生成します。

__m128i __sparcace_fone_m128i()

この関数は、ビットがすべて 1 である __m128i の結果を生成します。

__m128d __sparcace_fornot1_m128d(__m128d a, __m128d b)

この関数は、反転された最初のパラメータと 2 番目のパラメータの間でビット単位の OR 演算を実行して、__m128d の結果を生成します。

__m128i __sparcace_fornot1_m128i(__m128i a, __m128i b)

この関数は、反転された最初のパラメータと 2 番目のパラメータの間でビット単位の OR 演算を実行して、__m128i の結果を生成します。

__m128d __sparcace_for_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の OR 演算を実行して、__m128d の結果を生成します。

__m128d _mm_or_pd(__m128d a, __m128d b)

これは __sparcace_for_m128d() の別名です。

__m128i __sparcace_for_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の OR 演算を実行して、a__m128i の結果を生成します。

__m128i _mm_or_si128(__m128i a, __m128i b)

これは __sparcace_for_m128i() の別名です。

__m128d __sparcace_fxnor_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の XNOR 演算を実行して、a__m128d の結果を生成します。

__m128i __sparcace_fxnor_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の XNOR 演算を実行して、__m128i の結果を生成します。

__m128d __sparcace_fxor_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の XOR 演算を実行して、__m128d の結果を生成します。

__m128d _mm_xor_pd(__m128d a, __m128d b)

これは __sparcace_fxor_m128d() の別名です。

__m128i __sparcace_fxor_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータと 2 番目のパラメータの間でビット単位の XOR 演算を実行して、__m128i の結果を生成します。

__m128i _mm_xor_si128(__m128i a, __m128i b)

これは __sparcace_fxor_m128i() の別名です。

__m128d __sparcace_fzero_m128d()

この関数は、ビットがすべて 0 である __m128d の結果を生成します。

__m128d _mm_setzero_pd()

これは __sparcace_fzero_m128d() の別名です。

__m128i __sparcace_fzero_m128i()

この関数は、ビットがすべて 0 である __m128i の結果を生成します。

__m128i _mm_setzero_si128()

これは __sparcace_fzero_m128i() の別名です。

__m128d __sparcace_fcmpeqd_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータに等しい場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。

__m128d __sparcace_fcmpeqed_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータに等しい場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。順序付けされていない場合は、例外が発生します。

__m128d __sparcace_fcmpleed_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータ以下である場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。順序付けされていない場合は、例外が発生します。

__m128d __sparcace_fcmplted_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータより小さい場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。順序付けされていない場合は、例外が発生します。

__m128d __sparcace_fcmpned_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータに等しくない場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。

__m128d __sparcace_fcmpneed_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータに等しくない場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。順序付けされていない場合は、例外が発生します。

__m128d __sparcace_fcmpgted_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータより大きい場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。順序付けされていない場合は、例外が発生します。

__m128d __sparcace_fcmpgeed_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数を 2 番目のパラメータの対応する倍精度浮動小数点数と比較します。最初のパラメータが 2 番目のパラメータ以上である場合は、__m128d の結果の対応する倍精度浮動小数点数のすべてのビットが 1 に設定されます。順序付けされていない場合は、例外が発生します。

__m128d __sparcace_fselmovd_m128d(__m128d a, __m128d b, __m128d c)

この関数は、3 番目のパラメータの MSB に関して、最初のパラメータの各倍精度浮動小数点数または 2 番目のパラメータの各倍精度浮動小数点数をコピーすることによって __m128d の結果を生成します。

__m128i __sparcace_fselmovd_m128i(__m128i a, __m128i b, __m128i c)

この関数は、3 番目のパラメータの MSB に関して、最初のパラメータの各 unsigned long long 型の数値または 2 番目のパラメータの同様の数値をコピーすることによって __m128d の結果を生成します。

__m128d __sparcace_fabsd_m128d(__m128d a)

この関数は、パラメータの絶対値を持つ __m128d の結果を生成します。

__m128d __sparcace_faddd_m128d(__m128d a, __m128d b)

この関数は、加算を実行して __m128d の結果を生成します。

__m128d _mm_add_pd(__m128d a, __m128d b)

これは __sparcace_faddd_m128d() の別名です。

__m128d __sparcace_fmaddd_m128d(__m128d a, __m128d b, __m128d c)

この関数は、最初のパラメータ、2 番目のパラメータ、および 3 番目のパラメータ内の倍精度浮動小数点数のペアで (a * b + c) 演算を実行して、__m128d の結果を生成します。

__m128d _mm_fmadd_pd(__m128d a, __m128d b, __m128d c)

これは __sparcace_fmaddd_m128d() の別名です。

__m128d __sparcace_fmsubd_m128d(__m128d a, __m128d b, __m128d c)

この関数は、最初のパラメータ、2 番目のパラメータ、および 3 番目のパラメータ内の倍精度浮動小数点数のペアで (a * b - c) を実行して、__m128d の結果を生成します。

__m128d _mm_fmsub_pd(__m128d a, __m128d b, __m128d c)

これは __sparcace_fmsubd_m128d() の別名です。

__m128d __sparcace_fnmsubd_m128d(__m128d a, __m128d b, __m128d c)

この関数は、最初のパラメータ、2 番目のパラメータ、および 3 番目のパラメータ内の倍精度浮動小数点数のペアで -(a * b - c) を実行して、__m128d の結果を生成します。

__m128d _mm_fnmadd_pd(__m128d a, __m128d b, __m128d c)

これは __sparcace_fnmsubd_m128d() の別名です。注意: これは __sparcace_fnmaddd_m128d() の別名ではありません。

__m128d __sparcace_fnmaddd_m128d(__m128d a, __m128d b, __m128d c)

この関数は、最初のパラメータ、2 番目のパラメータ、および 3 番目のパラメータ内の倍精度浮動小数点数のペアで -(a * b + c) を実行して、__m128d の結果を生成します。

__m128d _mm_fnmsub_pd(__m128d a, __m128d b, __m128d c)

これは __sparcace_fnmaddd_m128d() の別名です。注意: これは __sparcace_fnmsubd_m128() の別名ではありません。

__m128d __sparcace_fmaxd_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数の最大値、または 2 番目のパラメータの同様の数値をコピーすることによって __m128d の結果を生成します。

__m128d _mm_max_pd(__m128d a, __m128d b)

これは __sparcace_fmaxd_m128d() の別名です。

__m128d __sparcace_fmind_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータの各倍精度浮動小数点数の最小値、または 2 番目のパラメータの同様の数値をコピーすることによって __m128d の結果を生成します。

__m128d _mm_min_pd(__m128d a, __m128d b)

これは __sparcace_fmind_m128d() の別名です。

__m128d __sparcace_fmuld_m128d(__m128d a, __m128d b)

この関数は、乗算を実行して __m128d の結果を生成します。

__m128d _mm_mul_pd(__m128d a, __m128d b)

これは __sparcace_fmuld_m128d() の別名です。

__m128d __sparcace_fnegd_m128d(__m128d a)

この関数は、パラメータの値を否定します。

__m128d __sparcace_fsubd_m128d(__m128d a, __m128d b)

この関数は、減算を実行して __m128d の結果を生成します。

__m128d _mm_sub_pd(__m128d a, __m128d b)

これは __sparcace_fsubd_m128d() の別名です。

__m128d __sparcace_fxtod_m128i_m128d(__m128i a)

この関数は、__m128i 型パラメータ内の unsigned long long 型の値のペアを __m128d 型の結果内の倍精度浮動小数点数のペアに変換します。

__m128i __sparcace_fdtox_m128d_m128i(__m128d a)

この関数は、__m128d 型の値内の倍精度浮動小数点数のペアを __m128i 型パラメータの型の結果内の unsigned long long のペアに変換します。

__m128i __sparcace_fpmaddx_m128i(__m128i a, __m128i b, __m128i c)

この関数は、最初のパラメータ、2 番目のパラメータ、および 3 番目のパラメータ内の unsigned long long 数値のペアで (a * b + c) 演算を実行し、結果のペアの下位 8 バイトを取って __m128d の結果を生成します。

__m128i __sparcace_fpmaddxhi_m128i(__m128i a, __m128i b, __m128i c)

この関数は、最初のパラメータ、2 番目のパラメータ、および 3 番目のパラメータ内の unsigned long long 数値のペアで (a * b + c) 演算を実行し、結果のペアの上位 8 バイトを取って __m128d の結果を生成します。

__m128d __sparcace_fnaddd_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータ内の倍精度浮動小数点数のペアで -(a - b) 演算を実行して、__m128d の結果を生成します。

__m128d __sparcace_fnmuld_m128d(__m128d a, __m128d b)

この関数は、最初のパラメータと 2 番目のパラメータ内の倍精度浮動小数点数のペアで -(a * b) 演算を実行して、__m128d の結果を生成します。

__m128i __sparcace_fpmax64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 signed long long 型の数値の最大値、または 2 番目のパラメータの同様の数値をコピーすることによって __m128i の結果を生成します。

__m128i __sparcace_fpmin64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 signed long long 型の数値の最小値、または 2 番目のパラメータの同様の数値をコピーすることによって __m128i の結果を生成します。

__m128i __sparcace_fpmin64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 signed long long 型の数値の最小値、または 2 番目のパラメータの同様の数値をコピーすることによって __m128i の結果を生成します。

__m128i __sparcace_fpminu64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値の最小値、または 2 番目のパラメータの同様の数値をコピーすることによって __m128i の結果を生成します。

__m128i __sparcace_fpsll64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値を 2 番目のパラメータの unsigned long long 型の数値によって示されているシフト量で左に論理シフトすることによって __m128i の結果を生成します。

__m128i _mm_sll_epi64(__m128i a, __m128i b)

これは __sparcace_fpsll64x_m128i() の別名です。

__m128i __sparcace_fpsrl64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値を 2 番目のパラメータの unsigned long long 型の数値によって示されているシフト量で右に論理シフトすることによって __m128i の結果を生成します。

__m128i _mm_srl_epi64(__m128i a, __m128i b)

これは __sparcace_fpsrl64x_m128i() の別名です。

__m128i __sparcace_fpsra64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 signed long long 型の数値を 2 番目のパラメータの unsigned long long 型の数値によって示されているシフト量で右に算術シフトすることによって __m128i の結果を生成します。

__m128i __sparcace_fpcmple64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 signed long long 型の数値を 2 番目のパラメータの対応する signed long long 型の数値と比較します。最初のパラメータが 2 番目のパラメータ以下である場合は、__m128i の結果の対応する signed long long 型の数値の MSB が 1 に設定されます。ビット 0 からビット 62 までは 0 に設定されます。

__m128i __sparcace_fpcmpgt64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 signed long long 型の数値を 2 番目のパラメータの対応する signed long long 型の数値と比較します。最初のパラメータが 2 番目のパラメータより大きい場合は、__m128i の結果の対応する signed long long 型の数値の MSB が 1 に設定されます。ビット 0 からビット 62 までは 0 に設定されます。

__m128i __sparcace_fpcmpule64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値を 2 番目のパラメータの対応する unsigned long long 型の数値と比較します。最初のパラメータが 2 番目のパラメータ以下である場合は、__m128i の結果の対応する unsigned long long 型の数値の MSB が 1 に設定されます。ビット 0 からビット 62 までは 0 に設定されます。

__m128i __sparcace_fpcmpune64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値を 2 番目のパラメータの対応する unsigned long long 型の数値と比較します。最初のパラメータが 2 番目のパラメータに等しくない場合は、__m128i の結果の対応する unsigned long long 型の数値の MSB が 1 に設定されます。ビット 0 からビット 62 までは 0 に設定されます。

__m128i __sparcace_fpcmpugt64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値を 2 番目のパラメータの対応する unsigned long long 型の数値と比較します。最初のパラメータが 2 番目のパラメータより大きい場合は、__m128i の結果の対応する unsigned long long 型の数値の MSB が 1 に設定されます。ビット 0 からビット 62 までは 0 に設定されます。

__m128i __sparcace_fpcmpueq64x_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値を 2 番目のパラメータの対応する unsigned long long 型の数値と比較します。最初のパラメータが 2 番目のパラメータに等しい場合は、__m128i の結果の対応する unsigned long long 型の数値の MSB が 1 に設定されます。ビット 0 からビット 62 までは 0 に設定されます。

__m128i __sparcace_fpadd64_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値と 2 番目のパラメータの unsigned long long 型の数値を加算することによって __m128i の結果を生成します。

__m128i _mm_add_epi64(__m128i a, __m128i b)

これは __sparcace_fpadd64_m128i() の別名です。

__m128i __sparcace_fpsub64_m128i(__m128i a, __m128i b)

この関数は、最初のパラメータの各 unsigned long long 型の数値から 2 番目のパラメータの unsigned long long 型の数値を減算することによって __m128i の結果を生成します。

__m128i _mm_sub_epi64(__m128i a, __m128i b)

これは __sparcace_fpsub64_m128i() の別名です。

2.20.2 10 進浮動小数点の組み込み関数

SPARC64X および SPARC64X+ は、10 進浮動小数点のデータ型および演算をサポートします。データフォーマットは、IEEE 754-2008 に定義されている 64 ビット DPD に準拠します。コンパイラは、データを処理するための型およびさまざまな関数を提供します。

2.20.2.1 型と演算

10 進浮動小数点数を表すために、_Decimal64 組み込み型が dpd_conf.h 内で宣言されます。次の例に示す型を使用する前に、ヘッダーファイルをインクルードする必要があります。

#include <dpd_conf.h>
int main(void) {
  _Decimal64 dd;
  ...
  return 0;
}

_Decimal64

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

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

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

_Decimal64 型変数

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

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

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

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

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

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

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

組み込み関数は、算術、比較、型の変換などのほかの操作に対して提供されます。

_Decimal64 用のリテラル構文はサポートされていません。型変換用の組み込み関数を代わりに使用できます。

_Decimal64 型のデータのメモリー境界整列は、64 ビットのバイナリ浮動小数点数と同じです。

2.20.2.2 マクロおよびプラグマ

-xarch=[sparcace|sparcaceplus] および -m64 が指定された場合、__DEC_FP_INTR マクロは 1 に定義されます。このマクロは、コンパイラが 10 進浮動小数点組み込み関数をサポートするかどうかを判別する場合に役立ちます。

dpd_conf.h がインクルードされたとき、IEEE 754-2008 で必要な DEC_EVAL_METHOD マクロは 1 に定義されます。

コンパイラは ISO/IEC TR 24732 に記載されている機能を完全にサポートするわけではないため、__STDC_DEC_FP__ マクロは定義されません。

IEEE 754-2008 で必要な #pragma FLOAT_CONST_DECIMAL_64 はサポートされません

2.20.2.3 組み込み関数

以下の一覧に示す組み込み関数は、dpd_conf.h で宣言されます。これらは _Decimal64 型の変数を操作する場合に便利です。

void __dpd64_store(const _Decimal64 src, _Decimal64 * const addr)

この関数は、addr によってアドレス指定されるメモリーに src を保管します。addr は 8 バイト境界に整列されている必要があり、そうでない場合は -xmemalign 設定に関係なく動作は未定義になります。

_Decimal64 __dpd64_load(const _Decimal64 * const addr)

この関数は、addr によってアドレス指定されるメモリーから _Decimal64 型の値をロードし、これを返します。addr は 8 バイト境界に整列されている必要があり、そうでない場合は -xmemalign 設定に関係なく動作は未定義になります。

_Decimal64 __dpd64_add(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 を加算して結果を返します。IEEE 754-2008 規格に従って、浮動小数点例外がスローされます。

_Decimal64 __dpd64_sub(_Decimal64 src1, _Decimal64 src2)

この関数は、src1 から src2 を減算して結果を返します。IEEE 754-2008 規格に従って、浮動小数点例外がスローされます。

_Decimal64 __dpd64_mul(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 を乗算して結果を返します。IEEE 754-2008 規格に従って、浮動小数点例外がスローされます。

_Decimal64 __dpd64_div(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 で除算して結果を返します。IEEE 754-2008 規格に従って、浮動小数点例外がスローされます。

_Decimal64 __dpd64_abs(_Decimal64 src)

この関数は、src の絶対値を計算して結果を返します。src から NaN のシグナルが生成される場合でも、浮動小数点例外はスローされません。

_Decimal64 __dpd64_neg(_Decimal64 src)

この関数は、src の符号を逆にして結果を返します。src から NaN のシグナルが生成される場合でも、浮動小数点例外はスローされません。

int __dpd64_cmpeq(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 に等しいときは非 0 を返し、そうでない場合は 0 を返します。NaN、Inf、および負の符号が付いたゼロの処理は、IEEE 754-2008 に準拠します。

int __dpd64_cmpne(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 に等しくないときは非 0 を返し、そうでない場合は 0 を返します。NaN、Inf、および負の符号が付いたゼロの処理は、IEEE 754-2008 に準拠します。

int __dpd64_cmpgt(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 より大きいときは非 0 を返し、そうでない場合は 0 を返します。NaN、Inf、および負の符号が付いたゼロの処理は、IEEE 754-2008 に準拠します。

int __dpd64_cmpge(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 より大きいか等しいときは非 0 を返し、そうでない場合は 0 を返します。NaN、Inf、および負の符号が付いたゼロの処理は、IEEE 754-2008 に準拠します。

int __dpd64_cmplt(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 より小さいときは非 0 を返し、そうでない場合は 0 を返します。NaN、Inf、および負の符号が付いたゼロの処理は、IEEE 754-2008 に準拠します。

int __dpd64_cmple(_Decimal64 src1, _Decimal64 src2)

この関数は、src1src2 より小さいか等しいときは非 0 を返し、そうでない場合は 0 を返します。NaN、Inf、および負の符号が付いたゼロの処理は、IEEE 754-2008 に準拠します。

_Decimal64 __dpd64_convert_from_int64(int64_t src)

この関数は、src 内の 64 ビット符号付き整数値を 10 進浮動小数点値に変換して結果を返します。

_Decimal64 __dpd64_convert_from_uint64(uint64_t src)

この関数は、src 内の 64 ビット符号なし整数値を 10 進浮動小数点値に変換して結果を返します。

_Decimal64 __dpd64_convert_from_double(double src)

この関数は、src 内の 2 進浮動小数点値を 10 進浮動小数点値に変換して結果を返します。

_Decimal64 __dpd64_convert_from_str(const char * restrict nptr, char ** restrict endptr);

この関数は、丸め方向が「最近接偶数」に固定されている点を除き、「ISO/IEC TR 24732」で定義されている関数 strtod64() とまったく同様に動作します。

int64_t __dpd64_convert_to_int64(_Decimal64 src)

この関数は、src 内の 10 進浮動小数点値を 64 ビット符号付き整数値に変換して結果を返します。

uint64_t __dpd64_convert_to_uint64(_Decimal64 src)

この関数は、src 内の 10 進浮動小数点値を 64 ビット符号なし整数値に変換して結果を返します。

double __dpd64_convert_to_double(_Decimal64 src)

この関数は、src 内の 10 進浮動小数点値を 2 進浮動小数点値に変換して結果を返します。

char *__dpd64_convert_to_stre(_Decimal64 dec, char *buf, size_t n);

この関数は、decbuf でアドレス指定されているメモリーに %He 形式で出力します。精度は dec の係数と同じ長さです。出力文字列は、その文字列が n に等しいか、これより長い場合は (n-1) 番目の文字、それ以外の場合は文字列の最後を null 文字で終了します。この関数は、dec が正常に文字列に変換された場合は buf を、それ以外の場合は null ポインタを返します。

char *__dpd64_convert_to_strf(_Decimal64 dec, char *buf, size_t n);

この関数は、decbuf でアドレス指定されているメモリーに %Hf 形式で出力します。精度は dec の係数と同じ長さです。出力文字列は、その文字列が n に等しいか、これより長い場合は (n-1) 番目の文字、それ以外の場合は文字列の最後を null 文字で終了します。この関数は、dec が正常に文字列に変換された場合は buf を、それ以外の場合は null ポインタを返します。

int __dpd_getround(void)

この関数は、_Decimal64 の現在の丸めモードを取得します。この値は、次のように dpd_conf.h 内で定義されます。

__DPD_ROUND_NEAREST

最近接偶数に丸めます

__DPD_ROUND_TOZERO

ゼロの方向に丸めます

__DPD_ROUND_POSITIVE

正の無限の方向に丸めます

__DPD_ROUND_NEGATIVE

負の無限の方向に丸めます

__DPD_ROUND_NEARESTFROMZERO

絶対値で四捨五入して最近接値へ丸めます

_Decimal64 の丸めモードの初期値は __DPD_ROUND_NEAREST です。-fround オプションは、_Decimal64 の丸めモードを変更しないことに注意してください。

int __dpd_setround(int r)

この関数は、_Decimal64 の丸めモードを r に設定します。r は上記に示されているものである必要があります。成功時は 0、失敗時は非 0 を返します。