54a55
>
58c59
< #include "cpu/pred/bpred_unit.hh"
---
> #include "cpu/pred/tage.hh"
61c62
< class LTAGE: public BPredUnit
---
> class LTAGE: public TAGE
67,71d67
< 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;
73d68
< unsigned getGHR(ThreadID tid, void *bp_history) const override;
92,127d86
< // 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;
< }
< };
<
129c88
< struct BranchInfo
---
> struct LTageBranchInfo : public TageBranchInfo
131,137d89
< int pathHist;
< int ptGhist;
< int hitBank;
< int hitBankIndex;
< int altBank;
< int altBankIndex;
< int bimodalIndex;
141,142d92
< bool tagePred;
< bool altTaken;
147,150d96
< bool condBranch;
< bool longestMatchPred;
< bool pseudoNewAlloc;
< Addr branchPC;
152,186c98,103
< // 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)
> {}
191,197d107
< * bimodal table.
< * @param pc_in The unshifted branch PC.
< */
< int bindex(Addr pc_in) const;
<
< /**
< * Computes the index used to access the
204,267d113
< * 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);
<
< /**
274c120
< bool getLoop(Addr pc, BranchInfo* bi) const;
---
> bool getLoop(Addr pc, LTageBranchInfo* bi) const;
283c129
< void loopUpdate(Addr pc, bool Taken, BranchInfo* bi);
---
> void loopUpdate(Addr pc, bool Taken, LTageBranchInfo* bi);
285,293c131,139
< /**
< * (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);
---
> /**
> * 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, LTageBranchInfo* bi);
296c142,153
< * Get a branch prediction from L-TAGE. *NOT* an override of
---
> * 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 condBranchUpdate(
> Addr branch_pc, bool taken, TageBranchInfo* bi, int nrand) override;
>
> /**
> * Get a branch prediction from LTAGE. *NOT* an override of
305c162,163
< bool predict(ThreadID tid, Addr branch_pc, bool cond_branch, void* &b);
---
> bool predict(
> ThreadID tid, Addr branch_pc, bool cond_branch, void* &b) override;
308,333d165
< * 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.
< * @param branch_pc The unshifted branch PC.
< * @param taken Actual branch outcome.
< * @param bi Pointer to information on the prediction
< * recorded at prediction time.
< */
< void update(ThreadID tid, Addr branch_pc, bool taken, BranchInfo* bi);
<
< /**
< * (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);
<
< /**
340c172
< * @param bp_history Wrapping pointer to BranchInfo (to allow
---
> * @param bp_history Wrapping pointer to TageBranchInfo (to allow
345c177,178
< void squash(ThreadID tid, bool taken, void *bp_history);
---
> void squash(
> ThreadID tid, bool taken, void *bp_history) override;
347,357d179
< /**
< * 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);
<
< const unsigned logRatioBiModalHystEntries;
359,365d180
< const unsigned nHistoryTables;
< const unsigned tagTableCounterBits;
< const unsigned tagTableUBits;
< const unsigned histBufferSize;
< const unsigned minHist;
< const unsigned maxHist;
< const unsigned pathHistBits;
375,380d189
< const std::vector<unsigned> tagTableTagWidths;
< const std::vector<int> logTagTableSizes;
<
< std::vector<bool> btablePrediction;
< std::vector<bool> btableHysteresis;
< TageEntry **gtable;
383,411d191
< // 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;
<
413,416d192
< int8_t useAltPredForNewlyAllocated;
< uint64_t tCounter;
< uint64_t logUResetPeriod;
< unsigned useAltOnNaBits;