Bonjour,
je code (du moins j'essaie) en xmmx sous linux via gcc.
L'instruction movdqa ("a" pour "aligned") permet de faire des transferts rapides de buffers à registres xmmx. Ces buffers sont censés être alignés sur 16 bits. S'ils ne le sont pas, le movdqa fait planter l'appli. Pour travailler sans se soucier de l'alignement du buffer, on peut alors utiliser "movdqu" ("u" pour "unaligned"), mais c'est beaucoup moins rapide.
Sur internet, j'ai trouvé ce bout de code pour aligner les buffers d'unsigned char. Il marche sous linux (je peux utiliser "movdqa") :
Cependant, je comprends pas en quoi cette opération permet de récupèrer un pointeur sur une zone alignée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 // on doit ajouter 16 à la taille originale du tableau // donc si je veux travailler avec un buffer de 320*256, je doit créer un buffer de 320*256+16 unsigned char unalignedBuffer[320 * 256 + 16]; // on crée un pointeur sur le tableau initialisé qui pointe sur une zone alignée du tableau précédent unsigned char * alignedBuffer = (unsigned char *)(((long)unalignedBuffer + 15) & (~0x0F));
Par ailleurs, lorsque j'essaie d'adapter ce code sous Windows (borland c++ builder ou visual .NET c++), ça ne marche pas car je ne peux pas utiliser l'instruction "movdqa". C'est peut-être lié au fait qu'ils utilisent pas la même syntaxe assembleur. Je sais pas
Je serais vraiment content de pouvoir avoir une réponse à ces questions.
Merci. A+.
Flo.
Partager