[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 1/5] tcg: Refactor helper_lookup_tb_ptr
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/5] tcg: Refactor helper_lookup_tb_ptr |
Date: |
Thu, 15 Jun 2017 09:35:39 +0100 |
User-agent: |
mu4e 0.9.19; emacs 25.2.50.3 |
Richard Henderson <address@hidden> writes:
> We can call tb_htable_lookup even when the tb_jmp_cache
> is completely empty. Therefore, un-nest most of the code
> dependent on tb != NULL from the read from the cache.
>
> Signed-off-by: Richard Henderson <address@hidden>
Reviewed-by: Alex Bennée <address@hidden>
> ---
> tcg-runtime.c | 34 ++++++++++++++++++----------------
> 1 file changed, 18 insertions(+), 16 deletions(-)
>
> diff --git a/tcg-runtime.c b/tcg-runtime.c
> index 7fa90ce..a35c725 100644
> --- a/tcg-runtime.c
> +++ b/tcg-runtime.c
> @@ -147,30 +147,32 @@ uint64_t HELPER(ctpop_i64)(uint64_t arg)
> void *HELPER(lookup_tb_ptr)(CPUArchState *env, target_ulong addr)
> {
> CPUState *cpu = ENV_GET_CPU(env);
> + void *ret = tcg_ctx.code_gen_epilogue;
> TranslationBlock *tb;
> target_ulong cs_base, pc;
> - uint32_t flags;
> -
> - tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)]);
> - if (likely(tb)) {
> - cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
> - if (likely(tb->pc == addr && tb->cs_base == cs_base &&
> - tb->flags == flags)) {
> - goto found;
> - }
> + uint32_t flags, addr_hash;
> +
> + addr_hash = tb_jmp_cache_hash_func(addr);
> + tb = atomic_rcu_read(&cpu->tb_jmp_cache[addr_hash]);
> + cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
> +
> + if (unlikely(!(tb
> + && tb->pc == addr
> + && tb->cs_base == cs_base
> + && tb->flags == flags))) {
> tb = tb_htable_lookup(cpu, addr, cs_base, flags);
> - if (likely(tb)) {
> - atomic_set(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)], tb);
> - goto found;
> + if (!tb) {
> + return ret;
> }
> + atomic_set(&cpu->tb_jmp_cache[addr_hash], tb);
> }
> - return tcg_ctx.code_gen_epilogue;
> - found:
> +
> + ret = tb->tc_ptr;
> qemu_log_mask_and_addr(CPU_LOG_EXEC, addr,
> "Chain %p [%d: " TARGET_FMT_lx "] %s\n",
> - tb->tc_ptr, cpu->cpu_index, addr,
> + ret, cpu->cpu_index, addr,
> lookup_symbol(addr));
> - return tb->tc_ptr;
> + return ret;
> }
>
> void HELPER(exit_atomic)(CPUArchState *env)
--
Alex Bennée
[Qemu-devel] [PATCH v2 4/5] target/s390x: Exit after changing PSW mask, Richard Henderson, 2017/06/14