如何在XMM寄存器之间移动128位值?

lam*_*pak 7 assembly sse simd

汇编中看似微不足道的问题:我想将整个XMM0寄存器复制到XMM3.我试过了

movdq xmm3, xmm0
Run Code Online (Sandbox Code Playgroud)

但MOVDQ不能用于在两个XMM寄存器之间移动值.我该怎么做呢?

Mys*_*ial 11

movapd,movapsmovdqa

movaps xmm3, xmm0
Run Code Online (Sandbox Code Playgroud)

他们都做同样的事情,但有一个问题:

  • movapdmovaps在浮点域中运行.
  • movdqa 在整数域中运行

根据您的数据类型使用适当的一个,以避免域更改停顿.

此外,没有理由使用movapd.总是使用,movaps因为movapd需要额外的字节进行编码.

  • 在Intel处理器上,有单独的FP和整数单元.当您执行一个单元中的指令时,该值将移动到该单元.但是当您在不同的域中向该值发出指令时,必须将其移动到新单元 - 1-2周期惩罚.因此,如果可能的话,最好在域中保留一个值 - 这就是为什么有不同的`mov`指令.如果你正在进行整数运算并且你使用`movaps`,你将支付一定的代价来将值移动到FP单位,并将另一个惩罚移回给发给它的下一个整数指令. (4认同)
  • movdqa是我在寻找的东西:)谢谢.那很快:) PS.浮点移动实际上与整数移动有何不同?对我来说,两者都应该简单复制...... (2认同)