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 * 64KB 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_64KB.hh"
4313685Sjavier.bueno@metempsy.com
4413685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::TAGE_SC_L_64KB_StatisticalCorrector(
4513685Sjavier.bueno@metempsy.com    TAGE_SC_L_64KB_StatisticalCorrectorParams *p)
4613685Sjavier.bueno@metempsy.com  : StatisticalCorrector(p),
4713685Sjavier.bueno@metempsy.com    numEntriesSecondLocalHistories(p->numEntriesSecondLocalHistories),
4813685Sjavier.bueno@metempsy.com    numEntriesThirdLocalHistories(p->numEntriesThirdLocalHistories),
4913685Sjavier.bueno@metempsy.com    pnb(p->pnb),
5013685Sjavier.bueno@metempsy.com    logPnb(p->logPnb),
5113685Sjavier.bueno@metempsy.com    pm(p->pm),
5213685Sjavier.bueno@metempsy.com    snb(p->snb),
5313685Sjavier.bueno@metempsy.com    logSnb(p->logSnb),
5413685Sjavier.bueno@metempsy.com    sm(p->sm),
5513685Sjavier.bueno@metempsy.com    tnb(p->tnb),
5613685Sjavier.bueno@metempsy.com    logTnb(p->logTnb),
5713685Sjavier.bueno@metempsy.com    tm(p->tm),
5813685Sjavier.bueno@metempsy.com    imnb(p->imnb),
5913685Sjavier.bueno@metempsy.com    logImnb(p->logImnb),
6013685Sjavier.bueno@metempsy.com    imm(p->imm)
6113685Sjavier.bueno@metempsy.com{
6213685Sjavier.bueno@metempsy.com    initGEHLTable(pnb, pm, pgehl, logPnb, wp, 7);
6313685Sjavier.bueno@metempsy.com    initGEHLTable(snb, sm, sgehl, logSnb, ws, 7);
6413685Sjavier.bueno@metempsy.com    initGEHLTable(tnb, tm, tgehl, logTnb, wt, 7);
6513685Sjavier.bueno@metempsy.com    initGEHLTable(imnb, imm, imgehl, logImnb, wim, 0);
6613685Sjavier.bueno@metempsy.com
6713685Sjavier.bueno@metempsy.com}
6813685Sjavier.bueno@metempsy.com
6913685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::SCThreadHistory*
7013685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::makeThreadHistory()
7113685Sjavier.bueno@metempsy.com{
7213685Sjavier.bueno@metempsy.com    SC_64KB_ThreadHistory *sh = new SC_64KB_ThreadHistory();
7313685Sjavier.bueno@metempsy.com
7413685Sjavier.bueno@metempsy.com    sh->setNumOrdinalHistories(3);
7513685Sjavier.bueno@metempsy.com    sh->initLocalHistory(1, numEntriesFirstLocalHistories, 2);
7613685Sjavier.bueno@metempsy.com    sh->initLocalHistory(2, numEntriesSecondLocalHistories, 5);
7713685Sjavier.bueno@metempsy.com    sh->initLocalHistory(3, numEntriesThirdLocalHistories, logTnb);
7813685Sjavier.bueno@metempsy.com
7913685Sjavier.bueno@metempsy.com    sh->imHist.resize(1 << im[0]);
8013685Sjavier.bueno@metempsy.com    return sh;
8113685Sjavier.bueno@metempsy.com}
8213685Sjavier.bueno@metempsy.com
8313685Sjavier.bueno@metempsy.comunsigned
8413685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::getIndBiasBank(Addr branch_pc,
8513685Sjavier.bueno@metempsy.com        BranchInfo* bi, int hitBank, int altBank) const
8613685Sjavier.bueno@metempsy.com{
8713685Sjavier.bueno@metempsy.com    return (bi->predBeforeSC + (((hitBank+1)/4)<<4) + (bi->highConf<<1) +
8813685Sjavier.bueno@metempsy.com            (bi->lowConf <<2) + ((altBank!=0)<<3) +
8913685Sjavier.bueno@metempsy.com            ((branch_pc^(branch_pc>>2))<<7)) & ((1<<logBias) -1);
9013685Sjavier.bueno@metempsy.com}
9113685Sjavier.bueno@metempsy.com
9213685Sjavier.bueno@metempsy.comint
9313685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::gPredictions(ThreadID tid, Addr branch_pc,
9413685Sjavier.bueno@metempsy.com        BranchInfo* bi, int & lsum, int64_t pathHist)
9513685Sjavier.bueno@metempsy.com{
9613685Sjavier.bueno@metempsy.com    SC_64KB_ThreadHistory *sh =
9713685Sjavier.bueno@metempsy.com        static_cast<SC_64KB_ThreadHistory *>(scHistory);
9813685Sjavier.bueno@metempsy.com
9913685Sjavier.bueno@metempsy.com    lsum += gPredict(
10013685Sjavier.bueno@metempsy.com        (branch_pc << 1) + bi->predBeforeSC, sh->bwHist, bwm,
10113685Sjavier.bueno@metempsy.com        bwgehl, bwnb, logBwnb, wbw);
10213685Sjavier.bueno@metempsy.com
10313685Sjavier.bueno@metempsy.com    lsum += gPredict(
10413685Sjavier.bueno@metempsy.com        branch_pc, pathHist, pm, pgehl, pnb, logPnb, wp);
10513685Sjavier.bueno@metempsy.com
10613685Sjavier.bueno@metempsy.com    lsum += gPredict(
10713685Sjavier.bueno@metempsy.com        branch_pc, sh->getLocalHistory(1, branch_pc), lm,
10813685Sjavier.bueno@metempsy.com        lgehl, lnb, logLnb, wl);
10913685Sjavier.bueno@metempsy.com
11013685Sjavier.bueno@metempsy.com    lsum += gPredict(
11113685Sjavier.bueno@metempsy.com        branch_pc, sh->getLocalHistory(2, branch_pc), sm,
11213685Sjavier.bueno@metempsy.com        sgehl, snb, logSnb, ws);
11313685Sjavier.bueno@metempsy.com
11413685Sjavier.bueno@metempsy.com    lsum += gPredict(
11513685Sjavier.bueno@metempsy.com        branch_pc, sh->getLocalHistory(3, branch_pc), tm,
11613685Sjavier.bueno@metempsy.com        tgehl, tnb, logTnb, wt);
11713685Sjavier.bueno@metempsy.com
11813685Sjavier.bueno@metempsy.com    lsum += gPredict(
11913685Sjavier.bueno@metempsy.com        branch_pc, sh->imHist[scHistory->imliCount], imm,
12013685Sjavier.bueno@metempsy.com        imgehl, imnb, logImnb, wim);
12113685Sjavier.bueno@metempsy.com
12213685Sjavier.bueno@metempsy.com    lsum += gPredict(
12313685Sjavier.bueno@metempsy.com        branch_pc, sh->imliCount, im, igehl, inb, logInb, wi);
12413685Sjavier.bueno@metempsy.com
12513685Sjavier.bueno@metempsy.com    int thres = (updateThreshold>>3) + pUpdateThreshold[getIndUpd(branch_pc)]
12613685Sjavier.bueno@metempsy.com      + 12*((wb[getIndUpds(branch_pc)] >= 0) + (wp[getIndUpds(branch_pc)] >= 0)
12713685Sjavier.bueno@metempsy.com      + (ws[getIndUpds(branch_pc)] >= 0) + (wt[getIndUpds(branch_pc)] >= 0)
12813685Sjavier.bueno@metempsy.com      + (wl[getIndUpds(branch_pc)] >= 0) + (wbw[getIndUpds(branch_pc)] >= 0)
12913685Sjavier.bueno@metempsy.com      + (wi[getIndUpds(branch_pc)] >= 0));
13013685Sjavier.bueno@metempsy.com
13113685Sjavier.bueno@metempsy.com    return thres;
13213685Sjavier.bueno@metempsy.com}
13313685Sjavier.bueno@metempsy.com
13413685Sjavier.bueno@metempsy.comint
13513685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::gIndexLogsSubstr(int nbr, int i)
13613685Sjavier.bueno@metempsy.com{
13713685Sjavier.bueno@metempsy.com    return (i >= (nbr - 2)) ? 1 : 0;
13813685Sjavier.bueno@metempsy.com}
13913685Sjavier.bueno@metempsy.com
14013685Sjavier.bueno@metempsy.comvoid
14113685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::scHistoryUpdate(Addr branch_pc,
14214081Sjavier.bueno@metempsy.com        const StaticInstPtr &inst, bool taken, BranchInfo* tage_bi,
14314081Sjavier.bueno@metempsy.com        Addr corrTarget)
14413685Sjavier.bueno@metempsy.com{
14514081Sjavier.bueno@metempsy.com    int brtype = inst->isDirectCtrl() ? 0 : 2;
14614081Sjavier.bueno@metempsy.com    if (! inst->isUncondCtrl()) {
14714081Sjavier.bueno@metempsy.com        ++brtype;
14814081Sjavier.bueno@metempsy.com    }
14913685Sjavier.bueno@metempsy.com    // Non speculative SC histories update
15013685Sjavier.bueno@metempsy.com    if (brtype & 1) {
15113685Sjavier.bueno@metempsy.com        SC_64KB_ThreadHistory *sh =
15213685Sjavier.bueno@metempsy.com            static_cast<SC_64KB_ThreadHistory *>(scHistory);
15313685Sjavier.bueno@metempsy.com        int64_t imliCount = sh->imliCount;
15413685Sjavier.bueno@metempsy.com        sh->imHist[imliCount] = (sh->imHist[imliCount] << 1)
15513685Sjavier.bueno@metempsy.com                                + taken;
15613685Sjavier.bueno@metempsy.com        sh->updateLocalHistory(2, branch_pc, taken, branch_pc & 15);
15713685Sjavier.bueno@metempsy.com        sh->updateLocalHistory(3, branch_pc, taken);
15813685Sjavier.bueno@metempsy.com    }
15913685Sjavier.bueno@metempsy.com
16014081Sjavier.bueno@metempsy.com    StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, tage_bi,
16113685Sjavier.bueno@metempsy.com                                          corrTarget);
16213685Sjavier.bueno@metempsy.com}
16313685Sjavier.bueno@metempsy.com
16413685Sjavier.bueno@metempsy.comvoid
16513685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector::gUpdates(ThreadID tid, Addr pc,
16613685Sjavier.bueno@metempsy.com        bool taken, BranchInfo* bi, int64_t phist)
16713685Sjavier.bueno@metempsy.com{
16813685Sjavier.bueno@metempsy.com    SC_64KB_ThreadHistory *sh =
16913685Sjavier.bueno@metempsy.com        static_cast<SC_64KB_ThreadHistory *>(scHistory);
17013685Sjavier.bueno@metempsy.com
17113685Sjavier.bueno@metempsy.com    gUpdate((pc << 1) + bi->predBeforeSC, taken, sh->bwHist, bwm,
17213685Sjavier.bueno@metempsy.com            bwgehl, bwnb, logBwnb, wbw, bi);
17313685Sjavier.bueno@metempsy.com
17413685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, phist, pm,
17513685Sjavier.bueno@metempsy.com            pgehl, pnb, logPnb, wp, bi);
17613685Sjavier.bueno@metempsy.com
17713685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->getLocalHistory(1, pc), lm,
17813685Sjavier.bueno@metempsy.com            lgehl, lnb, logLnb, wl, bi);
17913685Sjavier.bueno@metempsy.com
18013685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->getLocalHistory(2, pc), sm,
18113685Sjavier.bueno@metempsy.com            sgehl, snb, logSnb, ws, bi);
18213685Sjavier.bueno@metempsy.com
18313685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->getLocalHistory(3, pc), tm,
18413685Sjavier.bueno@metempsy.com            tgehl, tnb, logTnb, wt, bi);
18513685Sjavier.bueno@metempsy.com
18613685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->imHist[scHistory->imliCount], imm,
18713685Sjavier.bueno@metempsy.com            imgehl, imnb, logImnb, wim, bi);
18813685Sjavier.bueno@metempsy.com
18913685Sjavier.bueno@metempsy.com    gUpdate(pc, taken, sh->imliCount, im,
19013685Sjavier.bueno@metempsy.com            igehl, inb, logInb, wi, bi);
19113685Sjavier.bueno@metempsy.com}
19213685Sjavier.bueno@metempsy.com
19313685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrector*
19413685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB_StatisticalCorrectorParams::create()
19513685Sjavier.bueno@metempsy.com{
19613685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_64KB_StatisticalCorrector(this);
19713685Sjavier.bueno@metempsy.com}
19813685Sjavier.bueno@metempsy.com
19913685Sjavier.bueno@metempsy.comint
20013685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_64KB::gindex_ext(int index, int bank) const
20113685Sjavier.bueno@metempsy.com{
20213685Sjavier.bueno@metempsy.com    return index;
20313685Sjavier.bueno@metempsy.com}
20413685Sjavier.bueno@metempsy.com
20513685Sjavier.bueno@metempsy.comuint16_t
20613685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_64KB::gtag(ThreadID tid, Addr pc, int bank) const
20713685Sjavier.bueno@metempsy.com{
20813685Sjavier.bueno@metempsy.com    // very similar to the TAGE implementation, but w/o shifting the pc
20913685Sjavier.bueno@metempsy.com    int tag = pc ^ threadHistory[tid].computeTags[0][bank].comp ^
21013685Sjavier.bueno@metempsy.com              (threadHistory[tid].computeTags[1][bank].comp << 1);
21113685Sjavier.bueno@metempsy.com
21213685Sjavier.bueno@metempsy.com    return (tag & ((ULL(1) << tagTableTagWidths[bank]) - 1));
21313685Sjavier.bueno@metempsy.com}
21413685Sjavier.bueno@metempsy.com
21513685Sjavier.bueno@metempsy.comvoid
21613685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_64KB::handleAllocAndUReset(
21713685Sjavier.bueno@metempsy.com    bool alloc, bool taken, TAGEBase::BranchInfo* bi, int nrand)
21813685Sjavier.bueno@metempsy.com{
21913685Sjavier.bueno@metempsy.com    if (! alloc) {
22013685Sjavier.bueno@metempsy.com        return;
22113685Sjavier.bueno@metempsy.com    }
22213685Sjavier.bueno@metempsy.com
22313685Sjavier.bueno@metempsy.com    int penalty = 0;
22413685Sjavier.bueno@metempsy.com    int numAllocated = 0;
22513685Sjavier.bueno@metempsy.com    bool maxAllocReached = false;
22613685Sjavier.bueno@metempsy.com
22713685Sjavier.bueno@metempsy.com    for (int I = calcDep(bi); I < nHistoryTables; I += 2) {
22813685Sjavier.bueno@metempsy.com        // Handle the 2-way associativity for allocation
22913685Sjavier.bueno@metempsy.com        for (int j = 0; j < 2; ++j) {
23013685Sjavier.bueno@metempsy.com            int i = ((j == 0) ? I : (I ^ 1)) + 1;
23113685Sjavier.bueno@metempsy.com            if (noSkip[i]) {
23213685Sjavier.bueno@metempsy.com                if (gtable[i][bi->tableIndices[i]].u == 0) {
23313685Sjavier.bueno@metempsy.com                    int8_t ctr = gtable[i][bi->tableIndices[i]].ctr;
23413685Sjavier.bueno@metempsy.com                    if (abs (2 * ctr + 1) <= 3) {
23513685Sjavier.bueno@metempsy.com                        gtable[i][bi->tableIndices[i]].tag = bi->tableTags[i];
23613685Sjavier.bueno@metempsy.com                        gtable[i][bi->tableIndices[i]].ctr = taken ? 0 : -1;
23713685Sjavier.bueno@metempsy.com                        numAllocated++;
23813685Sjavier.bueno@metempsy.com                        maxAllocReached = (numAllocated == maxNumAlloc);
23913685Sjavier.bueno@metempsy.com                        I += 2;
24013685Sjavier.bueno@metempsy.com                        break;
24113685Sjavier.bueno@metempsy.com                    } else {
24213685Sjavier.bueno@metempsy.com                        if (gtable[i][bi->tableIndices[i]].ctr > 0) {
24313685Sjavier.bueno@metempsy.com                            gtable[i][bi->tableIndices[i]].ctr--;
24413685Sjavier.bueno@metempsy.com                        } else {
24513685Sjavier.bueno@metempsy.com                            gtable[i][bi->tableIndices[i]].ctr++;
24613685Sjavier.bueno@metempsy.com                        }
24713685Sjavier.bueno@metempsy.com                    }
24813685Sjavier.bueno@metempsy.com                } else {
24913685Sjavier.bueno@metempsy.com                    penalty++;
25013685Sjavier.bueno@metempsy.com                }
25113685Sjavier.bueno@metempsy.com            }
25213685Sjavier.bueno@metempsy.com        }
25313685Sjavier.bueno@metempsy.com        if (maxAllocReached) {
25413685Sjavier.bueno@metempsy.com            break;
25513685Sjavier.bueno@metempsy.com        }
25613685Sjavier.bueno@metempsy.com    }
25713685Sjavier.bueno@metempsy.com
25813685Sjavier.bueno@metempsy.com    tCounter += (penalty - 2 * numAllocated);
25913685Sjavier.bueno@metempsy.com
26013685Sjavier.bueno@metempsy.com    handleUReset();
26113685Sjavier.bueno@metempsy.com}
26213685Sjavier.bueno@metempsy.com
26313685Sjavier.bueno@metempsy.comvoid
26413685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_64KB::handleTAGEUpdate(Addr branch_pc, bool taken,
26513685Sjavier.bueno@metempsy.com                                 TAGEBase::BranchInfo* bi)
26613685Sjavier.bueno@metempsy.com{
26713685Sjavier.bueno@metempsy.com    if (bi->hitBank > 0) {
26813685Sjavier.bueno@metempsy.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
26913685Sjavier.bueno@metempsy.com            if (bi->longestMatchPred != taken) {
27013685Sjavier.bueno@metempsy.com                // acts as a protection
27113685Sjavier.bueno@metempsy.com                if (bi->altBank > 0) {
27213685Sjavier.bueno@metempsy.com                    ctrUpdate(gtable[bi->altBank][bi->altBankIndex].ctr, taken,
27313685Sjavier.bueno@metempsy.com                              tagTableCounterBits);
27413685Sjavier.bueno@metempsy.com                }
27513685Sjavier.bueno@metempsy.com                if (bi->altBank == 0){
27613685Sjavier.bueno@metempsy.com                    baseUpdate(branch_pc, taken, bi);
27713685Sjavier.bueno@metempsy.com                }
27813685Sjavier.bueno@metempsy.com            }
27913685Sjavier.bueno@metempsy.com        }
28013685Sjavier.bueno@metempsy.com
28113685Sjavier.bueno@metempsy.com        ctrUpdate(gtable[bi->hitBank][bi->hitBankIndex].ctr, taken,
28213685Sjavier.bueno@metempsy.com                  tagTableCounterBits);
28313685Sjavier.bueno@metempsy.com
28413685Sjavier.bueno@metempsy.com        //sign changes: no way it can have been useful
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        if (bi->altTaken == taken) {
29013685Sjavier.bueno@metempsy.com            if (bi->altBank > 0) {
29113685Sjavier.bueno@metempsy.com                int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
29213685Sjavier.bueno@metempsy.com                if (abs (2 * ctr + 1) == 7) {
29313685Sjavier.bueno@metempsy.com                    if (gtable[bi->hitBank][bi->hitBankIndex].u == 1) {
29413685Sjavier.bueno@metempsy.com                        if (bi->longestMatchPred == taken) {
29513685Sjavier.bueno@metempsy.com                          gtable[bi->hitBank][bi->hitBankIndex].u = 0;
29613685Sjavier.bueno@metempsy.com                        }
29713685Sjavier.bueno@metempsy.com                    }
29813685Sjavier.bueno@metempsy.com                }
29913685Sjavier.bueno@metempsy.com            }
30013685Sjavier.bueno@metempsy.com        }
30113685Sjavier.bueno@metempsy.com    } else {
30213685Sjavier.bueno@metempsy.com        baseUpdate(branch_pc, taken, bi);
30313685Sjavier.bueno@metempsy.com    }
30413685Sjavier.bueno@metempsy.com
30513685Sjavier.bueno@metempsy.com    if ((bi->longestMatchPred != bi->altTaken) &&
30613685Sjavier.bueno@metempsy.com        (bi->longestMatchPred == taken) &&
30713685Sjavier.bueno@metempsy.com        (gtable[bi->hitBank][bi->hitBankIndex].u < (1 << tagTableUBits) -1)) {
30813685Sjavier.bueno@metempsy.com            gtable[bi->hitBank][bi->hitBankIndex].u++;
30913685Sjavier.bueno@metempsy.com    }
31013685Sjavier.bueno@metempsy.com}
31113685Sjavier.bueno@metempsy.com
31213685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_64KB*
31313685Sjavier.bueno@metempsy.comTAGE_SC_L_TAGE_64KBParams::create()
31413685Sjavier.bueno@metempsy.com{
31513685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_TAGE_64KB(this);
31613685Sjavier.bueno@metempsy.com}
31713685Sjavier.bueno@metempsy.com
31813685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB::TAGE_SC_L_64KB(const TAGE_SC_L_64KBParams *params)
31913685Sjavier.bueno@metempsy.com  : TAGE_SC_L(params)
32013685Sjavier.bueno@metempsy.com{
32113685Sjavier.bueno@metempsy.com}
32213685Sjavier.bueno@metempsy.com
32313685Sjavier.bueno@metempsy.comTAGE_SC_L_64KB*
32413685Sjavier.bueno@metempsy.comTAGE_SC_L_64KBParams::create()
32513685Sjavier.bueno@metempsy.com{
32613685Sjavier.bueno@metempsy.com    return new TAGE_SC_L_64KB(this);
32713685Sjavier.bueno@metempsy.com}
328