JIT における手続き呼び出しの問題点
JIT コンパイルされた手続きが、別の手続きを呼び出す場合の扱いが理解できないので整理。
通常 VM インストラクションにおける処理
JIT の場合
ややこしい部分は?
callee からの戻り先が「どこか?」の部分。
一番望ましいのは、JIT コンパイルされたコードの中に戻ること。そうでなければ、せっかく JIT コンパイルしてもすぐに別の手続きを呼ぶだけで、JIT の恩恵を受けられなくなってしまう。
解 その1
FRAME 命令を 2種類用意する。JIT 用では vPC ではなく native PC などを PUSH しておく。
callee で発行される RETURN 命令では、スタックに積まれているもので JIT 用かどうか判別して RETURN する。
スタックの問題
解 その2 は、ネイティブスタックを使う事になるので、元の手続きが再帰している場合にうれしくない。
所感
この手の話は、JIT の教科書でもあれば章を割いて書かれてそうな話だ。論文を読むのが良いのかな。