summaryrefslogtreecommitdiff
path: root/src/cpu/pred/2bit_local.cc
diff options
context:
space:
mode:
authorNilay Vaish ext:(%2C%20Timothy%20Jones%20%3Ctimothy.jones%40cl.cam.ac.uk%3E) <nilay@cs.wisc.edu>2013-01-24 12:28:51 -0600
committerNilay Vaish ext:(%2C%20Timothy%20Jones%20%3Ctimothy.jones%40cl.cam.ac.uk%3E) <nilay@cs.wisc.edu>2013-01-24 12:28:51 -0600
commitdbeabedaf0f8d9ec0ea3331db2e44b1add53f79f (patch)
tree568d3b6007adf1a8d3ba6568fc5635e56afd3d53 /src/cpu/pred/2bit_local.cc
parent11d5ffa108983d5d9742f0aad23f80c691f285ee (diff)
downloadgem5-dbeabedaf0f8d9ec0ea3331db2e44b1add53f79f.tar.xz
branch predictor: move out of o3 and inorder cpus
This patch moves the branch predictor files in the o3 and inorder directories to src/cpu/pred. This allows sharing the branch predictor across different cpu models. This patch was originally posted by Timothy Jones in July 2010 but never made it to the repository. --HG-- rename : src/cpu/o3/bpred_unit.cc => src/cpu/pred/bpred_unit.cc rename : src/cpu/o3/bpred_unit.hh => src/cpu/pred/bpred_unit.hh rename : src/cpu/o3/bpred_unit_impl.hh => src/cpu/pred/bpred_unit_impl.hh rename : src/cpu/o3/sat_counter.hh => src/cpu/pred/sat_counter.hh
Diffstat (limited to 'src/cpu/pred/2bit_local.cc')
-rw-r--r--src/cpu/pred/2bit_local.cc47
1 files changed, 25 insertions, 22 deletions
diff --git a/src/cpu/pred/2bit_local.cc b/src/cpu/pred/2bit_local.cc
index 4d18c419b..0fd0a10d3 100644
--- a/src/cpu/pred/2bit_local.cc
+++ b/src/cpu/pred/2bit_local.cc
@@ -34,12 +34,11 @@
#include "cpu/pred/2bit_local.hh"
#include "debug/Fetch.hh"
-LocalBP::LocalBP(unsigned _localPredictorSize,
- unsigned _localCtrBits,
- unsigned _instShiftAmt)
- : localPredictorSize(_localPredictorSize),
- localCtrBits(_localCtrBits),
- instShiftAmt(_instShiftAmt)
+LocalBP::LocalBP(const Params *params)
+ : BPredUnit(params),
+ localPredictorSize(params->localPredictorSize),
+ localCtrBits(params->localCtrBits),
+ instShiftAmt(params->instShiftAmt)
{
if (!isPowerOf2(localPredictorSize)) {
fatal("Invalid local predictor size!\n");
@@ -54,20 +53,20 @@ LocalBP::LocalBP(unsigned _localPredictorSize,
// Setup the index mask.
indexMask = localPredictorSets - 1;
- DPRINTF(Fetch, "Branch predictor: index mask: %#x\n", indexMask);
+ DPRINTF(Fetch, "index mask: %#x\n", indexMask);
// Setup the array of counters for the local predictor.
localCtrs.resize(localPredictorSets);
for (unsigned i = 0; i < localPredictorSets; ++i)
- localCtrs[i].setBits(_localCtrBits);
+ localCtrs[i].setBits(localCtrBits);
- DPRINTF(Fetch, "Branch predictor: local predictor size: %i\n",
+ DPRINTF(Fetch, "local predictor size: %i\n",
localPredictorSize);
- DPRINTF(Fetch, "Branch predictor: local counter bits: %i\n", localCtrBits);
+ DPRINTF(Fetch, "local counter bits: %i\n", localCtrBits);
- DPRINTF(Fetch, "Branch predictor: instruction shift amount: %i\n",
+ DPRINTF(Fetch, "instruction shift amount: %i\n",
instShiftAmt);
}
@@ -80,7 +79,7 @@ LocalBP::reset()
}
void
-LocalBP::BTBUpdate(Addr &branch_addr, void * &bp_history)
+LocalBP::btbUpdate(Addr branch_addr, void * &bp_history)
{
// Place holder for a function that is called to update predictor history when
// a BTB entry is invalid or not found.
@@ -88,18 +87,18 @@ LocalBP::BTBUpdate(Addr &branch_addr, void * &bp_history)
bool
-LocalBP::lookup(Addr &branch_addr, void * &bp_history)
+LocalBP::lookup(Addr branch_addr, void * &bp_history)
{
bool taken;
uint8_t counter_val;
unsigned local_predictor_idx = getLocalIndex(branch_addr);
- DPRINTF(Fetch, "Branch predictor: Looking up index %#x\n",
+ DPRINTF(Fetch, "Looking up index %#x\n",
local_predictor_idx);
counter_val = localCtrs[local_predictor_idx].read();
- DPRINTF(Fetch, "Branch predictor: prediction is %i.\n",
+ DPRINTF(Fetch, "prediction is %i.\n",
(int)counter_val);
taken = getPrediction(counter_val);
@@ -107,10 +106,10 @@ LocalBP::lookup(Addr &branch_addr, void * &bp_history)
#if 0
// Speculative update.
if (taken) {
- DPRINTF(Fetch, "Branch predictor: Branch updated as taken.\n");
+ DPRINTF(Fetch, "Branch updated as taken.\n");
localCtrs[local_predictor_idx].increment();
} else {
- DPRINTF(Fetch, "Branch predictor: Branch updated as not taken.\n");
+ DPRINTF(Fetch, "Branch updated as not taken.\n");
localCtrs[local_predictor_idx].decrement();
}
#endif
@@ -119,7 +118,7 @@ LocalBP::lookup(Addr &branch_addr, void * &bp_history)
}
void
-LocalBP::update(Addr &branch_addr, bool taken, void *bp_history)
+LocalBP::update(Addr branch_addr, bool taken, void *bp_history, bool squashed)
{
assert(bp_history == NULL);
unsigned local_predictor_idx;
@@ -127,14 +126,13 @@ LocalBP::update(Addr &branch_addr, bool taken, void *bp_history)
// Update the local predictor.
local_predictor_idx = getLocalIndex(branch_addr);
- DPRINTF(Fetch, "Branch predictor: Looking up index %#x\n",
- local_predictor_idx);
+ DPRINTF(Fetch, "Looking up index %#x\n", local_predictor_idx);
if (taken) {
- DPRINTF(Fetch, "Branch predictor: Branch updated as taken.\n");
+ DPRINTF(Fetch, "Branch updated as taken.\n");
localCtrs[local_predictor_idx].increment();
} else {
- DPRINTF(Fetch, "Branch predictor: Branch updated as not taken.\n");
+ DPRINTF(Fetch, "Branch updated as not taken.\n");
localCtrs[local_predictor_idx].decrement();
}
}
@@ -153,3 +151,8 @@ LocalBP::getLocalIndex(Addr &branch_addr)
{
return (branch_addr >> instShiftAmt) & indexMask;
}
+
+void
+LocalBP::uncondBranch(void *&bp_history)
+{
+}