由于ret
指令是间接调用,x86上的ret
指令是否会使管道停止,还是以某种方式进行优化以表现得像更直接的调用?
答案 0 :(得分:6)
从英特尔优化参考手册中,分支预测单元精确地包含一个返回堆栈缓冲区,以更准确地预测ret
指令(第2.2.2.1节)。指令排队和解码单元还跟踪堆栈指针的变化,以提高解码带宽(第2.2.2.5节)。
更详细地说,第3.4.1.4节描述了一些“规则”,主要针对编译器编写者,以便从内联,调用和放大器中受益。返回 - 最相关的可能是近/远调用必须与近/远返回配对,这意味着不推荐在堆栈上推送返回地址并跳转到被调用者。此外,建议调用深度不超过16个嵌套调用(RSB的大小)。
如果遵循这些规则,您可以在分支选择期间(第3.4.1.6节)有效地将它们视为间接分支,其中包含所有含义。除了病态案例或自我修改代码之外,你很可能永远不会在ret
上遇到失速。