? qemu-sparc-carry-xcc-ops-2.patch ? qemu-sparc-carry-xcc-ops.patch Index: op.c =================================================================== RCS file: /sources/qemu/qemu/target-sparc/op.c,v retrieving revision 1.18 diff -u -p -r1.18 op.c --- op.c 30 Oct 2005 17:28:50 -0000 1.18 +++ op.c 10 Apr 2006 18:57:46 -0000 @@ -415,16 +415,17 @@ void OPPROTO op_addx_T1_T0(void) void OPPROTO op_addx_T1_T0_cc(void) { target_ulong src1; - + target_ulong has_carry = FLAG_SET(PSR_CARRY); src1 = T0; - T0 += T1 + FLAG_SET(PSR_CARRY); + T0 += T1 + has_carry; env->psr = 0; #ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; - if ((T0 & 0xffffffff) < (src1 & 0xffffffff)) + if (((T0 & 0xffffffff) < (src1 & 0xffffffff)) || + (has_carry && ((T0 & 0xffffffff) <= (src1 & 0xffffffff)))) env->psr |= PSR_CARRY; if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff) ^ -1) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) @@ -435,7 +436,7 @@ void OPPROTO op_addx_T1_T0_cc(void) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; - if (T0 < src1) + if (T0 < src1 || (has_carry && T0 <= src1)) env->xcc |= PSR_CARRY; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1ULL << 63)) env->xcc |= PSR_OVF; @@ -444,7 +445,7 @@ void OPPROTO op_addx_T1_T0_cc(void) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; - if (T0 < src1) + if (T0 < src1 || (has_carry && T0 <= src1)) env->psr |= PSR_CARRY; if (((src1 ^ T1 ^ -1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF; @@ -505,16 +506,17 @@ void OPPROTO op_subx_T1_T0(void) void OPPROTO op_subx_T1_T0_cc(void) { target_ulong src1; - + target_ulong has_carry = FLAG_SET(PSR_CARRY); src1 = T0; - T0 -= T1 + FLAG_SET(PSR_CARRY); + T0 -= T1 + has_carry; env->psr = 0; #ifdef TARGET_SPARC64 if (!(T0 & 0xffffffff)) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; - if ((src1 & 0xffffffff) < (T1 & 0xffffffff)) + if (((src1 & 0xffffffff) < (T1 & 0xffffffff)) || + (has_carry && ((src1 & 0xffffffff) <= (T1 & 0xffffffff)))) env->psr |= PSR_CARRY; if ((((src1 & 0xffffffff) ^ (T1 & 0xffffffff)) & ((src1 & 0xffffffff) ^ (T0 & 0xffffffff))) & (1 << 31)) @@ -525,7 +527,7 @@ void OPPROTO op_subx_T1_T0_cc(void) env->xcc |= PSR_ZERO; if ((int64_t) T0 < 0) env->xcc |= PSR_NEG; - if (src1 < T1) + if (src1 < T1 || (has_carry && src1 <= T1)) env->xcc |= PSR_CARRY; if (((src1 ^ T1) & (src1 ^ T0)) & (1ULL << 63)) env->xcc |= PSR_OVF; @@ -534,7 +536,7 @@ void OPPROTO op_subx_T1_T0_cc(void) env->psr |= PSR_ZERO; if ((int32_t) T0 < 0) env->psr |= PSR_NEG; - if (src1 < T1) + if (src1 < T1 || (has_carry && src1 <= T1)) env->psr |= PSR_CARRY; if (((src1 ^ T1) & (src1 ^ T0)) & (1 << 31)) env->psr |= PSR_OVF;