summaryrefslogtreecommitdiff
path: root/src/cpu/pred/bpred_unit.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/pred/bpred_unit.hh')
-rw-r--r--src/cpu/pred/bpred_unit.hh14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/cpu/pred/bpred_unit.hh b/src/cpu/pred/bpred_unit.hh
index 61b375f9b..f75ab79d5 100644
--- a/src/cpu/pred/bpred_unit.hh
+++ b/src/cpu/pred/bpred_unit.hh
@@ -178,6 +178,13 @@ class BPredUnit : public SimObject
*/
virtual void update(Addr instPC, bool taken, void *bp_history,
bool squashed) = 0;
+ /**
+ * Deletes the associated history with a branch, performs no predictor
+ * updates. Used for branches that mispredict and update tables but
+ * are still speculative and later retire.
+ * @param bp_history History to delete associated with this predictor
+ */
+ virtual void retireSquashed(void *bp_history) = 0;
/**
* Updates the BTB with the target of a branch.
@@ -200,7 +207,7 @@ class BPredUnit : public SimObject
ThreadID _tid)
: seqNum(seq_num), pc(instPC), bpHistory(bp_history), RASTarget(0),
RASIndex(0), tid(_tid), predTaken(pred_taken), usedRAS(0), pushedRAS(0),
- wasCall(0), wasReturn(0)
+ wasCall(0), wasReturn(0), wasSquashed(0)
{}
bool operator==(const PredictorHistory &entry) const {
@@ -234,7 +241,7 @@ class BPredUnit : public SimObject
/** Whether or not the RAS was used. */
bool usedRAS;
- /* Wether or not the RAS was pushed */
+ /* Whether or not the RAS was pushed */
bool pushedRAS;
/** Whether or not the instruction was a call. */
@@ -242,6 +249,9 @@ class BPredUnit : public SimObject
/** Whether or not the instruction was a return. */
bool wasReturn;
+
+ /** Whether this instruction has already mispredicted/updated bp */
+ bool wasSquashed;
};
typedef std::deque<PredictorHistory> History;