延迟分支的设计空间是什么?
有两种可能的方法来扩展基本概念,例如增加延迟槽的倍数或在延迟槽中引入指令的取消。大多数体系结构只提供一个延迟槽。一些体系结构提供了多个延迟槽,例如 MIPS-X。
填充更多延迟槽的另一种可能性是引入取消(也称为无效或压缩)。基本思想是在使用延迟槽中引入选项,这允许填充比基本方案中更多的延迟槽。可以引入四种不同类型的取消。这四种变体通过在已取和未取路径中延迟槽是否被取消来区分。
变体如下:
无取消(带执行的分支)
如果分支未取,则取消延迟槽(分支或跳过)
如果分支已取,则取消延迟槽(带跳过的分支)
始终取消
第一个变体是指定的带执行的分支。它等效于基本延迟分支方案。分支或跳过方案允许在分支未取时取消延迟槽。它可以用于向后条件分支,将指令从循环体内部移动到延迟槽中。
带跳过的分支变体允许在分支已取时取消延迟槽。这对于向前条件分支很有用,可以将指令从顺序路径重新定位到延迟槽中。最后,始终取消方案允许引入可选的延迟分支。
具有取消功能的体系结构通常根据选择提供上述两种可能性,如表所示。值得注意的是,在 1980 年代后半期出现的多数主流 RISC 体系结构中,已以某种形式引入了取消以提高性能。例如,HP PA、SPARC 和 MC 88100 体系结构。
具有延迟分支的体系结构提供的可能的取消选项
带执行的分支 | 分支或跳过 | 带跳过的分支 | 始终取消 | 延迟槽的倍数 | ||
---|---|---|---|---|---|---|
延迟槽中指令的取消 | ||||||
IBM 801(1978) | X | X | 1 | |||
MIPS-X(1986) | X | X | 2 | |||
HP PA(1986) | X | X1 | X2 | 1 | ||
SPARC(1987) | X | X | 1 | |||
MC 88100(1988) | X | X | 1 | |||
i860(1988) | X | X | 1 |
- 向后分支
- 向前分支
大多数提供扩展延迟分支方案的体系结构除了基本方案(带执行的分支)之外,还提供了分支或跳过选项。这通常是通过为每个分支指令提供两种不同的形式来完成的,一种不带取消,另一种带某种类型的取消。
这些形式通常在汇编语言语法中通过不同的助记符(如 MIPS-X 中的 BNZ 和 BNZX)或可选后缀(如 MC 88100 系列中的 n)来区分。
它还提供了取消无条件分支延迟槽中指令的可能性,例如在 HP PA、SPARC 和 MC 88100 中。