[FAST486]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Wed, 13 Nov 2013 22:33:37 +0000 (22:33 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Wed, 13 Nov 2013 22:33:37 +0000 (22:33 +0000)
XADD: Fix the order of operations.
POP <modrm>: The value must be popped from the stack before parsing the
Mod-Reg-R/M, because of the "POP DWORD [ESP]" case.

svn path=/branches/ntvdm/; revision=60984

lib/fast486/common.inl
lib/fast486/extraops.c
lib/fast486/opgroups.c

index 8097374..acbdb2a 100644 (file)
@@ -326,7 +326,7 @@ Fast486StackPop(PFAST486_STATE State,
     BOOLEAN Size = State->SegmentRegs[FAST486_REG_SS].Size;
 
     /* The OPSIZE prefix toggles the size */
-    if (State->PrefixFlags & FAST486_PREFIX_OPSIZE) Size = !Size;
+    TOGGLE_OPSIZE(Size);
 
     if (Size)
     {
index 8d57bfc..273c4fe 100644 (file)
@@ -2032,15 +2032,15 @@ FAST486_OPCODE_HANDLER(Fast486ExtOpcodeXadd)
         State->Flags.Sf = ((Result & SIGN_FLAG_LONG) != 0);
         State->Flags.Pf = Fast486CalculateParity(Result);
 
-        /* Write the sum to the destination */
-        if (!Fast486WriteModrmDwordOperands(State, &ModRegRm, FALSE, Result))
+        /* Write the old value of the destination to the source */
+        if (!Fast486WriteModrmDwordOperands(State, &ModRegRm, TRUE, Destination))
         {
             /* Exception occurred */
             return FALSE;
         }
 
-        /* Write the old value of the destination to the source */
-        if (!Fast486WriteModrmDwordOperands(State, &ModRegRm, TRUE, Destination))
+        /* Write the sum to the destination */
+        if (!Fast486WriteModrmDwordOperands(State, &ModRegRm, FALSE, Result))
         {
             /* Exception occurred */
             return FALSE;
@@ -2071,15 +2071,15 @@ FAST486_OPCODE_HANDLER(Fast486ExtOpcodeXadd)
         State->Flags.Sf = ((Result & SIGN_FLAG_WORD) != 0);
         State->Flags.Pf = Fast486CalculateParity(Result);
 
-        /* Write the sum to the destination */
-        if (!Fast486WriteModrmWordOperands(State, &ModRegRm, FALSE, Result))
+        /* Write the old value of the destination to the source */
+        if (!Fast486WriteModrmWordOperands(State, &ModRegRm, TRUE, Destination))
         {
             /* Exception occurred */
             return FALSE;
         }
 
-        /* Write the old value of the destination to the source */
-        if (!Fast486WriteModrmWordOperands(State, &ModRegRm, TRUE, Destination))
+        /* Write the sum to the destination */
+        if (!Fast486WriteModrmWordOperands(State, &ModRegRm, FALSE, Result))
         {
             /* Exception occurred */
             return FALSE;
index 46ad234..0a297ae 100644 (file)
@@ -486,23 +486,26 @@ FAST486_OPCODE_HANDLER(Fast486OpcodeGroup8F)
     TOGGLE_OPSIZE(OperandSize);
     TOGGLE_ADSIZE(AddressSize);
 
-    if (!Fast486ParseModRegRm(State, AddressSize, &ModRegRm))
+    /* Pop a value from the stack - this must be done first */
+    if (!Fast486StackPop(State, &Value))
     {
         /* Exception occurred */
         return FALSE;
     }
 
-    if (ModRegRm.Register != 0)
+    if (!Fast486ParseModRegRm(State, AddressSize, &ModRegRm))
     {
-        /* Invalid */
-        Fast486Exception(State, FAST486_EXCEPTION_UD);
+        /* Exception occurred - restore SP */
+        if (OperandSize) State->GeneralRegs[FAST486_REG_ESP].Long += sizeof(ULONG);
+        else State->GeneralRegs[FAST486_REG_ESP].LowWord += sizeof(USHORT);
+
         return FALSE;
     }
 
-    /* Pop a value from the stack */
-    if (!Fast486StackPop(State, &Value))
+    if (ModRegRm.Register != 0)
     {
-        /* Exception occurred */
+        /* Invalid */
+        Fast486Exception(State, FAST486_EXCEPTION_UD);
         return FALSE;
     }