La Place des Développeurs Coder en C avec SDCC
ericb59
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Oui on va sans doute gagner de la vitesse mais c'est beaucoup de contraintes en attendant !Toutes nos routines spécifiques sont en ASM, du coup y a quand même pas mal de boulot pour les remettre en conformité avec ce protocole.
J'suis fatigué rien qu'à y penser !
aoineko
Membre non connecté
Conseiller Municipal
La bonne nouvelle c'est que l'étape 2 doit même pas prendre 1h -- faut juste mettre des
__sdcccall(0)
à toutes les fonctions avec de l'assembleur en ligne -- et doit déjà faire gagner beaucoup de performance. Dans un vrai programme, y a souvent beaucoup de fonctions en C pur qui vont bénéficier à fond de la nouvelle convention d'appel.
Les étapes 3 et 4 peuvent arriver dans un deuxième temps et être fait petit à petit.
Bon, par contre, je suis bloqué à l'étape 1. J'ai récupéré SDCC 4.1.12 et tenté de rebuild tous mes samples avec l'ancienne convention d'appel ( --sdcccall 0 )... mais ça créé des problèmes sur certains des samples (notamment ceux utilisant les fonts). Je vais creuser pour voir ce qui a changé depuis la 4.1.0 que j'utilisais.
Les étapes 3 et 4 peuvent arriver dans un deuxième temps et être fait petit à petit.
Bon, par contre, je suis bloqué à l'étape 1. J'ai récupéré SDCC 4.1.12 et tenté de rebuild tous mes samples avec l'ancienne convention d'appel ( --sdcccall 0 )... mais ça créé des problèmes sur certains des samples (notamment ceux utilisant les fonts). Je vais creuser pour voir ce qui a changé depuis la 4.1.0 que j'utilisais.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
C'est bon, j'ai trouvé !
Quand on compile avec --sdcccall 0 (ancienne convention d'appel des fonctions) il faut link la lib z80 ayant la même convention.
Hors, la lib lib\z80\z80.lib fourni avec la 4.1.12 est compilé avec la nouvelle convention donc ça ne marche pas.
Il suffit de remplacer cette lib par la version de la 4.1.0 par ex. (ancienne convention), et hop, ça marche !
J'ai pu tester tous mes samples de test avec la 4.1.12 et tout fonctionne sans soucis.
Du coup, j'ai commencé à tester la nouvelle convention d'appel en la désactivant manuellement (avec __sdcccall(0)) sur toutes mes fonctions en assembleur en-ligne.
Ca marche sur la plupart des mes programmes de tests mais il me reste 2 p'tits soucis à régler.
Je creuse...
Quand on compile avec --sdcccall 0 (ancienne convention d'appel des fonctions) il faut link la lib z80 ayant la même convention.
Hors, la lib lib\z80\z80.lib fourni avec la 4.1.12 est compilé avec la nouvelle convention donc ça ne marche pas.
Il suffit de remplacer cette lib par la version de la 4.1.0 par ex. (ancienne convention), et hop, ça marche !
J'ai pu tester tous mes samples de test avec la 4.1.12 et tout fonctionne sans soucis.
Du coup, j'ai commencé à tester la nouvelle convention d'appel en la désactivant manuellement (avec __sdcccall(0)) sur toutes mes fonctions en assembleur en-ligne.
Ca marche sur la plupart des mes programmes de tests mais il me reste 2 p'tits soucis à régler.
Je creuse...
On est toujours ignorant avant de savoir.
Salut Guillaume,
la 4.1.12 est stable ??
[Mode HS On]
Pour le moment je n'ai pas trop le temps d'y jeter un oeil car je suis en plein préparatif pour l'AC 2021
Jipe ne pourra y être que dimanche, moi je n'y serai que samedi
Faudrait qu'un jour tu viennes à ce genre de convention (Je vais faire kek photos)
[Mode HS Off]
Tchao amigo et à bientôt Edité par Ricco59 Le 26/11/2021 à 23h21
la 4.1.12 est stable ??
[Mode HS On]
Pour le moment je n'ai pas trop le temps d'y jeter un oeil car je suis en plein préparatif pour l'AC 2021
Jipe ne pourra y être que dimanche, moi je n'y serai que samedi
Faudrait qu'un jour tu viennes à ce genre de convention (Je vais faire kek photos)
[Mode HS Off]
Tchao amigo et à bientôt Edité par Ricco59 Le 26/11/2021 à 23h21
aoineko
Membre non connecté
Conseiller Municipal
Ricco59 :
la 4.1.12 est stable ??
Ca à l'air.
En tout cas, j'ai pu convertir toute ma libraire pour utiliser la nouvelle convention d'appel de SDCC 4.1.12 !
Le point important c'est de bien mettre __sdcccall(0) sur toutes les fonctions qui lisent les paramètres d'entrée et/ou écrivent la valeur de retour en assembleur en-ligne.
Car oui, la nouvelle convention d'appel change aussi la convention de retour, ce qui m'avait échappé au premier abord.
Voici un petit tableau récapitulatif des différents convention d'appel :
__sdcccall(0) est équivalant à l'ancienne convention utilisé par SDCC jusqu'à la version 4.1.11
__sdcccall(1) est la convention utilisé par défaut par SDCC à partir de la version 4.1.12
__z88dk_fastcall est une convention alternative qu'on peut toujours utiliser
Le gros avantage de __sdcccall(1) c'est que non seulement elle gère le passage par les registres dans plus de cas que __z88dk_fastcall (qui ne fonctionne que pour un seul et unique paramètre), mais surtout, elle marche même si la fonction a plus de paramètres que ce qu'elle sait passer par les registres.
Par ex, si on fonction prends 3 paramètres 8 bits, les 2 premiers seront passés par les registres (A et L) et le 3 passera par la pile.
Le nombre de fonctions impactés par ces gains de performance est donc très conséquent !
Sur le sample de sprites de ma lib (avec 32 sprites qui bougent à l'écran), le gain de performance est d'environ ~20% (à l'œil, avec la technique du changement de couleur de fond).
Les gains seront très variables d'un programme à l'autre, mais ça devrait être vraiment significatif.
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie