#pragma reg_killed_by

説明

#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)
  • このクラスのそれぞれのレジスターは、条件レジスターの中の 4 ビット・フィールドの 1 つです。
  • 8 つの CR フィールドのうち、cr0cr1、および 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] ベクトル・レジスター (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);
}

関連情報