9.1 Floating point

浮動小数点値をどのように扱うべきでしょうか? あなたは整数/ポインターと同一のスタックを使用するべきでしょうか、 それとも別のスタックを使用するべきでしょうか? このセクションでは、 実行速度の観点からこの問題について説明します。

より単純なアプローチは、 別の浮動小数点スタックを使用することです。 これにより、 整数/ポインターのサイズを考慮せずに FP 値のサイズを選択できるようになり、 多くのパフォーマンスの問題を回避できます。 主な欠点は、 これには FP スタック・ポインターが必要であることです(そして、 これは 386 アーキテクチャーのレジスター・ファイルに収まらない可能性があり、 パフォーマンスが多少低下しますが、 他のオプションを考慮すると比較的わずかです)。 別の FP スタック(スタック・ポインタ fp を使用)を使用する場合、 fpTOS の使用はほとんどのマシンで役に立ちますが、 一部のマシンでは fpTOS レジスタがメモリに配置(spill)されるため、 fpTOS を使用すべきではありません。

もう一つのアプローチは、 整数/ポインターと浮動小数点値で 1 つのスタック(たとえば、sp によってポイントされる)を共有することです。 spTOS を使用しなくても、 これは問題ありません。 spTOS を使用する場合、 コンパイラーはその変数を整数レジスターに入れるか浮動小数点レジスターに入れるかを決定する必要があり、 他の型の操作はほとんどのマシンで非常に高価になります(整数レジスターと FP レジスターの間で値を移動するため、 かなり高価です)。 一方の型の値を、 もう一方の型の 2 つの値(double 型)から合成する必要がある場合、 事態はさらに興味深いものになります。

この問題を回避する 1 つの方法は、Vmgen でサポートされている spTOS を使用せず、 明示的なスタックのトップ変数(整数用に 1 つ、 FP 値用に 1 つ)を使用し、 一種の アキュムレータ+スタック・アーキテクチャを使用することです。 (たとえば、 Ocaml バイト・コードはこのアプローチを使用します)。 ただし、 これは大きな変更であり、 その影響範囲は完全には明らかにはなっていません。