我在xmm0
中有两个打包的四字整数,我需要将它们一起添加并将结果存储在内存位置。我可以保证每个整数的值小于 2 ^ 15 。现在,我正在做以下事情:
int temp;
....
movdq2q mm0, xmm0
psrldq xmm0, 8
movdq2q mm1, xmm0
paddq mm0,mm1
movd temp, mm0
有更好的方法吗?
答案 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
。