Im Sommersemester 2004 galt es, wie schon viele Jahre davor, im Rahmen der Übung Übersetzerbau einen codeerzeugenden Compiler zu schreiben und zu optimieren. Ich möchte hier ein paar der von mir eingesetzten naheliegenden und weniger naheliegenden Tricks vorstellen.
Code-Ausgabe | |
---|---|
Die eigentliche Code-Ausgabe erfolgt bei mir nicht direkt im Burg, auch nicht in der zwischengeschalteten Bibliothek "nodeops", in der die ganzen node_ Funktionen und die Registerverwaltung untergebracht sind. Nein, dafür habe ich eine eigene Bibliothek, die funklib. Und darin gibt es einerseits die Check-Verwaltung (wurde für ein gegebenes Register bereits eine Typüberprüfung durchgeführt?) und andererseits zahlreiche print_ Funktionen für eben die Codeausgabe. Ich stelle hier exemplarisch print_add() und print_add_const() vor, welche via node_add() aufgerufen werden. 384 print_add(int rs1, int rs2, int rd) { Das ebenfalls noch vorhandene print_add_const_const() ist ein Überbleibsel und wird inzwischen vollständig von node_add() übernommen. |
Zwei Register addieren | |
---|---|
Zwei Register zu addieren (384 - 395) kann kein Thema sein. Zwei Besonderheiten: check-int() (386) prüft den Typ nur "on demand". Außerdem: force_valid_int() sagt: das kann nur ein gültiger int sein. Und bei einer Ausgabe von add trifft das offensichtlich zu. Wieso brauchen wir das ganze nicht untaggen bzw. taggen? Überlegen wir uns das ganze Mathematisch. Ein typisierter int hat den Wert 2n. Klar, oder? Zwei typisierte Werte addieren sich nun zu 2a + 2b = 2n. Somit brauchen wir uns hier mit tagging und untagging nicht beschäftigen. Gilt genauso für and, bei mul benötigen wir ein abschließendes sra. |
Register und Konstante addieren | |
---|---|
Hier wirds interessant. Sollten wir die Konstante 0 erhalten (400), können wir ein einfaches Move machen. Genaugenommen wäre, wie mir gerade auffällt, nichtmal das notwendig: Wir könnten in node_add im Falle der Konstante 0 einfach den Register ans Ergebnis durchreichen. Das nächste Mal vielleicht :-) 419-444 ziehen Konstanten ab (bei negativen Werten) bzw. addieren diese zu einem Register. Geht allerdings nur +/- 128, das Tagging kostet uns ein Bit. 444-463 geht sich's wegen dem Bit nicht aus, schlagen wir hier zu. Dafür benötigen wir dann (leider) tagging/untagging. Höhere Konstanten verkraftet unser Compiler nicht, die Angabe schließt sie allerdings aus. |
Comments - Make a comment |
The comments are owned by the poster. We are not responsible for its content.
|
AdministrativeTexts
updated by freddiemac1993, 2013-06-14
wiki
Re: adventures
created by brittdavis10, 2012-02-23 (1 rply, 3 views)
thread
Re: how to run phpwebsite...
created by alexander, 2011-08-25 (2 rpls, 3607 views)
thread
Re: Forum tags
created by HaroldFaragher, 2011-08-22 (3 rpls, 8488 views)
thread