Richard Henderson <richard.hender...@linaro.org> writes:

> The i386 backend already has these functions, and the aarch64
> backend could easily split out one.  Nothing is done with these
> functions yet, but this will aid register allocation of
> INDEX_op_dup_vec in a later patch.

  "Also use correct type for tcg_out_dupi_vec"?

Anyway:

Reviewed-by: Alex Bennée <alex.ben...@linaro.org>


>
> Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
> ---
>  tcg/aarch64/tcg-target.inc.c | 12 ++++++++++--
>  tcg/i386/tcg-target.inc.c    |  3 ++-
>  tcg/tcg.c                    | 14 ++++++++++++++
>  3 files changed, 26 insertions(+), 3 deletions(-)
>
> diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
> index ee89734318..e443b5df23 100644
> --- a/tcg/aarch64/tcg-target.inc.c
> +++ b/tcg/aarch64/tcg-target.inc.c
> @@ -799,7 +799,7 @@ static void tcg_out_logicali(TCGContext *s, AArch64Insn 
> insn, TCGType ext,
>  }
>
>  static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
> -                             TCGReg rd, uint64_t v64)
> +                             TCGReg rd, tcg_target_long v64)
>  {
>      int op, cmode, imm8;
>
> @@ -814,6 +814,14 @@ static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
>      }
>  }
>
> +static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
> +                            TCGReg rd, TCGReg rs)
> +{
> +    int is_q = type - TCG_TYPE_V64;
> +    tcg_out_insn(s, 3605, DUP, is_q, rd, rs, 1 << vece, 0);
> +    return true;
> +}
> +
>  static void tcg_out_movi(TCGContext *s, TCGType type, TCGReg rd,
>                           tcg_target_long value)
>  {
> @@ -2201,7 +2209,7 @@ static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc,
>          tcg_out_insn(s, 3617, NOT, is_q, 0, a0, a1);
>          break;
>      case INDEX_op_dup_vec:
> -        tcg_out_insn(s, 3605, DUP, is_q, a0, a1, 1 << vece, 0);
> +        tcg_out_dup_vec(s, type, vece, a0, a1);
>          break;
>      case INDEX_op_shli_vec:
>          tcg_out_insn(s, 3614, SHL, is_q, a0, a1, a2 + (8 << vece));
> diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c
> index 1198c76392..0d621670c7 100644
> --- a/tcg/i386/tcg-target.inc.c
> +++ b/tcg/i386/tcg-target.inc.c
> @@ -855,7 +855,7 @@ static bool tcg_out_mov(TCGContext *s, TCGType type, 
> TCGReg ret, TCGReg arg)
>      return true;
>  }
>
> -static void tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
> +static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
>                              TCGReg r, TCGReg a)
>  {
>      if (have_avx2) {
> @@ -888,6 +888,7 @@ static void tcg_out_dup_vec(TCGContext *s, TCGType type, 
> unsigned vece,
>              g_assert_not_reached();
>          }
>      }
> +    return true;
>  }
>
>  static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index 68d86361e2..3ef4d3478d 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -109,10 +109,24 @@ static void tcg_out_movi(TCGContext *s, TCGType type,
>  static void tcg_out_op(TCGContext *s, TCGOpcode opc, const TCGArg *args,
>                         const int *const_args);
>  #if TCG_TARGET_MAYBE_vec
> +static bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned vece,
> +                            TCGReg dst, TCGReg src);
> +static void tcg_out_dupi_vec(TCGContext *s, TCGType type,
> +                             TCGReg dst, tcg_target_long arg);
>  static void tcg_out_vec_op(TCGContext *s, TCGOpcode opc, unsigned vecl,
>                             unsigned vece, const TCGArg *args,
>                             const int *const_args);
>  #else
> +static inline bool tcg_out_dup_vec(TCGContext *s, TCGType type, unsigned 
> vece,
> +                                   TCGReg dst, TCGReg src)
> +{
> +    g_assert_not_reached();
> +}
> +static inline void tcg_out_dupi_vec(TCGContext *s, TCGType type,
> +                                    TCGReg dst, tcg_target_long arg)
> +{
> +    g_assert_not_reached();
> +}
>  static inline void tcg_out_vec_op(TCGContext *s, TCGOpcode opc, unsigned 
> vecl,
>                                    unsigned vece, const TCGArg *args,
>                                    const int *const_args)


--
Alex Bennée

Reply via email to