diff options
author | Andrew Lukefahr <lukefahr@umich.edu> | 2015-09-15 08:14:07 -0500 |
---|---|---|
committer | Andrew Lukefahr <lukefahr@umich.edu> | 2015-09-15 08:14:07 -0500 |
commit | 543efd5ca687782028fad8873099ad38eeb64085 (patch) | |
tree | f5169ae58d9fda00e1ab708bd5ea4e5698f070aa /src/cpu/pred | |
parent | fb0f9884e27f33c434ef67a5cfd284331a2a89e0 (diff) | |
download | gem5-543efd5ca687782028fad8873099ad38eeb64085.tar.xz |
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>
Diffstat (limited to 'src/cpu/pred')
-rw-r--r-- | src/cpu/pred/tournament.cc | 7 | ||||
-rw-r--r-- | src/cpu/pred/tournament.hh | 1 |
2 files changed, 8 insertions, 0 deletions
diff --git a/src/cpu/pred/tournament.cc b/src/cpu/pred/tournament.cc index 1d4fe037e..ea6be46fa 100644 --- a/src/cpu/pred/tournament.cc +++ b/src/cpu/pred/tournament.cc @@ -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; } diff --git a/src/cpu/pred/tournament.hh b/src/cpu/pred/tournament.hh index d46175610..8fb5b515c 100644 --- a/src/cpu/pred/tournament.hh +++ b/src/cpu/pred/tournament.hh @@ -167,6 +167,7 @@ class TournamentBP : public BPredUnit static int newCount; #endif unsigned globalHistory; + unsigned localHistoryIdx; unsigned localHistory; bool localPredTaken; bool globalPredTaken; |