diff options
author | Richard Henderson <rth@twiddle.net> | 2013-02-19 23:52:00 -0800 |
---|---|---|
committer | Blue Swirl <blauwirbel@gmail.com> | 2013-02-23 17:25:29 +0000 |
commit | 76f131332310d8317880ef73a2bc90725d857ed3 (patch) | |
tree | e47e4754d11de992710bdbfbdbf33dac46dbd7ce /target-i386 | |
parent | d693e14733509f9a2124b03a912058790411140a (diff) |
target-i386: Use add2 to implement the ADX extension
Signed-off-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Diffstat (limited to 'target-i386')
-rw-r--r-- | target-i386/translate.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/target-i386/translate.c b/target-i386/translate.c index 439d19efe0..605cd88bd2 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; |