114081Sjavier.bueno@metempsy.com/* 214081Sjavier.bueno@metempsy.com * Copyright 2019 Texas A&M University 314081Sjavier.bueno@metempsy.com * 414081Sjavier.bueno@metempsy.com * Redistribution and use in source and binary forms, with or without 514081Sjavier.bueno@metempsy.com * modification, are permitted provided that the following conditions are met: 614081Sjavier.bueno@metempsy.com * 714081Sjavier.bueno@metempsy.com * 1. Redistributions of source code must retain the above copyright notice, 814081Sjavier.bueno@metempsy.com * this list of conditions and the following disclaimer. 914081Sjavier.bueno@metempsy.com * 1014081Sjavier.bueno@metempsy.com * 2. Redistributions in binary form must reproduce the above copyright notice, 1114081Sjavier.bueno@metempsy.com * this list of conditions and the following disclaimer in the documentation 1214081Sjavier.bueno@metempsy.com * and/or other materials provided with the distribution. 1314081Sjavier.bueno@metempsy.com * 1414081Sjavier.bueno@metempsy.com * 3. Neither the name of the copyright holder nor the names of its 1514081Sjavier.bueno@metempsy.com * contributors may be used to endorse or promote products derived from this 1614081Sjavier.bueno@metempsy.com * software without specific prior written permission. 1714081Sjavier.bueno@metempsy.com * 1814081Sjavier.bueno@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1914081Sjavier.bueno@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2014081Sjavier.bueno@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2114081Sjavier.bueno@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2214081Sjavier.bueno@metempsy.com * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2314081Sjavier.bueno@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2414081Sjavier.bueno@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2514081Sjavier.bueno@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2614081Sjavier.bueno@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2714081Sjavier.bueno@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2814081Sjavier.bueno@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2914081Sjavier.bueno@metempsy.com * 3014081Sjavier.bueno@metempsy.com * Author: Daniel A. Jiménez 3114081Sjavier.bueno@metempsy.com * Adapted to gem5 by: Javier Bueno Hedo 3214081Sjavier.bueno@metempsy.com * 3314081Sjavier.bueno@metempsy.com */ 3414081Sjavier.bueno@metempsy.com 3514081Sjavier.bueno@metempsy.com/* 3614081Sjavier.bueno@metempsy.com * Multiperspective Perceptron Predictor with TAGE (by Daniel A. Jiménez) 3714081Sjavier.bueno@metempsy.com * 8 KB version 3814081Sjavier.bueno@metempsy.com */ 3914081Sjavier.bueno@metempsy.com 4014081Sjavier.bueno@metempsy.com#include "cpu/pred/multiperspective_perceptron_tage_8KB.hh" 4114081Sjavier.bueno@metempsy.com 4214081Sjavier.bueno@metempsy.comMPP_TAGE_8KB* 4314081Sjavier.bueno@metempsy.comMPP_TAGE_8KBParams::create() 4414081Sjavier.bueno@metempsy.com{ 4514081Sjavier.bueno@metempsy.com return new MPP_TAGE_8KB(this); 4614081Sjavier.bueno@metempsy.com} 4714081Sjavier.bueno@metempsy.com 4814081Sjavier.bueno@metempsy.comMPP_LoopPredictor_8KB* 4914081Sjavier.bueno@metempsy.comMPP_LoopPredictor_8KBParams::create() 5014081Sjavier.bueno@metempsy.com{ 5114081Sjavier.bueno@metempsy.com return new MPP_LoopPredictor_8KB(this); 5214081Sjavier.bueno@metempsy.com} 5314081Sjavier.bueno@metempsy.com 5414081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::MPP_StatisticalCorrector_8KB( 5514081Sjavier.bueno@metempsy.com const MPP_StatisticalCorrector_8KBParams *p) 5614081Sjavier.bueno@metempsy.com : MPP_StatisticalCorrector(p) 5714081Sjavier.bueno@metempsy.com{ 5814081Sjavier.bueno@metempsy.com} 5914081Sjavier.bueno@metempsy.com 6014081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::SCThreadHistory* 6114081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::makeThreadHistory() 6214081Sjavier.bueno@metempsy.com{ 6314081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = new MPP_SCThreadHistory(); 6414081Sjavier.bueno@metempsy.com 6514081Sjavier.bueno@metempsy.com sh->setNumOrdinalHistories(1); 6614081Sjavier.bueno@metempsy.com sh->initLocalHistory(1, numEntriesFirstLocalHistories, 4); 6714081Sjavier.bueno@metempsy.com 6814081Sjavier.bueno@metempsy.com return sh; 6914081Sjavier.bueno@metempsy.com} 7014081Sjavier.bueno@metempsy.com 7114081Sjavier.bueno@metempsy.comvoid 7214081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::getBiasLSUM(Addr branch_pc, 7314081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo* bi, int &lsum) const 7414081Sjavier.bueno@metempsy.com{ 7514081Sjavier.bueno@metempsy.com int8_t ctr = bias[getIndBias(branch_pc, bi, false /* unused */)]; 7614081Sjavier.bueno@metempsy.com lsum += 2 * ctr + 1; 7714081Sjavier.bueno@metempsy.com ctr = biasSK[getIndBiasSK(branch_pc, bi)]; 7814081Sjavier.bueno@metempsy.com lsum += 2 * ctr + 1; 7914081Sjavier.bueno@metempsy.com} 8014081Sjavier.bueno@metempsy.com 8114081Sjavier.bueno@metempsy.comint 8214081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::gPredictions(ThreadID tid, Addr branch_pc, 8314081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo* bi, int & lsum, int64_t phist) 8414081Sjavier.bueno@metempsy.com{ 8514081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 8614081Sjavier.bueno@metempsy.com unsigned int pc = branch_pc; 8714081Sjavier.bueno@metempsy.com lsum += gPredict((pc << 1) + bi->predBeforeSC, sh->globalHist << 11, 8814081Sjavier.bueno@metempsy.com gm, ggehl, gnb, logGnb, wg); 8914081Sjavier.bueno@metempsy.com 9014081Sjavier.bueno@metempsy.com // Local History #1 9114081Sjavier.bueno@metempsy.com lsum += 2 * gPredict(branch_pc, sh->getLocalHistory(1, branch_pc), 9214081Sjavier.bueno@metempsy.com lm, lgehl, lnb, logLnb, wl); 9314081Sjavier.bueno@metempsy.com if (sh->getLocalHistory(1, branch_pc) == 2047) lsum += 4; 9414081Sjavier.bueno@metempsy.com if (sh->getLocalHistory(1, branch_pc) == 0) lsum -= 4; 9514081Sjavier.bueno@metempsy.com 9614081Sjavier.bueno@metempsy.com lsum += gPredict(branch_pc, sh->getHistoryStackEntry(), 9714081Sjavier.bueno@metempsy.com pm, pgehl, pnb, logPnb, wp); 9814081Sjavier.bueno@metempsy.com 9914081Sjavier.bueno@metempsy.com int thres = pUpdateThreshold[getIndUpd(branch_pc)]; 10014081Sjavier.bueno@metempsy.com 10114081Sjavier.bueno@metempsy.com return thres; 10214081Sjavier.bueno@metempsy.com} 10314081Sjavier.bueno@metempsy.com 10414081Sjavier.bueno@metempsy.comvoid 10514081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::gUpdates(ThreadID tid, Addr pc, bool taken, 10614081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo* bi, int64_t phist) 10714081Sjavier.bueno@metempsy.com{ 10814081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 10914081Sjavier.bueno@metempsy.com 11014081Sjavier.bueno@metempsy.com gUpdate((pc << 1) + bi->predBeforeSC, taken, sh->globalHist << 11, 11114081Sjavier.bueno@metempsy.com gm, ggehl, gnb, logGnb, wg, bi); 11214081Sjavier.bueno@metempsy.com 11314081Sjavier.bueno@metempsy.com gUpdate(pc, taken, sh->getLocalHistory(1, pc), 11414081Sjavier.bueno@metempsy.com lm, lgehl, lnb, logLnb, wl, bi); 11514081Sjavier.bueno@metempsy.com 11614081Sjavier.bueno@metempsy.com gUpdate(pc, taken, sh->getHistoryStackEntry(), 11714081Sjavier.bueno@metempsy.com pm, pgehl, pnb, logPnb, wp, bi); 11814081Sjavier.bueno@metempsy.com} 11914081Sjavier.bueno@metempsy.com 12014081Sjavier.bueno@metempsy.comvoid 12114081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::scHistoryUpdate(Addr branch_pc, 12214081Sjavier.bueno@metempsy.com const StaticInstPtr &inst, bool taken, 12314081Sjavier.bueno@metempsy.com StatisticalCorrector::BranchInfo *bi, Addr corrTarget) 12414081Sjavier.bueno@metempsy.com{ 12514081Sjavier.bueno@metempsy.com int brtype = inst->isDirectCtrl() ? 0 : 2; 12614081Sjavier.bueno@metempsy.com if (! inst->isUncondCtrl()) { 12714081Sjavier.bueno@metempsy.com ++brtype; 12814081Sjavier.bueno@metempsy.com } 12914081Sjavier.bueno@metempsy.com 13014081Sjavier.bueno@metempsy.com MPP_SCThreadHistory *sh = static_cast<MPP_SCThreadHistory *>(scHistory); 13114081Sjavier.bueno@metempsy.com 13214081Sjavier.bueno@metempsy.com if (brtype & 1) { 13314081Sjavier.bueno@metempsy.com sh->globalHist = (sh->globalHist << 1) + taken; 13414081Sjavier.bueno@metempsy.com } 13514081Sjavier.bueno@metempsy.com sh->updateHistoryStack(corrTarget, taken, inst->isCall(), 13614081Sjavier.bueno@metempsy.com inst->isReturn()); 13714081Sjavier.bueno@metempsy.com 13814081Sjavier.bueno@metempsy.com StatisticalCorrector::scHistoryUpdate(branch_pc, inst, taken, bi, 13914081Sjavier.bueno@metempsy.com corrTarget); 14014081Sjavier.bueno@metempsy.com} 14114081Sjavier.bueno@metempsy.com 14214081Sjavier.bueno@metempsy.comsize_t 14314081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB::getSizeInBits() const 14414081Sjavier.bueno@metempsy.com{ 14514081Sjavier.bueno@metempsy.com size_t bits = 16; //global histories 14614081Sjavier.bueno@metempsy.com 14714081Sjavier.bueno@metempsy.com bits += (1 << logSizeUp) * pUpdateThresholdWidth; 14814081Sjavier.bueno@metempsy.com 14914081Sjavier.bueno@metempsy.com bits += scCountersWidth * 2 * (1 << logBias); //2 bias arrays 15014081Sjavier.bueno@metempsy.com 15114081Sjavier.bueno@metempsy.com bits += (gnb - 2) * (1 << logGnb) * (scCountersWidth - 1) + 15214081Sjavier.bueno@metempsy.com (1 << (logGnb - 1)) * (2 * scCountersWidth - 1); 15314081Sjavier.bueno@metempsy.com 15414081Sjavier.bueno@metempsy.com bits += (pnb - 2) * (1 << logPnb) * (scCountersWidth - 1) + 15514081Sjavier.bueno@metempsy.com (1 << (logPnb - 1)) * (2 * scCountersWidth - 1); 15614081Sjavier.bueno@metempsy.com 15714081Sjavier.bueno@metempsy.com bits += (lnb - 2) * (1 << logLnb) * (scCountersWidth - 1) + 15814081Sjavier.bueno@metempsy.com (1 << (logLnb - 1)) * (2 * scCountersWidth - 1); 15914081Sjavier.bueno@metempsy.com 16014081Sjavier.bueno@metempsy.com bits += numEntriesFirstLocalHistories * lm[0]; 16114081Sjavier.bueno@metempsy.com 16214081Sjavier.bueno@metempsy.com bits += 16 * 16; // History stack 16314081Sjavier.bueno@metempsy.com bits += 4; // History stack pointer 16414081Sjavier.bueno@metempsy.com 16514081Sjavier.bueno@metempsy.com bits += 3 * chooserConfWidth; // 3 chooser counters 16614081Sjavier.bueno@metempsy.com 16714081Sjavier.bueno@metempsy.com return bits; 16814081Sjavier.bueno@metempsy.com} 16914081Sjavier.bueno@metempsy.com 17014081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KB* 17114081Sjavier.bueno@metempsy.comMPP_StatisticalCorrector_8KBParams::create() 17214081Sjavier.bueno@metempsy.com{ 17314081Sjavier.bueno@metempsy.com return new MPP_StatisticalCorrector_8KB(this); 17414081Sjavier.bueno@metempsy.com} 17514081Sjavier.bueno@metempsy.com 17614081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE8KB::MultiperspectivePerceptronTAGE8KB( 17714081Sjavier.bueno@metempsy.com const MultiperspectivePerceptronTAGE8KBParams *p) 17814081Sjavier.bueno@metempsy.com : MultiperspectivePerceptronTAGE(p) 17914081Sjavier.bueno@metempsy.com{ 18014081Sjavier.bueno@metempsy.com} 18114081Sjavier.bueno@metempsy.com 18214081Sjavier.bueno@metempsy.comvoid 18314081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE8KB::createSpecs() 18414081Sjavier.bueno@metempsy.com{ 18514081Sjavier.bueno@metempsy.com addSpec(new BLURRYPATH(5, 15, -1, 2.25, 0, 6, *this)); 18614081Sjavier.bueno@metempsy.com addSpec(new RECENCYPOS(31, 3.5, 0, 6, *this)); 18714081Sjavier.bueno@metempsy.com addSpec(new GHISTMODPATH(3, 7, 1, 2.24, 0, 6, *this)); 18814081Sjavier.bueno@metempsy.com addSpec(new IMLI(1, 2.23, 0, 6, *this)); 18914081Sjavier.bueno@metempsy.com addSpec(new IMLI(4, 1.98, 0, 6, *this)); 19014081Sjavier.bueno@metempsy.com} 19114081Sjavier.bueno@metempsy.com 19214081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE8KB* 19314081Sjavier.bueno@metempsy.comMultiperspectivePerceptronTAGE8KBParams::create() 19414081Sjavier.bueno@metempsy.com{ 19514081Sjavier.bueno@metempsy.com return new MultiperspectivePerceptronTAGE8KB(this); 19614081Sjavier.bueno@metempsy.com} 197