有没有更快的方法将两个 x86 32 位寄存器存储在一个 128 位 xmm 寄存器中?
movd xmm0, edx
movd xmm1, eax
pshufd xmm0, xmm0, $1
por xmm0, xmm1
因此,如果 EAX 为0x12345678
且 EDX 为0x87654321
,则 xmm0 中的结果必须为0x8765432112345678
。
使用 SSE 4.1,您可以使用movd xmm0, eax
/pinsrd xmm0, edx, 1
并在 2 条指令中执行。
对于较旧的 CPU,您可以使用 2 x movd
,然后punpckldq
总共使用 3 条指令:
movd xmm0, edx
movd xmm1, eax
punpckldq xmm0, xmm1
我对 MMX 了解不多,但也许你想要 PACKSSDW 指令。
PACKSSDW 指令获取源操作数中的两个双字和目标操作数中的两个双字,并通过饱和将它们转换为四个有符号字。该指令将这四个字打包在一起,并将结果存储在目标 MMX 寄存器中。
(来自http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html)
编辑:我刚刚意识到那些是 SSE 寄存器。那好吧。