格納最適化(store optimization)というマイナーな最適化(Gforth の実行命令の 0.6% ~ 0.8% 削減)では、 命令の記述に追加の要件が課されるため、 デフォルトでは無効になっています。
これはは何をするのでしょうか? 以下のような命令を考えてみましょう
dup ( n -- n n )
簡単にするために、 スタックのトップをレジスタにキャッシュしていないことも仮定します。 今、 dup の C 言語コードは、 最初に n
をスタックからロードし、 次にそれをスタックに 2 回 格納し、 そのうち 1 回は元のアドレスに格納します。 元のアドレスに格納する回は不要ですが、
gcc はそれを最適化しないので、 代わりに vmgen がそれを行うことができます(格納最適化(store
optimization)をオンにしている場合)。
Vmgen は、 スタック項目の名前を使用して、 スタック項目に開始時と同一の値が含まれているかを決めます。 したがって、 格納最適化を使用する場合は、 入力と出力で同じ名前を持つスタック項目も同じ値を持ち、 提供する C 言語コードで変更されないことを確認する必要があります。 つまり、 格納最適化をオンにすると、 以下のコードは失敗する可能性があります:
add1 ( n -- n ) n++;
代わりに、 あなたは別の名前を使用する必要があります。 つまり以下のようにします:
add1 ( n1 -- n2 ) n2=n1+1;
同様に、 格納最適化では、 スタック・ポインターが Vmgen で生成されたコードによってのみ変更されることを前提としています。 C 言語コードでスタック・ポインターを変更する場合は、 入力スタック項目と出力スタック項目に異なる名前を使用して(おそらく間違った)格納最適化を回避するか、 この VM 命令の格納最適化をオフにしてください。
格納最適化を有効にするには、 以下のように記述します
\E store-optimization on
これをファイルの先頭に記述します。 任意の 2 つの VM 命令記述の間で、 この最適化をオンまたはオフにできます。 再度オフにするには、 以下を使用できます。
\E store-optimization off