class StaticInst : public RefCounted, public StaticInstFlags
{
public:
- /// Binary extended machine instruction type.
- typedef TheISA::ExtMachInst ExtMachInst;
-
- enum {
- MaxInstSrcRegs = TheISA::MaxInstSrcRegs, //< Max source regs
- MaxInstDestRegs = TheISA::MaxInstDestRegs //< Max dest regs
- };
+ using RegIdArrayPtr = RegId (StaticInst:: *)[];
private:
- /// See destRegIdx().
- RegId _destRegIdx[MaxInstDestRegs];
/// See srcRegIdx().
- RegId _srcRegIdx[MaxInstSrcRegs];
+ RegIdArrayPtr _srcRegIdxPtr = nullptr;
+
+ /// See destRegIdx().
+ RegIdArrayPtr _destRegIdxPtr = nullptr;
protected:
/// Return logical index (architectural reg num) of i'th destination reg.
/// Only the entries from 0 through numDestRegs()-1 are valid.
- const RegId& destRegIdx(int i) const { return _destRegIdx[i]; }
+ const RegId &destRegIdx(int i) const { return (this->*_destRegIdxPtr)[i]; }
- void setDestRegIdx(int i, const RegId &val) { _destRegIdx[i] = val; }
+ void
+ setDestRegIdx(int i, const RegId &val)
+ {
+ (this->*_destRegIdxPtr)[i] = val;
+ }
/// Return logical index (architectural reg num) of i'th source reg.
/// Only the entries from 0 through numSrcRegs()-1 are valid.
- const RegId& srcRegIdx(int i) const { return _srcRegIdx[i]; }
+ const RegId &srcRegIdx(int i) const { return (this->*_srcRegIdxPtr)[i]; }
- void setSrcRegIdx(int i, const RegId &val) { _srcRegIdx[i] = val; }
+ void
+ setSrcRegIdx(int i, const RegId &val)
+ {
+ (this->*_srcRegIdxPtr)[i] = val;
+ }
/// Pointer to a statically allocated "null" instruction object.
static StaticInstPtr nullStaticInstPtr;
static StaticInstPtr nopStaticInstPtr;
/// The binary machine instruction.
- const ExtMachInst machInst;
+ const TheISA::ExtMachInst machInst;
+
+ virtual uint64_t getEMI() const { return 0; }
protected:
+ /**
+ * Set the pointers which point to the arrays of source and destination
+ * register indices. These will be defined in derived classes which know
+ * what size they need to be, and installed here so they can be accessed
+ * with the base class accessors.
+ */
+ void
+ setRegIdxArrays(RegIdArrayPtr src, RegIdArrayPtr dest)
+ {
+ _srcRegIdxPtr = src;
+ _destRegIdxPtr = dest;
+ }
+
/**
* Base mnemonic (e.g., "add"). Used by generateDisassembly()
* methods. Also useful to readily identify instructions from
/// default, since the decoder generally only overrides
/// the fields that are meaningful for the particular
/// instruction.
- StaticInst(const char *_mnemonic, ExtMachInst _machInst, OpClass __opClass)
- : _opClass(__opClass), _numSrcRegs(0), _numDestRegs(0),
- _numFPDestRegs(0), _numIntDestRegs(0), _numCCDestRegs(0),
- _numVecDestRegs(0), _numVecElemDestRegs(0), _numVecPredDestRegs(0),
- machInst(_machInst), mnemonic(_mnemonic), cachedDisassembly(0)
+ StaticInst(const char *_mnemonic, TheISA::ExtMachInst _machInst,
+ OpClass __opClass)
+ : _opClass(__opClass),
+ _numSrcRegs(0), _numDestRegs(0), _numFPDestRegs(0),
+ _numIntDestRegs(0), _numCCDestRegs(0), _numVecDestRegs(0),
+ _numVecElemDestRegs(0), _numVecPredDestRegs(0), machInst(_machInst),
+ mnemonic(_mnemonic), cachedDisassembly(0)
{ }
public: