[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 20/25] target/alpha: Use tcg_gen_lookup_and_goto_
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH v6 20/25] target/alpha: Use tcg_gen_lookup_and_goto_ptr |
Date: |
Tue, 2 May 2017 12:22:55 -0700 |
Signed-off-by: Richard Henderson <address@hidden>
---
target/alpha/translate.c | 54 +++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 47 insertions(+), 7 deletions(-)
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
index df5d695..c2941ae 100644
--- a/target/alpha/translate.c
+++ b/target/alpha/translate.c
@@ -89,6 +89,9 @@ typedef enum {
updated the PC for the next instruction to be executed. */
EXIT_PC_STALE,
+ /* We are exiting the TB due to page crossing or space constraints. */
+ EXIT_FALLTHRU,
+
/* We are ending the TB with a noreturn function call, e.g. longjmp.
No following code will be executed. */
EXIT_NORETURN,
@@ -455,11 +458,17 @@ static bool in_superpage(DisasContext *ctx, int64_t addr)
#endif
}
+static bool use_exit_tb(DisasContext *ctx)
+{
+ return ((ctx->tb->cflags & CF_LAST_IO)
+ || ctx->singlestep_enabled
+ || singlestep);
+}
+
static bool use_goto_tb(DisasContext *ctx, uint64_t dest)
{
/* Suppress goto_tb in the case of single-steping and IO. */
- if ((ctx->tb->cflags & CF_LAST_IO)
- || ctx->singlestep_enabled || singlestep) {
+ if (unlikely(use_exit_tb(ctx))) {
return false;
}
#ifndef CONFIG_USER_ONLY
@@ -492,7 +501,12 @@ static ExitStatus gen_bdirect(DisasContext *ctx, int ra,
int32_t disp)
return EXIT_GOTO_TB;
} else {
tcg_gen_movi_i64(cpu_pc, dest);
- return EXIT_PC_UPDATED;
+ if (use_exit_tb(ctx)) {
+ return EXIT_PC_UPDATED;
+ } else {
+ tcg_gen_lookup_and_goto_ptr(cpu_pc);
+ return EXIT_GOTO_TB;
+ }
}
}
@@ -2421,7 +2435,12 @@ static ExitStatus translate_one(DisasContext *ctx,
uint32_t insn)
if (ra != 31) {
tcg_gen_movi_i64(ctx->ir[ra], ctx->pc);
}
- ret = EXIT_PC_UPDATED;
+ if (use_exit_tb(ctx)) {
+ ret = EXIT_PC_UPDATED;
+ } else {
+ tcg_gen_lookup_and_goto_ptr(cpu_pc);
+ ret = EXIT_GOTO_TB;
+ }
break;
case 0x1B:
@@ -2677,7 +2696,12 @@ static ExitStatus translate_one(DisasContext *ctx,
uint32_t insn)
tcg_gen_andi_i64(tmp, vb, 1);
tcg_gen_st8_i64(tmp, cpu_env, offsetof(CPUAlphaState, pal_mode));
tcg_gen_andi_i64(cpu_pc, vb, ~3);
- ret = EXIT_PC_UPDATED;
+ if (use_exit_tb(ctx)) {
+ ret = EXIT_PC_UPDATED;
+ } else {
+ tcg_gen_lookup_and_goto_ptr(cpu_pc);
+ ret = EXIT_GOTO_TB;
+ }
break;
#else
goto invalid_opc;
@@ -2978,7 +3002,7 @@ void gen_intermediate_code(CPUAlphaState *env, struct
TranslationBlock *tb)
|| num_insns >= max_insns
|| singlestep
|| ctx.singlestep_enabled)) {
- ret = EXIT_PC_STALE;
+ ret = EXIT_FALLTHRU;
}
} while (ret == NO_EXIT);
@@ -3000,8 +3024,24 @@ void gen_intermediate_code(CPUAlphaState *env, struct
TranslationBlock *tb)
tcg_gen_exit_tb(0);
}
break;
+ case EXIT_FALLTHRU:
+ if (ctx.singlestep_enabled) {
+ tcg_gen_movi_i64(cpu_pc, ctx.pc);
+ gen_excp_1(EXCP_DEBUG, 0);
+ } else if (use_exit_tb(&ctx)) {
+ tcg_gen_movi_i64(cpu_pc, ctx.pc);
+ tcg_gen_exit_tb(0);
+ } else if (use_goto_tb(&ctx, ctx.pc)) {
+ tcg_gen_goto_tb(0);
+ tcg_gen_movi_i64(cpu_pc, ctx.pc);
+ tcg_gen_exit_tb((uintptr_t)ctx.tb);
+ } else {
+ tcg_gen_movi_i64(cpu_pc, ctx.pc);
+ tcg_gen_lookup_and_goto_ptr(cpu_pc);
+ }
+ break;
default:
- abort();
+ g_assert_not_reached();
}
gen_tb_end(tb, num_insns);
--
2.9.3
- [Qemu-devel] [PATCH v6 12/25] tcg/ppc: Implement goto_ptr, (continued)
- [Qemu-devel] [PATCH v6 12/25] tcg/ppc: Implement goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 15/25] tcg/s390: Implement goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 13/25] tcg/aarch64: Implement goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 11/25] tb-hash: improve tb_jmp_cache hash function in user mode, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 17/25] tcg/arm: Implement goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 14/25] tcg/sparc: Implement goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 16/25] tcg/arm: Clarify tcg_out_bx for arm4 host, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 19/25] target/hppa: Use tcg_gen_lookup_and_goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 20/25] target/alpha: Use tcg_gen_lookup_and_goto_ptr,
Richard Henderson <=
- [Qemu-devel] [PATCH v6 18/25] target/s390: Use tcg_gen_lookup_and_goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 21/25] target/aarch64: optimize cross-page direct jumps in softmmu, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 22/25] target/aarch64: optimize indirect branches, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 23/25] tcg/mips: implement goto_ptr, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 24/25] target/mips: optimize cross-page direct jumps in softmmu, Richard Henderson, 2017/05/02
- [Qemu-devel] [PATCH v6 25/25] target/mips: optimize indirect branches, Richard Henderson, 2017/05/02
- Re: [Qemu-devel] [PATCH v6 00/25] tcg cross-tb optimizations, no-reply, 2017/05/02
- Re: [Qemu-devel] [PATCH v6 00/25] tcg cross-tb optimizations, Richard Henderson, 2017/05/02