分支预测逻辑在分支指令到达流水线的D1级时,根据BTB中录预的这条指令发生转移的历史记测它是否会发生转移。那么分支预测逻辑的预测是否正确?怎么进行判断?预测正确或错误将对流水线操作产生什么影响?分支预测逻辑的预测结果是在执行级进行判断的。ALU执行了分支指令之后,根据执行结果对预测进行判断,这里分为四种情况:
  • 预测转移并且预测结果正确,这种情况属于预测会发生转移结果确实发生了转移。处理器除了将BTB中历史记录位升值以外不需要做其他事情。这是由于在预测发生转移时指令预取器已不再顺序取指,而是将指针指向分支指令转移目标地址,并且将指令队列做了切换。因此,预取器可以按原来状态继续工作。
  • 预测转移而预测结果不正确,即预测会发生转移而结果却没有发生转移。与上述情况相反,在预测发生转移时处理器已进行了一系列操作:指令预取器不再顺序取指,将指针指向分支指令转移目标地址,并且将指令队列做了切换。但是由于预测是错误的,这一系列操作也是错误的,流水线中分支指令以后的指令需要刷新。预取器和指令队列必须回到预测以前状态,使用原来指令队列,安排顺序读取指令。当然,还要将BTB记录的历史位的值减量。
  • 预测不转移并且预测结果正确,就是预测不会发生转移而结果也没有发生转移。由于预测正确,除了将BTB历史记录位减量以外,不需要做其他工作。
  • 预测不转移而预测结果不正确,这也是一种预测错误的情况,预测不转移结果却发生了转移,和第2种情况一样,处理器要做刷新流水线、切换指令队列等工作。此外,将BTB的历史记录位升级。
  不管分支预测逻辑预测是否发生转移,一旦预测错误,就必须清除两个指令队列,预取器要从正确的地址重新取指,这将会造成3-4个时钟的损失。
  对于那些第一次进入流水线的,在BTB中没有记录项的分支指令,由于一概预测不发生转移,如果预测错误,即实际执行结果发生了转移,处理器就在BTB中增加一条记录并将历史位置成11。如果执行结果没有发生转移,对这条原来在BTB中没有记录的转移指令仍然不做记录。