Logicielsmoto.com http://www.logicielsmoto.com/phpBB/ |
|
gagner des cycles machines http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=189 |
Page 5 sur 8 |
Auteur: | Tomix3 [ 29 Aoû 2006, 22:39 ] |
Sujet du message: | |
@Sam Code: 00100 ****** Division 16 bits ******
00110 ***** D:Divide X:Divise ***** 00120 DIVIS16 PSHS D,X 00130 LDD #$0000 00140 LDX #16 00150 DIVI161 ROL 1,S 00160 ROL ,S 00170 ROLB 00180 ROLA 00190 SUBD 2,S 00200 BCC DIVI162 00210 ADDD 2,S 00220 DIVI162 LEAX -1,X 00230 BNE DIVI161 00240 ROL 1,S 00250 ROL ,S 00260 COM 1,S 00270 COM ,S 00280 PULS X 00290 LEAS 2,S 00300 RTS 00310 ****** Res:X Rest:D ****** Ce coup ci, j'ai laisse les numeros de ligne Assdesass. Marre de les virer... Tu veux pas mes routines de multiplication 8 bits et 16 bits aussi? a+ Seg. |
Auteur: | Samuel Devulder [ 29 Aoû 2006, 23:30 ] |
Sujet du message: | |
Samuel Devulder a écrit: Tomix3 a écrit: J'ai aussi une routine de division 16 bits dans mes vieilles disquettes... j'suis preneur! En attendant, je viens de generaliser ton code 8 bits. Ca a l'air assez direct. L'astuce est d'utiliser un paire de exg pour faire comme si les ror existaient pour les registres d'addresse: Code: * divise D par X.
* resultat dans D, reste de la division dans y divi16 pshs x * utiliser stx ,--s ? ldx #16 leay -16,x * astuce: prends moins de place que ldy #0... mais est-ce ok en nb de cycles ? l1 rolb rola exg d,y rolb rola subd ,s bcc l2 addd ,s l2 exg d,y leax -1,x bne l1 rolb rola comb coma puls x,pc M'enfin je me demande si on peut pas grapiller 1 ou 2 cycles. Ca serait cool un assembleur (ou un emulateur! ) qui affiche a cote des opcodes le nb de cycles de chaque instruction. Ca permettrait de comparer 2 implementations. A noter l'astuce avec le leay -16,x qui prends juste 2 octets au lieu des 3 pour ldy #0. Au debut j'avais une version avec le resultat dans X et le compteur dans Y sur 15 valeurs permettant un "ldx #0; leay 15,x" qui me semblait bien, et au lieu du "leay -1,y; bne XXX" j'avais ecrit "leay -1,y, bpl XXX" en utilisant le fait (jusqu'il y a peu inconnu de moi, merci prehisto ) que lea positionne le bit N. C'etait pas mal, ca doit marcher sur un vrai 6809e, mais sous dcmoto ca passe pas.. le LEA garde le bit N tel quel et la boucle ne termine pas. C'est dommage car le bit C lui doit rester tel quel pour que l'algo marche. Donc le LEA qui positionne uniquement Z et N c'est le bon plan. sam (il n'y a pas a dire l'asm 6809e c'est rigolo) |
Auteur: | Samuel Devulder [ 29 Aoû 2006, 23:39 ] |
Sujet du message: | |
Tomix3 a écrit: Code: ... 00220 DIVI162 LEAX -1,X ... 00240 ROL 1,S 00250 ROL ,S Ah zut on s'est croise Ma solution est differente: j'utilise un reg plutot que la pile .. Grr j'arrive pas a compter les cycles avec les modes indexe.. dans la doc de l'assembleur TO8/TO9/TO9+ de FIL que j'ai, il n'ont pas inclu les tableaux pour compter les cycles des modes indexes (page 174). C'est bien la peine d'avoir avec moi les docs papier tiens! Du coup je sais pas si c'est plus rapide au final car "exg" est une instruction lourde (8 cycles!!!). Quand je vois tes label "DIVI162"... ca me fait penser que les ASM thomson ont le mauvais gout de ne pas avoir de notion de label "locale" (les labels commencant par un "." sous gcc par ex) qu'on peut redefinir. L'assembleur pointerait sur la label de meme nom le plus proche de l'addresse courante. Ca simplifierait vraiment l'ecriture asm.. parce que passe les "toto" "titi" "tutu" et "tata" je suis a court de labels! sam (bonne nuit, il se fait tard, faut que j'rentre) |
Auteur: | Samuel Devulder [ 29 Aoû 2006, 23:50 ] |
Sujet du message: | |
Tomix3 a écrit: Tu veux pas mes routines de multiplication 8 bits et 16 bits aussi?
Ouais.. Mais je pense qu'il faudrait vraiment faire un autre sujet sur le forum programmation car on va finir par saturer celui-ci qui je crois s'interresse plus au niveau "instructions isolees". Je ne sais pas ce qu'en pense l'initiateur du sujet. Sinon pour le 8 bits... ben mul.. Il est quasi gratos sur 6809e (11cycles) et les shift+add seront plus lent (5/6 cycles par saut, en 2sauts on est moins bon que le mul) Pour le 16 bits, ben on fait 4 muls.. eventuellement 3 si on utilise l'astuce qui evite de calculer les produits croises centraux du developpement (multiplication karatusba http://mathworld.wolfram.com/KaratsubaMultiplication.html). Sinon quelqu'un a t'il reussi a exploiter le fait que bitC est positionne a la suite d'un mul si le bit B7 (de A je suppose) est positionne ? sam. |
Auteur: | Tomix3 [ 29 Aoû 2006, 23:58 ] |
Sujet du message: | |
@Sam A propos du calcul de cycle, j'avais prevu le coup dans le debugueur de Tomix. Le desassembleur affiche le nombre de cycles (et les cycles alternatifs pour certaines instructions). Faudrait que je monte une petite commande DOS qui depouille un fichier binaire thomson, a partir du debugueur de Tomix. a+ Seg. |
Auteur: | Prehisto [ 30 Aoû 2006, 02:39 ] |
Sujet du message: | |
Samuel Devulder a écrit: Quand je vois tes label "DIVI162"... ca me fait penser que les ASM thomson ont le mauvais gout de ne pas avoir de notion de label "locale" (les labels commencant par un "." sous gcc par ex) qu'on peut redefinir. L'assembleur pointerait sur la label de meme nom le plus proche de l'addresse courante. Ca simplifierait vraiment l'ecriture asm.. parce que passe les "toto" "titi" "tutu" et "tata" je suis a court de labels!
Il y a toujours moyen de contourner le problème pour les branchements ascendants, en utilisant la directive SET. Pour ma part, j'utilise les labels B complétés avec un chiffre: Code: LDA #45
B0 SET * DECA BNE B0 B0 SET * DECA BNE B0 B0 SET * DECA BNE B0 ... ce qui me permet d'utiliser plusieurs fois le même label. Pour le reste, évidemment... |
Auteur: | Prehisto [ 30 Aoû 2006, 04:48 ] |
Sujet du message: | |
Si je puis me permettre, Tomix, ton: Tomix3 a écrit: Code: 00130 LDD #$0000 ... peut déjà être optimisé avantageusement par: Tomix3 a écrit: Code: CLRA CLRB J'ai aussi évité la redondance du ROL 1,S/ROL ,S en la compensant par un BRA et un LDX #17 au lieu d'un LDX #16. Et réaménagé la sortie de routine, ce qui inverse les registres du reste et du quotient mais qui me permet de faire un COMA/COMB au lieu d'un COM ,S/COM 1,S : Code: *** X=diviseur - D=dividende ***
DIV PSHS D,X CLRA CLRB LDX #17 BRA DIV1 DIV0 ROLB ROLA SUBD 2,S BCC DIV1 ADDD 2,S DIV1 ROL 1,S ROL ,S LEAX -1,X BNE DIV0 STD 2,S PULS D,X COMA COMB RTS *** D=quotient - X=reste *** Gain: 5 octets. |
Auteur: | Prehisto [ 30 Aoû 2006, 06:35 ] |
Sujet du message: | |
Tomix3 a écrit: Code: ****** Division 8 bits ****** ****** A:Divid B:Divis ****** DIVIS8 PSHS B,X CLRB LDX #8 DIVI81 ROLA ROLB SUBB ,S BCC DIVI82 ADDB ,S DIVI82 LEAX -1,X BNE DIVI81 ROLA COMA LEAS 1,S PULS X,PC ****** Res:A Rest:B ****** . J'empile A, ce qui me le libère pour le décompteur et vire donc le X : Code: ****** Division 8 bits ******
****** A:Divid B:Divis ****** DIVIS8 PSHS A,B LDD #$0800 DIVI81 ROL ,S ROLB SUBB 1,S BCC DIVI82 ADDB 1,S DIVI82 DECA BNE DIVI81 LDA ,S++ ROLA COMA RTS ****** Res:A Rest:B ****** Gain: 2 octets. |
Auteur: | Tomix3 [ 30 Aoû 2006, 08:44 ] |
Sujet du message: | |
@Prehisto Attention au CLRA et CLRB. Ca coute 2 octets et 4 cycles en tout; le LDD #0 coute 3 octets mais 3 cycles en tout. Le LDD est plus avantageux. a+ Seg. |
Auteur: | Tomix3 [ 30 Aoû 2006, 08:51 ] |
Sujet du message: | |
@Prehisto Ta division 8 bits reformulee m'a l'air bien sympa, aussi bien en taille qu'en nombre de cycles a+ Seg. |
Auteur: | Prehisto [ 30 Aoû 2006, 08:52 ] |
Sujet du message: | |
Tomix3 a écrit: @Prehisto
Attention au CLRA et CLRB. Ca coute 2 octets et 4 cycles en tout; le LDD #0 coute 3 octets mais 3 cycles en tout. Le LDD est plus avantageux. a+ Seg. C'est sûr que tes routines sont les plus rapides. Mais dans ce cas, pourquoi mettre des routines sur lesquelles il n'y a plus rien à faire? |
Auteur: | Tomix3 [ 30 Aoû 2006, 09:18 ] |
Sujet du message: | |
@Prehisto Rien a faire, c'est vite dit! Si je croyais ca, je n'aurai pas poste ces routines. L'idee pour moi c'est d'avoir le meilleur compromis entre taille et nombre de cycles consommes et ton intervention interessante montre que ma demarche n'est pas inutile. Je reviens sur ton optimisation sinon: Le rol ,s va couter 4 cycles de plus que le le rola. Sur la boucle ca fait 4*8, soit 24 cycles. Tu elimines le leax qui coute 4 cycles pour un deca qui en coute 2, soit un gain de 2 cycles, cad 16 cycles (8*2) sur la boucle. Le differenciel est donc de 8 cycles a ce stade. Tu supprimes le LEAS et le PULS qui coutent 13 cycles et tu rajoutes un LDA ,S++ et un RTS qui coutent 7 et 5 cycles. Gain: 1 cycle. Pour l'entete, le PSHS/CLRB/LDX coutaient 13 cycles. Et ton entete coute 10 cycles. Soit 3 cycles de gagne. Il y a donc 4 cycles de gagnes en entete et en queue de routine. Si je me suis pas plante, la version que tu proposes prend un chouilla plus de cycle (4 cycles de plus). Argh, c'est dommage a+ Seg. |
Auteur: | Tomix3 [ 30 Aoû 2006, 09:23 ] |
Sujet du message: | |
Ops... 8*4=32 of course... Donc, 16 cycles d'ecart sur la boucle... Au final, le gain est donc de -12 cycles. Argh++ a+ Seg. Edit: tiens, je viens de m'apercevoir qu'il y a un bouton "Editer" pour modifier son post... Edit2: J'ai cree un nouveau sujet pour la suite, plutot que de polluer celui la... |
Auteur: | Samuel Devulder [ 30 Aoû 2006, 10:24 ] |
Sujet du message: | |
Tomix3 a écrit: ...
Le rol ,s va couter 4 cycles de plus que le le rola. Sur la boucle ca fait 4*8, soit 24 cycles. ... Donc en fait c'est le rol en memoire qui bouffe du temps a cause du nb de cycles pour decoder puis acceder au ",s" le tout multiplie par le nb de tours. Ceci me laisse a penser que la version de la division 16bits que j'ai postee doit pas mal depoter: il n'y a pas de rol rien en memoire on fait juste deux exg.. ca doit le faire non ? encore que non.. exg c'est quand meme couteux.. bizzare pour une instru qui est bien pratique car elle permet pour ainsi dire d'etendre l'accumulateur aux registres x,y,u.. Si le exg coutait 2 cycles ca voudrait dire qu'on pourrait faire des and / eor sur X ou Y pour seulements 4 cycles de plus! Bon en realite ca coute 16cycles ce qui n'est plus tout a fait negligeable.. ca depend, il faut chiffrer et la j'suis en panne de table de cycles pour les modes d'addressages :-( sam (<==il a un petit cycle qui tourne dans la tete ? non c'est un ptit velo qui tourne dans sa tete !) |
Auteur: | Samuel Devulder [ 30 Aoû 2006, 10:34 ] |
Sujet du message: | |
Prehisto a écrit: Il y a toujours moyen de contourner le problème pour les branchements ascendants, en utilisant la directive SET.
C'est pas con! Il faudrait une astuce pour descendre... parce que bon avec des "BEQ *+6" on a vite fait de se planter Il n'y a pas l'equivalent d'un UNSET ? parce que je viens de voir que SET peut etre positionne apres son utilisation et que ca a l'air d'etre la definition qui suit qui est utilisee dans ce cas: Code: ...
B0 UNSET * du coup le B0 qui suit n'est pas defini BEQ B0 * et on sautera au prochain defini ... B0 SET * ... sam. |
Page 5 sur 8 | Heures au format UTC + 1 heure |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |