我有一个函数的指令序列,后面跟着两条指令
Loop: .
.
.
.
SUB R20, R4, Rx
BNZ R20, Loop
BNZ、branch 不为零数据是否依赖于 SUB 指令?还是反依赖?
最佳答案
理论上,分支指令与修改分支将检查的寄存器的较早指令(本例中为 SUB
)之间存在数据依赖性跳转,但在许多现代架构上,由于分支预测,这种依赖关系不会传播到以下指令,这与其他数据依赖关系不同。
相反,我们说以下指令在跳转上具有控制依赖性,并且这种控制依赖性的行为与数据依赖性非常不同。
也就是说,在具有预测的架构上,数据依赖性不太可能真正导致分支在 SUB
之后生效 - 通常它会生效(即,跳转与否)在SUB
执行之前,并且只有当SUB
的结果可用时才会检查猜测,以及自分支以来的所有推测执行如果猜测不正确,将回滚。
因此,在某种程度上,当涉及到对其条件和目标的数据依赖性时,跳跃存在于灰色区域。从最严格的意义上来说,它们是依赖的,但是当预测起作用时(通常是这样),它们的行为就不会那样。这有点像 xor r1, r1, r1 或 foo32bits >> 32 存在的灰色区域:根据严格的定义,这些指令依赖于它们的输入,但在这些指令中特殊情况下,答案总是相同的 (0),并且某些 CPU 可能会识别这一点并且不应用通常的依赖规则。
关于assembly - 分支指令与数据相关吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116948/