实现条件跳转时如何在流水线中查找指令

How to find an instruction in a pipe line in while implementing conditional jump

我在准备考试时遇到了一个问题。问题是

在回答以下关于在 class 中提出的 5 阶段流水线中条件跳转的实现问题时,请考虑以下 y86 代码片段,阶段 F, D、E、M、WB。

1: irmovq , %rsi
2: irmovq , %r9
3: jmp label1
4: label2: addq %rsi, %r10
5: label1: subq %r9, %rsi
6: jne label2
7: andq %rbx, %rdx
8: irmovq , %r10
9: halt

一个。当jne指令完成F阶段后,下一条指令的地址在处理器中是否可用?圈一个

                     YES                 NO

b。如果处理器假定条件跳转为TAKEN,那么当jne指令完成F阶段时,下一条指令的地址在哪个流水线内部寄存器(变量)中?圈一个 icode ifun rA rB valC valP valM valE

c。如果处理器假定条件跳转为NOT TAKEN,那么当jne指令完成F阶段时,下一条指令的地址在哪个流水线内部寄存器(变量)中?圈一个

            icode  ifun  rA  rB  valC  valP  valM  valE

d。在哪个阶段之后流水线会知道是否应该进行条件跳转?圈出正确的阶段

                      F D E M WB

我有答案不解释答案如下:

1) 是

2) valC

3) valP

4) E

有人能解释一下这个过程吗?我要考试了,我真的需要帮助.

After which stage will the pipeline know whether the conditional jump should be taken or not? Circle the correct stage

一些有序流水线 CPUs 可能会在解码阶段处理分支 taken/not-taken,使其在流水线中只有 1 个周期的气泡。 (更新:我以前认为经典 MIPS 可以做到这一点,但实际上它实现了 1 个周期的分支延迟, evaluating the branch condition in the first half-cycle of EXEC, still letting it fully hide the control dependency / hazard: https://en.wikipedia.org/wiki/Classic_RISC_pipeline#Control_hazards)。

在分支到达执行之前停止或推测的设计也是可行的,但性能较低。

所以这个问题似乎无法回答,除非您对 y86 经典 5 级流水线的设计方式有其他线索。

在解码中解决分支方向需要标志更快准备好,因此 cmp 或 sub 后跟 jcc 总是会导致数据依赖性停顿。检查标志甚至比检查寄存器 解码需要检查哪个寄存器并从寄存器文件中读取它更容易。 (MIPS 没有标志;它有像 beq $t1, $t2, target 这样的指令在相等时分支(这可以用比减法更少的延迟完成),或 bltz $t1, target 检查一个 reg 的符号位。

在你刚刚计算的东西上分支时,这往往会导致额外的停顿,这就是为什么 MIPS 我没有那样做:

我不确定是否有真正的 CPU 在解码过程中决定了分支方向;这似乎有问题,可能只是我在某个时候对 MIPS I 产生的误解。但至少理论上是可以的。