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 ?
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.
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![]()