namespace X86ISA
{
- /**
- * Base class for memory ops
- */
- class MemOp : public X86MicroopBase
+
+/**
+ * Base class for memory ops
+ */
+class MemOp : public X86MicroopBase
+{
+ protected:
+ const uint8_t scale;
+ const RegIndex index;
+ const RegIndex base;
+ const uint64_t disp;
+ const uint8_t segment;
+ const uint8_t dataSize;
+ const uint8_t addressSize;
+ const Request::FlagsType memFlags;
+ RegIndex foldOBit, foldABit;
+
+ //Constructor
+ MemOp(ExtMachInst _machInst,
+ const char * mnem, const char * _instMnem,
+ uint64_t setFlags,
+ uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
+ uint64_t _disp, InstRegIndex _segment,
+ uint8_t _dataSize, uint8_t _addressSize,
+ Request::FlagsType _memFlags,
+ OpClass __opClass) :
+ X86MicroopBase(_machInst, mnem, _instMnem, setFlags, __opClass),
+ scale(_scale), index(_index.index()), base(_base.index()),
+ disp(_disp), segment(_segment.index()),
+ dataSize(_dataSize), addressSize(_addressSize),
+ memFlags(_memFlags | _segment.index())
{
- protected:
- const uint8_t scale;
- const RegIndex index;
- const RegIndex base;
- const uint64_t disp;
- const uint8_t segment;
- const uint8_t dataSize;
- const uint8_t addressSize;
- const Request::FlagsType memFlags;
- RegIndex foldOBit, foldABit;
+ assert(_segment.index() < NUM_SEGMENTREGS);
+ foldOBit = (dataSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0;
+ foldABit = (addressSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0;
+ }
+};
- //Constructor
- MemOp(ExtMachInst _machInst,
- const char * mnem, const char * _instMnem,
- uint64_t setFlags,
- uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
- uint64_t _disp, InstRegIndex _segment,
- uint8_t _dataSize, uint8_t _addressSize,
- Request::FlagsType _memFlags,
- OpClass __opClass) :
- X86MicroopBase(_machInst, mnem, _instMnem, setFlags, __opClass),
- scale(_scale), index(_index.index()), base(_base.index()),
- disp(_disp), segment(_segment.index()),
- dataSize(_dataSize), addressSize(_addressSize),
- memFlags(_memFlags | _segment.index())
- {
- assert(_segment.index() < NUM_SEGMENTREGS);
- foldOBit =
- (dataSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0;
- foldABit =
- (addressSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0;
- }
- };
+/**
+ * Base class for load and store ops using one register
+ */
+class LdStOp : public MemOp
+{
+ protected:
+ const RegIndex data;
- /**
- * Base class for load and store ops using one register
- */
- class LdStOp : public MemOp
+ //Constructor
+ LdStOp(ExtMachInst _machInst,
+ const char * mnem, const char * _instMnem,
+ uint64_t setFlags,
+ uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
+ uint64_t _disp, InstRegIndex _segment,
+ InstRegIndex _data,
+ uint8_t _dataSize, uint8_t _addressSize,
+ Request::FlagsType _memFlags,
+ OpClass __opClass) :
+ MemOp(_machInst, mnem, _instMnem, setFlags,
+ _scale, _index, _base, _disp, _segment,
+ _dataSize, _addressSize, _memFlags,
+ __opClass),
+ data(_data.index())
{
- protected:
- const RegIndex data;
+ }
- //Constructor
- LdStOp(ExtMachInst _machInst,
- const char * mnem, const char * _instMnem,
- uint64_t setFlags,
- uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
- uint64_t _disp, InstRegIndex _segment,
- InstRegIndex _data,
- uint8_t _dataSize, uint8_t _addressSize,
- Request::FlagsType _memFlags,
- OpClass __opClass) :
- MemOp(_machInst, mnem, _instMnem, setFlags,
- _scale, _index, _base, _disp, _segment,
- _dataSize, _addressSize, _memFlags,
- __opClass),
- data(_data.index())
- {
- }
+ std::string generateDisassembly(
+ Addr pc, const Loader::SymbolTable *symtab) const override;
+};
- std::string generateDisassembly(
- Addr pc, const Loader::SymbolTable *symtab) const override;
- };
+/**
+ * Base class for load and store ops using two registers, we will
+ * call them split ops for this reason. These are mainly used to
+ * implement cmpxchg8b and cmpxchg16b.
+ */
+class LdStSplitOp : public MemOp
+{
+ protected:
+ const RegIndex dataLow;
+ const RegIndex dataHi;
- /**
- * Base class for load and store ops using two registers, we will
- * call them split ops for this reason. These are mainly used to
- * implement cmpxchg8b and cmpxchg16b.
- */
- class LdStSplitOp : public MemOp
+ //Constructor
+ LdStSplitOp(ExtMachInst _machInst,
+ const char * mnem, const char * _instMnem,
+ uint64_t setFlags,
+ uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
+ uint64_t _disp, InstRegIndex _segment,
+ InstRegIndex _dataLow, InstRegIndex _dataHi,
+ uint8_t _dataSize, uint8_t _addressSize,
+ Request::FlagsType _memFlags,
+ OpClass __opClass) :
+ MemOp(_machInst, mnem, _instMnem, setFlags,
+ _scale, _index, _base, _disp, _segment,
+ _dataSize, _addressSize, _memFlags,
+ __opClass),
+ dataLow(_dataLow.index()),
+ dataHi(_dataHi.index())
{
- protected:
- const RegIndex dataLow;
- const RegIndex dataHi;
+ }
- //Constructor
- LdStSplitOp(ExtMachInst _machInst,
- const char * mnem, const char * _instMnem,
- uint64_t setFlags,
- uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
- uint64_t _disp, InstRegIndex _segment,
- InstRegIndex _dataLow, InstRegIndex _dataHi,
- uint8_t _dataSize, uint8_t _addressSize,
- Request::FlagsType _memFlags,
- OpClass __opClass) :
- MemOp(_machInst, mnem, _instMnem, setFlags,
- _scale, _index, _base, _disp, _segment,
- _dataSize, _addressSize, _memFlags,
- __opClass),
- dataLow(_dataLow.index()),
- dataHi(_dataHi.index())
- {
- }
+ std::string generateDisassembly(
+ Addr pc, const Loader::SymbolTable *symtab) const override;
+};
- std::string generateDisassembly(
- Addr pc, const Loader::SymbolTable *symtab) const override;
- };
}
#endif //__ARCH_X86_INSTS_MICROLDSTOP_HH__