aboutsummaryrefslogtreecommitdiff
path: root/target-i386
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2013-02-19 23:52:00 -0800
committerBlue Swirl <blauwirbel@gmail.com>2013-02-23 17:25:29 +0000
commit76f131332310d8317880ef73a2bc90725d857ed3 (patch)
treee47e4754d11de992710bdbfbdbf33dac46dbd7ce /target-i386
parentd693e14733509f9a2124b03a912058790411140a (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.c20
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;