Thansk, that's really awesome!

One comment about mode iterator is the naming seems like still
prefixed with VNX which inconsistent with new mode naming scheme.

> diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md
> index cd5b19457f8..03e19259505 100644
> --- a/gcc/config/riscv/autovec.md
> +++ b/gcc/config/riscv/autovec.md
> @@ -121,45 +121,30 @@
>    DONE;
>  })
>
> -(define_expand "len_mask_gather_load<VNX16_QHSD:mode><VNX16_QHSDI:mode>"
> -  [(match_operand:VNX16_QHSD 0 "register_operand")
> +(define_expand "len_mask_gather_load<VNX16_QHS:mode><VNX16_QHSI:mode>"

Why DI is gone? and I saw many other pattern has similar issue?

> +  [(match_operand:VNX16_QHS 0 "register_operand")
>     (match_operand 1 "pmode_reg_or_0_operand")
> -   (match_operand:VNX16_QHSDI 2 "register_operand")
> -   (match_operand 3 "<VNX16_QHSD:gs_extension>")
> -   (match_operand 4 "<VNX16_QHSD:gs_scale>")
> +   (match_operand:VNX16_QHSI 2 "register_operand")
> +   (match_operand 3 "<VNX16_QHS:gs_extension>")
> +   (match_operand 4 "<VNX16_QHS:gs_scale>")
>     (match_operand 5 "autovec_length_operand")
>     (match_operand 6 "const_0_operand")
> -   (match_operand:<VNX16_QHSD:VM> 7 "vector_mask_operand")]
> +   (match_operand:<VNX16_QHS:VM> 7 "vector_mask_operand")]
>    "TARGET_VECTOR"
>  {
>    riscv_vector::expand_gather_scatter (operands, true);
>    DONE;
>  })
>
> -(define_expand "len_mask_gather_load<VNX32_QHS:mode><VNX32_QHSI:mode>"
> -  [(match_operand:VNX32_QHS 0 "register_operand")
> +(define_expand "len_mask_gather_load<VNX32_QH:mode><VNX32_QHI:mode>"

Like this, SI is gone?

> @@ -2172,7 +2145,7 @@ preferred_simd_mode (scalar_mode mode)
>       riscv_autovec_lmul < RVV_M2. Since GCC loop vectorizer report ICE when 
> we
>       enable -march=rv64gc_zve32* and -march=rv32gc_zve64*. in the
>       'can_duplicate_and_interleave_p' of tree-vect-slp.cc. Since we have
> -     VNx1SImode in -march=*zve32* and VNx1DImode in -march=*zve64*, they are
> +     RVVM1SImode in -march=*zve32* and RVVM1DImode in -march=*zve64*, they 
> are

This comment might need to review.

>       enabled in targetm. vector_mode_supported_p and SLP vectorizer will try 
> to
>       use them. Currently, we can support auto-vectorization in
>       -march=rv32_zve32x_zvl128b. Wheras, -march=rv32_zve32x_zvl32b or
> @@ -2371,7 +2344,7 @@ autovectorize_vector_modes (vector_modes *modes, bool)
>        poly_uint64 full_size
>         = BYTES_PER_RISCV_VECTOR * ((int) riscv_autovec_lmul);
>
> -      /* Start with a VNxYYQImode where YY is the number of units that
> +      /* Start with a RVVM1QImode where YY is the number of units that
>          fit a whole vector.
>          Then try YY = nunits / 2, nunits / 4 and nunits / 8 which
>          is guided by the extensions we have available (vf2, vf4 and vf8).

We don't have YY now :P

> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index f1f5a73389e..c47bcd2b412 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -972,8 +972,8 @@ riscv_valid_lo_sum_p (enum riscv_symbol_type sym_type, 
> machine_mode mode,
>  }
>
>  /* Return true if mode is the RVV enabled mode.
> -   For example: 'VNx1DI' mode is disabled if MIN_VLEN == 32.
> -   'VNx1SI' mode is enabled if MIN_VLEN == 32.  */
> +   For example: 'RVVM1DI' mode is disabled if MIN_VLEN == 32.
> +   'RVVM1SI' mode is enabled if MIN_VLEN == 32.  */

This comment need to updated :)

>
>  bool
>  riscv_v_ext_vector_mode_p (machine_mode mode)
> @@ -1023,11 +1023,36 @@ riscv_v_ext_mode_p (machine_mode mode)
>  poly_int64
>  riscv_v_adjust_nunits (machine_mode mode, int scale)
>  {
> +  gcc_assert (GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL);
>    if (riscv_v_ext_mode_p (mode))
> -    return riscv_vector_chunks * scale;
> +    {
> +      if (TARGET_MIN_VLEN == 32)
> +       scale = scale / 2;
> +      return riscv_vector_chunks * scale;
> +    }
>    return scale;
>  }

> diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h
> index 19683152259..643e7ea7330 100644
> --- a/gcc/config/riscv/riscv.h
> +++ b/gcc/config/riscv/riscv.h
> @@ -1040,6 +1040,7 @@ extern unsigned riscv_stack_boundary;
>  extern unsigned riscv_bytes_per_vector_chunk;
>  extern poly_uint16 riscv_vector_chunks;
>  extern poly_int64 riscv_v_adjust_nunits (enum machine_mode, int);
> +extern poly_int64 riscv_v_adjust_nunits (machine_mode, bool, int, int);
>  extern poly_int64 riscv_v_adjust_precision (enum machine_mode, int);
>  extern poly_int64 riscv_v_adjust_bytesize (enum machine_mode, int);
>  /* The number of bits and bytes in a RVV vector.  */

> +  (cond [(eq_attr "mode" "RVVM8QI,RVVM1BI") (symbol_ref 
> "riscv_vector::get_vlmul(E_RVVM8QImode)")

This could be just using constant value rather than ask
riscv_vector::get_vlmul now :)

> +        (eq_attr "mode" "RVVM8QI,RVVM1BI") (symbol_ref 
> "riscv_vector::get_ratio(E_RVVM8QImode)")

They are constant now too.

Reply via email to