summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2014-08-13 06:57:21 -0400
committerAndreas Hansson <andreas.hansson@arm.com>2014-08-13 06:57:21 -0400
commit66904b9584e09a9b6b6cb382ba208ec9a527edbe (patch)
treea4c06f9f82ac4a7a5dd0f7d42e94c4cf3e4f9cdd
parent94daae6864769ffc5fff037dd18b2e8062ee672d (diff)
downloadgem5-66904b9584e09a9b6b6cb382ba208ec9a527edbe.tar.xz
cpu: Modernise the branch predictor (STL and C++11)
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.
-rw-r--r--src/cpu/pred/bpred_unit.hh11
-rw-r--r--src/cpu/pred/bpred_unit_impl.hh35
2 files changed, 21 insertions, 25 deletions
diff --git a/src/cpu/pred/bpred_unit.hh b/src/cpu/pred/bpred_unit.hh
index 0bc0d1569..61b375f9b 100644
--- a/src/cpu/pred/bpred_unit.hh
+++ b/src/cpu/pred/bpred_unit.hh
@@ -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;
diff --git a/src/cpu/pred/bpred_unit_impl.hh b/src/cpu/pred/bpred_unit_impl.hh
index 2dc82ec6d..18e221775 100644
--- a/src/cpu/pred/bpred_unit_impl.hh
+++ b/src/cpu/pred/bpred_unit_impl.hh
@@ -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
@@ -57,17 +57,15 @@
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,