3

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

int temp;
....   

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

有一个更好的方法吗?

4

1 回答 1

3

首先,为什么要使用四字来表示适合 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,如果您愿意,可以使用较窄的添加之一。

编辑将四个双四字相加 - 你所拥有的非常好。鉴于您知道其中的所有数据都适合每个插槽的低位双字,您可以尝试以下操作:

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.

于 2009-12-11T21:22:38.217 回答