summaryrefslogtreecommitdiff
path: root/src/cpu/pred/ltage.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/pred/ltage.hh')
-rw-r--r--src/cpu/pred/ltage.hh300
1 files changed, 38 insertions, 262 deletions
diff --git a/src/cpu/pred/ltage.hh b/src/cpu/pred/ltage.hh
index 8b417d44d..d614026d2 100644
--- a/src/cpu/pred/ltage.hh
+++ b/src/cpu/pred/ltage.hh
@@ -52,25 +52,20 @@
#ifndef __CPU_PRED_LTAGE
#define __CPU_PRED_LTAGE
+
#include <vector>
#include "base/types.hh"
-#include "cpu/pred/bpred_unit.hh"
+#include "cpu/pred/tage.hh"
#include "params/LTAGE.hh"
-class LTAGE: public BPredUnit
+class LTAGE: public TAGE
{
public:
LTAGE(const LTAGEParams *params);
// Base class methods.
- void uncondBranch(ThreadID tid, Addr br_pc, void* &bp_history) override;
- bool lookup(ThreadID tid, Addr branch_addr, void* &bp_history) override;
- void btbUpdate(ThreadID tid, Addr branch_addr, void* &bp_history) override;
- void update(ThreadID tid, Addr branch_addr, bool taken, void *bp_history,
- bool squashed) override;
void squash(ThreadID tid, void *bp_history) override;
- unsigned getGHR(ThreadID tid, void *bp_history) const override;
private:
// Prediction Structures
@@ -89,189 +84,40 @@ class LTAGE: public BPredUnit
confidence(0), tag(0), age(0), dir(0) { }
};
- // Tage Entry
- struct TageEntry
- {
- int8_t ctr;
- uint16_t tag;
- uint8_t u;
- TageEntry() : ctr(0), tag(0), u(0) { }
- };
-
- // Folded History Table - compressed history
- // to mix with instruction PC to index partially
- // tagged tables.
- struct FoldedHistory
- {
- unsigned comp;
- int compLength;
- int origLength;
- int outpoint;
-
- void init(int original_length, int compressed_length)
- {
- comp = 0;
- origLength = original_length;
- compLength = compressed_length;
- outpoint = original_length % compressed_length;
- }
-
- void update(uint8_t * h)
- {
- comp = (comp << 1) | h[0];
- comp ^= h[origLength] << outpoint;
- comp ^= (comp >> compLength);
- comp &= (ULL(1) << compLength) - 1;
- }
- };
-
// Primary branch history entry
- struct BranchInfo
+ struct LTageBranchInfo : public TageBranchInfo
{
- int pathHist;
- int ptGhist;
- int hitBank;
- int hitBankIndex;
- int altBank;
- int altBankIndex;
- int bimodalIndex;
uint16_t loopTag;
uint16_t currentIter;
- bool tagePred;
- bool altTaken;
bool loopPred;
bool loopPredValid;
int loopIndex;
int loopHit;
- bool condBranch;
- bool longestMatchPred;
- bool pseudoNewAlloc;
- Addr branchPC;
-
- // Pointer to dynamically allocated storage
- // to save table indices and folded histories.
- // To do one call to new instead of five.
- int *storage;
-
- // Pointers to actual saved array within the dynamically
- // allocated storage.
- int *tableIndices;
- int *tableTags;
- int *ci;
- int *ct0;
- int *ct1;
- BranchInfo(int sz)
- : pathHist(0), ptGhist(0),
- hitBank(0), hitBankIndex(0),
- altBank(0), altBankIndex(0),
- bimodalIndex(0), loopTag(0), currentIter(0),
- tagePred(false), altTaken(false), loopPred(false),
- loopPredValid(false), loopIndex(0), loopHit(0),
- condBranch(false), longestMatchPred(false),
- pseudoNewAlloc(false), branchPC(0)
- {
- storage = new int [sz * 5];
- tableIndices = storage;
- tableTags = storage + sz;
- ci = tableTags + sz;
- ct0 = ci + sz;
- ct1 = ct0 + sz;
- }
-
- ~BranchInfo()
- {
- delete[] storage;
- }
+ LTageBranchInfo(int sz)
+ : TageBranchInfo(sz),
+ loopTag(0), currentIter(0),
+ loopPred(false),
+ loopPredValid(false), loopIndex(0), loopHit(0)
+ {}
};
/**
* Computes the index used to access the
- * bimodal table.
- * @param pc_in The unshifted branch PC.
- */
- int bindex(Addr pc_in) const;
-
- /**
- * Computes the index used to access the
* loop predictor.
* @param pc_in The unshifted branch PC.
*/
int lindex(Addr pc_in) const;
/**
- * Computes the index used to access a
- * partially tagged table.
- * @param tid The thread ID used to select the
- * global histories to use.
- * @param pc The unshifted branch PC.
- * @param bank The partially tagged table to access.
- */
- inline int gindex(ThreadID tid, Addr pc, int bank) const;
-
- /**
- * Utility function to shuffle the path history
- * depending on which tagged table we are accessing.
- * @param phist The path history.
- * @param size Number of path history bits to use.
- * @param bank The partially tagged table to access.
- */
- int F(int phist, int size, int bank) const;
-
- /**
- * Computes the partial tag of a tagged table.
- * @param tid the thread ID used to select the
- * global histories to use.
- * @param pc The unshifted branch PC.
- * @param bank The partially tagged table to access.
- */
- inline uint16_t gtag(ThreadID tid, Addr pc, int bank) const;
-
- /**
- * Updates a direction counter based on the actual
- * branch outcome.
- * @param ctr Reference to counter to update.
- * @param taken Actual branch outcome.
- * @param nbits Counter width.
- */
- void ctrUpdate(int8_t & ctr, bool taken, int nbits);
-
- /**
- * Updates an unsigned counter based on up/down parameter
- * @param ctr Reference to counter to update.
- * @param up Boolean indicating if the counter is incremented/decremented
- * If true it is incremented, if false it is decremented
- * @param nbits Counter width.
- */
- void unsignedCtrUpdate(uint8_t & ctr, bool up, unsigned nbits);
-
- /**
- * Get a branch prediction from the bimodal
- * predictor.
- * @param pc The unshifted branch PC.
- * @param bi Pointer to information on the
- * prediction.
- */
- bool getBimodePred(Addr pc, BranchInfo* bi) const;
-
- /**
- * Updates the bimodal predictor.
- * @param pc The unshifted branch PC.
- * @param taken The actual branch outcome.
- * @param bi Pointer to information on the prediction
- * recorded at prediction time.
- */
- void baseUpdate(Addr pc, bool taken, BranchInfo* bi);
-
- /**
* Get a branch prediction from the loop
* predictor.
* @param pc The unshifted branch PC.
* @param bi Pointer to information on the
* prediction.
*/
- bool getLoop(Addr pc, BranchInfo* bi) const;
+ bool getLoop(Addr pc, LTageBranchInfo* bi) const;
/**
* Updates the loop predictor.
@@ -280,55 +126,41 @@ class LTAGE: public BPredUnit
* @param bi Pointer to information on the
* prediction recorded at prediction time.
*/
- void loopUpdate(Addr pc, bool Taken, BranchInfo* bi);
-
- /**
- * (Speculatively) updates the global branch history.
- * @param h Reference to pointer to global branch history.
- * @param dir (Predicted) outcome to update the histories
- * with.
- * @param tab
- * @param PT Reference to path history.
- */
- void updateGHist(uint8_t * &h, bool dir, uint8_t * tab, int &PT);
+ void loopUpdate(Addr pc, bool Taken, LTageBranchInfo* bi);
/**
- * Get a branch prediction from L-TAGE. *NOT* an override of
- * BpredUnit::predict().
- * @param tid The thread ID to select the global
- * histories to use.
- * @param branch_pc The unshifted branch PC.
- * @param cond_branch True if the branch is conditional.
- * @param b Reference to wrapping pointer to allow storing
- * derived class prediction information in the base class.
+ * Speculatively updates the loop predictor
+ * iteration count.
+ * @param pc The unshifted branch PC.
+ * @param taken The predicted branch outcome.
+ * @param bi Pointer to information on the prediction
+ * recorded at prediction time.
*/
- bool predict(ThreadID tid, Addr branch_pc, bool cond_branch, void* &b);
+ void specLoopUpdate(Addr pc, bool taken, LTageBranchInfo* bi);
/**
- * Update L-TAGE. Called at execute to repair histories on a misprediction
- * and at commit to update the tables.
- * @param tid The thread ID to select the global
- * histories to use.
+ * Update LTAGE for conditional branches.
* @param branch_pc The unshifted branch PC.
* @param taken Actual branch outcome.
* @param bi Pointer to information on the prediction
* recorded at prediction time.
+ * @nrand Random int number from 0 to 3
*/
- void update(ThreadID tid, Addr branch_pc, bool taken, BranchInfo* bi);
+ void condBranchUpdate(
+ Addr branch_pc, bool taken, TageBranchInfo* bi, int nrand) override;
- /**
- * (Speculatively) updates global histories (path and direction).
- * Also recomputes compressed (folded) histories based on the
- * branch direction.
- * @param tid The thread ID to select the histories
- * to update.
- * @param branch_pc The unshifted branch PC.
- * @param taken (Predicted) branch direction.
- * @param b Wrapping pointer to BranchInfo (to allow
- * storing derived class prediction information in the
- * base class).
- */
- void updateHistories(ThreadID tid, Addr branch_pc, bool taken, void* b);
+ /**
+ * Get a branch prediction from LTAGE. *NOT* an override of
+ * BpredUnit::predict().
+ * @param tid The thread ID to select the global
+ * histories to use.
+ * @param branch_pc The unshifted branch PC.
+ * @param cond_branch True if the branch is conditional.
+ * @param b Reference to wrapping pointer to allow storing
+ * derived class prediction information in the base class.
+ */
+ bool predict(
+ ThreadID tid, Addr branch_pc, bool cond_branch, void* &b) override;
/**
* Restores speculatively updated path and direction histories.
@@ -337,32 +169,15 @@ class LTAGE: public BPredUnit
* This version of squash() is called once on a branch misprediction.
* @param tid The Thread ID to select the histories to rollback.
* @param taken The correct branch outcome.
- * @param bp_history Wrapping pointer to BranchInfo (to allow
+ * @param bp_history Wrapping pointer to TageBranchInfo (to allow
* storing derived class prediction information in the
* base class).
* @post bp_history points to valid memory.
*/
- void squash(ThreadID tid, bool taken, void *bp_history);
-
- /**
- * Speculatively updates the loop predictor
- * iteration count.
- * @param pc The unshifted branch PC.
- * @param taken The predicted branch outcome.
- * @param bi Pointer to information on the prediction
- * recorded at prediction time.
- */
- void specLoopUpdate(Addr pc, bool taken, BranchInfo* bi);
+ void squash(
+ ThreadID tid, bool taken, void *bp_history) override;
- const unsigned logRatioBiModalHystEntries;
const unsigned logSizeLoopPred;
- const unsigned nHistoryTables;
- const unsigned tagTableCounterBits;
- const unsigned tagTableUBits;
- const unsigned histBufferSize;
- const unsigned minHist;
- const unsigned maxHist;
- const unsigned pathHistBits;
const unsigned loopTableAgeBits;
const unsigned loopTableConfidenceBits;
const unsigned loopTableTagBits;
@@ -372,48 +187,9 @@ class LTAGE: public BPredUnit
const uint16_t loopTagMask;
const uint16_t loopNumIterMask;
- const std::vector<unsigned> tagTableTagWidths;
- const std::vector<int> logTagTableSizes;
-
- std::vector<bool> btablePrediction;
- std::vector<bool> btableHysteresis;
- TageEntry **gtable;
LoopEntry *ltable;
- // Keep per-thread histories to
- // support SMT.
- struct ThreadHistory {
- // Speculative path history
- // (LSB of branch address)
- int pathHist;
-
- // Speculative branch direction
- // history (circular buffer)
- // @TODO Convert to std::vector<bool>
- uint8_t *globalHistory;
-
- // Pointer to most recent branch outcome
- uint8_t* gHist;
-
- // Index to most recent branch outcome
- int ptGhist;
-
- // Speculative folded histories.
- FoldedHistory *computeIndices;
- FoldedHistory *computeTags[2];
- };
-
- std::vector<ThreadHistory> threadHistory;
-
- int *histLengths;
- int *tableIndices;
- int *tableTags;
-
int8_t loopUseCounter;
- int8_t useAltPredForNewlyAllocated;
- uint64_t tCounter;
- uint64_t logUResetPeriod;
- unsigned useAltOnNaBits;
unsigned withLoopBits;
};