注意: (静的な)スーパー命令(superinstructions)にあまり多くの作業を費やさないでください。 Vmgen の将来のバージョンでは、 動的スーパー命令がサポートされる予定で(Ian Piumarta and Fabio Riccardi, Optimizing Direct Threaded Code by Selective Inlining, PLDI’98 参照)、 静的スーパー命令の利点ははるかに少なくなっています(暫定的な結果は、 係数 1.1 の高速化)。
以下にスーパー命令(superinstruction)定義の例を示します:
lit_sub = lit sub
lit_sub
はスーパー命令(superinstruction)の名前で、 lit
と sub
はそのコンポーネントです。 このスーパー命令は、 シーケンス「lit
sub
」と同じアクションを実行します。 これは、
そのシーケンスが発生するたびに VM コード生成関数によって自動的に生成されるため、 このスーパー命令を使用したい場合は、
この定義を追加するだけで済みます(see VM profiler により部分的に自動化することもできます)。
Vmgen では、コンポーネントの命令群が、 コンポーネントを使用するスーパー命令(superinstructions)より前に定義された単純な命令(simple instructions)であることが必要です。 現在、 Vmgen では、 スーパー命令の先頭にあるすべてのサブ・シーケンス(プレフィックス)が当該スーパー命令より前にスーパー命令として定義されている必要もあります。 つまり、 スーパー命令を定義したい場合
foo4 = load add sub mul
あなたは、 まず、 load
と add
と sub
と mul
を定義する必要があります。
さらに
foo2 = load add foo3 = load add sub
ここで、 sumof4
は sumof5
の最長のプレフィックスで、 sumof3
は
sumof4
の最長のプレフィックスです。 (訳注: 推敲途中だったかな? 意味不明)
注意: Vmgen は、 生成するコードのみがスタック・ポインターや、 命令ポインターや、 さまざまなスタック項目にアクセスすると想定しており、 この想定に基づいて最適化を実行することに注意してください。 したがって、 C 言語コードで命令ポインターを変更する VM 命令は、 最後のコンポーネントとしてのみ使用する必要があります。 C 言語コードがスタック・ポインターにアクセスする VM 命令は、 コンポーネントとしてまったく使用しないでください。 Vmgen はこれらの制限をチェックsせず、 インタープリターでバグが発生するだけです。
Vmgen フラグ include-skipped-insts
は、
スーパー命令(superinstruction)コードの生成に影響します。 現在、 のぞき穴最適化(peephole
optimizer)では両方のバリエーションはサポートされていないため、 このフラグは今のところそのままにしておきます。