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