Message ID | 20220906100932.343523-17-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: > > We can set is_jmp early, using only one if, and let that > be overwritten by gen_repz_* etc. Perhaps "be overwritten by gen_rep*'s calls to gen_jmp_rel". Code-wise, Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Paolo > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> > --- > target/i386/tcg/translate.c | 42 +++++++++---------------------------- > 1 file changed, 10 insertions(+), 32 deletions(-) > > diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c > index 527fb79895..cedc195837 100644 > --- a/target/i386/tcg/translate.c > +++ b/target/i386/tcg/translate.c > @@ -5605,14 +5605,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: > @@ -6658,15 +6656,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 */ > @@ -6679,15 +6674,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; > > @@ -6704,13 +6696,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: > @@ -6722,14 +6712,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: > @@ -6741,13 +6729,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: > @@ -6759,14 +6745,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; > > /************************/ > @@ -7432,11 +7416,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); > @@ -7893,11 +7875,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: > @@ -8261,6 +8241,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); > @@ -8271,9 +8252,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; > > -- > 2.34.1 >
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c index 527fb79895..cedc195837 100644 --- a/target/i386/tcg/translate.c +++ b/target/i386/tcg/translate.c @@ -5605,14 +5605,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: @@ -6658,15 +6656,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 */ @@ -6679,15 +6674,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; @@ -6704,13 +6696,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: @@ -6722,14 +6712,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: @@ -6741,13 +6729,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: @@ -6759,14 +6745,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; /************************/ @@ -7432,11 +7416,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); @@ -7893,11 +7875,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: @@ -8261,6 +8241,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); @@ -8271,9 +8252,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;
We can set is_jmp early, using only one if, and let that be overwritten by gen_repz_* etc. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- target/i386/tcg/translate.c | 42 +++++++++---------------------------- 1 file changed, 10 insertions(+), 32 deletions(-)