MSX Village forum

La Place des Développeurs Coder en C avec SDCC

ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5505

Le 24/11/2021 à 14h36

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 ! :sick


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2726

Le 24/11/2021 à 17h48
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.


On est toujours ignorant avant de savoir.
Github    
ericb59 Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : compte ++ Groupe : Shoutbox

Inscrit le : 17/04/2012 à 10h25

Messages: 5505

Le 24/11/2021 à 21h41
Ha ben voila
C’etzit trop simple :siffle


banniere-ericb59e
Site web    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2726

Le 26/11/2021 à 18h56
C'est bon, j'ai trouvé ! :heink
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.
Github    
Ricco59 Membre non connecté

Villageois

Rang

Avatar

Inscrit le : 02/01/2021 à 11h22

Messages: 248

Le 26/11/2021 à 23h14
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


Tous mes travaux sont centralisés sur mon piti blog : https://ricco59.blogspot.com/
E-mail    
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2726

Le 27/11/2021 à 01h03
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 ! :tchin

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.
Github    
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie