cpu: Fixed PC shifting on LTAGE branch predictor
authorPau Cabre <pau.cabre@metempsy.com>
Wed, 7 Nov 2018 22:32:55 +0000 (23:32 +0100)
committerPau Cabre <pau.cabre@metempsy.com>
Tue, 13 Nov 2018 22:37:56 +0000 (22:37 +0000)
The PC needs to be shifted according to the instShiftAmt parameter

Change-Id: I272619c093695b56cf7f8ff7163e3b5d23205d16
Signed-off-by: Pau Cabre <pau.cabre@metempsy.com>
Reviewed-on: https://gem5-review.googlesource.com/c/14035
Reviewed-by: Sudhanshu Jha <sudhanshu.jha@arm.com>
Reviewed-by: Ilias Vougioukas <ilias.vougioukas@arm.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/cpu/pred/ltage.cc

index 251fb2e7fa822dd5530c9844fd9d87a2aa8fb108..86b9e99932549ee04d1c0ac5b78c75b0bcaa5dee 100644 (file)
@@ -138,13 +138,14 @@ LTAGE::LTAGE(const LTAGEParams *params)
 int
 LTAGE::bindex(Addr pc_in) const
 {
-    return ((pc_in) & ((ULL(1) << (logSizeBiMP)) - 1));
+    return ((pc_in >> instShiftAmt) & ((ULL(1) << (logSizeBiMP)) - 1));
 }
 
 int
 LTAGE::lindex(Addr pc_in) const
 {
-    return (((pc_in) & ((ULL(1) << (logSizeLoopPred - 2)) - 1)) << 2);
+    return (((pc_in >> instShiftAmt) &
+             ((ULL(1) << (logSizeLoopPred - 2)) - 1)) << 2);
 }
 
 int
@@ -171,7 +172,8 @@ LTAGE::gindex(ThreadID tid, Addr pc, int bank) const
     int index;
     int hlen = (histLengths[bank] > 16) ? 16 : histLengths[bank];
     index =
-        (pc) ^ ((pc) >> ((int) abs(tagTableSizes[bank] - bank) + 1)) ^
+        (pc >> instShiftAmt) ^
+        ((pc >> instShiftAmt) >> ((int) abs(tagTableSizes[bank] - bank) + 1)) ^
         threadHistory[tid].computeIndices[bank].comp ^
         F(threadHistory[tid].pathHist, hlen, bank);
 
@@ -183,8 +185,9 @@ LTAGE::gindex(ThreadID tid, Addr pc, int bank) const
 uint16_t
 LTAGE::gtag(ThreadID tid, Addr pc, int bank) const
 {
-    int tag = (pc) ^ threadHistory[tid].computeTags[0][bank].comp
-                   ^ (threadHistory[tid].computeTags[1][bank].comp << 1);
+    int tag = (pc >> instShiftAmt) ^
+              threadHistory[tid].computeTags[0][bank].comp ^
+              (threadHistory[tid].computeTags[1][bank].comp << 1);
 
     return (tag & ((ULL(1) << tagWidths[bank]) - 1));
 }
@@ -239,7 +242,7 @@ LTAGE::getLoop(Addr pc, BranchInfo* bi) const
     bi->loopHit = -1;
     bi->loopPredValid = false;
     bi->loopIndex = lindex(pc);
-    bi->loopTag = ((pc) >> (logSizeLoopPred - 2));
+    bi->loopTag = ((pc) >> (instShiftAmt + logSizeLoopPred - 2));
 
     for (int i = 0; i < 4; i++) {
         if (ltable[bi->loopIndex + i].tag == bi->loopTag) {
@@ -630,7 +633,7 @@ LTAGE::updateHistories(ThreadID tid, Addr branch_pc, bool taken, void* b)
     BranchInfo* bi = (BranchInfo*)(b);
     ThreadHistory& tHist = threadHistory[tid];
     //  UPDATE HISTORIES
-    bool pathbit = ((branch_pc) & 1);
+    bool pathbit = ((branch_pc >> instShiftAmt) & 1);
     //on a squash, return pointers to this and recompute indices.
     //update user history
     updateGHist(tHist.gHist, taken, tHist.globalHistory, tHist.ptGhist);