From a88f650367e0106c15597d2acd3d933844613eca Mon Sep 17 00:00:00 2001 From: Aleksandar Andrejevic Date: Tue, 13 Aug 2013 17:06:15 +0000 Subject: [PATCH] [SOFTX86] Fix carry/overflow flag computation for ADD instructions. svn path=/branches/ntvdm/; revision=59725 --- lib/3rdparty/softx86/softx86/add.c | 52 ++++++++++++++++++------------ 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/lib/3rdparty/softx86/softx86/add.c b/lib/3rdparty/softx86/softx86/add.c index cf339d65fe4..9b356cc6e61 100644 --- a/lib/3rdparty/softx86/softx86/add.c +++ b/lib/3rdparty/softx86/softx86/add.c @@ -35,13 +35,16 @@ sx86_ubyte op_add8(softx86_ctx* ctx,sx86_ubyte src,sx86_ubyte val) /* 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 ((ret < src) || (ret < val)) 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; @@ -79,13 +82,16 @@ sx86_uword op_add16(softx86_ctx* ctx,sx86_uword src,sx86_uword val) /* 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 ((ret < src) || (ret < val)) ctx->state->reg_flags.val |= SX86_CPUFLAG_CARRY; + else ctx->state->reg_flags.val &= ~SX86_CPUFLAG_CARRY; + +/* if 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 */ if (ret & 0x8000) @@ -125,13 +131,17 @@ sx86_udword op_add32(softx86_ctx* ctx,sx86_udword src,sx86_udword val) /* 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 ((ret < src) || (ret < val)) 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)