ltage.hh (13493:91ae6168ef27) | ltage.hh (13626:d6a6358aa6db) |
---|---|
1/* 2 * Copyright (c) 2014 The University of Wisconsin 3 * 4 * Copyright (c) 2006 INRIA (Institut National de Recherche en 5 * Informatique et en Automatique / French National Research Institute 6 * for Computer Science and Applied Mathematics) 7 * 8 * All rights reserved. --- 52 unchanged lines hidden (view full) --- 61 62class LTAGE: public TAGE 63{ 64 public: 65 LTAGE(const LTAGEParams *params); 66 67 // Base class methods. 68 void squash(ThreadID tid, void *bp_history) override; | 1/* 2 * Copyright (c) 2014 The University of Wisconsin 3 * 4 * Copyright (c) 2006 INRIA (Institut National de Recherche en 5 * Informatique et en Automatique / French National Research Institute 6 * for Computer Science and Applied Mathematics) 7 * 8 * All rights reserved. --- 52 unchanged lines hidden (view full) --- 61 62class LTAGE: public TAGE 63{ 64 public: 65 LTAGE(const LTAGEParams *params); 66 67 // Base class methods. 68 void squash(ThreadID tid, void *bp_history) override; |
69 void update(ThreadID tid, Addr branch_addr, bool taken, void *bp_history, 70 bool squashed, const StaticInstPtr & inst, 71 Addr corrTarget) override; |
|
69 70 void regStats() override; 71 72 private: 73 // Prediction Structures 74 // Loop Predictor Entry 75 struct LoopEntry 76 { --- 6 unchanged lines hidden (view full) --- 83 bool dir; // only for useDirectionBit 84 85 LoopEntry() : numIter(0), currentIter(0), currentIterSpec(0), 86 confidence(0), tag(0), age(0), dir(0) { } 87 }; 88 89 // more provider types 90 enum { | 72 73 void regStats() override; 74 75 private: 76 // Prediction Structures 77 // Loop Predictor Entry 78 struct LoopEntry 79 { --- 6 unchanged lines hidden (view full) --- 86 bool dir; // only for useDirectionBit 87 88 LoopEntry() : numIter(0), currentIter(0), currentIterSpec(0), 89 confidence(0), tag(0), age(0), dir(0) { } 90 }; 91 92 // more provider types 93 enum { |
91 LOOP = LAST_TAGE_PROVIDER_TYPE + 1 | 94 LOOP = TAGEBase::LAST_TAGE_PROVIDER_TYPE + 1 |
92 }; 93 94 // Primary branch history entry 95 struct LTageBranchInfo : public TageBranchInfo 96 { 97 uint16_t loopTag; 98 uint16_t currentIter; 99 100 bool loopPred; 101 bool loopPredValid; 102 int loopIndex; 103 int loopLowPcBits; // only for useHashing 104 int loopHit; 105 | 95 }; 96 97 // Primary branch history entry 98 struct LTageBranchInfo : public TageBranchInfo 99 { 100 uint16_t loopTag; 101 uint16_t currentIter; 102 103 bool loopPred; 104 bool loopPredValid; 105 int loopIndex; 106 int loopLowPcBits; // only for useHashing 107 int loopHit; 108 |
106 LTageBranchInfo(int sz) 107 : TageBranchInfo(sz), | 109 LTageBranchInfo(TAGEBase &tage) 110 : TageBranchInfo(tage), |
108 loopTag(0), currentIter(0), 109 loopPred(false), 110 loopPredValid(false), loopIndex(0), loopLowPcBits(0), loopHit(0) 111 {} | 111 loopTag(0), currentIter(0), 112 loopPred(false), 113 loopPredValid(false), loopIndex(0), loopLowPcBits(0), loopHit(0) 114 {} |
115 116 virtual ~LTageBranchInfo() 117 {} |
|
112 }; 113 114 /** 115 * Computes the index used to access the 116 * loop predictor. 117 * @param pc_in The unshifted branch PC. 118 */ 119 int lindex(Addr pc_in) const; --- 32 unchanged lines hidden (view full) --- 152 * iteration count (only for useSpeculation). 153 * @param taken The predicted branch outcome. 154 * @param bi Pointer to information on the prediction 155 * recorded at prediction time. 156 */ 157 void specLoopUpdate(bool taken, LTageBranchInfo* bi); 158 159 /** | 118 }; 119 120 /** 121 * Computes the index used to access the 122 * loop predictor. 123 * @param pc_in The unshifted branch PC. 124 */ 125 int lindex(Addr pc_in) const; --- 32 unchanged lines hidden (view full) --- 158 * iteration count (only for useSpeculation). 159 * @param taken The predicted branch outcome. 160 * @param bi Pointer to information on the prediction 161 * recorded at prediction time. 162 */ 163 void specLoopUpdate(bool taken, LTageBranchInfo* bi); 164 165 /** |
160 * Update LTAGE for conditional branches. 161 * @param branch_pc The unshifted branch PC. 162 * @param taken Actual branch outcome. 163 * @param bi Pointer to information on the prediction 164 * recorded at prediction time. 165 * @nrand Random int number from 0 to 3 166 */ 167 void condBranchUpdate( 168 Addr branch_pc, bool taken, TageBranchInfo* bi, int nrand) override; 169 170 /** | |
171 * Get a branch prediction from LTAGE. *NOT* an override of 172 * BpredUnit::predict(). 173 * @param tid The thread ID to select the global 174 * histories to use. 175 * @param branch_pc The unshifted branch PC. 176 * @param cond_branch True if the branch is conditional. 177 * @param b Reference to wrapping pointer to allow storing 178 * derived class prediction information in the base class. 179 */ 180 bool predict( 181 ThreadID tid, Addr branch_pc, bool cond_branch, void* &b) override; 182 183 /** 184 * Restores speculatively updated path and direction histories. 185 * Also recomputes compressed (folded) histories based on the 186 * correct branch outcome. | 166 * Get a branch prediction from LTAGE. *NOT* an override of 167 * BpredUnit::predict(). 168 * @param tid The thread ID to select the global 169 * histories to use. 170 * @param branch_pc The unshifted branch PC. 171 * @param cond_branch True if the branch is conditional. 172 * @param b Reference to wrapping pointer to allow storing 173 * derived class prediction information in the base class. 174 */ 175 bool predict( 176 ThreadID tid, Addr branch_pc, bool cond_branch, void* &b) override; 177 178 /** 179 * Restores speculatively updated path and direction histories. 180 * Also recomputes compressed (folded) histories based on the 181 * correct branch outcome. |
187 * This version of squash() is called once on a branch misprediction. 188 * @param tid The Thread ID to select the histories to rollback. 189 * @param taken The correct branch outcome. 190 * @param bp_history Wrapping pointer to TageBranchInfo (to allow 191 * storing derived class prediction information in the 192 * base class). 193 * @post bp_history points to valid memory. | 182 * @param bi Branch information. |
194 */ | 183 */ |
195 void squash( 196 ThreadID tid, bool taken, void *bp_history) override; | 184 void squashLoop(LTageBranchInfo * bi); |
197 | 185 |
198 /** 199 * Update the stats 200 * @param taken Actual branch outcome 201 * @param bi Pointer to information on the prediction 202 * recorded at prediction time. 203 */ 204 void updateStats(bool taken, TageBranchInfo* bi) override; 205 | |
206 const unsigned logSizeLoopPred; 207 const unsigned loopTableAgeBits; 208 const unsigned loopTableConfidenceBits; 209 const unsigned loopTableTagBits; 210 const unsigned loopTableIterBits; 211 const unsigned logLoopTableAssoc; 212 const uint8_t confidenceThreshold; 213 const uint16_t loopTagMask; --- 18 unchanged lines hidden --- | 186 const unsigned logSizeLoopPred; 187 const unsigned loopTableAgeBits; 188 const unsigned loopTableConfidenceBits; 189 const unsigned loopTableTagBits; 190 const unsigned loopTableIterBits; 191 const unsigned logLoopTableAssoc; 192 const uint8_t confidenceThreshold; 193 const uint16_t loopTagMask; --- 18 unchanged lines hidden --- |