home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computer Club Elmshorn Atari PD
/
CCE_PD.iso
/
mac
/
1000
/
CCE_1024.ZIP
/
CCE_1024
/
SOZBIN07.LZH
/
SOZDISTR
/
DOC
/
TOP.CHG
< prev
next >
Wrap
Text File
|
1994-07-06
|
11KB
|
266 lines
top version 2.00 eXtended Version
changes by Harun Scheutzow and jerry geiger:
version V2.00x17
Options switched off by commandline arguments cannot be reactivated
with '#pragma OPT +<char>' statements.
version V2.00x16
'+u' bug should be fixed now. I hope so - jerry.
Harun improved his peephole bug fix.
version V2.00x15
one known bug: sometimes it is better to make use of '-u' option,
cause top calculates wrong offsets to (sp) after deleting
link/unlink instructions sometimes
Thu Jun 16 1994
peephole bug;
deleting of:
move.l a3,a4
move.l _alles,a3
move.l a4,_alles
with use of a3
fixed. (Harun Scheutzow did this)
Thu Jun 14 1994
There was still a impossible 'moveq #VAL, dest' generated sometimes.
error messages output changed, more diagnostics (switches in source)
in verbose mode
version 2.00x14
Mon Mar 7 1994
fixing bugs:
No more 'moveq #VAL, Ax' is generated.
Feb 19 1994
version 2.00x13
I tried to fix some bugs:
No more 'lea ANY, Dx' is produced.
An exception sometimes occured while testing a non existent bra condition.
Fixed.
Option -v and -V now work as you'ld expect:
-v : verbose
-V : print version info
TOP, Version 2.00x9 ('x9' von uns zwecks Unterscheidbarkeit hinzugefügt)
Stand: 26.08.92
Kurzübersicht/Zusammenfassung der Änderungen am SOZOBON-Optimizer TOP,
die von Christian Wempe und Holger Weets durchgeführt wurden:
Zunächst die schlechte Nachricht:
In der Original-Version 2.00 hatte sich außer der neuen Option '-g'
praktisch so gut wie überhaupt nichts verändert. Alle Fehler waren
noch drin, und es waren keinerlei neue Optimierungen enthalten.
Somit tragen wir die Verantwortung für alle Fehler, die mit dem neuen
Optimizer auftreten, und mit dem alten nicht. Natürlich können wir
dafür in keiner Weise haftbar gemacht werden, die Benutzung erfolgt
auf eigene Gefahr. Jeder Benutzer erkennt dies mit dem ersten Starten
des Programmes an.
Allgemeines
-----------
- alle uns bekannten Fehler konnten beseitigt werden
- TOP wurde auf Geschwindigkeit und Länge optimiert
- binäres statt lineares Suchen
- Zeiger statt Arrays
- intelligenteres ausführen der Register-Analyse
- Zusammenfassen von Peephole changes
- System-Nahes I/O - Handling
- TOP läuft jetzt ohne Änderungen auf ATARI und Amiga
- Die bereits eingebauten Optimierungen wurden wesentlich verbessert,
und sehr viele neue hinzugefügt (siehe unten)
- Die Zusammenarbeit mit dem Compiler (XCC) wurde verbessert.
Dieser erzeugt einige neue Hinweise im Text, welche TOP für bessere
Optimierung nutzt;
Für Insider:
;loop Lx -- wird für loop rotations verwendet, Lx ist das
Label, welches am Anfang der Schleifen-Bedingung
steht
;ret (d|a)0 -- wird zum Löschen von überflüssigen Zeilen ver-
wendet; das Argument (d0 oder a0) gibt dabei an,
in welchem Register das Funktions-Ergebnis zurück-
gegeben wird.
Bisher hat TOP bei jeder Funktion angenommen, das
sie ein Ergebnis in D0 zurückgibt, und demzufolge
weniger Instruktionen gelöscht
;sstart
;send -- dient zum umsortieren von switches
;longs -- reicht die '-L' (int = long) Option an den TOP weiter
;notop -- schaltet die Optimierung für die aktuelle Funktion
aus, es werden nur noch die Blöcke sortiert
(praktisch zum debuggen!)
;xhcc -- nur wenn dies im Text steht, wird die ';ret' Direktive
verwendet; somit läuft TOP jetzt auch mit anderen
Versionen des SOZOBON-Compilers zusammen
;opt [options] -- hiermit können die Optionen des TOP funktionsweise
ein- und ausgeschaltet werden, wobei '+<c>' die Option
<c> einschaltet, und '-<c>' sie ausschaltet; diese
Schalter können im C-Quelltext per '#pragma' in den
Assembler-Text gebracht werden. Siehe dazu die Datei
HCC.CHG
;debug [fkt] -- aktuell noch nicht verwendet, kommt später im Zu-
sammenhang mit der Debug-Option des Compilers zum
Tragen
;var ... -- im Original bereits enthalten, gibt Namen, Größe
und Stack-Position einer lokalen Variablen an
;reg ... -- im Original bereits enthalten, gibt Namen und Register
einer lokalen Variablen an
;rega ... -- gibt Namen, Größe und Stack-Position eines lokalen
Zeigers an
ACHTUNG: BEI EINGESCHALTETER -C OPTION UNSERE VERSION DER XDLIBS
SOWIE UNSERE FLOAT-BIBLIOTHEK VERWENET WERDEN !!!
Erweiterungen
-------------
- Loop rotations wurden implementiert. Hierbei handelt es sich um eine
reine Geschwindigkeits-Optimierung, daß Programm wird dadurch weder
kürzer noch länger.
Nachtrag: unter Umständen kann es passieren, daß eine zusätzliche
branch-Anweisung eingefügt werden muß, daß Programm könnte
also doch etwas länger werden; am Besten ausprobieren.
Abschaltbar wie bisher mit '-l'
- Block-Optimierung wurde implementiert. Hierbei handelt es sich um eine
reine Längen-Optimierung, daß Programm wird also nicht schneller, und
wenn '-q' (siehe unten) aktiviert ist, auch nicht langsamer. Abschaltbar
sind diese mit '-j' (j für 'join')
- Mittels der Option '-q' erzeugt TOP schnelleren, ansonsten kürzeren
Code. Bei manchen Optimierungen ist es nämlich so, daß sie das
Programm wesentlich schneller, aber auch länger machen, und in diesen
Fällen wird jetzt durch die Option entschieden, was zu tun ist
- Es wurden viele neue peephole changes implementiert. Insbesondere kann
TOP nun endlich auch ganze C-Anweisungen entfernen, wenn sie über-
flüssig sind.
- Das 'registerizing' wurde dahingehend verbessert, daß nun wenn möglich
die Register d0-d2 und a0-a2 verwendet werden. Dies ist also eine reine
Geschwindigkeits-Optimierung, da hierduch die movem-Anweisungen kürzer
werden bzw ganz entfallen.
- Es werden jetzt bei Bedarf auch Adress-Register verwendet, um lokale
Variablen und Parameter aufzunehmen. Dies betrifft insbesondere auch
lokale Arrays und Strukturen.
- es wurden Peephole changes implementiert, welche auch über mehrere
Blöcke hinweg arbeiten können, und dabei beliebig viele Instruktionen
manipulieren (in der Ausgabe: 'peephole changes (X)')
- wenn Schleifen rotiert werden, dann kann bei bestimmenten Schleifentypen
noch mehr optimiert werden (in der Ausgabe: 'branches refixed')
- wenn möglich, werden die link/unlk - Anweisungen entfernt. Da dies z.B.
bei Verwendung der Funktion alloca() Probleme geben kann, ist dieses
Feature abschaltbar mit '-u'.
- bei Aufrufen der Bibliotheks-Funktionen
strcmp() strcpy() strcat() strlen() strchr() strrchr()
stricmp() strlwr() strupr() strrev() strpos() bzero()
memcpy() lmemcpy() memmove() lmemmove() memccpy() memchr()
memcmp() memicmp() memset() memswap() stradj() strcspn()
stristr() strncat() strncmp() strncpy() strnicmp() strnset()
strpbrk() strpcpy() strrpbrk() strrpos() strset() strspn()
strstr() strtok() strtrim() substr() subnstr()
basename() suffix()
werden die Parameter in Registern übergeben (und nicht auf dem Stack).
Gleiches gilt für die intern für 'long' Berechnungen verwendeten
Funktionen
lmul, lmulu, ldiv, ldivu, lrem, lremu
und die intern für Floatingpoint-Berechnungen verwendeten Funktionen
fpmul, fpdiv, fpadd, fpsub, fpcmp, fpneg, fpltof, fpftol
Diese Form des Aufrufes ist
- schneller und kürzer
(Stack-Korrektur sowie das Laden der Parameter vom Stack entfällt)
- läuft aber nur noch mit unserer Version der XDLibs
- und abschaltbar mit '-c'
ACHTUNG: Die oben aufgezählten Funktionen sind speziell für die Register-
Parameter-Übergabe umgeschrieben worden, und sollten keinesfalls
durch Eigenkonstruktionen ersetzt werden !!!!
Bei den oben aufgeführten Funktionen wird seit V2.00x6 ein Parameter-
Test durchgeführt. Der TOP warnt z.B. bei Anweisungen wie
"strlwr(str1, str2);", weil die Funktion strlwr() mit nur einem Parameter
aufgerufen wird.
- Die Funktionen werden so umsortiert, daß a() vor b() steht, wenn a()
von b() aufgerufen wird
-> der Assembler kann mehr bsr.s statt jsr/bsr verwenden, was kürzer
ist
Dies ist abschaltbar mit '-f'
- ATARI:
Aufrufe von Funktionen, die in der selben Datei stehen, werden PC-
relativ gemacht.
AMIGA:
Alle Funktions-Aufrufe werden PC-relativ gemacht.
Dies ist abschaltbar mit '-a'.
- damit es nicht so langweilig wird, zeigt TOP jetzt immer an, welche
Funktion gerade optimiert wird
- Mehrere Variablen k÷nnen sich jetzt ein Register teilen, dadurch k÷nnen
eventuell noch mehr Variablen registert werden, wodurch der Code sowohl
kⁿrzer als auch schneller wird. (in der Ausgabe: 'registers joined')
Dies ist abschaltbar mit '-m' und ist nur eingeschaltet, wenn das
Registerizing (-r) auch eingeschaltet ist.
Bugs
----
Aktuell sind uns keine Fehler des Optimizers bekannt, wegen der
Komplexität des Optimierungs-Prozesses sind diese jedoch nie
auszuschliessen.
Wenn also Fehler gefunden werden, dann wie folgt vorgehen:
1. Programm ohne TOP übersetzen und prüfen, ob der Fehler nicht
vielleicht trotzdem auftritt...
2. Nachsehen, ob in der fehlerhaften Datei der Inline-Assembler ver-
wendet wurde ( asm() ); falls ja, liegt der Fehler aller Wahr-
scheinlichkeit nach daran, daß dort Code erzeugt wurde, welcher
den TOP irritiert:
- '.dc' - Anweisungen im TEXT-Segment
Abhilfe: die Daten ins DATA-Segment verfrachten (mit '.data')
- Kommentare der Form, wie sie vom Compiler geschrieben werden (s.o.)
Abhilfe: nach dem ';' ein Leerzeichen machen
- diverse Code-Sequenzen, die der Compiler nie erzeugt
Abhilfe: alle Funktionen, die den Inline-Assembler verwenden,
in eine separate Datei verschieben, und diese ohne
Optimizer übersetzen, oder die betreffenden Funktionen
mit '#pragma +TOP' / '#pragma -TOP' klammern
3. die Datei, in der TOP den Fehler macht, vom Compiler übersetzen
lassen
4. die so erhaltene Datei (*.S) auf eine Diskette kopieren
(kopieren der *.C - Datei wäre hilfreich, aber nicht unbedingt
erforderlich)
5. Alles aufschreiben, was zu dem Fehler bekannt ist
- in welcher Funktion tritt er auf
- welche Optionen des TOP müssen angegeben werden, damit der Fehler
nicht mehr auftritt
- zuerst die Peephole changes abschalten, danach funktioniert
wahrscheinlich bereits alles wieder
- falls der Fehler immer noch auftritt, jetzt die restlichen
Optionen probieren.
Soblald der Fehler nicht mehr auftritt, soviele Optimierungen wie
möglich wieder einschalten (um die Optimierungs-Art einzugrenzen,
an der es wirklich lag)
- wie äußert sich der Fehler (Berechnung falsch, Bomben, etc)
Christian & Holger