Author: aandrejevic
Date: Mon Jul 15 02:34:45 2013
New Revision: 59490
URL:
http://svn.reactos.org/svn/reactos?rev=59490&view=rev
Log:
[SOFTX86]
Fix carry/overflow condition for the SUB instruction.
Modified:
branches/ntvdm/lib/3rdparty/softx86/softx86/add.c
Modified: branches/ntvdm/lib/3rdparty/softx86/softx86/add.c
URL:
http://svn.reactos.org/svn/reactos/branches/ntvdm/lib/3rdparty/softx86/soft…
==============================================================================
--- branches/ntvdm/lib/3rdparty/softx86/softx86/add.c [iso-8859-1] (original)
+++ branches/ntvdm/lib/3rdparty/softx86/softx86/add.c [iso-8859-1] Mon Jul 15 02:34:45
2013
@@ -342,13 +342,16 @@
/* peform the addition */
ret = src - val;
-/* if carry/overflow */
- if (ret > src)
- ctx->state->reg_flags.val |=
- (SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
- else
- ctx->state->reg_flags.val &=
- ~(SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
+/* if carry */
+ if (val > src) ctx->state->reg_flags.val |= SX86_CPUFLAG_CARRY;
+ else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_CARRY;
+
+/* if overflow */
+ if (((src & 0x80) != (val & 0x80)) && ((src & 0x80) != (ret &
0x80)))
+ {
+ ctx->state->reg_flags.val |= SX86_CPUFLAG_OVERFLOW;
+ }
+ else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_OVERFLOW;
/* if result treated as signed value is negative */
if (ret & 0x80) ctx->state->reg_flags.val |= SX86_CPUFLAG_SIGN;
@@ -391,7 +394,10 @@
else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_CARRY;
/* if overflow */
- if ((ret & 0x8000) != (src & 0x8000)) ctx->state->reg_flags.val |=
SX86_CPUFLAG_OVERFLOW;
+ if (((src & 0x8000) != (val & 0x8000)) && ((src & 0x8000) != (ret
& 0x8000)))
+ {
+ ctx->state->reg_flags.val |= SX86_CPUFLAG_OVERFLOW;
+ }
else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_OVERFLOW;
/* if result treated as signed value is negative */
@@ -430,13 +436,17 @@
/* peform the addition */
ret = src - val;
-/* if carry/overflow */
- if (ret > src)
- ctx->state->reg_flags.val |=
- (SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
- else
- ctx->state->reg_flags.val &=
- ~(SX86_CPUFLAG_CARRY | SX86_CPUFLAG_OVERFLOW);
+/* if carry */
+ if (val > src) ctx->state->reg_flags.val |= SX86_CPUFLAG_CARRY;
+ else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_CARRY;
+
+/* if overflow */
+ if (((src & 0x80000000) != (val & 0x80000000))
+ && ((src & 0x80000000) != (ret & 0x80000000)))
+ {
+ ctx->state->reg_flags.val |= SX86_CPUFLAG_OVERFLOW;
+ }
+ else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_OVERFLOW;
/* if result treated as signed value is negative */
if (ret & 0x80000000) ctx->state->reg_flags.val |= SX86_CPUFLAG_SIGN;