manière la plus rapide de placer un bit - ASM - Programmation
Marsh Posté le 27-06-2003 à 11:09:46
mettons
octet machin
int bitvalue
int bitposition
si bitvalue= 1
machin = machin | (1<<bitPosition)
sinon
machin = machin & ^(1<<bitPosition)
le ^ tu le fais en asm via neg
Marsh Posté le 27-06-2003 à 11:27:24
allez hop, un petit source bien rapide et bien pipeliné !
Code :
|
Marsh Posté le 27-06-2003 à 17:11:34
merci harkonnen
decidement le jour ou tu disparaitras de ce forum, l'assembleur perdra quelqu'un de très doué !
Marsh Posté le 27-06-2003 à 17:16:29
laisse tomber le cirage petit, ça marche pas avec moi
Marsh Posté le 27-06-2003 à 18:11:37
chrisbk a écrit : mettons |
tu voulais pas plutôt dire ~ à la place de ^ ?
Marsh Posté le 28-06-2003 à 14:13:06
ReplyMarsh Posté le 20-04-2004 à 23:38:15
Harkonen> Juste pour le fun...
En fait il y a quelques problèmes dans ton code...
Code :
|
Total... 7 cycles... A la deuxième exécution. (10 cycles à la première)
Ensuite il y a une erreur, ton code génère un problème sur le bit 0.
Je propose un code un peu différent (plus lisible également)
Code :
|
Total... 5 cycles... (8 cycles à la première exécution)
On peut pousser à 5 cycles avec un WAR... (et 6 cycles à la première exécution)
Code :
|
Faut faire des concours pour le fun...
PS:Le code le plus rapide n'existe pas !
Marsh Posté le 21-04-2004 à 05:03:47
surtout qu'avec les moteurs out of order des CPUs récents, la notion de pipe U & V tombe pas mal à l'eau...
et pi ton code, il marche que si tu veux mettre un bit à un...
Marsh Posté le 21-04-2004 à 10:34:50
Tout à fait exact !
Bon j'en rajoute une couche...
Code :
|
Total... 5 cycles à la seconde exécution... (9 cycles pour la première exécution)
A noter que bitposition doit aller de 0 à 7 si cela dépasse, cela ne marche plus.
Marsh Posté le 21-04-2004 à 11:00:29
up d'un topic vieux de 10 mois, est-ce vraiment utile?
Marsh Posté le 21-04-2004 à 11:14:09
drashe> Dans 10 mois, un autre optimiseur sortira un code encore plus rapide...
Au lieu de faire des programmes lourds et lents, les 99% des programmeurs devraient plutôt faire des programmes rapides comme le premier Quake ! Un must du genre.
A la place de cela, on te dit : "c'est lent ? alors il faut changer votre processeur, votre mémoire..."
Marsh Posté le 21-04-2004 à 11:15:36
je connais le refrain, mon chef de projet me le chante régulièrement (et bien sûr, je suis contre, sinon je ne fréquenterais pas les topics ASM )
non je remarquais juste que tu uppais beaucoup de vieux topics ASM, ce qui n'est pas forcément bien vu ici
Marsh Posté le 21-04-2004 à 14:24:15
drasche> Ah bon ! Ok, je m'en souviendrais. Pourtant, il y a pas mal de réponses.
bjone>Les ror/rol c'est mal ??? Soit plus clair.
Marsh Posté le 21-04-2004 à 14:52:32
il me semble que le coût en cycles des ror/rol est variable car dépendant du décalage.... (itération dégeu en interne)
mais je peux me tromper... (ou alors c'est un autre blem, je dis ça de mémoire)
Marsh Posté le 21-04-2004 à 14:58:49
C'était peut-être vrai (je ne m'en souvient plus) pour les anciens procs jqu'au 386 mais à partir du 486, il n'y a pas ce genre de problème.
Marsh Posté le 21-04-2004 à 15:01:38
autant pour moi c'esr RCR RCL qui semble plus pénalisant...
Marsh Posté le 27-06-2003 à 11:05:01
je cherche un algo le plus rapide possible en assembleur pour placer un bit dans un octet à une position que je choisis, une sorte de fonction du style :
SETBIT(char *chaine, int bitposition, int bitvalue)
avec bitvalue = 0 ou 1.
j'arrive pas à le faire en assembleur. quelqu'un pour m'aider ?
---------------
Bougredane et bougre d'andouille ne font qu'un !