Für viele Zielarchitekturen von SDCC hat sich die bisher verwendete Aufrufkonvention als nicht optimal erweisen. Für stm8, z80, z80n, z180, gbz80, r2k, r2ka, r3ka, ez80_z80 und tlcs90 haben Experimente ergeben, dass mit einer anderen Aufrufkonvention kleinerer und schnellerer Code generiert werden könnte. Inzwischen wurde eine neue Konvention im Branch breaktheworld implementiert. Für stm8 und gbz80 findet sich die neue Konvention auch schon in trunk (dort aber noch nicht als Default). Für einzelne Funktionen kann per __sdcccall(0) die alte, per __sdcccall(1) die neue ausgewählt werden. Wo diese Schlüsselwörter nicht stehen, wird der Wert des Kommandozeilenarguments --sdccall N verwendet. Wo auch dieses nicht verwendet wird, wird der Default verwendet (neue Konvention im Branch breaktheworld, alte Konvention in trunk). Die Standardbibliothek ist jeweils für den Default kompiliert. Später soll die neue Konvention auch in trunk Default werden. Für stm8 und gbz80 dürfte dies in den nächsten Wochen erfolgen, und somit im nächsten Release (vermutlich SDCC 4.2.0 Anfang 2022) enthalten sein. Für die Nutzer ändert sich wenig (abgesehen davon, dass der code im Schnitt etwas schneller und kleiner werden sollte), aber in Assembler handgeschriebene Funktionen müssen entweder auf die neue Aufrufkonvention umgeschrieben werden, oder ihre Funktionsdeklarationen mit __sdcccall(0) versehen werden, falls sie weiterhin die alte Konvention verwenden sollen.
Danke für die Information. Gibt es Details was sich genau geändert hat (Vergleich alt/neu, eventuell mit Beispielen verschiedener Parameter)?
Michael schrieb: > Danke für die Information. Gibt es Details was sich genau geändert hat > (Vergleich alt/neu, eventuell mit Beispielen verschiedener Parameter)? Für stm8 und gbz80 finden sich die Details bereits im Handbuch. Grobe Zusammenfassung (für alle Ports): 1) Teils andere Register für Rückgagebwerte 2) Manche Argumente werden in Registern übergeben (bisher alle auf dem Stack) 3) Bei manchen Funktionen werden auf dem Stack übergebene Argumente von der aufgerufenen Funktion statt vom Aufrufer aufgeräumt 1) und 2) verbessern üblicherweise Codegröße und -geschwindigkeit. 3) macht den Code üblicherweise langsamer, aber kleiner.
wird das auch den mcs51 port betreffen. Dort ist es ja so dass der erste parm in Registern übergeben wird, die andern dann im Speicher. Ich hab mich da gerade etwas eingelesen und ein paar Experimente mit Assembler gemacht. Die Doku ist in dem Bereich nicht sehr ausführlich. Ich baue mir da eine Lib zusammen. Wie beinflusst das memory model die Parameter übergabe. (small verus larg)?
Thomas Z. schrieb: > wird das auch den mcs51 port betreffen. Für mcs51 sind erstmal keine Änderungen vorgesehen. P.S. Das "alle Ports" oben bezog sich auf alle im OP genannten Ports: stm8, z80, z180, z80n, gbz80, r2k, r2ka, r3ka, tlcs90, ez80_z80.
Gibt es eine neue Major-Release, wenn die Geschichte fertig ist? Es müssen ja doch ggf. ein paar Sachen angepasst werden. Es ist sonst etwas schwierig zu vermitteln: Läuft mit Version 4.1.0x aber nicht mehr mit Version 4.1.0y... Ansonsten ist die Sache prinzipiell zu begrüßen, jeder eingesparte Takt zählt :-)
Bernd schrieb: > Gibt es eine neue Major-Release, wenn die Geschichte fertig ist? > Es müssen ja doch ggf. ein paar Sachen angepasst werden. > Es ist sonst etwas schwierig zu vermitteln: Läuft mit Version 4.1.0x > aber nicht mehr mit Version 4.1.0y... > > Ansonsten ist die Sache prinzipiell zu begrüßen, jeder eingesparte Takt > zählt :-) Das nächste Major Release 4.2.0 kann erst einige Zeit später kommen, wenn bereits genug Erfahrung mit der neuen ABI besteht. Vermutlich Anfang 2022. Ansonsten: * gbz80 unterstützt die neue ABI (mittels __sdcccall(1) und --sdcccall 1) seit 4.1.7. * stm8 unterstützt die neue ABI (mittels __sdcccall(1) und --sdcccall 1) seit 4.1.8. * z80, z180, z80n, t2k, r2ka, r3ka unterstützen die neue ABI (mittels __sdcccall(1) und --sdcccall 1) seit 4.1.9. Wenn die neue ABI für einen Port Default wird, wird dann nochmal die Versionsnummer angehoben. Philipp
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.