具有超过两个分支目标的指令的CPU

3

处理器通常带有jmp指令,以从不同的固定位置继续,并可能取决于某些条件。因此,出度最多为二。

是否存在具有单个指令的处理器,可以分支到三个或更多个固定位置之一?

1个回答

3

有很多理由可以假设或猜测不行,但我对足够的指令集架构不熟悉,无法给出明确的否定。特别是如果我们包括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。

那么可能的目标是:

  • fall-through to RIP
  • taken to RIP+rel32
  • #PF fault to the page-fault handler address (loaded from memory on x86-64).

是的,这样的设计选择可能没有太大的好处,但也许有一些晦涩的架构(有相当多的)。我还没有听说过tbb,但似乎目标位置不是固定的。 - The Techel
@TheTechel:是的,ARM tbb 只是一个表查找 + 间接分支。我本来想包含一个链接的,现在已经加上了。你是否包括错误处理程序?这是许多指令的一种隐式第三目的地。但是分支预测仍然会假设事情不会出错,因为通常很少发生。你要优化快速情况。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接