[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 11/45] target/hppa: Simplify TB end
From: |
Richard Henderson |
Subject: |
[PATCH 11/45] target/hppa: Simplify TB end |
Date: |
Wed, 24 Apr 2024 16:59:49 -0700 |
Minimize the amount of code in hppa_tr_translate_insn advancing the
insn queue for the next insn. Move the goto_tb path to hppa_tr_tb_stop.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/hppa/translate.c | 109 +++++++++++++++++++++-------------------
1 file changed, 57 insertions(+), 52 deletions(-)
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
index 6a73b1d409..138250b550 100644
--- a/target/hppa/translate.c
+++ b/target/hppa/translate.c
@@ -4698,54 +4698,31 @@ static void hppa_tr_translate_insn(DisasContextBase
*dcbase, CPUState *cs)
}
}
- /* Advance the insn queue. Note that this check also detects
- a priority change within the instruction queue. */
- if (ret == DISAS_NEXT && ctx->iaoq_b != ctx->iaoq_f + 4) {
- if (use_goto_tb(ctx, ctx->iaoq_b, ctx->iaoq_n)
- && (ctx->null_cond.c == TCG_COND_NEVER
- || ctx->null_cond.c == TCG_COND_ALWAYS)) {
- nullify_set(ctx, ctx->null_cond.c == TCG_COND_ALWAYS);
- gen_goto_tb(ctx, 0, ctx->iaoq_b, ctx->iaoq_n);
- ctx->base.is_jmp = ret = DISAS_NORETURN;
- } else {
- ctx->base.is_jmp = ret = DISAS_IAQ_N_STALE;
- }
+ /* If the TranslationBlock must end, do so. */
+ ctx->base.pc_next += 4;
+ if (ret != DISAS_NEXT) {
+ return;
}
+ /* Note this also detects a priority change. */
+ if (ctx->iaoq_b != ctx->iaoq_f + 4) {
+ ctx->base.is_jmp = DISAS_IAQ_N_STALE;
+ return;
+ }
+
+ /*
+ * Advance the insn queue.
+ * The only exit now is DISAS_TOO_MANY from the translator loop.
+ */
ctx->iaoq_f = ctx->iaoq_b;
ctx->iaoq_b = ctx->iaoq_n;
- ctx->base.pc_next += 4;
-
- switch (ret) {
- case DISAS_NORETURN:
- case DISAS_IAQ_N_UPDATED:
- break;
-
- case DISAS_NEXT:
- case DISAS_IAQ_N_STALE:
- case DISAS_IAQ_N_STALE_EXIT:
- if (ctx->iaoq_f == -1) {
- install_iaq_entries(ctx, -1, cpu_iaoq_b,
- ctx->iaoq_n, ctx->iaoq_n_var);
-#ifndef CONFIG_USER_ONLY
- tcg_gen_mov_i64(cpu_iasq_f, cpu_iasq_b);
-#endif
- nullify_save(ctx);
- ctx->base.is_jmp = (ret == DISAS_IAQ_N_STALE_EXIT
- ? DISAS_EXIT
- : DISAS_IAQ_N_UPDATED);
- } else if (ctx->iaoq_b == -1) {
- if (ctx->iaoq_n_var) {
- copy_iaoq_entry(ctx, cpu_iaoq_b, -1, ctx->iaoq_n_var);
- } else {
- tcg_gen_addi_i64(cpu_iaoq_b, cpu_iaoq_b, 4);
- tcg_gen_andi_i64(cpu_iaoq_b, cpu_iaoq_b,
- gva_offset_mask(ctx->tb_flags));
- }
+ if (ctx->iaoq_b == -1) {
+ if (ctx->iaoq_n_var) {
+ copy_iaoq_entry(ctx, cpu_iaoq_b, -1, ctx->iaoq_n_var);
+ } else {
+ tcg_gen_addi_i64(cpu_iaoq_b, cpu_iaoq_b, 4);
+ tcg_gen_andi_i64(cpu_iaoq_b, cpu_iaoq_b,
+ gva_offset_mask(ctx->tb_flags));
}
- break;
-
- default:
- g_assert_not_reached();
}
}
@@ -4753,23 +4730,51 @@ static void hppa_tr_tb_stop(DisasContextBase *dcbase,
CPUState *cs)
{
DisasContext *ctx = container_of(dcbase, DisasContext, base);
DisasJumpType is_jmp = ctx->base.is_jmp;
+ uint64_t fi, bi;
+ TCGv_i64 fv, bv;
+ TCGv_i64 fs;
+
+ /* Assume the insn queue has not been advanced. */
+ fi = ctx->iaoq_b;
+ fv = cpu_iaoq_b;
+ fs = fi == -1 ? cpu_iasq_b : NULL;
+ bi = ctx->iaoq_n;
+ bv = ctx->iaoq_n_var;
switch (is_jmp) {
case DISAS_NORETURN:
break;
case DISAS_TOO_MANY:
- case DISAS_IAQ_N_STALE:
- case DISAS_IAQ_N_STALE_EXIT:
- install_iaq_entries(ctx, ctx->iaoq_f, cpu_iaoq_f,
- ctx->iaoq_b, cpu_iaoq_b);
- nullify_save(ctx);
+ /* The insn queue has not been advanced. */
+ bi = fi;
+ bv = fv;
+ fi = ctx->iaoq_f;
+ fv = NULL;
+ fs = NULL;
/* FALLTHRU */
- case DISAS_IAQ_N_UPDATED:
- if (is_jmp != DISAS_IAQ_N_STALE_EXIT) {
- tcg_gen_lookup_and_goto_ptr();
+ case DISAS_IAQ_N_STALE:
+ if (use_goto_tb(ctx, fi, bi)
+ && (ctx->null_cond.c == TCG_COND_NEVER
+ || ctx->null_cond.c == TCG_COND_ALWAYS)) {
+ nullify_set(ctx, ctx->null_cond.c == TCG_COND_ALWAYS);
+ gen_goto_tb(ctx, 0, fi, bi);
break;
}
/* FALLTHRU */
+ case DISAS_IAQ_N_STALE_EXIT:
+ install_iaq_entries(ctx, fi, fv, bi, bv);
+ if (fs) {
+ tcg_gen_mov_i64(cpu_iasq_f, fs);
+ }
+ nullify_save(ctx);
+ if (is_jmp == DISAS_IAQ_N_STALE_EXIT) {
+ tcg_gen_exit_tb(NULL, 0);
+ break;
+ }
+ /* FALLTHRU */
+ case DISAS_IAQ_N_UPDATED:
+ tcg_gen_lookup_and_goto_ptr();
+ break;
case DISAS_EXIT:
tcg_gen_exit_tb(NULL, 0);
break;
--
2.34.1
- [PATCH 19/45] target/hppa: Rename cond_make_* helpers, (continued)
- [PATCH 19/45] target/hppa: Rename cond_make_* helpers, Richard Henderson, 2024/04/24
- [PATCH 04/45] target/hppa: Pass displacement to do_dbranch, Richard Henderson, 2024/04/24
- [PATCH 14/45] target/hppa: Add space argument to do_ibranch, Richard Henderson, 2024/04/24
- [PATCH 12/45] target/hppa: Add IASQ entries to DisasContext, Richard Henderson, 2024/04/24
- [PATCH 22/45] target/hppa: Use TCG_COND_TST* in do_unit_zero_cond, Richard Henderson, 2024/04/24
- [PATCH 23/45] target/hppa: Use TCG_COND_TST* in do_unit_addsub, Richard Henderson, 2024/04/24
- [PATCH 29/45] target/hppa: Use delay_excp for conditional traps, Richard Henderson, 2024/04/24
- [PATCH 28/45] target/hppa: Introduce DisasDelayException, Richard Henderson, 2024/04/24
- [PATCH 07/45] target/hppa: Add install_iaq_entries, Richard Henderson, 2024/04/24
- [PATCH 17/45] target/hppa: Introduce and use DisasIAQE for branch management, Richard Henderson, 2024/04/24
- [PATCH 11/45] target/hppa: Simplify TB end,
Richard Henderson <=
- [PATCH 09/45] target/hppa: Delay computation of IAQ_Next, Richard Henderson, 2024/04/24
- [PATCH 25/45] target/hppa: Use registerfields.h for FPSR, Richard Henderson, 2024/04/24
- [PATCH 32/45] target/hppa: Store full iaoq_f and page bits of iaoq_d in TB, Richard Henderson, 2024/04/24
- [PATCH 31/45] linux-user/hppa: Force all code addresses to PRIV_USER, Richard Henderson, 2024/04/24
- [PATCH 26/45] target/hppa: Use TCG_COND_TST* in trans_ftest, Richard Henderson, 2024/04/24
- [PATCH 30/45] target/hppa: Use delay_excp for conditional trap on overflow, Richard Henderson, 2024/04/24
- [PATCH 34/45] target/hppa: Improve hppa_cpu_dump_state, Richard Henderson, 2024/04/24
- [PATCH 36/45] target/hppa: Manage PSW_X and PSW_B in translator, Richard Henderson, 2024/04/24
- [PATCH 21/45] target/hppa: Use TCG_COND_TST* in do_log_cond, Richard Henderson, 2024/04/24
- [PATCH 33/45] target/hppa: Do not mask in copy_iaoq_entry, Richard Henderson, 2024/04/24