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 * 8KB TAGE-SC-L branch predictor (devised by Andre Seznec)
4013685Sjavier.bueno@metempsy.com */
4113685Sjavier.bueno@metempsy.com
4213685Sjavier.bueno@metempsy.com#include "cpu/pred/tage_sc_l_8KB.hh"
4313685Sjavier.bueno@metempsy.com
4413685Sjavier.bueno@metempsy.com#include "base/random.hh"
4513685Sjavier.bueno@metempsy.com#include "debug/TageSCL.hh"
4613685Sjavier.bueno@metempsy.com
4713685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::TAGE_SC_L_8KB_StatisticalCorrector(
4813685Sjavier.bueno@metempsy.com    TAGE_SC_L_8KB_StatisticalCorrectorParams *p)
4913685Sjavier.bueno@metempsy.com  : StatisticalCorrector(p),
5013685Sjavier.bueno@metempsy.com    gnb(p->gnb),
5113685Sjavier.bueno@metempsy.com    logGnb(p->logGnb),
5213685Sjavier.bueno@metempsy.com    gm(p->gm)
5313685Sjavier.bueno@metempsy.com{
5413685Sjavier.bueno@metempsy.com    initGEHLTable(gnb, gm, ggehl, logGnb, wg, 7);
5513685Sjavier.bueno@metempsy.com}
5613685Sjavier.bueno@metempsy.com
5713685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::SCThreadHistory *
5813685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::makeThreadHistory()
5913685Sjavier.bueno@metempsy.com{
6013685Sjavier.bueno@metempsy.com    SC_8KB_ThreadHistory *sh = new SC_8KB_ThreadHistory();
6113685Sjavier.bueno@metempsy.com    sh->setNumOrdinalHistories(1);
6213685Sjavier.bueno@metempsy.com    sh->initLocalHistory(1, numEntriesFirstLocalHistories, 2);
6313685Sjavier.bueno@metempsy.com    return sh;
6413685Sjavier.bueno@metempsy.com}
6513685Sjavier.bueno@metempsy.com
6613685Sjavier.bueno@metempsy.comunsigned
6713685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::getIndBiasBank(Addr branch_pc,
6813685Sjavier.bueno@metempsy.com        BranchInfo* bi, int hitBank, int altBank) const
6913685Sjavier.bueno@metempsy.com{
7013685Sjavier.bueno@metempsy.com    return (bi->predBeforeSC + (((hitBank+1)/4)<<4) + (bi->highConf<<1) +
7113685Sjavier.bueno@metempsy.com            (bi->lowConf <<2) +((altBank!=0)<<3)) & ((1<<logBias) -1);
7213685Sjavier.bueno@metempsy.com}
7313685Sjavier.bueno@metempsy.com
7413685Sjavier.bueno@metempsy.comint
7513685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::gPredictions(
7613685Sjavier.bueno@metempsy.com    ThreadID tid, Addr branch_pc, BranchInfo* bi, int & lsum, int64_t phist)
7713685Sjavier.bueno@metempsy.com{
7813685Sjavier.bueno@metempsy.com    SC_8KB_ThreadHistory *sh = static_cast<SC_8KB_ThreadHistory *>(scHistory);
7913685Sjavier.bueno@metempsy.com    lsum += gPredict(
8013685Sjavier.bueno@metempsy.com        branch_pc, sh->globalHist, gm, ggehl, gnb, logGnb, wg);
8113685Sjavier.bueno@metempsy.com
8213685Sjavier.bueno@metempsy.com    lsum += gPredict(
8313685Sjavier.bueno@metempsy.com        branch_pc, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw);
8413685Sjavier.bueno@metempsy.com
8513685Sjavier.bueno@metempsy.com    // only 1 local history here
8613685Sjavier.bueno@metempsy.com    lsum += gPredict(
8713685Sjavier.bueno@metempsy.com        branch_pc, sh->getLocalHistory(1, branch_pc), lm,
8813685Sjavier.bueno@metempsy.com        lgehl, lnb, logLnb, wl);
8913685Sjavier.bueno@metempsy.com
9013685Sjavier.bueno@metempsy.com    lsum += gPredict(
9113685Sjavier.bueno@metempsy.com        branch_pc, sh->imliCount, im, igehl, inb, logInb, wi);
9213685Sjavier.bueno@metempsy.com
9313685Sjavier.bueno@metempsy.com    int thres = (updateThreshold>>3)+pUpdateThreshold[getIndUpd(branch_pc)];
9413685Sjavier.bueno@metempsy.com
9513685Sjavier.bueno@metempsy.com    return thres;
9613685Sjavier.bueno@metempsy.com}
9713685Sjavier.bueno@metempsy.com
9813685Sjavier.bueno@metempsy.comint TAGE_SC_L_8KB_StatisticalCorrector::gIndexLogsSubstr(int nbr, int i)
9913685Sjavier.bueno@metempsy.com{
10013685Sjavier.bueno@metempsy.com    return 0;
10113685Sjavier.bueno@metempsy.com}
10213685Sjavier.bueno@metempsy.com
10313685Sjavier.bueno@metempsy.comvoid
10414081Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::scHistoryUpdate(Addr branch_pc,
10514081Sjavier.bueno@metempsy.com    const StaticInstPtr &inst, bool taken, BranchInfo *tage_bi,
10614081Sjavier.bueno@metempsy.com    Addr corrTarget)
10713685Sjavier.bueno@metempsy.com{
10814081Sjavier.bueno@metempsy.com    int brtype = inst->isDirectCtrl() ? 0 : 2;
10914081Sjavier.bueno@metempsy.com    if (! inst->isUncondCtrl()) {
11014081Sjavier.bueno@metempsy.com        ++brtype;
11114081Sjavier.bueno@metempsy.com    }
11213685Sjavier.bueno@metempsy.com    // Non speculative SC histories update
11313685Sjavier.bueno@metempsy.com    if (brtype & 1) {
11413685Sjavier.bueno@metempsy.com        SC_8KB_ThreadHistory *sh =
11513685Sjavier.bueno@metempsy.com            static_cast<SC_8KB_ThreadHistory *>(scHistory);
11613685Sjavier.bueno@metempsy.com        sh->globalHist = (sh->globalHist << 1) + taken;
11713685Sjavier.bueno@metempsy.com    }
11813685Sjavier.bueno@metempsy.com
11914081Sjavier.bueno@metempsy.com    StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, tage_bi,
12013685Sjavier.bueno@metempsy.com                                          corrTarget);
12113685Sjavier.bueno@metempsy.com}
12213685Sjavier.bueno@metempsy.com
12313685Sjavier.bueno@metempsy.comvoid
12413685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::gUpdates(ThreadID tid, Addr pc, bool taken,
12513685Sjavier.bueno@metempsy.com        BranchInfo* bi, int64_t phist)
12613685Sjavier.bueno@metempsy.com{
12713685Sjavier.bueno@metempsy.com    SC_8KB_ThreadHistory *sh = static_cast<SC_8KB_ThreadHistory *>(scHistory);
12813685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->globalHist, gm, ggehl, gnb, logGnb, wg, bi);
12913685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw, bi);
13013685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->getLocalHistory(1, pc), lm, lgehl, lnb, logLnb, wl,
13113685Sjavier.bueno@metempsy.com            bi);
13213685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->imliCount, im, igehl, inb, logInb, wi, bi);
13313685Sjavier.bueno@metempsy.com}
13413685Sjavier.bueno@metempsy.com
13513685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector*
13613685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrectorParams::create()
13713685Sjavier.bueno@metempsy.com{
13813685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_8KB_StatisticalCorrector(this);
13913685Sjavier.bueno@metempsy.com}
14013685Sjavier.bueno@metempsy.com
14113685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB::TAGE_SC_L_8KB(const TAGE_SC_L_8KBParams *params)
14213685Sjavier.bueno@metempsy.com  : TAGE_SC_L(params)
14313685Sjavier.bueno@metempsy.com{
14413685Sjavier.bueno@metempsy.com}
14513685Sjavier.bueno@metempsy.com
14613685Sjavier.bueno@metempsy.comvoid
14713685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::initFoldedHistories(ThreadHistory & history)
14813685Sjavier.bueno@metempsy.com{
14913685Sjavier.bueno@metempsy.com    // Some hardcoded values are used here
15013685Sjavier.bueno@metempsy.com    // (they do not seem to depend on any parameter)
15113685Sjavier.bueno@metempsy.com    for (int i = 1; i <= nHistoryTables; i++) {
15213685Sjavier.bueno@metempsy.com        history.computeIndices[i].init(
15313685Sjavier.bueno@metempsy.com            histLengths[i], 17 + (2 * ((i - 1) / 2) % 4));
15413685Sjavier.bueno@metempsy.com        history.computeTags[0][i].init(
15513685Sjavier.bueno@metempsy.com            history.computeIndices[i].origLength, 13);
15613685Sjavier.bueno@metempsy.com        history.computeTags[1][i].init(
15713685Sjavier.bueno@metempsy.com            history.computeIndices[i].origLength, 11);
15813685Sjavier.bueno@metempsy.com        DPRINTF(TageSCL, "HistLength:%d, TTSize:%d, TTTWidth:%d\n",
15913685Sjavier.bueno@metempsy.com                histLengths[i], logTagTableSizes[i], tagTableTagWidths[i]);
16013685Sjavier.bueno@metempsy.com    }
16113685Sjavier.bueno@metempsy.com}
16213685Sjavier.bueno@metempsy.com
16313685Sjavier.bueno@metempsy.comint
16413685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::gindex_ext(int index, int bank) const
16513685Sjavier.bueno@metempsy.com{
16613685Sjavier.bueno@metempsy.com    return (index ^ (index >> logTagTableSizes[bank])
16713685Sjavier.bueno@metempsy.com                  ^ (index >> 2 * logTagTableSizes[bank]));
16813685Sjavier.bueno@metempsy.com}
16913685Sjavier.bueno@metempsy.com
17013685Sjavier.bueno@metempsy.comuint16_t
17113685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::gtag(ThreadID tid, Addr pc, int bank) const
17213685Sjavier.bueno@metempsy.com{
17313685Sjavier.bueno@metempsy.com    int tag = (threadHistory[tid].computeIndices[bank - 1].comp << 2) ^ pc ^
17413685Sjavier.bueno@metempsy.com              (pc >> instShiftAmt) ^
17513685Sjavier.bueno@metempsy.com              threadHistory[tid].computeIndices[bank].comp;
17613685Sjavier.bueno@metempsy.com    int hlen = (histLengths[bank] > pathHistBits) ? pathHistBits :
17713685Sjavier.bueno@metempsy.com                                                    histLengths[bank];
17813685Sjavier.bueno@metempsy.com
17913685Sjavier.bueno@metempsy.com    tag = (tag >> 1) ^ ((tag & 1) << 10) ^
18013685Sjavier.bueno@metempsy.com           F(threadHistory[tid].pathHist, hlen, bank);
18113685Sjavier.bueno@metempsy.com    tag ^= threadHistory[tid].computeTags[0][bank].comp ^
18213685Sjavier.bueno@metempsy.com           (threadHistory[tid].computeTags[1][bank].comp << 1);
18313685Sjavier.bueno@metempsy.com
18413685Sjavier.bueno@metempsy.com    return ((tag ^ (tag >> tagTableTagWidths[bank]))
18513685Sjavier.bueno@metempsy.com            & ((ULL(1) << tagTableTagWidths[bank]) - 1));
18613685Sjavier.bueno@metempsy.com}
18713685Sjavier.bueno@metempsy.com
18813685Sjavier.bueno@metempsy.comvoid
18913685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::handleAllocAndUReset(
19013685Sjavier.bueno@metempsy.com    bool alloc, bool taken, TAGEBase::BranchInfo* bi, int nrand)
19113685Sjavier.bueno@metempsy.com{
19213685Sjavier.bueno@metempsy.com    if (!alloc) {
19313685Sjavier.bueno@metempsy.com        return;
19413685Sjavier.bueno@metempsy.com    }
19513685Sjavier.bueno@metempsy.com
19613685Sjavier.bueno@metempsy.com    int penalty = 0;
19713685Sjavier.bueno@metempsy.com    int truePen = 0;
19813685Sjavier.bueno@metempsy.com    int numAllocated = 0;
19913685Sjavier.bueno@metempsy.com    bool maxAllocReached = false;
20013685Sjavier.bueno@metempsy.com
20113685Sjavier.bueno@metempsy.com    for (int I = calcDep(bi); I < nHistoryTables; I += 2) {
20213685Sjavier.bueno@metempsy.com        // Handle the 2-way associativity for allocation
20313685Sjavier.bueno@metempsy.com        for (int j = 0; j < 2; ++j) {
20413685Sjavier.bueno@metempsy.com            int i = ((j == 0) ? I : (I ^ 1)) + 1;
20513685Sjavier.bueno@metempsy.com            if (i > nHistoryTables) {
20613685Sjavier.bueno@metempsy.com                break;
20713685Sjavier.bueno@metempsy.com            }
20813685Sjavier.bueno@metempsy.com            if (noSkip[i]) {
20913685Sjavier.bueno@metempsy.com                if (gtable[i][bi->tableIndices[i]].u == 0) {
21013685Sjavier.bueno@metempsy.com                    gtable[i][bi->tableIndices[i]].u =
21113685Sjavier.bueno@metempsy.com                        ((random_mt.random<int>() & 31) == 0);
21213685Sjavier.bueno@metempsy.com                    // protect randomly from fast replacement
21313685Sjavier.bueno@metempsy.com                    gtable[i][bi->tableIndices[i]].tag = bi->tableTags[i];
21413685Sjavier.bueno@metempsy.com                    gtable[i][bi->tableIndices[i]].ctr = taken ? 0 : -1;
21513685Sjavier.bueno@metempsy.com                    numAllocated++;
21613685Sjavier.bueno@metempsy.com
21713685Sjavier.bueno@metempsy.com                    if (numAllocated == maxNumAlloc) {
21813685Sjavier.bueno@metempsy.com                        maxAllocReached = true;
21913685Sjavier.bueno@metempsy.com                        break;
22013685Sjavier.bueno@metempsy.com                    }
22113685Sjavier.bueno@metempsy.com                    I += 2;
22213685Sjavier.bueno@metempsy.com                } else {
22313685Sjavier.bueno@metempsy.com                    int8_t ctr = gtable[i][bi->tableIndices[i]].ctr;
22413685Sjavier.bueno@metempsy.com                    if ((gtable[i][bi->tableIndices[i]].u == 1) &
22513685Sjavier.bueno@metempsy.com                        (abs (2 * ctr + 1) == 1)) {
22613685Sjavier.bueno@metempsy.com                        if ((random_mt.random<int>() & 7) == 0) {
22713685Sjavier.bueno@metempsy.com                            gtable[i][bi->tableIndices[i]].u = 0;
22813685Sjavier.bueno@metempsy.com                        }
22913685Sjavier.bueno@metempsy.com                    } else {
23013685Sjavier.bueno@metempsy.com                        truePen++;
23113685Sjavier.bueno@metempsy.com                    }
23213685Sjavier.bueno@metempsy.com                    penalty++;
23313685Sjavier.bueno@metempsy.com                }
23413685Sjavier.bueno@metempsy.com            } else {
23513685Sjavier.bueno@metempsy.com                break;
23613685Sjavier.bueno@metempsy.com            }
23713685Sjavier.bueno@metempsy.com        }
23813685Sjavier.bueno@metempsy.com        if (maxAllocReached) {
23913685Sjavier.bueno@metempsy.com            break;
24013685Sjavier.bueno@metempsy.com        }
24113685Sjavier.bueno@metempsy.com    }
24213685Sjavier.bueno@metempsy.com
24313685Sjavier.bueno@metempsy.com    tCounter += (truePen + penalty - 5 * numAllocated);
24413685Sjavier.bueno@metempsy.com
24513685Sjavier.bueno@metempsy.com    handleUReset();
24613685Sjavier.bueno@metempsy.com}
24713685Sjavier.bueno@metempsy.com
24813685Sjavier.bueno@metempsy.comvoid
24913685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::resetUctr(uint8_t & u)
25013685Sjavier.bueno@metempsy.com{
25113685Sjavier.bueno@metempsy.com    // On real HW it should be u >>= 1 instead of if > 0 then u--
25213685Sjavier.bueno@metempsy.com    if (u > 0) {
25313685Sjavier.bueno@metempsy.com        u--;
25413685Sjavier.bueno@metempsy.com    }
25513685Sjavier.bueno@metempsy.com}
25613685Sjavier.bueno@metempsy.com
25713685Sjavier.bueno@metempsy.comvoid
25813685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::handleTAGEUpdate(Addr branch_pc, bool taken,
25913685Sjavier.bueno@metempsy.com                                     TAGEBase::BranchInfo* bi)
26013685Sjavier.bueno@metempsy.com{
26113685Sjavier.bueno@metempsy.com    if (bi->hitBank > 0) {
26213685Sjavier.bueno@metempsy.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
26313685Sjavier.bueno@metempsy.com            if (bi->longestMatchPred != taken) { // acts as a protection
26413685Sjavier.bueno@metempsy.com                if (bi->altBank > 0) {
26513685Sjavier.bueno@metempsy.com                    int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
26613685Sjavier.bueno@metempsy.com                    if (abs (2 * ctr + 1) == 1) {
26713685Sjavier.bueno@metempsy.com                        gtable[bi->altBank][bi->altBankIndex].u = 0;
26813685Sjavier.bueno@metempsy.com                    }
26913685Sjavier.bueno@metempsy.com
27013685Sjavier.bueno@metempsy.com                    //just mute from protected to unprotected
27113685Sjavier.bueno@metempsy.com                    ctrUpdate(gtable[bi->altBank][bi->altBankIndex].ctr, taken,
27213685Sjavier.bueno@metempsy.com                              tagTableCounterBits);
27313685Sjavier.bueno@metempsy.com                    ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
27413685Sjavier.bueno@metempsy.com                    if (abs (2 * ctr + 1) == 1) {
27513685Sjavier.bueno@metempsy.com                        gtable[bi->altBank][bi->altBankIndex].u = 0;
27613685Sjavier.bueno@metempsy.com                    }
27713685Sjavier.bueno@metempsy.com                }
27813685Sjavier.bueno@metempsy.com                if (bi->altBank == 0) {
27913685Sjavier.bueno@metempsy.com                    baseUpdate(branch_pc, taken, bi);
28013685Sjavier.bueno@metempsy.com                }
28113685Sjavier.bueno@metempsy.com            }
28213685Sjavier.bueno@metempsy.com        }
28313685Sjavier.bueno@metempsy.com
28413685Sjavier.bueno@metempsy.com        //just mute from protected to unprotected
28513685Sjavier.bueno@metempsy.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
28613685Sjavier.bueno@metempsy.com            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
28713685Sjavier.bueno@metempsy.com        }
28813685Sjavier.bueno@metempsy.com
28913685Sjavier.bueno@metempsy.com        ctrUpdate(gtable[bi->hitBank][bi->hitBankIndex].ctr, taken,
29013685Sjavier.bueno@metempsy.com                  tagTableCounterBits);
29113685Sjavier.bueno@metempsy.com
29213685Sjavier.bueno@metempsy.com        //sign changes: no way it can have been useful
29313685Sjavier.bueno@metempsy.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
29413685Sjavier.bueno@metempsy.com            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
29513685Sjavier.bueno@metempsy.com        }
29613685Sjavier.bueno@metempsy.com
29713685Sjavier.bueno@metempsy.com        if (bi->altTaken == taken) {
29813685Sjavier.bueno@metempsy.com            if (bi->altBank > 0) {
29913685Sjavier.bueno@metempsy.com                int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
30013685Sjavier.bueno@metempsy.com                if (abs (2*ctr + 1) == 7) {
30113685Sjavier.bueno@metempsy.com                    if (gtable[bi->hitBank][bi->hitBankIndex].u == 1) {
30213685Sjavier.bueno@metempsy.com                        if (bi->longestMatchPred == taken) {
30313685Sjavier.bueno@metempsy.com                            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
30413685Sjavier.bueno@metempsy.com                        }
30513685Sjavier.bueno@metempsy.com                    }
30613685Sjavier.bueno@metempsy.com                }
30713685Sjavier.bueno@metempsy.com            }
30813685Sjavier.bueno@metempsy.com        }
30913685Sjavier.bueno@metempsy.com    } else {
31013685Sjavier.bueno@metempsy.com        baseUpdate(branch_pc, taken, bi);
31113685Sjavier.bueno@metempsy.com    }
31213685Sjavier.bueno@metempsy.com
31313685Sjavier.bueno@metempsy.com    if ((bi->longestMatchPred != bi->altTaken) &&
31413685Sjavier.bueno@metempsy.com        (bi->longestMatchPred == taken) &&
31513685Sjavier.bueno@metempsy.com        (gtable[bi->hitBank][bi->hitBankIndex].u < (1 << tagTableUBits) -1)) {
31613685Sjavier.bueno@metempsy.com            gtable[bi->hitBank][bi->hitBankIndex].u++;
31713685Sjavier.bueno@metempsy.com    }
31813685Sjavier.bueno@metempsy.com}
31913685Sjavier.bueno@metempsy.com
32013685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB*
32113685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KBParams::create()
32213685Sjavier.bueno@metempsy.com{
32313685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_TAGE_8KB(this);
32413685Sjavier.bueno@metempsy.com}
32513685Sjavier.bueno@metempsy.com
32613685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB*
32713685Sjavier.bueno@metempsy.comTAGE_SC_L_8KBParams::create()
32813685Sjavier.bueno@metempsy.com{
32913685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_8KB(this);
33013685Sjavier.bueno@metempsy.com}
331