summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configs/common/O3_ARM_v7a.py5
-rw-r--r--src/cpu/pred/BranchPredictor.py2
-rw-r--r--src/cpu/pred/tournament.cc21
3 files changed, 16 insertions, 12 deletions
diff --git a/configs/common/O3_ARM_v7a.py b/configs/common/O3_ARM_v7a.py
index c85ba2c6c..f5cd3bbc8 100644
--- a/configs/common/O3_ARM_v7a.py
+++ b/configs/common/O3_ARM_v7a.py
@@ -90,12 +90,11 @@ class O3_ARM_v7a_FUP(FUPool):
# Tournament Branch Predictor
class O3_ARM_v7a_BP(BranchPredictor):
predType = "tournament"
+ localPredictorSize = 2048
localCtrBits = 2
- localHistoryTableSize = 64
- localHistoryBits = 6
+ localHistoryTableSize = 1024
globalPredictorSize = 8192
globalCtrBits = 2
- globalHistoryBits = 13
choicePredictorSize = 8192
choiceCtrBits = 2
BTBEntries = 2048
diff --git a/src/cpu/pred/BranchPredictor.py b/src/cpu/pred/BranchPredictor.py
index 21001b360..07fc840b8 100644
--- a/src/cpu/pred/BranchPredictor.py
+++ b/src/cpu/pred/BranchPredictor.py
@@ -40,10 +40,8 @@ class BranchPredictor(SimObject):
localPredictorSize = Param.Unsigned(2048, "Size of local predictor")
localCtrBits = Param.Unsigned(2, "Bits per counter")
localHistoryTableSize = Param.Unsigned(2048, "Size of local history table")
- localHistoryBits = Param.Unsigned(11, "Bits for the local history")
globalPredictorSize = Param.Unsigned(8192, "Size of global predictor")
globalCtrBits = Param.Unsigned(2, "Bits per counter")
- globalHistoryBits = Param.Unsigned(13, "Bits of history")
choicePredictorSize = Param.Unsigned(8192, "Size of choice predictor")
choiceCtrBits = Param.Unsigned(2, "Bits of choice counters")
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);