我正在检查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
还是会使用常用的预测逻辑?