[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.5.1 レジスタの基本的特徴

レジスタには色々な特徴がある。

FIRST_PSEUDO_REGISTER

コンパイラに知らせるべきハードウェアレジスタの数。 ハードウェアレジスタの番号は、0 から FIRST_PSEUDO_REGISTER-1 に なる。つまり、最初の疑似レジスタ番号は FIRST_PSEUDO_REGISER になる。

FIXED_REGISTERS

コンパイルされたコード全体を通して決まった目的で使用され、そのために一般の 目的で使用することのできないレジスタを指定するための初期化子である。 このようなレジスタとしては、スタックポインタ、フレームポインタ(フレーム ポインタを必要としないときは汎用レジスタとして使うことができるような機種 の場合は除く)、アドレス可能なレジスタの一つとして考えることのできる 機種ではプログラムカウンタ、あるいは ある標準的な使い方をするように番号が付けられた他のレジスタ等がある。

この情報は、一連の数字コンマで区切り、中括弧で囲んで表す。 n 番目の数字は、レジスタ n が固定であれば 1 で、固定で なければ 0 である。

このマクロで初期化されたレジスタの表、それに以下のマクロのどれかで 初期化された表は、次のどちらかの方法で上書きされる可能性がある。 つまり、マクロ CONDITIONAL_REGISTER_USAGE の作用により自動的にか、 あるいはユーザが指定したコマンド行オプション ‘-ffixed-reg’、 ‘-fcall-used-reg’、‘-fcall-saved-reg’ により 書き換えられる。

CALL_USED_REGISTERS

FIXED_REGISTERS とほぼ同様だが、 固定レジスタに加えて、(一般には)関数呼び出しで破壊されるレジスタ についても 1 とする。 このため、このマクロにより、関数呼び出しを越えて保存されなければ ならない値の一般的な割当には利用できないレジスタを識別する。

あるレジスタの CALL_USED_REGISTERS での値が 0 なら、 そのレジスタが関数内で使われていれば、コンパイラは自動的に、そのレジスタを 関数の入り口点でセーブし、関数の終了点でリストアする。

HARD_REGNO_CALL_PART_CLOBBERED (regno, mode)

一個の C の式。この式は、モード mode の値を、 その一部が破壊されることなく呼出しを越えて、 ハードレジスタ番号regno に格納するのが許されない時はゼロでない 値になる。ほとんどの機種ではこのマクロを定義する必要はない。 レジスタの全内容を呼出しを越えては保存しない機種でのみ必要になる。

CONDITIONAL_REGISTER_USAGE

0個以上の C の文で、四つの変数 fixed_regscall_used_regsglobal_regs(この三つは char [] 型)、reg_class_contents (HARD_REG_SET 型)を条件により更新する。 このマクロが呼ばれる前に、fixed_regscall_used_regsreg_class_contents がそれぞれ、FIXED_REGISTERSCALL_USED_REGISTERSREG_CLASS_CONTENTS により初期化され、 global_regs がクリアされ、コマンド行オプション ‘-ffixed-reg’、‘-fcall-used-reg’、 ‘-fcall-saved-reg’ がどんなものであれ適用される。

これは、固定レジスタや呼び出し破壊レジスタがターゲットのフラグに依存する場合に 必要になる。

することがなければ、このマクロを定義する必要はない。

あるクラスのレジスタ全体の使用法がターゲットのフラグに依存する場合は、 そのことを GCC に知らせるのにこのマクロを使うことができる。 このマクロで、GCC で使うべきでないクラスのレジスタのそれぞれについて、 fixed_regscall_used_regs を 1 になるように更新する。 また、マクロ REG_CLASS_FROM_LETTER を定義して、 使うべきでないクラスの文字を引数として呼ばれた場合は、 NO_REGS を返すようにする。

(だが、このクラスが GENERAL_REGS に含まれておらず、 このクラスを許す制約を持つ全ての insn のパターンが、ターゲットスイッチ により制御されるなら、GCC は、ターゲットスイッチが反対しているなら これらのレジスタを使うのを自動的に避ける。)

NON_SAVING_SETJMP

このマクロが定義されていてかつその値がゼロでない場合は、 setjmp とその関連関数がレジスタのセーブに失敗するか、 あるいは longjmp がレジスタのリストアに失敗するという ことを意味する。これを補償するために、コンパイラは setjmp を使っている関数ではレジスタに変数を置くのを避ける。

INCOMING_REGNO (out)

ターゲット機種にレジスタウィンドウがあればこのマクロを定義する。 これは C の式であり、呼び出し側関数からは out と見えるレジスタ 番号に対応するレジスタを、被呼び出し側関数から見た場合のレジスタ番号 を返す。レジスタ番号 out が外向きのレジスタでなければ out を返す。

OUTGOING_REGNO (in)

ターゲット機種にレジスタウィンドウがあればこのマクロを定義する。 これは C の式であり、被呼び出し側関数からは in と見えるレジスタ 番号に対応するレジスタを、呼び出し側関数から見た場合のレジスタ番号 を返す。レジスタ番号 in が内向きのレジスタでなければ in を返す。


This document was generated using texi2html 1.78.