Elo*_*off 4 x86 assembly x86-64 cpu-architecture micro-optimization
例如,这两条指令是否可以在同一周期内开始执行,还是相互干扰?
MOV %RAX, (ADDR) # AT&T syntax: store rax
POP %RAX
Run Code Online (Sandbox Code Playgroud)
是的,它们可以在现代无序CPU上以相同的周期执行,因为它们使用Tomasulo的算法进行寄存器重命名.它完全避免了所有这样的写后读取危险,以及写后写,因此乱序执行仅受Read-after-Write真正依赖性的限制.
寄存器重命名后,pop会将RAX架构寄存器的新值写入与保存旧值RAX(作为存储输入)的物理寄存器不同的物理寄存器.
这些指令彼此没有交互,因为它pop为RAX的值启动了一个新的依赖链.(它的输出是只写的.) 的pop(即读取和下面的说明/写RAX)可以在存储之前被执行许多次,特别是如果要存储的值由长依赖关系链产生.
另请参阅Agner Fog的microarch pdf以及x86标签wiki 中的其他链接.
更新:我以为你问的是两条指令写同一个寄存器或读同一个寄存器,因为你的原始示例代码没有%标记,并使用了AX,所以我认为它是16位Intel语法.无论如何,将此部分留作奖励.
读取相同寄存器(读后读)的两条指令甚至根本不存在危险.
Sandybridge之前的Intel CPU对可以在同一周期内读取的最近未修改的寄存器的数量有限制,但是在附近的指令中多次读取相同的寄存器不是问题.(在Agner Fog的microarch pdf中搜索寄存器读取端口档位,和/或在相关的位置查看此答案).