[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 08/23] target/i386: Use DISAS_EOB* in gen_movl_seg_T0
From: |
Paolo Bonzini |
Subject: |
Re: [PATCH v2 08/23] target/i386: Use DISAS_EOB* in gen_movl_seg_T0 |
Date: |
Wed, 21 Sep 2022 14:09:54 +0200 |
On Tue, Sep 6, 2022 at 12:09 PM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Set is_jmp properly in gen_movl_seg_T0, so that the callers
> need to nothing special.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
> target/i386/tcg/translate.c | 36 +++++-------------------------------
> 1 file changed, 5 insertions(+), 31 deletions(-)
>
> diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
> index 778ee4ed4c..ea35d3e9b4 100644
> --- a/target/i386/tcg/translate.c
> +++ b/target/i386/tcg/translate.c
> @@ -2432,13 +2432,15 @@ static void gen_movl_seg_T0(DisasContext *s, X86Seg
> seg_reg)
> because ss32 may change. For R_SS, translation must always
> stop as a special handling must be done to disable hardware
> interrupts for the next instruction */
> - if (seg_reg == R_SS || (CODE32(s) && seg_reg < R_FS)) {
> - s->base.is_jmp = DISAS_TOO_MANY;
> + if (seg_reg == R_SS) {
> + s->base.is_jmp = DISAS_EOB_INHIBIT_IRQ;
> + } else if (CODE32(s) && seg_reg < R_FS) {
> + s->base.is_jmp = DISAS_EOB_NEXT;
> }
> } else {
> gen_op_movl_seg_T0_vm(s, seg_reg);
> if (seg_reg == R_SS) {
> - s->base.is_jmp = DISAS_TOO_MANY;
> + s->base.is_jmp = DISAS_EOB_INHIBIT_IRQ;
> }
> }
> }
> @@ -5682,26 +5684,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
> ot = gen_pop_T0(s);
> gen_movl_seg_T0(s, reg);
> gen_pop_update(s, ot);
> - /* Note that reg == R_SS in gen_movl_seg_T0 always sets is_jmp. */
> - if (s->base.is_jmp) {
> - gen_update_eip_next(s);
> - if (reg == R_SS) {
> - s->flags &= ~HF_TF_MASK;
> - gen_eob_inhibit_irq(s, true);
> - } else {
> - gen_eob(s);
> - }
> - }
> break;
> case 0x1a1: /* pop fs */
> case 0x1a9: /* pop gs */
> ot = gen_pop_T0(s);
> gen_movl_seg_T0(s, (b >> 3) & 7);
> gen_pop_update(s, ot);
> - if (s->base.is_jmp) {
> - gen_update_eip_next(s);
> - gen_eob(s);
> - }
> break;
>
> /**************************/
> @@ -5748,16 +5736,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
> goto illegal_op;
> gen_ldst_modrm(env, s, modrm, MO_16, OR_TMP0, 0);
> gen_movl_seg_T0(s, reg);
> - /* Note that reg == R_SS in gen_movl_seg_T0 always sets is_jmp. */
> - if (s->base.is_jmp) {
> - gen_update_eip_next(s);
> - if (reg == R_SS) {
> - s->flags &= ~HF_TF_MASK;
> - gen_eob_inhibit_irq(s, true);
> - } else {
> - gen_eob(s);
> - }
> - }
> break;
> case 0x8c: /* mov Gv, seg */
> modrm = x86_ldub_code(env, s);
> @@ -5956,10 +5934,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
> gen_movl_seg_T0(s, op);
> /* then put the data */
> gen_op_mov_reg_v(s, ot, reg, s->T1);
> - if (s->base.is_jmp) {
> - gen_update_eip_next(s);
> - gen_eob(s);
> - }
> break;
>
> /************************/
> --
> 2.34.1
>
- Re: [PATCH v2 12/23] target/i386: Remove cur_eip, next_eip arguments to gen_repz*, (continued)
- [PATCH v2 10/23] target/i386: USe DISAS_EOB_ONLY, Richard Henderson, 2022/09/06
- [PATCH v2 15/23] target/i386: Create eip_next_*, Richard Henderson, 2022/09/06
- [PATCH v2 17/23] target/i386: Create gen_jmp_rel, Richard Henderson, 2022/09/06
- [PATCH v2 19/23] target/i386: Use gen_jmp_rel for gen_jcc, Richard Henderson, 2022/09/06
- [PATCH v2 08/23] target/i386: Use DISAS_EOB* in gen_movl_seg_T0, Richard Henderson, 2022/09/06
- Re: [PATCH v2 08/23] target/i386: Use DISAS_EOB* in gen_movl_seg_T0,
Paolo Bonzini <=
- [PATCH v2 09/23] target/i386: Use DISAS_EOB_NEXT, Richard Henderson, 2022/09/06
- [PATCH v2 11/23] target/i386: Create cur_insn_len, cur_insn_len_i32, Richard Henderson, 2022/09/06
- [PATCH v2 13/23] target/i386: Introduce DISAS_JUMP, Richard Henderson, 2022/09/06
- [PATCH v2 20/23] target/i386: Use gen_jmp_rel for gen_repz*, Richard Henderson, 2022/09/06