Je voudrais pouvoir déplacer une grosse zone mémoire (plusieurs Ko) de quelques bits (a priori 4) vers la gauche ou vers la droite en C, tout ça très rapidement. Pour l'instant, je ne peux pas faire ce décalage de moins de 8 bits, en utilisant memcpy ou memmove. Il faudrait une solution rapide (du même ordre que memcpy), sinon ça vaut pas le coup.
Si quelqu'un a une solution (en pur C, je ne connais pas d'ASM)... merci...
Merci de la réponse...
Je connaissais déjà les opérateurs >> et <<, mais là, ils ne vont pas m'être utiles -> trop lents car trop de conversions à faire. Il me faudrait une solution de même ordre de rapidité que memcpy.
Au fait, j'utilise en effet des données de type char, mais je pourrais prendre n'importe quoi (short ou long), car ce sont les bits 1 par 1 qui m'intéressent, pas les octets entiers.
Fait bien gaffe alors que la taille de ton buffer soit multiple de 4 ou 2.
Je crains qu'il n'y ait que l'assembleur qui réponde à tes exigences...

Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 :
www.ti-fr.com.
Quelques idées personnelles
ici.
... Ca me paraît pas la solution la plus rapide, mais je me trompe peut-être.

Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 :
www.ti-fr.com.
Quelques idées personnelles
ici.
de toute manière, je sais pas l'adapter vu que je connais pas l'asm
si quelqu'un sait...
À part l'appeler 4 fois, je ne vois pas comment utiliser cette routine. En effet, elle utilise une astuce: elle enregistre le bit qui doit passer d'un octet au prochain dans un flag du processeur. Chaque instruction roxl utilise ce flag et en même temps y place le bit pour le prochain roxl. Malheureusement, ce flag ne peut contenir qu'un seul bit, donc on ne peut pas utiliser cette astuce pour 4 octets.
KK> OK, merci. Dans ce cas, il y a pas une solution pour l'appliquer (4 fois si il le faut) sur une zone mémoire autre que 20 octets (en l'occurence 3600) ?
KK> OK, merci. Dans ce cas, il y a pas une solution pour l'appliquer (4 fois si il le faut) sur une zone mémoire autre que 20 octets (en l'occurence 3600) ?
Essaye cela:
void MoveLeft3600(unsigned short* buffer) {
register short* tmpbuffer = buffer+1800;
asm volatile (
"moveq.l #118,%%d0
lsl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0)
0:
roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0)
dbra %%d0,0b
roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0);roxl.w -(%0)"
: "=a" (tmpbuffer)
: "0" (tmpbuffer)
: "d0")
}
(à appeler 4 fois)
[edit]Edité par Kevin Kofler le 02-09-2001 à 19:03:58[/edit]
Je suis vraiment trop con, je me suis planté, c'est 3200 octets, pas 3600 !
En tout cas, j'ai pu tester avec 3600 (en allouant plus), à première vue, ça marche, mais je suis pas sûr que ça copie correctement les premiers octets car ça fait une petite erreur graphique sur mon prog (mais bon, c'est plus probable que ce soit à cause de mon prog parce que ça entrainait plein de changements, et que j'ai adapté à la va-vite).
Si tu peux me refaire la fonction pour 3200 octets, ce serait sympa, merci bien.
Au fait, pourquoi c'est pas possible de mettre la taille en paramètre de fonction ?
Kevin, il sert à quoi le volatile dans "asm volatile (..." ?
TiMad Le 03/09/2001 à 14:31 On peu toujours trouve mieux...
tu multiplie par deux le contenu de la boucle, tu divise par 2 le nombre de dbra et tu rajoute une derniere fois le code a la fin
resultat: (105-1)/2*10-1=501 cycles de gagne soit
1/(10 000 000)*501=0.0501 ms de gagné... (sur HW1)
Mais ton code source est 2 fois plus gros...
XLib v1.00 Powerrrrrrrrrrrrrrrrrrrr!
TiMad>désolé, je connais pas l'asm, je sais pas ce que ça donne...
mais bon, si c'est pour gagner 0.2 ms (en 4 fois), je doute que ça vaille le coup.