Pregunta

Tengo dos almuerzos quadword enteros en xmm0 y tengo que agregar y almacenar el resultado en una ubicación de memoria.Puedo garantizar que el valor de cada número entero es menor que 2^15.Ahora mismo, estoy haciendo el siguiente:

int temp;
....   

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

Hay una manera mejor de hacer esto?

¿Fue útil?

Solución

En primer lugar, ¿por qué está usando palabras cuádruples para representar valores que encajarían en un formato de 16 bits? Dejando eso de lado, un par de soluciones:

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

o

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

o

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

Tenga en cuenta que en realidad no necesita utilizar paddq, puede salirse con uno de los más estrechos añade, si lo prefiere.

editar sumando cuatro palabras cuádruples dobles - Lo que tienes es más o menos bien. Dado que usted sabe que todos los datos en ellas se ajusta a la baja de doble palabra de cada ranura, podría intentar algo como:

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

que puede o no puede llegar a ser más rápido.

En cuanto a EMMS, es sólo otra instrucción. Después de cualquier código que toca los registros MMX, antes de cualquier código que utiliza el x87 instrucciones de punto flotante es necesario tener emms.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top