10

有没有更快的方法将两个 x86 32 位寄存器存储在一个 128 位 xmm 寄存器中?

movd  xmm0, edx
movd  xmm1, eax
pshufd xmm0, xmm0, $1
por   xmm0, xmm1 

因此,如果 EAX 为0x12345678且 EDX 为0x87654321,则 xmm0 中的结果必须为0x8765432112345678

4

2 回答 2

16

使用 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
于 2010-02-09T19:31:08.877 回答
1

我对 MMX 了解不多,但也许你想要 PACKSSDW 指令。

PACKSSDW 指令获取源操作数中的两个双字和目标操作数中的两个双字,并通过饱和将它们转换为四个有符号字。该指令将这四个字打包在一起,并将结果存储在目标 MMX 寄存器中。

(来自http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html

编辑:我刚刚意识到那些是 SSE 寄存器。那好吧。

于 2010-02-09T19:21:51.247 回答