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