En utilisant tes optimisations, j'arrive à 68 octets.
Mais au fait, il me smeblait que pour GTC tu avais réécrit une partie de TIGCCLIB en ASM. Quel code tu as écrit pour atoi ?
Je fais une comparaison non signée.
(les rumeurs ont la vie dure)
atoi: atol: moveq.l #0,d0 ; Result move.l a0,a1 ; Sign SkipSpace: cmpi.b #' ',(a0)+ beq.s SkipSpace Sign: move.b -(a0),d2 cmpi.b #'+',d2 bne.s Passer_et_Suite cmpi.b #'-',d2 beq.s Minus cmpi.b #$AD,d2 bne.s Suite Minus: sub.l a1,a1 Passer_et_Suite: addq.w #1,a0 Suite: moveq #0,d2 move.b (a0)+,d2 subi.b #'0',d2 cmpi.b #9,d2 bhi.s Result add.l d0,d0 move.l d0,d1 lsl.l #2,d0 add.l d1,d0 add.l d2,d0 bra.s Suite Result: move.l a1,d1 bne.s EndAtoi neg.l d0 EndAtoi: rts
Pollux a écrit :Ah OK. C'est vraiment pas bête comme optimisation
> Dans ton code, je ne comprends pas pourquoi tu n'as rien entre le subi.b #'0',d2 et le cmpi.b #9,d2
Parce que ça ne sert à rienJe fais une comparaison non signée.
Euh, pour ces routines, pourrions-nous avoir une permission explicite de les mettre sous la licence de TIGCCLIB (GPL + exception libgcc/TIGCCLIB) s'il vous plaît? (Je m'adresse aux auteurs, donc surtout jackiechan et aussi Pollux si c'est possible.) Juste pour qu'il n'y ait pas de conflits à ce sujet plus tard.
J'ai eu beau chercher dans toutes les docs que j'avais sous la main, nulle part il n'était précisé que la comparaison s'effectuait en arithmétique non signée.
(mais je pense que j'aurais du mal a faire mieux
)
atoi: atol: moveq.l #0,d0 ; Result move.l a0,a1 ; Sign SkipSpace: cmpi.b #' ',(a0)+ beq.s SkipSpace Sign: moveq #'+',d2 sub.b -(a0),d2 beq.s Passer_et_Suite addq.b #'-'-'+',d2 add.b d2,d2 bne.s Suite Minus: sub.l a1,a1 Passer_et_Suite: addq.w #1,a0 Suite: moveq #0,d2 move.b (a0)+,d2 subi.b #'0',d2 cmpi.b #9,d2 bhi.s Result add.l d0,d0 move.l d0,d1 lsl.l #2,d0 add.l d1,d0 add.l d2,d0 bra.s Suite Result: move.l a1,d1 bne.s EndAtoi neg.l d0 EndAtoi: rts
Je ne comprends pas pourquoi il y a un add.b d2,d2 juste avant le bne.s Suite Et j'ai l'impression que ton code ne marchera pas avec le - du tibasic.
atoi: atol: moveq.l #0,d0 ; Result move.l a0,a1 ; Sign SkipSpace: cmpi.b #' ',(a0)+ beq.s SkipSpace Sign: moveq #'+',d2 sub.b -(a0),d2 beq.s Passer_et_Suite addq.b #'-'-'+',d2 add.b d2,d2 bne.s Suite Minus: sub.l a1,a1 Passer_et_Suite: addq.w #1,a0 Suite: moveq #'0',d2 sub.b (a0)+,d2 neg.b d2 cmpi.b #9,d2 bhi.s Result add.l d0,d0 move.l d0,d1 lsl.l #2,d0 add.l d1,d0 add.l d2,d0 bra.s Suite Result: move.l a1,d1 bne.s EndAtoi neg.l d0 EndAtoi: rts
)Pollux a écrit :
C'est là l'intérêt du add.b d2,d2 : je viens de me rendre compte que '(-)' = '-' + 128![]()
