我在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
。