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