# 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
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")
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);
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);