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

17.5.3 レジスタへの値の収まり方

この節では、どんな種類の値(特に、どのマシンモード)を各レジスタが 保持できるのか、そして、指定されたモードに必要な連続するレジスタは いくつ必要なのかを記述するマクロについて説明する。

HARD_REGNO_NREGS (regno, mode)

レジスタ番号は regno から始まり、モード mode の値を 保持するのに必要とされる、連続するハードレジスタの数を表す C の式である。

全てのレジスタがちょうど一ワードである機種では、このマクロの 適切な定義は以下のようになる。

 
#define HARD_REGNO_NREGS(REGNO, MODE)            \
   ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1)  \
    / UNITS_PER_WORD))
ALTER_HARD_SUBREG (tgt_mode, word, src_mode, regno)

一個の C の式であり、以下の式に対し調整済みハードレジスタ数を返す。

 
(subreg:tgt_mode (reg:src_mode regno) word)

これは、ターゲット機種に、SPARC V9 のように、サイズの入り交じった ビッグエンディアンのレジスタがある場合に必要になるかもしれない。

HARD_REGNO_MODE_OK (regno, mode)

モード mode の値を regno 番のハードレジスタ (あるいは、そのレジスタで始まる複数のレジスタ)に格納することが 可能なら、ゼロでない値を取る C の式。 全てのレジスタが同じ大きさの機種では、適切な定義は以下のようになる。

 
#define HARD_REGNO_MODE_OK(REGNO, MODE) 1

固定レジスタの数を検査するコードをこれに入れる必要はない。 割当機構はそれらが常に占有されていると想定しているからである。

機種によっては、倍精度の値は偶数番と奇数番のレジスタ対に保持しなければ ならない。 これを実装するには、倍精度のモードでは奇数番のレジスタをはじくように、 このマクロを定義すれば良い。

あるモードをあるレジスタにいれても大丈夫なための最低限の要件は、 ‘movmode’ 命令パターンがそのレジスタと、同じクラスの 他のハードレジスタの間での移動をサポートし、かつ、ある値を そのレジスタに移動して取り出してもその値を変えないことである。

word_mode を移動するのに使ったのと同じ命令が、 それより幅の狭い全ての整数モードに対して動作するので、 れを利用する ‘movhi’ 等のパターンを定義していれば、 どのマシンでも HARD_REGNO_MODE_OK がこれらのモードを区別する 必要はない。 これは、HARD_REGNO_MODE_OKMODES_TIEABLE_P の間の 相互作用のために便利である。全ての整数モードが結合可能であることが 望まれる。

多くの機種には、浮動小数点算術演算用の特別なレジスタがある。 浮動小数点マシンモードは浮動小数点レジスタでのみ許されると 思ってしまう人がよくいる。それは正しくない。 整数を保持できるどんなレジスタでも、浮動小数点マシンモードを 安全に保持できる。これは、浮動小数演算がそのレジスタで 行なえるかどうかには関係しない。 整数の移動命令を使って、この浮動小数点値を移動することができる。

だが、機種によっては、その逆は真である。 固定小数点マシンモードは浮動小数点レジスタに入れることができない。 これは、浮動小数点レジスタが、そこに格納された値を正規化する場合に 真になる。なぜなら、浮動小数点数でない値を格納すると正しくない 値に変えられてしまうからである。 それに該当する場合は、HARD_REGNO_MODE_OK では、 浮動小数点レジスタ中の固定小数点マシンモードを拒絶すべきである。 だが浮動小数点レジスタが自動的には正規化を行なわない場合は、 任意のビットパターンをそのレジスタに格納することができ、問題なく、 その値を変えずに取り出すことができるなら、 どのマシンモードも浮動小数点レジスタに入れることができ、 このマクロをそうするように定義できる。

特別な浮動小数点レジスタで一番大事なことは、 浮動小数点算術命令で受け付けるレジスタであるということである。 だが、これは HARD_REGNO_MODE_OK とは何の関係もない。 そういう命令については適切な制約を書くことで扱える。

機種によっては、浮動小数点レジスタはアクセスが特に遅いことがあるので、 浮動小数点演算を行なわないのであれば、浮動小数点レジスタよりも スタックフレームに値を格納したほうが良いだろう。 浮動小数点レジスタがクラス GENERAL_REGS に入っていない限り、 何かのパターンの制約で要求しない限り浮動小数点レジスタが使われることは ない。

MODES_TIEABLE_P (mode1, mode2)

モード mode1 の値を、コピーすることなしに、モード mode2 で アクセス可能ならゼロでない値を持つ C の式。

HARD_REGNO_MODE_OK (r, mode1)HARD_REGNO_MODE_OK (r, mode2) が、どの r に ついても常に同じなら、MODES_TIEABLE_P (mode1, mode2) は ゼロでない値になるべきである。 任意の r について両者が異なるなら、 何か他の機構により、より狭いモードでその値をアクセス出来ることが 保証されない限りは、このマクロが 0 を返すようにすべきである。

このマクロは、可能な限り多くの場合にゼロでない値を返すように定義すべき である。そうしておくと、GNU CC のレジスタ割当がより良いものになる。

AVOID_CCMODE_COPIES

GCC が CCmode レジスタとの間のコピーを避けるべきならこのマクロを 定義する。CCmode との間のコピーのサポートが不完全な場合だけ このマクロを定義すること。


This document was generated using texi2html 1.78.