tage_sc_l_8KB.cc revision 13685:bb3377c81303
11689SN/A/*
212109SRekai.GonzalezAlberquilla@arm.com * Copyright (c) 2018 Metempsy Technology Consulting
39919Ssteve.reinhardt@amd.com * All rights reserved.
48707Sandreas.hansson@arm.com *
58707Sandreas.hansson@arm.com * Copyright (c) 2006 INRIA (Institut National de Recherche en
68707Sandreas.hansson@arm.com * Informatique et en Automatique  / French National Research Institute
78707Sandreas.hansson@arm.com * for Computer Science and Applied Mathematics)
88707Sandreas.hansson@arm.com *
98707Sandreas.hansson@arm.com * All rights reserved.
108707Sandreas.hansson@arm.com *
118707Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
128707Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
138707Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
148707Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
151689SN/A * redistributions in binary form must reproduce the above copyright
167897Shestness@cs.utexas.edu * notice, this list of conditions and the following disclaimer in the
171689SN/A * documentation and/or other materials provided with the distribution;
181689SN/A * neither the name of the copyright holders nor the names of its
191689SN/A * contributors may be used to endorse or promote products derived from
201689SN/A * this software without specific prior written permission.
211689SN/A *
221689SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
231689SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
241689SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
251689SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
261689SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
271689SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
281689SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
291689SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
301689SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
311689SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
321689SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
331689SN/A *
341689SN/A * Author: André Seznec, Pau Cabre, Javier Bueno
351689SN/A *
361689SN/A */
371689SN/A
381689SN/A/*
391689SN/A * 8KB TAGE-SC-L branch predictor (devised by Andre Seznec)
401689SN/A */
412665Ssaidi@eecs.umich.edu
422665Ssaidi@eecs.umich.edu#include "cpu/pred/tage_sc_l_8KB.hh"
432756Sksewell@umich.edu
447897Shestness@cs.utexas.edu#include "base/random.hh"
451689SN/A#include "debug/TageSCL.hh"
461689SN/A
472325SN/ATAGE_SC_L_8KB_StatisticalCorrector::TAGE_SC_L_8KB_StatisticalCorrector(
482325SN/A    TAGE_SC_L_8KB_StatisticalCorrectorParams *p)
491060SN/A  : StatisticalCorrector(p),
501060SN/A    gnb(p->gnb),
511060SN/A    logGnb(p->logGnb),
522292SN/A    gm(p->gm)
532292SN/A{
541681SN/A    initGEHLTable(gnb, gm, ggehl, logGnb, wg, 7);
551060SN/A}
5612109SRekai.GonzalezAlberquilla@arm.com
572980Sgblack@eecs.umich.eduTAGE_SC_L_8KB_StatisticalCorrector::SCThreadHistory *
581060SN/ATAGE_SC_L_8KB_StatisticalCorrector::makeThreadHistory()
596658Snate@binkert.org{
601717SN/A    SC_8KB_ThreadHistory *sh = new SC_8KB_ThreadHistory();
611717SN/A    sh->setNumOrdinalHistories(1);
622292SN/A    sh->initLocalHistory(1, numEntriesFirstLocalHistories, 2);
632292SN/A    return sh;
648229Snate@binkert.org}
658229Snate@binkert.org
668229Snate@binkert.orgunsigned
678229Snate@binkert.orgTAGE_SC_L_8KB_StatisticalCorrector::getIndBiasBank(Addr branch_pc,
682817Sksewell@umich.edu        BranchInfo* bi, int hitBank, int altBank) const
698229Snate@binkert.org{
701060SN/A    return (bi->predBeforeSC + (((hitBank+1)/4)<<4) + (bi->highConf<<1) +
711060SN/A            (bi->lowConf <<2) +((altBank!=0)<<3)) & ((1<<logBias) -1);
722316SN/A}
732316SN/A
742680Sktlim@umich.eduint
752817Sksewell@umich.eduTAGE_SC_L_8KB_StatisticalCorrector::gPredictions(
762817Sksewell@umich.edu    ThreadID tid, Addr branch_pc, BranchInfo* bi, int & lsum, int64_t phist)
772843Sktlim@umich.edu{
782843Sktlim@umich.edu    SC_8KB_ThreadHistory *sh = static_cast<SC_8KB_ThreadHistory *>(scHistory);
792669Sktlim@umich.edu    lsum += gPredict(
801060SN/A        branch_pc, sh->globalHist, gm, ggehl, gnb, logGnb, wg);
811060SN/A
828737Skoansin.tan@gmail.com    lsum += gPredict(
835529Snate@binkert.org        branch_pc, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw);
842733Sktlim@umich.edu
851060SN/A    // only 1 local history here
861060SN/A    lsum += gPredict(
871060SN/A        branch_pc, sh->getLocalHistory(1, branch_pc), lm,
885529Snate@binkert.org        lgehl, lnb, logLnb, wl);
892292SN/A
902292SN/A    lsum += gPredict(
911060SN/A        branch_pc, sh->imliCount, im, igehl, inb, logInb, wi);
921060SN/A
932348SN/A    int thres = (updateThreshold>>3)+pUpdateThreshold[getIndUpd(branch_pc)];
942348SN/A
952348SN/A    return thres;
962348SN/A}
972348SN/A
981060SN/Aint TAGE_SC_L_8KB_StatisticalCorrector::gIndexLogsSubstr(int nbr, int i)
992733Sktlim@umich.edu{
1001060SN/A    return 0;
1011060SN/A}
1022325SN/A
1031060SN/Avoid
1041061SN/ATAGE_SC_L_8KB_StatisticalCorrector::scHistoryUpdate(Addr branch_pc, int brtype,
1054329Sktlim@umich.edu    bool taken, BranchInfo * tage_bi, Addr corrTarget)
1061060SN/A{
10712109SRekai.GonzalezAlberquilla@arm.com    // Non speculative SC histories update
10812109SRekai.GonzalezAlberquilla@arm.com    if (brtype & 1) {
10912109SRekai.GonzalezAlberquilla@arm.com        SC_8KB_ThreadHistory *sh =
1105595Sgblack@eecs.umich.edu            static_cast<SC_8KB_ThreadHistory *>(scHistory);
1112292SN/A        sh->globalHist = (sh->globalHist << 1) + taken;
1122292SN/A    }
1132292SN/A
1142292SN/A    StatisticalCorrector::scHistoryUpdate(branch_pc, brtype, taken, tage_bi,
1152817Sksewell@umich.edu                                          corrTarget);
1162829Sksewell@umich.edu}
1171060SN/A
1181060SN/Avoid
1191060SN/ATAGE_SC_L_8KB_StatisticalCorrector::gUpdates(ThreadID tid, Addr pc, bool taken,
1201060SN/A        BranchInfo* bi, int64_t phist)
1211060SN/A{
1222307SN/A    SC_8KB_ThreadHistory *sh = static_cast<SC_8KB_ThreadHistory *>(scHistory);
1232307SN/A    gUpdate(pc, taken, sh->globalHist, gm, ggehl, gnb, logGnb, wg, bi);
1241060SN/A    gUpdate(pc, taken, sh->bwHist, bwm, bwgehl, bwnb, logBwnb, wbw, bi);
1251060SN/A    gUpdate(pc, taken, sh->getLocalHistory(1, pc), lm, lgehl, lnb, logLnb, wl,
12612406Sgabeblack@google.com            bi);
12712406Sgabeblack@google.com    gUpdate(pc, taken, sh->imliCount, im, igehl, inb, logInb, wi, bi);
1283781Sgblack@eecs.umich.edu}
1292292SN/A
1301060SN/ATAGE_SC_L_8KB_StatisticalCorrector*
1311060SN/ATAGE_SC_L_8KB_StatisticalCorrectorParams::create()
1321060SN/A{
1338707Sandreas.hansson@arm.com    return new TAGE_SC_L_8KB_StatisticalCorrector(this);
1348707Sandreas.hansson@arm.com}
1358707Sandreas.hansson@arm.com
1368707Sandreas.hansson@arm.comTAGE_SC_L_8KB::TAGE_SC_L_8KB(const TAGE_SC_L_8KBParams *params)
1379608Sandreas.hansson@arm.com  : TAGE_SC_L(params)
1388707Sandreas.hansson@arm.com{
1398707Sandreas.hansson@arm.com}
1408707Sandreas.hansson@arm.com
1418707Sandreas.hansson@arm.comvoid
1428707Sandreas.hansson@arm.comTAGE_SC_L_TAGE_8KB::initFoldedHistories(ThreadHistory & history)
1438707Sandreas.hansson@arm.com{
1448707Sandreas.hansson@arm.com    // Some hardcoded values are used here
1458707Sandreas.hansson@arm.com    // (they do not seem to depend on any parameter)
1469608Sandreas.hansson@arm.com    for (int i = 1; i <= nHistoryTables; i++) {
1478707Sandreas.hansson@arm.com        history.computeIndices[i].init(
1488707Sandreas.hansson@arm.com            histLengths[i], 17 + (2 * ((i - 1) / 2) % 4));
1498707Sandreas.hansson@arm.com        history.computeTags[0][i].init(
1508707Sandreas.hansson@arm.com            history.computeIndices[i].origLength, 13);
1518707Sandreas.hansson@arm.com        history.computeTags[1][i].init(
1528707Sandreas.hansson@arm.com            history.computeIndices[i].origLength, 11);
1538975Sandreas.hansson@arm.com        DPRINTF(TageSCL, "HistLength:%d, TTSize:%d, TTTWidth:%d\n",
1548707Sandreas.hansson@arm.com                histLengths[i], logTagTableSizes[i], tagTableTagWidths[i]);
1558707Sandreas.hansson@arm.com    }
15610713Sandreas.hansson@arm.com}
1578707Sandreas.hansson@arm.com
1588707Sandreas.hansson@arm.comint
1598707Sandreas.hansson@arm.comTAGE_SC_L_TAGE_8KB::gindex_ext(int index, int bank) const
1608707Sandreas.hansson@arm.com{
1618707Sandreas.hansson@arm.com    return (index ^ (index >> logTagTableSizes[bank])
1629608Sandreas.hansson@arm.com                  ^ (index >> 2 * logTagTableSizes[bank]));
1638707Sandreas.hansson@arm.com}
1648707Sandreas.hansson@arm.com
1658707Sandreas.hansson@arm.comuint16_t
1668707Sandreas.hansson@arm.comTAGE_SC_L_TAGE_8KB::gtag(ThreadID tid, Addr pc, int bank) const
1678707Sandreas.hansson@arm.com{
16810529Smorr@cs.wisc.edu    int tag = (threadHistory[tid].computeIndices[bank - 1].comp << 2) ^ pc ^
1698707Sandreas.hansson@arm.com              (pc >> instShiftAmt) ^
1708707Sandreas.hansson@arm.com              threadHistory[tid].computeIndices[bank].comp;
1718707Sandreas.hansson@arm.com    int hlen = (histLengths[bank] > pathHistBits) ? pathHistBits :
1728707Sandreas.hansson@arm.com                                                    histLengths[bank];
17310529Smorr@cs.wisc.edu
17410529Smorr@cs.wisc.edu    tag = (tag >> 1) ^ ((tag & 1) << 10) ^
1758707Sandreas.hansson@arm.com           F(threadHistory[tid].pathHist, hlen, bank);
1768707Sandreas.hansson@arm.com    tag ^= threadHistory[tid].computeTags[0][bank].comp ^
1778707Sandreas.hansson@arm.com           (threadHistory[tid].computeTags[1][bank].comp << 1);
1788707Sandreas.hansson@arm.com
1798707Sandreas.hansson@arm.com    return ((tag ^ (tag >> tagTableTagWidths[bank]))
1808707Sandreas.hansson@arm.com            & ((ULL(1) << tagTableTagWidths[bank]) - 1));
1818707Sandreas.hansson@arm.com}
1828975Sandreas.hansson@arm.com
1838975Sandreas.hansson@arm.comvoid
1848707Sandreas.hansson@arm.comTAGE_SC_L_TAGE_8KB::handleAllocAndUReset(
1859608Sandreas.hansson@arm.com    bool alloc, bool taken, TAGEBase::BranchInfo* bi, int nrand)
1869608Sandreas.hansson@arm.com{
1879608Sandreas.hansson@arm.com    if (!alloc) {
1889608Sandreas.hansson@arm.com        return;
1899608Sandreas.hansson@arm.com    }
1908707Sandreas.hansson@arm.com
19110713Sandreas.hansson@arm.com    int penalty = 0;
1928707Sandreas.hansson@arm.com    int truePen = 0;
1938707Sandreas.hansson@arm.com    int numAllocated = 0;
1948707Sandreas.hansson@arm.com    bool maxAllocReached = false;
1958707Sandreas.hansson@arm.com
1968707Sandreas.hansson@arm.com    for (int I = calcDep(bi); I < nHistoryTables; I += 2) {
1978711Sandreas.hansson@arm.com        // Handle the 2-way associativity for allocation
1988707Sandreas.hansson@arm.com        for (int j = 0; j < 2; ++j) {
1998922Swilliam.wang@arm.com            int i = ((j == 0) ? I : (I ^ 1)) + 1;
2008707Sandreas.hansson@arm.com            if (i > nHistoryTables) {
2018707Sandreas.hansson@arm.com                break;
2022292SN/A            }
20312127Sspwilson2@wisc.edu            if (noSkip[i]) {
2041060SN/A                if (gtable[i][bi->tableIndices[i]].u == 0) {
2052292SN/A                    gtable[i][bi->tableIndices[i]].u =
2069180Sandreas.hansson@arm.com                        ((random_mt.random<int>() & 31) == 0);
2071060SN/A                    // protect randomly from fast replacement
2081060SN/A                    gtable[i][bi->tableIndices[i]].tag = bi->tableTags[i];
2099179Sandreas.hansson@arm.com                    gtable[i][bi->tableIndices[i]].ctr = taken ? 0 : -1;
2101060SN/A                    numAllocated++;
2119179Sandreas.hansson@arm.com
2121060SN/A                    if (numAllocated == maxNumAlloc) {
2131060SN/A                        maxAllocReached = true;
2142292SN/A                        break;
2151060SN/A                    }
2161060SN/A                    I += 2;
2171060SN/A                } else {
2181060SN/A                    int8_t ctr = gtable[i][bi->tableIndices[i]].ctr;
2191060SN/A                    if ((gtable[i][bi->tableIndices[i]].u == 1) &
2201060SN/A                        (abs (2 * ctr + 1) == 1)) {
2219444SAndreas.Sandberg@ARM.com                        if ((random_mt.random<int>() & 7) == 0) {
22210913Sandreas.sandberg@arm.com                            gtable[i][bi->tableIndices[i]].u = 0;
2239444SAndreas.Sandberg@ARM.com                        }
2249444SAndreas.Sandberg@ARM.com                    } else {
2259444SAndreas.Sandberg@ARM.com                        truePen++;
2269444SAndreas.Sandberg@ARM.com                    }
2279444SAndreas.Sandberg@ARM.com                    penalty++;
2289444SAndreas.Sandberg@ARM.com                }
2299444SAndreas.Sandberg@ARM.com            } else {
2309444SAndreas.Sandberg@ARM.com                break;
2319444SAndreas.Sandberg@ARM.com            }
2329444SAndreas.Sandberg@ARM.com        }
2339444SAndreas.Sandberg@ARM.com        if (maxAllocReached) {
2349444SAndreas.Sandberg@ARM.com            break;
2359444SAndreas.Sandberg@ARM.com        }
2369444SAndreas.Sandberg@ARM.com    }
2379444SAndreas.Sandberg@ARM.com
2389444SAndreas.Sandberg@ARM.com    tCounter += (truePen + penalty - 5 * numAllocated);
2399444SAndreas.Sandberg@ARM.com
2409444SAndreas.Sandberg@ARM.com    handleUReset();
2419444SAndreas.Sandberg@ARM.com}
2429444SAndreas.Sandberg@ARM.com
2439444SAndreas.Sandberg@ARM.comvoid
2449444SAndreas.Sandberg@ARM.comTAGE_SC_L_TAGE_8KB::resetUctr(uint8_t & u)
2459444SAndreas.Sandberg@ARM.com{
2469444SAndreas.Sandberg@ARM.com    // On real HW it should be u >>= 1 instead of if > 0 then u--
2479444SAndreas.Sandberg@ARM.com    if (u > 0) {
2481060SN/A        u--;
2492292SN/A    }
2505595Sgblack@eecs.umich.edu}
2512292SN/A
2521755SN/Avoid
2531060SN/ATAGE_SC_L_TAGE_8KB::handleTAGEUpdate(Addr branch_pc, bool taken,
2542292SN/A                                     TAGEBase::BranchInfo* bi)
25511169Sandreas.hansson@arm.com{
2561684SN/A    if (bi->hitBank > 0) {
25710023Smatt.horsnell@ARM.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
25810023Smatt.horsnell@ARM.com            if (bi->longestMatchPred != taken) { // acts as a protection
25910023Smatt.horsnell@ARM.com                if (bi->altBank > 0) {
26010023Smatt.horsnell@ARM.com                    int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
26111169Sandreas.hansson@arm.com                    if (abs (2 * ctr + 1) == 1) {
26210023Smatt.horsnell@ARM.com                        gtable[bi->altBank][bi->altBankIndex].u = 0;
2635358Sgblack@eecs.umich.edu                    }
2645358Sgblack@eecs.umich.edu
2655358Sgblack@eecs.umich.edu                    //just mute from protected to unprotected
2665358Sgblack@eecs.umich.edu                    ctrUpdate(gtable[bi->altBank][bi->altBankIndex].ctr, taken,
2675358Sgblack@eecs.umich.edu                              tagTableCounterBits);
2685358Sgblack@eecs.umich.edu                    ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
2695358Sgblack@eecs.umich.edu                    if (abs (2 * ctr + 1) == 1) {
2705358Sgblack@eecs.umich.edu                        gtable[bi->altBank][bi->altBankIndex].u = 0;
2715358Sgblack@eecs.umich.edu                    }
2725358Sgblack@eecs.umich.edu                }
2735358Sgblack@eecs.umich.edu                if (bi->altBank == 0) {
2745358Sgblack@eecs.umich.edu                    baseUpdate(branch_pc, taken, bi);
2755358Sgblack@eecs.umich.edu                }
2765358Sgblack@eecs.umich.edu            }
2775358Sgblack@eecs.umich.edu        }
2785358Sgblack@eecs.umich.edu
2792292SN/A        //just mute from protected to unprotected
2802292SN/A        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
2812292SN/A            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
2821684SN/A        }
2831684SN/A
2842292SN/A        ctrUpdate(gtable[bi->hitBank][bi->hitBankIndex].ctr, taken,
28511169Sandreas.hansson@arm.com                  tagTableCounterBits);
2861060SN/A
28711169Sandreas.hansson@arm.com        //sign changes: no way it can have been useful
2889427SAndreas.Sandberg@ARM.com        if (abs (2 * gtable[bi->hitBank][bi->hitBankIndex].ctr + 1) == 1) {
2892834Sksewell@umich.edu            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
2902834Sksewell@umich.edu        }
2912834Sksewell@umich.edu
2922834Sksewell@umich.edu        if (bi->altTaken == taken) {
2932829Sksewell@umich.edu            if (bi->altBank > 0) {
2946221Snate@binkert.org                int8_t ctr = gtable[bi->altBank][bi->altBankIndex].ctr;
2952875Sksewell@umich.edu                if (abs (2*ctr + 1) == 7) {
2962875Sksewell@umich.edu                    if (gtable[bi->hitBank][bi->hitBankIndex].u == 1) {
2976221Snate@binkert.org                        if (bi->longestMatchPred == taken) {
2982829Sksewell@umich.edu                            gtable[bi->hitBank][bi->hitBankIndex].u = 0;
2992292SN/A                        }
3006221Snate@binkert.org                    }
3011060SN/A                }
3022292SN/A            }
3036221Snate@binkert.org        }
3042292SN/A    } else {
3052292SN/A        baseUpdate(branch_pc, taken, bi);
30611169Sandreas.hansson@arm.com    }
3078834Satgutier@umich.edu
3088834Satgutier@umich.edu    if ((bi->longestMatchPred != bi->altTaken) &&
30911169Sandreas.hansson@arm.com        (bi->longestMatchPred == taken) &&
3102292SN/A        (gtable[bi->hitBank][bi->hitBankIndex].u < (1 << tagTableUBits) -1)) {
3112292SN/A            gtable[bi->hitBank][bi->hitBankIndex].u++;
31211169Sandreas.hansson@arm.com    }
3132292SN/A}
3142292SN/A
31511169Sandreas.hansson@arm.comTAGE_SC_L_TAGE_8KB*
3162292SN/ATAGE_SC_L_TAGE_8KBParams::create()
3172292SN/A{
3182292SN/A    return new TAGE_SC_L_TAGE_8KB(this);
3192292SN/A}
32011169Sandreas.hansson@arm.com
3212292SN/ATAGE_SC_L_8KB*
3222292SN/ATAGE_SC_L_8KBParams::create()
3232292SN/A{
3242292SN/A    return new TAGE_SC_L_8KB(this);
3259444SAndreas.Sandberg@ARM.com}
32610913Sandreas.sandberg@arm.com