分支指令数据依赖吗?
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, r1
或 foo32bits >> 32
存在的灰色区域:根据严格的定义,这些指令取决于它们的输入,但在这些特殊情况下,答案总是相同的 (0)并且某些 CPU 可能会识别这一点并且不会应用通常的依赖性规则。
我有一个函数指令序列,后面跟着两个指令
Loop: .
.
.
.
SUB R20, R4, Rx
BNZ R20, Loop
BNZ、分支非零数据是否依赖于SUB指令?还是反依赖?
是的,指令之间存在数据相关性。分支指令分解为比较和跳转。比较将由 ALU 进行评估,然后相应地更新 PC。该比较操作的输入与任何其他操作的依赖方式相同。
理论上,分支指令和修改寄存器的较早指令(在本例中为SUB
)之间存在数据依赖关系examine 跳转,但在许多现代架构中,由于分支预测,这种依赖性 不会传播 到以下指令,这与其他数据依赖性不同。
相反,我们说以下指令对跳转具有 控制依赖性 ,并且这种控制依赖性的行为与数据依赖性非常不同。
也就是说,在具有预测的架构上,数据依赖不太可能真正导致分支在 SUB
之后 生效 - 通常它会生效(即是否跳转)在执行 SUB
之前,只有在 SUB
的结果可用时才会检查猜测,并且将回滚分支后的所有推测执行如果猜错了。
因此,当涉及数据对条件和目标的依赖性时,跳跃存在于灰色区域。从最严格的意义上讲,它们是依赖的,但是当预测起作用时(通常是这样),它们的行为就不会那样。这有点像 xor r1, r1, r1
或 foo32bits >> 32
存在的灰色区域:根据严格的定义,这些指令取决于它们的输入,但在这些特殊情况下,答案总是相同的 (0)并且某些 CPU 可能会识别这一点并且不会应用通常的依赖性规则。