bpred_unit.hh revision 10417:710ee116eb68
19022Sgblack@eecs.umich.edu/*
29022Sgblack@eecs.umich.edu * Copyright (c) 2011-2012, 2014 ARM Limited
39022Sgblack@eecs.umich.edu * Copyright (c) 2010 The University of Edinburgh
49022Sgblack@eecs.umich.edu * All rights reserved
59022Sgblack@eecs.umich.edu *
69022Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
79022Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
89022Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
99022Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
109022Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
119022Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
129022Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
139022Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
149022Sgblack@eecs.umich.edu *
159022Sgblack@eecs.umich.edu * Copyright (c) 2004-2005 The Regents of The University of Michigan
169022Sgblack@eecs.umich.edu * All rights reserved.
179022Sgblack@eecs.umich.edu *
189022Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
199022Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
209022Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
219022Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
229022Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
239022Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
249022Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
259022Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
269022Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
279022Sgblack@eecs.umich.edu * this software without specific prior written permission.
289022Sgblack@eecs.umich.edu *
299022Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
309022Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
319022Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
329023Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
339023Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
349023Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
359023Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
369023Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
379023Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
389022Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
399022Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
409022Sgblack@eecs.umich.edu *
419023Sgblack@eecs.umich.edu * Authors: Kevin Lim
429023Sgblack@eecs.umich.edu *          Korey Sewell
439023Sgblack@eecs.umich.edu *          Timothy M. Jones
449023Sgblack@eecs.umich.edu *          Nilay Vaish
459023Sgblack@eecs.umich.edu */
469023Sgblack@eecs.umich.edu
479023Sgblack@eecs.umich.edu#ifndef __CPU_PRED_BPRED_UNIT_HH__
489023Sgblack@eecs.umich.edu#define __CPU_PRED_BPRED_UNIT_HH__
499023Sgblack@eecs.umich.edu
509023Sgblack@eecs.umich.edu#include <deque>
519023Sgblack@eecs.umich.edu
529023Sgblack@eecs.umich.edu#include "base/statistics.hh"
539023Sgblack@eecs.umich.edu#include "base/types.hh"
549023Sgblack@eecs.umich.edu#include "cpu/pred/btb.hh"
559023Sgblack@eecs.umich.edu#include "cpu/pred/ras.hh"
569023Sgblack@eecs.umich.edu#include "cpu/inst_seq.hh"
579023Sgblack@eecs.umich.edu#include "cpu/static_inst.hh"
589023Sgblack@eecs.umich.edu#include "params/BranchPredictor.hh"
599023Sgblack@eecs.umich.edu#include "sim/sim_object.hh"
609023Sgblack@eecs.umich.edu
619023Sgblack@eecs.umich.edu/**
629023Sgblack@eecs.umich.edu * Basically a wrapper class to hold both the branch predictor
639023Sgblack@eecs.umich.edu * and the BTB.
649023Sgblack@eecs.umich.edu */
659023Sgblack@eecs.umich.educlass BPredUnit : public SimObject
669023Sgblack@eecs.umich.edu{
679023Sgblack@eecs.umich.edu  public:
689023Sgblack@eecs.umich.edu      typedef BranchPredictorParams Params;
699023Sgblack@eecs.umich.edu    /**
709023Sgblack@eecs.umich.edu     * @param params The params object, that has the size of the BP and BTB.
719023Sgblack@eecs.umich.edu     */
729023Sgblack@eecs.umich.edu    BPredUnit(const Params *p);
739023Sgblack@eecs.umich.edu
749023Sgblack@eecs.umich.edu    /**
759023Sgblack@eecs.umich.edu     * Registers statistics.
769023Sgblack@eecs.umich.edu     */
779023Sgblack@eecs.umich.edu    void regStats();
789023Sgblack@eecs.umich.edu
799023Sgblack@eecs.umich.edu    /** Perform sanity checks after a drain. */
809023Sgblack@eecs.umich.edu    void drainSanityCheck() const;
819023Sgblack@eecs.umich.edu
829023Sgblack@eecs.umich.edu    /**
839023Sgblack@eecs.umich.edu     * Predicts whether or not the instruction is a taken branch, and the
849023Sgblack@eecs.umich.edu     * target of the branch if it is taken.
859023Sgblack@eecs.umich.edu     * @param inst The branch instruction.
869023Sgblack@eecs.umich.edu     * @param PC The predicted PC is passed back through this parameter.
879023Sgblack@eecs.umich.edu     * @param tid The thread id.
889023Sgblack@eecs.umich.edu     * @return Returns if the branch is taken or not.
899023Sgblack@eecs.umich.edu     */
909023Sgblack@eecs.umich.edu    bool predict(const StaticInstPtr &inst, const InstSeqNum &seqNum,
919023Sgblack@eecs.umich.edu                 TheISA::PCState &pc, ThreadID tid);
929023Sgblack@eecs.umich.edu    bool predictInOrder(const StaticInstPtr &inst, const InstSeqNum &seqNum,
939023Sgblack@eecs.umich.edu                        int asid, TheISA::PCState &instPC,
949023Sgblack@eecs.umich.edu                        TheISA::PCState &predPC, ThreadID tid);
959023Sgblack@eecs.umich.edu
969023Sgblack@eecs.umich.edu    // @todo: Rename this function.
979023Sgblack@eecs.umich.edu    virtual void uncondBranch(void * &bp_history) = 0;
989023Sgblack@eecs.umich.edu
999023Sgblack@eecs.umich.edu    /**
1009023Sgblack@eecs.umich.edu     * Tells the branch predictor to commit any updates until the given
1019023Sgblack@eecs.umich.edu     * sequence number.
1029023Sgblack@eecs.umich.edu     * @param done_sn The sequence number to commit any older updates up until.
1039023Sgblack@eecs.umich.edu     * @param tid The thread id.
1049023Sgblack@eecs.umich.edu     */
1059023Sgblack@eecs.umich.edu    void update(const InstSeqNum &done_sn, ThreadID tid);
1069023Sgblack@eecs.umich.edu
1079023Sgblack@eecs.umich.edu    /**
1089023Sgblack@eecs.umich.edu     * Squashes all outstanding updates until a given sequence number.
1099023Sgblack@eecs.umich.edu     * @param squashed_sn The sequence number to squash any younger updates up
1109023Sgblack@eecs.umich.edu     * until.
1119023Sgblack@eecs.umich.edu     * @param tid The thread id.
1129023Sgblack@eecs.umich.edu     */
1139023Sgblack@eecs.umich.edu    void squash(const InstSeqNum &squashed_sn, ThreadID tid);
1149023Sgblack@eecs.umich.edu
1159023Sgblack@eecs.umich.edu    /**
1169023Sgblack@eecs.umich.edu     * Squashes all outstanding updates until a given sequence number, and
1179023Sgblack@eecs.umich.edu     * corrects that sn's update with the proper address and taken/not taken.
1189023Sgblack@eecs.umich.edu     * @param squashed_sn The sequence number to squash any younger updates up
1199023Sgblack@eecs.umich.edu     * until.
1209023Sgblack@eecs.umich.edu     * @param corr_target The correct branch target.
1219023Sgblack@eecs.umich.edu     * @param actually_taken The correct branch direction.
1229023Sgblack@eecs.umich.edu     * @param tid The thread id.
1239023Sgblack@eecs.umich.edu     */
1249023Sgblack@eecs.umich.edu    void squash(const InstSeqNum &squashed_sn,
1259023Sgblack@eecs.umich.edu                const TheISA::PCState &corr_target,
1269023Sgblack@eecs.umich.edu                bool actually_taken, ThreadID tid);
1279023Sgblack@eecs.umich.edu
1289023Sgblack@eecs.umich.edu    /**
1299023Sgblack@eecs.umich.edu     * @param bp_history Pointer to the history object.  The predictor
1309023Sgblack@eecs.umich.edu     * will need to update any state and delete the object.
1319023Sgblack@eecs.umich.edu     */
1329023Sgblack@eecs.umich.edu    virtual void squash(void *bp_history) = 0;
1339023Sgblack@eecs.umich.edu
1349023Sgblack@eecs.umich.edu    /**
1359023Sgblack@eecs.umich.edu     * Looks up a given PC in the BP to see if it is taken or not taken.
1369023Sgblack@eecs.umich.edu     * @param inst_PC The PC to look up.
1379023Sgblack@eecs.umich.edu     * @param bp_history Pointer that will be set to an object that
1389023Sgblack@eecs.umich.edu     * has the branch predictor state associated with the lookup.
1399023Sgblack@eecs.umich.edu     * @return Whether the branch is taken or not taken.
1409023Sgblack@eecs.umich.edu     */
1419023Sgblack@eecs.umich.edu    virtual bool lookup(Addr instPC, void * &bp_history) = 0;
1429023Sgblack@eecs.umich.edu
1439023Sgblack@eecs.umich.edu     /**
1449023Sgblack@eecs.umich.edu     * If a branch is not taken, because the BTB address is invalid or missing,
1459023Sgblack@eecs.umich.edu     * this function sets the appropriate counter in the global and local
1469023Sgblack@eecs.umich.edu     * predictors to not taken.
1479023Sgblack@eecs.umich.edu     * @param inst_PC The PC to look up the local predictor.
1489023Sgblack@eecs.umich.edu     * @param bp_history Pointer that will be set to an object that
1499023Sgblack@eecs.umich.edu     * has the branch predictor state associated with the lookup.
1509023Sgblack@eecs.umich.edu     */
1519023Sgblack@eecs.umich.edu    virtual void btbUpdate(Addr instPC, void * &bp_history) = 0;
1529023Sgblack@eecs.umich.edu
1539023Sgblack@eecs.umich.edu    /**
1549023Sgblack@eecs.umich.edu     * Looks up a given PC in the BTB to see if a matching entry exists.
1559023Sgblack@eecs.umich.edu     * @param inst_PC The PC to look up.
1569023Sgblack@eecs.umich.edu     * @return Whether the BTB contains the given PC.
1579023Sgblack@eecs.umich.edu     */
1589023Sgblack@eecs.umich.edu    bool BTBValid(Addr instPC)
1599023Sgblack@eecs.umich.edu    { return BTB.valid(instPC, 0); }
1609023Sgblack@eecs.umich.edu
1619023Sgblack@eecs.umich.edu    /**
1629023Sgblack@eecs.umich.edu     * Looks up a given PC in the BTB to get the predicted target.
1639023Sgblack@eecs.umich.edu     * @param inst_PC The PC to look up.
1649023Sgblack@eecs.umich.edu     * @return The address of the target of the branch.
1659023Sgblack@eecs.umich.edu     */
1669023Sgblack@eecs.umich.edu    TheISA::PCState BTBLookup(Addr instPC)
1679023Sgblack@eecs.umich.edu    { return BTB.lookup(instPC, 0); }
1689023Sgblack@eecs.umich.edu
1699023Sgblack@eecs.umich.edu    /**
1709023Sgblack@eecs.umich.edu     * Updates the BP with taken/not taken information.
1719023Sgblack@eecs.umich.edu     * @param inst_PC The branch's PC that will be updated.
1729023Sgblack@eecs.umich.edu     * @param taken Whether the branch was taken or not taken.
1739023Sgblack@eecs.umich.edu     * @param bp_history Pointer to the branch predictor state that is
1749023Sgblack@eecs.umich.edu     * associated with the branch lookup that is being updated.
1759023Sgblack@eecs.umich.edu     * @param squashed Set to true when this function is called during a
1769023Sgblack@eecs.umich.edu     * squash operation.
1779023Sgblack@eecs.umich.edu     * @todo Make this update flexible enough to handle a global predictor.
1789023Sgblack@eecs.umich.edu     */
1799023Sgblack@eecs.umich.edu    virtual void update(Addr instPC, bool taken, void *bp_history,
1809023Sgblack@eecs.umich.edu                        bool squashed) = 0;
1819023Sgblack@eecs.umich.edu     /**
1829023Sgblack@eecs.umich.edu     * Deletes the associated history with a branch, performs no predictor
1839023Sgblack@eecs.umich.edu     * updates.  Used for branches that mispredict and update tables but
1849023Sgblack@eecs.umich.edu     * are still speculative and later retire.
1859023Sgblack@eecs.umich.edu     * @param bp_history History to delete associated with this predictor
1869023Sgblack@eecs.umich.edu     */
1879023Sgblack@eecs.umich.edu    virtual void retireSquashed(void *bp_history) = 0;
1889023Sgblack@eecs.umich.edu
1899023Sgblack@eecs.umich.edu    /**
1909023Sgblack@eecs.umich.edu     * Updates the BTB with the target of a branch.
1919023Sgblack@eecs.umich.edu     * @param inst_PC The branch's PC that will be updated.
1929023Sgblack@eecs.umich.edu     * @param target_PC The branch's target that will be added to the BTB.
1939023Sgblack@eecs.umich.edu     */
1949023Sgblack@eecs.umich.edu    void BTBUpdate(Addr instPC, const TheISA::PCState &target)
1959023Sgblack@eecs.umich.edu    { BTB.update(instPC, target, 0); }
1969023Sgblack@eecs.umich.edu
1979023Sgblack@eecs.umich.edu    void dump();
1989023Sgblack@eecs.umich.edu
1999023Sgblack@eecs.umich.edu  private:
2009023Sgblack@eecs.umich.edu    struct PredictorHistory {
2019023Sgblack@eecs.umich.edu        /**
2029023Sgblack@eecs.umich.edu         * Makes a predictor history struct that contains any
2039023Sgblack@eecs.umich.edu         * information needed to update the predictor, BTB, and RAS.
2049023Sgblack@eecs.umich.edu         */
2059023Sgblack@eecs.umich.edu        PredictorHistory(const InstSeqNum &seq_num, Addr instPC,
2069023Sgblack@eecs.umich.edu                         bool pred_taken, void *bp_history,
2079023Sgblack@eecs.umich.edu                         ThreadID _tid)
2089023Sgblack@eecs.umich.edu            : seqNum(seq_num), pc(instPC), bpHistory(bp_history), RASTarget(0),
2099023Sgblack@eecs.umich.edu              RASIndex(0), tid(_tid), predTaken(pred_taken), usedRAS(0), pushedRAS(0),
2109023Sgblack@eecs.umich.edu              wasCall(0), wasReturn(0), wasSquashed(0)
2119023Sgblack@eecs.umich.edu        {}
2129023Sgblack@eecs.umich.edu
2139023Sgblack@eecs.umich.edu        bool operator==(const PredictorHistory &entry) const {
2149023Sgblack@eecs.umich.edu            return this->seqNum == entry.seqNum;
2159023Sgblack@eecs.umich.edu        }
2169023Sgblack@eecs.umich.edu
2179023Sgblack@eecs.umich.edu        /** The sequence number for the predictor history entry. */
2189023Sgblack@eecs.umich.edu        InstSeqNum seqNum;
2199023Sgblack@eecs.umich.edu
2209023Sgblack@eecs.umich.edu        /** The PC associated with the sequence number. */
2219023Sgblack@eecs.umich.edu        Addr pc;
2229023Sgblack@eecs.umich.edu
2239023Sgblack@eecs.umich.edu        /** Pointer to the history object passed back from the branch
2249023Sgblack@eecs.umich.edu         * predictor.  It is used to update or restore state of the
2259023Sgblack@eecs.umich.edu         * branch predictor.
2269023Sgblack@eecs.umich.edu         */
2279023Sgblack@eecs.umich.edu        void *bpHistory;
2289023Sgblack@eecs.umich.edu
2299023Sgblack@eecs.umich.edu        /** The RAS target (only valid if a return). */
2309023Sgblack@eecs.umich.edu        TheISA::PCState RASTarget;
2319023Sgblack@eecs.umich.edu
2329023Sgblack@eecs.umich.edu        /** The RAS index of the instruction (only valid if a call). */
2339023Sgblack@eecs.umich.edu        unsigned RASIndex;
2349023Sgblack@eecs.umich.edu
2359023Sgblack@eecs.umich.edu        /** The thread id. */
2369023Sgblack@eecs.umich.edu        ThreadID tid;
2379023Sgblack@eecs.umich.edu
2389023Sgblack@eecs.umich.edu        /** Whether or not it was predicted taken. */
2399023Sgblack@eecs.umich.edu        bool predTaken;
2409023Sgblack@eecs.umich.edu
2419023Sgblack@eecs.umich.edu        /** Whether or not the RAS was used. */
2429023Sgblack@eecs.umich.edu        bool usedRAS;
2439023Sgblack@eecs.umich.edu
2449023Sgblack@eecs.umich.edu        /* Whether or not the RAS was pushed */
2459023Sgblack@eecs.umich.edu        bool pushedRAS;
2469023Sgblack@eecs.umich.edu
2479023Sgblack@eecs.umich.edu        /** Whether or not the instruction was a call. */
2489023Sgblack@eecs.umich.edu        bool wasCall;
2499023Sgblack@eecs.umich.edu
2509023Sgblack@eecs.umich.edu        /** Whether or not the instruction was a return. */
2519023Sgblack@eecs.umich.edu        bool wasReturn;
2529023Sgblack@eecs.umich.edu
2539023Sgblack@eecs.umich.edu        /** Whether this instruction has already mispredicted/updated bp */
2549023Sgblack@eecs.umich.edu        bool wasSquashed;
2559023Sgblack@eecs.umich.edu    };
2569023Sgblack@eecs.umich.edu
2579023Sgblack@eecs.umich.edu    typedef std::deque<PredictorHistory> History;
2589023Sgblack@eecs.umich.edu
2599023Sgblack@eecs.umich.edu    /** Number of the threads for which the branch history is maintained. */
2609023Sgblack@eecs.umich.edu    uint32_t numThreads;
2619023Sgblack@eecs.umich.edu
2629023Sgblack@eecs.umich.edu    /**
2639023Sgblack@eecs.umich.edu     * The per-thread predictor history. This is used to update the predictor
2649023Sgblack@eecs.umich.edu     * as instructions are committed, or restore it to the proper state after
2659023Sgblack@eecs.umich.edu     * a squash.
2669023Sgblack@eecs.umich.edu     */
2679023Sgblack@eecs.umich.edu    std::vector<History> predHist;
2689023Sgblack@eecs.umich.edu
2699023Sgblack@eecs.umich.edu    /** The BTB. */
2709023Sgblack@eecs.umich.edu    DefaultBTB BTB;
2719023Sgblack@eecs.umich.edu
2729023Sgblack@eecs.umich.edu    /** The per-thread return address stack. */
2739023Sgblack@eecs.umich.edu    std::vector<ReturnAddrStack> RAS;
2749023Sgblack@eecs.umich.edu
2759023Sgblack@eecs.umich.edu    /** Stat for number of BP lookups. */
2769023Sgblack@eecs.umich.edu    Stats::Scalar lookups;
2779023Sgblack@eecs.umich.edu    /** Stat for number of conditional branches predicted. */
2789023Sgblack@eecs.umich.edu    Stats::Scalar condPredicted;
2799023Sgblack@eecs.umich.edu    /** Stat for number of conditional branches predicted incorrectly. */
2809023Sgblack@eecs.umich.edu    Stats::Scalar condIncorrect;
2819023Sgblack@eecs.umich.edu    /** Stat for number of BTB lookups. */
2829023Sgblack@eecs.umich.edu    Stats::Scalar BTBLookups;
2839023Sgblack@eecs.umich.edu    /** Stat for number of BTB hits. */
2849023Sgblack@eecs.umich.edu    Stats::Scalar BTBHits;
2859023Sgblack@eecs.umich.edu    /** Stat for number of times the BTB is correct. */
2869023Sgblack@eecs.umich.edu    Stats::Scalar BTBCorrect;
2879023Sgblack@eecs.umich.edu    /** Stat for percent times an entry in BTB found. */
2889023Sgblack@eecs.umich.edu    Stats::Formula BTBHitPct;
2899023Sgblack@eecs.umich.edu    /** Stat for number of times the RAS is used to get a target. */
2909023Sgblack@eecs.umich.edu    Stats::Scalar usedRAS;
2919023Sgblack@eecs.umich.edu    /** Stat for number of times the RAS is incorrect. */
2929023Sgblack@eecs.umich.edu    Stats::Scalar RASIncorrect;
2939023Sgblack@eecs.umich.edu};
2949023Sgblack@eecs.umich.edu
2959023Sgblack@eecs.umich.edu#endif // __CPU_PRED_BPRED_UNIT_HH__
2969023Sgblack@eecs.umich.edu