static_inst.hh revision 2336
17199Sgblack@eecs.umich.edu/*
27199Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan
311939Snikos.nikoleris@arm.com * All rights reserved.
47199Sgblack@eecs.umich.edu *
57199Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67199Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77199Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87199Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97199Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107199Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117199Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127199Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137199Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
147199Sgblack@eecs.umich.edu * this software without specific prior written permission.
157199Sgblack@eecs.umich.edu *
167199Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177199Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187199Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197199Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207199Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217199Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227199Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237199Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247199Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257199Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267199Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277199Sgblack@eecs.umich.edu */
287199Sgblack@eecs.umich.edu
297199Sgblack@eecs.umich.edu#ifndef __CPU_STATIC_INST_HH__
307199Sgblack@eecs.umich.edu#define __CPU_STATIC_INST_HH__
317199Sgblack@eecs.umich.edu
327199Sgblack@eecs.umich.edu#include <bitset>
337199Sgblack@eecs.umich.edu#include <string>
347199Sgblack@eecs.umich.edu
357199Sgblack@eecs.umich.edu#include "base/hashmap.hh"
367199Sgblack@eecs.umich.edu#include "base/refcnt.hh"
377199Sgblack@eecs.umich.edu#include "encumbered/cpu/full/op_class.hh"
387199Sgblack@eecs.umich.edu#include "sim/host.hh"
397199Sgblack@eecs.umich.edu#include "arch/isa_traits.hh"
407199Sgblack@eecs.umich.edu
417199Sgblack@eecs.umich.edu// forward declarations
427199Sgblack@eecs.umich.edustruct AlphaSimpleImpl;
4310474Sandreas.hansson@arm.comstruct OzoneImpl;
4410037SARM gem5 Developersstruct SimpleImpl;
4510037SARM gem5 Developersclass ExecContext;
4610037SARM gem5 Developersclass DynInst;
4710037SARM gem5 Developers
4810037SARM gem5 Developerstemplate <class Impl>
4910037SARM gem5 Developersclass AlphaDynInst;
5010037SARM gem5 Developers
5110037SARM gem5 Developerstemplate <class Impl>
5210037SARM gem5 Developersclass OzoneDynInst;
5310037SARM gem5 Developers
5410037SARM gem5 Developersclass CheckerCPU;
5510037SARM gem5 Developersclass FastCPU;
5610037SARM gem5 Developersclass SimpleCPU;
5710037SARM gem5 Developersclass InorderCPU;
5810037SARM gem5 Developersclass SymbolTable;
5910037SARM gem5 Developers
6010037SARM gem5 Developersnamespace Trace {
6110037SARM gem5 Developers    class InstRecord;
6210474Sandreas.hansson@arm.com}
6310474Sandreas.hansson@arm.com
6410037SARM gem5 Developers/**
6510037SARM gem5 Developers * Base, ISA-independent static instruction class.
6610037SARM gem5 Developers *
6710037SARM gem5 Developers * The main component of this class is the vector of flags and the
6810474Sandreas.hansson@arm.com * associated methods for reading them.  Any object that can rely
6910037SARM gem5 Developers * solely on these flags can process instructions without being
7010037SARM gem5 Developers * recompiled for multiple ISAs.
718782Sgblack@eecs.umich.edu */
7210037SARM gem5 Developersclass StaticInstBase : public RefCounted
738782Sgblack@eecs.umich.edu{
747199Sgblack@eecs.umich.edu  protected:
757199Sgblack@eecs.umich.edu
7610037SARM gem5 Developers    /// Set of boolean static instruction properties.
7710037SARM gem5 Developers    ///
788628SAli.Saidi@ARM.com    /// Notes:
7910037SARM gem5 Developers    /// - The IsInteger and IsFloating flags are based on the class of
8010037SARM gem5 Developers    /// registers accessed by the instruction.  Although most
8110037SARM gem5 Developers    /// instructions will have exactly one of these two flags set, it
8210037SARM gem5 Developers    /// is possible for an instruction to have neither (e.g., direct
8310037SARM gem5 Developers    /// unconditional branches, memory barriers) or both (e.g., an
8410037SARM gem5 Developers    /// FP/int conversion).
8510037SARM gem5 Developers    /// - If IsMemRef is set, then exactly one of IsLoad or IsStore
8610037SARM gem5 Developers    /// will be set.
8710037SARM gem5 Developers    /// - If IsControl is set, then exactly one of IsDirectControl or
8810037SARM gem5 Developers    /// IsIndirect Control will be set, and exactly one of
8910037SARM gem5 Developers    /// IsCondControl or IsUncondControl will be set.
9010037SARM gem5 Developers    /// - IsSerializing, IsMemBarrier, and IsWriteBarrier are
9110037SARM gem5 Developers    /// implemented as flags since in the current model there's no
9210037SARM gem5 Developers    /// other way for instructions to inject behavior into the
9310037SARM gem5 Developers    /// pipeline outside of fetch.  Once we go to an exec-in-exec CPU
9410474Sandreas.hansson@arm.com    /// model we should be able to get rid of these flags and
9510037SARM gem5 Developers    /// implement this behavior via the execute() methods.
9610037SARM gem5 Developers    ///
9710037SARM gem5 Developers    enum Flags {
9810037SARM gem5 Developers        IsNop,		///< Is a no-op (no effect at all).
9910037SARM gem5 Developers
10010037SARM gem5 Developers        IsInteger,	///< References integer regs.
10110037SARM gem5 Developers        IsFloating,	///< References FP regs.
10210037SARM gem5 Developers
10310037SARM gem5 Developers        IsMemRef,	///< References memory (load, store, or prefetch).
10410037SARM gem5 Developers        IsLoad,		///< Reads from memory (load or prefetch).
10510037SARM gem5 Developers        IsStore,	///< Writes to memory.
10610037SARM gem5 Developers        IsStoreConditional,    ///< Store conditional instruction.
10710037SARM gem5 Developers        IsInstPrefetch,	///< Instruction-cache prefetch.
10810037SARM gem5 Developers        IsDataPrefetch,	///< Data-cache prefetch.
10910037SARM gem5 Developers        IsCopy,         ///< Fast Cache block copy
11010037SARM gem5 Developers
11110037SARM gem5 Developers        IsControl,		///< Control transfer instruction.
11210037SARM gem5 Developers        IsDirectControl,	///< PC relative control transfer.
11310037SARM gem5 Developers        IsIndirectControl,	///< Register indirect control transfer.
11410037SARM gem5 Developers        IsCondControl,		///< Conditional control transfer.
11510037SARM gem5 Developers        IsUncondControl,	///< Unconditional control transfer.
11610037SARM gem5 Developers        IsCall,			///< Subroutine call.
11710037SARM gem5 Developers        IsReturn,		///< Subroutine return.
11810037SARM gem5 Developers
11910037SARM gem5 Developers        IsCondDelaySlot,///< Conditional Delay-Slot Instruction
12010037SARM gem5 Developers
12110037SARM gem5 Developers        IsThreadSync,	///< Thread synchronization operation.
12210037SARM gem5 Developers
12310037SARM gem5 Developers        IsSerializing,	///< Serializes pipeline: won't execute until all
12410037SARM gem5 Developers                        /// older instructions have committed.
12510037SARM gem5 Developers        IsSerializeBefore,
12610037SARM gem5 Developers        IsSerializeAfter,
12710037SARM gem5 Developers        IsMemBarrier,	///< Is a memory barrier
12810037SARM gem5 Developers        IsWriteBarrier,	///< Is a write barrier
12910037SARM gem5 Developers
13010037SARM gem5 Developers        IsNonSpeculative, ///< Should not be executed speculatively
13110037SARM gem5 Developers        IsQuiesce,      ///< Is a quiesce instruction
13210037SARM gem5 Developers
13311355Smitch.hayenga@arm.com        IsIprAccess,    ///< Accesses IPRs
13411355Smitch.hayenga@arm.com        IsUnverifiable, ///< Can't be verified by a checker
13510037SARM gem5 Developers
13610037SARM gem5 Developers        NumFlags
13710037SARM gem5 Developers    };
13810037SARM gem5 Developers
13910037SARM gem5 Developers    /// Flag values for this instruction.
1407199Sgblack@eecs.umich.edu    std::bitset<NumFlags> flags;
1417199Sgblack@eecs.umich.edu
1427202Sgblack@eecs.umich.edu    /// See opClass().
1437202Sgblack@eecs.umich.edu    OpClass _opClass;
1447202Sgblack@eecs.umich.edu
1457202Sgblack@eecs.umich.edu    /// See numSrcRegs().
1467202Sgblack@eecs.umich.edu    int8_t _numSrcRegs;
1478301SAli.Saidi@ARM.com
1488303SAli.Saidi@ARM.com    /// See numDestRegs().
1498303SAli.Saidi@ARM.com    int8_t _numDestRegs;
1508303SAli.Saidi@ARM.com
1518303SAli.Saidi@ARM.com    /// The following are used to track physical register usage
1528303SAli.Saidi@ARM.com    /// for machines with separate int & FP reg files.
1538303SAli.Saidi@ARM.com    //@{
1548301SAli.Saidi@ARM.com    int8_t _numFPDestRegs;
1558301SAli.Saidi@ARM.com    int8_t _numIntDestRegs;
1567202Sgblack@eecs.umich.edu    //@}
1577202Sgblack@eecs.umich.edu
1587599Sminkyu.jeong@arm.com    /// Constructor.
1597783SGiacomo.Gabrielli@arm.com    /// It's important to initialize everything here to a sane
1607202Sgblack@eecs.umich.edu    /// default, since the decoder generally only overrides
1617202Sgblack@eecs.umich.edu    /// the fields that are meaningful for the particular
1627202Sgblack@eecs.umich.edu    /// instruction.
1637202Sgblack@eecs.umich.edu    StaticInstBase(OpClass __opClass)
1647202Sgblack@eecs.umich.edu        : _opClass(__opClass), _numSrcRegs(0), _numDestRegs(0),
1657202Sgblack@eecs.umich.edu          _numFPDestRegs(0), _numIntDestRegs(0)
1667202Sgblack@eecs.umich.edu    {
1677599Sminkyu.jeong@arm.com    }
1687783SGiacomo.Gabrielli@arm.com
1697202Sgblack@eecs.umich.edu  public:
1707202Sgblack@eecs.umich.edu
1717202Sgblack@eecs.umich.edu    /// @name Register information.
1727202Sgblack@eecs.umich.edu    /// The sum of numFPDestRegs() and numIntDestRegs() equals
17310037SARM gem5 Developers    /// numDestRegs().  The former two functions are used to track
17410037SARM gem5 Developers    /// physical register usage for machines with separate int & FP
17510037SARM gem5 Developers    /// reg files.
17610037SARM gem5 Developers    //@{
17710037SARM gem5 Developers    /// Number of source registers.
17810037SARM gem5 Developers    int8_t numSrcRegs()  const { return _numSrcRegs; }
17910037SARM gem5 Developers    /// Number of destination registers.
18010037SARM gem5 Developers    int8_t numDestRegs() const { return _numDestRegs; }
18110037SARM gem5 Developers    /// Number of floating-point destination regs.
18210037SARM gem5 Developers    int8_t numFPDestRegs()  const { return _numFPDestRegs; }
18310037SARM gem5 Developers    /// Number of integer destination regs.
18410474Sandreas.hansson@arm.com    int8_t numIntDestRegs() const { return _numIntDestRegs; }
18510474Sandreas.hansson@arm.com    //@}
18610037SARM gem5 Developers
18710037SARM gem5 Developers    /// @name Flag accessors.
18810037SARM gem5 Developers    /// These functions are used to access the values of the various
18910037SARM gem5 Developers    /// instruction property flags.  See StaticInstBase::Flags for descriptions
19010037SARM gem5 Developers    /// of the individual flags.
19110037SARM gem5 Developers    //@{
19210037SARM gem5 Developers
19310037SARM gem5 Developers    bool isNop() 	  const { return flags[IsNop]; }
19410037SARM gem5 Developers
19510037SARM gem5 Developers    bool isMemRef()    	  const { return flags[IsMemRef]; }
19610037SARM gem5 Developers    bool isLoad()	  const { return flags[IsLoad]; }
19710037SARM gem5 Developers    bool isStore()	  const { return flags[IsStore]; }
19810037SARM gem5 Developers    bool isStoreConditional()	  const { return flags[IsStoreConditional]; }
19910037SARM gem5 Developers    bool isInstPrefetch() const { return flags[IsInstPrefetch]; }
20010037SARM gem5 Developers    bool isDataPrefetch() const { return flags[IsDataPrefetch]; }
20110037SARM gem5 Developers    bool isCopy()         const { return flags[IsCopy];}
20210037SARM gem5 Developers
20310037SARM gem5 Developers    bool isInteger()	  const { return flags[IsInteger]; }
20410037SARM gem5 Developers    bool isFloating()	  const { return flags[IsFloating]; }
20510037SARM gem5 Developers
20610037SARM gem5 Developers    bool isControl()	  const { return flags[IsControl]; }
20710037SARM gem5 Developers    bool isCall()	  const { return flags[IsCall]; }
20810037SARM gem5 Developers    bool isReturn()	  const { return flags[IsReturn]; }
20910037SARM gem5 Developers    bool isDirectCtrl()	  const { return flags[IsDirectControl]; }
21010037SARM gem5 Developers    bool isIndirectCtrl() const { return flags[IsIndirectControl]; }
21110037SARM gem5 Developers    bool isCondCtrl()	  const { return flags[IsCondControl]; }
21210037SARM gem5 Developers    bool isUncondCtrl()	  const { return flags[IsUncondControl]; }
21310037SARM gem5 Developers
21410037SARM gem5 Developers    bool isThreadSync()   const { return flags[IsThreadSync]; }
21510037SARM gem5 Developers    bool isSerializing()  const { return flags[IsSerializing] ||
21610474Sandreas.hansson@arm.com                                      flags[IsSerializeBefore] ||
21710474Sandreas.hansson@arm.com                                      flags[IsSerializeAfter]; }
21810037SARM gem5 Developers    bool isSerializeBefore() const { return flags[IsSerializeBefore]; }
21910037SARM gem5 Developers    bool isSerializeAfter() const { return flags[IsSerializeAfter]; }
22010037SARM gem5 Developers    bool isMemBarrier()   const { return flags[IsMemBarrier]; }
22110037SARM gem5 Developers    bool isWriteBarrier() const { return flags[IsWriteBarrier]; }
22210037SARM gem5 Developers    bool isNonSpeculative() const { return flags[IsNonSpeculative]; }
22310501Sakash.bagdia@ARM.com    bool isQuiesce() const { return flags[IsQuiesce]; }
22410037SARM gem5 Developers    bool isIprAccess() const { return flags[IsIprAccess]; }
22510037SARM gem5 Developers    bool isUnverifiable() const { return flags[IsUnverifiable]; }
22610037SARM gem5 Developers    //@}
22710037SARM gem5 Developers
2287202Sgblack@eecs.umich.edu    /// Operation class.  Used to select appropriate function unit in issue.
2297400SAli.Saidi@ARM.com    OpClass opClass()     const { return _opClass; }
2308303SAli.Saidi@ARM.com};
2318303SAli.Saidi@ARM.com
2328303SAli.Saidi@ARM.com
2338303SAli.Saidi@ARM.com// forward declaration
2348303SAli.Saidi@ARM.comclass StaticInstPtr;
2358303SAli.Saidi@ARM.com
2368303SAli.Saidi@ARM.com/**
23710037SARM gem5 Developers * Generic yet ISA-dependent static instruction class.
23810037SARM gem5 Developers *
2398303SAli.Saidi@ARM.com * This class builds on StaticInstBase, defining fields and interfaces
2408303SAli.Saidi@ARM.com * that are generic across all ISAs but that differ in details
2418303SAli.Saidi@ARM.com * according to the specific ISA being used.
2428303SAli.Saidi@ARM.com */
2438303SAli.Saidi@ARM.comclass StaticInst : public StaticInstBase
2447202Sgblack@eecs.umich.edu{
2457202Sgblack@eecs.umich.edu  public:
2467202Sgblack@eecs.umich.edu
2477599Sminkyu.jeong@arm.com    /// Binary machine instruction type.
2487599Sminkyu.jeong@arm.com    typedef TheISA::MachInst MachInst;
2497202Sgblack@eecs.umich.edu    /// Binary extended machine instruction type.
2507202Sgblack@eecs.umich.edu    typedef TheISA::ExtMachInst ExtMachInst;
2517202Sgblack@eecs.umich.edu    /// Logical register index type.
2527202Sgblack@eecs.umich.edu    typedef TheISA::RegIndex RegIndex;
2537202Sgblack@eecs.umich.edu
2547202Sgblack@eecs.umich.edu    enum {
2557202Sgblack@eecs.umich.edu        MaxInstSrcRegs = TheISA::MaxInstSrcRegs,	//< Max source regs
2567599Sminkyu.jeong@arm.com        MaxInstDestRegs = TheISA::MaxInstDestRegs,	//< Max dest regs
2577599Sminkyu.jeong@arm.com    };
2587202Sgblack@eecs.umich.edu
2597202Sgblack@eecs.umich.edu
2607202Sgblack@eecs.umich.edu    /// Return logical index (architectural reg num) of i'th destination reg.
2617202Sgblack@eecs.umich.edu    /// Only the entries from 0 through numDestRegs()-1 are valid.
2627202Sgblack@eecs.umich.edu    RegIndex destRegIdx(int i) const { return _destRegIdx[i]; }
2637400SAli.Saidi@ARM.com
2648303SAli.Saidi@ARM.com    /// Return logical index (architectural reg num) of i'th source reg.
2658303SAli.Saidi@ARM.com    /// Only the entries from 0 through numSrcRegs()-1 are valid.
2668303SAli.Saidi@ARM.com    RegIndex srcRegIdx(int i)  const { return _srcRegIdx[i]; }
2678303SAli.Saidi@ARM.com
2688303SAli.Saidi@ARM.com    /// Pointer to a statically allocated "null" instruction object.
2698303SAli.Saidi@ARM.com    /// Used to give eaCompInst() and memAccInst() something to return
27010037SARM gem5 Developers    /// when called on non-memory instructions.
27110037SARM gem5 Developers    static StaticInstPtr nullStaticInstPtr;
2728303SAli.Saidi@ARM.com
2738303SAli.Saidi@ARM.com    /**
2748303SAli.Saidi@ARM.com     * Memory references only: returns "fake" instruction representing
2758303SAli.Saidi@ARM.com     * the effective address part of the memory operation.  Used to
2768303SAli.Saidi@ARM.com     * obtain the dependence info (numSrcRegs and srcRegIdx[]) for
2777202Sgblack@eecs.umich.edu     * just the EA computation.
2787202Sgblack@eecs.umich.edu     */
2797202Sgblack@eecs.umich.edu    virtual const
2807599Sminkyu.jeong@arm.com    StaticInstPtr &eaCompInst() const { return nullStaticInstPtr; }
2817599Sminkyu.jeong@arm.com
2827202Sgblack@eecs.umich.edu    /**
2837202Sgblack@eecs.umich.edu     * Memory references only: returns "fake" instruction representing
2847202Sgblack@eecs.umich.edu     * the memory access part of the memory operation.  Used to
2857202Sgblack@eecs.umich.edu     * obtain the dependence info (numSrcRegs and srcRegIdx[]) for
2867202Sgblack@eecs.umich.edu     * just the memory access (not the EA computation).
2877202Sgblack@eecs.umich.edu     */
2887202Sgblack@eecs.umich.edu    virtual const
2897599Sminkyu.jeong@arm.com    StaticInstPtr &memAccInst() const { return nullStaticInstPtr; }
2907599Sminkyu.jeong@arm.com
2917202Sgblack@eecs.umich.edu    /// The binary machine instruction.
2927202Sgblack@eecs.umich.edu    const ExtMachInst machInst;
2937202Sgblack@eecs.umich.edu
2947209Sgblack@eecs.umich.edu  protected:
2957209Sgblack@eecs.umich.edu
2967209Sgblack@eecs.umich.edu    /// See destRegIdx().
2977209Sgblack@eecs.umich.edu    RegIndex _destRegIdx[MaxInstDestRegs];
2987209Sgblack@eecs.umich.edu    /// See srcRegIdx().
2997261Sgblack@eecs.umich.edu    RegIndex _srcRegIdx[MaxInstSrcRegs];
3007209Sgblack@eecs.umich.edu
3017209Sgblack@eecs.umich.edu    /**
3027261Sgblack@eecs.umich.edu     * Base mnemonic (e.g., "add").  Used by generateDisassembly()
3037261Sgblack@eecs.umich.edu     * methods.  Also useful to readily identify instructions from
3047209Sgblack@eecs.umich.edu     * within the debugger when #cachedDisassembly has not been
3057209Sgblack@eecs.umich.edu     * initialized.
3067209Sgblack@eecs.umich.edu     */
3077209Sgblack@eecs.umich.edu    const char *mnemonic;
3087209Sgblack@eecs.umich.edu
3097209Sgblack@eecs.umich.edu    /**
3107209Sgblack@eecs.umich.edu     * String representation of disassembly (lazily evaluated via
3117209Sgblack@eecs.umich.edu     * disassemble()).
3127209Sgblack@eecs.umich.edu     */
3137261Sgblack@eecs.umich.edu    mutable std::string *cachedDisassembly;
3147209Sgblack@eecs.umich.edu
3157209Sgblack@eecs.umich.edu    /**
3167261Sgblack@eecs.umich.edu     * Internal function to generate disassembly string.
3177261Sgblack@eecs.umich.edu     */
3187209Sgblack@eecs.umich.edu    virtual std::string
3197209Sgblack@eecs.umich.edu    generateDisassembly(Addr pc, const SymbolTable *symtab) const = 0;
3207209Sgblack@eecs.umich.edu
3217209Sgblack@eecs.umich.edu    /// Constructor.
3227209Sgblack@eecs.umich.edu    StaticInst(const char *_mnemonic, ExtMachInst _machInst, OpClass __opClass)
3237209Sgblack@eecs.umich.edu        : StaticInstBase(__opClass),
3247261Sgblack@eecs.umich.edu          machInst(_machInst), mnemonic(_mnemonic), cachedDisassembly(0)
3257209Sgblack@eecs.umich.edu    {
3267209Sgblack@eecs.umich.edu    }
3277261Sgblack@eecs.umich.edu
3287261Sgblack@eecs.umich.edu  public:
3297209Sgblack@eecs.umich.edu
3307226Sgblack@eecs.umich.edu    virtual ~StaticInst()
3317249Sgblack@eecs.umich.edu    {
33212227Sgiacomo.travaglini@arm.com        if (cachedDisassembly)
3337249Sgblack@eecs.umich.edu            delete cachedDisassembly;
3347261Sgblack@eecs.umich.edu    }
3357249Sgblack@eecs.umich.edu
3367249Sgblack@eecs.umich.edu/**
3377261Sgblack@eecs.umich.edu * The execute() signatures are auto-generated by scons based on the
3387261Sgblack@eecs.umich.edu * set of CPU models we are compiling in today.
3397249Sgblack@eecs.umich.edu */
3407249Sgblack@eecs.umich.edu#include "cpu/static_inst_exec_sigs.hh"
3417251Sgblack@eecs.umich.edu
3427251Sgblack@eecs.umich.edu    /**
3437251Sgblack@eecs.umich.edu     * Return the target address for a PC-relative branch.
3447261Sgblack@eecs.umich.edu     * Invalid if not a PC-relative branch (i.e. isDirectCtrl()
3457251Sgblack@eecs.umich.edu     * should be true).
3467251Sgblack@eecs.umich.edu     */
3477261Sgblack@eecs.umich.edu    virtual Addr branchTarget(Addr branchPC) const
3487261Sgblack@eecs.umich.edu    {
3497251Sgblack@eecs.umich.edu        panic("StaticInst::branchTarget() called on instruction "
3507251Sgblack@eecs.umich.edu              "that is not a PC-relative branch.");
3517226Sgblack@eecs.umich.edu    }
3527226Sgblack@eecs.umich.edu
3537226Sgblack@eecs.umich.edu    /**
3547232Sgblack@eecs.umich.edu     * Return the target address for an indirect branch (jump).  The
3558302SAli.Saidi@ARM.com     * register value is read from the supplied execution context, so
3567226Sgblack@eecs.umich.edu     * the result is valid only if the execution context is about to
3577226Sgblack@eecs.umich.edu     * execute the branch in question.  Invalid if not an indirect
3587232Sgblack@eecs.umich.edu     * branch (i.e. isIndirectCtrl() should be true).
3597226Sgblack@eecs.umich.edu     */
3608304SAli.Saidi@ARM.com    virtual Addr branchTarget(ExecContext *xc) const
3617232Sgblack@eecs.umich.edu    {
3627232Sgblack@eecs.umich.edu        panic("StaticInst::branchTarget() called on instruction "
3637226Sgblack@eecs.umich.edu              "that is not an indirect branch.");
3647226Sgblack@eecs.umich.edu    }
3657226Sgblack@eecs.umich.edu
3667226Sgblack@eecs.umich.edu    /**
3677226Sgblack@eecs.umich.edu     * Return true if the instruction is a control transfer, and if so,
3687232Sgblack@eecs.umich.edu     * return the target address as well.
3698302SAli.Saidi@ARM.com     */
3707226Sgblack@eecs.umich.edu    bool hasBranchTarget(Addr pc, ExecContext *xc, Addr &tgt) const;
3717226Sgblack@eecs.umich.edu
3727232Sgblack@eecs.umich.edu    /**
3737226Sgblack@eecs.umich.edu     * Return string representation of disassembled instruction.
3748304SAli.Saidi@ARM.com     * The default version of this function will call the internal
3757232Sgblack@eecs.umich.edu     * virtual generateDisassembly() function to get the string,
3767232Sgblack@eecs.umich.edu     * then cache it in #cachedDisassembly.  If the disassembly
3777226Sgblack@eecs.umich.edu     * should not be cached, this function should be overridden directly.
3787226Sgblack@eecs.umich.edu     */
3797226Sgblack@eecs.umich.edu    virtual const std::string &disassemble(Addr pc,
3807226Sgblack@eecs.umich.edu                                           const SymbolTable *symtab = 0) const
3817226Sgblack@eecs.umich.edu    {
3827226Sgblack@eecs.umich.edu        if (!cachedDisassembly)
3837226Sgblack@eecs.umich.edu            cachedDisassembly =
3847232Sgblack@eecs.umich.edu                new std::string(generateDisassembly(pc, symtab));
3858302SAli.Saidi@ARM.com
3867226Sgblack@eecs.umich.edu        return *cachedDisassembly;
3877232Sgblack@eecs.umich.edu    }
3888302SAli.Saidi@ARM.com
3897226Sgblack@eecs.umich.edu    /// Decoded instruction cache type.
3907226Sgblack@eecs.umich.edu    /// For now we're using a generic hash_map; this seems to work
3917226Sgblack@eecs.umich.edu    /// pretty well.
3927232Sgblack@eecs.umich.edu    typedef m5::hash_map<ExtMachInst, StaticInstPtr> DecodeCache;
3937226Sgblack@eecs.umich.edu
3948304SAli.Saidi@ARM.com    /// A cache of decoded instruction objects.
3957232Sgblack@eecs.umich.edu    static DecodeCache decodeCache;
3967232Sgblack@eecs.umich.edu
3977226Sgblack@eecs.umich.edu    /**
3987226Sgblack@eecs.umich.edu     * Dump some basic stats on the decode cache hash map.
3997226Sgblack@eecs.umich.edu     * Only gets called if DECODE_CACHE_HASH_STATS is defined.
4007226Sgblack@eecs.umich.edu     */
4017226Sgblack@eecs.umich.edu    static void dumpDecodeCacheStats();
4027226Sgblack@eecs.umich.edu
4037226Sgblack@eecs.umich.edu    /// Decode a machine instruction.
4047232Sgblack@eecs.umich.edu    /// @param mach_inst The binary instruction to decode.
4058302SAli.Saidi@ARM.com    /// @retval A pointer to the corresponding StaticInst object.
4067226Sgblack@eecs.umich.edu    //This is defined as inline below.
4077232Sgblack@eecs.umich.edu    static StaticInstPtr decode(ExtMachInst mach_inst);
4088302SAli.Saidi@ARM.com};
4097226Sgblack@eecs.umich.edu
4107226Sgblack@eecs.umich.edutypedef RefCountingPtr<StaticInstBase> StaticInstBasePtr;
4117226Sgblack@eecs.umich.edu
4127232Sgblack@eecs.umich.edu/// Reference-counted pointer to a StaticInst object.
4137226Sgblack@eecs.umich.edu/// This type should be used instead of "StaticInst *" so that
4148304SAli.Saidi@ARM.com/// StaticInst objects can be properly reference-counted.
4157232Sgblack@eecs.umich.educlass StaticInstPtr : public RefCountingPtr<StaticInst>
4167232Sgblack@eecs.umich.edu{
4177226Sgblack@eecs.umich.edu  public:
4187234Sgblack@eecs.umich.edu    /// Constructor.
4197234Sgblack@eecs.umich.edu    StaticInstPtr()
4207234Sgblack@eecs.umich.edu        : RefCountingPtr<StaticInst>()
4218588Sgblack@eecs.umich.edu    {
4227234Sgblack@eecs.umich.edu    }
4237234Sgblack@eecs.umich.edu
4247234Sgblack@eecs.umich.edu    /// Conversion from "StaticInst *".
4257234Sgblack@eecs.umich.edu    StaticInstPtr(StaticInst *p)
4267234Sgblack@eecs.umich.edu        : RefCountingPtr<StaticInst>(p)
4277234Sgblack@eecs.umich.edu    {
4287234Sgblack@eecs.umich.edu    }
4297234Sgblack@eecs.umich.edu
4308588Sgblack@eecs.umich.edu    /// Copy constructor.
4317234Sgblack@eecs.umich.edu    StaticInstPtr(const StaticInstPtr &r)
4327234Sgblack@eecs.umich.edu        : RefCountingPtr<StaticInst>(r)
4337234Sgblack@eecs.umich.edu    {
4347234Sgblack@eecs.umich.edu    }
4357234Sgblack@eecs.umich.edu
4367234Sgblack@eecs.umich.edu    /// Construct directly from machine instruction.
4377234Sgblack@eecs.umich.edu    /// Calls StaticInst::decode().
4387234Sgblack@eecs.umich.edu    StaticInstPtr(TheISA::ExtMachInst mach_inst)
4397234Sgblack@eecs.umich.edu        : RefCountingPtr<StaticInst>(StaticInst::decode(mach_inst))
4407234Sgblack@eecs.umich.edu    {
4417234Sgblack@eecs.umich.edu    }
4427234Sgblack@eecs.umich.edu
4437234Sgblack@eecs.umich.edu    /// Convert to pointer to StaticInstBase class.
4447234Sgblack@eecs.umich.edu    operator const StaticInstBasePtr()
4457234Sgblack@eecs.umich.edu    {
4467234Sgblack@eecs.umich.edu        return this->get();
4477234Sgblack@eecs.umich.edu    }
4487234Sgblack@eecs.umich.edu};
4497234Sgblack@eecs.umich.edu
4507234Sgblack@eecs.umich.eduinline StaticInstPtr
4517234Sgblack@eecs.umich.eduStaticInst::decode(StaticInst::ExtMachInst mach_inst)
4527234Sgblack@eecs.umich.edu{
4537234Sgblack@eecs.umich.edu#ifdef DECODE_CACHE_HASH_STATS
4547234Sgblack@eecs.umich.edu    // Simple stats on decode hash_map.  Turns out the default
4557234Sgblack@eecs.umich.edu    // hash function is as good as anything I could come up with.
4567234Sgblack@eecs.umich.edu    const int dump_every_n = 10000000;
4577234Sgblack@eecs.umich.edu    static int decodes_til_dump = dump_every_n;
4587234Sgblack@eecs.umich.edu
4597234Sgblack@eecs.umich.edu    if (--decodes_til_dump == 0) {
4607234Sgblack@eecs.umich.edu        dumpDecodeCacheStats();
4617234Sgblack@eecs.umich.edu        decodes_til_dump = dump_every_n;
4627234Sgblack@eecs.umich.edu    }
4637234Sgblack@eecs.umich.edu#endif
4647234Sgblack@eecs.umich.edu
4657234Sgblack@eecs.umich.edu    DecodeCache::iterator iter = decodeCache.find(mach_inst);
4667234Sgblack@eecs.umich.edu    if (iter != decodeCache.end()) {
4677234Sgblack@eecs.umich.edu        return iter->second;
4687234Sgblack@eecs.umich.edu    }
4697234Sgblack@eecs.umich.edu
4707234Sgblack@eecs.umich.edu    StaticInstPtr si = TheISA::decodeInst(mach_inst);
4717234Sgblack@eecs.umich.edu    decodeCache[mach_inst] = si;
4727234Sgblack@eecs.umich.edu    return si;
4737234Sgblack@eecs.umich.edu}
4747234Sgblack@eecs.umich.edu
4757234Sgblack@eecs.umich.edu#endif // __CPU_STATIC_INST_HH__
4767234Sgblack@eecs.umich.edu