Frage

In Compiler Design, warum stattdessen einen Anrufer oder Angerufenen Register sparende Anordnung zu haben, konnte der Anrufer nicht die Liste der verwendeten Register übergeben (dass es im Fall eines Anrufer sparenden Anordnung drücken würde) an den Angerufenen, so dass der Angerufene kann die Liste der verwendeten Register zu den verwendeten Register durch den Anrufer vergleichen. Dann werden nur die Register, die wirklich geschoben werden müssen, würde geschoben werden. Bin ich etwas fehlt?

War es hilfreich?

Lösung

Es ist eine interessante Idee. Ich denke, es sind zwei Dinge, die es weniger machen als attraktiv:

  • hat die Angerufene Stapelspeicherplatz für den schlimmsten Fall zu reservieren, und zwar unabhängig.
  • Um es effizienter zu machen, würden Sie spezielle Anweisungen zum Speichern und Laden von Gruppen von Registern auf einmal benötigen. Solche Anweisungen waren auf dem Motorola 68000 (und vielleicht auch PowerPC), aber sie haben nicht sehr beliebt.

Hier ist ein wenig Ausarbeitung, wie es hätte arbeiten: Sie würde die Anrufer will die Liste in ein Maschinenwort als Bit-Vektor packen. Sie würden dann die Angerufenen müssen bitweise und mit einer eigenen Liste, die eine Anweisung haben, die alle Register durch den resultierenden Bit-Vektor genannt speichert.

Weil Sie gehen zu müssen, Platz auf dem Stapel für den schlimmsten Fall buchen, sparen Sie nicht viel --- auf einem modernen, superskalaren Out-of-Order-Prozessor, in die gleiche Cache-Zeile schreibt fast frei.

Es ist auch wahr, dass wenn das, was Sie wirklich wollen, ist die Anzahl der Lade- und Speichervorgänge während der Laufzeit zu minimieren, nur Sie gehen mit allen Registern Anrufer-speichert. Diese Strategie macht es auch wirklich billig, eine Ausnahme zu machen und Switch-Threads-emptively vor, und viele Compiler (wie OCaml ) verwenden sie es aus diesem Grund. Callee-Speicherungs-Register sind eine Art von Hack zu versuchen, für den Spill auf die Codegröße zu reduzieren und Anweisungen zu laden. Sie arbeiten in vielen Situationen, und sie sparen Platz, da Aufrufstellen Prozedurdefinitionen weit zahlreicher als (im Durchschnitt eine Prozedur enthält mehrere Anrufe).

Für weitere Informationen über Tradeoffs zwischen Anrufer-speichert und Angerufenen-Speicherungs-Register gibt es ein schönes Papier von Jack Davidson und David Whalley .

Andere Tipps

Das ist sehr ineffizient ... Sie müssen die Liste analysieren (für jede Funktion!), Die völlig unnötig ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top