top version 2.00 eXtended Version changes by jerry geiger: Mon Mar 7 1994 version 2.00x14 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 hinzugefgt) Stand: 26.08.92 Kurzbersicht/Zusammenfassung der Žnderungen am SOZOBON-Optimizer TOP, die von Christian Wempe und Holger Weets durchgefhrt 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 fr alle Fehler, die mit dem neuen Optimizer auftreten, und mit dem alten nicht. Natrlich k”nnen wir dafr 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 ausfhren 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 hinzugefgt (siehe unten) - Die Zusammenarbeit mit dem Compiler (XCC) wurde verbessert. Dieser erzeugt einige neue Hinweise im Text, welche TOP fr bessere Optimierung nutzt; Fr Insider: ;loop Lx -- wird fr loop rotations verwendet, Lx ist das Label, welches am Anfang der Schleifen-Bedingung steht ;ret (d|a)0 -- wird zum L”schen von berflssigen Zeilen ver- wendet; das Argument (d0 oder a0) gibt dabei an, in welchem Register das Funktions-Ergebnis zurck- gegeben wird. Bisher hat TOP bei jeder Funktion angenommen, das sie ein Ergebnis in D0 zurckgibt, 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 fr 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 '+' die Option einschaltet, und '-' 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 krzer noch l„nger. Nachtrag: unter Umst„nden kann es passieren, daž eine zus„tzliche branch-Anweisung eingefgt 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 fr 'join') - Mittels der Option '-q' erzeugt TOP schnelleren, ansonsten krzeren 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- flssig 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 krzer 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 fr die intern fr 'long' Berechnungen verwendeten Funktionen lmul, lmulu, ldiv, ldivu, lrem, lremu und die intern fr Floatingpoint-Berechnungen verwendeten Funktionen fpmul, fpdiv, fpadd, fpsub, fpcmp, fpneg, fpltof, fpftol Diese Form des Aufrufes ist - schneller und krzer (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 fr die Register- Parameter-šbergabe umgeschrieben worden, und sollten keinesfalls durch Eigenkonstruktionen ersetzt werden !!!! Bei den oben aufgefhrten Funktionen wird seit V2.00x6 ein Parameter- Test durchgefhrt. 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 krzer 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 prfen, 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 mssen 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