summaryrefslogtreecommitdiff
path: root/src/cpu/pred/tournament.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/pred/tournament.cc')
-rw-r--r--src/cpu/pred/tournament.cc21
1 files changed, 14 insertions, 7 deletions
diff --git a/src/cpu/pred/tournament.cc b/src/cpu/pred/tournament.cc
index 52a05960f..e471d08f5 100644
--- a/src/cpu/pred/tournament.cc
+++ b/src/cpu/pred/tournament.cc
@@ -46,17 +46,28 @@
TournamentBP::TournamentBP(const Params *params)
: BPredUnit(params),
+ localPredictorSize(params->localPredictorSize),
localCtrBits(params->localCtrBits),
localHistoryTableSize(params->localHistoryTableSize),
- localHistoryBits(params->localHistoryBits),
+ localHistoryBits(ceilLog2(params->localPredictorSize)),
globalPredictorSize(params->globalPredictorSize),
globalCtrBits(params->globalCtrBits),
- globalHistoryBits(params->globalHistoryBits),
+ globalHistoryBits(
+ ceilLog2(params->globalPredictorSize) >
+ ceilLog2(params->choicePredictorSize) ?
+ ceilLog2(params->globalPredictorSize) :
+ ceilLog2(params->choicePredictorSize)),
choicePredictorSize(params->choicePredictorSize),
choiceCtrBits(params->choiceCtrBits),
instShiftAmt(params->instShiftAmt)
{
- localPredictorSize = ULL(1) << localHistoryBits;
+ if (!isPowerOf2(localPredictorSize)) {
+ fatal("Invalid local predictor size!\n");
+ }
+
+ if (!isPowerOf2(globalPredictorSize)) {
+ fatal("Invalid global predictor size!\n");
+ }
//Set up the array of counters for the local predictor
localCtrs.resize(localPredictorSize);
@@ -76,10 +87,6 @@ TournamentBP::TournamentBP(const Params *params)
for (int i = 0; i < localHistoryTableSize; ++i)
localHistoryTable[i] = 0;
- if (!isPowerOf2(globalPredictorSize)) {
- fatal("Invalid global predictor size!\n");
- }
-
//Setup the array of counters for the global predictor
globalCtrs.resize(globalPredictorSize);