我有两个打包的四字节整数存储在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
。
EMMS
。 - Stephen Canon