From 66904b9584e09a9b6b6cb382ba208ec9a527edbe Mon Sep 17 00:00:00 2001 From: Andreas Hansson Date: Wed, 13 Aug 2014 06:57:21 -0400 Subject: [PATCH] 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. --- src/cpu/pred/bpred_unit.hh | 11 +++++------ src/cpu/pred/bpred_unit_impl.hh | 35 +++++++++++++++------------------ 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 +#include #include "base/statistics.hh" #include "base/types.hh" @@ -244,8 +244,7 @@ class BPredUnit : public SimObject bool wasReturn; }; - typedef std::list History; - typedef History::iterator HistoryIt; + typedef std::deque 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 predHist; /** The BTB. */ DefaultBTB BTB; /** The per-thread return address stack. */ - ReturnAddrStack *RAS; + std::vector 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, -- 2.30.2