是否有更快的方法将两个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。
谢谢
是否有更快的方法将两个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。
谢谢
对于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
谢谢。但这是自2007年以来相对较新的扩展集,速度和代码大小几乎相同。 – 2010-02-09 19:45:43
确定 - 现在已经为SSE2/SSE3添加了3个指令序列。 – 2010-02-09 21:04:24
超级...这就是我需要的!谢谢。 – 2010-02-09 21:47:13
我不太了解MMX,但也许你想要PACKSSDW指令。
的PACKSSDW指令取入源操作数和两个 双字 两个双字在 目的地操作数,并通过转换饱和这些 四个符号字。 指令将这四个字 打包在一起并将结果存储在目标MMX寄存器的 中。
(从http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html)
编辑:我刚刚意识到这些是SSE寄存器。好吧。
编辑:我现在要闭嘴了。
我喜欢xmm寄存器,而不是mmx(64位),因为它们在使用后不需要'emms'指令。 – 2010-02-09 19:50:20
是的,也许更好的专用寄存器.. – 2010-02-10 01:39:25
+1闭嘴现在:-) – hirschhornsalz 2011-12-14 16:44:56
哇!这是一个很酷的汇编程序...最后我看到的是32位...不知道你可以买一个128位的PC ...:P :) – t0mm13b 2010-02-09 19:07:36
流式SIMD扩展(SSE)是对x86架构的SIMD指令集扩展,由英特尔设计并于1999年推出。 – 2010-02-09 19:22:45
直到SSE指令集版本允许为止? – PhiS 2010-02-09 21:11:08