2010-02-09 163 views
9

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

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

所以,如果EAX是0×12345678和EDX是0×87654321的结果在XMM0必须0x8765432112345678。

谢谢

+0

哇!这是一个很酷的汇编程序...最后我看到的是32位...不知道你可以买一个128位的PC ...:P :) – t0mm13b 2010-02-09 19:07:36

+0

流式SIMD扩展(SSE)是对x86架构的SIMD指令集扩展,由英特尔设计并于1999年推出。 – 2010-02-09 19:22:45

+3

直到SSE指令集版本允许为止? – PhiS 2010-02-09 21:11:08

回答

15

对于SSE 4.1,您可以使用movd xmm0, eax/pinsrd xmm0, edx, 1并按照2条说明操作。

对于较旧的CPU,可以使用2×movd,然后punpckldq共3个指令:

movd xmm0, edx 
movd xmm1, eax 
punpckldq xmm0, xmm1 
+0

谢谢。但这是自2007年以来相对较新的扩展集,速度和代码大小几乎相同。 – 2010-02-09 19:45:43

+2

确定 - 现在已经为SSE2/SSE3添加了3个指令序列。 – 2010-02-09 21:04:24

+1

超级...这就是我需要的!谢谢。 – 2010-02-09 21:47:13

1

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

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

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

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

编辑:我现在要闭嘴了。

+0

我喜欢xmm寄存器,而不是mmx(64位),因为它们在使用后不需要'emms'指令。 – 2010-02-09 19:50:20

+0

是的,也许更好的专用寄存器.. – 2010-02-10 01:39:25

+0

+1闭嘴现在:-) – hirschhornsalz 2011-12-14 16:44:56