6.2.2 C Code Macros

Vmgen は、 単純な命令の C 言語コード部分にある以下の文字列を認識します:

SET_IP

Vmgen に関する限り、 これを含む VM 命令は、 (プロファイルされたシーケンスを区切るためにプロファイリングで使用される、) VM 基本ブロックを終了します。 C 言語のレベルでは、 これにより命令ポインターも設定されます。

SUPER_END

これにより、 命令に SET_IP が含まれていない場合でも、 (プロファイリング用の)基本ブロックが終了します。

INST_TAIL;

Vmgen は、 ‘INST_TAIL;’ を、 VM 命令を終了して次の VM 命令をディスパッチするためのコードに置き換えます。 ‘INST_TAIL;’ がなくても、 制御が C g言語コードの最後に到達すると、 これは自動的に行われます。 これを C 言語コードの途中に置きたい場合に ‘INST_TAIL;’ を使用する必要があります。 典型的な例は、 以下のような条件付き VM 分岐です:

if (branch_condition) {
  SET_IP(target); INST_TAIL;
}
/* implicit tail follows here */

この例では、 if ステートメントの後に ‘INST_TAIL;’ が暗黙的に存在するため、 厳密には ‘INST_TAIL;’ は必要ありませんが、 これを使用すると分岐予測の精度がわずかに向上し、 他の最適化が可能になります。

SUPER_CONTINUE

これは、 VM 命令に SET_IP が含まれている場合でも、 VM 命令の終わりの暗黙の末尾に連続して次の VM 命令をディスパッチすることを示します。 これにより、 vmgen-ex コードにはまだ実装されていない(しかし Gforthには実装されている)最適化が可能になります。 典型的なアプリケーションは以下のような条件付き VM 分岐内にあります:

if (branch_condition) {
  SET_IP(target); INST_TAIL; /* now this INST_TAIL is necessary */
}
SUPER_CONTINUE;

注意: Vmgen は C 言語レベルのトークン化またはコメントまたは文字列または条件付きコンパイルについては賢明ではないため、 コメント・アウトされた SUPER_END であっても基本ブロックの終了として(または、 例えば、 ‘RESET_IP;’ を ‘SET_IP;’ として)解釈されることに注意してください。 逆に、 Vmgen ではこれらの文字列が文字通り存在する必要があります。 C 言語のプリプロセッサ・マクロ内に隠れている場合、 Vmgen はそれらを認識できません。