Message ID | 20220906100932.343523-8-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | target/i386: pc-relative translation blocks | expand |
On Tue, Sep 6, 2022 at 12:09 PM Richard Henderson <richard.henderson@linaro.org> wrote: > > Add a few DISAS_TARGET_* aliases to reduce the number of > calls to gen_eob() and gen_eob_inhibit_irq(). So far, > only update i386_tr_translate_insn for exiting the block > because of single-step or previous inhibit irq. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> > --- > target/i386/tcg/translate.c | 23 +++++++++++++++++++++-- > 1 file changed, 21 insertions(+), 2 deletions(-) > > diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c > index 6084c85609..778ee4ed4c 100644 > --- a/target/i386/tcg/translate.c > +++ b/target/i386/tcg/translate.c > @@ -132,6 +132,10 @@ typedef struct DisasContext { > TCGOp *prev_insn_end; > } DisasContext; > > +#define DISAS_EOB_ONLY DISAS_TARGET_0 > +#define DISAS_EOB_NEXT DISAS_TARGET_1 > +#define DISAS_EOB_INHIBIT_IRQ DISAS_TARGET_2 > + > /* The environment in which user-only runs is constrained. */ > #ifdef CONFIG_USER_ONLY > #define PE(S) true > @@ -8814,7 +8818,7 @@ static void i386_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) > * the flag and abort the translation to give the irqs a > * chance to happen. > */ > - dc->base.is_jmp = DISAS_TOO_MANY; > + dc->base.is_jmp = DISAS_EOB_NEXT; > } else if (!is_same_page(&dc->base, pc_next)) { > dc->base.is_jmp = DISAS_TOO_MANY; > } > @@ -8826,9 +8830,24 @@ static void i386_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) > { > DisasContext *dc = container_of(dcbase, DisasContext, base); > > - if (dc->base.is_jmp == DISAS_TOO_MANY) { > + switch (dc->base.is_jmp) { > + case DISAS_NORETURN: > + break; > + case DISAS_TOO_MANY: > + case DISAS_EOB_NEXT: > + gen_update_cc_op(dc); > gen_update_eip_cur(dc); > + /* fall through */ > + case DISAS_EOB_ONLY: > gen_eob(dc); > + break; > + case DISAS_EOB_INHIBIT_IRQ: > + gen_update_cc_op(dc); > + gen_update_eip_cur(dc); > + gen_eob_inhibit_irq(dc, true); > + break; > + default: > + g_assert_not_reached(); > } > } > > -- > 2.34.1 >
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 6084c85609..778ee4ed4c 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -132,6 +132,10 @@ typedef struct DisasContext { TCGOp *prev_insn_end; } DisasContext; +#define DISAS_EOB_ONLY DISAS_TARGET_0 +#define DISAS_EOB_NEXT DISAS_TARGET_1 +#define DISAS_EOB_INHIBIT_IRQ DISAS_TARGET_2 + /* The environment in which user-only runs is constrained. */ #ifdef CONFIG_USER_ONLY #define PE(S) true @@ -8814,7 +8818,7 @@ static void i386_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) * the flag and abort the translation to give the irqs a * chance to happen. */ - dc->base.is_jmp = DISAS_TOO_MANY; + dc->base.is_jmp = DISAS_EOB_NEXT; } else if (!is_same_page(&dc->base, pc_next)) { dc->base.is_jmp = DISAS_TOO_MANY; } @@ -8826,9 +8830,24 @@ static void i386_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu) { DisasContext *dc = container_of(dcbase, DisasContext, base); - if (dc->base.is_jmp == DISAS_TOO_MANY) { + switch (dc->base.is_jmp) { + case DISAS_NORETURN: + break; + case DISAS_TOO_MANY: + case DISAS_EOB_NEXT: + gen_update_cc_op(dc); gen_update_eip_cur(dc); + /* fall through */ + case DISAS_EOB_ONLY: gen_eob(dc); + break; + case DISAS_EOB_INHIBIT_IRQ: + gen_update_cc_op(dc); + gen_update_eip_cur(dc); + gen_eob_inhibit_irq(dc, true); + break; + default: + g_assert_not_reached(); } }
Add a few DISAS_TARGET_* aliases to reduce the number of calls to gen_eob() and gen_eob_inhibit_irq(). So far, only update i386_tr_translate_insn for exiting the block because of single-step or previous inhibit irq. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/i386/tcg/translate.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-)