据我所知,Return Stack Buffer只支持4到16个条目(来自wiki:http://en.wikipedia.org/wiki/Branch_predictor#Prediction_of_function_returns)并且不是键值对(基于ret指令的位置索引)。这是真的吗?当上下文切换发生时,RSB会发生什么?
假设我们有50个函数没有在返回堆栈缓冲区长度为16的CPU中返回,那么之后会发生什么?这是否意味着所有的预测都失败了?你能举例说明吗?这种情况在递归函数调用中是否相同?
BPU可以包含自己的RAS预测器,当它预测BTB中的调用类型时,它会将假定的调用NLIP(以下指令的IP)推送到RAS堆栈上。它在BTB中预测的下一个返回将使用RAS的顶部作为预测地址(就像它预测常规间接分支时,ITA中的并行命中将超过BTB中的目标地址一样)。
BAC将在解码时通过将每个调用指令的NLIP推送到其自己的RSB来验证/覆盖这些返回目标预测,下一个返回地址的预测将与该地址进行比较。如果不正确,BAC将发出BAclear,并在管道开始时将下一个IP逻辑重新存储到正确的返回地址(这可能是错误的id,RSB已损坏)。它可能会用BAC-RSB状态覆盖RAS预测器堆栈。
在一个实现中,BAC向TOS指针提供它验证的每个分支预测,以及直通地址。一旦执行了分支并且知道了实际结果,如果出现预测错误,RSB TOS就会恢复。我认为更有效的方法是在退休时拥有一个体系结构RSB,在管道刷新/预测错误时将其复制到BAC RSB和RAS预测器中。这样可以防止恢复到损坏的RSB。
RAS预测器可能是一个循环堆栈,根据实现情况,它可能有也可能没有上溢和下溢检查和保证。当堆栈已满时,新的预测可能会覆盖最旧的预测,以便它始终是最新的(而不是阻止它在已满时被添加,这意味着要保留一个计数器,记录它无法预测的调用/返回次数)。至于下溢,它可能拒绝进行预测,而是使用ITA进行预测。如果RSB下溢,它可能不会覆盖RAS预测器所做的预测。
上下文切换的硬件中断导致在执行宏操作的最后一个uop时清除管道。RSB很可能恢复到体系结构状态,以便在中断后继续。预测器RAS/BAC RSB可能在微码中被刷新,如果它被损坏,它最终会自行清除。