我正在64位计算机上使用gcc -m32进行编译。

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

# this
movd  %edx, %xmm0

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

最佳答案

机器状态的唯一区别是第二个版本在stack1上保留了一个副本。
由于某些原因,GCC的默认调整会通过内存反弹。 (最近的海湾合作委员会在某些情况下可能已解决此问题)。尽管大多数情况下,AMD的优化手册都建议这样做,但大多数情况下,大多数情况下,包括AMD在内,大多数情况下情况会更糟。请参阅GCC错误8082080833:一般而言,GCC的整数 xmm策略。
与存储和加载uop相比,使用movd会花费1 ALU uop,因此前端的uops较少,而后端的uops不同,因此,根据周围的代码,存储/重载策略可以减轻对ALU的负担。特定的执行端口。
在所有CPU上,ALU movd的延迟要比存储/重新加载的延迟更好,因此存储/重新加载的唯一优势是可能的吞吐量。
微型推土机pdf中的Agner Fog says(用于Bulldozer)(movd %edx, %xmm0最慢的CPU):


脚注1:如果您确实希望这样做,通常仍然可以选择单独的商店来实现该状态。相同的uops数和更低的延迟(特别是在Intel CPU上。AMDBulldozer/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

08-16 02:40