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