43#ifndef __CPU_PRED_STATISTICAL_CORRECTOR_HH__
44#define __CPU_PRED_STATISTICAL_CORRECTOR_HH__
54struct StatisticalCorrectorParams;
63 inline void ctrUpdate(T & ctr,
bool taken,
int nbits) {
64 assert(nbits <=
sizeof(T) << 3);
67 if (ctr < ((1 << (nbits - 1)) - 1))
70 if (ctr > -(1 << (nbits - 1)))
111 unsigned idx = ordinal - 1;
118 unsigned idx = ordinal - 1;
123 int ordinal,
Addr branch_pc,
bool taken,
Addr extraXor = 0)
126 unsigned idx = ordinal - 1;
128 unsigned entry =
getEntry(branch_pc, idx);
132 hist = hist ^ extraXor;
146 return (shifted_pc ^ (shifted_pc >>
shifts[idx]))
268 bool prev_pred_taken,
bool bias_bit,
bool use_conf_ctr,
269 int8_t conf_ctr,
unsigned conf_bits,
int hitBank,
int altBank,
287 int8_t conf_ctr,
unsigned conf_bits,
int hitBank,
int altBank);
289 int64_t
gIndex(
Addr branch_pc, int64_t bhist,
int logs,
int nbr,
int i);
310 bool taken,
Addr target, int64_t phist);
313 Addr branch_pc,
bool speculative,
323 void init()
override;
328 int hitBank,
int altBank);
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,...
const unsigned logSizeUps
void initGEHLTable(unsigned numLenghts, std::vector< int > lengths, std::vector< int8_t > *&table, unsigned logNumEntries, std::vector< int8_t > &w, int8_t wInitValue)
virtual int gPredictions(ThreadID tid, Addr branch_pc, BranchInfo *bi, int &lsum)=0
std::vector< int8_t > * lgehl
gem5::branch_prediction::StatisticalCorrector::StatisticalCorrectorStats stats
void updateStats(bool taken, BranchInfo *bi)
virtual bool scRestoreHistState(BranchInfo *bi)
virtual unsigned getIndBiasSK(Addr branch_pc, BranchInfo *bi) const
int gPredict(Addr branch_pc, int64_t hist, std::vector< int > &length, std::vector< int8_t > *tab, int nbr, int logs, std::vector< int8_t > &w)
const unsigned scCountersWidth
const unsigned numEntriesFirstLocalHistories
virtual void scHistoryUpdate(Addr branch_pc, const StaticInstPtr &inst, bool taken, Addr target, int64_t phist)
virtual void scRecordHistState(Addr branch_pc, BranchInfo *bi)
StatisticalCorrector(const StatisticalCorrectorParams &p)
const unsigned instShiftAmt
virtual unsigned getIndUpd(Addr branch_pc) const
const bool speculativeHistUpdate
int calcBias(Addr branch_pc, BranchInfo *bi, bool bias_bit, bool use_conf_ctr, int8_t conf_ctr, unsigned conf_bits, int hitBank, int altBank)
virtual unsigned getIndBias(Addr branch_pc, BranchInfo *bi, bool b) const
void ctrUpdate(T &ctr, bool taken, int nbits)
void updateHistories(Addr branch_pc, bool speculative, const StaticInstPtr &inst, bool taken, BranchInfo *bi, Addr target, int64_t phist)
const unsigned extraWeightsWidth
SCThreadHistory * scHistory
const unsigned chooserConfWidth
virtual size_t getSizeInBits() const
virtual void gUpdate(Addr branch_pc, bool taken, int64_t hist, std::vector< int > &length, std::vector< int8_t > *tab, int nbr, int logs, std::vector< int8_t > &w, BranchInfo *bi)
std::vector< int8_t > biasSK
std::vector< int8_t > * bwgehl
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
std::vector< int8_t > biasBank
std::vector< int > pUpdateThreshold
virtual unsigned getIndBiasBank(Addr branch_pc, BranchInfo *bi, int hitBank, int altBank) const =0
virtual SCThreadHistory * makeThreadHistory()
virtual void condBranchUpdate(ThreadID tid, Addr branch_pc, bool taken, BranchInfo *bi, Addr corrTarget, bool bias_bit, int hitBank, int altBank)
unsigned getIndUpds(Addr branch_pc) const
std::vector< int8_t > wbw
virtual bool scPredict(ThreadID tid, Addr branch_pc, bool cond_branch, BranchInfo *bi, bool prev_pred_taken, bool bias_bit, bool use_conf_ctr, int8_t conf_ctr, unsigned conf_bits, int hitBank, int altBank, int init_lsum=0)
const unsigned updateThresholdWidth
virtual int gIndexLogsSubstr(int nbr, int i)=0
int64_t gIndex(Addr branch_pc, int64_t bhist, int logs, int nbr, int i)
std::vector< int8_t > * igehl
static const int MaxOrdinalHistories
virtual BranchInfo * makeBranchInfo()
std::vector< int8_t > bias
const unsigned pUpdateThresholdWidth
virtual void gUpdates(ThreadID tid, Addr pc, bool taken, BranchInfo *bi)=0
This is a simple scalar statistic, like a counter.
static constexpr bool isPowerOf2(const T &n)
SimObject(const Params &p)
Copyright (c) 2024 Arm Limited All rights reserved.
int16_t ThreadID
Thread index/ID type.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
RefCountingPtr< StaticInst > StaticInstPtr
Declaration of Statistics objects.
int64_t localHistories[MaxOrdinalHistories]
std::vector< int64_t > * localHistories
std::vector< int > shifts
unsigned getEntry(Addr pc, unsigned idx)
void initLocalHistory(int ordinal, int numHistories, int shift)
SCThreadHistory(unsigned instShiftAmt)
const unsigned instShiftAmt
void updateLocalHistory(int ordinal, Addr branch_pc, bool taken, Addr extraXor=0)
void setLocalHistory(int ordinal, Addr pc, int64_t value)
unsigned numOrdinalHistories
void setNumOrdinalHistories(unsigned num)
int64_t getLocalHistory(int ordinal, Addr pc)
statistics::Scalar correct
StatisticalCorrectorStats(statistics::Group *parent)