#include "cpu/inst_seq.hh"
#include "cpu/static_inst.hh"
#include "params/BranchPredictor.hh"
+#include "sim/probe/pmu.hh"
#include "sim/sim_object.hh"
/**
*/
void regStats();
+ void regProbePoints() M5_ATTR_OVERRIDE;
+
/** Perform sanity checks after a drain. */
void drainSanityCheck() const;
Stats::Scalar usedRAS;
/** Stat for number of times the RAS is incorrect. */
Stats::Scalar RASIncorrect;
+
+ protected:
+ /**
+ * @{
+ * @name PMU Probe points.
+ */
+
+ /**
+ * Helper method to instantiate probe points belonging to this
+ * object.
+ *
+ * @param name Name of the probe point.
+ * @return A unique_ptr to the new probe point.
+ */
+ ProbePoints::PMUUPtr pmuProbePoint(const char *name);
+
+
+ /**
+ * Branches seen by the branch predictor
+ *
+ * @note This counter includes speculative branches.
+ */
+ ProbePoints::PMUUPtr ppBranches;
+
+ /** Miss-predicted branches */
+ ProbePoints::PMUUPtr ppMisses;
+
+ /** @} */
};
#endif // __CPU_PRED_BPRED_UNIT_HH__
;
}
+ProbePoints::PMUUPtr
+BPredUnit::pmuProbePoint(const char *name)
+{
+ ProbePoints::PMUUPtr ptr;
+ ptr.reset(new ProbePoints::PMU(getProbeManager(), name));
+
+ return ptr;
+}
+
+void
+BPredUnit::regProbePoints()
+{
+ ppBranches = pmuProbePoint("Branches");
+ ppMisses = pmuProbePoint("Misses");
+}
+
void
BPredUnit::drainSanityCheck() const
{
TheISA::PCState target = pc;
++lookups;
+ ppBranches->notify(1);
void *bp_history = NULL;
TheISA::PCState target;
++lookups;
+ ppBranches->notify(1);
+
DPRINTF(Branch, "[tid:%i] [sn:%i] %s ... PC %s doing branch "
"prediction\n", tid, seqNum,
inst->disassemble(instPC.instAddr()), instPC);
History &pred_hist = predHist[tid];
++condIncorrect;
+ ppMisses->notify(1);
DPRINTF(Branch, "[tid:%i]: Squashing from sequence number %i, "
"setting target to %s.\n", tid, squashed_sn, corrTarget);