我在xmm0中有两个压缩的四字整数,我需要将它们加在一起并将结果存储在内存中。我可以保证每个整数的值都小于 2 ^ 15 。现在,我正在执行以下操作:

int temp;
....

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

有一个更好的方法吗?

最佳答案

首先,为什么要使用Quadwords表示适合16位格式的值?抛开这些,有几个解决方案:

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

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

要么
movhlps xmm1, xmm0
paddq   xmm0, xmm1
movd    temp, xmm0

请注意,您实际上不需要使用paddq,可以根据需要选择较窄的添加项之一。

编辑,将四个双倍的quadwords求和-您的所剩无几。既然您知道它们中的所有数据都适合每个插槽的低位双字,则可以尝试以下操作:
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

可能会或可能不会更快。

对于EMMS,这只是另一条指令。在接触MMX寄存器的任何代码之后,在使用x87浮点指令的任何代码之前,您都需要具有emms

07-24 09:44
查看更多