ltage.cc revision 13627
111784Sarthur.perais@inria.fr/* 211784Sarthur.perais@inria.fr * Copyright (c) 2014 The University of Wisconsin 311784Sarthur.perais@inria.fr * 411784Sarthur.perais@inria.fr * Copyright (c) 2006 INRIA (Institut National de Recherche en 511784Sarthur.perais@inria.fr * Informatique et en Automatique / French National Research Institute 611784Sarthur.perais@inria.fr * for Computer Science and Applied Mathematics) 711784Sarthur.perais@inria.fr * 811784Sarthur.perais@inria.fr * All rights reserved. 911784Sarthur.perais@inria.fr * 1011784Sarthur.perais@inria.fr * Redistribution and use in source and binary forms, with or without 1111784Sarthur.perais@inria.fr * modification, are permitted provided that the following conditions are 1211784Sarthur.perais@inria.fr * met: redistributions of source code must retain the above copyright 1311784Sarthur.perais@inria.fr * notice, this list of conditions and the following disclaimer; 1411784Sarthur.perais@inria.fr * redistributions in binary form must reproduce the above copyright 1511784Sarthur.perais@inria.fr * notice, this list of conditions and the following disclaimer in the 1611784Sarthur.perais@inria.fr * documentation and/or other materials provided with the distribution; 1711784Sarthur.perais@inria.fr * neither the name of the copyright holders nor the names of its 1811784Sarthur.perais@inria.fr * contributors may be used to endorse or promote products derived from 1911784Sarthur.perais@inria.fr * this software without specific prior written permission. 2011784Sarthur.perais@inria.fr * 2111784Sarthur.perais@inria.fr * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2211784Sarthur.perais@inria.fr * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2311784Sarthur.perais@inria.fr * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2411784Sarthur.perais@inria.fr * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2511784Sarthur.perais@inria.fr * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2611784Sarthur.perais@inria.fr * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2711784Sarthur.perais@inria.fr * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2811784Sarthur.perais@inria.fr * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2911784Sarthur.perais@inria.fr * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3011784Sarthur.perais@inria.fr * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3111784Sarthur.perais@inria.fr * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3211784Sarthur.perais@inria.fr * 3311784Sarthur.perais@inria.fr * Authors: Vignyan Reddy, Dibakar Gope and Arthur Perais, 3411784Sarthur.perais@inria.fr * from André Seznec's code. 3511784Sarthur.perais@inria.fr */ 3611784Sarthur.perais@inria.fr 3711784Sarthur.perais@inria.fr/* @file 3811784Sarthur.perais@inria.fr * Implementation of a L-TAGE branch predictor 3911784Sarthur.perais@inria.fr */ 4011784Sarthur.perais@inria.fr 4111784Sarthur.perais@inria.fr#include "cpu/pred/ltage.hh" 4211784Sarthur.perais@inria.fr 4311784Sarthur.perais@inria.fr#include "base/intmath.hh" 4412334Sgabeblack@google.com#include "base/logging.hh" 4511784Sarthur.perais@inria.fr#include "base/trace.hh" 4611784Sarthur.perais@inria.fr#include "debug/Fetch.hh" 4711784Sarthur.perais@inria.fr#include "debug/LTage.hh" 4811784Sarthur.perais@inria.fr 4911784Sarthur.perais@inria.frLTAGE::LTAGE(const LTAGEParams *params) 5013627Sjavier.bueno@metempsy.com : TAGE(params), loopPredictor(params->loop_predictor) 5111784Sarthur.perais@inria.fr{ 5211784Sarthur.perais@inria.fr} 5311784Sarthur.perais@inria.fr 5411784Sarthur.perais@inria.fr//prediction 5511784Sarthur.perais@inria.frbool 5611784Sarthur.perais@inria.frLTAGE::predict(ThreadID tid, Addr branch_pc, bool cond_branch, void* &b) 5711784Sarthur.perais@inria.fr{ 5813627Sjavier.bueno@metempsy.com LTageBranchInfo *bi = new LTageBranchInfo(*tage, *loopPredictor); 5911784Sarthur.perais@inria.fr b = (void*)(bi); 6013454Spau.cabre@metempsy.com 6113626Sjairo.balart@metempsy.com bool pred_taken = tage->tagePredict(tid, branch_pc, cond_branch, 6213626Sjairo.balart@metempsy.com bi->tageBranchInfo); 6311784Sarthur.perais@inria.fr 6413627Sjavier.bueno@metempsy.com pred_taken = loopPredictor->loopPredict(tid, branch_pc, cond_branch, 6513627Sjavier.bueno@metempsy.com bi->lpBranchInfo, pred_taken, 6613627Sjavier.bueno@metempsy.com instShiftAmt); 6711784Sarthur.perais@inria.fr if (cond_branch) { 6813627Sjavier.bueno@metempsy.com if (bi->lpBranchInfo->loopPredUsed) { 6913626Sjairo.balart@metempsy.com bi->tageBranchInfo->provider = LOOP; 7011784Sarthur.perais@inria.fr } 7111784Sarthur.perais@inria.fr DPRINTF(LTage, "Predict for %lx: taken?:%d, loopTaken?:%d, " 7211784Sarthur.perais@inria.fr "loopValid?:%d, loopUseCounter:%d, tagePred:%d, altPred:%d\n", 7313627Sjavier.bueno@metempsy.com branch_pc, pred_taken, bi->lpBranchInfo->loopPred, 7413627Sjavier.bueno@metempsy.com bi->lpBranchInfo->loopPredValid, 7513627Sjavier.bueno@metempsy.com loopPredictor->getLoopUseCounter(), 7613627Sjavier.bueno@metempsy.com bi->tageBranchInfo->tagePred, bi->tageBranchInfo->altTaken); 7713627Sjavier.bueno@metempsy.com } 7813493Spau.cabre@metempsy.com 7913627Sjavier.bueno@metempsy.com // record final prediction 8013627Sjavier.bueno@metempsy.com bi->lpBranchInfo->predTaken = pred_taken; 8113454Spau.cabre@metempsy.com 8211784Sarthur.perais@inria.fr return pred_taken; 8311784Sarthur.perais@inria.fr} 8411784Sarthur.perais@inria.fr 8511784Sarthur.perais@inria.frvoid 8613626Sjairo.balart@metempsy.comLTAGE::update(ThreadID tid, Addr branch_pc, bool taken, void* bp_history, 8713626Sjairo.balart@metempsy.com bool squashed, const StaticInstPtr & inst, Addr corrTarget) 8811784Sarthur.perais@inria.fr{ 8913626Sjairo.balart@metempsy.com assert(bp_history); 9011784Sarthur.perais@inria.fr 9113626Sjairo.balart@metempsy.com LTageBranchInfo* bi = static_cast<LTageBranchInfo*>(bp_history); 9213626Sjairo.balart@metempsy.com 9313627Sjavier.bueno@metempsy.com assert(corrTarget != MaxAddr); 9413627Sjavier.bueno@metempsy.com 9513626Sjairo.balart@metempsy.com if (squashed) { 9613626Sjairo.balart@metempsy.com if (tage->isSpeculativeUpdateEnabled()) { 9713626Sjairo.balart@metempsy.com // This restores the global history, then update it 9813626Sjairo.balart@metempsy.com // and recomputes the folded histories. 9913626Sjairo.balart@metempsy.com tage->squash(tid, taken, bi->tageBranchInfo, corrTarget); 10013627Sjavier.bueno@metempsy.com 10113627Sjavier.bueno@metempsy.com if (bi->tageBranchInfo->condBranch) { 10213627Sjavier.bueno@metempsy.com loopPredictor->squashLoop(bi->lpBranchInfo); 10313627Sjavier.bueno@metempsy.com } 10413626Sjairo.balart@metempsy.com } 10513626Sjairo.balart@metempsy.com return; 10613493Spau.cabre@metempsy.com } 10711784Sarthur.perais@inria.fr 10813626Sjairo.balart@metempsy.com int nrand = TAGEBase::getRandom() & 3; 10913626Sjairo.balart@metempsy.com if (bi->tageBranchInfo->condBranch) { 11013626Sjairo.balart@metempsy.com DPRINTF(LTage, "Updating tables for branch:%lx; taken?:%d\n", 11113626Sjairo.balart@metempsy.com branch_pc, taken); 11213626Sjairo.balart@metempsy.com tage->updateStats(taken, bi->tageBranchInfo); 11313626Sjairo.balart@metempsy.com 11413627Sjavier.bueno@metempsy.com loopPredictor->updateStats(taken, bi->lpBranchInfo); 11513627Sjavier.bueno@metempsy.com 11613627Sjavier.bueno@metempsy.com loopPredictor->condBranchUpdate(tid, branch_pc, taken, 11713627Sjavier.bueno@metempsy.com bi->tageBranchInfo->tagePred, bi->lpBranchInfo, instShiftAmt, 11813627Sjavier.bueno@metempsy.com TAGEBase::getRandom(), TAGEBase::getRandom(), 11913627Sjavier.bueno@metempsy.com TAGEBase::getRandom()); 12013626Sjairo.balart@metempsy.com 12113626Sjairo.balart@metempsy.com tage->condBranchUpdate(tid, branch_pc, taken, bi->tageBranchInfo, 12213626Sjairo.balart@metempsy.com nrand, corrTarget); 12311784Sarthur.perais@inria.fr } 12411784Sarthur.perais@inria.fr 12513626Sjairo.balart@metempsy.com tage->updateHistories(tid, branch_pc, taken, bi->tageBranchInfo, false, 12613626Sjairo.balart@metempsy.com inst, corrTarget); 12713493Spau.cabre@metempsy.com 12813626Sjairo.balart@metempsy.com delete bi; 12911784Sarthur.perais@inria.fr} 13011784Sarthur.perais@inria.fr 13111784Sarthur.perais@inria.frvoid 13211784Sarthur.perais@inria.frLTAGE::squash(ThreadID tid, void *bp_history) 13311784Sarthur.perais@inria.fr{ 13413454Spau.cabre@metempsy.com LTageBranchInfo* bi = (LTageBranchInfo*)(bp_history); 13513626Sjairo.balart@metempsy.com 13613626Sjairo.balart@metempsy.com if (bi->tageBranchInfo->condBranch) { 13713627Sjavier.bueno@metempsy.com loopPredictor->squash(tid, bi->lpBranchInfo); 13811784Sarthur.perais@inria.fr } 13911784Sarthur.perais@inria.fr 14013454Spau.cabre@metempsy.com TAGE::squash(tid, bp_history); 14111784Sarthur.perais@inria.fr} 14211784Sarthur.perais@inria.fr 14313455Spau.cabre@metempsy.comvoid 14413455Spau.cabre@metempsy.comLTAGE::regStats() 14513455Spau.cabre@metempsy.com{ 14613455Spau.cabre@metempsy.com TAGE::regStats(); 14713455Spau.cabre@metempsy.com} 14813455Spau.cabre@metempsy.com 14911784Sarthur.perais@inria.frLTAGE* 15011784Sarthur.perais@inria.frLTAGEParams::create() 15111784Sarthur.perais@inria.fr{ 15211784Sarthur.perais@inria.fr return new LTAGE(this); 15311784Sarthur.perais@inria.fr} 154