qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 2/5] target/alpha: Use tcg_gen_lookup_and_got


From: Alex Bennée
Subject: Re: [Qemu-devel] [PATCH v2 2/5] target/alpha: Use tcg_gen_lookup_and_goto_ptr
Date: Thu, 15 Jun 2017 09:48:43 +0100
User-agent: mu4e 0.9.19; emacs 25.2.50.3

Richard Henderson <address@hidden> writes:

> Signed-off-by: Richard Henderson <address@hidden>
> ---
>  target/alpha/translate.c | 27 ++++++++++++++++++++++-----
>  1 file changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/target/alpha/translate.c b/target/alpha/translate.c
> index 7c45ae3..a48e451 100644
> --- a/target/alpha/translate.c
> +++ b/target/alpha/translate.c
> @@ -84,6 +84,7 @@ typedef enum {
>         the PC (for whatever reason), so there's no need to do it again on
>         exiting the TB.  */
>      EXIT_PC_UPDATED,
> +    EXIT_PC_UPDATED_NOCHAIN,
>
>      /* We are exiting the TB, but have neither emitted a goto_tb, nor
>         updated the PC for the next instruction to be executed.  */
> @@ -458,11 +459,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);
> +}

minor nit: why start testing this global? At the least we should
probably seed ctx->singlestep_enabled when we set up for translation.

> +
>  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
> @@ -1198,7 +1205,10 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int 
> palcode)
>              tcg_gen_andi_i64(tmp, ctx->ir[IR_A0], PS_INT_MASK);
>              tcg_gen_st8_i64(tmp, cpu_env, offsetof(CPUAlphaState, ps));
>              tcg_temp_free(tmp);
> -            break;
> +
> +            /* Allow interrupts to be recognized right away.  */
> +            tcg_gen_movi_i64(cpu_pc, ctx.pc);
> +            return EXIT_PC_UPDATED_NOCHAIN;
>
>          case 0x36:
>              /* RDPS */
> @@ -1266,7 +1276,7 @@ static ExitStatus gen_call_pal(DisasContext *ctx, int 
> palcode)
>             need the page permissions check.  We'll see the existence of
>             the page when we create the TB, and we'll flush all TBs if
>             we change the PAL base register.  */
> -        if (!ctx->singlestep_enabled && !(ctx->tb->cflags & CF_LAST_IO)) {
> +        if (!use_exit_tb(ctx)) {
>              tcg_gen_goto_tb(0);
>              tcg_gen_movi_i64(cpu_pc, entry);
>              tcg_gen_exit_tb((uintptr_t)ctx->tb);
> @@ -2686,7 +2696,8 @@ 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;
> +        /* Allow interrupts to be recognized right away.  */
> +        ret = EXIT_PC_UPDATED_NOCHAIN;
>          break;
>  #else
>          goto invalid_opc;
> @@ -3010,6 +3021,12 @@ void gen_intermediate_code(CPUAlphaState *env, struct 
> TranslationBlock *tb)
>          tcg_gen_movi_i64(cpu_pc, ctx.pc);
>          /* FALLTHRU */
>      case EXIT_PC_UPDATED:
> +        if (!use_exit_tb(&ctx)) {
> +            tcg_gen_lookup_and_goto_ptr(cpu_pc);
> +            break;
> +        }
> +        /* FALLTHRU */
> +    case EXIT_PC_UPDATED_NOCHAIN:
>          if (ctx.singlestep_enabled) {
>              gen_excp_1(EXCP_DEBUG, 0);
>          } else {

Aside from what Emilio already pointed at:

Reviewed-by: Alex Bennée <address@hidden>

--
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]