SDCC ändert Aufrufkonvention

#6795441
Lesenswert?

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.
#6795522
Lesenswert?

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.
#6795663
Lesenswert?

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)?
Gast #6796562
Lesenswert?

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 :-)
#6796740
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren