assembly - 分支指令与数据相关吗?

标签 assembly pipeline cpu-architecture

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

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/

相关文章:

c++ - 相当于 DirectX 渲染状态的 OpenGL

algorithm - Tomasulo 算法 + MIPS 5 级流水线 + 分支预测

.net - 如何查看 JIT 生成的代码

c++ - 使用交换方法在程序集中反转外部数组 - x86 MASM

bash - 在 shell (bash) 中如何在管道中执行多个命令?

jenkins - 在 Jenkins 管道的各个阶段之间传输数据

c++ - 使用 C++11 和 RDRAND 的真随机数

algorithm - 在没有PWM的AVR组件中生成方波

assembly - 分支预测会使我的程序崩溃吗?

linux - arm "versions?"之间的差异(仅限 ARMv7)