summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authorMaximilien Breughe <Maximilien.Breughe@elis.ugent.be>2010-03-22 16:59:12 -0400
committerMaximilien Breughe <Maximilien.Breughe@elis.ugent.be>2010-03-22 16:59:12 -0400
commit0170e851de4b06f8839f25bfa9551e02ec4f24b3 (patch)
tree46dac0cd420d1b711e6e955d2a73935c9324ff08 /src/cpu
parent4ac245737d4dd9e49ef7e3f00d851593ab7579d2 (diff)
downloadgem5-0170e851de4b06f8839f25bfa9551e02ec4f24b3.tar.xz
inorder: fix squash bug in branch predictor
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/inorder/resources/bpred_unit.cc3
-rw-r--r--src/cpu/inorder/resources/branch_predictor.cc6
2 files changed, 8 insertions, 1 deletions
diff --git a/src/cpu/inorder/resources/bpred_unit.cc b/src/cpu/inorder/resources/bpred_unit.cc
index 0e8526fa1..c9674a0b5 100644
--- a/src/cpu/inorder/resources/bpred_unit.cc
+++ b/src/cpu/inorder/resources/bpred_unit.cc
@@ -343,6 +343,8 @@ BPredUnit::squash(const InstSeqNum &squashed_sn,
// corresponding to the squash. In that case, don't bother trying to
// fix up the entry.
if (!pred_hist.empty()) {
+ if(pred_hist.front().seqNum==squashed_sn){
+
assert(pred_hist.front().seqNum == squashed_sn);
if (pred_hist.front().usedRAS) {
++RASIncorrect;
@@ -353,6 +355,7 @@ BPredUnit::squash(const InstSeqNum &squashed_sn,
BTB.update(pred_hist.front().PC, corr_target, tid);
pred_hist.pop_front();
+ }
}
}
diff --git a/src/cpu/inorder/resources/branch_predictor.cc b/src/cpu/inorder/resources/branch_predictor.cc
index ecac5fff0..ea9cf7207 100644
--- a/src/cpu/inorder/resources/branch_predictor.cc
+++ b/src/cpu/inorder/resources/branch_predictor.cc
@@ -56,6 +56,8 @@ BranchPredictor::regStats()
.desc("Number of Branches Predicted As Not Taken (False).");
Resource::regStats();
+
+ branchPred.regStats();
}
void
@@ -140,7 +142,9 @@ BranchPredictor::squash(DynInstPtr inst, int squash_stage,
InstSeqNum squash_seq_num, ThreadID tid)
{
DPRINTF(InOrderBPred, "Squashing...\n");
- branchPred.squash(squash_seq_num, tid);
+ Addr corr_targ=inst->readPredPC();
+ bool taken=inst->predTaken();
+ branchPred.squash(squash_seq_num,corr_targ,taken,tid);
}
void