Question

J'ai deux entiers emballés dans xmm0 quadruple mots et je dois les ajouter ensemble et stocker le résultat dans un emplacement de mémoire. Je peux garantir que la valeur du nombre entier chacun est inférieur à 2 ^ 15 . En ce moment, je fais ce qui suit:

int temp;
....   

   movdq2q mm0, xmm0
   psrldq xmm0, 8
   movdq2q mm1, xmm0
   paddq mm0,mm1
   movd temp, mm0

Y at-il une meilleure façon de le faire?

Était-ce utile?

La solution

Tout d'abord, pourquoi utilisez-vous quadwords pour représenter les valeurs qui pourraient convenir dans un format 16 bits? Cela mis à part, une des solutions de couple:

pshufd xmm1, xmm0, EEh
paddq  xmm0, xmm1
movd   temp, xmm0

ou

movdqa xmm1, xmm0
psrldq xmm1, 8
paddq  xmm0, xmm1
movd   temp, xmm0

ou

movhlps xmm1, xmm0
paddq   xmm0, xmm1
movd    temp, xmm0

Notez que vous n'avez pas réellement besoin d'utiliser paddq, vous pouvez vous en sortir avec l'un des plus étroits ajoute si vous préférez.

modifier sommer quatre doubles quadwords - ce que vous avez est à peu près bien. Étant donné que vous savez que toutes les données en leur convient dans le bas de chaque fente double mot, vous pouvez essayer quelque chose comme:

shufps  xmm0, xmm2, 88h
shufps  xmm4, xmm6, 88h
paddd   xmm0, xmm4
psrlq   xmm1, xmm0, 32
paddd   xmm0, xmm1
movhlps xmm1, xmm0
paddd   xmm0, xmm0
movd    temp, xmm0

qui peuvent ou peuvent ne pas se révéler être plus rapide.

En ce qui concerne EMMS, il est juste une autre instruction. Après tout code qui touche les registres MMX, avant que le code qui utilise le x87 instructions à virgule flottante vous devez avoir emms.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top