/* 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;
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 */
/* 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;