qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v2 11/27] tcg-ppc64: Tidy or and xor patterns.


From: Aurelien Jarno
Subject: Re: [Qemu-devel] [PATCH v2 11/27] tcg-ppc64: Tidy or and xor patterns.
Date: Mon, 1 Apr 2013 16:55:18 +0200
User-agent: Mutt/1.5.20 (2009-06-14)

On Mon, Mar 04, 2013 at 04:32:54PM -0800, Richard Henderson wrote:
> Handle constants in common code; we'll want to reuse that later.
> 
> Signed-off-by: Richard Henderson <address@hidden>
> ---
>  tcg/ppc64/tcg-target.c | 55 
> ++++++++++++++++++++++++++++----------------------
>  1 file changed, 31 insertions(+), 24 deletions(-)
> 
> diff --git a/tcg/ppc64/tcg-target.c b/tcg/ppc64/tcg-target.c
> index d12fd61..9718ef6 100644
> --- a/tcg/ppc64/tcg-target.c
> +++ b/tcg/ppc64/tcg-target.c
> @@ -527,6 +527,29 @@ static void tcg_out_movi(TCGContext *s, TCGType type, 
> TCGReg ret,
>      }
>  }
>  
> +static void tcg_out_zori32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c,
> +                           int op_lo, int op_hi)
> +{
> +    if (c >> 16) {
> +        tcg_out32(s, op_hi | SAI(src, dst, c >> 16));
> +        src = dst;
> +    }
> +    if (c & 0xffff) {
> +        tcg_out32(s, op_lo | SAI(src, dst, c));
> +        src = dst;
> +    }
> +}
> +
> +static void tcg_out_ori32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c)
> +{
> +    tcg_out_zori32(s, dst, src, c, ORI, ORIS);
> +}
> +
> +static void tcg_out_xori32(TCGContext *s, TCGReg dst, TCGReg src, uint32_t c)
> +{
> +    tcg_out_zori32(s, dst, src, c, XORI, XORIS);
> +}
> +
>  static void tcg_out_b (TCGContext *s, int mask, tcg_target_long target)
>  {
>      tcg_target_long disp;
> @@ -1343,37 +1366,21 @@ static void tcg_out_op (TCGContext *s, TCGOpcode opc, 
> const TCGArg *args,
>          break;
>      case INDEX_op_or_i64:
>      case INDEX_op_or_i32:
> +        a0 = args[0], a1 = args[1], a2 = args[2];
>          if (const_args[2]) {
> -            if (args[2] & 0xffff) {
> -                tcg_out32(s, ORI | SAI(args[1], args[0], args[2]));
> -                if (args[2] >> 16) {
> -                    tcg_out32(s, ORIS | SAI(args[0], args[0], args[2] >> 
> 16));
> -                }
> -            }
> -            else {
> -                tcg_out32(s, ORIS | SAI(args[1], args[0], args[2] >> 16));
> -            }
> +            tcg_out_ori32(s, a0, a1, a2);
> +        } else {
> +            tcg_out32(s, OR | SAB(a1, a0, a2));
>          }
> -        else
> -            tcg_out32 (s, OR | SAB (args[1], args[0], args[2]));
>          break;
>      case INDEX_op_xor_i64:
>      case INDEX_op_xor_i32:
> +        a0 = args[0], a1 = args[1], a2 = args[2];
>          if (const_args[2]) {
> -            if ((args[2] & 0xffff) == args[2]) {
> -                tcg_out32(s, XORI | SAI(args[1], args[0], args[2]));
> -            } else if ((args[2] & 0xffff0000) == args[2]) {
> -                tcg_out32(s, XORIS | SAI(args[1], args[0], args[2] >> 16));
> -            } else {
> -                tcg_out_movi (s, (opc == INDEX_op_and_i32
> -                                  ? TCG_TYPE_I32
> -                                  : TCG_TYPE_I64),
> -                              0, args[2]);
> -                tcg_out32 (s, XOR | SAB (args[1], args[0], 0));
> -            }
> +            tcg_out_xori32(s, a0, a1, a2);
> +        } else {
> +            tcg_out32(s, XOR | SAB(a1, a0, a2));
>          }
> -        else
> -            tcg_out32 (s, XOR | SAB (args[1], args[0], args[2]));
>          break;
>  
>      case INDEX_op_mul_i32:

Reviewed-by: Aurelien Jarno <address@hidden>

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



reply via email to

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