summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/cpu/pred/BranchPredictor.py1
-rw-r--r--src/cpu/pred/ltage.cc18
-rw-r--r--src/cpu/pred/ltage.hh3
3 files changed, 13 insertions, 9 deletions
diff --git a/src/cpu/pred/BranchPredictor.py b/src/cpu/pred/BranchPredictor.py
index a42819419..aa6cd4a25 100644
--- a/src/cpu/pred/BranchPredictor.py
+++ b/src/cpu/pred/BranchPredictor.py
@@ -100,6 +100,7 @@ class LTAGE(BranchPredictor):
logSizeLoopPred = Param.Unsigned(8, "Log size of the loop predictor")
nHistoryTables = Param.Unsigned(12, "Number of history tables")
tagTableCounterBits = Param.Unsigned(3, "Number of tag table counter bits")
+ tagTableUBits = Param.Unsigned(2, "Number of tag table u bits")
histBufferSize = Param.Unsigned(2097152,
"A large number to track all branch histories(2MEntries default)")
minHist = Param.Unsigned(4, "Minimum history size of LTAGE")
diff --git a/src/cpu/pred/ltage.cc b/src/cpu/pred/ltage.cc
index 85ae2b304..b049d4fde 100644
--- a/src/cpu/pred/ltage.cc
+++ b/src/cpu/pred/ltage.cc
@@ -55,6 +55,7 @@ LTAGE::LTAGE(const LTAGEParams *params)
logSizeLoopPred(params->logSizeLoopPred),
nHistoryTables(params->nHistoryTables),
tagTableCounterBits(params->tagTableCounterBits),
+ tagTableUBits(params->tagTableUBits),
histBufferSize(params->histBufferSize),
minHist(params->minHist),
maxHist(params->maxHist),
@@ -68,6 +69,11 @@ LTAGE::LTAGE(const LTAGEParams *params)
loopNumIterMask((1 << loopTableIterBits) - 1),
threadHistory(params->numThreads)
{
+ // Current method for periodically resetting the u counter bits only
+ // works for 1 or 2 bits
+ // Also make sure that it is not 0
+ assert(tagTableUBits <= 2 && (tagTableUBits > 0));
+
// we use uint16_t type for these vales, so they cannot be more than
// 16 bits
assert(loopTableTagBits <= 16);
@@ -576,7 +582,7 @@ LTAGE::update(ThreadID tid, Addr branch_pc, bool taken, void* bp_history,
if (alloc) {
// is there some "unuseful" entry to allocate
- int8_t min = 1;
+ uint8_t min = 1;
for (int i = nHistoryTables; i > bi->hitBank; i--) {
if (gtable[i][bi->tableIndices[i]].u < min) {
min = gtable[i][bi->tableIndices[i]].u;
@@ -605,7 +611,6 @@ LTAGE::update(ThreadID tid, Addr branch_pc, bool taken, void* bp_history,
if ((gtable[i][bi->tableIndices[i]].u == 0)) {
gtable[i][bi->tableIndices[i]].tag = bi->tableTags[i];
gtable[i][bi->tableIndices[i]].ctr = (taken) ? 0 : -1;
- gtable[i][bi->tableIndices[i]].u = 0; //?
break;
}
}
@@ -643,12 +648,9 @@ LTAGE::update(ThreadID tid, Addr branch_pc, bool taken, void* bp_history,
}
// update the u counter
- if (longest_match_pred != bi->altTaken) {
- if (longest_match_pred == taken) {
- if (gtable[bi->hitBank][bi->hitBankIndex].u < 1) {
- gtable[bi->hitBank][bi->hitBankIndex].u++;
- }
- }
+ if (bi->tagePred != bi->altTaken) {
+ unsignedCtrUpdate(gtable[bi->hitBank][bi->hitBankIndex].u,
+ bi->tagePred == taken, tagTableUBits);
}
} else {
baseUpdate(pc, taken, bi);
diff --git a/src/cpu/pred/ltage.hh b/src/cpu/pred/ltage.hh
index 2119156b7..68aef1cc9 100644
--- a/src/cpu/pred/ltage.hh
+++ b/src/cpu/pred/ltage.hh
@@ -94,7 +94,7 @@ class LTAGE: public BPredUnit
{
int8_t ctr;
uint16_t tag;
- int8_t u;
+ uint8_t u;
TageEntry() : ctr(0), tag(0), u(0) { }
};
@@ -360,6 +360,7 @@ class LTAGE: public BPredUnit
const unsigned logSizeLoopPred;
const unsigned nHistoryTables;
const unsigned tagTableCounterBits;
+ const unsigned tagTableUBits;
const unsigned histBufferSize;
const unsigned minHist;
const unsigned maxHist;