target/i386: extract common bits of gen_repz/gen_repz_nz
Now that everything has been cleaned up, look at DF and prefixes in a single function, and call that one from gen_repz and gen_repz_nz. Suggested-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4f094e27f3
commit
82290c7647
@ -688,14 +688,6 @@ static inline void gen_string_movl_A0_EDI(DisasContext *s)
|
|||||||
gen_lea_v_seg(s, cpu_regs[R_EDI], R_ES, -1);
|
gen_lea_v_seg(s, cpu_regs[R_EDI], R_ES, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline TCGv gen_compute_Dshift(DisasContext *s, MemOp ot)
|
|
||||||
{
|
|
||||||
TCGv dshift = tcg_temp_new();
|
|
||||||
tcg_gen_ld32s_tl(dshift, tcg_env, offsetof(CPUX86State, df));
|
|
||||||
tcg_gen_shli_tl(dshift, dshift, ot);
|
|
||||||
return dshift;
|
|
||||||
};
|
|
||||||
|
|
||||||
static TCGv gen_ext_tl(TCGv dst, TCGv src, MemOp size, bool sign)
|
static TCGv gen_ext_tl(TCGv dst, TCGv src, MemOp size, bool sign)
|
||||||
{
|
{
|
||||||
if (size == MO_TL) {
|
if (size == MO_TL) {
|
||||||
@ -1446,29 +1438,31 @@ static void do_gen_rep(DisasContext *s, MemOp ot, TCGv dshift,
|
|||||||
gen_jmp_rel_csize(s, 0, 1);
|
gen_jmp_rel_csize(s, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_repz(DisasContext *s, MemOp ot,
|
static void do_gen_string(DisasContext *s, MemOp ot,
|
||||||
void (*fn)(DisasContext *s, MemOp ot, TCGv dshift))
|
void (*fn)(DisasContext *s, MemOp ot, TCGv dshift),
|
||||||
|
bool is_repz_nz)
|
||||||
{
|
{
|
||||||
TCGv dshift = gen_compute_Dshift(s, ot);
|
TCGv dshift = tcg_temp_new();
|
||||||
|
tcg_gen_ld32s_tl(dshift, tcg_env, offsetof(CPUX86State, df));
|
||||||
|
tcg_gen_shli_tl(dshift, dshift, ot);
|
||||||
|
|
||||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||||
do_gen_rep(s, ot, dshift, fn, false);
|
do_gen_rep(s, ot, dshift, fn, is_repz_nz);
|
||||||
} else {
|
} else {
|
||||||
fn(s, ot, dshift);
|
fn(s, ot, dshift);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gen_repz(DisasContext *s, MemOp ot,
|
||||||
|
void (*fn)(DisasContext *s, MemOp ot, TCGv dshift))
|
||||||
|
{
|
||||||
|
do_gen_string(s, ot, fn, false);
|
||||||
|
}
|
||||||
|
|
||||||
static void gen_repz_nz(DisasContext *s, MemOp ot,
|
static void gen_repz_nz(DisasContext *s, MemOp ot,
|
||||||
void (*fn)(DisasContext *s, MemOp ot, TCGv dshift))
|
void (*fn)(DisasContext *s, MemOp ot, TCGv dshift))
|
||||||
{
|
{
|
||||||
TCGv dshift = gen_compute_Dshift(s, ot);
|
do_gen_string(s, ot, fn, true);
|
||||||
|
|
||||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
|
||||||
do_gen_rep(s, ot, dshift, fn, true);
|
|
||||||
} else {
|
|
||||||
fn(s, ot, dshift);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gen_helper_fp_arith_ST0_FT0(int op)
|
static void gen_helper_fp_arith_ST0_FT0(int op)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user