この機能は、 ここで説明されている(デフォルトで呼び出される) 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)。