2

コンパイラ設計では、呼び出し元または呼び出し先レジスタの保存構成を使用する代わりに、呼び出し元が使用するレジスタのリストを呼び出し元に渡すことができませんでした使用されたレジスタのリストを呼び出し元が使用するレジスタと比較します。次に、本当にプッシュする必要のあるレジスタだけがプッシュされます。何か不足していますか?呼び出し元が使用しているレジスタを渡しても仲間に保存されませんか?

答えて

5

これは興味深い考えです。

  • 呼び出し先にかかわらず、最悪の場合のスタック領域を確保する必要があります:私は魅力よりも、それは少なくする二つのものがあると思います。
  • 効率を上げるには、一度にレジスタセットの格納とロードを行うための特別な手順が必要です。このような指示は、Motorola 68000(そしておそらくPowerPC)上にあったが、普及していない。ここで

それが動作しなければならないかの少し精緻化である: あなたは呼び出し側がビットベクトルとして機械語にリストをパックしたいと思います。次に、呼び出し先をビットごとにする必要があります。独自のリストでは、結果のビットベクトルで指定されたすべてのレジスタを保存する命令を持っています。

最悪の場合、スタックに領域を確保する必要があるため、現代のスーパースカラのアウトオブオーダープロセッサでは、大量のデータを保存しないでください。ほぼ無料です。

実行時にロードとストアの数を最小限に抑えることが本当に必要な場合は、すべての呼び出し元保存レジスタを使用するだけです。この戦略はまた、例外を発生させ、スレッドを先制的に切り替えることを本当に安価にします。そのため、多くのコンパイラ(OCamlのような)がそれを使用します。 Callee-Savesレジスタは、スピルおよびリロード命令のコードサイズを削減しようとするハックの一種です。コールサイトがプロシージャ定義よりもはるかに多く(平均して、プロシージャに複数のコールが含まれている)、多くの状況で機能し、スペースを節約できます。

呼び出し元保存と呼び出し先保存レジスタのトレードオフについては、nice paper by Jack Davidson and David Whalleyを参照してください。

+0

丁寧な回答ありがとうございます! –

+0

あなたは本当のリンクを持っていますか? TinyURL経由のリダイレクトは私にクッキーエラーに関するページを提供し、TinyURLはオリジナルを公開しません。 – Edmund

+1

@エドモンド:申し訳ありません。私は仕事で答えを書いて、それを実現せずに有料サイトにリンクしているに違いありません。私はリンクを変更しました。 –

2

これは非常に効率が悪いです...すべての機能のリストを解析する必要がありますが、これはまったく必要ありません。