only update BTB on a taken branch and update branch predictor w/pcstate from instruction
---
only pay attention to branch predictor updates if the the inst. is in fact a branch
W.needs(RegManager, UseDefUnit::WriteDestReg, idx);
}
+ if (inst->isControl())
+ W.needs(BPred, BranchPredictor::UpdatePredictor);
+
// Insert Back Schedule into our cache of
// resource schedules
addToSkedCache(inst, res_sked);
while (cur_it != end_it) {
if ((*cur_it)->seqNum <= squash_seq_num) {
DPRINTF(InOrderStage, "[tid:%i]: Cannot remove skidBuffer "
- "instructions (starting w/[sn:%i]) before delay slot "
+ "instructions (starting w/[sn:%i]) before "
"[sn:%i]. %i insts left.\n", tid,
(*cur_it)->seqNum, squash_seq_num,
skidBuffer[tid].size());
tid, asid, inst->pcState(), target);
} else {
DPRINTF(InOrderBPred, "[tid:%i]: BTB doesn't have a "
- "valid entry.\n",tid);
+ "valid entry, predicting false.\n",tid);
pred_taken = false;
}
}
BPUpdate((*hist_it).pc.instAddr(), actually_taken,
pred_hist.front().bpHistory);
- BTB.update((*hist_it).pc.instAddr(), corrTarget, asid);
+ // only update BTB on branch taken right???
+ if (actually_taken)
+ BTB.update((*hist_it).pc.instAddr(), corrTarget, asid);
DPRINTF(InOrderBPred, "[tid:%i]: Removing history for [sn:%i] "
"PC %s.\n", tid, (*hist_it).seqNum, (*hist_it).pc);
DPRINTF(InOrderBPred, "[tid:%i][sn:%i] Squashing...\n", tid,
bpred_squash_num);
+ // update due to branch resolution
if (squash_stage >= ThePipeline::BackEndStartStage) {
- bool taken = inst->predTaken();
- branchPred.squash(bpred_squash_num, inst->readPredTarg(), taken, tid);
+ branchPred.squash(bpred_squash_num,
+ inst->pcState(),
+ inst->pcState().branching(),
+ tid);
} else {
+ // update due to predicted taken branch
branchPred.squash(bpred_squash_num, tid);
}
}
ThreadID tid = inst->readTid();
int stage_num = fs_req->getStageNum();
- DPRINTF(InOrderFetchSeq, "[tid:%i]: Current PC is %s\n", tid,
- pc[tid]);
-
switch (fs_req->cmd)
{
case AssignNextPC:
{
+ DPRINTF(InOrderFetchSeq, "[tid:%i]: Current PC is %s\n", tid,
+ pc[tid]);
+
if (pcValid[tid]) {
inst->pcState(pc[tid]);
inst->setMemAddr(pc[tid].instAddr());