diff options
Diffstat (limited to 'src/arch/x86/predecoder.cc')
-rw-r--r-- | src/arch/x86/predecoder.cc | 37 |
1 files changed, 32 insertions, 5 deletions
diff --git a/src/arch/x86/predecoder.cc b/src/arch/x86/predecoder.cc index 49f76699b..b6c488e45 100644 --- a/src/arch/x86/predecoder.cc +++ b/src/arch/x86/predecoder.cc @@ -235,14 +235,42 @@ namespace X86ISA logOpSize = 1; // 16 bit operand size } + //Set the actual op size + emi.opSize = 1 << logOpSize; + + //Figure out the effective address size. This can be overriden to + //a fixed value at the decoder level. + int logAddrSize; + if(/*FIXME 64-bit mode*/1) + { + if(emi.legacy.addr) + logAddrSize = 2; // 32 bit address size + else + logAddrSize = 3; // 64 bit address size + } + else if(/*FIXME default 32*/1) + { + if(emi.legacy.addr) + logAddrSize = 1; // 16 bit address size + else + logAddrSize = 2; // 32 bit address size + } + else // 16 bit default operand size + { + if(emi.legacy.addr) + logAddrSize = 2; // 32 bit address size + else + logAddrSize = 1; // 16 bit address size + } + + //Set the actual address size + emi.addrSize = 1 << logAddrSize; + //Figure out how big of an immediate we'll retreive based //on the opcode. int immType = ImmediateType[emi.opcode.num - 1][nextByte]; immediateSize = SizeTypeToSize[logOpSize - 1][immType]; - //Set the actual op size - emi.opSize = 1 << logOpSize; - //Determine what to expect next if (UsesModRM[emi.opcode.num - 1][nextByte]) { nextState = ModRMState; @@ -277,8 +305,7 @@ namespace X86ISA displacementSize = 0; } else { //figure out 32/64 bit displacement size - if(modRM.mod == 0 && (modRM.rm == 4 || modRM.rm == 5) - || modRM.mod == 2) + if(modRM.mod == 0 && modRM.rm == 5 || modRM.mod == 2) displacementSize = 4; else if(modRM.mod == 1) displacementSize = 1; |