Stockage de deux registres x86 32 bits dans un registre XMM 128 bits
Question
Existe-t-il une méthode plus rapide pour stocker deux registres x86 32 bits dans un registre XMM 128 bits?
movd xmm0, edx
movd xmm1, eax
pshufd xmm0, xmm0, $1
por xmm0, xmm1
Donc, si EAX est 0x12345678 et EDX est 0x87654321, le résultat en XMM0 doit être 0x8765432112345678.
Merci
La solution
Avec SSE 4.1, vous pouvez utiliser movd xmm0, eax
/ pinsrd xmm0, edx, 1
Et faites-le en 2 instructions.
Pour les CPU plus anciens, vous pouvez utiliser 2 x movd
et alors punpckldq
Pour un total de 3 instructions:
movd xmm0, edx
movd xmm1, eax
punpckldq xmm0, xmm1
Autres conseils
Je ne sais pas grand-chose sur MMX, mais peut-être que vous voulez l'instruction PackSSDW.
L'instruction PackSSDW prend les deux doubles mots de l'opérande source et les deux doubles mots de l'opérande de destination et les convertissent en quatre mots signés par saturation. L'instruction rassemble ces quatre mots et stocke le résultat dans le registre MMX de destination.
(de http://webster.cs.ucr.edu/aoa/windows/html/themmxinstructionseta2.html)
Edit: Je viens de réaliser que c'était des registres SSE. Tant pis.
Edit: Je vais me taire maintenant.