2016-08-19 7 views
1

Ich habe kürzlich viel Compiler-Design studiert. Es ist mir gelungen, die Parsing-Phase gut zu verstehen, aber ich habe ein bisschen Probleme damit zu verstehen, wie die Code-Generierung funktioniert.Wie funktioniert die Assemblercodegenerierung?

Von dem, was ich gelesen habe, scheint es 3 wichtige Schritte in der Codegenerierungsphase zu sein:

  • Instruction Selection (Greedy Tiling)
  • Instruction Scheduling
  • Register Allocation

Jetzt ist die Planung von Einweisungen ein wenig mehr als das, was ich im Moment versuche, und ich denke, mit ein bisschen mehr Studium und Prototyping kann ich mich wahrscheinlich um den Graph co kümmern loring-Algorithmus für die Registerzuordnung.

Was mich stumps ist der erste Schritt, Anweisung Auswahl. Nach dem, was ich darüber gelesen habe, wird jeder Befehl in einer Zielmaschinensprache durch eine Kachel repräsentiert; und das Ziel ist, die Anweisungen zu finden, die den größten Teilen des Baumes entsprechen (daher der Spitzname, gieriges Tiling).

Die Sache, über die ich verwirrt bin, ist, wie wählen Sie Anweisungen aus, wenn sie nicht wirklich 1: 1 mit dem Syntaxbaum übereinstimmen?

Nehmen Sie zum Beispiel akkumulatorbasierte Architekturen wie die Z80- oder MIPs-Einzelanweisungsarchitektur. Das Ausführen von sogar 16-Bit-Ganzzahlarithmetik auf einem Z80 kann die Verwendung der Akkumulator- oder Schattenregister erfordern.

Es gibt auch einige Anweisungen, die nur für bestimmte Register verwendet werden können, obwohl sie allgemeingültig sind.

Würde ich das Folgende richtig annehmen?

a) Eine Kachel kann aus einer Folge von Anweisungen bestehen, die einem Syntaxbaummuster entsprechen und nicht nur einer 1: 1-Übereinstimmung.

b) Der Codegenerator generiert zuerst Code für eine stackbasierte Architektur (oder eine Architektur mit unendlichen temporären Registern) und erweitert und ersetzt während der Phase der Zuweisung von Registern irgendwie notwendige Anweisungen.

Antwort

2

a) Eine Kachel kann beliebig viele Befehle ausgeben. Zum Beispiel, wenn man Anweisung wie %x <- %y + %z hat, aber die Zielmaschine hat nur zwei Adressen Anweisungen, dann könnte eine passende Fliese die Montagefolge emittieren (destination ist erste Operanden)

mov %x, %y 
add %x, %z 

b) welche Art von Register (oder const oder mem reference) als Operand für einen Befehl erlaubt ist, wird durch den Befehl selbst bestimmt, daher muß die Befehlsauswahlphase mit symbolischen Registernamen (Pseudoregistern) arbeiten. Die Registerzuweisungsphase kann tatsächlich Additionsanweisungen ausgeben, z. Überlauf-/Ladecode, wenn ein Register einer erforderlichen Klasse für die Zuweisung nicht verfügbar ist.

prüfen diese Survey on Instruction Selection: an Extensive and Modern Literature Review