将128位xmm寄存器的上下64位相加

3

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

int temp;
....   

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

有没有更好的方法来做这件事?

1个回答

4

首先,为什么要使用四字节来表示适合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


@Stephen:前面的操作需要双四字节同时处理128个字节的信息。之后,一系列求和操作得出了具有上述上限的最终结果。 - Jacob
耸肩,挺好的。无论如何,我提供的任何序列都应该适合你,并避免使用传统的MMX。 - Stephen Canon
谢谢!它实际上搞乱了我的代码,使得所有的浮点数都被减少到-1.#IND! - Jacob
是的,如果您使用MMX寄存器,需要确保在使用x87指令的任何代码之前执行EMMS - Stephen Canon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接