2bit_local.hh revision 1684
110037SARM gem5 Developers#ifndef __CPU_BETA_CPU_2BIT_LOCAL_PRED_HH__
210037SARM gem5 Developers#define __CPU_BETA_CPU_2BIT_LOCAL_PRED_HH__
314058Sgiacomo.travaglini@arm.com
410037SARM gem5 Developers// For Addr type.
510037SARM gem5 Developers#include "arch/alpha/isa_traits.hh"
610037SARM gem5 Developers#include "cpu/beta_cpu/sat_counter.hh"
710037SARM gem5 Developers
810037SARM gem5 Developersclass DefaultBP
910037SARM gem5 Developers{
1010037SARM gem5 Developers  public:
1110037SARM gem5 Developers    /**
1210037SARM gem5 Developers     * Default branch predictor constructor.
1310037SARM gem5 Developers     */
1410037SARM gem5 Developers    DefaultBP(unsigned localPredictorSize, unsigned localCtrBits,
1510037SARM gem5 Developers              unsigned instShiftAmt);
1610037SARM gem5 Developers
1710037SARM gem5 Developers    /**
1810037SARM gem5 Developers     * Looks up the given address in the branch predictor and returns
1910037SARM gem5 Developers     * a true/false value as to whether it is taken.
2010037SARM gem5 Developers     * @param branch_addr The address of the branch to look up.
2110037SARM gem5 Developers     * @return Whether or not the branch is taken.
2210037SARM gem5 Developers     */
2310037SARM gem5 Developers    bool lookup(Addr &branch_addr);
2410037SARM gem5 Developers
2510037SARM gem5 Developers    /**
2610037SARM gem5 Developers     * Updates the branch predictor with the actual result of a branch.
2710037SARM gem5 Developers     * @param branch_addr The address of the branch to update.
2810037SARM gem5 Developers     * @param taken Whether or not the branch was taken.
2910037SARM gem5 Developers     */
3010037SARM gem5 Developers    void update(Addr &branch_addr, bool taken);
3110037SARM gem5 Developers
3210037SARM gem5 Developers  private:
3310037SARM gem5 Developers
3410037SARM gem5 Developers    /** Returns the taken/not taken prediction given the value of the
3510037SARM gem5 Developers     *  counter.
3610037SARM gem5 Developers     */
3710037SARM gem5 Developers    inline bool getPrediction(uint8_t &count);
3810037SARM gem5 Developers
3910037SARM gem5 Developers    /** Calculates the local index based on the PC. */
4010037SARM gem5 Developers    inline unsigned getLocalIndex(Addr &PC);
4110037SARM gem5 Developers
4210037SARM gem5 Developers    /** Array of counters that make up the local predictor. */
4310037SARM gem5 Developers    SatCounter *localCtrs;
4410474Sandreas.hansson@arm.com
4510037SARM gem5 Developers    /** Size of the local predictor. */
4610037SARM gem5 Developers    unsigned localPredictorSize;
4710037SARM gem5 Developers
4810037SARM gem5 Developers    /** Number of bits of the local predictor's counters. */
4910037SARM gem5 Developers    unsigned localCtrBits;
5012234Sgabeblack@google.com
5110037SARM gem5 Developers    /** Number of bits to shift the PC when calculating index. */
5210037SARM gem5 Developers    unsigned instShiftAmt;
5310037SARM gem5 Developers
5410037SARM gem5 Developers    /** Mask to get index bits. */
5510037SARM gem5 Developers    unsigned indexMask;
5610037SARM gem5 Developers};
5710037SARM gem5 Developers
5810037SARM gem5 Developers#endif // __CPU_BETA_CPU_2BIT_LOCAL_PRED_HH__
5910037SARM gem5 Developers