如果同一个寄存器分别用作输入和输出,那么两个指令可以在同一个周期内执行吗?

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)

Pet*_*des 9

是的,它们可以在现代无序CPU上以相同的周期执行,因为它们使用Tomasulo的算法进行寄存器重命名.它完全避免了所有这样的写后读取危险,以及写后写,因此乱序执行仅受Read-after-Write真正依赖性的限制.

寄存器重命名后,pop会将RAX架构寄存器的新值写入与保存旧值RAX(作为存储输入)的物理寄存器不同的物理寄存器.

这些指令彼此没有交互,因为它pop为RAX的值启动了一个新的依赖链.(它的输出是只写的.) pop(即读取和下面的说明/写RAX)可以在存储之前被执行许多次,特别是如果要存储的值由长依赖关系链产生.

另请参阅Agner Fog的microarch pdf以及标签wiki 中的其他链接.


更新:我以为你问的是两条指令写同一个寄存器或读同一个寄存器,因为你的原始示例代码没有%标记,并使用了AX,所以我认为它是16位Intel语法.无论如何,将此部分留作奖励.

读取相同寄存器(读后读)的两条指令甚至根本不存在危险.

Sandybridge之前的Intel CPU对可以在同一周期内读取的最近未修改的寄存器的数量有限制,但是在附近的指令中多次读取相同的寄存器不是问题.(在Agner Fog的microarch pdf中搜索寄存器读取端口档位,和/或在相关的位置查看此答案).