Put the mode in the ExtMachInst.

--HG--
extra : convert_revision : 7fc6567ab3d35c06901e6c8a0435f7cab819e17e
This commit is contained in:
Gabe Black 2007-06-14 13:50:58 +00:00
parent 640ab1d2e7
commit cd3fee1b81
4 changed files with 29 additions and 2 deletions

View file

@ -77,6 +77,7 @@ namespace X86ISA
emi.modRM = 0; emi.modRM = 0;
emi.sib = 0; emi.sib = 0;
emi.mode = 0;
} }
void Predecoder::process() void Predecoder::process()

View file

@ -176,7 +176,10 @@ namespace X86ISA
tc(_tc), basePC(0), origPC(0), offset(0), tc(_tc), basePC(0), origPC(0), offset(0),
outOfBytes(true), emiIsReady(false), outOfBytes(true), emiIsReady(false),
state(ResetState) state(ResetState)
{} {
emi.mode.mode = LongMode;
emi.mode.submode = SixtyFourBitMode;
}
ThreadContext * getTC() ThreadContext * getTC()
{ {

View file

@ -120,6 +120,24 @@ namespace X86ISA
Bitfield<2,0> bottom3; Bitfield<2,0> bottom3;
EndBitUnion(Opcode) EndBitUnion(Opcode)
BitUnion8(OperatingMode)
Bitfield<3> mode;
Bitfield<2,0> submode;
EndBitUnion(OperatingMode)
enum X86Mode {
LongMode,
LegacyMode
};
enum X86SubMode {
SixtyFourBitMode,
CompatabilityMode,
ProtectedMode,
Virtual8086Mode,
RealMode
};
//The intermediate structure the x86 predecoder returns. //The intermediate structure the x86 predecoder returns.
struct ExtMachInst struct ExtMachInst
{ {
@ -151,6 +169,9 @@ namespace X86ISA
uint8_t opSize; uint8_t opSize;
//The effective address size. //The effective address size.
uint8_t addrSize; uint8_t addrSize;
//Mode information
OperatingMode mode;
}; };
inline static std::ostream & inline static std::ostream &
@ -172,6 +193,8 @@ namespace X86ISA
inline static bool inline static bool
operator == (const ExtMachInst &emi1, const ExtMachInst &emi2) operator == (const ExtMachInst &emi1, const ExtMachInst &emi2)
{ {
if(emi1.mode != emi2.mode)
return false;
if(emi1.legacy != emi2.legacy) if(emi1.legacy != emi2.legacy)
return false; return false;
if(emi1.rex != emi2.rex) if(emi1.rex != emi2.rex)

View file

@ -79,7 +79,7 @@ namespace __hash_namespace {
((uint64_t)emi.opcode.prefixB << 8) | ((uint64_t)emi.opcode.prefixB << 8) |
((uint64_t)emi.opcode.op)) ^ ((uint64_t)emi.opcode.op)) ^
emi.immediate ^ emi.displacement ^ emi.immediate ^ emi.displacement ^
emi.opSize; emi.mode ^ emi.opSize;
}; };
}; };
} }