#pragma reg_killed_by ディレクティブは、指定の関数によって変更 (強制終了) 可能な一連の揮発性レジスターを指定する。この pragma は、#pragma mc_func を使って定義された関数でしか使用できません。
ここで、
function 以前に #pragma mc_func を使って定義した関数。 regid 指定された function によって変更される、単一レジスターまたは一連のレジスターのシンボル名。一連のレジスターは、ダッシュで区切られた開始および終了の両レジスターのシンボル名を使用して識別されます。レジスターが指定されていない場合、どのレジスターも、指定された function によって変更されません。
シンボル名は、2 つの部分から構成されています。 1 つ目の部分は、レジスター・クラス名であり、 "a" から "z" および/または "A" から "Z" の範囲にある 1 つ以上の文字のシーケンスを使用して指定されます。
2 つ目の部分は、符号なし int の範囲にある整数です。この数値は、レジスター・クラス内の特定のレジスター番号を表します。一部のレジスター・クラスには、レジスター番号の指定が不要であり、レジスター番号を指定しようとすると、エラーが起こります。
regid が指定されていない場合、どの揮発性レジスターも、指定された function によって強制終了されません。
レジスター クラスおよび [レジスター番号] 説明および使用法 ctr カウント・レジスター (CTR) cr[0-7] 条件レジスター (CR)
- このクラス内の各レジスターは、条件レジスター内の 4 ビット・フィールドの 1 つです。
- 8 CR フィールドのうち、cr0、cr1、および cr5-cr7 のみが #pragma reg_killed_by によって指定されることができます。
fp[0-31] 浮動小数点レジスター (FPR)
- 32 個のマシン・レジスターのうち、 fp0 〜 fp13 のみが #pragma reg_killed_by によって指定されることができます。
fs 浮動小数点状況および制御レジスター (FPSCR) lr リンク・レジスター (LR) gr[0-31] 汎用レジスター (GPR)
- 32 個のマシン・レジスターのうち、 gr0、および gr3 〜 gr12 のみが #pragma reg_killed_by によって指定されることができます。
vr[0-31] ベクトル・レジスター (Altivec プロセッサーのみ) xer 固定小数点例外 (XER)
通常、#pragma mc_func によって指定された関数用に生成されたコードは、ご使用のシステムで使用可能な揮発性レジスターをどれでも変更できます。 #pragma reg_killed_by を使用して、そのような関数によって変更される揮発性レジスターの特定のセットを明示的にリストすることができます。このリストにないレジスターは、変更されません。
regid によって指定されたレジスターは、以下の要件を満たさなければなりません。
- 登録名のクラス名部分は有効でなければならない
- レジスター番号は必須または禁止である
- レジスター番号が必須であるときは、有効範囲内になければならない
これらの要件のいずれかが満たされない場合は、エラーが発行され、プラグマは無視されます。
次の例では、 #pragma mc_func によって定義された関数が使用する揮発性レジスターの特定のセットをリストする #pragma reg_killed_by の使用法を示しています。
int add_logical(int, int); #pragma mc_func add_logical {"7c632014" "7c630194"} /* addc r3 <- r3, r4 */ /* addze r3 <- r3, carry bit */ #pragma reg_killed_by add_logical gr3, xer /* only gpr3 and the xer are altered by this function */ main() { int i,j,k; i = 4; k = -4; j = add_logical(i,k); printf("¥n¥nresult = %d¥n¥n",j); }