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