添加128位xmm寄存器的高64位和低64位

时间:2009-12-11 21:06:05

标签: c++ assembly visual-c++-2005 sse2

我在xmm0中有两个打包的四字整数,我需要将它们一起添加并将结果存储在内存位置。我可以保证每个整数的值小于 2 ^ 15 。现在,我正在做以下事情:

int temp;
....   

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

有更好的方法吗?

1 个答案:

答案 0 :(得分: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