Logicielsmoto.com
http://www.logicielsmoto.com/phpBB/

Jeu: Le mot le plus lent
http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=499
Page 1 sur 1

Auteur:  Samuel Devulder [ 09 Avr 2014, 23:32 ]
Sujet du message:  Jeu: Le mot le plus lent

Je me suis posé la question de trouver l'instruction la plus lente à timing constant sur 6809 dans le but de faire une pause.

Le CWAI avec ses >=20 cycles semble être un bon candidat mais il n'a pas un timing constant. MUL avec ses 11 cycles est pas mal dans son genre. Mais peut on faire mieux? J'ai trouvé
Code:
CMPD [$1234,PCR]
qui fait 7+8=15 cycles à lui tout seul avec très peu d'effets de bords (seul CC est trashé).

Si on s'autorise les opcodes non légaux on peut le préfixer par autant de $10 que l'on veut pour rendre l'instruction arbitrairement lente et longue. Mais sans avoir recours à ce subterfuge, existe-t-il une instruction qui dépasse les 15 cycles ? C'est le mot le plus lent!

A noter que CMPD [$nnnn,PCR] est aussi l'une des instructions les plus longues car il faut 3+2=5 octets en mémoire pour la définir. Du coup je me demande s'il existe une instruction standard qui dépasse les 5 octets ? Bref, le mot (machine) le plus long en quelque sorte.

Auteur:  PulkoMandy [ 10 Avr 2014, 07:00 ]
Sujet du message:  Re: Jeu: Le mot le plus lent

En deux mots, je connait:
Code:
delay:
    LBSR return
return:
    RTS


En appelant ce code avec un LBSR delay on a:
[list=]
[*]Premier appel: 9 cycles
[*]Saut interne: 9 cycles
[*]RTS: 5 cycles
[*]RTS: 5 cycles
[/list]

Soit un total de 28 cycles pour 7 octets. On peut ajouter des LBSR qui comptent chacun 14 cycles, ce qui permet d'avoir un délai ajustable:
Code:
d42:
    LBSR return
d28:
    LBSR return
return:
    RTS


Plus lent?
Code:
delay:
    JMP delay


2 octets, et un délai... infini :W


Sur MO on peut également utiliser SWI2 et SWI3 (20 cycles), qui pointent tous les deux sur un RTS (5 cycles de plus). Soit 25 cycles en 2 octets. Je ne sais pas ce qu'il en est sur TO.

Auteur:  Prehisto [ 10 Avr 2014, 08:32 ]
Sujet du message:  Re: Jeu: Le mot le plus lent

SWI, c'est un bon rapport qualité prix (19 cycles pour 1 octet avec un RTI de 15 cycles pour un octet, ce qui fait un total de 34 cycles pour 2 octets). Bon, il faut définir un pointeur pour SWI, ce qui ajoute un peu, mais la perte est vite amortie si l'usage est intense.

EDIT: Et non, aucune instruction ne dépasse les 5 octets.

Auteur:  gilles [ 10 Avr 2014, 21:35 ]
Sujet du message:  Re: Jeu: Le mot le plus lent

et en faisant un push/pull de tous les registres? ça fait un paquet de cycle pour pas grand chose (4 octets me semble-t-il) et c'est neutre (dans un contexte ou on a effectivement une pile).

Auteur:  Prehisto [ 10 Avr 2014, 21:47 ]
Sujet du message:  Re: Jeu: Le mot le plus lent

Dans ce cas, un :

Code:
        LDA    #$XX
NEXT    DECA
        BNE     NEXT

... c'est pas trop mal aussi. 5 octets (ou moins selon les possibilités d'optimisations) et de 7 à 1282 cycles par tranche de 5...

Auteur:  gilles [ 10 Avr 2014, 21:56 ]
Sujet du message:  Re: Jeu: Le mot le plus lent

dans la pratique le MUL est à mon avis le bon choix pour la plupart des cas. le CMPD [PC,$1234] occupe 3 octets... autant aligner 3 MUL... perso c'est ma façon de faire dans les rares bouts de programme ou j'ai besoin de ça. quelques MUL pour le plus gros et des NOP pour compléter pour être précis au cycle.

Auteur:  Samuel Devulder [ 10 Avr 2014, 22:28 ]
Sujet du message:  Re: Jeu: Le mot le plus lent

Le mul a le pb de trasher deux des registres les plus utilisés.

Quand j'y réflechis, le me dis que le MUL est une instruction hors norme sur 6809. Un simple "TFR A,B" prends déjà 6 cycles pour ne rien faire de très compliqué (les flags ne sont pas mis à jour ce qui signifie que cette opération est réalisée hors ALU), alors que le MUL et toute la tripaille de barrel-shifters qu'il doit remuer dans l'ALU ne prends que 5 cycles de plus. MUL est étonnamment efficace.

A l'inverse, EXG et TFR sont vraiment trop lents sur 6809. S'ils se réalisaient en 2 cycles on pourrait swapper X avec D et virtuellement faire des operations arithmético-logiques sur les registres d'adresse pour seulement 4 cycles de plus (2 EXG). Avec le cout du EXG actuel, faire de la logique sur X coute minimum 16 cycles. On a plus vite fait d'écrire X en ram et travailler sur D directement.

Sinon il y a le 6309 :good:

EDIT: Apparement la substitution par un Hitachi est possible: voir ici.

Page 1 sur 1 Heures au format UTC + 1 heure
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/