【问题标题】:How do you move 128-bit values between XMM registers?如何在 XMM 寄存器之间移动 128 位值?
【发布时间】:2012-01-30 01:59:02
【问题描述】:

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

movdq xmm3, xmm0

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

【问题讨论】:

    标签: assembly simd sse


    【解决方案1】:

    movapdmovapsmovdqa

    movaps xmm3, xmm0
    

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

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

    根据您的数据类型使用适当的一种以避免域更改停滞。

    另外,没有理由使用movapd。始终使用movaps 代替,因为movapd 需要一个额外的字节来编码。

    【讨论】:

    • movdqa 是我正在寻找的 :) 谢谢。那很快:) PS。浮点移动实际上与整数移动有何不同?对我来说,两者都应该是简单的复制......
    • 在 Intel 处理器上,有单独的 FP 和整数单元。当您执行以一个单元为单位的指令时,该值将移动到该单元。但是,当您在与该值不同的域中发出指令时,必须将其移动到新单元 - 有 1-2 个周期的惩罚。因此,如果可能,最好在域中保留一个值 - 因此会有不同的 mov 指令。如果您在进行整数运算并使用movaps,则将值移动到 FP 单元会受到惩罚,并且在下一个整数指令发出给它时将其移回另一个惩罚。
    • 同样适用于逻辑运算符:如:pororpsorpd
    猜你喜欢
    • 2011-10-03
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多