为什么MIPS在计算分支目标地址时使用'PC+4'作为基地址?

Why does MIPS use 'PC+4' as base address when calculating branch target address?

如果观察MIPS 5-stage pipeline(1.Instruction Fetch - 2.Instruction Decode - 3.Execute - 4.Memory Access - 5.Writeback),是否是否分支最终在Execute阶段决定。

MIPS 5-stage pipeline

您可以在图像中看到 ALU 的上部输出被馈送到 MUX 以在正常 PC 步进和分支之间进行选择。

因此,当CPU决定是否分支时,对应指令的IF阶段已经经过了两个流水线阶段。假设 PC1 = PC when IF and PC2 = PC when decisions to branch.因此 PC2 = PC1+4。为了将 PC2 恢复为 PC1+4,需要额外的硬件。 (对于操作PC2-4

尽管有这个缺点,我想知道为什么 MIPS 处理器使用 PC+4 作为基地址而不是使用 PC+8原样。

如果你需要更多的硬件来获得 PC+8,否则它会使异常处理变得复杂-return 如果你认为你可以跳过流水线阶段并获得分支偏移量,那么处理和其他东西甚至更多适用于获取阶段地址的值。 (MIPS 分支延迟槽意味着 return 从异常中跳出需要一个 PC 和单独的下一个 PC,以防来自已采取分支的分支延迟槽出现故障。)

此外,如果获取停顿并且不推进 PC 怎么办?

在实际的经典 MIPS 中, so it makes sense that branches are relative to the instruction in the branch-delay slot not 2 instructions later; How to Calculate Jump Target Address and Branch Target Address?

此外,IF 阶段已经计算出 PC+4,因此它可以将该值与指令一起沿管道向下发送。如果可以避免,您不想要长电线;通过流水线阶段之间的锁存器发送 PC+4 值是有意义的。