target/i386: Expand eflags updates inline
The helpers for reset_rf, cli, sti, clac, stac are completely trivial; implement them inline. Drop some nearby #if 0 code. Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
cfa29dd506
commit
6317933086
@ -56,13 +56,8 @@ DEF_HELPER_2(syscall, void, env, int)
|
||||
DEF_HELPER_2(sysret, void, env, int)
|
||||
#endif
|
||||
DEF_HELPER_FLAGS_2(pause, TCG_CALL_NO_WG, noreturn, env, int)
|
||||
DEF_HELPER_1(reset_rf, void, env)
|
||||
DEF_HELPER_FLAGS_3(raise_interrupt, TCG_CALL_NO_WG, noreturn, env, int, int)
|
||||
DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, int)
|
||||
DEF_HELPER_1(cli, void, env)
|
||||
DEF_HELPER_1(sti, void, env)
|
||||
DEF_HELPER_1(clac, void, env)
|
||||
DEF_HELPER_1(stac, void, env)
|
||||
DEF_HELPER_3(boundw, void, env, tl, int)
|
||||
DEF_HELPER_3(boundl, void, env, tl, int)
|
||||
|
||||
|
@ -346,44 +346,3 @@ void helper_clts(CPUX86State *env)
|
||||
env->cr[0] &= ~CR0_TS_MASK;
|
||||
env->hflags &= ~HF_TS_MASK;
|
||||
}
|
||||
|
||||
void helper_reset_rf(CPUX86State *env)
|
||||
{
|
||||
env->eflags &= ~RF_MASK;
|
||||
}
|
||||
|
||||
void helper_cli(CPUX86State *env)
|
||||
{
|
||||
env->eflags &= ~IF_MASK;
|
||||
}
|
||||
|
||||
void helper_sti(CPUX86State *env)
|
||||
{
|
||||
env->eflags |= IF_MASK;
|
||||
}
|
||||
|
||||
void helper_clac(CPUX86State *env)
|
||||
{
|
||||
env->eflags &= ~AC_MASK;
|
||||
}
|
||||
|
||||
void helper_stac(CPUX86State *env)
|
||||
{
|
||||
env->eflags |= AC_MASK;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* vm86plus instructions */
|
||||
void helper_cli_vm(CPUX86State *env)
|
||||
{
|
||||
env->eflags &= ~VIF_MASK;
|
||||
}
|
||||
|
||||
void helper_sti_vm(CPUX86State *env)
|
||||
{
|
||||
env->eflags |= VIF_MASK;
|
||||
if (env->eflags & VIP_MASK) {
|
||||
raise_exception_ra(env, EXCP0D_GPF, GETPC());
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -2746,6 +2746,26 @@ static void gen_reset_hflag(DisasContext *s, uint32_t mask)
|
||||
}
|
||||
}
|
||||
|
||||
static void gen_set_eflags(DisasContext *s, target_ulong mask)
|
||||
{
|
||||
TCGv t = tcg_temp_new();
|
||||
|
||||
tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_gen_ori_tl(t, t, mask);
|
||||
tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
static void gen_reset_eflags(DisasContext *s, target_ulong mask)
|
||||
{
|
||||
TCGv t = tcg_temp_new();
|
||||
|
||||
tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_gen_andi_tl(t, t, ~mask);
|
||||
tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
||||
tcg_temp_free(t);
|
||||
}
|
||||
|
||||
/* Clear BND registers during legacy branches. */
|
||||
static void gen_bnd_jmp(DisasContext *s)
|
||||
{
|
||||
@ -2776,7 +2796,7 @@ do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, bool jr)
|
||||
}
|
||||
|
||||
if (s->base.tb->flags & HF_RF_MASK) {
|
||||
gen_helper_reset_rf(cpu_env);
|
||||
gen_reset_eflags(s, RF_MASK);
|
||||
}
|
||||
if (recheck_tf) {
|
||||
gen_helper_rechecking_single_step(cpu_env);
|
||||
@ -5502,12 +5522,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
||||
#endif
|
||||
case 0xfa: /* cli */
|
||||
if (check_iopl(s)) {
|
||||
gen_helper_cli(cpu_env);
|
||||
gen_reset_eflags(s, IF_MASK);
|
||||
}
|
||||
break;
|
||||
case 0xfb: /* sti */
|
||||
if (check_iopl(s)) {
|
||||
gen_helper_sti(cpu_env);
|
||||
gen_set_eflags(s, IF_MASK);
|
||||
/* interruptions are enabled only the first insn after sti */
|
||||
gen_update_eip_next(s);
|
||||
gen_eob_inhibit_irq(s, true);
|
||||
@ -5789,7 +5809,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
||||
|| CPL(s) != 0) {
|
||||
goto illegal_op;
|
||||
}
|
||||
gen_helper_clac(cpu_env);
|
||||
gen_reset_eflags(s, AC_MASK);
|
||||
s->base.is_jmp = DISAS_EOB_NEXT;
|
||||
break;
|
||||
|
||||
@ -5798,7 +5818,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
||||
|| CPL(s) != 0) {
|
||||
goto illegal_op;
|
||||
}
|
||||
gen_helper_stac(cpu_env);
|
||||
gen_set_eflags(s, AC_MASK);
|
||||
s->base.is_jmp = DISAS_EOB_NEXT;
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user