有没有更快的方法将两个x86 32位寄存器存储在一个128位xmm寄存器中?
movd xmm0, edx
movd xmm1, eax
pshufd xmm0, xmm0, $1
por xmm0, xmm1
如果EAX是0x12345678
,EDX是0x87654321
,那么xmm0中的结果必须为0x8765432112345678
。
有没有更快的方法将两个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
在两条指令中完成操作。
对于旧的 CPU,您可以使用 2 个 movd
然后使用 punpckldq
总共需要 3 条指令:
movd xmm0, edx
movd xmm1, eax
punpckldq xmm0, xmm1
movd
。编写pinsrd x,r, 0
的唯一原因是当您真正想要合并旧值而不是零扩展到整个寄存器以打破对旧值的依赖关系时。 pinsrd
在Intel CPU上解码为2个uop:int->xmm和shuffle,因此它更紧凑,不需要一个临时寄存器,但在大多数CPU上基本上与SSE2版本运行相同。 - Peter Cordesmovd
。 (在提取中更常见,其中_mm_extract_epi32(v,0)
编译为movd
。 pinsrd内部函数需要一个额外的源向量,希望大多数人意识到他们不应该使用它。) - Peter Cordes我对MMX不是很了解,但也许你想要PACKSSDW指令。
PACKSSDW指令将源操作数中的两个双字和目标操作数中的两个双字转换为四个带饱和度的有符号字。该指令将这四个字打包在一起,并将结果存储在目标MMX寄存器中。
(来自http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html)
编辑:我刚意识到那些是SSE寄存器。哦,算了。