[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->SegmentOverride = FAST486_REG_ES;
State->PrefixFlags |= FAST486_PREFIX_SEG;
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->SegmentOverride = FAST486_REG_CS;
State->PrefixFlags |= FAST486_PREFIX_SEG;
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->SegmentOverride = FAST486_REG_SS;
State->PrefixFlags |= FAST486_PREFIX_SEG;
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->SegmentOverride = FAST486_REG_DS;
State->PrefixFlags |= FAST486_PREFIX_SEG;
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->SegmentOverride = FAST486_REG_FS;
State->PrefixFlags |= FAST486_PREFIX_SEG;
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->SegmentOverride = FAST486_REG_GS;
State->PrefixFlags |= FAST486_PREFIX_SEG;
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 State->PrefixFlags |= FAST486_PREFIX_REPNZ;
& (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP))) State->PrefixFlags &= ~FAST486_PREFIX_REP;
{
State->PrefixFlags |= FAST486_PREFIX_REPNZ;
Valid = TRUE;
}
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 State->PrefixFlags |= FAST486_PREFIX_REP;
& (FAST486_PREFIX_REPNZ | FAST486_PREFIX_REP))) State->PrefixFlags &= ~FAST486_PREFIX_REPNZ;
{
State->PrefixFlags |= FAST486_PREFIX_REP;
Valid = TRUE;
}
break; break;
} }
}
if (!Valid) default:
{ {
/* Clear all prefixes */ /* Shouldn't happen */
State->PrefixFlags = 0; ASSERT(FALSE);
}
/* Throw an exception */
Fast486Exception(State, FAST486_EXCEPTION_UD);
} }
} }