为什么 MIPS 使用一个延迟槽而不是两个?

Why does MIPS use one delay slot instead of two?

这似乎是许多 RISC 架构的情况。既然填充一个延迟槽可以为我们节省 50% 的浪费周期,为什么不给程序员一个机会来使用两个槽呢?

在 MIPS R2000 上,ISA 围绕经典 MIPS I 设计,1 个分支延迟槽 足以隐藏分支延迟: 。 能够以低延迟(半个时钟周期)检查分支条件是 MIPS 条件分支限制为 eq/ne and/or 检查符号位 x<0 的原因,不是任意的 x<y.

上,Paul Clayton 回答说是的,在 asm 中填充分支延迟槽会使分支预测在早期的 MIPS 上无用。所以这是真正的商业 MIPS R2000 以这种方式工作的更多证据。如果你延长管道,你只需要分支预测,就像他们为下一代 MIPS R4000 所做的那样。然后你有分支预测,而不是期望编译器静态地填充分支延迟。


但无论如何,一个分支延迟槽足以让编译器可靠地填充,事后看来,这是未来使用分支预测而不是依赖于延迟的实现的包袱隐藏分支延迟的插槽。特别是超标量实现。

如果未来的 CPU 想要二进制兼容,那么让它成为架构负担。因此,即使早期的 MIPS CPU 确实有 2 个周期的分支延迟,一些先见之明和 cost/benefit 考虑使得仅在架构上暴露 1 个周期是非常合理的。