[FAST486]

Duplicate prefixes don't generate #UD. Multiple segment overrides
override each other, and so do REP and REPNZ.


svn path=/trunk/; revision=67669
This commit is contained in:
Aleksandar Andrejevic 2015-05-11 18:49:10 +00:00
parent 8d53d6c2bd
commit 07a731ed1c

View file

@ -311,120 +311,74 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeInvalid)
FAST486_OPCODE_HANDLER(Fast486OpcodePrefix) FAST486_OPCODE_HANDLER(Fast486OpcodePrefix)
{ {
BOOLEAN Valid = FALSE;
switch (Opcode) switch (Opcode)
{ {
/* ES: */ /* ES: */
case 0x26: case 0x26:
{
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
{ {
State->PrefixFlags |= FAST486_PREFIX_SEG; State->PrefixFlags |= FAST486_PREFIX_SEG;
State->SegmentOverride = FAST486_REG_ES; State->SegmentOverride = FAST486_REG_ES;
Valid = TRUE;
}
break; break;
} }
/* CS: */ /* CS: */
case 0x2E: case 0x2E:
{
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
{ {
State->PrefixFlags |= FAST486_PREFIX_SEG; State->PrefixFlags |= FAST486_PREFIX_SEG;
State->SegmentOverride = FAST486_REG_CS; State->SegmentOverride = FAST486_REG_CS;
Valid = TRUE;
}
break; break;
} }
/* SS: */ /* SS: */
case 0x36: case 0x36:
{
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
{ {
State->PrefixFlags |= FAST486_PREFIX_SEG; State->PrefixFlags |= FAST486_PREFIX_SEG;
State->SegmentOverride = FAST486_REG_SS; State->SegmentOverride = FAST486_REG_SS;
Valid = TRUE;
}
break; break;
} }
/* DS: */ /* DS: */
case 0x3E: case 0x3E:
{
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
{ {
State->PrefixFlags |= FAST486_PREFIX_SEG; State->PrefixFlags |= FAST486_PREFIX_SEG;
State->SegmentOverride = FAST486_REG_DS; State->SegmentOverride = FAST486_REG_DS;
Valid = TRUE;
}
break; break;
} }
/* FS: */ /* FS: */
case 0x64: case 0x64:
{
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
{ {
State->PrefixFlags |= FAST486_PREFIX_SEG; State->PrefixFlags |= FAST486_PREFIX_SEG;
State->SegmentOverride = FAST486_REG_FS; State->SegmentOverride = FAST486_REG_FS;
Valid = TRUE;
}
break; break;
} }
/* GS: */ /* GS: */
case 0x65: case 0x65:
{
if (!(State->PrefixFlags & FAST486_PREFIX_SEG))
{ {
State->PrefixFlags |= FAST486_PREFIX_SEG; State->PrefixFlags |= FAST486_PREFIX_SEG;
State->SegmentOverride = FAST486_REG_GS; State->SegmentOverride = FAST486_REG_GS;
Valid = TRUE;
}
break; break;
} }
/* OPSIZE */ /* OPSIZE */
case 0x66: case 0x66:
{
if (!(State->PrefixFlags & FAST486_PREFIX_OPSIZE))
{ {
State->PrefixFlags |= FAST486_PREFIX_OPSIZE; State->PrefixFlags |= FAST486_PREFIX_OPSIZE;
Valid = TRUE;
}
break; break;
} }
/* ADSIZE */ /* ADSIZE */
case 0x67: case 0x67:
{
if (!(State->PrefixFlags & FAST486_PREFIX_ADSIZE))
{ {
State->PrefixFlags |= FAST486_PREFIX_ADSIZE; State->PrefixFlags |= FAST486_PREFIX_ADSIZE;
Valid = TRUE;
}
break; break;
} }
/* LOCK */ /* LOCK */
case 0xF0: case 0xF0:
{
if (!(State->PrefixFlags & FAST486_PREFIX_LOCK))
{ {
State->PrefixFlags |= FAST486_PREFIX_LOCK; State->PrefixFlags |= FAST486_PREFIX_LOCK;
Valid = TRUE;
}
break; break;
} }
@ -432,13 +386,8 @@ FAST486_OPCODE_HANDLER(Fast486OpcodePrefix)
case 0xF2: case 0xF2:
{ {
/* Mutually exclusive with REP */ /* Mutually exclusive with REP */
if (!(State->PrefixFlags
& (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP)))
{
State->PrefixFlags |= FAST486_PREFIX_REPNZ; State->PrefixFlags |= FAST486_PREFIX_REPNZ;
Valid = TRUE; State->PrefixFlags &= ~FAST486_PREFIX_REP;
}
break; break;
} }
@ -446,24 +395,16 @@ FAST486_OPCODE_HANDLER(Fast486OpcodePrefix)
case 0xF3: case 0xF3:
{ {
/* Mutually exclusive with REPNZ */ /* Mutually exclusive with REPNZ */
if (!(State->PrefixFlags
& (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP)))
{
State->PrefixFlags |= FAST486_PREFIX_REP; State->PrefixFlags |= FAST486_PREFIX_REP;
Valid = TRUE; State->PrefixFlags &= ~FAST486_PREFIX_REPNZ;
}
break; break;
} }
}
if (!Valid) default:
{ {
/* Clear all prefixes */ /* Shouldn't happen */
State->PrefixFlags = 0; ASSERT(FALSE);
}
/* Throw an exception */
Fast486Exception(State, FAST486_EXCEPTION_UD);
} }
} }