不同类型的分支机构
Different types of branches
所以我对分支的理解是有两种类型:
双向分支,一个分支是根据存储在寄存器中的某个计算的结果进行的。昂贵并导致管道冲洗。
单向分支,这就像函数指针或goto,它将转到常量地址。如果我弄错了,请纠正我,但我认为这比两个分支便宜得多,因为现代处理器会在管道的早期解析这些指令。
我想象如果存在第三种类型的分支,循环展开会更快。通常,循环展开会增加指令大小,但会避免双向分支。如果您有一个既避免了指令大小又避免了两个分支的分支怎么办?就像一个分支,它在一段代码上循环一定次数。
存在什么类型的分支?
跳转(或调用)可以是:
-直接或间接
-相对或绝对
-有条件或无条件
Conditional/unconditional 描述分支是否谓词。
Relative/absolute 是编码 分支目标 的问题,或者作为 的偏移量当前指令指针或作为分支目标的绝对地址。
如果分支是 absolute,目标地址可以存储为变量,因为它可以在代码的任何地方使用(理想情况下)。这意味着您可以加载此变量并对其执行间接分支。
分支的这些属性几乎是正交的。常见的组合是:
-直接相对条件。你的标准if
.
-直接相对无条件。您的标准 goto
和函数调用。
-直接绝对无条件。一些函数调用。
-直接绝对条件。很少见,没有多少硬件架构可以编码这样的指令。
-间接绝对无条件。函数指针。这通常是最昂贵的分支类型。
其他组合往往难以编码。
可能会有一些更复杂的情况,例如 far branches
,但这应该是一个好的开始。
所以我对分支的理解是有两种类型:
双向分支,一个分支是根据存储在寄存器中的某个计算的结果进行的。昂贵并导致管道冲洗。
单向分支,这就像函数指针或goto,它将转到常量地址。如果我弄错了,请纠正我,但我认为这比两个分支便宜得多,因为现代处理器会在管道的早期解析这些指令。
我想象如果存在第三种类型的分支,循环展开会更快。通常,循环展开会增加指令大小,但会避免双向分支。如果您有一个既避免了指令大小又避免了两个分支的分支怎么办?就像一个分支,它在一段代码上循环一定次数。
存在什么类型的分支?
跳转(或调用)可以是:
-直接或间接
-相对或绝对
-有条件或无条件
Conditional/unconditional 描述分支是否谓词。
Relative/absolute 是编码 分支目标 的问题,或者作为 的偏移量当前指令指针或作为分支目标的绝对地址。
如果分支是 absolute,目标地址可以存储为变量,因为它可以在代码的任何地方使用(理想情况下)。这意味着您可以加载此变量并对其执行间接分支。
分支的这些属性几乎是正交的。常见的组合是:
-直接相对条件。你的标准if
.
-直接相对无条件。您的标准 goto
和函数调用。
-直接绝对无条件。一些函数调用。
-直接绝对条件。很少见,没有多少硬件架构可以编码这样的指令。
-间接绝对无条件。函数指针。这通常是最昂贵的分支类型。
其他组合往往难以编码。
可能会有一些更复杂的情况,例如 far branches
,但这应该是一个好的开始。