qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 09/26] tcg-aarch64: Create tcg_out_brcond


From: Claudio Fontana
Subject: Re: [Qemu-devel] [PATCH 09/26] tcg-aarch64: Create tcg_out_brcond
Date: Mon, 24 Mar 2014 16:31:37 +0100
User-agent: Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Thunderbird/24.0.1

On 15.03.2014 03:48, Richard Henderson wrote:
> Rearrange code to put the compare and branch in the same place.
> 
> Signed-off-by: Richard Henderson <address@hidden>
> ---
>  tcg/aarch64/tcg-target.c | 34 ++++++++++++++--------------------
>  1 file changed, 14 insertions(+), 20 deletions(-)
> 
> diff --git a/tcg/aarch64/tcg-target.c b/tcg/aarch64/tcg-target.c
> index 6d8b666..44d53aa 100644
> --- a/tcg/aarch64/tcg-target.c
> +++ b/tcg/aarch64/tcg-target.c
> @@ -862,18 +862,6 @@ static inline void tcg_out_goto_cond_noaddr(TCGContext 
> *s, TCGCond c)
>      tcg_out_insn(s, 3202, B_C, c, old);
>  }
>  
> -static inline void tcg_out_goto_cond(TCGContext *s, TCGCond c, intptr_t 
> target)
> -{
> -    intptr_t offset = (target - (intptr_t)s->code_ptr) / 4;
> -
> -    if (offset < -0x40000 || offset >= 0x40000) {
> -        /* out of 19bit range */
> -        tcg_abort();
> -    }
> -
> -    tcg_out_insn(s, 3202, B_C, c, offset);
> -}
> -
>  static inline void tcg_out_callr(TCGContext *s, TCGReg reg)
>  {
>      tcg_out_insn(s, 3207, BLR, reg);
> @@ -917,17 +905,24 @@ static inline void tcg_out_goto_label(TCGContext *s, 
> int label_index)
>      }
>  }
>  
> -static inline void tcg_out_goto_label_cond(TCGContext *s,
> -                                           TCGCond c, int label_index)
> +static void tcg_out_brcond(TCGContext *s, TCGMemOp ext, TCGCond c, TCGArg a,
> +                           TCGArg b, bool b_const, int label)
>  {
> -    TCGLabel *l = &s->labels[label_index];
> +    TCGLabel *l = &s->labels[label];
> +    intptr_t offset;
> +
> +    tcg_out_cmp(s, ext, a, b, b_const);
>  
>      if (!l->has_value) {
> -        tcg_out_reloc(s, s->code_ptr, R_AARCH64_CONDBR19, label_index, 0);
> -        tcg_out_goto_cond_noaddr(s, c);
> +        tcg_out_reloc(s, s->code_ptr, R_AARCH64_CONDBR19, label, 0);
> +        offset = tcg_in32(s) >> 5;
>      } else {
> -        tcg_out_goto_cond(s, c, l->u.value);
> +        offset = l->u.value - (uintptr_t)s->code_ptr;
> +        offset >>= 2;
> +        assert(offset >= -0x40000 && offset < 0x40000);
>      }
> +
> +    tcg_out_insn(s, 3202, B_C, c, offset);
>  }
>  
>  static inline void tcg_out_rev(TCGContext *s, TCGType ext,
> @@ -1568,8 +1563,7 @@ static void tcg_out_op(TCGContext *s, TCGOpcode opc,
>          a1 = (int32_t)a1;
>          /* FALLTHRU */
>      case INDEX_op_brcond_i64:
> -        tcg_out_cmp(s, ext, a0, a1, const_args[1]);
> -        tcg_out_goto_label_cond(s, a2, args[3]);
> +        tcg_out_brcond(s, ext, a2, a0, a1, const_args[1], args[3]);
>          break;
>  
>      case INDEX_op_setcond_i32:
> 

Reviewed-by: Claudio Fontana <address@hidden>




reply via email to

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