72Close74
SCPCDOn the 2022-01-30 at 11:21am
dilinger (./69) :
Tu utilises un tool fait maison pour ce profiler?
Il est fait à la main.
Mais ça serait effectivement pratique d'avoir un tool qui le fasse smile


ericde45 (./72) :
concernant l'optimisation, donc il faut que je m'efforce de virer les movei de ce que je comprends
En général oui : pour tout ce qui est adresses/valeurs utilisées dont on a besoin immédiatement de la valeur.


ericde45 (./72) :
est il aussi + pertinent de faire moveq + shlq ?
Alors, ce n'est pas forcement plus judicieux.

Avec les exemples que tu donnes, on ne gagne rien voir on peut même perdre un cycle.
instruction
Cycle1
Cycle2
Cycle3
movei #$8000, R26
Rword1
-
-

Rword2
word1
-

-
-
word2word1 > Wr26

instruction
Cycle1
Cycle2
Cycle3
moveq #1,R26
#1
-
-
shlq #15,R26
Rr26
-
Wr26

-
Cr26
-

-
-
Wr26

instruction
Cycle1
Cycle2
Cycle3
moveq #0,R26
#0
-
-
bset #15,R26
Rr26
-
Wr26

-
Cr26
-

-
-
Wr26

Si tu as besoin d'utiliser r26 tout de suite, le 1er cas est plus rapide de 1 cycle par rapport aux 2 autres cas.
Si tu n'as pas besoin d'utiliser r26 tout de suite, le délai du writeback supplémentaire est compensé et revient donc au même, mais c'est moins lisible smile

En remplaçant le movei par un move* (qui n'est pas movei) tu peux gagner un cycle si tu as besoin directement de R26.
Tous les move* (autres que movei) font 2 cycles au lieu de 3, du coup il faut les utiliser à des endroits stratégiques car ils peuvent casser le pipeline si on ne fait pas gaffe.
On le voit typiquement dans ton code avec les "move r26,r25" dans les "DSP_LSP_routine_interruption_I2S_pas_fin_de_sample_channel*"

Dans certains cas, il pourrait même être plus rapides d'utiliser un xor à la place de moveq afin de ne pas casser le pipeline : tout dépend en fait de ce qu'il y a avant et après smile

instruction
Cycle1
Cycle2
Cycle3
xor R26, R26
Rr26
-
-
(instruction utile)
RrX
Cr26
-
bset #15,R26
Rr26
CrX
Wr26
(instruction utilisant RX)
RrX
Cr26
WrX
(instruction utilisant R26)
Rr26
CrX
Wr26



et pour ce qui est de la lecture des variables, je peux faciler switcher à un systeme :

movei #premiere_variable,Rn (que je remplacerai par un movefa bien sur)
load (Rn),Ry

quand j'ai besoin de la 2eme variable

addq #4,Rn
load (Rn),Rx
( en interlacé bien sur )
Oui tout à fait.

Le but étant d'obtenir quelque chose comme ca :

instruction
Cycle1
Cycle2
Cycle3
movefa Rm,Rn
Rr'm
-
-
load (Rn), Ry
Rrn
-
Wrn
addq #4, Rn
Rrn
Mrn
-
(instruction utile)
-
Crn
Wry
load (Rn), Rx
Rrn
-
Wrn

une partie du code de ma première version du player YM7 était écrit comme cela mais c'est l'enfer à debugger smile
il faut ré-écrire le code de cette façon une fois que ça fonctionne.
Oui, vaut mieux faire un truc qui marche et ensuite optimiser par itération en vérifiant bien que chaque parties fonctionnent toujours (et non tout faire d'un coup smile)
C'est plus long à faire, mais on au moins on a une référence qui marche smile