返回地址预测堆栈缓冲区与堆栈存储的返回地址?

use*_*112 8 architecture cpu performance x86 intel

一直在阅读Agner Fog的"Intel,AMD和VIA CPU的微架构"和第34页,他描述了"返回地址预测":

http://www.agner.org/optimize/microarchitecture.pdf

3.15返回(除P1外的所有处理器)

返回使用更好的方法.每次执行调用指令时,一个称为返回堆栈缓冲区的后进先出缓冲区会记住返回地址,并使用它来预测相应返回的去向.当从几个不同的位置调用相同的子例程时,此机制可确保正确预测返回指令.

鉴于返回地址仍然存储在堆栈中,我有点不清楚对此的需求是什么?

那么如果还有这种技术,在堆栈上存储返回地址的目的是什么?堆栈存储值是否仅在此预测技术不起作用时使用?

Bri*_*ian 13

预测器通常是获取阶段的一部分,以便确定接下来要获取的指令.这发生在处理器解码指​​令之前,因此甚至不确定存在分支指令.与所有预测变量一样,返回地址预测器的意图是更快地获得分支的方向/目标.返回指令是一个分支,因此它通常会有一个分支预测器条目来确定它是否被采用以及目标在哪里.查询返回地址预测器以代替正常分支目标缓冲区.

因此,返回语句之前的50个指令实际上是"执行",fetch阶段预测返回指令和下一个取指令的指令地址.稍后,当执行返回时,从堆栈中读取地址并与预测返回的位置进行比较.如果它们相同,则继续执行,否则执行将回滚以使用正确的返回地址.

为什么要存储在堆栈中?首先,处理器不知道预测器是否工作而不与存储在堆栈上的地址进行比较.其次,堆栈是"官方"返回地址,可能由于正当理由而更改.第三,返回地址预测器具有有限数量的条目.返回指令需要堆栈,而预留器中没有空间存储地址.