après tout, allons-y, comptons les cycles
_fact:
movel a2,sp@- ; 12
movel sp@(8),a2 ; 16
moveq #1,d0 ; 4
cmpw #0,a2 ; 10
jeq L1 ; 8 ou 10 (je compte un beq.s)
pea a2@(-1) ; 16
jbsr _fact ; 18 (je compte un bsr.s)
movel d0,sp@- ; 12
movel a2,sp@- ; 12
jbsr ___mulsi3 ; 20 (j'ai pris le pire jsr abs.l)
lea sp@(12),sp ; 8
.even
L1:
movel sp@+,a2 ; 12
rts ; 16
au total, (sans compter les cycles pris par mulsi3): 164 ou 80 (suivant que le saut est pris ou pas)
alors le pea en lui même est une bonne idée puisque la séquence
subq.l #1,d0
move.l d0,-(sp)
coute 8+12 = 20 au lieu de 16 cycles (et encore, ici c'est parce que c'est un petit immédiat)
par contre, le code suivant est probablement meilleur:
_fact:
move.l 4(sp),d0 ; 16
beq.s L1 ; 8 ou 10
move.l d0,-(sp) ; 12
subq.l #1,d0 ; 8
move.l d0,-(sp) ; 12
bsr.s _fact ; 18
addq.w #4,sp ; 8
move.l d0,-(sp) ; 12
jsr __mulsi3 ; 20
addq.w #8,sp ; 8
rts ; 16
L1:
moveq #1,d0 ; 4
rts ; 16
ça fait au total: 130 ou 46
(notez que j'utilise la commutativité de mul)
donc sans surprise, je suis meilleur qu'un compilateur! (et encore, je me suis permis le luxe de gaspiller 8 cycles: ça sert à rien de dépiler pour rempiler juste après)
par contre si on fait le ratio avec le temps pris pour coder, le compilateur me torche complètement
le convention d'appels de fonctions est bien celle dont Pollux parle