[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