0

我正在查看 Visual Studio 中某些程序的反汇编,并查看以下内容:

001B1015  cmp         ebx, edx  
001B1017  jae         wmain+19h (001B1019h)  
001B1019  pop         esi

这段代码只是愚蠢的。如果jae导致条件跳转控制传递到完全相同的指令,否则它将失败。

问题是 CPU 中的分支预测将如何处理它。CPU 会预测它应该“跳跃”还是“跌倒”。直到他们收集了一些关于之前执行代码的统计数据,英特尔 x86 处理器预测条件跳转为“不会完成”。所以这jae将被预测为“不会发生,失败”并且CPU将选择“失败”路径。

如果发生错误预测(结果是错误地选择了“失败”路径),CPU 应该正式重置管道并运行“分支”路径。

这里的诀窍是“失败”和“分支”有效地做同样的事情并且等同于nop.

我从未在任何有关分支的文档中看到过这种情况的分析。

流行的 CPU 通常可以将其jae视为nop或将使用通常的预测逻辑吗?

4

0 回答 0