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

15.17 関数呼び出し insn の RTL 表現

サブルーチンを呼び出す insn は、RTL 式コードが call_insn になる。 サブルーチン呼び出し insn は特別な規則に従う必要があり、 本体部分で特別な RTL 式コード call を使わなければならない。

call 式は、以下のようにオペランドを二つ取る。

 
(call (mem:fm addr) nbytes)

ここで、nbytes は、サブルーチンに渡される引数データのバイト数を 表すオペランドである。fm はマシンモードであり、 addr はサブルーチンのアドレスを表す。 fm は、マシン記述の FUNCTION_MODE マクロの定義と 同じでなければならない。

値を返さないサブルーチンについては、上に示した call 式そのものが insn の全体になる。ただし、use 式か clobber 式を その他に含んでいる必要がある。

戻り値があり、そのモードが BLKmode でないサブルーチンについては、 戻り値はハードレジスタに置かれる。このレジスタの番号が r なら、 call insn の本体は以下のようになる。

 
(set (reg:m r)
     (call (mem:fm addr) nbytes))

この RTL 式は、この insn で、適切なレジスタに有効な値が置かれる ことを(最適化パスに対して)はっきりさせる。

サブルーチンが BLKmode の値を返すなら、 その値を格納すべき位置のアドレスをサブルーチンに渡すという処理が 行なわれる。このため、call insn 自身はどんな値も返さないので、 値を返さない呼び出しと同じ形式の RTL になる。

マシンによっては、call 命令自身が幾つかのレジスタを、例えば 戻り先アドレスを保持するために、破壊する。 そういうマシンでの call_insn insn の本体は、 call 式と clobber 式の両方を持つ、一個の parallel とすべきである。この clobber 式は、どのレジスタが破壊されるかを 示す。 同様に、call 命令が、スタックポインタ以外に、RTL で明示的に指定 されていないレジスタを必要とするときは、use 副式がそのレジスタに ついて言及すべきである。

呼び出される関数は、コンフィギュレーションマクロ CALL_USED_REGISTERS (see section レジスタの基本的特徴)に列挙されている全てのレジスタを修正し、 const 関数とライブラリ呼びだしを例外として、全メモリを 修正すると仮定される。

単に use 式を含む insn は、どのレジスタが関数への入力を 保持しているかを示す call_insn の直前に位置する。 同様に、CALL_USED_REGISTERS で指定されている以外のレジスタが 呼び出された関数により上書きされるなら、単独の clobber を 含む insn は、それがどのレジスタかを示すために、その呼び出しの直後に 置かれる。


This document was generated using texi2html 1.78.