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