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. |
![]() |
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