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