我正在查看 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
或将使用通常的预测逻辑吗?