[PATCH] RISC-V: More support of vx and vf for autovec comparison

Robin Dapp rdapp.gcc@gmail.com
Wed Jul 17 14:43:08 GMT 2024


Hi Demin,

> +  void add_integer_operand (rtx x)
> +  {
> +    create_integer_operand (&m_ops[m_opno++], INTVAL (x));
> +    gcc_assert (m_opno <= MAX_OPERANDS);
> +  }

Can that be folded into add_input_operand somehow?

>    void add_input_operand (rtx x, machine_mode mode)
>    {
>      create_input_operand (&m_ops[m_opno++], x, mode);
> @@ -284,12 +289,13 @@ public:
>      for (; num_ops; num_ops--, opno++)
>        {
>  	any_mem_p |= MEM_P (ops[opno]);
> -	machine_mode mode = insn_data[(int) icode].operand[m_opno].mode;
> +	machine_mode orig_mode = insn_data[(int) icode].operand[m_opno].mode;
> +	machine_mode mode = orig_mode;
>  	/* 'create_input_operand doesn't allow VOIDmode.
>  	   According to vector.md, we may have some patterns that do not have
>  	   explicit machine mode specifying the operand. Such operands are
>  	   always Pmode.  */
> -	if (mode == VOIDmode)
> +	if (orig_mode == VOIDmode)
>  	  mode = Pmode;

Maybe source_mode and dest_mode would be a bit clearer.

> -	add_input_operand (ops[opno], mode);
> +	if (CONST_INT_P (ops[opno]) && orig_mode != E_VOIDmode)
> +	  add_integer_operand (ops[opno]);
> +	else
> +	  add_input_operand (ops[opno], mode);

Indents look odd from here.  Could you double-check with clang-format?

> -	icode = code_for_pred_cmp (mode);
> +      icode = !scalar_p ? code_for_pred_cmp (mode)
> +	  icode = code_for_pred_cmp_scalar (mode);

Ditto.

> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index 19b9b2daa95..ad5668b2c5a 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -2140,7 +2140,7 @@ riscv_const_insns (rtx x)
>  		   register vec_duplicate into vmv.v.x.  */
>  		scalar_mode smode = GET_MODE_INNER (GET_MODE (x));
>  		if (maybe_gt (GET_MODE_SIZE (smode), UNITS_PER_WORD)
> -		    && !immediate_operand (elt, Pmode))
> +		    && !FLOAT_MODE_P (smode) && !immediate_operand (elt, Pmode))

FLOAT_MODE is a bit broad here.  Maybe rather add a case before all others that
always allows zero constants for any mode (as well as a comment)?

> -    if (maybe_gt (GET_MODE_SIZE (<VEL>mode), GET_MODE_SIZE (Pmode)))
> +    bool gt_p = maybe_gt (GET_MODE_SIZE (<VEL>mode), GET_MODE_SIZE (Pmode));
> +    if (!FLOAT_MODE_P (<VEL>mode) && gt_p)
>        {
>          riscv_vector::emit_vlmax_insn (code_for_pred_broadcast (<MODE>mode),
>  				       riscv_vector::UNARY_OP, operands);

Same here basically.  Isn't it just the zero constant?

> diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c b/gcc/testsuite/gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c
> index db8c653b179..b9a040f2f78 100644

I suppose the -rv64 tests also need adjustment?

Regards
 Robin


More information about the Gcc-patches mailing list