addiu $6,$6,5
bltz $6,$L5
nop
...
$L5:
Run Code Online (Sandbox Code Playgroud)
除了缓存未命中,经典 MIPS 甚至无法做到这一点,而不会出现停顿,这如何安全?(MIPS 最初代表没有互锁流水线级的微处理器,并且有一个加载延迟槽而不是互锁。)
原始 MIPS I 是经典的 5 阶段 RISCIF ID EX MEM WB设计,通过在 ID 阶段及早检查分支条件,通过单个分支延迟槽隐藏其所有分支延迟(更正:这是错误,请阅读此答案;不要不要被基于这个错误前提的问题中的其他细节所误导)。这就是为什么它仅限于等于/不等于或符号位检查(如 lt 或 ge 零),而不是两个需要通过加法器进行进位传播的寄存器之间的 lt。
这是否意味着分支需要比 ALU 指令早一个周期准备好输入? 的bltz进入,所述同一周期ID阶段addiu进入EX。
MIPS I(又名 R2000)使用从 EX 输出到 EX 输入的旁路转发,因此普通整数 ALU 指令(如addu/链xor)具有单周期延迟并且可以在连续周期中运行。
MIPS 代表“没有互锁流水线阶段的微处理器”,因此它不检测 RAW 危害;代码必须避免它们。(因此,第一代 MIPS 上的加载延迟插槽,在这种情况下,MIPS II 添加了互锁以停止,使首字母缩略词:P 无效)。
但是我从来没有看到任何关于计算分支条件多条指令以避免停顿的讨论。(addiu/bltz 示例是由 MIPS gcc5.4-O3 -march=mips1 在Godbolt上发出的,它确实尊重加载延迟槽,nop …