質問

コンパイラの設計において、呼び出し元または呼び出し先のレジスタ保存配列を使用する代わりに、呼び出し元が使用済みレジスタのリスト(呼び出し元保存配列の場合にプッシュする)を呼び出し先に渡せないため、呼び出し先が使用されるレジスタのリストを呼び出し元が使用するレジスタと比較できます。その後、本当にプッシュする必要があるレジスタのみがプッシュされます。何か不足していますか?

役に立ちましたか?

解決

これは興味深いアイデアです。私はそれを魅力的ではないものにする2つのことがあると思います:

  • 呼び出し先は、最悪の場合でもスタックスペースを予約する必要があります。
  • 効率化するには、レジスタのセットを一度に格納およびロードするための特別な指示が必要です。このような指示はMotorola 68000(および場合によってはPowerPC)にもありましたが、一般的ではありませんでした。

ここで、それがどのように機能する必要があるかについて少し詳しく説明します。 呼び出し元にリストをビットワードとしてマシンワードにパックしてもらいたいでしょう。次に、呼び出し先がビット単位で、独自のリストを使用して、結果のビットベクトルで指定されたすべてのレジスタを保存する命令が必要になります。

最悪の場合に備えてスタック上のスペースを確保する必要があるため、あまり節約しません。現代のスーパースカラーのアウトオブオーダープロセッサでは、同じキャッシュラインへの書き込みはほとんどありません。無料。

また、実行時にロードとストアの数を最小限に抑えたい場合は、すべての呼び出し側保存レジスタを使用するだけです。また、この戦略により、例外を発生させ、スレッドとプリエンプティブにスレッドを切り替えることが非常に安くなります( OCaml )そのために使用します。 Callee-savesレジスタは、流出およびリロード命令のコードサイズを削減しようとする一種のハックです。これらは多くの状況で機能し、呼び出しサイトは手順定義よりもはるかに多いため、スペースを節約します(平均して、手順には複数の呼び出しが含まれます)。

発信者保存レジスタと呼び出し先保存レジスタのトレードオフに関する詳細については、 Jack DavidsonとDavid Whalleyによる素敵な論文

他のヒント

それは非常に非効率的です...完全に不要なリストを解析する必要があります(すべての関数について!)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top