%Item
%Text
2   Optmierer
1
1 In diesem Abschnitt wird kurz erläutert, wie
1der Optimierer arbeitet. Es ist ein einfacher
1Peephole-Optimizer, der  keine Analysen  über
1den Code fährt und dann den  generierten Code
1verbessert, sondern er schaut nach kurzen Se-
1quenzen im  Code, die dann durch kürzere oder
1schnellere ersetzt werden. Dies macht deshalb
1Sinn, weil der Compiler Code jeweils unabhän-
1gig in Blöcken generiert. Da wären z.B :
1
1  - Variablenadressierung
1  - Befehlsfolgen
1  - Prozeduraufrufe
1  - Ausdrücke
1
1um nur einige zu nennen. Schauen wir uns  mal
1ein kurzes Mini-Comp-Programm an :
1
3  Program Test;
3  Var i : Integer;
3
3  Begin
3   Writeln('Hallo Welt');
3   Readln(i);
3   Writeln('I=',i)
3  End.
3
1Welche Blöcke werden nun im Code erzeugt ?
1
1 <Push 'Hallo Welt'>   ; String auf den Stack
1 <Put  String>         ; String ausgeben
1 <Read Wort>           ; Wort von StdIO lesen
1 <Make Int>            ; Eingabe nach Integer
1 <Push Adr(I)>         ; Adresse i auf Stack
1 <Assign>              ; Intwert nach Adresse
1                       ; speichern
1 <Push 'I='>           ; String auf Stack
1 <Put  String>         ; String ausgeben
1 <Push adr(i)>         ; Adresse von i und
1 <Fetch>               ; Inhalt auf den Stack
1 <Make String>         ; In String wandeln
1 <Put  String>         ; und ausgeben
1
1 Und alle diese Blöcke werden  unabhängig von
1einander erzeugt, so daß an aufeinander  fol-
1genden Blöcken Optimierungen möglich sind.
1
1 Folgende Sequenzen werden  im Moment erkannt
1und optimiert :
1
3  Alt                  Optimiert
1
1  Move.l #x,d0         Moveq  #x,d0
1
1  Move.l a5,a0
1  Move.l (a0),a0       Move.l (a5),a0
1
1  Move.l d0,-(sp)
1  Move.l (sp)+,d0      --
1
1  Move.l a0,-(sp)
1  Move.l (sp)+,a0      --
1
1  Adda.l #0,a0         --
1
1  Addi.l #0,(a7)       --
1
1  Move.w d0,-(sp)
1  Move.w (sp)+,d0      --
1
1 Wobei <x>  im Bereich von -128 bis +127 lie-
1gen muß.
%Ende
