我在xmm0两个压缩四字整数和我需要将它们加在一起,并将结果存储在存储器中的位置。我可以保证各整数的值是小于的 2 ^ 15 即可。现在,我做了以下内容:

int temp;
....   

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

有没有更好的方式来做到这一点?

有帮助吗?

解决方案

首先,为什么您使用四字来表示,将适合于一个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任何代码之前的任何代码之后。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top