不同类型的分支

Tho*_*mas 1 cpu x86 assembly processor

所以我对分支的理解是有两种类型:

双向分支,根据存储在寄存器中的某些计算的结果进行分支。昂贵并导致管道冲洗。

单向分支,这就像一个函数指针或一个 goto,它将转到常量地址。如果我弄错了,请纠正我,但我认为这比两个分支便宜得多,因为现代处理器将在管道的早期解决这些指令。

我想象如果存在第三种类型的分支,循环展开会更快。通常,循环展开会增加指令大小,但会避免双向分支。如果您有一个分支,它同时支持指令大小和两个分支,该怎么办。就像一个分支,它会循环一段代码恒定的次数。

存在哪些类型的分支?

EOF*_*EOF 5

跳转(或调用)可以是:

- 直接或间接 -
相对或绝对 -
有条件或无条件

条件/无条件描述分支是否为谓词。

相对/绝对是将分支目标编码为当前指令指针的偏移量或分支目标的绝对地址的问题。

如果分支是absolute,则目标地址可以存储为变量,因为它可以在代码中的任何位置使用(理想情况下)。这意味着您可以加载此变量并对其执行间接分支

分支的这些属性几乎是正交的。常见的组合有:

-直接相对条件。你的标准if
-直接相对无条件。您的标准goto和函数调用。
-直接绝对无条件。一些函数调用。
-直接绝对条件。很少有硬件架构可以编码这样的指令。
- 间接绝对无条件。函数指针。这通常是最昂贵的分支类型。

其他组合往往难以编码。

例如far branches,可能会有一些进一步的并发症,但这应该是一个好的开始。