gpt4 book ai didi

assembly - 为什么将 32 位寄存器移动到堆栈然后从堆栈移动到 xmm 寄存器?

转载 作者:行者123 更新时间:2023-12-04 05:49:45 25 4
gpt4 key购买 nike

我正在编译 gcc -m32在 64 位机器上。

以下有什么区别?请注意,这是 AT&T 语法。

# this
movd %edx, %xmm0

# and this
movl %edx, (%esp)
movd (%esp), %xmm0

最佳答案

机器状态的唯一区别是第二个版本在 stack1 上留下了一个副本。
由于某种原因,GCC 的默认调整会在内存中反弹。 (最近的 GCC 可能已经在某些情况下修复了这个问题)。大多数情况下,包括 AMD 在内的大多数 CPU 上的情况通常更糟,尽管 AMD 的优化手册确实推荐了它。查看 GCC 错误 8082080833回复:GCC 的整数 <-> xmm 策略一般。
使用 movd与存储和加载 uop 相比,将花费 1 ALU uop,因此前端的 uops 较少,但后端的 uops 不同,因此根据周围的代码,存储/重新加载策略可以减轻特定执行的压力港口。
ALU 的延迟更好 movd与在所有 CPU 上存储/重新加载相比,因此存储/重新加载的唯一优势是可能的吞吐量。
Agner Fog says在他的推土机(最慢的 CPU movd %edx, %xmm0)的 microarch pdf 中:

The transport delays between the integer unit and the floatingpoint/vector unit are much longer in my measurements than specified inAMD's Software Optimization Guide. Nevertheless, I cannot confirm thatit is faster to move data from a general purpose register to a vectorregister through a memory intermediate, as recommended in that guide.



脚注 1:如果您真的想要那样,单独的商店通常仍然是实现该状态的更好选择。相同的 uops 数和更低的延迟(尤其是在 Intel CPU 上。AMD Bulldozer/Steamroller 的 movd (x)mm, r32/r64 有 10/5 个周期的延迟。Intel 上的 1 个周期。)
movd %edx, %xmm0         # ALU int -> xmm transfer
movl %edx, (%esp) # and store a copy if you want it

关于assembly - 为什么将 32 位寄存器移动到堆栈然后从堆栈移动到 xmm 寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29701860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com