cpu: Modernise the branch predictor (STL and C++11)
authorAndreas Hansson <andreas.hansson@arm.com>
Wed, 13 Aug 2014 10:57:21 +0000 (06:57 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Wed, 13 Aug 2014 10:57:21 +0000 (06:57 -0400)
This patch does some minor house keeping of the branch predictor by
adopting STL containers, and shifting some iterator to use range-based
for loops.

The predictor history is also changed from a list to a deque as we
never to insertion/deletion other than at the front and back.

src/cpu/pred/bpred_unit.hh
src/cpu/pred/bpred_unit_impl.hh

index 0bc0d15697f863d12ba8fd24469a2cf0403768e8..61b375f9b4c926b6a3c15cd6b13d2b2cd72cf17d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2012 ARM Limited
+ * Copyright (c) 2011-2012, 2014 ARM Limited
  * Copyright (c) 2010 The University of Edinburgh
  * All rights reserved
  *
@@ -47,7 +47,7 @@
 #ifndef __CPU_PRED_BPRED_UNIT_HH__
 #define __CPU_PRED_BPRED_UNIT_HH__
 
-#include <list>
+#include <deque>
 
 #include "base/statistics.hh"
 #include "base/types.hh"
@@ -244,8 +244,7 @@ class BPredUnit : public SimObject
         bool wasReturn;
     };
 
-    typedef std::list<PredictorHistory> History;
-    typedef History::iterator HistoryIt;
+    typedef std::deque<PredictorHistory> History;
 
     /** Number of the threads for which the branch history is maintained. */
     uint32_t numThreads;
@@ -255,13 +254,13 @@ class BPredUnit : public SimObject
      * as instructions are committed, or restore it to the proper state after
      * a squash.
      */
-    History *predHist;
+    std::vector<History> predHist;
 
     /** The BTB. */
     DefaultBTB BTB;
 
     /** The per-thread return address stack. */
-    ReturnAddrStack *RAS;
+    std::vector<ReturnAddrStack> RAS;
 
     /** Stat for number of BP lookups. */
     Stats::Scalar lookups;
index 2dc82ec6dfd67e7af294e3ea292229ac713d7a15..18e2217750caba69ef372adddae25c0e7cf99bdd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2012 ARM Limited
+ * Copyright (c) 2011-2012, 2014 ARM Limited
  * Copyright (c) 2010 The University of Edinburgh
  * Copyright (c) 2012 Mark D. Hill and David A. Wood
  * All rights reserved
 
 BPredUnit::BPredUnit(const Params *params)
     : SimObject(params),
+      numThreads(params->numThreads),
+      predHist(numThreads),
       BTB(params->BTBEntries,
           params->BTBTagSize,
-          params->instShiftAmt)
+          params->instShiftAmt),
+      RAS(numThreads)
 {
-    numThreads = params->numThreads;
-
-    predHist = new History[numThreads];
-
-    RAS = new ReturnAddrStack[numThreads];
-    for (int i=0; i < numThreads; i++)
-        RAS[i].init(params->RASSize);
+    for (auto& r : RAS)
+        r.init(params->RASSize);
 }
 
 void
@@ -126,8 +124,8 @@ BPredUnit::drainSanityCheck() const
 {
     // We shouldn't have any outstanding requests when we resume from
     // a drained system.
-    for (int i = 0; i < numThreads; ++i)
-        assert(predHist[i].empty());
+    for (const auto& ph M5_VAR_USED : predHist)
+        assert(ph.empty());
 }
 
 bool
@@ -448,7 +446,7 @@ BPredUnit::squash(const InstSeqNum &squashed_sn,
     // fix up the entry.
     if (!pred_hist.empty()) {
 
-        HistoryIt hist_it = pred_hist.begin();
+        auto hist_it = pred_hist.begin();
         //HistoryIt hist_it = find(pred_hist.begin(), pred_hist.end(),
         //                       squashed_sn);
 
@@ -516,15 +514,14 @@ BPredUnit::squash(const InstSeqNum &squashed_sn,
 void
 BPredUnit::dump()
 {
-    HistoryIt pred_hist_it;
-
-    for (int i = 0; i < numThreads; ++i) {
-        if (!predHist[i].empty()) {
-            pred_hist_it = predHist[i].begin();
+    int i = 0;
+    for (const auto& ph : predHist) {
+        if (!ph.empty()) {
+            auto pred_hist_it = ph.begin();
 
-            cprintf("predHist[%i].size(): %i\n", i, predHist[i].size());
+            cprintf("predHist[%i].size(): %i\n", i++, ph.size());
 
-            while (pred_hist_it != predHist[i].end()) {
+            while (pred_hist_it != ph.end()) {
                 cprintf("[sn:%lli], PC:%#x, tid:%i, predTaken:%i, "
                         "bpHistory:%#x\n",
                         pred_hist_it->seqNum, pred_hist_it->pc,