[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
サブルーチンを呼び出す 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.