这是一个理论问题,我感到很困难。假设我采用ARM ISA和流水线数据路径。我正在使用分支预测器,为简单起见,它总是预测分支被采用。很明显,如果确实要采取分支,它会起作用,但否则就失败了。如果失败,则必须回滚并撤消所有更改,即刷新管道。
应该怎么做?
如果将某些值写入某个寄存器怎么办?
然后我怎样才能将该寄存器带到之前的值?旗帜也一样吗?
答案 0 :(得分:4)
由于这是在体系结构中定义的,因此您始终可以保证,如果分支被错误预测并且必须刷新管道,则以下所有指令都不会对体系结构产生明显影响。
有几种方法可以做到这一点:在简单实现(短流水线)中,当保证指令不在分支中时(通常可以发生错误的加载),通常会提交指令(即编写体系结构可见的修改)。影子了。
在更复杂的CPU,更长的流水线和无序核心中,使用的技术通常使用寄存器重命名:
https://en.wikipedia.org/wiki/Register_renaming
在这种情况下,指令将能够完成,将结果写入临时寄存器或位置,并且CPU将具有恢复状态的机制(如果是flush)或仅将临时结果提交给架构在有保证的情况下注册,这些结果不再被刷新。