6

我想知道如何用 C、C++ 或汇编语言为 x64 处理器编写高效的跳转表。输入是预先知道的,但无法通过算法进行预测。假设我可以在输入流中尽可能地向前看,有什么方法可以动态地告诉 CPU 下一个分支要去哪个地址?

本质上,我想以编程方式更新分支目标缓冲区。但是,如果程序员通过查看数据提前知道下一个分支的去向,但处理器无法从过去的模式中确定这一点,我会接受任何允许我避免刷新管道的方法。

意识到这是一个非常具体的问题,我可能无法正确传达它,这里有一些替代措辞:

Cell 处理器上是否有与hbrHint for Branch 等效的 x64?

它是否有助于在cmp条件分支之前移动程序集,就像在 Itanium 中所做的那样?

间接跳转的预测目标是否基于寄存器值而不是最后使用的地址?

谢谢!

4

1 回答 1

2

如果您无法找到确切的答案,那么您也许可以使用返回地址预测器而不是分支目标缓冲区。通用技术称为上下文线程,可在论文Context Threading: A Flexible and Efficient Dispatch Technique for Virtual Machine Interpreters中找到描述。

对您的想法是:如果您可以展望未来,对于确定控制流更改的每个输入,您将 JIT 编译/发出单个直接call指令到某些可执行内存中。例如,如果您有 10 个输入单位,您将发出 10 个调用。

执行时,这段代码会表现得很好,因为每个被调用函数的返回地址都不会改变,并且所有调用都是直接的。

附带说明一下,我不是 CPU 架构人员,所以我可能会简化一些事情,但原则上我认为这应该可行。

于 2013-04-27T00:50:02.400 回答