【发布时间】:2019-11-26 05:23:24
【问题描述】:
我目前正在阅读 David A Patterson 和 John L. Hennessy 的教科书计算机组织和架构。
MIPS架构中的非延迟分支指令是什么意思?
【问题讨论】:
标签: mips cpu-architecture
我目前正在阅读 David A Patterson 和 John L. Hennessy 的教科书计算机组织和架构。
MIPS架构中的非延迟分支指令是什么意思?
【问题讨论】:
标签: mips cpu-architecture
没有分支延迟槽的分支指令。
在这种情况下,分支之后的指令不在分支目标处的第一条指令之前执行。 (与采用 的传统 MIPS 分支不同,它在没有分支预测或推测执行的情况下隐藏分支延迟。强制编译器将一些希望有用的东西静态调度到该插槽中)
MIPS introduced these in 2014, in MIPS32r6 / MIPS64r6 根据维基百科:
一个没有延迟槽的新分支系列:
- 具有 26 位偏移量的无条件分支 (BC) 和分支链接 (BALC),
- 具有 21 位偏移量的零/非零条件分支,
- 全套有符号和无符号条件分支在两个寄存器(例如 BGTUC)或一个寄存器与零(例如 BGTZC)之间进行比较,
- 将寄存器与零进行比较的全套分支和链接(例如 BGTZALC)。
还有一个无延迟槽的索引跳转指令,旨在支持大的绝对地址。
注意添加到先前分支助记符的C 后缀。
还请注意,例如BGTUC reg, reg, target 是一个新事物。原始 MIPS kept branch conditions simple so they could be evaluated in only half a cycle,因此只需要 1 个分支延迟槽即可完全隐藏分支延迟。
这种微架构原因在现代微架构中早已不复存在,可以进行分支预测,因此添加真正的硬件分支指令(而不是像经典的 bgtu reg, reg, target 这样的伪指令)可以将 slt 保存到寄存器中。
没有分支延迟槽在微架构上与 eq 和 ne 之外的新 2 寄存器条件无关。添加它们是因为 MIPS32/64 r6 正在重新组织操作码无论如何,而不是因为删除分支延迟槽使它们成为可能。
【讨论】: