statistical_corrector.cc revision 13685
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 7213685Sjavier.bueno@metempsy.com initGEHLTable(lnb, lm, lgehl, logLnb, wl, 7); 7313685Sjavier.bueno@metempsy.com initGEHLTable(bwnb, bwm, bwgehl, logBwnb, wbw, 7); 7413685Sjavier.bueno@metempsy.com initGEHLTable(inb, im, igehl, logInb, wi, 7); 7513685Sjavier.bueno@metempsy.com 7613685Sjavier.bueno@metempsy.com updateThreshold = 35 << 3; 7713685Sjavier.bueno@metempsy.com 7813685Sjavier.bueno@metempsy.com pUpdateThreshold.resize(1 << logSizeUp, 0); 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); 8313685Sjavier.bueno@metempsy.com for (int j = 0; j < (1 << logBias); j++) { 8413685Sjavier.bueno@metempsy.com switch (j & 3) { 8513685Sjavier.bueno@metempsy.com case 0: 8613685Sjavier.bueno@metempsy.com bias[j] = -32; 8713685Sjavier.bueno@metempsy.com biasSK[j] = -8; 8813685Sjavier.bueno@metempsy.com biasBank[j] = -32; 8913685Sjavier.bueno@metempsy.com break; 9013685Sjavier.bueno@metempsy.com case 1: 9113685Sjavier.bueno@metempsy.com bias[j] = 31; 9213685Sjavier.bueno@metempsy.com biasSK[j] = 7; 9313685Sjavier.bueno@metempsy.com biasBank[j] = 31; 9413685Sjavier.bueno@metempsy.com break; 9513685Sjavier.bueno@metempsy.com case 2: 9613685Sjavier.bueno@metempsy.com bias[j] = -1; 9713685Sjavier.bueno@metempsy.com biasSK[j] = -32; 9813685Sjavier.bueno@metempsy.com biasBank[j] = -1; 9913685Sjavier.bueno@metempsy.com break; 10013685Sjavier.bueno@metempsy.com case 3: 10113685Sjavier.bueno@metempsy.com bias[j] = 0; 10213685Sjavier.bueno@metempsy.com biasSK[j] = 31; 10313685Sjavier.bueno@metempsy.com biasBank[j] = 0; 10413685Sjavier.bueno@metempsy.com break; 10513685Sjavier.bueno@metempsy.com } 10613685Sjavier.bueno@metempsy.com } 10713685Sjavier.bueno@metempsy.com} 10813685Sjavier.bueno@metempsy.com 10913685Sjavier.bueno@metempsy.comStatisticalCorrector::BranchInfo* 11013685Sjavier.bueno@metempsy.comStatisticalCorrector::makeBranchInfo() 11113685Sjavier.bueno@metempsy.com{ 11213685Sjavier.bueno@metempsy.com return new BranchInfo(); 11313685Sjavier.bueno@metempsy.com} 11413685Sjavier.bueno@metempsy.com 11513685Sjavier.bueno@metempsy.comStatisticalCorrector::SCThreadHistory* 11613685Sjavier.bueno@metempsy.comStatisticalCorrector::makeThreadHistory() 11713685Sjavier.bueno@metempsy.com{ 11813685Sjavier.bueno@metempsy.com return new SCThreadHistory(); 11913685Sjavier.bueno@metempsy.com} 12013685Sjavier.bueno@metempsy.com 12113685Sjavier.bueno@metempsy.comvoid 12213685Sjavier.bueno@metempsy.comStatisticalCorrector::initGEHLTable(unsigned numLenghts, 12313685Sjavier.bueno@metempsy.com std::vector<int> lengths, std::vector<int8_t> * & table, 12413685Sjavier.bueno@metempsy.com unsigned logNumEntries, std::vector<int8_t> & w, int8_t wInitValue) 12513685Sjavier.bueno@metempsy.com{ 12613685Sjavier.bueno@metempsy.com assert(lengths.size() == numLenghts); 12713685Sjavier.bueno@metempsy.com if (numLenghts == 0) { 12813685Sjavier.bueno@metempsy.com return; 12913685Sjavier.bueno@metempsy.com } 13013685Sjavier.bueno@metempsy.com table = new std::vector<int8_t> [numLenghts]; 13113685Sjavier.bueno@metempsy.com for (int i = 0; i < numLenghts; ++i) { 13213685Sjavier.bueno@metempsy.com table[i].resize(1 << logNumEntries, 0); 13313685Sjavier.bueno@metempsy.com for (int j = 0; j < ((1 << logNumEntries) - 1); ++j) { 13413685Sjavier.bueno@metempsy.com if (! (j & 1)) { 13513685Sjavier.bueno@metempsy.com table[i][j] = -1; 13613685Sjavier.bueno@metempsy.com } 13713685Sjavier.bueno@metempsy.com } 13813685Sjavier.bueno@metempsy.com } 13913685Sjavier.bueno@metempsy.com 14013685Sjavier.bueno@metempsy.com w.resize(1 << logSizeUps, wInitValue); 14113685Sjavier.bueno@metempsy.com} 14213685Sjavier.bueno@metempsy.com 14313685Sjavier.bueno@metempsy.comunsigned 14413685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndBias(Addr branch_pc, BranchInfo* bi, 14513685Sjavier.bueno@metempsy.com bool bias) const 14613685Sjavier.bueno@metempsy.com{ 14713685Sjavier.bueno@metempsy.com return (((((branch_pc ^(branch_pc >>2))<<1) ^ (bi->lowConf & bias)) <<1) 14813685Sjavier.bueno@metempsy.com + bi->predBeforeSC) & ((1<<logBias) -1); 14913685Sjavier.bueno@metempsy.com} 15013685Sjavier.bueno@metempsy.com 15113685Sjavier.bueno@metempsy.comunsigned 15213685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndBiasSK(Addr branch_pc, BranchInfo* bi) const 15313685Sjavier.bueno@metempsy.com{ 15413685Sjavier.bueno@metempsy.com return (((((branch_pc ^ (branch_pc >> (logBias-2)))<<1) ^ 15513685Sjavier.bueno@metempsy.com (bi->highConf))<<1) + bi->predBeforeSC) & ((1<<logBias) -1); 15613685Sjavier.bueno@metempsy.com} 15713685Sjavier.bueno@metempsy.com 15813685Sjavier.bueno@metempsy.comunsigned 15913685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndUpd(Addr branch_pc) const 16013685Sjavier.bueno@metempsy.com{ 16113685Sjavier.bueno@metempsy.com return ((branch_pc ^ (branch_pc >>2)) & ((1 << (logSizeUp)) - 1)); 16213685Sjavier.bueno@metempsy.com} 16313685Sjavier.bueno@metempsy.com 16413685Sjavier.bueno@metempsy.comunsigned 16513685Sjavier.bueno@metempsy.comStatisticalCorrector::getIndUpds(Addr branch_pc) const 16613685Sjavier.bueno@metempsy.com{ 16713685Sjavier.bueno@metempsy.com return ((branch_pc ^ (branch_pc >>2)) & ((1 << (logSizeUps)) - 1)); 16813685Sjavier.bueno@metempsy.com} 16913685Sjavier.bueno@metempsy.com 17013685Sjavier.bueno@metempsy.comint64_t 17113685Sjavier.bueno@metempsy.comStatisticalCorrector::gIndex(Addr branch_pc, int64_t bhist, int logs, int nbr, 17213685Sjavier.bueno@metempsy.com int i) 17313685Sjavier.bueno@metempsy.com{ 17413685Sjavier.bueno@metempsy.com return (((int64_t) branch_pc) ^ bhist ^ (bhist >> (8 - i)) ^ 17513685Sjavier.bueno@metempsy.com (bhist >> (16 - 2 * i)) ^ (bhist >> (24 - 3 * i)) ^ 17613685Sjavier.bueno@metempsy.com (bhist >> (32 - 3 * i)) ^ (bhist >> (40 - 4 * i))) & 17713685Sjavier.bueno@metempsy.com ((1 << (logs - gIndexLogsSubstr(nbr, i))) - 1); 17813685Sjavier.bueno@metempsy.com} 17913685Sjavier.bueno@metempsy.com 18013685Sjavier.bueno@metempsy.comint 18113685Sjavier.bueno@metempsy.comStatisticalCorrector::gPredict(Addr branch_pc, int64_t hist, 18213685Sjavier.bueno@metempsy.com std::vector<int> & length, std::vector<int8_t> * tab, int nbr, 18313685Sjavier.bueno@metempsy.com int logs, std::vector<int8_t> & w) 18413685Sjavier.bueno@metempsy.com{ 18513685Sjavier.bueno@metempsy.com int percsum = 0; 18613685Sjavier.bueno@metempsy.com for (int i = 0; i < nbr; i++) { 18713685Sjavier.bueno@metempsy.com int64_t bhist = hist & ((int64_t) ((1 << length[i]) - 1)); 18813685Sjavier.bueno@metempsy.com int64_t index = gIndex(branch_pc, bhist, logs, nbr, i); 18913685Sjavier.bueno@metempsy.com int8_t ctr = tab[i][index]; 19013685Sjavier.bueno@metempsy.com percsum += (2 * ctr + 1); 19113685Sjavier.bueno@metempsy.com } 19213685Sjavier.bueno@metempsy.com percsum = (1 + (w[getIndUpds(branch_pc)] >= 0)) * percsum; 19313685Sjavier.bueno@metempsy.com return percsum; 19413685Sjavier.bueno@metempsy.com} 19513685Sjavier.bueno@metempsy.com 19613685Sjavier.bueno@metempsy.comvoid 19713685Sjavier.bueno@metempsy.comStatisticalCorrector::gUpdate(Addr branch_pc, bool taken, int64_t hist, 19813685Sjavier.bueno@metempsy.com std::vector<int> & length, std::vector<int8_t> * tab, 19913685Sjavier.bueno@metempsy.com int nbr, int logs, std::vector<int8_t> & w, 20013685Sjavier.bueno@metempsy.com BranchInfo* bi) 20113685Sjavier.bueno@metempsy.com{ 20213685Sjavier.bueno@metempsy.com int percsum = 0; 20313685Sjavier.bueno@metempsy.com for (int i = 0; i < nbr; i++) { 20413685Sjavier.bueno@metempsy.com int64_t bhist = hist & ((int64_t) ((1 << length[i]) - 1)); 20513685Sjavier.bueno@metempsy.com int64_t index = gIndex(branch_pc, bhist, logs, nbr, i); 20613685Sjavier.bueno@metempsy.com percsum += (2 * tab[i][index] + 1); 20713685Sjavier.bueno@metempsy.com ctrUpdate(tab[i][index], taken, scCountersWidth); 20813685Sjavier.bueno@metempsy.com } 20913685Sjavier.bueno@metempsy.com 21013685Sjavier.bueno@metempsy.com int xsum = bi->lsum - ((w[getIndUpds(branch_pc)] >= 0)) * percsum; 21113685Sjavier.bueno@metempsy.com if ((xsum + percsum >= 0) != (xsum >= 0)) { 21213685Sjavier.bueno@metempsy.com ctrUpdate(w[getIndUpds(branch_pc)], ((percsum >= 0) == taken), 21313685Sjavier.bueno@metempsy.com extraWeightsWidth); 21413685Sjavier.bueno@metempsy.com } 21513685Sjavier.bueno@metempsy.com} 21613685Sjavier.bueno@metempsy.com 21713685Sjavier.bueno@metempsy.combool 21813685Sjavier.bueno@metempsy.comStatisticalCorrector::scPredict(ThreadID tid, Addr branch_pc, bool cond_branch, 21913685Sjavier.bueno@metempsy.com BranchInfo* bi, bool prev_pred_taken, bool bias_bit, 22013685Sjavier.bueno@metempsy.com bool use_conf_ctr, int8_t conf_ctr, unsigned conf_bits, 22113685Sjavier.bueno@metempsy.com int hitBank, int altBank, int64_t phist) 22213685Sjavier.bueno@metempsy.com{ 22313685Sjavier.bueno@metempsy.com bool pred_taken = prev_pred_taken; 22413685Sjavier.bueno@metempsy.com if (cond_branch) { 22513685Sjavier.bueno@metempsy.com 22613685Sjavier.bueno@metempsy.com bi->predBeforeSC = prev_pred_taken; 22713685Sjavier.bueno@metempsy.com 22813685Sjavier.bueno@metempsy.com // first calc/update the confidences from the TAGE prediction 22913685Sjavier.bueno@metempsy.com if (use_conf_ctr) { 23013685Sjavier.bueno@metempsy.com bi->lowConf = (abs(2 * conf_ctr + 1) == 1); 23113685Sjavier.bueno@metempsy.com bi->medConf = (abs(2 * conf_ctr + 1) == 5); 23213685Sjavier.bueno@metempsy.com bi->highConf = (abs(2 * conf_ctr + 1) >= (1<<conf_bits) - 1); 23313685Sjavier.bueno@metempsy.com } 23413685Sjavier.bueno@metempsy.com 23513685Sjavier.bueno@metempsy.com int lsum = 0; 23613685Sjavier.bueno@metempsy.com 23713685Sjavier.bueno@metempsy.com int8_t ctr = bias[getIndBias(branch_pc, bi, bias_bit)]; 23813685Sjavier.bueno@metempsy.com lsum += (2 * ctr + 1); 23913685Sjavier.bueno@metempsy.com ctr = biasSK[getIndBiasSK(branch_pc, bi)]; 24013685Sjavier.bueno@metempsy.com lsum += (2 * ctr + 1); 24113685Sjavier.bueno@metempsy.com ctr = biasBank[getIndBiasBank(branch_pc, bi, hitBank, altBank)]; 24213685Sjavier.bueno@metempsy.com lsum += (2 * ctr + 1); 24313685Sjavier.bueno@metempsy.com 24413685Sjavier.bueno@metempsy.com lsum = (1 + (wb[getIndUpds(branch_pc)] >= 0)) * lsum; 24513685Sjavier.bueno@metempsy.com 24613685Sjavier.bueno@metempsy.com int thres = gPredictions(tid, branch_pc, bi, lsum, phist); 24713685Sjavier.bueno@metempsy.com 24813685Sjavier.bueno@metempsy.com // These will be needed at update time 24913685Sjavier.bueno@metempsy.com bi->lsum = lsum; 25013685Sjavier.bueno@metempsy.com bi->thres = thres; 25113685Sjavier.bueno@metempsy.com 25213685Sjavier.bueno@metempsy.com bool scPred = (lsum >= 0); 25313685Sjavier.bueno@metempsy.com 25413685Sjavier.bueno@metempsy.com if (pred_taken != scPred) { 25513685Sjavier.bueno@metempsy.com bool useScPred = true; 25613685Sjavier.bueno@metempsy.com //Choser uses TAGE confidence and |LSUM| 25713685Sjavier.bueno@metempsy.com if (bi->highConf) { 25813685Sjavier.bueno@metempsy.com if (abs (lsum) < (thres / 4)) { 25913685Sjavier.bueno@metempsy.com useScPred = false; 26013685Sjavier.bueno@metempsy.com } else if (abs (lsum) < (thres / 2)) { 26113685Sjavier.bueno@metempsy.com useScPred = (secondH < 0); 26213685Sjavier.bueno@metempsy.com } 26313685Sjavier.bueno@metempsy.com } 26413685Sjavier.bueno@metempsy.com 26513685Sjavier.bueno@metempsy.com if (bi->medConf) { 26613685Sjavier.bueno@metempsy.com if (abs (lsum) < (thres / 4)) { 26713685Sjavier.bueno@metempsy.com useScPred = (firstH < 0); 26813685Sjavier.bueno@metempsy.com } 26913685Sjavier.bueno@metempsy.com } 27013685Sjavier.bueno@metempsy.com 27113685Sjavier.bueno@metempsy.com bi->usedScPred = useScPred; 27213685Sjavier.bueno@metempsy.com if (useScPred) { 27313685Sjavier.bueno@metempsy.com pred_taken = scPred; 27413685Sjavier.bueno@metempsy.com bi->scPred = scPred; 27513685Sjavier.bueno@metempsy.com } 27613685Sjavier.bueno@metempsy.com } 27713685Sjavier.bueno@metempsy.com } 27813685Sjavier.bueno@metempsy.com 27913685Sjavier.bueno@metempsy.com return pred_taken; 28013685Sjavier.bueno@metempsy.com} 28113685Sjavier.bueno@metempsy.com 28213685Sjavier.bueno@metempsy.comvoid 28313685Sjavier.bueno@metempsy.comStatisticalCorrector::scHistoryUpdate(Addr branch_pc, int brtype, bool taken, 28413685Sjavier.bueno@metempsy.com BranchInfo * tage_bi, Addr corrTarget) 28513685Sjavier.bueno@metempsy.com{ 28613685Sjavier.bueno@metempsy.com // Non speculative SC histories update 28713685Sjavier.bueno@metempsy.com if (brtype & 1) { 28813685Sjavier.bueno@metempsy.com if (corrTarget < branch_pc) { 28913685Sjavier.bueno@metempsy.com //This branch corresponds to a loop 29013685Sjavier.bueno@metempsy.com if (!taken) { 29113685Sjavier.bueno@metempsy.com //exit of the "loop" 29213685Sjavier.bueno@metempsy.com scHistory->imliCount = 0; 29313685Sjavier.bueno@metempsy.com } else { 29413685Sjavier.bueno@metempsy.com if (scHistory->imliCount < ((1 << im[0]) - 1)) { 29513685Sjavier.bueno@metempsy.com scHistory->imliCount++; 29613685Sjavier.bueno@metempsy.com } 29713685Sjavier.bueno@metempsy.com } 29813685Sjavier.bueno@metempsy.com } 29913685Sjavier.bueno@metempsy.com 30013685Sjavier.bueno@metempsy.com scHistory->bwHist = (scHistory->bwHist << 1) + 30113685Sjavier.bueno@metempsy.com (taken & (corrTarget < branch_pc)); 30213685Sjavier.bueno@metempsy.com scHistory->updateLocalHistory(1, branch_pc, taken); 30313685Sjavier.bueno@metempsy.com } 30413685Sjavier.bueno@metempsy.com} 30513685Sjavier.bueno@metempsy.com 30613685Sjavier.bueno@metempsy.comvoid 30713685Sjavier.bueno@metempsy.comStatisticalCorrector::condBranchUpdate(ThreadID tid, Addr branch_pc, 30813685Sjavier.bueno@metempsy.com bool taken, BranchInfo *bi, Addr corrTarget, bool b, int hitBank, 30913685Sjavier.bueno@metempsy.com int altBank, int64_t phist) 31013685Sjavier.bueno@metempsy.com{ 31113685Sjavier.bueno@metempsy.com bool scPred = (bi->lsum >= 0); 31213685Sjavier.bueno@metempsy.com 31313685Sjavier.bueno@metempsy.com if (bi->predBeforeSC != scPred) { 31413685Sjavier.bueno@metempsy.com if (abs(bi->lsum) < bi->thres) { 31513685Sjavier.bueno@metempsy.com if (bi->highConf) { 31613685Sjavier.bueno@metempsy.com if ((abs(bi->lsum) < bi->thres / 2)) { 31713685Sjavier.bueno@metempsy.com if ((abs(bi->lsum) >= bi->thres / 4)) { 31813685Sjavier.bueno@metempsy.com ctrUpdate(secondH, (bi->predBeforeSC == taken), 31913685Sjavier.bueno@metempsy.com chooserConfWidth); 32013685Sjavier.bueno@metempsy.com } 32113685Sjavier.bueno@metempsy.com } 32213685Sjavier.bueno@metempsy.com } 32313685Sjavier.bueno@metempsy.com } 32413685Sjavier.bueno@metempsy.com if (bi->medConf) { 32513685Sjavier.bueno@metempsy.com if ((abs(bi->lsum) < bi->thres / 4)) { 32613685Sjavier.bueno@metempsy.com ctrUpdate(firstH, (bi->predBeforeSC == taken), 32713685Sjavier.bueno@metempsy.com chooserConfWidth); 32813685Sjavier.bueno@metempsy.com } 32913685Sjavier.bueno@metempsy.com } 33013685Sjavier.bueno@metempsy.com } 33113685Sjavier.bueno@metempsy.com 33213685Sjavier.bueno@metempsy.com if ((scPred != taken) || ((abs(bi->lsum) < bi->thres))) { 33313685Sjavier.bueno@metempsy.com ctrUpdate(updateThreshold, (scPred != taken), updateThresholdWidth); 33413685Sjavier.bueno@metempsy.com ctrUpdate(pUpdateThreshold[getIndUpd(branch_pc)], (scPred != taken), 33513685Sjavier.bueno@metempsy.com pUpdateThresholdWidth); 33613685Sjavier.bueno@metempsy.com 33713685Sjavier.bueno@metempsy.com unsigned indUpds = getIndUpds(branch_pc); 33813685Sjavier.bueno@metempsy.com unsigned indBias = getIndBias(branch_pc, bi, b); 33913685Sjavier.bueno@metempsy.com unsigned indBiasSK = getIndBiasSK(branch_pc, bi); 34013685Sjavier.bueno@metempsy.com unsigned indBiasBank = getIndBiasBank(branch_pc, bi, hitBank, altBank); 34113685Sjavier.bueno@metempsy.com 34213685Sjavier.bueno@metempsy.com int xsum = bi->lsum - 34313685Sjavier.bueno@metempsy.com ((wb[indUpds] >= 0) * ((2 * bias[indBias] + 1) + 34413685Sjavier.bueno@metempsy.com (2 * biasSK[indBiasSK] + 1) + 34513685Sjavier.bueno@metempsy.com (2 * biasBank[indBiasBank] + 1))); 34613685Sjavier.bueno@metempsy.com 34713685Sjavier.bueno@metempsy.com if ((xsum + ((2 * bias[indBias] + 1) + (2 * biasSK[indBiasSK] + 1) + 34813685Sjavier.bueno@metempsy.com (2 * biasBank[indBiasBank] + 1)) >= 0) != (xsum >= 0)) 34913685Sjavier.bueno@metempsy.com { 35013685Sjavier.bueno@metempsy.com ctrUpdate(wb[indUpds], 35113685Sjavier.bueno@metempsy.com (((2 * bias[indBias] + 1) + 35213685Sjavier.bueno@metempsy.com (2 * biasSK[indBiasSK] + 1) + 35313685Sjavier.bueno@metempsy.com (2 * biasBank[indBiasBank] + 1) >= 0) == taken), 35413685Sjavier.bueno@metempsy.com extraWeightsWidth); 35513685Sjavier.bueno@metempsy.com } 35613685Sjavier.bueno@metempsy.com 35713685Sjavier.bueno@metempsy.com ctrUpdate(bias[indBias], taken, scCountersWidth); 35813685Sjavier.bueno@metempsy.com ctrUpdate(biasSK[indBiasSK], taken, scCountersWidth); 35913685Sjavier.bueno@metempsy.com ctrUpdate(biasBank[indBiasBank], taken, scCountersWidth); 36013685Sjavier.bueno@metempsy.com 36113685Sjavier.bueno@metempsy.com gUpdates(tid, branch_pc, taken, bi, phist); 36213685Sjavier.bueno@metempsy.com } 36313685Sjavier.bueno@metempsy.com} 36413685Sjavier.bueno@metempsy.com 36513685Sjavier.bueno@metempsy.comvoid 36613685Sjavier.bueno@metempsy.comStatisticalCorrector::updateStats(bool taken, BranchInfo *bi) 36713685Sjavier.bueno@metempsy.com{ 36813685Sjavier.bueno@metempsy.com if (taken == bi->scPred) { 36913685Sjavier.bueno@metempsy.com scPredictorCorrect++; 37013685Sjavier.bueno@metempsy.com } else { 37113685Sjavier.bueno@metempsy.com scPredictorWrong++; 37213685Sjavier.bueno@metempsy.com } 37313685Sjavier.bueno@metempsy.com} 37413685Sjavier.bueno@metempsy.com 37513685Sjavier.bueno@metempsy.comvoid 37613685Sjavier.bueno@metempsy.comStatisticalCorrector::init() 37713685Sjavier.bueno@metempsy.com{ 37813685Sjavier.bueno@metempsy.com scHistory = makeThreadHistory(); 37913685Sjavier.bueno@metempsy.com} 38013685Sjavier.bueno@metempsy.com 38113685Sjavier.bueno@metempsy.comvoid 38213685Sjavier.bueno@metempsy.comStatisticalCorrector::regStats() 38313685Sjavier.bueno@metempsy.com{ 38413685Sjavier.bueno@metempsy.com scPredictorCorrect 38513685Sjavier.bueno@metempsy.com .name(name() + ".scPredictorCorrect") 38613685Sjavier.bueno@metempsy.com .desc("Number of time the SC predictor is the provider and " 38713685Sjavier.bueno@metempsy.com "the prediction is correct"); 38813685Sjavier.bueno@metempsy.com 38913685Sjavier.bueno@metempsy.com scPredictorWrong 39013685Sjavier.bueno@metempsy.com .name(name() + ".scPredictorWrong") 39113685Sjavier.bueno@metempsy.com .desc("Number of time the SC predictor is the provider and " 39213685Sjavier.bueno@metempsy.com "the prediction is wrong"); 39313685Sjavier.bueno@metempsy.com} 394