mirror of https://github.com/xemu-project/xemu.git
target/i386: Use DISAS_TOO_MANY to exit after gen_io_start
We can set is_jmp early, using only one if, and let that be overwritten by gen_rep*'s calls to gen_jmp_tb. Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20221001140935.465607-17-richard.henderson@linaro.org> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
9e599bf707
commit
202005f1f8
|
@ -5660,14 +5660,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
gen_helper_rdrand(s->T0, cpu_env);
|
||||
rm = (modrm & 7) | REX_B(s);
|
||||
gen_op_mov_reg_v(s, dflag, rm, s->T0);
|
||||
set_cc_op(s, CC_OP_EFLAGS);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -6704,15 +6702,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_ins(s, ot);
|
||||
/* jump generated by gen_repz_ins */
|
||||
} else {
|
||||
gen_ins(s, ot);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 0x6e: /* outsS */
|
||||
|
@ -6725,15 +6720,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
gen_repz_outs(s, ot);
|
||||
/* jump generated by gen_repz_outs */
|
||||
} else {
|
||||
gen_outs(s, ot);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -6750,13 +6742,11 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
gen_helper_in_func(ot, s->T1, s->tmp2_i32);
|
||||
gen_op_mov_reg_v(s, ot, R_EAX, s->T1);
|
||||
gen_bpt_io(s, s->tmp2_i32, ot);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
break;
|
||||
case 0xe6:
|
||||
case 0xe7:
|
||||
|
@ -6768,14 +6758,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
gen_op_mov_v_reg(s, ot, s->T1, R_EAX);
|
||||
tcg_gen_trunc_tl_i32(s->tmp3_i32, s->T1);
|
||||
gen_helper_out_func(ot, s->tmp2_i32, s->tmp3_i32);
|
||||
gen_bpt_io(s, s->tmp2_i32, ot);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
break;
|
||||
case 0xec:
|
||||
case 0xed:
|
||||
|
@ -6787,13 +6775,11 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
gen_helper_in_func(ot, s->T1, s->tmp2_i32);
|
||||
gen_op_mov_reg_v(s, ot, R_EAX, s->T1);
|
||||
gen_bpt_io(s, s->tmp2_i32, ot);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
break;
|
||||
case 0xee:
|
||||
case 0xef:
|
||||
|
@ -6805,14 +6791,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
gen_op_mov_v_reg(s, ot, s->T1, R_EAX);
|
||||
tcg_gen_trunc_tl_i32(s->tmp3_i32, s->T1);
|
||||
gen_helper_out_func(ot, s->tmp2_i32, s->tmp3_i32);
|
||||
gen_bpt_io(s, s->tmp2_i32, ot);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
break;
|
||||
|
||||
/************************/
|
||||
|
@ -7478,11 +7462,9 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
gen_update_eip_cur(s);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
gen_helper_rdtsc(cpu_env);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
break;
|
||||
case 0x133: /* rdpmc */
|
||||
gen_update_cc_op(s);
|
||||
|
@ -7939,11 +7921,9 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
gen_update_eip_cur(s);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
gen_helper_rdtscp(cpu_env);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -8307,6 +8287,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
s->base.is_jmp = DISAS_TOO_MANY;
|
||||
}
|
||||
if (b & 2) {
|
||||
gen_svm_check_intercept(s, SVM_EXIT_WRITE_CR0 + reg);
|
||||
|
@ -8317,9 +8298,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|||
gen_svm_check_intercept(s, SVM_EXIT_READ_CR0 + reg);
|
||||
gen_helper_read_crN(s->T0, cpu_env, tcg_constant_i32(reg));
|
||||
gen_op_mov_reg_v(s, ot, rm, s->T0);
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_jmp(s, s->pc - s->cs_base);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
Loading…
Reference in New Issue