[FAST486]

When storing a segment selector, the operand size attribute is only ignored when
writing to memory (where it's treated as if it's always 16-bit).


svn path=/trunk/; revision=67512
This commit is contained in:
Aleksandar Andrejevic 2015-05-02 16:09:00 +00:00
parent 9806b6c055
commit a4901dfae5

View file

@ -3832,13 +3832,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovModrm)
FAST486_OPCODE_HANDLER(Fast486OpcodeMovStoreSeg) FAST486_OPCODE_HANDLER(Fast486OpcodeMovStoreSeg)
{ {
BOOLEAN AddressSize = State->SegmentRegs[FAST486_REG_CS].Size; BOOLEAN OperandSize, AddressSize;
FAST486_MOD_REG_RM ModRegRm; FAST486_MOD_REG_RM ModRegRm;
/* Make sure this is the right instruction */ /* Make sure this is the right instruction */
ASSERT(Opcode == 0x8C); ASSERT(Opcode == 0x8C);
OperandSize = AddressSize = State->SegmentRegs[FAST486_REG_CS].Size;
TOGGLE_ADSIZE(AddressSize); TOGGLE_ADSIZE(AddressSize);
TOGGLE_OPSIZE(OperandSize);
/* Get the operands */ /* Get the operands */
if (!Fast486ParseModRegRm(State, AddressSize, &ModRegRm)) if (!Fast486ParseModRegRm(State, AddressSize, &ModRegRm))
@ -3854,10 +3857,21 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeMovStoreSeg)
return; return;
} }
Fast486WriteModrmWordOperands(State, /* When the other operand is a memory location, always use 16-bit */
&ModRegRm, if (OperandSize && !ModRegRm.Memory)
FALSE, {
State->SegmentRegs[ModRegRm.Register].Selector); Fast486WriteModrmDwordOperands(State,
&ModRegRm,
FALSE,
State->SegmentRegs[ModRegRm.Register].Selector);
}
else
{
Fast486WriteModrmWordOperands(State,
&ModRegRm,
FALSE,
State->SegmentRegs[ModRegRm.Register].Selector);
}
} }
FAST486_OPCODE_HANDLER(Fast486OpcodeLea) FAST486_OPCODE_HANDLER(Fast486OpcodeLea)