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

> Having dupi pass though movi is confusing and arguably wrong.
>
> Signed-off-by: Richard Henderson <richard.hender...@linaro.org>

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

> ---
>  tcg/aarch64/tcg-target.inc.c |  7 ----
>  tcg/i386/tcg-target.inc.c    | 63 ++++++++++++++++++++++++------------
>  tcg/ppc/tcg-target.inc.c     |  6 ----
>  tcg/tcg.c                    |  8 ++++-
>  4 files changed, 49 insertions(+), 35 deletions(-)
>
> diff --git a/tcg/aarch64/tcg-target.inc.c b/tcg/aarch64/tcg-target.inc.c
> index 7918aeb9d5..e5c9ab70a9 100644
> --- a/tcg/aarch64/tcg-target.inc.c
> +++ b/tcg/aarch64/tcg-target.inc.c
> @@ -1009,13 +1009,6 @@ static void tcg_out_movi(TCGContext *s, TCGType type, 
> TCGReg rd,
>      case TCG_TYPE_I64:
>          tcg_debug_assert(rd < 32);
>          break;
> -
> -    case TCG_TYPE_V64:
> -    case TCG_TYPE_V128:
> -        tcg_debug_assert(rd >= 32);
> -        tcg_out_dupi_vec(s, type, rd, value);
> -        return;
> -
>      default:
>          g_assert_not_reached();
>      }
> diff --git a/tcg/i386/tcg-target.inc.c b/tcg/i386/tcg-target.inc.c
> index 320a4bddd1..07424f7ef9 100644
> --- a/tcg/i386/tcg-target.inc.c
> +++ b/tcg/i386/tcg-target.inc.c
> @@ -977,30 +977,32 @@ static void tcg_out_dupi_vec(TCGContext *s, TCGType 
> type,
>      }
>  }
>  
> -static void tcg_out_movi(TCGContext *s, TCGType type,
> -                         TCGReg ret, tcg_target_long arg)
> +static void tcg_out_movi_vec(TCGContext *s, TCGType type,
> +                             TCGReg ret, tcg_target_long arg)
> +{
> +    if (arg == 0) {
> +        tcg_out_vex_modrm(s, OPC_PXOR, ret, ret, ret);
> +        return;
> +    }
> +    if (arg == -1) {
> +        tcg_out_vex_modrm(s, OPC_PCMPEQB, ret, ret, ret);
> +        return;
> +    }
> +
> +    int rexw = (type == TCG_TYPE_I32 ? 0 : P_REXW);
> +    tcg_out_vex_modrm_pool(s, OPC_MOVD_VyEy + rexw, ret);
> +    if (TCG_TARGET_REG_BITS == 64) {
> +        new_pool_label(s, arg, R_386_PC32, s->code_ptr - 4, -4);
> +    } else {
> +        new_pool_label(s, arg, R_386_32, s->code_ptr - 4, 0);
> +    }
> +}
> +
> +static void tcg_out_movi_int(TCGContext *s, TCGType type,
> +                             TCGReg ret, tcg_target_long arg)
>  {
>      tcg_target_long diff;
>  
> -    switch (type) {
> -    case TCG_TYPE_I32:
> -#if TCG_TARGET_REG_BITS == 64
> -    case TCG_TYPE_I64:
> -#endif
> -        if (ret < 16) {
> -            break;
> -        }
> -        /* fallthru */
> -    case TCG_TYPE_V64:
> -    case TCG_TYPE_V128:
> -    case TCG_TYPE_V256:
> -        tcg_debug_assert(ret >= 16);
> -        tcg_out_dupi_vec(s, type, ret, arg);
> -        return;
> -    default:
> -        g_assert_not_reached();
> -    }
> -
>      if (arg == 0) {
>          tgen_arithr(s, ARITH_XOR, ret, ret);
>          return;
> @@ -1029,6 +1031,25 @@ static void tcg_out_movi(TCGContext *s, TCGType type,
>      tcg_out64(s, arg);
>  }
>  
> +static void tcg_out_movi(TCGContext *s, TCGType type,
> +                         TCGReg ret, tcg_target_long arg)
> +{
> +    switch (type) {
> +    case TCG_TYPE_I32:
> +#if TCG_TARGET_REG_BITS == 64
> +    case TCG_TYPE_I64:
> +#endif
> +        if (ret < 16) {
> +            tcg_out_movi_int(s, type, ret, arg);
> +        } else {
> +            tcg_out_movi_vec(s, type, ret, arg);
> +        }
> +        break;
> +    default:
> +        g_assert_not_reached();
> +    }
> +}
> +
>  static inline void tcg_out_pushi(TCGContext *s, tcg_target_long val)
>  {
>      if (val == (int8_t)val) {
> diff --git a/tcg/ppc/tcg-target.inc.c b/tcg/ppc/tcg-target.inc.c
> index fb390ad978..7ab1e32064 100644
> --- a/tcg/ppc/tcg-target.inc.c
> +++ b/tcg/ppc/tcg-target.inc.c
> @@ -987,12 +987,6 @@ static void tcg_out_movi(TCGContext *s, TCGType type, 
> TCGReg ret,
>          tcg_out_movi_int(s, type, ret, arg, false);
>          break;
>  
> -    case TCG_TYPE_V64:
> -    case TCG_TYPE_V128:
> -        tcg_debug_assert(ret >= TCG_REG_V0);
> -        tcg_out_dupi_vec(s, type, ret, arg);
> -        break;
> -
>      default:
>          g_assert_not_reached();
>      }
> diff --git a/tcg/tcg.c b/tcg/tcg.c
> index adb71f16ae..4f1ed1d2fe 100644
> --- a/tcg/tcg.c
> +++ b/tcg/tcg.c
> @@ -3359,7 +3359,13 @@ static void temp_load(TCGContext *s, TCGTemp *ts, 
> TCGRegSet desired_regs,
>      case TEMP_VAL_CONST:
>          reg = tcg_reg_alloc(s, desired_regs, allocated_regs,
>                              preferred_regs, ts->indirect_base);
> -        tcg_out_movi(s, ts->type, reg, ts->val);
> +        if (ts->type <= TCG_TYPE_I64) {
> +            tcg_out_movi(s, ts->type, reg, ts->val);
> +        } else if (TCG_TARGET_REG_BITS == 64) {
> +            tcg_out_dupi_vec(s, ts->type, reg, ts->val);
> +        } else {
> +            tcg_out_dupi_vec(s, ts->type, reg, dup_const(MO_32, ts->val));
> +        }
>          ts->mem_coherent = 0;
>          break;
>      case TEMP_VAL_MEM:


-- 
Alex Bennée

Reply via email to