#pragma reg_killed_by ディレクティブは指定された関数によって変更 (kill) される可能性のある揮発性レジスターのセットを指定します。 このプラグマは、#pragma mc_func を使用して定義される関数でしか使用できません。
.-,------------------------. V | >>-#--pragma--reg_killed_by--function----+----------------------+-+->< '-regid--+-----------+-' '- ---regid-'
ここで、
function | 以前に #pragma mc_func を使って定義した関数。 |
regid | 指定された function によって変更される単一のレジスターまたはレジスターの範囲のシンボル名。レジスターの範囲は、ダッシュで区切って開始レジスターと終了レジスターの両方のシンボル名を提供することにより識別されます。レジスターが指定されていない場合は、指定された function でどのレジスターも変更されません。
シンボル名は 2 つの部分からなります。最初の部分は、「a」から「z」または「A」から「Z」、あるいはその両方の範囲の 1 つ以上の文字のシーケンスを使用して指定されたレジスターのクラス名です。 2 番目の部分は unsigned int の範囲の整数価です。この数字はレジスター・クラスの中の特定のレジスター番号を識別します。 一部のレジスター・クラスではレジスター番号の指定が必要なく、指定しようとした場合、エラーが発生します。 regid が指定されていない場合は、どの揮発性レジスターも、指定された function によって変更 (kill) されません。 |
レジスター | |
クラスと [レジスター番号] | 記述と使用法 |
ctr | カウント・レジスター (CTR) |
cr[0-7] | 条件レジスター (CR)
|
fp[0-31] | 浮動小数点レジスター (FPR)
|
fs | 浮動小数点状況および制御レジスター (FPSCR) |
lr | リンク・レジスター (LR) |
gr[0-31] | 汎用レジスター (GPR)
|
vr[0-31] | ベクトル・レジスター (VMX プロセッサー専用) |
xer | 固定小数点例外 (XER) |
通常、#pragma mc_func によって指定された関数に対して生成されたコードは、システム上で使用可能なすべての揮発性レジスターを変更することができます。そのような関数によって変更される特定の揮発性レジスターのセットを明示的にリストするには、#pragma reg_killed_by を使用することができます。 このリストに入っていないレジスターは変更されません。
regid によって指定されるレジスターは、以下の要件を満たしている必要があります。
これらの要件のいずれかが満たされていない場合は、エラーが発行され、プラグマは無視されます。
以下の例は、#pragma reg_killed_by を使用して、#pragma mc_func で定義された関数によって使用される揮発性レジスターの特定セットをリストする方法を示しています。
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); }
関連情報