Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 将两个x86 32位寄存器存储到128位xmm寄存器中_Assembly_X86_Simd_Sse - Fatal编程技术网

Assembly 将两个x86 32位寄存器存储到128位xmm寄存器中

Assembly 将两个x86 32位寄存器存储到128位xmm寄存器中,assembly,x86,simd,sse,Assembly,X86,Simd,Sse,有没有更快的方法将两个x86 32位寄存器存储在一个128位xmm寄存器中 movd xmm0, edx movd xmm1, eax pshufd xmm0, xmm0, $1 por xmm0, xmm1 因此,如果EAX为0x12345678,EDX为0x87654321,则xmm0中的结果必须为0x8765432112345678 谢谢我对MMX了解不多,但也许您需要PACKSSDW说明 PACKSSDW指令接受两个 源操作数中的双字和 表中的两个双字 目标操

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

  movd  xmm0, edx
  movd  xmm1, eax
  pshufd xmm0, xmm0, $1
  por   xmm0, xmm1 
因此,如果EAX为0x12345678,EDX为0x87654321,则xmm0中的结果必须为0x8765432112345678


谢谢

我对MMX了解不多,但也许您需要PACKSSDW说明

PACKSSDW指令接受两个 源操作数中的双字和 表中的两个双字 目标操作数并转换这些值 通过饱和转换为四个有符号字。 指令包含这四个单词 并将结果存储在 目标MMX寄存器

(来自)

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


编辑:我现在就要闭嘴了。

对于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

哇!这是一个很酷的汇编程序…我最后看的是32位的…不知道你可以买一台128位的电脑P:)数据流单指令多数据扩展指令集(SSE)是一种针对x86体系结构的单指令多数据指令集扩展,由Intel设计,于1999年推出。SSE指令集版本允许达到哪种版本?@PhiS尽可能低。:)六羟甲基三聚氰胺六甲醚。。。至少5年前,SSE2还不错。谢谢。但这是相对较新的扩展集,自2007年以来,速度和代码大小几乎相同。好的-现在为SSE2/SSE3添加了一个3指令序列。超级。。。这就是我需要的!谢谢。对于SSE4.1,第一条指令仍然应该是
movd
。写入
pinsrd x,r,0
的唯一原因是,您确实希望与旧值合并,而不是将零扩展到整个寄存器以打破对旧值的依赖
pinsrd
在英特尔CPU上解码为2个UOP:int->xmm和shuffle,因此它更紧凑,不需要临时寄存器,但在大多数CPU上基本上与SSE2版本运行相同。使用intrinsic时不必担心这一点,因为编译器知道尽可能使用
movd
。(更多的时候会用到extract,其中
\u mm\u extract\u epi32(v,0)
编译成
movd
。pinsrd内部需要一个额外的源向量,希望这能让大多数人意识到他们不应该使用它。)我喜欢xmm寄存器而不是mmx(64位),因为使用后它们不需要“emms”指令。