qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 04/20] tcg-ia64: Simplify brcond


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH 04/20] tcg-ia64: Simplify brcond
Date: Sun, 3 Nov 2013 23:56:15 +0100
User-agent: Mutt/1.5.21 (2010-09-15)

On Thu, Oct 31, 2013 at 01:21:53PM -0700, Richard Henderson wrote:
> There was a misconception that a stop bit is required between a compare
> and the branch that uses the predicate set by the compare.  This lead to

This seems to be true.

> the usage of an extra bundle in which to perform the compare.  The extra
> bundle left room for constants to be loaded for use with the compare insn.
> 
> If we pack the compare and the branch together in the same bundle, then
> there's no longer any room for non-zero constants.  At which point we
> can eliminate half the function by not handling them.

That said the implementation is likely wrong as with this patch applied,
qemu-system-x86_64 is not even able to execute seabios to the first
printed message. Please do at least basic testing.

> Signed-off-by: Richard Henderson <address@hidden>
> ---
>  tcg/ia64/tcg-target.c | 42 +++++++++---------------------------------
>  1 file changed, 9 insertions(+), 33 deletions(-)
> 
> diff --git a/tcg/ia64/tcg-target.c b/tcg/ia64/tcg-target.c
> index b19e298..2fdc38a5 100644
> --- a/tcg/ia64/tcg-target.c
> +++ b/tcg/ia64/tcg-target.c
> @@ -1444,38 +1444,16 @@ static inline uint64_t tcg_opc_cmp_a(int qp, TCGCond 
> cond, TCGArg arg1,
>      }
>  }
>  
> -static inline void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGArg arg1,
> -                                  int const_arg1, TCGArg arg2, int 
> const_arg2,
> -                                  int label_index, int cmp4)
> +static inline void tcg_out_brcond(TCGContext *s, TCGCond cond, TCGReg arg1,
> +                                  TCGReg arg2, int label_index, int cmp4)
>  {
>      TCGLabel *l = &s->labels[label_index];
> -    uint64_t opc1, opc2;
>  
> -    if (const_arg1 && arg1 != 0) {
> -        opc1 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R2,
> -                          arg1, TCG_REG_R0);
> -        arg1 = TCG_REG_R2;
> -    } else {
> -        opc1 = INSN_NOP_M;
> -    }
> -
> -    if (const_arg2 && arg2 != 0) {
> -        opc2 = tcg_opc_a5(TCG_REG_P0, OPC_ADDL_A5, TCG_REG_R3,
> -                          arg2, TCG_REG_R0);
> -        arg2 = TCG_REG_R3;
> -    } else {
> -        opc2 = INSN_NOP_I;
> -    }
> -
> -    tcg_out_bundle(s, mII,
> -                   opc1,
> -                   opc2,
> -                   tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4));
> -    tcg_out_bundle(s, mmB,
> -                   INSN_NOP_M,
> +    tcg_out_bundle(s, miB,
>                     INSN_NOP_M,
> -                   tcg_opc_b1 (TCG_REG_P6, OPC_BR_DPTK_FEW_B1,
> -                               get_reloc_pcrel21b(s->code_ptr + 2)));
> +                   tcg_opc_cmp_a(TCG_REG_P0, cond, arg1, arg2, cmp4),
> +                   tcg_opc_b1(TCG_REG_P6, OPC_BR_DPTK_FEW_B1,
> +                              get_reloc_pcrel21b(s->code_ptr + 2)));
>  
>      if (l->has_value) {
>          reloc_pcrel21b((s->code_ptr - 16) + 2, l->u.value);
> @@ -2224,12 +2202,10 @@ static inline void tcg_out_op(TCGContext *s, 
> TCGOpcode opc,
>          break;
>  
>      case INDEX_op_brcond_i32:
> -        tcg_out_brcond(s, args[2], args[0], const_args[0],
> -                       args[1], const_args[1], args[3], 1);
> +        tcg_out_brcond(s, args[2], args[0], args[1], args[3], 1);
>          break;
>      case INDEX_op_brcond_i64:
> -        tcg_out_brcond(s, args[2], args[0], const_args[0],
> -                       args[1], const_args[1], args[3], 0);
> +        tcg_out_brcond(s, args[2], args[0], args[1], args[3], 0);
>          break;
>      case INDEX_op_setcond_i32:
>          tcg_out_setcond(s, args[3], args[0], args[1], args[2], 1);
> @@ -2333,7 +2309,7 @@ static const TCGTargetOpDef ia64_op_defs[] = {
>      { INDEX_op_bswap16_i32, { "r", "rZ" } },
>      { INDEX_op_bswap32_i32, { "r", "rZ" } },
>  
> -    { INDEX_op_brcond_i32, { "rI", "rI" } },
> +    { INDEX_op_brcond_i32, { "rZ", "rZ" } },
>      { INDEX_op_setcond_i32, { "r", "rZ", "rZ" } },
>      { INDEX_op_movcond_i32, { "r", "rZ", "rZ", "rI", "rI" } },
>  
> -- 
> 1.8.3.1
> 
> 

-- 
Aurelien Jarno                          GPG: 1024D/F1BCDB73
address@hidden                 http://www.aurel32.net



reply via email to

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