113685Sjavier.bueno@metempsy.com/* 213685Sjavier.bueno@metempsy.com * Copyright (c) 2018 Metempsy Technology Consulting 313685Sjavier.bueno@metempsy.com * All rights reserved. 413685Sjavier.bueno@metempsy.com * 513685Sjavier.bueno@metempsy.com * Copyright (c) 2006 INRIA (Institut National de Recherche en 613685Sjavier.bueno@metempsy.com * Informatique et en Automatique / French National Research Institute 713685Sjavier.bueno@metempsy.com * for Computer Science and Applied Mathematics) 813685Sjavier.bueno@metempsy.com * 913685Sjavier.bueno@metempsy.com * All rights reserved. 1013685Sjavier.bueno@metempsy.com * 1113685Sjavier.bueno@metempsy.com * Redistribution and use in source and binary forms, with or without 1213685Sjavier.bueno@metempsy.com * modification, are permitted provided that the following conditions are 1313685Sjavier.bueno@metempsy.com * met: redistributions of source code must retain the above copyright 1413685Sjavier.bueno@metempsy.com * notice, this list of conditions and the following disclaimer; 1513685Sjavier.bueno@metempsy.com * redistributions in binary form must reproduce the above copyright 1613685Sjavier.bueno@metempsy.com * notice, this list of conditions and the following disclaimer in the 1713685Sjavier.bueno@metempsy.com * documentation and/or other materials provided with the distribution; 1813685Sjavier.bueno@metempsy.com * neither the name of the copyright holders nor the names of its 1913685Sjavier.bueno@metempsy.com * contributors may be used to endorse or promote products derived from 2013685Sjavier.bueno@metempsy.com * this software without specific prior written permission. 2113685Sjavier.bueno@metempsy.com * 2213685Sjavier.bueno@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2313685Sjavier.bueno@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2413685Sjavier.bueno@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2513685Sjavier.bueno@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2613685Sjavier.bueno@metempsy.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2713685Sjavier.bueno@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2813685Sjavier.bueno@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2913685Sjavier.bueno@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3013685Sjavier.bueno@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3113685Sjavier.bueno@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3213685Sjavier.bueno@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3313685Sjavier.bueno@metempsy.com * 3413685Sjavier.bueno@metempsy.com * Author: André Seznec, Pau Cabre, Javier Bueno 3513685Sjavier.bueno@metempsy.com * 3613685Sjavier.bueno@metempsy.com */ 3713685Sjavier.bueno@metempsy.com 3813685Sjavier.bueno@metempsy.com/* 3913685Sjavier.bueno@metempsy.com * Statistical corrector base class 4013685Sjavier.bueno@metempsy.com */ 4113685Sjavier.bueno@metempsy.com 4213685Sjavier.bueno@metempsy.com #include "cpu/pred/statistical_corrector.hh" 4313685Sjavier.bueno@metempsy.com 4413685Sjavier.bueno@metempsy.com #include "params/StatisticalCorrector.hh" 4513685Sjavier.bueno@metempsy.com 4613685Sjavier.bueno@metempsy.com StatisticalCorrector::StatisticalCorrector( 4713685Sjavier.bueno@metempsy.com const StatisticalCorrectorParams *p) 4813685Sjavier.bueno@metempsy.com : SimObject(p), 4913685Sjavier.bueno@metempsy.com logBias(p->logBias), 5013685Sjavier.bueno@metempsy.com logSizeUp(p->logSizeUp), 5113685Sjavier.bueno@metempsy.com logSizeUps(logSizeUp / 2), 5213685Sjavier.bueno@metempsy.com numEntriesFirstLocalHistories(p->numEntriesFirstLocalHistories), 5313685Sjavier.bueno@metempsy.com bwnb(p->bwnb), 5413685Sjavier.bueno@metempsy.com logBwnb(p->logBwnb), 5513685Sjavier.bueno@metempsy.com bwm(p->bwm), 5613685Sjavier.bueno@metempsy.com lnb(p->lnb), 5713685Sjavier.bueno@metempsy.com logLnb(p->logLnb), 5813685Sjavier.bueno@metempsy.com lm(p->lm), 5913685Sjavier.bueno@metempsy.com inb(p->inb), 6013685Sjavier.bueno@metempsy.com logInb(p->logInb), 6113685Sjavier.bueno@metempsy.com im(p->im), 6213685Sjavier.bueno@metempsy.com chooserConfWidth(p->chooserConfWidth), 6313685Sjavier.bueno@metempsy.com updateThresholdWidth(p->updateThresholdWidth), 6413685Sjavier.bueno@metempsy.com pUpdateThresholdWidth(p->pUpdateThresholdWidth), 6513685Sjavier.bueno@metempsy.com extraWeightsWidth(p->extraWeightsWidth), 6613685Sjavier.bueno@metempsy.com scCountersWidth(p->scCountersWidth), 6713685Sjavier.bueno@metempsy.com firstH(0), 6813685Sjavier.bueno@metempsy.com secondH(0) 6913685Sjavier.bueno@metempsy.com{ 7013685Sjavier.bueno@metempsy.com wb.resize(1 << logSizeUps, 4); 7113685Sjavier.bueno@metempsy.com 7214081Sjavier.bueno@metempsy.com initGEHLTable(lnb, lm, lgehl, logLnb, wl, p->lWeightInitValue); 7314081Sjavier.bueno@metempsy.com initGEHLTable(bwnb, bwm, bwgehl, logBwnb, wbw, p->bwWeightInitValue); 7414081Sjavier.bueno@metempsy.com initGEHLTable(inb, im, igehl, logInb, wi, p->iWeightInitValue); 7513685Sjavier.bueno@metempsy.com 7613685Sjavier.bueno@metempsy.com updateThreshold = 35 << 3; 7713685Sjavier.bueno@metempsy.com 7814081Sjavier.bueno@metempsy.com pUpdateThreshold.resize(1 << logSizeUp, p->initialUpdateThresholdValue); 7913685Sjavier.bueno@metempsy.com 8013685Sjavier.bueno@metempsy.com bias.resize(1 << logBias); 8113685Sjavier.bueno@metempsy.com biasSK.resize(1 << logBias); 8213685Sjavier.bueno@metempsy.com biasBank.resize(1 << logBias); 8314081Sjavier.bueno@metempsy.com} 8414081Sjavier.bueno@metempsy.com 8514081Sjavier.bueno@metempsy.comStatisticalCorrector::BranchInfo* 8614081Sjavier.bueno@metempsy.comStatisticalCorrector::makeBranchInfo() 8714081Sjavier.bueno@metempsy.com{ 8814081Sjavier.bueno@metempsy.com return new BranchInfo(); 8914081Sjavier.bueno@metempsy.com} 9014081Sjavier.bueno@metempsy.com 9114081Sjavier.bueno@metempsy.comStatisticalCorrector::SCThreadHistory* 9214081Sjavier.bueno@metempsy.comStatisticalCorrector::makeThreadHistory() 9314081Sjavier.bueno@metempsy.com{ 9414081Sjavier.bueno@metempsy.com return new SCThreadHistory(); 9514081Sjavier.bueno@metempsy.com} 9614081Sjavier.bueno@metempsy.com 9714081Sjavier.bueno@metempsy.comvoid 9814081Sjavier.bueno@metempsy.comStatisticalCorrector::initBias() 9914081Sjavier.bueno@metempsy.com{ 10013685Sjavier.bueno@metempsy.com for (int j = 0; j < (1 << logBias); j++) { 10113685Sjavier.bueno@metempsy.com switch (j & 3) { 10213685Sjavier.bueno@metempsy.com case 0: 10313685Sjavier.bueno@metempsy.com bias[j] = -32; 10413685Sjavier.bueno@metempsy.com biasSK[j] = -8; 10513685Sjavier.bueno@metempsy.com biasBank[j] = -32; 10613685Sjavier.bueno@metempsy.com break; 10713685Sjavier.bueno@metempsy.com case 1: 10813685Sjavier.bueno@metempsy.com bias[j] = 31; 10913685Sjavier.bueno@metempsy.com biasSK[j] = 7; 11013685Sjavier.bueno@metempsy.com biasBank[j] = 31; 11113685Sjavier.bueno@metempsy.com break; 11213685Sjavier.bueno@metempsy.com case 2: 11313685Sjavier.bueno@metempsy.com bias[j] = -1; 11413685Sjavier.bueno@metempsy.com biasSK[j] = -32; 11513685Sjavier.bueno@metempsy.com biasBank[j] = -1; 11613685Sjavier.bueno@metempsy.com break; 11713685Sjavier.bueno@metempsy.com case 3: 11813685Sjavier.bueno@metempsy.com bias[j] = 0; 11913685Sjavier.bueno@metempsy.com biasSK[j] = 31; 12013685Sjavier.bueno@metempsy.com biasBank[j] = 0; 12113685Sjavier.bueno@metempsy.com break; 12213685Sjavier.bueno@metempsy.com } 12313685Sjavier.bueno@metempsy.com } 12413685Sjavier.bueno@metempsy.com} 12513685Sjavier.bueno@metempsy.com 12613685Sjavier.bueno@metempsy.comvoid 12713685Sjavier.bueno@metempsy.comStatisticalCorrector::initGEHLTable(unsigned numLenghts, 12813685Sjavier.bueno@metempsy.com std::vector<int> lengths, std::vector<int8_t> * & table, 12913685Sjavier.bueno@metempsy.com unsigned logNumEntries, std::vector<int8_t> & w, int8_t wInitValue) 13013685Sjavier.bueno@metempsy.com{ 13113685Sjavier.bueno@metempsy.com assert(lengths.size() == numLenghts); 13213685Sjavier.bueno@metempsy.com if (numLenghts == 0) { 13313685Sjavier.bueno@metempsy.com return; 13413685Sjavier.bueno@metempsy.com } 13513685Sjavier.bueno@metempsy.com table = new std::vector<int8_t> [numLenghts]; 13613685Sjavier.bueno@metempsy.com for (int i = 0; i < numLenghts; ++i) { 13713685Sjavier.bueno@metempsy.com table[i].resize(1 << logNumEntries, 0); 13813685Sjavier.bueno@metempsy.com for (int j = 0; j < ((1 << logNumEntries) - 1); ++j) { 13913685Sjavier.bueno@metempsy.com if (! (j & 1)) { 14013685Sjavier.bueno@metempsy.com table[i][j] = -1; 14113685Sjavier.bueno@metempsy.com } 14213685Sjavier.bueno@metempsy.com } 14313685Sjavier.bueno@metempsy.com } 14413685Sjavier.bueno@metempsy.com 14513685Sjavier.bueno@metempsy.com w.resize(1 << logSizeUps, wInitValue); 14613685Sjavier.bueno@metempsy.com} 14713685Sjavier.bueno@metempsy.com 14813685Sjavier.bueno@metempsy.comunsigned 14913685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndBias(Addr branch_pc, BranchInfo* bi, 15013685Sjavier.bueno@metempsy.com bool bias) const 15113685Sjavier.bueno@metempsy.com{ 15213685Sjavier.bueno@metempsy.com return (((((branch_pc ^(branch_pc >>2))<<1) ^ (bi->lowConf & bias)) <<1) 15313685Sjavier.bueno@metempsy.com + bi->predBeforeSC) & ((1<<logBias) -1); 15413685Sjavier.bueno@metempsy.com} 15513685Sjavier.bueno@metempsy.com 15613685Sjavier.bueno@metempsy.comunsigned 15713685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndBiasSK(Addr branch_pc, BranchInfo* bi) const 15813685Sjavier.bueno@metempsy.com{ 15913685Sjavier.bueno@metempsy.com return (((((branch_pc ^ (branch_pc >> (logBias-2)))<<1) ^ 16013685Sjavier.bueno@metempsy.com (bi->highConf))<<1) + bi->predBeforeSC) & ((1<<logBias) -1); 16113685Sjavier.bueno@metempsy.com} 16213685Sjavier.bueno@metempsy.com 16313685Sjavier.bueno@metempsy.comunsigned 16413685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndUpd(Addr branch_pc) const 16513685Sjavier.bueno@metempsy.com{ 16613685Sjavier.bueno@metempsy.com return ((branch_pc ^ (branch_pc >>2)) & ((1 << (logSizeUp)) - 1)); 16713685Sjavier.bueno@metempsy.com} 16813685Sjavier.bueno@metempsy.com 16913685Sjavier.bueno@metempsy.comunsigned 17013685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndUpds(Addr branch_pc) const 17113685Sjavier.bueno@metempsy.com{ 17213685Sjavier.bueno@metempsy.com return ((branch_pc ^ (branch_pc >>2)) & ((1 << (logSizeUps)) - 1)); 17313685Sjavier.bueno@metempsy.com} 17413685Sjavier.bueno@metempsy.com 17513685Sjavier.bueno@metempsy.comint64_t 17613685Sjavier.bueno@metempsy.comStatisticalCorrector::gIndex(Addr branch_pc, int64_t bhist, int logs, int nbr, 17713685Sjavier.bueno@metempsy.com int i) 17813685Sjavier.bueno@metempsy.com{ 17913685Sjavier.bueno@metempsy.com return (((int64_t) branch_pc) ^ bhist ^ (bhist >> (8 - i)) ^ 18013685Sjavier.bueno@metempsy.com (bhist >> (16 - 2 * i)) ^ (bhist >> (24 - 3 * i)) ^ 18113685Sjavier.bueno@metempsy.com (bhist >> (32 - 3 * i)) ^ (bhist >> (40 - 4 * i))) & 18213685Sjavier.bueno@metempsy.com ((1 << (logs - gIndexLogsSubstr(nbr, i))) - 1); 18313685Sjavier.bueno@metempsy.com} 18413685Sjavier.bueno@metempsy.com 18513685Sjavier.bueno@metempsy.comint 18613685Sjavier.bueno@metempsy.comStatisticalCorrector::gPredict(Addr branch_pc, int64_t hist, 18713685Sjavier.bueno@metempsy.com std::vector<int> & length, std::vector<int8_t> * tab, int nbr, 18813685Sjavier.bueno@metempsy.com int logs, std::vector<int8_t> & w) 18913685Sjavier.bueno@metempsy.com{ 19013685Sjavier.bueno@metempsy.com int percsum = 0; 19113685Sjavier.bueno@metempsy.com for (int i = 0; i < nbr; i++) { 19213685Sjavier.bueno@metempsy.com int64_t bhist = hist & ((int64_t) ((1 << length[i]) - 1)); 19313685Sjavier.bueno@metempsy.com int64_t index = gIndex(branch_pc, bhist, logs, nbr, i); 19413685Sjavier.bueno@metempsy.com int8_t ctr = tab[i][index]; 19513685Sjavier.bueno@metempsy.com percsum += (2 * ctr + 1); 19613685Sjavier.bueno@metempsy.com } 19713685Sjavier.bueno@metempsy.com percsum = (1 + (w[getIndUpds(branch_pc)] >= 0)) * percsum; 19813685Sjavier.bueno@metempsy.com return percsum; 19913685Sjavier.bueno@metempsy.com} 20013685Sjavier.bueno@metempsy.com 20113685Sjavier.bueno@metempsy.comvoid 20213685Sjavier.bueno@metempsy.comStatisticalCorrector::gUpdate(Addr branch_pc, bool taken, int64_t hist, 20313685Sjavier.bueno@metempsy.com std::vector<int> & length, std::vector<int8_t> * tab, 20413685Sjavier.bueno@metempsy.com int nbr, int logs, std::vector<int8_t> & w, 20513685Sjavier.bueno@metempsy.com BranchInfo* bi) 20613685Sjavier.bueno@metempsy.com{ 20713685Sjavier.bueno@metempsy.com int percsum = 0; 20813685Sjavier.bueno@metempsy.com for (int i = 0; i < nbr; i++) { 20913685Sjavier.bueno@metempsy.com int64_t bhist = hist & ((int64_t) ((1 << length[i]) - 1)); 21013685Sjavier.bueno@metempsy.com int64_t index = gIndex(branch_pc, bhist, logs, nbr, i); 21113685Sjavier.bueno@metempsy.com percsum += (2 * tab[i][index] + 1); 21213685Sjavier.bueno@metempsy.com ctrUpdate(tab[i][index], taken, scCountersWidth); 21313685Sjavier.bueno@metempsy.com } 21413685Sjavier.bueno@metempsy.com 21513685Sjavier.bueno@metempsy.com int xsum = bi->lsum - ((w[getIndUpds(branch_pc)] >= 0)) * percsum; 21613685Sjavier.bueno@metempsy.com if ((xsum + percsum >= 0) != (xsum >= 0)) { 21713685Sjavier.bueno@metempsy.com ctrUpdate(w[getIndUpds(branch_pc)], ((percsum >= 0) == taken), 21813685Sjavier.bueno@metempsy.com extraWeightsWidth); 21913685Sjavier.bueno@metempsy.com } 22013685Sjavier.bueno@metempsy.com} 22113685Sjavier.bueno@metempsy.com 22213685Sjavier.bueno@metempsy.combool 22313685Sjavier.bueno@metempsy.comStatisticalCorrector::scPredict(ThreadID tid, Addr branch_pc, bool cond_branch, 22413685Sjavier.bueno@metempsy.com BranchInfo* bi, bool prev_pred_taken, bool bias_bit, 22513685Sjavier.bueno@metempsy.com bool use_conf_ctr, int8_t conf_ctr, unsigned conf_bits, 22614081Sjavier.bueno@metempsy.com int hitBank, int altBank, int64_t phist, int init_lsum) 22713685Sjavier.bueno@metempsy.com{ 22813685Sjavier.bueno@metempsy.com bool pred_taken = prev_pred_taken; 22913685Sjavier.bueno@metempsy.com if (cond_branch) { 23013685Sjavier.bueno@metempsy.com 23113685Sjavier.bueno@metempsy.com bi->predBeforeSC = prev_pred_taken; 23213685Sjavier.bueno@metempsy.com 23313685Sjavier.bueno@metempsy.com // first calc/update the confidences from the TAGE prediction 23413685Sjavier.bueno@metempsy.com if (use_conf_ctr) { 23513685Sjavier.bueno@metempsy.com bi->lowConf = (abs(2 * conf_ctr + 1) == 1); 23613685Sjavier.bueno@metempsy.com bi->medConf = (abs(2 * conf_ctr + 1) == 5); 23713685Sjavier.bueno@metempsy.com bi->highConf = (abs(2 * conf_ctr + 1) >= (1<<conf_bits) - 1); 23813685Sjavier.bueno@metempsy.com } 23913685Sjavier.bueno@metempsy.com 24014081Sjavier.bueno@metempsy.com int lsum = init_lsum; 24113685Sjavier.bueno@metempsy.com 24213685Sjavier.bueno@metempsy.com int8_t ctr = bias[getIndBias(branch_pc, bi, bias_bit)]; 24313685Sjavier.bueno@metempsy.com lsum += (2 * ctr + 1); 24413685Sjavier.bueno@metempsy.com ctr = biasSK[getIndBiasSK(branch_pc, bi)]; 24513685Sjavier.bueno@metempsy.com lsum += (2 * ctr + 1); 24613685Sjavier.bueno@metempsy.com ctr = biasBank[getIndBiasBank(branch_pc, bi, hitBank, altBank)]; 24713685Sjavier.bueno@metempsy.com lsum += (2 * ctr + 1); 24813685Sjavier.bueno@metempsy.com 24913685Sjavier.bueno@metempsy.com lsum = (1 + (wb[getIndUpds(branch_pc)] >= 0)) * lsum; 25013685Sjavier.bueno@metempsy.com 25113685Sjavier.bueno@metempsy.com int thres = gPredictions(tid, branch_pc, bi, lsum, phist); 25213685Sjavier.bueno@metempsy.com 25313685Sjavier.bueno@metempsy.com // These will be needed at update time 25413685Sjavier.bueno@metempsy.com bi->lsum = lsum; 25513685Sjavier.bueno@metempsy.com bi->thres = thres; 25613685Sjavier.bueno@metempsy.com 25713685Sjavier.bueno@metempsy.com bool scPred = (lsum >= 0); 25813685Sjavier.bueno@metempsy.com 25913685Sjavier.bueno@metempsy.com if (pred_taken != scPred) { 26013685Sjavier.bueno@metempsy.com bool useScPred = true; 26113685Sjavier.bueno@metempsy.com //Choser uses TAGE confidence and |LSUM| 26213685Sjavier.bueno@metempsy.com if (bi->highConf) { 26313685Sjavier.bueno@metempsy.com if (abs (lsum) < (thres / 4)) { 26413685Sjavier.bueno@metempsy.com useScPred = false; 26513685Sjavier.bueno@metempsy.com } else if (abs (lsum) < (thres / 2)) { 26613685Sjavier.bueno@metempsy.com useScPred = (secondH < 0); 26713685Sjavier.bueno@metempsy.com } 26813685Sjavier.bueno@metempsy.com } 26913685Sjavier.bueno@metempsy.com 27013685Sjavier.bueno@metempsy.com if (bi->medConf) { 27113685Sjavier.bueno@metempsy.com if (abs (lsum) < (thres / 4)) { 27213685Sjavier.bueno@metempsy.com useScPred = (firstH < 0); 27313685Sjavier.bueno@metempsy.com } 27413685Sjavier.bueno@metempsy.com } 27513685Sjavier.bueno@metempsy.com 27613685Sjavier.bueno@metempsy.com bi->usedScPred = useScPred; 27713685Sjavier.bueno@metempsy.com if (useScPred) { 27813685Sjavier.bueno@metempsy.com pred_taken = scPred; 27913685Sjavier.bueno@metempsy.com bi->scPred = scPred; 28013685Sjavier.bueno@metempsy.com } 28113685Sjavier.bueno@metempsy.com } 28213685Sjavier.bueno@metempsy.com } 28313685Sjavier.bueno@metempsy.com 28413685Sjavier.bueno@metempsy.com return pred_taken; 28513685Sjavier.bueno@metempsy.com} 28613685Sjavier.bueno@metempsy.com 28713685Sjavier.bueno@metempsy.comvoid 28814081Sjavier.bueno@metempsy.comStatisticalCorrector::scHistoryUpdate(Addr branch_pc, 28914081Sjavier.bueno@metempsy.com const StaticInstPtr &inst, bool taken, BranchInfo * tage_bi, 29014081Sjavier.bueno@metempsy.com Addr corrTarget) 29113685Sjavier.bueno@metempsy.com{ 29214081Sjavier.bueno@metempsy.com int brtype = inst->isDirectCtrl() ? 0 : 2; 29314081Sjavier.bueno@metempsy.com if (! inst->isUncondCtrl()) { 29414081Sjavier.bueno@metempsy.com ++brtype; 29514081Sjavier.bueno@metempsy.com } 29613685Sjavier.bueno@metempsy.com // Non speculative SC histories update 29713685Sjavier.bueno@metempsy.com if (brtype & 1) { 29813685Sjavier.bueno@metempsy.com if (corrTarget < branch_pc) { 29913685Sjavier.bueno@metempsy.com //This branch corresponds to a loop 30013685Sjavier.bueno@metempsy.com if (!taken) { 30113685Sjavier.bueno@metempsy.com //exit of the "loop" 30213685Sjavier.bueno@metempsy.com scHistory->imliCount = 0; 30313685Sjavier.bueno@metempsy.com } else { 30413685Sjavier.bueno@metempsy.com if (scHistory->imliCount < ((1 << im[0]) - 1)) { 30513685Sjavier.bueno@metempsy.com scHistory->imliCount++; 30613685Sjavier.bueno@metempsy.com } 30713685Sjavier.bueno@metempsy.com } 30813685Sjavier.bueno@metempsy.com } 30913685Sjavier.bueno@metempsy.com 31013685Sjavier.bueno@metempsy.com scHistory->bwHist = (scHistory->bwHist << 1) + 31113685Sjavier.bueno@metempsy.com (taken & (corrTarget < branch_pc)); 31213685Sjavier.bueno@metempsy.com scHistory->updateLocalHistory(1, branch_pc, taken); 31313685Sjavier.bueno@metempsy.com } 31413685Sjavier.bueno@metempsy.com} 31513685Sjavier.bueno@metempsy.com 31613685Sjavier.bueno@metempsy.comvoid 31713685Sjavier.bueno@metempsy.comStatisticalCorrector::condBranchUpdate(ThreadID tid, Addr branch_pc, 31813685Sjavier.bueno@metempsy.com bool taken, BranchInfo *bi, Addr corrTarget, bool b, int hitBank, 31913685Sjavier.bueno@metempsy.com int altBank, int64_t phist) 32013685Sjavier.bueno@metempsy.com{ 32113685Sjavier.bueno@metempsy.com bool scPred = (bi->lsum >= 0); 32213685Sjavier.bueno@metempsy.com 32313685Sjavier.bueno@metempsy.com if (bi->predBeforeSC != scPred) { 32413685Sjavier.bueno@metempsy.com if (abs(bi->lsum) < bi->thres) { 32513685Sjavier.bueno@metempsy.com if (bi->highConf) { 32613685Sjavier.bueno@metempsy.com if ((abs(bi->lsum) < bi->thres / 2)) { 32713685Sjavier.bueno@metempsy.com if ((abs(bi->lsum) >= bi->thres / 4)) { 32813685Sjavier.bueno@metempsy.com ctrUpdate(secondH, (bi->predBeforeSC == taken), 32913685Sjavier.bueno@metempsy.com chooserConfWidth); 33013685Sjavier.bueno@metempsy.com } 33113685Sjavier.bueno@metempsy.com } 33213685Sjavier.bueno@metempsy.com } 33313685Sjavier.bueno@metempsy.com } 33413685Sjavier.bueno@metempsy.com if (bi->medConf) { 33513685Sjavier.bueno@metempsy.com if ((abs(bi->lsum) < bi->thres / 4)) { 33613685Sjavier.bueno@metempsy.com ctrUpdate(firstH, (bi->predBeforeSC == taken), 33713685Sjavier.bueno@metempsy.com chooserConfWidth); 33813685Sjavier.bueno@metempsy.com } 33913685Sjavier.bueno@metempsy.com } 34013685Sjavier.bueno@metempsy.com } 34113685Sjavier.bueno@metempsy.com 34213685Sjavier.bueno@metempsy.com if ((scPred != taken) || ((abs(bi->lsum) < bi->thres))) { 34313685Sjavier.bueno@metempsy.com ctrUpdate(updateThreshold, (scPred != taken), updateThresholdWidth); 34413685Sjavier.bueno@metempsy.com ctrUpdate(pUpdateThreshold[getIndUpd(branch_pc)], (scPred != taken), 34513685Sjavier.bueno@metempsy.com pUpdateThresholdWidth); 34613685Sjavier.bueno@metempsy.com 34713685Sjavier.bueno@metempsy.com unsigned indUpds = getIndUpds(branch_pc); 34813685Sjavier.bueno@metempsy.com unsigned indBias = getIndBias(branch_pc, bi, b); 34913685Sjavier.bueno@metempsy.com unsigned indBiasSK = getIndBiasSK(branch_pc, bi); 35013685Sjavier.bueno@metempsy.com unsigned indBiasBank = getIndBiasBank(branch_pc, bi, hitBank, altBank); 35113685Sjavier.bueno@metempsy.com 35213685Sjavier.bueno@metempsy.com int xsum = bi->lsum - 35313685Sjavier.bueno@metempsy.com ((wb[indUpds] >= 0) * ((2 * bias[indBias] + 1) + 35413685Sjavier.bueno@metempsy.com (2 * biasSK[indBiasSK] + 1) + 35513685Sjavier.bueno@metempsy.com (2 * biasBank[indBiasBank] + 1))); 35613685Sjavier.bueno@metempsy.com 35713685Sjavier.bueno@metempsy.com if ((xsum + ((2 * bias[indBias] + 1) + (2 * biasSK[indBiasSK] + 1) + 35813685Sjavier.bueno@metempsy.com (2 * biasBank[indBiasBank] + 1)) >= 0) != (xsum >= 0)) 35913685Sjavier.bueno@metempsy.com { 36013685Sjavier.bueno@metempsy.com ctrUpdate(wb[indUpds], 36113685Sjavier.bueno@metempsy.com (((2 * bias[indBias] + 1) + 36213685Sjavier.bueno@metempsy.com (2 * biasSK[indBiasSK] + 1) + 36313685Sjavier.bueno@metempsy.com (2 * biasBank[indBiasBank] + 1) >= 0) == taken), 36413685Sjavier.bueno@metempsy.com extraWeightsWidth); 36513685Sjavier.bueno@metempsy.com } 36613685Sjavier.bueno@metempsy.com 36713685Sjavier.bueno@metempsy.com ctrUpdate(bias[indBias], taken, scCountersWidth); 36813685Sjavier.bueno@metempsy.com ctrUpdate(biasSK[indBiasSK], taken, scCountersWidth); 36913685Sjavier.bueno@metempsy.com ctrUpdate(biasBank[indBiasBank], taken, scCountersWidth); 37013685Sjavier.bueno@metempsy.com 37113685Sjavier.bueno@metempsy.com gUpdates(tid, branch_pc, taken, bi, phist); 37213685Sjavier.bueno@metempsy.com } 37313685Sjavier.bueno@metempsy.com} 37413685Sjavier.bueno@metempsy.com 37513685Sjavier.bueno@metempsy.comvoid 37613685Sjavier.bueno@metempsy.comStatisticalCorrector::updateStats(bool taken, BranchInfo *bi) 37713685Sjavier.bueno@metempsy.com{ 37813685Sjavier.bueno@metempsy.com if (taken == bi->scPred) { 37913685Sjavier.bueno@metempsy.com scPredictorCorrect++; 38013685Sjavier.bueno@metempsy.com } else { 38113685Sjavier.bueno@metempsy.com scPredictorWrong++; 38213685Sjavier.bueno@metempsy.com } 38313685Sjavier.bueno@metempsy.com} 38413685Sjavier.bueno@metempsy.com 38513685Sjavier.bueno@metempsy.comvoid 38613685Sjavier.bueno@metempsy.comStatisticalCorrector::init() 38713685Sjavier.bueno@metempsy.com{ 38813685Sjavier.bueno@metempsy.com scHistory = makeThreadHistory(); 38914081Sjavier.bueno@metempsy.com initBias(); 39014081Sjavier.bueno@metempsy.com} 39114081Sjavier.bueno@metempsy.com 39214081Sjavier.bueno@metempsy.comsize_t 39314081Sjavier.bueno@metempsy.comStatisticalCorrector::getSizeInBits() const 39414081Sjavier.bueno@metempsy.com{ 39514081Sjavier.bueno@metempsy.com // Not implemented 39614081Sjavier.bueno@metempsy.com return 0; 39713685Sjavier.bueno@metempsy.com} 39813685Sjavier.bueno@metempsy.com 39913685Sjavier.bueno@metempsy.comvoid 40013685Sjavier.bueno@metempsy.comStatisticalCorrector::regStats() 40113685Sjavier.bueno@metempsy.com{ 40213685Sjavier.bueno@metempsy.com scPredictorCorrect 40313685Sjavier.bueno@metempsy.com .name(name() + ".scPredictorCorrect") 40413685Sjavier.bueno@metempsy.com .desc("Number of time the SC predictor is the provider and " 40513685Sjavier.bueno@metempsy.com "the prediction is correct"); 40613685Sjavier.bueno@metempsy.com 40713685Sjavier.bueno@metempsy.com scPredictorWrong 40813685Sjavier.bueno@metempsy.com .name(name() + ".scPredictorWrong") 40913685Sjavier.bueno@metempsy.com .desc("Number of time the SC predictor is the provider and " 41013685Sjavier.bueno@metempsy.com "the prediction is wrong"); 41113685Sjavier.bueno@metempsy.com} 412