cpu: convert bpred_unit to new style stats

Change-Id: Ife80b2df3cb900a73a4f0c1d6925d9ed2d625dd0
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/33797
Reviewed-by: Trivikram Reddy <tvreddy@ucdavis.edu>
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
diff --git a/src/cpu/pred/bpred_unit.cc b/src/cpu/pred/bpred_unit.cc
index ec9c5f8..d0ed71d 100644
--- a/src/cpu/pred/bpred_unit.cc
+++ b/src/cpu/pred/bpred_unit.cc
@@ -60,84 +60,31 @@
           params->numThreads),
       RAS(numThreads),
       iPred(params->indirectBranchPred),
+      stats(this),
       instShiftAmt(params->instShiftAmt)
 {
     for (auto& r : RAS)
         r.init(params->RASSize);
 }
 
-void
-BPredUnit::regStats()
+BPredUnit::BPredUnitStats::BPredUnitStats(Stats::Group *parent)
+    : Stats::Group(parent),
+      ADD_STAT(lookups, "Number of BP lookups"),
+      ADD_STAT(condPredicted, "Number of conditional branches predicted"),
+      ADD_STAT(condIncorrect, "Number of conditional branches incorrect"),
+      ADD_STAT(BTBLookups, "Number of BTB lookups"),
+      ADD_STAT(BTBHits, "Number of BTB hits"),
+      ADD_STAT(BTBHitPct, "BTB Hit Percentage",
+           (BTBHits / BTBLookups) * 100),
+      ADD_STAT(RASUsed, "Number of times the RAS was used to get a target."),
+      ADD_STAT(RASIncorrect, "Number of incorrect RAS predictions."),
+      ADD_STAT(indirectLookups, "Number of indirect predictor lookups."),
+      ADD_STAT(indirectHits, "Number of indirect target hits."),
+      ADD_STAT(indirectMisses, "Number of indirect misses."),
+      ADD_STAT(indirectMispredicted, "Number of mispredicted indirect"
+          " branches.")
 {
-    SimObject::regStats();
-
-    lookups
-        .name(name() + ".lookups")
-        .desc("Number of BP lookups")
-        ;
-
-    condPredicted
-        .name(name() + ".condPredicted")
-        .desc("Number of conditional branches predicted")
-        ;
-
-    condIncorrect
-        .name(name() + ".condIncorrect")
-        .desc("Number of conditional branches incorrect")
-        ;
-
-    BTBLookups
-        .name(name() + ".BTBLookups")
-        .desc("Number of BTB lookups")
-        ;
-
-    BTBHits
-        .name(name() + ".BTBHits")
-        .desc("Number of BTB hits")
-        ;
-
-    BTBCorrect
-        .name(name() + ".BTBCorrect")
-        .desc("Number of correct BTB predictions (this stat may not "
-              "work properly.")
-        ;
-
-    BTBHitPct
-        .name(name() + ".BTBHitPct")
-        .desc("BTB Hit Percentage")
-        .precision(6);
-    BTBHitPct = (BTBHits / BTBLookups) * 100;
-
-    usedRAS
-        .name(name() + ".usedRAS")
-        .desc("Number of times the RAS was used to get a target.")
-        ;
-
-    RASIncorrect
-        .name(name() + ".RASInCorrect")
-        .desc("Number of incorrect RAS predictions.")
-        ;
-
-    indirectLookups
-        .name(name() + ".indirectLookups")
-        .desc("Number of indirect predictor lookups.")
-        ;
-
-    indirectHits
-        .name(name() + ".indirectHits")
-        .desc("Number of indirect target hits.")
-        ;
-
-    indirectMisses
-        .name(name() + ".indirectMisses")
-        .desc("Number of indirect misses.")
-        ;
-
-    indirectMispredicted
-        .name(name() + "indirectMispredicted")
-        .desc("Number of mispredicted indirect branches.")
-        ;
-
+    BTBHitPct.precision(6);
 }
 
 ProbePoints::PMUUPtr
@@ -177,7 +124,7 @@
     bool pred_taken = false;
     TheISA::PCState target = pc;
 
-    ++lookups;
+    ++stats.lookups;
     ppBranches->notify(1);
 
     void *bp_history = NULL;
@@ -191,7 +138,7 @@
         // Tell the BP there was an unconditional branch.
         uncondBranch(tid, pc.instAddr(), bp_history);
     } else {
-        ++condPredicted;
+        ++stats.condPredicted;
         pred_taken = lookup(tid, pc.instAddr(), bp_history);
 
         DPRINTF(Branch, "[tid:%i] [sn:%llu] "
@@ -214,7 +161,7 @@
     // Now lookup in the BTB or RAS.
     if (pred_taken) {
         if (inst->isReturn()) {
-            ++usedRAS;
+            ++stats.RASUsed;
             predict_record.wasReturn = true;
             // If it's a function return call, then look up the address
             // in the RAS.
@@ -248,10 +195,10 @@
             }
 
             if (inst->isDirectCtrl() || !iPred) {
-                ++BTBLookups;
+                ++stats.BTBLookups;
                 // Check BTB on direct branches
                 if (BTB.valid(pc.instAddr(), tid)) {
-                    ++BTBHits;
+                    ++stats.BTBHits;
                     // If it's not a return, use the BTB to get target addr.
                     target = BTB.lookup(pc.instAddr(), tid);
                     DPRINTF(Branch,
@@ -280,18 +227,18 @@
                 }
             } else {
                 predict_record.wasIndirect = true;
-                ++indirectLookups;
+                ++stats.indirectLookups;
                 //Consult indirect predictor on indirect control
                 if (iPred->lookup(pc.instAddr(), target, tid)) {
                     // Indirect predictor hit
-                    ++indirectHits;
+                    ++stats.indirectHits;
                     DPRINTF(Branch,
                             "[tid:%i] [sn:%llu] "
                             "Instruction %s predicted "
                             "indirect target is %s\n",
                             tid, seqNum, pc, target);
                 } else {
-                    ++indirectMisses;
+                    ++stats.indirectMisses;
                     pred_taken = false;
                     predict_record.predTaken = pred_taken;
                     DPRINTF(Branch,
@@ -426,7 +373,7 @@
 
     History &pred_hist = predHist[tid];
 
-    ++condIncorrect;
+    ++stats.condIncorrect;
     ppMisses->notify(1);
 
     DPRINTF(Branch, "[tid:%i] Squashing from sequence number %i, "
@@ -454,7 +401,7 @@
 
 
         if ((*hist_it).usedRAS) {
-            ++RASIncorrect;
+            ++stats.RASIncorrect;
             DPRINTF(Branch,
                     "[tid:%i] [squash sn:%llu] Incorrect RAS [sn:%llu]\n",
                     tid, squashed_sn, hist_it->seqNum);
@@ -493,7 +440,7 @@
                  hist_it->usedRAS = true;
             }
             if (hist_it->wasIndirect) {
-                ++indirectMispredicted;
+                ++stats.indirectMispredicted;
                 if (iPred) {
                     iPred->recordTarget(
                         hist_it->seqNum, pred_hist.front().indirectHistory,
diff --git a/src/cpu/pred/bpred_unit.hh b/src/cpu/pred/bpred_unit.hh
index 3ca6fa8..c90d450 100644
--- a/src/cpu/pred/bpred_unit.hh
+++ b/src/cpu/pred/bpred_unit.hh
@@ -68,11 +68,6 @@
      */
     BPredUnit(const Params *p);
 
-    /**
-     * Registers statistics.
-     */
-    void regStats() override;
-
     void regProbePoints() override;
 
     /** Perform sanity checks after a drain. */
@@ -282,33 +277,35 @@
     /** The indirect target predictor. */
     IndirectPredictor * iPred;
 
-    /** Stat for number of BP lookups. */
-    Stats::Scalar lookups;
-    /** Stat for number of conditional branches predicted. */
-    Stats::Scalar condPredicted;
-    /** Stat for number of conditional branches predicted incorrectly. */
-    Stats::Scalar condIncorrect;
-    /** Stat for number of BTB lookups. */
-    Stats::Scalar BTBLookups;
-    /** Stat for number of BTB hits. */
-    Stats::Scalar BTBHits;
-    /** Stat for number of times the BTB is correct. */
-    Stats::Scalar BTBCorrect;
-    /** Stat for percent times an entry in BTB found. */
-    Stats::Formula BTBHitPct;
-    /** Stat for number of times the RAS is used to get a target. */
-    Stats::Scalar usedRAS;
-    /** Stat for number of times the RAS is incorrect. */
-    Stats::Scalar RASIncorrect;
+    struct BPredUnitStats : public Stats::Group {
+        BPredUnitStats(Stats::Group *parent);
 
-    /** Stat for the number of indirect target lookups.*/
-    Stats::Scalar indirectLookups;
-    /** Stat for the number of indirect target hits.*/
-    Stats::Scalar indirectHits;
-    /** Stat for the number of indirect target misses.*/
-    Stats::Scalar indirectMisses;
-    /** Stat for the number of indirect target mispredictions.*/
-    Stats::Scalar indirectMispredicted;
+        /** Stat for number of BP lookups. */
+        Stats::Scalar lookups;
+        /** Stat for number of conditional branches predicted. */
+        Stats::Scalar condPredicted;
+        /** Stat for number of conditional branches predicted incorrectly. */
+        Stats::Scalar condIncorrect;
+        /** Stat for number of BTB lookups. */
+        Stats::Scalar BTBLookups;
+        /** Stat for number of BTB hits. */
+        Stats::Scalar BTBHits;
+        /** Stat for percent times an entry in BTB found. */
+        Stats::Formula BTBHitPct;
+        /** Stat for number of times the RAS is used to get a target. */
+        Stats::Scalar RASUsed;
+        /** Stat for number of times the RAS is incorrect. */
+        Stats::Scalar RASIncorrect;
+
+        /** Stat for the number of indirect target lookups.*/
+        Stats::Scalar indirectLookups;
+        /** Stat for the number of indirect target hits.*/
+        Stats::Scalar indirectHits;
+        /** Stat for the number of indirect target misses.*/
+        Stats::Scalar indirectMisses;
+        /** Stat for the number of indirect target mispredictions.*/
+        Stats::Scalar indirectMispredicted;
+    } stats;
 
   protected:
     /** Number of bits to shift instructions by for predictor addresses. */