Assembly 是众所周知的流行处理器;“优化远离”;分支到下一条指令的指令?

Assembly 是众所周知的流行处理器;“优化远离”;分支到下一条指令的指令?,assembly,x86,branch-prediction,Assembly,X86,Branch Prediction,我正在回顾Visual Studio中某些程序的反汇编,并看到以下内容: 001B1015 cmp ebx, edx 001B1017 jae wmain+19h (001B1019h) 001B1019 pop esi 这段代码太傻了。如果jae导致条件跳转,则控制将传递到完全相同的指令,否则它将失败 问题是CPU中的分支预测将如何处理它。CPU将预测它是“跳转”还是“失败”。英特尔x86处理器在收集以前代码执行情况的统计数据之前

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

001B1015  cmp         ebx, edx  
001B1017  jae         wmain+19h (001B1019h)  
001B1019  pop         esi
这段代码太傻了。如果
jae
导致条件跳转,则控制将传递到完全相同的指令,否则它将失败

问题是CPU中的分支预测将如何处理它。CPU将预测它是“跳转”还是“失败”。英特尔x86处理器在收集以前代码执行情况的统计数据之前,会将条件跳跃预测为“不会完成”。因此,此
jae
将被预测为“不会发生,失败”,CPU将选择“失败”路径

如果发生预测失误(结果是错误地选择了“fall-through”路径),CPU应该重新设置管道并运行“branch”路径

这里的诀窍是“fall-through”和“branch”有效地实现了相同的功能,相当于
nop

我从未见过在任何关于分支的文档中分析过这种情况


一个流行的CPU能将这个
jae
视为
nop
吗?或者它会使用通常的预测逻辑吗?

我在任何英特尔或AMD手册中都没有见过这种特殊情况。因此,我相信这种特殊情况的执行与任何其他条件跳转都没有区别。可能会有很多我们目前无法想象的特殊情况,CPU的特殊考虑会占用太多额外的晶体管,甚至额外的管道步骤,从而产生更多的功率和热量。如果这样的指令序列相当普遍,那么额外的晶体管和电源成本将是值得的。否则它们就不值钱。@igorpov:听起来很合理。编译器处理这个问题的机会要大得多。我当然希望您能在未经优化生成的代码中找到这些指令,不是吗?@MikeNakis/O2和/Ox中的任何一个都会导致这段代码被发出。好吧,我能说什么呢,代表编译器来说,这是非常蹩脚的。