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