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