付録 B. 組み込み関数

コンパイラーは、より効率的なプログラムの作成を援助するため、ユーザーが組み込み関数を選択できるようにします。本節では、使用可能な各種の組み込み関数を要約します。

並列処理に使用する組み込み関数で説明している追加の組み込み関数を検索することもできます。


名前 プロトタイプ 説明
__alignx void __alignx(int alignment, const void *address); 指定された address が既知のコンパイル時オフセットで位置合わせされることをコンパイラーに知らせます。位置合わせ は、ゼロより大きい値を持つ正の定数整数で、 2 の累乗でなければなりません。
__bcopy void __bcopy(char *, char *, int); ブロック・コピー
__bzero void __bzero(void *, size_t); ブロック・ゼロ
__check_lock_mp unsigned int __check_lock_mp (const int* addr, int old_value, int new_value); マルチプロセッサー・システムでのロックを検査します。

条件付きで、シングル・ワード変数をアトミックに更新します。addr は、シングル・ワード変数のアドレスを指定します。old_value は、シングル・ワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、シングル・ワード変数に条件付きで割り当てられる新規の値を指定します。ワード変数は、フルワード境界で位置合わせしておかなければなりません。

戻り値:

  1. false (偽) が戻された場合は、シングル・ワード変数が元の値と同じであったこと、さらにこの変数が新規の値に設定されたことを示す。
  2. true (真) が戻された場合は、シングル・ワード変数が元の値と同じでなかったこと、さらにこの変数が変更されないままになっていることを示す。
__check_lockd_mp unsigned int __check_lockd_mp (const long long int* addr, long long int old_value, long long int new_value); マルチプロセッサー・システムでのロック・ダブルワードを検査します。

条件付きで、ダブルワード変数をアトミックに更新します。addr は、ダブルワード変数のアドレスを指定します。old_value は、ダブルワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、ダブルワード変数に条件付きで割り当てられる新規の値を指定します。ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

戻り値:

  1. false (偽) が戻された場合は、ダブルワード変数が元の値と同じであったこと、さらにこの変数が新規の値に設定されたことを示す。
  2. true (真) が戻された場合は、ダブルワード変数が元の値と同じでなかったこと、さらにこの変数が変更されないままになっていることを示す。
__check_lock_up unsigned int __check_lock_up (const int* addr, int old_value, int new_value); 単一プロセッサー・システムでのロックを検査します。

条件付きで、シングル・ワード変数をアトミックに更新します。addr は、シングル・ワード変数のアドレスを指定します。old_value は、シングル・ワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、シングル・ワード変数に条件付きで割り当てられる新規の値を指定します。ワード変数は、フルワード境界で位置合わせしておかなければなりません。

戻り値:

  • false (偽) が戻された場合は、シングル・ワード変数が元の値と同じであったこと、さらにこの変数が新規の値に設定されたことを示す。
  • true (真) が戻された場合は、シングル・ワード変数が元の値と同じでなかったこと、さらにこの変数が変更されないままになっていることを示す。
__check_lockd_up unsigned int __check_lockd_up (const long long int* addr, long long int old_value, int long long new_value); 単一プロセッサー・システムでのロック・ダブルワードを検査します。

条件付きで、ダブルワード変数をアトミックに更新します。addr は、ダブルワード変数のアドレスを指定します。old_value は、ダブルワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、ダブルワード変数に条件付きで割り当てられる新規の値を指定します。ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

戻り値:

  • false (偽) が戻された場合は、ダブルワード変数が元の値と同じであったこと、さらにこの変数が新規の値に設定されたことを示す。
  • true (真) が戻された場合は、ダブルワード変数が元の値と同じでなかったこと、さらにこの変数が変更されないままになっていることを示す。
__clear_lock_mp void __clear_lock_mp (const int* addr, int value); マルチプロセッサー・システムでのロックをクリアします。

アドレス addr にあるシングル・ワード変数に、 value をアトミックに保管します。ワード変数は、フルワード境界で位置合わせしておかなければなりません。

__clear_lockd_mp void __clear_lockd_mp (const long long int* addr, long long int value); マルチプロセッサー・システムでのロック・ダブルワードをクリアします。

アドレス addr にあるダブルワード変数に、 value をアトミックに保管します。ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

__clear_lock_up void __clear_lock_up (const int* addr, int value); 単一プロセッサー・システムでのロックをクリアします。

アドレス addr にあるシングル・ワード変数に、 value をアトミックに保管します。ワード変数は、フルワード境界で位置合わせしておかなければなりません。

__clear_lockd_up void __clear_lockd_up (const long long int* addr, long long int value); ユニプロセッサー・システムでのロック・ダブルワードをクリアします。

アドレス addr にあるダブルワード変数に、 value をアトミックに保管します。ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。

__cntlz4 unsigned int __cntlz4(unsigned int); 先行ゼロ・カウント。4 バイト整数。
__cntlz8 unsigned int __cntlz8(unsigned long long); 先行ゼロ・カウント。8 バイト整数。
__cnttz4 unsigned int __cnttz4(unsigned int); 後続ゼロ・カウント。4 バイト整数。
__cnttz8 unsigned int __cnttz8(unsigned long long); 後続ゼロ・カウント。8 バイト整数。
__dcbt( ) void __dcbt (void *); データ・キャッシュ・ブロック・タッチ。

指定のアドレスを含むメモリーのブロックをデータ・キャッシュ内にロードします。

__dcbz( ) void __dcbz (void *); ゼロに設定されたデータ・キャッシュ・ブロック。

データ・キャッシュ内の指定のアドレスをゼロ (0) に設定します。

__eieio void __eieio(void); すでに組み込まれている __iospace_eieio のもう 1 つの名前です。

コンパイラーは、__eieio を組み込まれているものとして認識します。名前以外は、すべてが __iospace_eieio とまったく同じです。 __eieio には、対応する PowerPC の命令名との一貫性があります。

__exp double __exp(double); 指数値を戻します。
__fabs double __fabs(double); 絶対値を戻します。
__fabss float __fabss(float); 短精度浮動小数点の絶対値を戻します。
__fcfid double __fcfid (double); 整数ダブルワードからの浮動変換です。

64 ビット符号付き固定小数点オペランドが、倍精度浮動小数点に変換されます。

__fctid double __fctid (double); 整数ダブルワードへの浮動変換です。

FPSCRRN (浮動小数点状況および制御レジスターの浮動小数点丸め制御フィールド) で指定された丸めモードを使用して、浮動小数点オペランドが、64 ビット符号付き固定小数点整数に変換されます。

__fctidz double __fctidz (double); 「ゼロの方向に丸める」による、整数ダブルワードへの浮動変換です。

浮動小数点オペランドが、丸めモード「ゼロの方向に丸める」を使用して、 64 ビット符号付き固定小数点整数に変換されます。

__fctiw double __fctiw (double); 整数ワードへの浮動変換です。

FPSCRRN (浮動小数点状況および制御レジスターの浮動小数点丸め制御フィールド) で指定された丸めモードを使用して、浮動小数点オペランドが、32 ビット符号付き固定小数点整数に変換されます。

__fctiwz double __fctiwz (double); 「ゼロの方向に丸める」による、整数ワードへの浮動変換です。

浮動小数点オペランドが、丸めモード「ゼロの方向に丸める」を使用して、 32 ビット符号付き固定小数点整数に変換されます。

__fmadd double __fmadd (double, double, double); 浮動小数点の乗算と加算
__fmadds float __fmadds (float, float, float); 浮動小数点の乗算と加算 short
__fmsub double __fmsub(double, double, double); 浮動小数点の乗算と減算
__fmsubs float __fmsubs (float, float, float); 浮動小数点の乗算と減算
__fnabs double __fnabs(double); 負の浮動小数点の絶対値
__fnabss float __fnabss(float); 負の浮動小数点の絶対値
__fnmadd double __fnmadd(double, double, double); 負の浮動小数点の乗算と加算
__fnmadds float __fnmadds (float, float, float); 負の浮動小数点の乗算と加算
__fnmsub double __fnmsub(double, double, double); 負の浮動小数点の乗算と減算
__fnmsubs float __fnmsubs (float, float, float); __fnmsubs (a, x, y) = [- (a * x - y)]
__fre double fre (double); 浮動小数点の逆数
__fre (x) = [(estimate of) 1.0/x] (POWER5 プロセッサーのみ)
__fres float __fres (float); 浮動小数点の逆数
__fres (x) = [1.0/x (の概算)]
__frsqrte double __frsqrte (double); 浮動小数点の逆数平方根
__frsqrte (x) = [1.0/sqrt(x) (の概算)]
__frsqrtes float __frsqrtes (float); 浮動小数点の逆数平方根
__frsqrtes (x) = [(estimate of) 1.0/sqrt(x)] (POWER5 プロセッサーのみ)
__fsel double __fsel (double, double, double); 浮動小数点の選択
if (a >= 0.0) then __fsel (a, x, y) = x;
それ以外の場合 __fsel (a, x, y) = y
__fsels float __fsels (float, float, float); 浮動小数点の選択
if (a >= 0.0) then __fsels (a, x, y) = x;
それ以外の場合 __fsels (a, x, y) = y
__fsqrt double __fsqrt (double); 浮動小数点の平方根
__fsqrt (x) = x の平方根
__fsqrts float __fsqrts (float); 浮動小数点の平方根
__fsqrts (x) = x の平方根
__iospace_eieio void __iospace_eieio(void); EIEIO 命令を生成します。
__iospace_lwsync (equivalent to: void __iospace_lwsync(void);) lwsync 命令を生成します。
__iospace_sync (equivalent to: void __iospace_sync(void);) 同期命令を生成します。
__isync void __isync(void); 前のすべての命令が完了するのを待機した後、プリフェッチされたすべての命令を廃棄して、以降の命令が、前の命令によって確立されたコンテキストの中でフェッチ (または再フェッチ) および実行されるようにします。
__load2r unsigned short __load2r(unsigned short*); 逆のハーフワード・バイトをロードします。
__load4r unsigned int __load4r(unsigned int*); 逆のワード・バイトをロードします。
__lwsync (コンパイラーは、__lwsync 組み込み関数を認識します。) すでに組み込まれている __iospace_lwsync のもう 1 つの名前です。

コンパイラーは、__lwsync 組み込み関数を認識します。名前以外は、すべてが __iospace_lwsync とまったく同じです。 __lwsync には、対応する PowerPC の命令名との一貫性があります。この関数は、PowerPC 970 プロセッサーによってのみサポートされます。

値は、コンパイル時に既知でなければなりません。

__mfdcr unsigned __mfdcr(const int); 装置制御レジスターの値を戻します。これは、PowerPC 440 の場合のみ有効です。
__mtdcr void __mtdcr(const int, unsigned long); unsigned long 値を使用して、装置制御レジスターの値を設定します。値は、コンパイル時に既知でなければなりません。これは、PowerPC 440 の場合にのみ有効です。
__mfspr unsigned __mfspr(const int); 特殊目的レジスターの値を戻します。"const int" の値は、コンパイル時に既知でなければなりません。
__mtspr void __mtspr(const int, unsigned long); unsigned long 値を使用して、特殊目的レジスターの値を設定します。値は、コンパイル時に既知でなければなりません。
__mtfsb0 void __mtfsb0(unsigned int bt); FPSCR のビット 0 に移動します。

FPSCR のビット bt は 0 に設定されます。 bt は定数で、 0<=bt<=31 でなければなりません。

__mtfsb1 void __mtfsb1(unsigned int bt); FPSCR Bit 1 に移動します。

FPSCR のビット bt は 1 に設定されます。 bt は定数で、 0<=bt<=31 でなければなりません。

__mtfsf void __mtfsf(unsigned int flm, unsigned int frb); FPSCR フィールドに移動します。

frb の内容が、 flm で指定するフィールド・マスクの制御下の FPSCR に入れられます。フィールド・マスク flm は、該当する FPSCR の 4 ビットのフィールドを識別します。flm は定数の 8 ビットのマスクでなければなりません。

__mtfsfi void __mtfsfi(unsigned int bf, unsigned int u); FPSCR フィールドに即時移動します。

u の値が、bf で指定する FPSCR フィールドに入れられます。 bfu は、 0<=bf<=7 および 0<=u<=15 の定数でなければなりません。

__mulhd long long int __mulhd(long long int ra, long long int rb); 高位の符号付きダブルワードの乗算です。

オペランド rarb の 128 ビットの積から、高位の 64 ビットを戻します。

__mulhdu unsigned long long int __mulhdu(unsigned long long int ra, unsigned long long int rb); 高位の符号なしダブルワードの乗算です。

オペランド rarb の 128 ビットの積から、高位の 64 ビットを戻します。

__mulhw int __mulhw(int ra, int rb); 高位の符号付きワードの乗算です。

オペランド rarb の 64 ビットの積から、高位の 32 ビットを戻します。

__mulhwu unsigned int __mulhwu(unsigned int ra, unsigned int rb); 高位の符号なしワードの乗算です。

オペランド rarb の 64 ビットの積から、高位の 32 ビットを戻します。

__parthds int __parthds(void); parthds ランタイム・オプションの値を戻します。

parthds オプションがユーザーによって明示的に設定されていない場合、関数は、ランタイム・ライブラリーによって設定されたデフォルト値を戻します。プログラムのコンパイル時に -qsmp コンパイラー・オプションが指定されなかった場合、この関数は、選択されたランタイム・オプションに関係なく 1 を戻します。

__popcnt4 int __popcnt4(unsigned int); 32 ビット整数用に設定されたビットの数を戻します。
__popcnt8 int __popcnt8(unsigned long long); 64 ビット整数用に設定されたビットの数を戻します。
__poppar4 int __poppar4(unsigned int); 32 ビット整数内に奇数のビットが設定されている場合、1 を戻します。それ以外の場合は、0 を戻します。
__poppar8 int __poppar8(unsigned long long); 64 ビット整数内に奇数のビットが設定されている場合、1 を戻します。それ以外の場合は、0 を戻します。
__pow double __pow(double, double);
__prefetch_by_load void __prefetch_by_load(const void*); 明示的ロードによりメモリー・ロケーションをタッチします。
__prefetch_by_stream void __prefetch_by_stream(const int, const void*); 明示的ストリームによりメモリー・ロケーションをタッチします。
__protected_stream_count void __protected_stream_count(unsigned int unit_cnt, unsigned int ID); ID という ID を持つ、限られた長さの protected ストリームに対して、unit_cnt 本のキャッシュ・ラインを設定します。Unit_cnt は、 0 から 1023 までの値を持つ整数でなければなりません。ストリーム ID には、0 から 15 までの整数値がなければなりません。

(POWER5 プロセッサーのみ)

__protected_stream_go void __protected_stream_go(); すべての限られた長さの protected ストリームの事前取り出しを開始します。

(POWER5 プロセッサーのみ)

__protected_stream_set void __protected_stream_set(unsigned int direction, const void* addr, unsigned int ID); ID という ID を使用する限られた長さの protected ストリームを確立します。これは、addr にあるキャッシュ・ラインから開始し、その後 direction の値に応じて、インクリメンタル (前方) またはデクリメンタル (後方) の方向でメモリー・アドレスから取り出します。このストリームは、ハードウェアで検出されるストリームによって置き換えられないように保護されています。

Direction には、値 1 (前方) または 3 (後方) が必要です。ストリーム ID には、0 から 15 までの整数値がなければなりません。

(POWER5 プロセッサーのみ)

__protected_unlimited_stream_set_go void __protected_unlimited_stream_set_go (unsigned int direction, const void* addr, unsigned int ID); ID という ID を使用して無制限の長さの protected ストリームを確立します。これは、addr にあるキャッシュ・ラインから開始し、その後 direction の値に応じて、インクリメンタル (前方) またはデクリメンタル (後方) の方向でメモリー・アドレスから取り出します。このストリームは、ハードウェアで検出されるどのようなストリームによっても置き換えられないように保護されています。

Direction には、値 1 (前方) または 3 (後方) が必要です。ストリーム ID には、0 から 15 までの整数値がなければなりません。

(PowerPC 970 および POWER5 プロセッサーのみ)

__protected_stream_stop void __protected_stream_stop(unsigned int ID); ID ID を持つ protected ストリームの事前取り出しを停止します。

(POWER5 プロセッサーのみ)

__protected_stream_stop_all void __protected_stream_stop_all(); すべての protected ストリームの事前取り出しを停止します。

(POWER5 プロセッサーのみ)

__rdlam unsigned long long __rdlam(unsigned long long rs, unsigned int shift, unsigned long long mask); ダブルワードを左方に回転し、マスクに AND します。

rs の内容を、左方に shift ビットだけ回転します。回転したデータは、マスクに AND され、結果として戻されます。 mask は定数で、隣接するビット・フィールドを示していなければなりません。

__readflm double __readflm(); 浮動小数点状況/制御レジスターを読み取ります。
__rldimi unsigned long long __rldimi(unsigned long long rs, unsigned long long is, unsigned int shift, unsigned long long mask); ダブルワードを左方に即時回転してから、挿入をマスクします。

rs を左方に shift ビットだけ回転してから、 rs をビット・マスク mask の下の is に挿入します。shift は定数で、 0<=shift<=63 でなければなりません。mask は定数で、隣接するビット・フィールドを示していなければなりません。

__rlwimi unsigned int __rlwimi(unsigned int rs, unsigned int is, unsigned int shift, unsigned int mask); ワードを左方に即時回転してから、挿入をマスクします。

rs を左方に shift ビットだけ回転してから、 rs をビット・マスク mask の下の is に挿入します。shift は定数で、 0<=shift<=31 でなければなりません。mask は定数で、隣接するビット・フィールドを示していなければなりません。

__rlwnm unsigned int __rlwnm(unsigned int rs, unsigned int shift, unsigned int mask); ワードを左方に回転し、マスクに AND します。

rs を左方に shift ビットだけ回転し、ビット・マスク maskrs を AND します。 mask は定数で、隣接するビット・フィールドを示していなければなりません。

__rotatel4 unsigned int __rotatel4(unsigned int rs, unsigned int shift); ワードを左方に回転します。

rs を左方に shift ビットだけ回転します。

__setflm double __setflm(double); 浮動小数点状況/制御レジスターを設定します。
__setrnd double __setrnd(int); 丸めモードを設定します。
__stfiw void __stfiw( const int* addr, double value); 浮動小数点を整数ワードとして保管します。

value の下位 32 ビットの内容が、 addr でアドレッシングするストレージのワードに、変換されずに保管されます。

__store2r void __store2r(unsigned short, unsigned short *); 2 バイト・レジスターを保管します。
__store4r void __store4r(unsigned int, unsigned int *); 4 バイト・レジスターを保管します。
__swdiv_nochk double __swdiv_nochk(double, double); double 型の、浮動小数点除法です。範囲チェックは行いません。ループ内で繰り返し除法をする場合、引き数が許容範囲内にあると分かっているときには、この関数を使用することにより、通常の除法演算子や __swdiv 組み込み関数を使用した場合よりも高いパフォーマンスを得ることができます。

引き数の制約事項: 無限大に等しい分子、または、無限大、ゼロ、または正規化解除に等しい分母は許可されません。分子と分母の商が正または負の無限大であってはなりません。

-qstrict が有効である場合は、結果は IEEE 除法とビット単位で同等となります。このシナリオで正しい演算を行うには、引き数が以下の追加の制約事項を満たしている必要があります。分子の絶対値は、2 ^ (-970) より大で、かつ無限大より小でなければなりません。分母の絶対値は、2 ^ (-1022) より大で、かつ 2 ^ 1021 より小でなければなりません。分子と分母の商の絶対値は、2 ^ (-1021) より大で、かつ 2 ^ 1023 より小のでなければなりません。

__swdiv double __swdiv(double, double); double 型の浮動小数点除法。引き数の制限はありません。
__swdivs_nochk float __swdivs_nochk(float, float); float 型の浮動小数点除法です。範囲チェックは行いません。引き数の制約事項: 無限大に等しい分子、または、無限大、ゼロ、または正規化解除に等しい分母は許可されません。分子と分母の商が正または負の無限大であってはなりません。
__swdivs float __swdivs(float, float); double 型の浮動小数点除法。引き数の制限はありません。
__sync void __sync(void); すでに組み込まれている __iospace_sync のもう 1 つの名前です。

コンパイラーは、__sync を組み込まれているものとして認識します。名前以外は、すべてが __iospace_sync とまったく同じです。 __sync には、対応する PowerPC の命令名との一貫性があります。

__tdw void __tdw(long long a, long long b, unsigned int TO); ダブルワードをトラップします。

オペランド a が、オペランド b と比較されます。この比較の結果、5 ビットの定数 TO (0 から 31 の範囲内の値を含む) に AND される条件は 5 つです。

結果が 0 でない場合、システム・トラップ・ハンドラーが呼び出されます。各ビットの位置 (設定されていれば) は、以下の起こりうる条件を 1 つ以上示します。

0 (高位ビット)
ab より小 (符号付きの比較を使用)。

1
ab より大 (符号付きの比較を使用)。

2
ab と等しい。

3
ab より小 (符号なしの比較を使用)。

4 (下位ビット)
ab より大 (符号なしの比較を使用)。
__trap void __trap(int); トラップ
__trapd void __trapd (longlong); パラメーターがゼロでない場合にトラップします。
__tw void __tw(int a, int b, unsigned int TO); ワードをトラップします。

オペランド a が、オペランド b と比較されます。この比較の結果、5 ビットの定数 TO (0 から 31 の範囲内の値を含む) に AND される条件は 5 つです。

結果が 0 でない場合、システム・トラップ・ハンドラーが呼び出されます。各ビットの位置 (設定されていれば) は、以下の起こりうる条件を 1 つ以上示します。

0 (高位ビット)
ab より小 (符号付きの比較を使用)。

1
ab より大 (符号付きの比較を使用)。

2
ab と等しい。

3
ab より小 (符号なしの比較を使用)。

4 (下位ビット)
ab より大 (符号なしの比較を使用)。
__usrthds int __usrthds(void); usrthds ランタイム・オプションの値を戻します。

usrthds オプションがユーザーによって明示的に設定されていないか、プログラムのコンパイル時に -qsmp コンパイラー・オプションが指定されなかった場合、この関数は、選択されたランタイム・オプションに関係なく 0 を戻します。

IBM Copyright 2003