cpu: pred: Local Predictor Reset in Tournament Predictor

When a branch gets squashed, it's speculative branch predictor state should get
rolled back in squash().  However, only the globalHistory state was being
rolled back.  This patch adds (at least some) support for rolling back the
local predictor state also.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>
This commit is contained in:
Andrew Lukefahr 2015-09-15 08:14:07 -05:00
parent fb0f9884e2
commit 543efd5ca6
2 changed files with 8 additions and 0 deletions

View file

@ -217,6 +217,7 @@ TournamentBP::lookup(Addr branch_addr, void * &bp_history)
history->localPredTaken = local_prediction;
history->globalPredTaken = global_prediction;
history->globalUsed = choice_prediction;
history->localHistoryIdx = local_history_idx;
history->localHistory = local_predictor_idx;
bp_history = (void *)history;
@ -256,6 +257,7 @@ TournamentBP::uncondBranch(Addr pc, void * &bp_history)
history->localPredTaken = true;
history->globalPredTaken = true;
history->globalUsed = true;
history->localHistoryIdx = invalidPredictorIndex;
history->localHistory = invalidPredictorIndex;
bp_history = static_cast<void *>(history);
@ -371,6 +373,11 @@ TournamentBP::squash(void *bp_history)
// Restore global history to state prior to this branch.
globalHistory = history->globalHistory;
// Restore local history
if (history->localHistoryIdx != invalidPredictorIndex) {
localHistoryTable[history->localHistoryIdx] = history->localHistory;
}
// Delete this BPHistory now that we're done with it.
delete history;
}

View file

@ -167,6 +167,7 @@ class TournamentBP : public BPredUnit
static int newCount;
#endif
unsigned globalHistory;
unsigned localHistoryIdx;
unsigned localHistory;
bool localPredTaken;
bool globalPredTaken;