diff options
Diffstat (limited to 'src/cpu/pred/ltage.hh')
-rw-r--r-- | src/cpu/pred/ltage.hh | 300 |
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; }; |