6.2.1 Explicit stack access

この機能は、 ここで説明されている(デフォルトで呼び出される) vmgen の 0.6.2 バージョンでは必要なく、 サポートされていません。

上記のスタック効果の仕様を使用して、 すべてのスタック効果を指定できるわけではありません。 他のスタック効果がある VM 命令の場合は、 C 言語コードでスタック・ポインターにアクセスすることで明示的に指定できます。 ただし、 そのような明示的なスタック・アクセスを Vmgen に通知する必要があります。 そうしないと、 Vmgen の最適化が、 この明示的なスタック・アクセスと競合する可能性があります。

Vmgen に通知するには、 ... と適切なスタック・プレフィックスをスタック・コメントに入れます。 次に、 VM 命令はまずスタック効果で指定された他のスタック項目を C 言語の変数に取り込み、 次にそのスタックの他のすべてのスタック項目がメモリ内にあり、 スタックのスタック・ポインターが先頭を指していることを確認します(デフォルトでは。 あなたがスタック・アクセス変換(the stack access transformation)を変更しない限り: see Stack growth direction)。

一般的なルールは次のとおりです: VM 命令の C 言語コードでスタック・ポインターに言及する場合は、 スタック効果にそのスタックの ... を含める必要があります。

以下の例について考えてみましょう:

return ( #iadjust S:... target afp i1 -- i2 )
SET_IP(target);
sp = (Cell *)(((char *)sp)+iadjust);
fp = afp;
i2=i1;

最初に変数 target afp i1 がスタックからポップされ、 次にスタック・ポインター sp が新しいスタックの深さに正しく設定され、 次に C 言語のコードがスタックの深さを変更して他の処理を行い、 最後に i2 は新しい深さでスタックにプッシュされます。

スタック効果内の ... の位置は関係ありません。 異なるスタックに複数の ... を使用することも、 同一のスタックに複数の ... を使用することもできます(追加の効果はありません)。 スタック・プレフィックスなしで ... を使用すると、 命令ストリームを除くすべてのスタックが指定されます。

命令ストリームに ... を使用することはできませんが、 その必要はありません。 C 言語のコードの先頭で、 IP は次の VM 命令の先頭(つまり、 現在の VM 命令の末尾のすぐ次)を指し、 SET_IP を使用して命令ポインターを変更できます(see VM engine)。