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/softx86/add.c?rev=59490&r1=59489&r2=59490&view=diff ============================================================================== --- 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;