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

GJ.*_*GJ. 9 x86 assembly sse simd

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

  movd  xmm0, edx
  movd  xmm1, eax
  pshufd xmm0, xmm0, $1
  por   xmm0, xmm1 
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Pau*_*l R 15

使用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
Run Code Online (Sandbox Code Playgroud)

  • 好的 - 现在为SSE2/SSE3添加了3个指令序列. (2认同)
  • 对于内在函数,您不必担心这个问题,因为编译器知道尽可能使用“movd”。(更频繁地出现在 extract 中,其中 `_mm_extract_epi32(v, 0)` 编译为 `movd`。pinsrd 内在函数需要一个额外的源向量,这希望能让大多数人意识到他们不应该使用它。) (2认同)