分支指令数据依赖吗?

is the branch instruction data dependent?

我有一个函数指令序列,后面跟着两个指令

Loop: .
      .
      .
      .
SUB R20, R4, Rx
BNZ R20, Loop

BNZ、分支非零数据是否依赖于SUB指令?还是反依赖?

是的,指令之间存在数据相关性。分支指令分解为比较和跳转。比较将由 ALU 进行评估,然后相应地更新 PC。该比较操作的输入与任何其他操作的依赖方式相同。

理论上,分支指令和修改寄存器的较早指令(在本例中为SUB)之间存在数据依赖关系examine 跳转,但在许多现代架构中,由于分支预测,这种依赖性 不会传播 到以下指令,这与其他数据依赖性不同。

相反,我们说以下指令对跳转具有 控制依赖性 ,并且这种控制依赖性的行为与数据依赖性非常不同。

也就是说,在具有预测的架构上,数据依赖不太可能真正导致分支在 SUB 之后 生效 - 通常它会生效(即是否跳转)在执行 SUB 之前,只有在 SUB 的结果可用时才会检查猜测,并且将回滚分支后的所有推测执行如果猜错了。

因此,当涉及数据对条件和目标的依赖性时,跳跃存在于灰色区域。从最严格的意义上讲,它们是依赖的,但是当预测起作用时(通常是这样),它们的行为就不会那样。这有点像 xor r1, r1, r1foo32bits >> 32 存在的灰色区域:根据严格的定义,这些指令取决于它们的输入,但在这些特殊情况下,答案总是相同的 (0)并且某些 CPU 可能会识别这一点并且不会应用通常的依赖性规则。