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