tage_sc_l_8KB.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 * 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
10413685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::scHistoryUpdate(Addr branch_pc, int brtype,
10513685Sjavier.bueno@metempsy.com    bool taken, BranchInfo * tage_bi, Addr corrTarget)
10613685Sjavier.bueno@metempsy.com{
10713685Sjavier.bueno@metempsy.com    // Non speculative SC histories update
10813685Sjavier.bueno@metempsy.com    if (brtype & 1) {
10913685Sjavier.bueno@metempsy.com        SC_8KB_ThreadHistory *sh =
11013685Sjavier.bueno@metempsy.com            static_cast<SC_8KB_ThreadHistory *>(scHistory);
11113685Sjavier.bueno@metempsy.com        sh->globalHist = (sh->globalHist << 1) + taken;
11213685Sjavier.bueno@metempsy.com    }
11313685Sjavier.bueno@metempsy.com
11413685Sjavier.bueno@metempsy.com    StatisticalCorrector::scHistoryUpdate(branch_pc, brtype, taken, tage_bi,
11513685Sjavier.bueno@metempsy.com                                          corrTarget);
11613685Sjavier.bueno@metempsy.com}
11713685Sjavier.bueno@metempsy.com
11813685Sjavier.bueno@metempsy.comvoid
11913685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector::gUpdates(ThreadID tid, Addr pc, bool taken,
12013685Sjavier.bueno@metempsy.com        BranchInfo* bi, int64_t phist)
12113685Sjavier.bueno@metempsy.com{
12213685Sjavier.bueno@metempsy.com    SC_8KB_ThreadHistory *sh = static_cast<SC_8KB_ThreadHistory *>(scHistory);
12313685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->globalHist, gm, ggehl, gnb, logGnb, wg, bi);
12413685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw, bi);
12513685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->getLocalHistory(1, pc), lm, lgehl, lnb, logLnb, wl,
12613685Sjavier.bueno@metempsy.com            bi);
12713685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->imliCount, im, igehl, inb, logInb, wi, bi);
12813685Sjavier.bueno@metempsy.com}
12913685Sjavier.bueno@metempsy.com
13013685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrector*
13113685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB_StatisticalCorrectorParams::create()
13213685Sjavier.bueno@metempsy.com{
13313685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_8KB_StatisticalCorrector(this);
13413685Sjavier.bueno@metempsy.com}
13513685Sjavier.bueno@metempsy.com
13613685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB::TAGE_SC_L_8KB(const TAGE_SC_L_8KBParams *params)
13713685Sjavier.bueno@metempsy.com  : TAGE_SC_L(params)
13813685Sjavier.bueno@metempsy.com{
13913685Sjavier.bueno@metempsy.com}
14013685Sjavier.bueno@metempsy.com
14113685Sjavier.bueno@metempsy.comvoid
14213685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::initFoldedHistories(ThreadHistory & history)
14313685Sjavier.bueno@metempsy.com{
14413685Sjavier.bueno@metempsy.com    // Some hardcoded values are used here
14513685Sjavier.bueno@metempsy.com    // (they do not seem to depend on any parameter)
14613685Sjavier.bueno@metempsy.com    for (int i = 1; i <= nHistoryTables; i++) {
14713685Sjavier.bueno@metempsy.com        history.computeIndices[i].init(
14813685Sjavier.bueno@metempsy.com            histLengths[i], 17 + (2 * ((i - 1) / 2) % 4));
14913685Sjavier.bueno@metempsy.com        history.computeTags[0][i].init(
15013685Sjavier.bueno@metempsy.com            history.computeIndices[i].origLength, 13);
15113685Sjavier.bueno@metempsy.com        history.computeTags[1][i].init(
15213685Sjavier.bueno@metempsy.com            history.computeIndices[i].origLength, 11);
15313685Sjavier.bueno@metempsy.com        DPRINTF(TageSCL, "HistLength:%d, TTSize:%d, TTTWidth:%d\n",
15413685Sjavier.bueno@metempsy.com                histLengths[i], logTagTableSizes[i], tagTableTagWidths[i]);
15513685Sjavier.bueno@metempsy.com    }
15613685Sjavier.bueno@metempsy.com}
15713685Sjavier.bueno@metempsy.com
15813685Sjavier.bueno@metempsy.comint
15913685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::gindex_ext(int index, int bank) const
16013685Sjavier.bueno@metempsy.com{
16113685Sjavier.bueno@metempsy.com    return (index ^ (index >> logTagTableSizes[bank])
16213685Sjavier.bueno@metempsy.com                  ^ (index >> 2 * logTagTableSizes[bank]));
16313685Sjavier.bueno@metempsy.com}
16413685Sjavier.bueno@metempsy.com
16513685Sjavier.bueno@metempsy.comuint16_t
16613685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::gtag(ThreadID tid, Addr pc, int bank) const
16713685Sjavier.bueno@metempsy.com{
16813685Sjavier.bueno@metempsy.com    int tag = (threadHistory[tid].computeIndices[bank - 1].comp << 2) ^ pc ^
16913685Sjavier.bueno@metempsy.com              (pc >> instShiftAmt) ^
17013685Sjavier.bueno@metempsy.com              threadHistory[tid].computeIndices[bank].comp;
17113685Sjavier.bueno@metempsy.com    int hlen = (histLengths[bank] > pathHistBits) ? pathHistBits :
17213685Sjavier.bueno@metempsy.com                                                    histLengths[bank];
17313685Sjavier.bueno@metempsy.com
17413685Sjavier.bueno@metempsy.com    tag = (tag >> 1) ^ ((tag & 1) << 10) ^
17513685Sjavier.bueno@metempsy.com           F(threadHistory[tid].pathHist, hlen, bank);
17613685Sjavier.bueno@metempsy.com    tag ^= threadHistory[tid].computeTags[0][bank].comp ^
17713685Sjavier.bueno@metempsy.com           (threadHistory[tid].computeTags[1][bank].comp << 1);
17813685Sjavier.bueno@metempsy.com
17913685Sjavier.bueno@metempsy.com    return ((tag ^ (tag >> tagTableTagWidths[bank]))
18013685Sjavier.bueno@metempsy.com            & ((ULL(1) << tagTableTagWidths[bank]) - 1));
18113685Sjavier.bueno@metempsy.com}
18213685Sjavier.bueno@metempsy.com
18313685Sjavier.bueno@metempsy.comvoid
18413685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::handleAllocAndUReset(
18513685Sjavier.bueno@metempsy.com    bool alloc, bool taken, TAGEBase::BranchInfo* bi, int nrand)
18613685Sjavier.bueno@metempsy.com{
18713685Sjavier.bueno@metempsy.com    if (!alloc) {
18813685Sjavier.bueno@metempsy.com        return;
18913685Sjavier.bueno@metempsy.com    }
19013685Sjavier.bueno@metempsy.com
19113685Sjavier.bueno@metempsy.com    int penalty = 0;
19213685Sjavier.bueno@metempsy.com    int truePen = 0;
19313685Sjavier.bueno@metempsy.com    int numAllocated = 0;
19413685Sjavier.bueno@metempsy.com    bool maxAllocReached = false;
19513685Sjavier.bueno@metempsy.com
19613685Sjavier.bueno@metempsy.com    for (int I = calcDep(bi); I < nHistoryTables; I += 2) {
19713685Sjavier.bueno@metempsy.com        // Handle the 2-way associativity for allocation
19813685Sjavier.bueno@metempsy.com        for (int j = 0; j < 2; ++j) {
19913685Sjavier.bueno@metempsy.com            int i = ((j == 0) ? I : (I ^ 1)) + 1;
20013685Sjavier.bueno@metempsy.com            if (i > nHistoryTables) {
20113685Sjavier.bueno@metempsy.com                break;
20213685Sjavier.bueno@metempsy.com            }
20313685Sjavier.bueno@metempsy.com            if (noSkip[i]) {
20413685Sjavier.bueno@metempsy.com                if (gtable[i][bi->tableIndices[i]].u == 0) {
20513685Sjavier.bueno@metempsy.com                    gtable[i][bi->tableIndices[i]].u =
20613685Sjavier.bueno@metempsy.com                        ((random_mt.random<int>() & 31) == 0);
20713685Sjavier.bueno@metempsy.com                    // protect randomly from fast replacement
20813685Sjavier.bueno@metempsy.com                    gtable[i][bi->tableIndices[i]].tag = bi->tableTags[i];
20913685Sjavier.bueno@metempsy.com                    gtable[i][bi->tableIndices[i]].ctr = taken ? 0 : -1;
21013685Sjavier.bueno@metempsy.com                    numAllocated++;
21113685Sjavier.bueno@metempsy.com
21213685Sjavier.bueno@metempsy.com                    if (numAllocated == maxNumAlloc) {
21313685Sjavier.bueno@metempsy.com                        maxAllocReached = true;
21413685Sjavier.bueno@metempsy.com                        break;
21513685Sjavier.bueno@metempsy.com                    }
21613685Sjavier.bueno@metempsy.com                    I += 2;
21713685Sjavier.bueno@metempsy.com                } else {
21813685Sjavier.bueno@metempsy.com                    int8_t ctr = gtable[i][bi->tableIndices[i]].ctr;
21913685Sjavier.bueno@metempsy.com                    if ((gtable[i][bi->tableIndices[i]].u == 1) &
22013685Sjavier.bueno@metempsy.com                        (abs (2 * ctr + 1) == 1)) {
22113685Sjavier.bueno@metempsy.com                        if ((random_mt.random<int>() & 7) == 0) {
22213685Sjavier.bueno@metempsy.com                            gtable[i][bi->tableIndices[i]].u = 0;
22313685Sjavier.bueno@metempsy.com                        }
22413685Sjavier.bueno@metempsy.com                    } else {
22513685Sjavier.bueno@metempsy.com                        truePen++;
22613685Sjavier.bueno@metempsy.com                    }
22713685Sjavier.bueno@metempsy.com                    penalty++;
22813685Sjavier.bueno@metempsy.com                }
22913685Sjavier.bueno@metempsy.com            } else {
23013685Sjavier.bueno@metempsy.com                break;
23113685Sjavier.bueno@metempsy.com            }
23213685Sjavier.bueno@metempsy.com        }
23313685Sjavier.bueno@metempsy.com        if (maxAllocReached) {
23413685Sjavier.bueno@metempsy.com            break;
23513685Sjavier.bueno@metempsy.com        }
23613685Sjavier.bueno@metempsy.com    }
23713685Sjavier.bueno@metempsy.com
23813685Sjavier.bueno@metempsy.com    tCounter += (truePen + penalty - 5 * numAllocated);
23913685Sjavier.bueno@metempsy.com
24013685Sjavier.bueno@metempsy.com    handleUReset();
24113685Sjavier.bueno@metempsy.com}
24213685Sjavier.bueno@metempsy.com
24313685Sjavier.bueno@metempsy.comvoid
24413685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::resetUctr(uint8_t & u)
24513685Sjavier.bueno@metempsy.com{
24613685Sjavier.bueno@metempsy.com    // On real HW it should be u >>= 1 instead of if > 0 then u--
24713685Sjavier.bueno@metempsy.com    if (u > 0) {
24813685Sjavier.bueno@metempsy.com        u--;
24913685Sjavier.bueno@metempsy.com    }
25013685Sjavier.bueno@metempsy.com}
25113685Sjavier.bueno@metempsy.com
25213685Sjavier.bueno@metempsy.comvoid
25313685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB::handleTAGEUpdate(Addr branch_pc, bool taken,
25413685Sjavier.bueno@metempsy.com                                     TAGEBase::BranchInfo* bi)
25513685Sjavier.bueno@metempsy.com{
25613685Sjavier.bueno@metempsy.com    if (bi->hitBank > 0) {
25713685Sjavier.bueno@metempsy.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
25813685Sjavier.bueno@metempsy.com            if (bi->longestMatchPred != taken) { // acts as a protection
25913685Sjavier.bueno@metempsy.com                if (bi->altBank > 0) {
26013685Sjavier.bueno@metempsy.com                    int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
26113685Sjavier.bueno@metempsy.com                    if (abs (2 * ctr + 1) == 1) {
26213685Sjavier.bueno@metempsy.com                        gtable[bi->altBank][bi->altBankIndex].u = 0;
26313685Sjavier.bueno@metempsy.com                    }
26413685Sjavier.bueno@metempsy.com
26513685Sjavier.bueno@metempsy.com                    //just mute from protected to unprotected
26613685Sjavier.bueno@metempsy.com                    ctrUpdate(gtable[bi->altBank][bi->altBankIndex].ctr, taken,
26713685Sjavier.bueno@metempsy.com                              tagTableCounterBits);
26813685Sjavier.bueno@metempsy.com                    ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
26913685Sjavier.bueno@metempsy.com                    if (abs (2 * ctr + 1) == 1) {
27013685Sjavier.bueno@metempsy.com                        gtable[bi->altBank][bi->altBankIndex].u = 0;
27113685Sjavier.bueno@metempsy.com                    }
27213685Sjavier.bueno@metempsy.com                }
27313685Sjavier.bueno@metempsy.com                if (bi->altBank == 0) {
27413685Sjavier.bueno@metempsy.com                    baseUpdate(branch_pc, taken, bi);
27513685Sjavier.bueno@metempsy.com                }
27613685Sjavier.bueno@metempsy.com            }
27713685Sjavier.bueno@metempsy.com        }
27813685Sjavier.bueno@metempsy.com
27913685Sjavier.bueno@metempsy.com        //just mute from protected to unprotected
28013685Sjavier.bueno@metempsy.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
28113685Sjavier.bueno@metempsy.com            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
28213685Sjavier.bueno@metempsy.com        }
28313685Sjavier.bueno@metempsy.com
28413685Sjavier.bueno@metempsy.com        ctrUpdate(gtable[bi->hitBank][bi->hitBankIndex].ctr, taken,
28513685Sjavier.bueno@metempsy.com                  tagTableCounterBits);
28613685Sjavier.bueno@metempsy.com
28713685Sjavier.bueno@metempsy.com        //sign changes: no way it can have been useful
28813685Sjavier.bueno@metempsy.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
28913685Sjavier.bueno@metempsy.com            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
29013685Sjavier.bueno@metempsy.com        }
29113685Sjavier.bueno@metempsy.com
29213685Sjavier.bueno@metempsy.com        if (bi->altTaken == taken) {
29313685Sjavier.bueno@metempsy.com            if (bi->altBank > 0) {
29413685Sjavier.bueno@metempsy.com                int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
29513685Sjavier.bueno@metempsy.com                if (abs (2*ctr + 1) == 7) {
29613685Sjavier.bueno@metempsy.com                    if (gtable[bi->hitBank][bi->hitBankIndex].u == 1) {
29713685Sjavier.bueno@metempsy.com                        if (bi->longestMatchPred == taken) {
29813685Sjavier.bueno@metempsy.com                            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
29913685Sjavier.bueno@metempsy.com                        }
30013685Sjavier.bueno@metempsy.com                    }
30113685Sjavier.bueno@metempsy.com                }
30213685Sjavier.bueno@metempsy.com            }
30313685Sjavier.bueno@metempsy.com        }
30413685Sjavier.bueno@metempsy.com    } else {
30513685Sjavier.bueno@metempsy.com        baseUpdate(branch_pc, taken, bi);
30613685Sjavier.bueno@metempsy.com    }
30713685Sjavier.bueno@metempsy.com
30813685Sjavier.bueno@metempsy.com    if ((bi->longestMatchPred != bi->altTaken) &&
30913685Sjavier.bueno@metempsy.com        (bi->longestMatchPred == taken) &&
31013685Sjavier.bueno@metempsy.com        (gtable[bi->hitBank][bi->hitBankIndex].u < (1 << tagTableUBits) -1)) {
31113685Sjavier.bueno@metempsy.com            gtable[bi->hitBank][bi->hitBankIndex].u++;
31213685Sjavier.bueno@metempsy.com    }
31313685Sjavier.bueno@metempsy.com}
31413685Sjavier.bueno@metempsy.com
31513685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KB*
31613685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_8KBParams::create()
31713685Sjavier.bueno@metempsy.com{
31813685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_TAGE_8KB(this);
31913685Sjavier.bueno@metempsy.com}
32013685Sjavier.bueno@metempsy.com
32113685Sjavier.bueno@metempsy.comTAGE_SC_L_8KB*
32213685Sjavier.bueno@metempsy.comTAGE_SC_L_8KBParams::create()
32313685Sjavier.bueno@metempsy.com{
32413685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_8KB(this);
32513685Sjavier.bueno@metempsy.com}
326