// instructions.
//
- /// Other - An instruction gets this form if it doesn't fit any of the
- /// catagories below.
- OtherFrm = 0,
-
/// Raw - This form is for instructions that don't have any operands, so
/// they are just a fixed opcode value, like 'leave'.
- RawFrm = 1,
+ RawFrm = 0,
/// AddRegFrm - This form is used for instructions like 'push r32' that have
/// their one register operand added to their opcode.
- AddRegFrm = 2,
+ AddRegFrm = 1,
/// MRMDestReg - This form is used for instructions that use the Mod/RM byte
/// to specify a destination, which in this case is a register.
///
- MRMDestReg = 3,
+ MRMDestReg = 2,
/// MRMDestMem - This form is used for instructions that use the Mod/RM byte
/// to specify a destination, which in this case is memory.
///
- MRMDestMem = 4,
+ MRMDestMem = 3,
/// MRMSrcReg - This form is used for instructions that use the Mod/RM byte
/// to specify a source, which in this case is a register.
///
- MRMSrcReg = 5,
+ MRMSrcReg = 4,
/// MRMSrcMem - This form is used for instructions that use the Mod/RM byte
/// to specify a source, which in this case is memory.
///
- MRMSrcMem = 6,
+ MRMSrcMem = 5,
/// MRMS[0-7][rm] - These forms are used to represent instructions that use
/// a Mod/RM byte, and use the middle field to hold extended opcode
// which most often indicates that the instruction operates on 16 bit data
// instead of 32 bit data.
OpSize = 1 << 7,
+
+ // This three-bit field describes the size of a memory operand.
+ // I'm just being paranoid not using the zero value; there's
+ // probably no reason you couldn't use it.
+ MemArg8 = 0x1 << 8,
+ MemArg16 = 0x2 << 8,
+ MemArg32 = 0x3 << 8,
+ MemArg64 = 0x4 << 8,
+ MemArg80 = 0x5 << 8,
+ MemArg128 = 0x6 << 8,
+ MemArgMask = 0x7 << 8,
};
}