处理器通常带有jmp指令,以从不同的固定位置继续,并可能取决于某些条件。因此,出度最多为二。
是否存在具有单个指令的处理器,可以分支到三个或更多个固定位置之一?
处理器通常带有jmp指令,以从不同的固定位置继续,并可能取决于某些条件。因此,出度最多为二。
是否存在具有单个指令的处理器,可以分支到三个或更多个固定位置之一?
有很多理由可以假设或猜测不行,但我对足够的指令集架构不熟悉,无法给出明确的否定。特别是如果我们包括50年代和60年代的历史早期计算机;它们与现代系统相比通常有非常奇怪的东西。
通常,如果你需要除了taken vs. fall-through之外的任何其他内容,你只需使用间接分支(寄存器或内存中的目标地址,或者使用ARM tbb
从压缩表中查找)即可,因此在一个有两个非fallthrough目标的古怪直接分支指令上花费一个操作码的好处非常少。
此外,您需要在指令编码中为2个单独的目标留出空间,或者使用一些特殊规则,例如fall-through、PC + offset、PC + offset*2(即向前或向后跳两倍远)。使用它需要按特定偏移量布置具有目标的代码。有时你会制作固定大小的指令块表,并计算其偏移量(而不是从地址表中查找地址),但是有一个强制你这样做的指令似乎不太可能。
这个条件本身可以是一个三路条件:一个寄存器为- / 0 / +,或者FLAGS小于、等于或大于。也可能是其他情况。但是,如果存在某些条件的组合使其在某些ISA上有意义,我也不会感到惊讶。也许如果在某个特殊寄存器中有一个特殊情况处理程序地址,并且正常情况涉及到taken或fall-through?
但是,如果我们允许一个目标地址来自寄存器或其他内部状态,任何可能故障的分支都将被计入。考虑一种假想的ISA,其中具有比较和分支存储器,例如带有宏粘合的Intel cmp [rdi],eax
/ jne rel32
,这将解码为单个内部uop。
那么可能的目标是:
tbb
只是一个表查找 + 间接分支。我本来想包含一个链接的,现在已经加上了。你是否包括错误处理程序?这是许多指令的一种隐式第三目的地。但是分支预测仍然会假设事情不会出错,因为通常很少发生。你要优化快速情况。 - Peter Cordes