6.3 Superinstructions

注意: (静的な)スーパー命令(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)の名前で、 litsub はそのコンポーネントです。 このスーパー命令は、 シーケンス「lit sub」と同じアクションを実行します。 これは、 そのシーケンスが発生するたびに VM コード生成関数によって自動的に生成されるため、 このスーパー命令を使用したい場合は、 この定義を追加するだけで済みます(see VM profiler により部分的に自動化することもできます)。

Vmgen では、コンポーネントの命令群が、 コンポーネントを使用するスーパー命令(superinstructions)より前に定義された単純な命令(simple instructions)であることが必要です。 現在、 Vmgen では、 スーパー命令の先頭にあるすべてのサブ・シーケンス(プレフィックス)が当該スーパー命令より前にスーパー命令として定義されている必要もあります。 つまり、 スーパー命令を定義したい場合

foo4 = load add sub mul

あなたは、 まず、 loadaddsubmul を定義する必要があります。 さらに

foo2 = load add
foo3 = load add sub

ここで、 sumof4sumof5 の最長のプレフィックスで、 sumof3sumof4 の最長のプレフィックスです。 (訳注: 推敲途中だったかな? 意味不明)

注意: Vmgen は、 生成するコードのみがスタック・ポインターや、 命令ポインターや、 さまざまなスタック項目にアクセスすると想定しており、 この想定に基づいて最適化を実行することに注意してください。 したがって、 C 言語コードで命令ポインターを変更する VM 命令は、 最後のコンポーネントとしてのみ使用する必要があります。 C 言語コードがスタック・ポインターにアクセスする VM 命令は、 コンポーネントとしてまったく使用しないでください。 Vmgen はこれらの制限をチェックsせず、 インタープリターでバグが発生するだけです。

Vmgen フラグ include-skipped-insts は、 スーパー命令(superinstruction)コードの生成に影響します。 現在、 のぞき穴最適化(peephole optimizer)では両方のバリエーションはサポートされていないため、 このフラグは今のところそのままにしておきます。