コンパイラーは、より効率的なプログラムの作成を援助するため、ユーザーが組み込み関数を選択できるようにします。本節では、使用可能な各種の組み込み関数を要約します。
並列処理に使用する組み込み関数で説明している追加の組み込み関数を検索することもできます。
名前 | プロトタイプ | 説明 |
---|---|---|
__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 は、シングル・ワード変数に条件付きで割り当てられる新規の値を指定します。ワード変数は、フルワード境界で位置合わせしておかなければなりません。
戻り値:
|
__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 は、ダブルワード変数に条件付きで割り当てられる新規の値を指定します。ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。
戻り値:
|
__check_lock_up | unsigned int __check_lock_up (const int* addr, int old_value, int new_value); | 単一プロセッサー・システムでのロックを検査します。
条件付きで、シングル・ワード変数をアトミックに更新します。addr は、シングル・ワード変数のアドレスを指定します。old_value は、シングル・ワード変数の値に照らし合わせて検査される元の値を指定します。 new_value は、シングル・ワード変数に条件付きで割り当てられる新規の値を指定します。ワード変数は、フルワード境界で位置合わせしておかなければなりません。
戻り値:
|
__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 は、ダブルワード変数に条件付きで割り当てられる新規の値を指定します。ダブルワード変数は、ダブルワード境界で位置合わせしておかなければなりません。
戻り値:
|
__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 フィールドに入れられます。 bf と u は、 0<=bf<=7 および 0<=u<=15 の定数でなければなりません。 |
__mulhd | long long int __mulhd(long long int ra, long long int rb); | 高位の符号付きダブルワードの乗算です。
オペランド ra と rb の 128 ビットの積から、高位の 64 ビットを戻します。 |
__mulhdu | unsigned long long int __mulhdu(unsigned long long int ra, unsigned long long int rb); | 高位の符号なしダブルワードの乗算です。
オペランド ra と rb の 128 ビットの積から、高位の 64 ビットを戻します。 |
__mulhw | int __mulhw(int ra, int rb); | 高位の符号付きワードの乗算です。
オペランド ra と rb の 64 ビットの積から、高位の 32 ビットを戻します。 |
__mulhwu | unsigned int __mulhwu(unsigned int ra, unsigned int rb); | 高位の符号なしワードの乗算です。
オペランド ra と rb の 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 ビットだけ回転し、ビット・マスク mask に rs を 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 つ以上示します。
|
__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 つ以上示します。
|
__usrthds | int __usrthds(void); | usrthds ランタイム・オプションの値を戻します。
usrthds オプションがユーザーによって明示的に設定されていないか、プログラムのコンパイル時に -qsmp コンパイラー・オプションが指定されなかった場合、この関数は、選択されたランタイム・オプションに関係なく 0 を戻します。 |