diff --git a/target-i386/translate.c b/target-i386/translate.c index 439d19efe063..605cd88bd296 100644 --- a/target-i386/translate.c +++ b/target-i386/translate.c @@ -4182,7 +4182,7 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_ADX)) { goto illegal_op; } else { - TCGv carry_in, carry_out; + TCGv carry_in, carry_out, zero; int end_op; ot = (s->dflag == 2 ? OT_QUAD : OT_LONG); @@ -4242,18 +4242,16 @@ static void gen_sse(CPUX86State *env, DisasContext *s, int b, #endif default: /* Otherwise compute the carry-out in two steps. */ - tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_regs[reg]); - tcg_gen_setcond_tl(TCG_COND_LTU, cpu_tmp4, - cpu_T[0], cpu_regs[reg]); - tcg_gen_add_tl(cpu_regs[reg], cpu_T[0], carry_in); - tcg_gen_setcond_tl(TCG_COND_LTU, carry_out, - cpu_regs[reg], cpu_T[0]); - tcg_gen_or_tl(carry_out, carry_out, cpu_tmp4); + zero = tcg_const_tl(0); + tcg_gen_add2_tl(cpu_T[0], carry_out, + cpu_T[0], zero, + carry_in, zero); + tcg_gen_add2_tl(cpu_regs[reg], carry_out, + cpu_regs[reg], carry_out, + cpu_T[0], zero); + tcg_temp_free(zero); break; } - /* We began with all flags computed to CC_SRC, and we - have now placed the carry-out in CC_DST. All that - is left is to record the CC_OP. */ set_cc_op(s, end_op); } break;