This patch changes the gather/scatter mode iterators from a ratio
scheme to a more direct one where the index mode size is
1/2, 1/4, 1/8, 2, 4, 8 times the data mode size.  It also adds VLS modes
to the iterators and removes the now unnecessary
gather_scatter_valid_offset_p.

gcc/ChangeLog:

        * config/riscv/autovec.md 
(mask_len_gather_load<RATIO64:mode><RATIO64I:mode>): Change from this...
        (mask_len_gather_load<mode><vindex>): ...to this.
        (mask_len_gather_load<RATIO32:mode><RATIO32I:mode>): Ditto.
        (mask_len_gather_load<mode><vindex_double_trunc>): Ditto.
        (mask_len_gather_load<RATIO16:mode><RATIO16I:mode>): Ditto.
        (mask_len_gather_load<mode><vindex_quad_trunc>): Ditto.
        (mask_len_gather_load<RATIO8:mode><RATIO8I:mode>): Ditto.
        (mask_len_gather_load<mode><vindex_oct_trunc>): Ditto.
        (mask_len_gather_load<RATIO4:mode><RATIO4I:mode>): Ditto.
        (mask_len_gather_load<mode><vindex_double_ext>): Ditto.
        (mask_len_gather_load<RATIO2:mode><RATIO2I:mode>): Ditto.
        (mask_len_gather_load<mode><vindex_quad_ext>): Ditto.
        (mask_len_gather_load<mode><mode>): Ditto.
        (mask_len_gather_load<mode><vindex_oct_ext>): Ditto.
        (mask_len_scatter_store<RATIO64:mode><RATIO64I:mode>): Ditto.
        (mask_len_scatter_store<mode><vindex>): Ditto.
        (mask_len_scatter_store<RATIO32:mode><RATIO32I:mode>): Ditto.
        (mask_len_scatter_store<mode><vindex_double_trunc>): Ditto.
        (mask_len_scatter_store<RATIO16:mode><RATIO16I:mode>): Ditto.
        (mask_len_scatter_store<mode><vindex_quad_trunc>): Ditto.
        (mask_len_scatter_store<RATIO8:mode><RATIO8I:mode>): Ditto.
        (mask_len_scatter_store<mode><vindex_oct_trunc>): Ditto.
        (mask_len_scatter_store<RATIO4:mode><RATIO4I:mode>): Ditto.
        (mask_len_scatter_store<mode><vindex_double_ext>): Ditto.
        (mask_len_scatter_store<RATIO2:mode><RATIO2I:mode>): Ditto.
        (mask_len_scatter_store<mode><vindex_quad_ext>): Ditto.
        (mask_len_scatter_store<mode><mode>): Ditto.
        (mask_len_scatter_store<mode><vindex_oct_ext>): Ditto.
        * config/riscv/riscv-v.cc (prepare_gather_scatter): Use new
        scheme
        (get_gather_scatter_code): Ditto.
        (expand_gather_scatter): Ditto.
        * config/riscv/riscv-vector-builtins-bases.cc: Ditto.
        * config/riscv/vector-iterators.md: Ditto.
        * config/riscv/vector.md 
(@pred_indexed_<order>store<RATIO64:mode><RATIO64I:mode>): Go from this...
        (@pred_indexed_<order>store<mode>_same_eew): ...to this.
        (@pred_indexed_<order>store<RATIO32:mode><RATIO32I:mode>):
        Ditto.
        (@pred_indexed_<order>store<mode>_x2_greater_eew): Ditto.
        (@pred_indexed_<order>store<RATIO16:mode><RATIO16I:mode>):
        Ditto.
        (@pred_indexed_<order>store<mode>_x4_greater_eew): Ditto.
        (@pred_indexed_<order>store<RATIO8:mode><RATIO8I:mode>): Ditto.
        (@pred_indexed_<order>store<mode>_x8_greater_eew): Ditto.
        (@pred_indexed_<order>store<RATIO4:mode><RATIO4I:mode>): Ditto.
        (@pred_indexed_<order>store<mode>_x2_smaller_eew): Ditto.
        (@pred_indexed_<order>store<RATIO2:mode><RATIO2I:mode>): Ditto.
        (@pred_indexed_<order>store<mode>_x4_smaller_eew): Ditto.
        (@pred_indexed_<order>store<RATIO1:mode><RATIO1:mode>): Ditto.
        (@pred_indexed_<order>store<mode>_x8_smaller_eew): Ditto.
---
 gcc/config/riscv/autovec.md                   |  147 +-
 gcc/config/riscv/riscv-v.cc                   |  114 +-
 .../riscv/riscv-vector-builtins-bases.cc      |   54 +-
 gcc/config/riscv/vector-iterators.md          | 1417 ++++++++++++++++-
 gcc/config/riscv/vector.md                    |   72 +-
 5 files changed, 1565 insertions(+), 239 deletions(-)

diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md
index cec0113fca3..bb66afad30b 100644
--- a/gcc/config/riscv/autovec.md
+++ b/gcc/config/riscv/autovec.md
@@ -51,110 +51,113 @@ (define_expand "mask_len_store<mode><vm>"
 ;; == Gather Load
 ;; =========================================================================
 
-(define_expand "mask_len_gather_load<RATIO64:mode><RATIO64I:mode>"
-  [(match_operand:RATIO64 0 "register_operand")
+;; Same element size for index, extension operand is irrelevant.
+(define_expand "mask_len_gather_load<mode><vindex>"
+  [(match_operand:VINDEXED 0 "register_operand")
    (match_operand 1 "pmode_reg_or_0_operand")
-   (match_operand:RATIO64I 2 "register_operand")
+   (match_operand:<VINDEX> 2 "register_operand")
    (match_operand 3 "const_1_operand")
    (match_operand 4 "const_1_operand")
-   (match_operand:<RATIO64:VM> 5 "vector_mask_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "maskload_else_operand")
    (match_operand 7 "autovec_length_operand")
    (match_operand 8 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO64I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, true);
   DONE;
 })
 
-(define_expand "mask_len_gather_load<RATIO32:mode><RATIO32I:mode>"
-  [(match_operand:RATIO32 0 "register_operand")
+;; e.g. DImode, index SImode
+(define_expand "mask_len_gather_load<mode><vindex_double_trunc>"
+  [(match_operand:VEEWEXT2 0 "register_operand")
    (match_operand 1 "pmode_reg_or_0_operand")
-   (match_operand:RATIO32I 2 "register_operand")
+   (match_operand:<VINDEX_DOUBLE_TRUNC> 2 "register_operand")
    (match_operand 3 "const_1_operand")
    (match_operand 4 "const_1_operand")
-   (match_operand:<RATIO32:VM> 5 "vector_mask_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "maskload_else_operand")
    (match_operand 7 "autovec_length_operand")
    (match_operand 8 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO32I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, true);
   DONE;
 })
 
-(define_expand "mask_len_gather_load<RATIO16:mode><RATIO16I:mode>"
-  [(match_operand:RATIO16 0 "register_operand")
+;; e.g. DImode, index HImode
+(define_expand "mask_len_gather_load<mode><vindex_quad_trunc>"
+  [(match_operand:VEEWEXT4 0 "register_operand")
    (match_operand 1 "pmode_reg_or_0_operand")
-   (match_operand:RATIO16I 2 "register_operand")
+   (match_operand:<VINDEX_QUAD_TRUNC> 2 "register_operand")
    (match_operand 3 "const_1_operand")
    (match_operand 4 "const_1_operand")
-   (match_operand:<RATIO16:VM> 5 "vector_mask_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "maskload_else_operand")
    (match_operand 7 "autovec_length_operand")
    (match_operand 8 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO16I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, true);
   DONE;
 })
 
-(define_expand "mask_len_gather_load<RATIO8:mode><RATIO8I:mode>"
-  [(match_operand:RATIO8 0 "register_operand")
+;; e.g. DImode, index QImode
+(define_expand "mask_len_gather_load<mode><vindex_oct_trunc>"
+  [(match_operand:VEEWEXT8 0 "register_operand")
    (match_operand 1 "pmode_reg_or_0_operand")
-   (match_operand:RATIO8I 2 "register_operand")
+   (match_operand:<VINDEX_OCT_TRUNC> 2 "register_operand")
    (match_operand 3 "const_1_operand")
    (match_operand 4 "const_1_operand")
-   (match_operand:<RATIO8:VM> 5 "vector_mask_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "maskload_else_operand")
    (match_operand 7 "autovec_length_operand")
    (match_operand 8 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO8I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, true);
   DONE;
 })
 
-(define_expand "mask_len_gather_load<RATIO4:mode><RATIO4I:mode>"
-  [(match_operand:RATIO4 0 "register_operand")
+;; e.g. SImode, index DImode
+(define_expand "mask_len_gather_load<mode><vindex_double_ext>"
+  [(match_operand:VEEWTRUNC2 0 "register_operand")
    (match_operand 1 "pmode_reg_or_0_operand")
-   (match_operand:RATIO4I 2 "register_operand")
+   (match_operand:<VINDEX_DOUBLE_EXT> 2 "register_operand")
    (match_operand 3 "const_1_operand")
    (match_operand 4 "const_1_operand")
-   (match_operand:<RATIO4:VM> 5 "vector_mask_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "maskload_else_operand")
    (match_operand 7 "autovec_length_operand")
    (match_operand 8 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO4I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, true);
   DONE;
 })
 
-(define_expand "mask_len_gather_load<RATIO2:mode><RATIO2I:mode>"
-  [(match_operand:RATIO2 0 "register_operand")
+;; e.g. HImode, index DImode
+(define_expand "mask_len_gather_load<mode><vindex_quad_ext>"
+  [(match_operand:VEEWTRUNC4 0 "register_operand")
    (match_operand 1 "pmode_reg_or_0_operand")
-   (match_operand:RATIO2I 2 "register_operand")
+   (match_operand:<VINDEX_QUAD_EXT> 2 "register_operand")
    (match_operand 3 "const_1_operand")
    (match_operand 4 "const_1_operand")
-   (match_operand:<RATIO2:VM> 5 "vector_mask_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "maskload_else_operand")
    (match_operand 7 "autovec_length_operand")
    (match_operand 8 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO2I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, true);
   DONE;
 })
 
-;; When SEW = 8 and LMUL = 8, we can't find any index mode with
-;; larger SEW. Since RVV indexed load/store support zero extend
-;; implicitly and not support scaling, we should only allow
-;; operands[3] and operands[4] to be const_1_operand.
-(define_expand "mask_len_gather_load<mode><mode>"
-  [(match_operand:RATIO1 0 "register_operand")
+;; e.g. QImode, index DImode
+(define_expand "mask_len_gather_load<mode><vindex_oct_ext>"
+  [(match_operand:VEEWTRUNC8 0 "register_operand")
    (match_operand 1 "pmode_reg_or_0_operand")
-   (match_operand:RATIO1 2 "register_operand")
+   (match_operand:<VINDEX_OCT_EXT> 2 "register_operand")
    (match_operand 3 "const_1_operand")
    (match_operand 4 "const_1_operand")
    (match_operand:<VM> 5 "vector_mask_operand")
@@ -171,106 +174,102 @@ (define_expand "mask_len_gather_load<mode><mode>"
 ;; == Scatter Store
 ;; =========================================================================
 
-(define_expand "mask_len_scatter_store<RATIO64:mode><RATIO64I:mode>"
+(define_expand "mask_len_scatter_store<mode><vindex>"
   [(match_operand 0 "pmode_reg_or_0_operand")
-   (match_operand:RATIO64I 1 "register_operand")
+   (match_operand:<VINDEX> 1 "register_operand")
    (match_operand 2 "const_1_operand")
    (match_operand 3 "const_1_operand")
-   (match_operand:RATIO64 4 "register_operand")
-   (match_operand:<RATIO64:VM> 5 "vector_mask_operand")
+   (match_operand:VINDEXED 4 "register_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "autovec_length_operand")
    (match_operand 7 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO64I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, false);
   DONE;
 })
 
-(define_expand "mask_len_scatter_store<RATIO32:mode><RATIO32I:mode>"
+(define_expand "mask_len_scatter_store<mode><vindex_double_trunc>"
   [(match_operand 0 "pmode_reg_or_0_operand")
-   (match_operand:RATIO32I 1 "register_operand")
+   (match_operand:<VINDEX_DOUBLE_TRUNC> 1 "register_operand")
    (match_operand 2 "const_1_operand")
    (match_operand 3 "const_1_operand")
-   (match_operand:RATIO32 4 "register_operand")
-   (match_operand:<RATIO32:VM> 5 "vector_mask_operand")
+   (match_operand:VEEWEXT2 4 "register_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "autovec_length_operand")
    (match_operand 7 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO32I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, false);
   DONE;
 })
 
-(define_expand "mask_len_scatter_store<RATIO16:mode><RATIO16I:mode>"
+(define_expand "mask_len_scatter_store<mode><vindex_quad_trunc>"
   [(match_operand 0 "pmode_reg_or_0_operand")
-   (match_operand:RATIO16I 1 "register_operand")
+   (match_operand:<VINDEX_QUAD_TRUNC> 1 "register_operand")
    (match_operand 2 "const_1_operand")
    (match_operand 3 "const_1_operand")
-   (match_operand:RATIO16 4 "register_operand")
-   (match_operand:<RATIO16:VM> 5 "vector_mask_operand")
+   (match_operand:VEEWEXT4 4 "register_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "autovec_length_operand")
    (match_operand 7 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO16I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, false);
   DONE;
 })
 
-(define_expand "mask_len_scatter_store<RATIO8:mode><RATIO8I:mode>"
+(define_expand "mask_len_scatter_store<mode><vindex_oct_trunc>"
   [(match_operand 0 "pmode_reg_or_0_operand")
-   (match_operand:RATIO8I 1 "register_operand")
+   (match_operand:<VINDEX_OCT_TRUNC> 1 "register_operand")
    (match_operand 2 "const_1_operand")
    (match_operand 3 "const_1_operand")
-   (match_operand:RATIO8 4 "register_operand")
-   (match_operand:<RATIO8:VM> 5 "vector_mask_operand")
+   (match_operand:VEEWEXT8 4 "register_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "autovec_length_operand")
    (match_operand 7 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO8I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, false);
   DONE;
 })
 
-(define_expand "mask_len_scatter_store<RATIO4:mode><RATIO4I:mode>"
+(define_expand "mask_len_scatter_store<mode><vindex_double_ext>"
   [(match_operand 0 "pmode_reg_or_0_operand")
-   (match_operand:RATIO4I 1 "register_operand")
+   (match_operand:<VINDEX_DOUBLE_EXT> 1 "register_operand")
    (match_operand 2 "const_1_operand")
    (match_operand 3 "const_1_operand")
-   (match_operand:RATIO4 4 "register_operand")
-   (match_operand:<RATIO4:VM> 5 "vector_mask_operand")
+   (match_operand:VEEWTRUNC2 4 "register_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "autovec_length_operand")
    (match_operand 7 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO4I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, false);
   DONE;
 })
 
-(define_expand "mask_len_scatter_store<RATIO2:mode><RATIO2I:mode>"
+(define_expand "mask_len_scatter_store<mode><vindex_quad_ext>"
   [(match_operand 0 "pmode_reg_or_0_operand")
-   (match_operand:RATIO2I 1 "register_operand")
+   (match_operand:<VINDEX_QUAD_EXT> 1 "register_operand")
    (match_operand 2 "const_1_operand")
    (match_operand 3 "const_1_operand")
-   (match_operand:RATIO2 4 "register_operand")
-   (match_operand:<RATIO2:VM> 5 "vector_mask_operand")
+   (match_operand:VEEWTRUNC4 4 "register_operand")
+   (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "autovec_length_operand")
    (match_operand 7 "const_0_operand")]
-  "TARGET_VECTOR && riscv_vector::gather_scatter_valid_offset_p 
(<RATIO2I:MODE>mode)"
+  "TARGET_VECTOR"
 {
   riscv_vector::expand_gather_scatter (operands, false);
   DONE;
 })
 
-;; When SEW = 8 and LMUL = 8, we can't find any index mode with
-;; larger SEW. Since RVV indexed load/store support zero extend
-;; implicitly and not support scaling, we should only allow
-;; operands[3] and operands[4] to be const_1_operand.
-(define_expand "mask_len_scatter_store<mode><mode>"
+(define_expand "mask_len_scatter_store<mode><vindex_oct_ext>"
   [(match_operand 0 "pmode_reg_or_0_operand")
-   (match_operand:RATIO1 1 "register_operand")
+   (match_operand:<VINDEX_OCT_EXT> 1 "register_operand")
    (match_operand 2 "const_1_operand")
    (match_operand 3 "const_1_operand")
-   (match_operand:RATIO1 4 "register_operand")
+   (match_operand:VEEWTRUNC8 4 "register_operand")
    (match_operand:<VM> 5 "vector_mask_operand")
    (match_operand 6 "autovec_length_operand")
    (match_operand 7 "const_0_operand")]
diff --git a/gcc/config/riscv/riscv-v.cc b/gcc/config/riscv/riscv-v.cc
index c7044cd5fe2..ea17d940388 100644
--- a/gcc/config/riscv/riscv-v.cc
+++ b/gcc/config/riscv/riscv-v.cc
@@ -4691,53 +4691,81 @@ expand_cond_binop (unsigned icode, rtx *ops)
 
 /* Prepare insn_code for gather_load/scatter_store according to
    the vector mode and index mode.  */
-static insn_code
-prepare_gather_scatter (machine_mode vec_mode, machine_mode idx_mode,
-                       bool is_load)
+insn_code
+get_gather_scatter_code (machine_mode vec_mode, machine_mode idx_mode,
+                        bool is_load)
 {
-  if (!is_load)
-    return code_for_pred_indexed_store (UNSPEC_UNORDERED, vec_mode, idx_mode);
-  else
+  unsigned src_eew_bitsize = GET_MODE_BITSIZE (GET_MODE_INNER (idx_mode));
+  unsigned dst_eew_bitsize = GET_MODE_BITSIZE (GET_MODE_INNER (vec_mode));
+  if (dst_eew_bitsize == src_eew_bitsize)
     {
-      unsigned src_eew_bitsize = GET_MODE_BITSIZE (GET_MODE_INNER (idx_mode));
-      unsigned dst_eew_bitsize = GET_MODE_BITSIZE (GET_MODE_INNER (vec_mode));
-      if (dst_eew_bitsize == src_eew_bitsize)
-       return code_for_pred_indexed_load_same_eew (UNSPEC_UNORDERED, vec_mode);
-      else if (dst_eew_bitsize > src_eew_bitsize)
+      if (is_load)
+       return code_for_pred_indexed_load_same_eew
+         (UNSPEC_UNORDERED, vec_mode);
+      else
+       return code_for_pred_indexed_store_same_eew
+         (UNSPEC_UNORDERED, vec_mode);
+    }
+  else if (dst_eew_bitsize > src_eew_bitsize)
+    {
+      unsigned factor = dst_eew_bitsize / src_eew_bitsize;
+      switch (factor)
        {
-         unsigned factor = dst_eew_bitsize / src_eew_bitsize;
-         switch (factor)
-           {
-           case 2:
-             return code_for_pred_indexed_load_x2_greater_eew (
-               UNSPEC_UNORDERED, vec_mode);
-           case 4:
-             return code_for_pred_indexed_load_x4_greater_eew (
-               UNSPEC_UNORDERED, vec_mode);
-           case 8:
-             return code_for_pred_indexed_load_x8_greater_eew (
-               UNSPEC_UNORDERED, vec_mode);
-           default:
-             gcc_unreachable ();
-           }
+       case 2:
+         if (is_load)
+           return
+             code_for_pred_indexed_load_x2_greater_eew
+               (UNSPEC_UNORDERED, vec_mode);
+         else
+           return
+             code_for_pred_indexed_store_x2_greater_eew
+               (UNSPEC_UNORDERED, vec_mode);
+       case 4:
+         if (is_load)
+           return code_for_pred_indexed_load_x4_greater_eew
+               (UNSPEC_UNORDERED, vec_mode);
+         else
+           return code_for_pred_indexed_store_x4_greater_eew
+               (UNSPEC_UNORDERED, vec_mode);
+       case 8:
+         if (is_load)
+           return code_for_pred_indexed_load_x8_greater_eew
+             (UNSPEC_UNORDERED, vec_mode);
+         else
+           return code_for_pred_indexed_store_x8_greater_eew
+             (UNSPEC_UNORDERED, vec_mode);
+       default:
+         gcc_unreachable ();
        }
-      else
+    }
+  else
+    {
+      unsigned factor = src_eew_bitsize / dst_eew_bitsize;
+      switch (factor)
        {
-         unsigned factor = src_eew_bitsize / dst_eew_bitsize;
-         switch (factor)
-           {
-           case 2:
-             return code_for_pred_indexed_load_x2_smaller_eew (
-               UNSPEC_UNORDERED, vec_mode);
-           case 4:
-             return code_for_pred_indexed_load_x4_smaller_eew (
-               UNSPEC_UNORDERED, vec_mode);
-           case 8:
-             return code_for_pred_indexed_load_x8_smaller_eew (
-               UNSPEC_UNORDERED, vec_mode);
-           default:
-             gcc_unreachable ();
-           }
+       case 2:
+         if (is_load)
+           return code_for_pred_indexed_load_x2_smaller_eew
+             (UNSPEC_UNORDERED, vec_mode);
+         else
+           return code_for_pred_indexed_store_x2_smaller_eew
+             (UNSPEC_UNORDERED, vec_mode);
+       case 4:
+         if (is_load)
+           return code_for_pred_indexed_load_x4_smaller_eew
+             (UNSPEC_UNORDERED, vec_mode);
+         else
+           return code_for_pred_indexed_store_x4_smaller_eew
+             (UNSPEC_UNORDERED, vec_mode);
+       case 8:
+         if (is_load)
+           return code_for_pred_indexed_load_x8_smaller_eew
+             (UNSPEC_UNORDERED, vec_mode);
+         else
+           return code_for_pred_indexed_store_x8_smaller_eew
+             (UNSPEC_UNORDERED, vec_mode);
+       default:
+         gcc_unreachable ();
        }
     }
 }
@@ -4768,7 +4796,7 @@ expand_gather_scatter (rtx *ops, bool is_load)
   machine_mode idx_mode = GET_MODE (vec_offset);
   bool is_vlmax = is_vlmax_len_p (vec_mode, len);
 
-  insn_code icode = prepare_gather_scatter (vec_mode, idx_mode, is_load);
+  insn_code icode = get_gather_scatter_code (vec_mode, idx_mode, is_load);
   if (is_vlmax)
     {
       if (is_load)
diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc 
b/gcc/config/riscv/riscv-vector-builtins-bases.cc
index 22b77ccd3d5..c4bd51d6b42 100644
--- a/gcc/config/riscv/riscv-vector-builtins-bases.cc
+++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc
@@ -199,9 +199,57 @@ public:
       {
        int unspec = ORDERED_P ? UNSPEC_ORDERED : UNSPEC_UNORDERED;
        if (STORE_P)
-         return e.use_exact_insn (
-           code_for_pred_indexed_store (unspec, e.vector_mode (),
-                                        e.index_mode ()));
+         {
+           unsigned src_eew_bitsize
+             = GET_MODE_BITSIZE (GET_MODE_INNER (e.index_mode ()));
+           unsigned dst_eew_bitsize
+             = GET_MODE_BITSIZE (GET_MODE_INNER (e.vector_mode ()));
+           if (dst_eew_bitsize == src_eew_bitsize)
+             return e.use_exact_insn (
+               code_for_pred_indexed_store_same_eew (unspec, e.vector_mode 
()));
+           else if (dst_eew_bitsize > src_eew_bitsize)
+             {
+               unsigned factor = dst_eew_bitsize / src_eew_bitsize;
+               switch (factor)
+                 {
+                 case 2:
+                   return e.use_exact_insn (
+                     code_for_pred_indexed_store_x2_greater_eew (
+                       unspec, e.vector_mode ()));
+                 case 4:
+                   return e.use_exact_insn (
+                     code_for_pred_indexed_store_x4_greater_eew (
+                       unspec, e.vector_mode ()));
+                 case 8:
+                   return e.use_exact_insn (
+                     code_for_pred_indexed_store_x8_greater_eew (
+                       unspec, e.vector_mode ()));
+                 default:
+                   gcc_unreachable ();
+                 }
+             }
+           else
+             {
+               unsigned factor = src_eew_bitsize / dst_eew_bitsize;
+               switch (factor)
+                 {
+                 case 2:
+                   return e.use_exact_insn (
+                     code_for_pred_indexed_store_x2_smaller_eew (
+                       unspec, e.vector_mode ()));
+                 case 4:
+                   return e.use_exact_insn (
+                     code_for_pred_indexed_store_x4_smaller_eew (
+                       unspec, e.vector_mode ()));
+                 case 8:
+                   return e.use_exact_insn (
+                     code_for_pred_indexed_store_x8_smaller_eew (
+                       unspec, e.vector_mode ()));
+                 default:
+                   gcc_unreachable ();
+                 }
+             }
+         }
        else
          {
            unsigned src_eew_bitsize
diff --git a/gcc/config/riscv/vector-iterators.md 
b/gcc/config/riscv/vector-iterators.md
index 81276a8e3f5..9b562615b11 100644
--- a/gcc/config/riscv/vector-iterators.md
+++ b/gcc/config/riscv/vector-iterators.md
@@ -341,6 +341,85 @@ (define_mode_iterator VEEWEXT2 [
 
   (RVVM8DF "TARGET_VECTOR_ELEN_FP_64") (RVVM4DF "TARGET_VECTOR_ELEN_FP_64")
   (RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
+
+  (V1HI "riscv_vector::vls_mode_valid_p (V1HImode)")
+  (V2HI "riscv_vector::vls_mode_valid_p (V2HImode)")
+  (V4HI "riscv_vector::vls_mode_valid_p (V4HImode)")
+  (V8HI "riscv_vector::vls_mode_valid_p (V8HImode)")
+  (V16HI "riscv_vector::vls_mode_valid_p (V16HImode)")
+  (V32HI "riscv_vector::vls_mode_valid_p (V32HImode) && TARGET_MIN_VLEN >= 64")
+  (V64HI "riscv_vector::vls_mode_valid_p (V64HImode) && TARGET_MIN_VLEN >= 
128")
+  (V128HI "riscv_vector::vls_mode_valid_p (V128HImode) && TARGET_MIN_VLEN >= 
256")
+  (V256HI "riscv_vector::vls_mode_valid_p (V256HImode) && TARGET_MIN_VLEN >= 
512")
+  (V512HI "riscv_vector::vls_mode_valid_p (V512HImode) && TARGET_MIN_VLEN >= 
1024")
+  (V1024HI "riscv_vector::vls_mode_valid_p (V1024HImode) && TARGET_MIN_VLEN >= 
2048")
+  (V1SI "riscv_vector::vls_mode_valid_p (V1SImode)")
+  (V2SI "riscv_vector::vls_mode_valid_p (V2SImode)")
+  (V4SI "riscv_vector::vls_mode_valid_p (V4SImode)")
+  (V8SI "riscv_vector::vls_mode_valid_p (V8SImode)")
+  (V16SI "riscv_vector::vls_mode_valid_p (V16SImode) && TARGET_MIN_VLEN >= 64")
+  (V32SI "riscv_vector::vls_mode_valid_p (V32SImode) && TARGET_MIN_VLEN >= 
128")
+  (V64SI "riscv_vector::vls_mode_valid_p (V64SImode) && TARGET_MIN_VLEN >= 
256")
+  (V128SI "riscv_vector::vls_mode_valid_p (V128SImode) && TARGET_MIN_VLEN >= 
512")
+  (V256SI "riscv_vector::vls_mode_valid_p (V256SImode) && TARGET_MIN_VLEN >= 
1024")
+  (V512SI "riscv_vector::vls_mode_valid_p (V512SImode) && TARGET_MIN_VLEN >= 
2048")
+  (V1024SI "riscv_vector::vls_mode_valid_p (V1024SImode) && TARGET_MIN_VLEN >= 
4096")
+  (V1DI "riscv_vector::vls_mode_valid_p (V1DImode) && TARGET_VECTOR_ELEN_64")
+  (V2DI "riscv_vector::vls_mode_valid_p (V2DImode) && TARGET_VECTOR_ELEN_64")
+  (V4DI "riscv_vector::vls_mode_valid_p (V4DImode) && TARGET_VECTOR_ELEN_64")
+  (V8DI "riscv_vector::vls_mode_valid_p (V8DImode) && TARGET_VECTOR_ELEN_64 && 
TARGET_MIN_VLEN >= 64")
+  (V16DI "riscv_vector::vls_mode_valid_p (V16DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 128")
+  (V32DI "riscv_vector::vls_mode_valid_p (V32DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 256")
+  (V64DI "riscv_vector::vls_mode_valid_p (V64DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 512")
+  (V128DI "riscv_vector::vls_mode_valid_p (V128DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 1024")
+  (V256DI "riscv_vector::vls_mode_valid_p (V256DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 2048")
+  (V512DI "riscv_vector::vls_mode_valid_p (V512DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 4096")
+
+  (V1HF "riscv_vector::vls_mode_valid_p (V1HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V2HF "riscv_vector::vls_mode_valid_p (V2HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V4HF "riscv_vector::vls_mode_valid_p (V4HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V8HF "riscv_vector::vls_mode_valid_p (V8HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V16HF "riscv_vector::vls_mode_valid_p (V16HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V32HF "riscv_vector::vls_mode_valid_p (V32HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 64")
+  (V64HF "riscv_vector::vls_mode_valid_p (V64HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 128")
+  (V128HF "riscv_vector::vls_mode_valid_p (V128HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 256")
+  (V256HF "riscv_vector::vls_mode_valid_p (V256HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 512")
+  (V512HF "riscv_vector::vls_mode_valid_p (V512HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 1024")
+  (V1024HF "riscv_vector::vls_mode_valid_p (V1024HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 2048")
+  (V2048HF "riscv_vector::vls_mode_valid_p (V2048HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 4096")
+  (V1BF "riscv_vector::vls_mode_valid_p (V1BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V2BF "riscv_vector::vls_mode_valid_p (V2BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V4BF "riscv_vector::vls_mode_valid_p (V4BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V8BF "riscv_vector::vls_mode_valid_p (V8BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V16BF "riscv_vector::vls_mode_valid_p (V16BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V32BF "riscv_vector::vls_mode_valid_p (V32BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 64")
+  (V64BF "riscv_vector::vls_mode_valid_p (V64BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 128")
+  (V128BF "riscv_vector::vls_mode_valid_p (V128BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 256")
+  (V256BF "riscv_vector::vls_mode_valid_p (V256BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 512")
+  (V512BF "riscv_vector::vls_mode_valid_p (V512BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 1024")
+  (V1024BF "riscv_vector::vls_mode_valid_p (V1024BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 2048")
+  (V2048BF "riscv_vector::vls_mode_valid_p (V2048BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 4096")
+  (V1SF "riscv_vector::vls_mode_valid_p (V1SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V2SF "riscv_vector::vls_mode_valid_p (V2SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V4SF "riscv_vector::vls_mode_valid_p (V4SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V8SF "riscv_vector::vls_mode_valid_p (V8SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V16SF "riscv_vector::vls_mode_valid_p (V16SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 64")
+  (V32SF "riscv_vector::vls_mode_valid_p (V32SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 128")
+  (V64SF "riscv_vector::vls_mode_valid_p (V64SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 256")
+  (V128SF "riscv_vector::vls_mode_valid_p (V128SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 512")
+  (V256SF "riscv_vector::vls_mode_valid_p (V256SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 1024")
+  (V512SF "riscv_vector::vls_mode_valid_p (V512SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 2048")
+  (V1024SF "riscv_vector::vls_mode_valid_p (V1024SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 4096")
+  (V1DF "riscv_vector::vls_mode_valid_p (V1DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V2DF "riscv_vector::vls_mode_valid_p (V2DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V4DF "riscv_vector::vls_mode_valid_p (V4DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V8DF "riscv_vector::vls_mode_valid_p (V8DFmode) && TARGET_VECTOR_ELEN_FP_64 
&& TARGET_MIN_VLEN >= 64")
+  (V16DF "riscv_vector::vls_mode_valid_p (V16DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 128")
+  (V32DF "riscv_vector::vls_mode_valid_p (V32DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 256")
+  (V64DF "riscv_vector::vls_mode_valid_p (V64DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 512")
+  (V128DF "riscv_vector::vls_mode_valid_p (V128DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 1024")
+  (V256DF "riscv_vector::vls_mode_valid_p (V256DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 2048")
+  (V512DF "riscv_vector::vls_mode_valid_p (V512DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 4096")
 ])
 
 (define_mode_iterator VEEWEXT4 [
@@ -354,6 +433,50 @@ (define_mode_iterator VEEWEXT4 [
 
   (RVVM8DF "TARGET_VECTOR_ELEN_FP_64") (RVVM4DF "TARGET_VECTOR_ELEN_FP_64")
   (RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
+
+  (V1SI "riscv_vector::vls_mode_valid_p (V1SImode)")
+  (V2SI "riscv_vector::vls_mode_valid_p (V2SImode)")
+  (V4SI "riscv_vector::vls_mode_valid_p (V4SImode)")
+  (V8SI "riscv_vector::vls_mode_valid_p (V8SImode)")
+  (V16SI "riscv_vector::vls_mode_valid_p (V16SImode) && TARGET_MIN_VLEN >= 64")
+  (V32SI "riscv_vector::vls_mode_valid_p (V32SImode) && TARGET_MIN_VLEN >= 
128")
+  (V64SI "riscv_vector::vls_mode_valid_p (V64SImode) && TARGET_MIN_VLEN >= 
256")
+  (V128SI "riscv_vector::vls_mode_valid_p (V128SImode) && TARGET_MIN_VLEN >= 
512")
+  (V256SI "riscv_vector::vls_mode_valid_p (V256SImode) && TARGET_MIN_VLEN >= 
1024")
+  (V512SI "riscv_vector::vls_mode_valid_p (V512SImode) && TARGET_MIN_VLEN >= 
2048")
+  (V1024SI "riscv_vector::vls_mode_valid_p (V1024SImode) && TARGET_MIN_VLEN >= 
4096")
+  (V1DI "riscv_vector::vls_mode_valid_p (V1DImode) && TARGET_VECTOR_ELEN_64")
+  (V2DI "riscv_vector::vls_mode_valid_p (V2DImode) && TARGET_VECTOR_ELEN_64")
+  (V4DI "riscv_vector::vls_mode_valid_p (V4DImode) && TARGET_VECTOR_ELEN_64")
+  (V8DI "riscv_vector::vls_mode_valid_p (V8DImode) && TARGET_VECTOR_ELEN_64 && 
TARGET_MIN_VLEN >= 64")
+  (V16DI "riscv_vector::vls_mode_valid_p (V16DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 128")
+  (V32DI "riscv_vector::vls_mode_valid_p (V32DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 256")
+  (V64DI "riscv_vector::vls_mode_valid_p (V64DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 512")
+  (V128DI "riscv_vector::vls_mode_valid_p (V128DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 1024")
+  (V256DI "riscv_vector::vls_mode_valid_p (V256DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 2048")
+  (V512DI "riscv_vector::vls_mode_valid_p (V512DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 4096")
+
+  (V1SF "riscv_vector::vls_mode_valid_p (V1SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V2SF "riscv_vector::vls_mode_valid_p (V2SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V4SF "riscv_vector::vls_mode_valid_p (V4SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V8SF "riscv_vector::vls_mode_valid_p (V8SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V16SF "riscv_vector::vls_mode_valid_p (V16SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 64")
+  (V32SF "riscv_vector::vls_mode_valid_p (V32SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 128")
+  (V64SF "riscv_vector::vls_mode_valid_p (V64SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 256")
+  (V128SF "riscv_vector::vls_mode_valid_p (V128SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 512")
+  (V256SF "riscv_vector::vls_mode_valid_p (V256SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 1024")
+  (V512SF "riscv_vector::vls_mode_valid_p (V512SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 2048")
+  (V1024SF "riscv_vector::vls_mode_valid_p (V1024SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 4096")
+  (V1DF "riscv_vector::vls_mode_valid_p (V1DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V2DF "riscv_vector::vls_mode_valid_p (V2DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V4DF "riscv_vector::vls_mode_valid_p (V4DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V8DF "riscv_vector::vls_mode_valid_p (V8DFmode) && TARGET_VECTOR_ELEN_FP_64 
&& TARGET_MIN_VLEN >= 64")
+  (V16DF "riscv_vector::vls_mode_valid_p (V16DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 128")
+  (V32DF "riscv_vector::vls_mode_valid_p (V32DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 256")
+  (V64DF "riscv_vector::vls_mode_valid_p (V64DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 512")
+  (V128DF "riscv_vector::vls_mode_valid_p (V128DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 1024")
+  (V256DF "riscv_vector::vls_mode_valid_p (V256DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 2048")
+  (V512DF "riscv_vector::vls_mode_valid_p (V512DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 4096")
 ])
 
 (define_mode_iterator VEEWEXT8 [
@@ -362,6 +485,28 @@ (define_mode_iterator VEEWEXT8 [
 
   (RVVM8DF "TARGET_VECTOR_ELEN_FP_64") (RVVM4DF "TARGET_VECTOR_ELEN_FP_64")
   (RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF "TARGET_VECTOR_ELEN_FP_64")
+
+  (V1DI "riscv_vector::vls_mode_valid_p (V1DImode) && TARGET_VECTOR_ELEN_64")
+  (V2DI "riscv_vector::vls_mode_valid_p (V2DImode) && TARGET_VECTOR_ELEN_64")
+  (V4DI "riscv_vector::vls_mode_valid_p (V4DImode) && TARGET_VECTOR_ELEN_64")
+  (V8DI "riscv_vector::vls_mode_valid_p (V8DImode) && TARGET_VECTOR_ELEN_64 && 
TARGET_MIN_VLEN >= 64")
+  (V16DI "riscv_vector::vls_mode_valid_p (V16DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 128")
+  (V32DI "riscv_vector::vls_mode_valid_p (V32DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 256")
+  (V64DI "riscv_vector::vls_mode_valid_p (V64DImode) && TARGET_VECTOR_ELEN_64 
&& TARGET_MIN_VLEN >= 512")
+  (V128DI "riscv_vector::vls_mode_valid_p (V128DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 1024")
+  (V256DI "riscv_vector::vls_mode_valid_p (V256DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 2048")
+  (V512DI "riscv_vector::vls_mode_valid_p (V512DImode) && 
TARGET_VECTOR_ELEN_64 && TARGET_MIN_VLEN >= 4096")
+
+  (V1DF "riscv_vector::vls_mode_valid_p (V1DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V2DF "riscv_vector::vls_mode_valid_p (V2DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V4DF "riscv_vector::vls_mode_valid_p (V4DFmode) && 
TARGET_VECTOR_ELEN_FP_64")
+  (V8DF "riscv_vector::vls_mode_valid_p (V8DFmode) && TARGET_VECTOR_ELEN_FP_64 
&& TARGET_MIN_VLEN >= 64")
+  (V16DF "riscv_vector::vls_mode_valid_p (V16DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 128")
+  (V32DF "riscv_vector::vls_mode_valid_p (V32DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 256")
+  (V64DF "riscv_vector::vls_mode_valid_p (V64DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 512")
+  (V128DF "riscv_vector::vls_mode_valid_p (V128DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 1024")
+  (V256DF "riscv_vector::vls_mode_valid_p (V256DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 2048")
+  (V512DF "riscv_vector::vls_mode_valid_p (V512DFmode) && 
TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 4096")
 ])
 
 (define_mode_iterator VEEWTRUNC2 [
@@ -386,6 +531,73 @@ (define_mode_iterator VEEWTRUNC2 [
   (RVVM2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_64BIT")
   (RVVM1SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_64BIT")
   (RVVMF2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_VECTOR_ELEN_64 && 
TARGET_64BIT")
+
+  (V1QI "riscv_vector::vls_mode_valid_p (V1QImode)")
+  (V2QI "riscv_vector::vls_mode_valid_p (V2QImode)")
+  (V4QI "riscv_vector::vls_mode_valid_p (V4QImode)")
+  (V8QI "riscv_vector::vls_mode_valid_p (V8QImode)")
+  (V16QI "riscv_vector::vls_mode_valid_p (V16QImode)")
+  (V32QI "riscv_vector::vls_mode_valid_p (V32QImode) && TARGET_MIN_VLEN >= 64")
+  (V64QI "riscv_vector::vls_mode_valid_p (V64QImode) && TARGET_MIN_VLEN >= 
128")
+  (V128QI "riscv_vector::vls_mode_valid_p (V128QImode) && TARGET_MIN_VLEN >= 
256")
+  (V256QI "riscv_vector::vls_mode_valid_p (V256QImode) && TARGET_MIN_VLEN >= 
512")
+  (V512QI "riscv_vector::vls_mode_valid_p (V512QImode) && TARGET_MIN_VLEN >= 
1024")
+  (V1024QI "riscv_vector::vls_mode_valid_p (V1024QImode) && TARGET_MIN_VLEN >= 
2048")
+  (V2048QI "riscv_vector::vls_mode_valid_p (V1024QImode) && TARGET_MIN_VLEN >= 
2048")
+  (V1HI "riscv_vector::vls_mode_valid_p (V1HImode)")
+  (V2HI "riscv_vector::vls_mode_valid_p (V2HImode)")
+  (V4HI "riscv_vector::vls_mode_valid_p (V4HImode)")
+  (V8HI "riscv_vector::vls_mode_valid_p (V8HImode)")
+  (V16HI "riscv_vector::vls_mode_valid_p (V16HImode)")
+  (V32HI "riscv_vector::vls_mode_valid_p (V32HImode) && TARGET_MIN_VLEN >= 64")
+  (V64HI "riscv_vector::vls_mode_valid_p (V64HImode) && TARGET_MIN_VLEN >= 
128")
+  (V128HI "riscv_vector::vls_mode_valid_p (V128HImode) && TARGET_MIN_VLEN >= 
256")
+  (V256HI "riscv_vector::vls_mode_valid_p (V256HImode) && TARGET_MIN_VLEN >= 
512")
+  (V512HI "riscv_vector::vls_mode_valid_p (V512HImode) && TARGET_MIN_VLEN >= 
1024")
+  (V1024HI "riscv_vector::vls_mode_valid_p (V1024HImode) && TARGET_MIN_VLEN >= 
2048")
+  (V1SI "riscv_vector::vls_mode_valid_p (V1SImode)")
+  (V2SI "riscv_vector::vls_mode_valid_p (V2SImode)")
+  (V4SI "riscv_vector::vls_mode_valid_p (V4SImode)")
+  (V8SI "riscv_vector::vls_mode_valid_p (V8SImode)")
+  (V16SI "riscv_vector::vls_mode_valid_p (V16SImode) && TARGET_MIN_VLEN >= 64")
+  (V32SI "riscv_vector::vls_mode_valid_p (V32SImode) && TARGET_MIN_VLEN >= 
128")
+  (V64SI "riscv_vector::vls_mode_valid_p (V64SImode) && TARGET_MIN_VLEN >= 
256")
+  (V128SI "riscv_vector::vls_mode_valid_p (V128SImode) && TARGET_MIN_VLEN >= 
512")
+  (V256SI "riscv_vector::vls_mode_valid_p (V256SImode) && TARGET_MIN_VLEN >= 
1024")
+  (V512SI "riscv_vector::vls_mode_valid_p (V512SImode) && TARGET_MIN_VLEN >= 
2048")
+
+  (V1HF "riscv_vector::vls_mode_valid_p (V1HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V2HF "riscv_vector::vls_mode_valid_p (V2HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V4HF "riscv_vector::vls_mode_valid_p (V4HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V8HF "riscv_vector::vls_mode_valid_p (V8HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V16HF "riscv_vector::vls_mode_valid_p (V16HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V32HF "riscv_vector::vls_mode_valid_p (V32HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 64")
+  (V64HF "riscv_vector::vls_mode_valid_p (V64HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 128")
+  (V128HF "riscv_vector::vls_mode_valid_p (V128HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 256")
+  (V256HF "riscv_vector::vls_mode_valid_p (V256HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 512")
+  (V512HF "riscv_vector::vls_mode_valid_p (V512HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 1024")
+  (V1024HF "riscv_vector::vls_mode_valid_p (V1024HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 2048")
+  (V1BF "riscv_vector::vls_mode_valid_p (V1BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V2BF "riscv_vector::vls_mode_valid_p (V2BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V4BF "riscv_vector::vls_mode_valid_p (V4BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V8BF "riscv_vector::vls_mode_valid_p (V8BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V16BF "riscv_vector::vls_mode_valid_p (V16BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V32BF "riscv_vector::vls_mode_valid_p (V32BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 64")
+  (V64BF "riscv_vector::vls_mode_valid_p (V64BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 128")
+  (V128BF "riscv_vector::vls_mode_valid_p (V128BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 256")
+  (V256BF "riscv_vector::vls_mode_valid_p (V256BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 512")
+  (V512BF "riscv_vector::vls_mode_valid_p (V512BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 1024")
+  (V1024BF "riscv_vector::vls_mode_valid_p (V1024BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 2048")
+  (V1SF "riscv_vector::vls_mode_valid_p (V1SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V2SF "riscv_vector::vls_mode_valid_p (V2SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V4SF "riscv_vector::vls_mode_valid_p (V4SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V8SF "riscv_vector::vls_mode_valid_p (V8SFmode) && 
TARGET_VECTOR_ELEN_FP_32")
+  (V16SF "riscv_vector::vls_mode_valid_p (V16SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 64")
+  (V32SF "riscv_vector::vls_mode_valid_p (V32SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 128")
+  (V64SF "riscv_vector::vls_mode_valid_p (V64SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 256")
+  (V128SF "riscv_vector::vls_mode_valid_p (V128SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 512")
+  (V256SF "riscv_vector::vls_mode_valid_p (V256SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 1024")
+  (V512SF "riscv_vector::vls_mode_valid_p (V512SFmode) && 
TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 2048")
 ])
 
 (define_mode_iterator VEEWTRUNC4 [
@@ -405,6 +617,49 @@ (define_mode_iterator VEEWTRUNC4 [
   (RVVM1HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_64BIT")
   (RVVMF2HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_64BIT")
   (RVVMF4HF "TARGET_VECTOR_ELEN_FP_16 && TARGET_VECTOR_ELEN_64 && 
TARGET_64BIT")
+
+  (V1QI "riscv_vector::vls_mode_valid_p (V1QImode)")
+  (V2QI "riscv_vector::vls_mode_valid_p (V2QImode)")
+  (V4QI "riscv_vector::vls_mode_valid_p (V4QImode)")
+  (V8QI "riscv_vector::vls_mode_valid_p (V8QImode)")
+  (V16QI "riscv_vector::vls_mode_valid_p (V16QImode)")
+  (V32QI "riscv_vector::vls_mode_valid_p (V32QImode) && TARGET_MIN_VLEN >= 64")
+  (V64QI "riscv_vector::vls_mode_valid_p (V64QImode) && TARGET_MIN_VLEN >= 
128")
+  (V128QI "riscv_vector::vls_mode_valid_p (V128QImode) && TARGET_MIN_VLEN >= 
256")
+  (V256QI "riscv_vector::vls_mode_valid_p (V256QImode) && TARGET_MIN_VLEN >= 
512")
+  (V512QI "riscv_vector::vls_mode_valid_p (V512QImode) && TARGET_MIN_VLEN >= 
1024")
+  (V1024QI "riscv_vector::vls_mode_valid_p (V1024QImode) && TARGET_MIN_VLEN >= 
2048")
+  (V1HI "riscv_vector::vls_mode_valid_p (V1HImode)")
+  (V2HI "riscv_vector::vls_mode_valid_p (V2HImode)")
+  (V4HI "riscv_vector::vls_mode_valid_p (V4HImode)")
+  (V8HI "riscv_vector::vls_mode_valid_p (V8HImode)")
+  (V16HI "riscv_vector::vls_mode_valid_p (V16HImode)")
+  (V32HI "riscv_vector::vls_mode_valid_p (V32HImode) && TARGET_MIN_VLEN >= 64")
+  (V64HI "riscv_vector::vls_mode_valid_p (V64HImode) && TARGET_MIN_VLEN >= 
128")
+  (V128HI "riscv_vector::vls_mode_valid_p (V128HImode) && TARGET_MIN_VLEN >= 
256")
+  (V256HI "riscv_vector::vls_mode_valid_p (V256HImode) && TARGET_MIN_VLEN >= 
512")
+  (V512HI "riscv_vector::vls_mode_valid_p (V512HImode) && TARGET_MIN_VLEN >= 
1024")
+
+  (V1HF "riscv_vector::vls_mode_valid_p (V1HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V2HF "riscv_vector::vls_mode_valid_p (V2HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V4HF "riscv_vector::vls_mode_valid_p (V4HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V8HF "riscv_vector::vls_mode_valid_p (V8HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V16HF "riscv_vector::vls_mode_valid_p (V16HFmode) && 
TARGET_VECTOR_ELEN_FP_16")
+  (V32HF "riscv_vector::vls_mode_valid_p (V32HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 64")
+  (V64HF "riscv_vector::vls_mode_valid_p (V64HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 128")
+  (V128HF "riscv_vector::vls_mode_valid_p (V128HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 256")
+  (V256HF "riscv_vector::vls_mode_valid_p (V256HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 512")
+  (V512HF "riscv_vector::vls_mode_valid_p (V512HFmode) && 
TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN >= 1024")
+  (V1BF "riscv_vector::vls_mode_valid_p (V1BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V2BF "riscv_vector::vls_mode_valid_p (V2BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V4BF "riscv_vector::vls_mode_valid_p (V4BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V8BF "riscv_vector::vls_mode_valid_p (V8BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V16BF "riscv_vector::vls_mode_valid_p (V16BFmode) && 
TARGET_VECTOR_ELEN_BF_16")
+  (V32BF "riscv_vector::vls_mode_valid_p (V32BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 64")
+  (V64BF "riscv_vector::vls_mode_valid_p (V64BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 128")
+  (V128BF "riscv_vector::vls_mode_valid_p (V128BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 256")
+  (V256BF "riscv_vector::vls_mode_valid_p (V256BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 512")
+  (V512BF "riscv_vector::vls_mode_valid_p (V512BFmode) && 
TARGET_VECTOR_ELEN_BF_16 && TARGET_MIN_VLEN >= 1024")
 ])
 
 (define_mode_iterator VEEWTRUNC8 [
@@ -412,6 +667,17 @@ (define_mode_iterator VEEWTRUNC8 [
   (RVVMF2QI "TARGET_64BIT")
   (RVVMF4QI "TARGET_64BIT")
   (RVVMF8QI "TARGET_VECTOR_ELEN_64 && TARGET_64BIT")
+
+  (V1QI "riscv_vector::vls_mode_valid_p (V1QImode)")
+  (V2QI "riscv_vector::vls_mode_valid_p (V2QImode)")
+  (V4QI "riscv_vector::vls_mode_valid_p (V4QImode)")
+  (V8QI "riscv_vector::vls_mode_valid_p (V8QImode)")
+  (V16QI "riscv_vector::vls_mode_valid_p (V16QImode)")
+  (V32QI "riscv_vector::vls_mode_valid_p (V32QImode) && TARGET_MIN_VLEN >= 64")
+  (V64QI "riscv_vector::vls_mode_valid_p (V64QImode) && TARGET_MIN_VLEN >= 
128")
+  (V128QI "riscv_vector::vls_mode_valid_p (V128QImode) && TARGET_MIN_VLEN >= 
256")
+  (V256QI "riscv_vector::vls_mode_valid_p (V256QImode) && TARGET_MIN_VLEN >= 
512")
+  (V512QI "riscv_vector::vls_mode_valid_p (V512QImode) && TARGET_MIN_VLEN >= 
1024")
 ])
 
 (define_mode_iterator VEI16 [
@@ -1920,6 +2186,117 @@ (define_mode_attr VINDEX [
   (V512DF "V512DI")
 ])
 
+(define_mode_attr vindex [
+  (RVVM8QI "rvvm8qi") (RVVM4QI "rvvm4qi") (RVVM2QI "rvvm2qi") (RVVM1QI 
"rvvm1qi")
+  (RVVMF2QI "rvvmf2qi") (RVVMF4QI "rvvmf4qi") (RVVMF8QI "rvvmf8qi")
+
+  (RVVM8HI "rvvm8hi") (RVVM4HI "rvvm4hi") (RVVM2HI "rvvm2hi") (RVVM1HI 
"rvvm1hi") (RVVMF2HI "rvvmf2hi") (RVVMF4HI "rvvmf4hi")
+
+  (RVVM8BF "rvvm8hi") (RVVM4BF "rvvm4hi") (RVVM2BF "rvvm2hi") (RVVM1BF 
"rvvm1hi") (RVVMF2BF "rvvmf2hi") (RVVMF4BF "rvvmf4hi")
+
+  (RVVM8HF "rvvm8hi") (RVVM4HF "rvvm4hi") (RVVM2HF "rvvm2hi") (RVVM1HF 
"rvvm1hi") (RVVMF2HF "rvvmf2hi") (RVVMF4HF "rvvmf4hi")
+
+  (RVVM8SI "rvvm8si") (RVVM4SI "rvvm4si") (RVVM2SI "rvvm2si") (RVVM1SI 
"rvvm1si") (RVVMF2SI "rvvmf2si")
+
+  (RVVM8SF "rvvm8si") (RVVM4SF "rvvm4si") (RVVM2SF "rvvm2si") (RVVM1SF 
"rvvm1si") (RVVMF2SF "rvvmf2si")
+
+  (RVVM8DI "rvvm8di") (RVVM4DI "rvvm4di") (RVVM2DI "rvvm2di") (RVVM1DI 
"rvvm1di")
+
+  (RVVM8DF "rvvm8di") (RVVM4DF "rvvm4di") (RVVM2DF "rvvm2di") (RVVM1DF 
"rvvm1di")
+
+  (V1QI "v1qi")
+  (V2QI "v2qi")
+  (V4QI "v4qi")
+  (V8QI "v8qi")
+  (V16QI "v16qi")
+  (V32QI "v32qi")
+  (V64QI "v64qi")
+  (V128QI "v128qi")
+  (V256QI "v256qi")
+  (V512QI "v512qi")
+  (V1024QI "v1024qi")
+  (V2048QI "v2048qi")
+  (V4096QI "v4096qi")
+  (V1HI "v1hi")
+  (V2HI "v2hi")
+  (V4HI "v4hi")
+  (V8HI "v8hi")
+  (V16HI "v16hi")
+  (V32HI "v32hi")
+  (V64HI "v64hi")
+  (V128HI "v128hi")
+  (V256HI "v256hi")
+  (V512HI "v512hi")
+  (V1024HI "v1024hi")
+  (V2048HI "v2048hi")
+  (V1SI "v1si")
+  (V2SI "v2si")
+  (V4SI "v4si")
+  (V8SI "V8SI")
+  (V16SI "v16si")
+  (V32SI "v32si")
+  (V64SI "v64si")
+  (V128SI "v128si")
+  (V256SI "v256si")
+  (V512SI "v512si")
+  (V1024SI "v1024si")
+  (V1DI "v1di")
+  (V2DI "v2di")
+  (V4DI "v4di")
+  (V8DI "v8di")
+  (V16DI "v16di")
+  (V32DI "v32di")
+  (V64DI "v64di")
+  (V128DI "v128di")
+  (V256DI "v256di")
+  (V512DI "v512di")
+  (V1HF "v1hi")
+  (V2HF "v2hi")
+  (V4HF "v4hi")
+  (V8HF "v8hi")
+  (V16HF "v16hi")
+  (V32HF "v32hi")
+  (V64HF "v64hi")
+  (V128HF "v128hi")
+  (V256HF "v256hi")
+  (V512HF "v512hi")
+  (V1024HF "v1024hi")
+  (V2048HF "v2048hi")
+  (V1BF "v1hi")
+  (V2BF "v2hi")
+  (V4BF "v4hi")
+  (V8BF "v8hi")
+  (V16BF "v16hi")
+  (V32BF "v32hi")
+  (V64BF "v64hi")
+  (V128BF "v128hi")
+  (V256BF "v256hi")
+  (V512BF "v512hi")
+  (V1024BF "v1024hi")
+  (V2048BF "v2048hi")
+  (V1SF "v1si")
+  (V2SF "v2si")
+  (V4SF "v4si")
+  (V8SF "v8si")
+  (V16SF "v16si")
+  (V32SF "v32si")
+  (V64SF "v64si")
+  (V128SF "v128si")
+  (V256SF "v256si")
+  (V512SF "v512si")
+  (V1024SF "v1024si")
+  (V1DF "v1di")
+  (V2DF "v2di")
+  (V4DF "v4di")
+  (V8DF "v8di")
+  (V16DF "v16di")
+  (V32DF "v32di")
+  (V64DF "v64di")
+  (V128DF "v128di")
+  (V256DF "v256di")
+  (V512DF "v512di")
+])
+
 (define_mode_attr VINDEXEI16 [
   (RVVM4QI "RVVM8HI") (RVVM2QI "RVVM4HI") (RVVM1QI "RVVM2HI") (RVVMF2QI 
"RVVM1HI") (RVVMF4QI "RVVMF2HI") (RVVMF8QI "RVVMF4HI")
 
@@ -2775,6 +3152,85 @@ (define_mode_attr double_trunc_sew [
   (RVVM8DI "32") (RVVM4DI "32") (RVVM2DI "32") (RVVM1DI "32")
 
   (RVVM8DF "32") (RVVM4DF "32") (RVVM2DF "32") (RVVM1DF "32")
+
+  (V1HI "8")
+  (V2HI "8")
+  (V4HI "8")
+  (V8HI "8")
+  (V16HI "8")
+  (V32HI "8")
+  (V64HI "8")
+  (V128HI "8")
+  (V256HI "8")
+  (V512HI "8")
+  (V1024HI "8")
+  (V2048HI "8")
+  (V1SI "16")
+  (V2SI "16")
+  (V4SI "16")
+  (V8SI "16")
+  (V16SI "16")
+  (V32SI "16")
+  (V64SI "16")
+  (V128SI "16")
+  (V256SI "16")
+  (V512SI "16")
+  (V1024SI "16")
+  (V1DI "32")
+  (V2DI "32")
+  (V4DI "32")
+  (V8DI "32")
+  (V16DI "32")
+  (V32DI "32")
+  (V64DI "32")
+  (V128DI "32")
+  (V256DI "32")
+  (V512DI "32")
+  (V1HF "8")
+  (V2HF "8")
+  (V4HF "8")
+  (V8HF "8")
+  (V16HF "8")
+  (V32HF "8")
+  (V64HF "8")
+  (V128HF "8")
+  (V256HF "8")
+  (V512HF "8")
+  (V1024HF "8")
+  (V2048HF "8")
+  (V1BF "8")
+  (V2BF "8")
+  (V4BF "8")
+  (V8BF "8")
+  (V16BF "8")
+  (V32BF "8")
+  (V64BF "8")
+  (V128BF "8")
+  (V256BF "8")
+  (V512BF "8")
+  (V1024BF "8")
+  (V2048BF "8")
+  (V1SF "16")
+  (V2SF "16")
+  (V4SF "16")
+  (V8SF "16")
+  (V16SF "16")
+  (V32SF "16")
+  (V64SF "16")
+  (V128SF "16")
+  (V256SF "16")
+  (V512SF "16")
+  (V1024SF "16")
+  (V1DF "32")
+  (V2DF "32")
+  (V4DF "32")
+  (V8DF "32")
+  (V16DF "32")
+  (V32DF "32")
+  (V64DF "32")
+  (V128DF "32")
+  (V256DF "32")
+  (V512DF "32")
 ])
 
 (define_mode_attr quad_trunc_sew [
@@ -2785,12 +3241,76 @@ (define_mode_attr quad_trunc_sew [
   (RVVM8DI "16") (RVVM4DI "16") (RVVM2DI "16") (RVVM1DI "16")
 
   (RVVM8DF "16") (RVVM4DF "16") (RVVM2DF "16") (RVVM1DF "16")
+
+  (V1SI "8")
+  (V2SI "8")
+  (V4SI "8")
+  (V8SI "8")
+  (V16SI "8")
+  (V32SI "8")
+  (V64SI "8")
+  (V128SI "8")
+  (V256SI "8")
+  (V512SI "8")
+  (V1024SI "8")
+  (V1DI "16")
+  (V2DI "16")
+  (V4DI "16")
+  (V8DI "16")
+  (V16DI "16")
+  (V32DI "16")
+  (V64DI "16")
+  (V128DI "16")
+  (V256DI "16")
+  (V512DI "16")
+  (V1SF "8")
+  (V2SF "8")
+  (V4SF "8")
+  (V8SF "8")
+  (V16SF "8")
+  (V32SF "8")
+  (V64SF "8")
+  (V128SF "8")
+  (V256SF "8")
+  (V512SF "8")
+  (V1024SF "8")
+  (V1DF "16")
+  (V2DF "16")
+  (V4DF "16")
+  (V8DF "16")
+  (V16DF "16")
+  (V32DF "16")
+  (V64DF "16")
+  (V128DF "16")
+  (V256DF "16")
+  (V512DF "16")
 ])
 
 (define_mode_attr oct_trunc_sew [
   (RVVM8DI "8") (RVVM4DI "8") (RVVM2DI "8") (RVVM1DI "8")
 
   (RVVM8DF "8") (RVVM4DF "8") (RVVM2DF "8") (RVVM1DF "8")
+
+  (V1DI "8")
+  (V2DI "8")
+  (V4DI "8")
+  (V8DI "8")
+  (V16DI "8")
+  (V32DI "8")
+  (V64DI "8")
+  (V128DI "8")
+  (V256DI "8")
+  (V512DI "8")
+  (V1DF "8")
+  (V2DF "8")
+  (V4DF "8")
+  (V8DF "8")
+  (V16DF "8")
+  (V32DF "8")
+  (V64DF "8")
+  (V128DF "8")
+  (V256DF "8")
+  (V512DF "8")
 ])
 
 (define_mode_attr double_ext_sew [
@@ -2805,6 +3325,72 @@ (define_mode_attr double_ext_sew [
   (RVVM4SI "64") (RVVM2SI "64") (RVVM1SI "64") (RVVMF2SI "64")
 
   (RVVM4SF "64") (RVVM2SF "64") (RVVM1SF "64") (RVVMF2SF "64")
+
+  (V1QI "16")
+  (V2QI "16")
+  (V4QI "16")
+  (V8QI "16")
+  (V16QI "16")
+  (V32QI "16")
+  (V64QI "16")
+  (V128QI "16")
+  (V256QI "16")
+  (V512QI "16")
+  (V1024QI "16")
+  (V2048QI "16")
+  (V1HI "32")
+  (V2HI "32")
+  (V4HI "32")
+  (V8HI "32")
+  (V16HI "32")
+  (V32HI "32")
+  (V64HI "32")
+  (V128HI "32")
+  (V256HI "32")
+  (V512HI "32")
+  (V1024HI "32")
+  (V1SI "64")
+  (V2SI "64")
+  (V4SI "64")
+  (V8SI "64")
+  (V16SI "64")
+  (V32SI "64")
+  (V64SI "64")
+  (V128SI "64")
+  (V256SI "64")
+  (V512SI "64")
+  (V1HF "32")
+  (V2HF "32")
+  (V4HF "32")
+  (V8HF "32")
+  (V16HF "32")
+  (V32HF "32")
+  (V64HF "32")
+  (V128HF "32")
+  (V256HF "32")
+  (V512HF "32")
+  (V1024HF "32")
+  (V1BF "32")
+  (V2BF "32")
+  (V4BF "32")
+  (V8BF "32")
+  (V16BF "32")
+  (V32BF "32")
+  (V64BF "32")
+  (V128BF "32")
+  (V256BF "32")
+  (V512BF "32")
+  (V1024BF "32")
+  (V1SF "64")
+  (V2SF "64")
+  (V4SF "64")
+  (V8SF "64")
+  (V16SF "64")
+  (V32SF "64")
+  (V64SF "64")
+  (V128SF "64")
+  (V256SF "64")
+  (V512SF "64")
 ])
 
 (define_mode_attr quad_ext_sew [
@@ -2813,10 +3399,63 @@ (define_mode_attr quad_ext_sew [
   (RVVM2HI "64") (RVVM1HI "64") (RVVMF2HI "64") (RVVMF4HI "64")
 
   (RVVM2HF "64") (RVVM1HF "64") (RVVMF2HF "64") (RVVMF4HF "64")
+
+  (V1QI "32")
+  (V2QI "32")
+  (V4QI "32")
+  (V8QI "32")
+  (V16QI "32")
+  (V32QI "32")
+  (V64QI "32")
+  (V128QI "32")
+  (V256QI "32")
+  (V512QI "32")
+  (V1024QI "32")
+  (V1HI "64")
+  (V2HI "64")
+  (V4HI "64")
+  (V8HI "64")
+  (V16HI "64")
+  (V32HI "64")
+  (V64HI "64")
+  (V128HI "64")
+  (V256HI "64")
+  (V512HI "64")
+  (V1HF "64")
+  (V2HF "64")
+  (V4HF "64")
+  (V8HF "64")
+  (V16HF "64")
+  (V32HF "64")
+  (V64HF "64")
+  (V128HF "64")
+  (V256HF "64")
+  (V512HF "64")
+  (V1BF "64")
+  (V2BF "64")
+  (V4BF "64")
+  (V8BF "64")
+  (V16BF "64")
+  (V32BF "64")
+  (V64BF "64")
+  (V128BF "64")
+  (V256BF "64")
+  (V512BF "64")
 ])
 
 (define_mode_attr oct_ext_sew [
   (RVVM1QI "64") (RVVMF2QI "64") (RVVMF4QI "64") (RVVMF8QI "64")
+
+  (V1QI "64")
+  (V2QI "64")
+  (V4QI "64")
+  (V8QI "64")
+  (V16QI "64")
+  (V32QI "64")
+  (V64QI "64")
+  (V128QI "64")
+  (V256QI "64")
+  (V512QI "64")
 ])
 
 (define_mode_attr V_DOUBLE_EXTEND [
@@ -2953,6 +3592,34 @@ (define_mode_attr V_DOUBLE_TRUNC [
   (V512DF "V512SF")
 ])
 
+(define_mode_attr VF_DOUBLE_TRUNC_INDEX [
+  (RVVM8SF "RVVM4HI") (RVVM4SF "RVVM2HI") (RVVM2SF "RVVM1HI") (RVVM1SF 
"RVVMF2HI") (RVVMF2SF "RVVMF4HI")
+
+  (RVVM8DF "RVVM4SI") (RVVM4DF "RVVM2SI") (RVVM2DF "RVVM1SI") (RVVM1DF 
"RVVMF2SI")
+
+  (V1SF "V1HI")
+  (V2SF "V2HI")
+  (V4SF "V4HI")
+  (V8SF "V8HI")
+  (V16SF "V16HI")
+  (V32SF "V32HI")
+  (V64SF "V64HI")
+  (V128SF "V128HI")
+  (V256SF "V256HI")
+  (V512SF "V512HI")
+  (V1024SF "V1024HI")
+  (V1DF "V1SI")
+  (V2DF "V2SI")
+  (V4DF "V4SI")
+  (V8DF "V8SI")
+  (V16DF "V16SI")
+  (V32DF "V32SI")
+  (V64DF "V64SI")
+  (V128DF "V128SI")
+  (V256DF "V256SI")
+  (V512DF "V512SI")
+])
+
 (define_mode_attr V_QUAD_TRUNC [
   (RVVM8SI "RVVM2QI") (RVVM4SI "RVVM1QI") (RVVM2SI "RVVMF2QI") (RVVM1SI 
"RVVMF4QI") (RVVMF2SI "RVVMF8QI")
 
@@ -2993,32 +3660,253 @@ (define_mode_attr V_QUAD_TRUNC [
   (V512DF "V512HF")
 ])
 
-(define_mode_attr V_OCT_TRUNC [
-  (RVVM8DI "RVVM1QI") (RVVM4DI "RVVMF2QI") (RVVM2DI "RVVMF4QI") (RVVM1DI 
"RVVMF8QI")
+(define_mode_attr V_OCT_TRUNC [
+  (RVVM8DI "RVVM1QI") (RVVM4DI "RVVMF2QI") (RVVM2DI "RVVMF4QI") (RVVM1DI 
"RVVMF8QI")
+
+  (V1DI "V1QI")
+  (V2DI "V2QI")
+  (V4DI "V4QI")
+  (V8DI "V8QI")
+  (V16DI "V16QI")
+  (V32DI "V32QI")
+  (V64DI "V64QI")
+  (V128DI "V128QI")
+  (V256DI "V256QI")
+  (V512DI "V512QI")
+])
+
+; Again in lower case.
+(define_mode_attr v_double_trunc [
+  (RVVM8HI "rvvm4qi") (RVVM4HI "rvvm2qi") (RVVM2HI "rvvm1qi") (RVVM1HI 
"rvvmf2qi") (RVVMF2HI "rvvmf4qi") (RVVMF4HI "rvvmf8qi")
+
+  (RVVM8SI "rvvm4hi") (RVVM4SI "rvvm2hi") (RVVM2SI "rvvm1hi") (RVVM1SI 
"rvvmf2hi") (RVVMF2SI "rvvmf4hi")
+
+  (RVVM8SF "rvvm4hf") (RVVM4SF "rvvm2hf") (RVVM2SF "rvvm1hf") (RVVM1SF 
"rvvmf2hf") (RVVMF2SF "rvvmf4hf")
+
+  (RVVM8DI "rvvm4si") (RVVM4DI "rvvm2si") (RVVM2DI "rvvm1si") (RVVM1DI 
"rvvmf2si")
+
+  (RVVM8DF "rvvm4sf") (RVVM4DF "rvvm2sf") (RVVM2DF "rvvm1sf") (RVVM1DF 
"rvvmf2sf")
+
+  (V1HI "v1qi")
+  (V2HI "v2qi")
+  (V4HI "v4qi")
+  (V8HI "v8qi")
+  (V16HI "v16qi")
+  (V32HI "v32qi")
+  (V64HI "v64qi")
+  (V128HI "v128qi")
+  (V256HI "v256qi")
+  (V512HI "v512qi")
+  (V1024HI "v1024qi")
+  (V2048HI "v2048qi")
+  (V1SI "v1hi")
+  (V2SI "v2hi")
+  (V4SI "v4hi")
+  (V8SI "v8hi")
+  (V16SI "v16hi")
+  (V32SI "v32hi")
+  (V64SI "v64hi")
+  (V128SI "v128hi")
+  (V256SI "v256hi")
+  (V512SI "v512hi")
+  (V1024SI "v1024hi")
+  (V1DI "v1si")
+  (V2DI "v2si")
+  (V4DI "v4si")
+  (V8DI "v8si")
+  (V16DI "v16si")
+  (V32DI "v32si")
+  (V64DI "v64si")
+  (V128DI "v128si")
+  (V256DI "v256si")
+  (V512DI "v512si")
+  (V1SF "v1hf")
+  (V2SF "v2hf")
+  (V4SF "v4hf")
+  (V8SF "v8hf")
+  (V16SF "v16hf")
+  (V32SF "v32hf")
+  (V64SF "v64hf")
+  (V128SF "v128hf")
+  (V256SF "v256hf")
+  (V512SF "v512hf")
+  (V1024SF "v1024hf")
+  (V1DF "v1sf")
+  (V2DF "v2sf")
+  (V4DF "v4sf")
+  (V8DF "v8sf")
+  (V16DF "v16sf")
+  (V32DF "v32sf")
+  (V64DF "v64sf")
+  (V128DF "v128sf")
+  (V256DF "v256sf")
+  (V512DF "v512sf")
+])
+
+(define_mode_attr v_quad_trunc [
+  (RVVM8SI "rvvm2qi") (RVVM4SI "rvvm1qi") (RVVM2SI "rvvmf2qi") (RVVM1SI 
"rvvmf4qi") (RVVMF2SI "rvvmf8qi")
+
+  (RVVM8DI "rvvm2hi") (RVVM4DI "rvvm1hi") (RVVM2DI "rvvmf2hi") (RVVM1DI 
"rvvmf4hi")
+
+  (RVVM8DF "rvvm2hf") (RVVM4DF "rvvm1hf") (RVVM2DF "rvvmf2hf") (RVVM1DF 
"rvvmf4hf")
+
+  (V1SI "v1qi")
+  (V2SI "v2qi")
+  (V4SI "v4qi")
+  (V8SI "v8qi")
+  (V16SI "v16qi")
+  (V32SI "v32qi")
+  (V64SI "v64qi")
+  (V128SI "v128qi")
+  (V256SI "v256qi")
+  (V512SI "v512qi")
+  (V1024SI "v1024qi")
+  (V1DI "v1hi")
+  (V2DI "v2hi")
+  (V4DI "v4hi")
+  (V8DI "v8hi")
+  (V16DI "v16hi")
+  (V32DI "v32hi")
+  (V64DI "v64hi")
+  (V128DI "v128hi")
+  (V256DI "v256hi")
+  (V512DI "v512hi")
+  (V1DF "v1hf")
+  (V2DF "v2hf")
+  (V4DF "v4hf")
+  (V8DF "v8hf")
+  (V16DF "v16hf")
+  (V32DF "v32hf")
+  (V64DF "v64hf")
+  (V128DF "v128hf")
+  (V256DF "v256hf")
+  (V512DF "v512hf")
+])
+
+(define_mode_attr v_oct_trunc [
+  (RVVM8DI "rvvm1qi") (RVVM4DI "rvvmf2qi") (RVVM2DI "rvvmf4qi") (RVVM1DI 
"rvvmf8qi")
+
+  (V1DI "v1qi")
+  (V2DI "v2qi")
+  (V4DI "v4qi")
+  (V8DI "v8qi")
+  (V16DI "v16qi")
+  (V32DI "v32qi")
+  (V64DI "v64qi")
+  (V128DI "v128qi")
+  (V256DI "v256qi")
+  (V512DI "v512qi")
+])
+
+(define_mode_attr VINDEX_DOUBLE_TRUNC [
+  (RVVM8HI "RVVM4QI") (RVVM4HI "RVVM2QI") (RVVM2HI "RVVM1QI") (RVVM1HI 
"RVVMF2QI") (RVVMF2HI "RVVMF4QI") (RVVMF4HI "RVVMF8QI")
+
+  (RVVM8BF "RVVM4QI") (RVVM4BF "RVVM2QI") (RVVM2BF "RVVM1QI") (RVVM1BF 
"RVVMF2QI") (RVVMF2BF "RVVMF4QI") (RVVMF4BF "RVVMF8QI")
+
+  (RVVM8HF "RVVM4QI") (RVVM4HF "RVVM2QI") (RVVM2HF "RVVM1QI") (RVVM1HF 
"RVVMF2QI") (RVVMF2HF "RVVMF4QI") (RVVMF4HF "RVVMF8QI")
+
+  (RVVM8SI "RVVM4HI") (RVVM4SI "RVVM2HI") (RVVM2SI "RVVM1HI") (RVVM1SI 
"RVVMF2HI") (RVVMF2SI "RVVMF4HI")
+
+  (RVVM8SF "RVVM4HI") (RVVM4SF "RVVM2HI") (RVVM2SF "RVVM1HI") (RVVM1SF 
"RVVMF2HI") (RVVMF2SF "RVVMF4HI")
+
+  (RVVM8DI "RVVM4SI") (RVVM4DI "RVVM2SI") (RVVM2DI "RVVM1SI") (RVVM1DI 
"RVVMF2SI")
+
+  (RVVM8DF "RVVM4SI") (RVVM4DF "RVVM2SI") (RVVM2DF "RVVM1SI") (RVVM1DF 
"RVVMF2SI")
+
+  (V1HI "V1QI")
+  (V2HI "V2QI")
+  (V4HI "V4QI")
+  (V8HI "V8QI")
+  (V16HI "V16QI")
+  (V32HI "V32QI")
+  (V64HI "V64QI")
+  (V128HI "V128QI")
+  (V256HI "V256QI")
+  (V512HI "V512QI")
+  (V1024HI "V1024QI")
+  (V2048HI "V2048QI")
+  (V1SI "V1HI")
+  (V2SI "V2HI")
+  (V4SI "V4HI")
+  (V8SI "V8HI")
+  (V16SI "V16HI")
+  (V32SI "V32HI")
+  (V64SI "V64HI")
+  (V128SI "V128HI")
+  (V256SI "V256HI")
+  (V512SI "V512HI")
+  (V1024SI "V1024HI")
+  (V1DI "V1SI")
+  (V2DI "V2SI")
+  (V4DI "V4SI")
+  (V8DI "V8SI")
+  (V16DI "V16SI")
+  (V32DI "V32SI")
+  (V64DI "V64SI")
+  (V128DI "V128SI")
+  (V256DI "V256SI")
+  (V512DI "V512SI")
+  (V1HF "V1QI")
+  (V2HF "V2QI")
+  (V4HF "V4QI")
+  (V8HF "V8QI")
+  (V16HF "V16QI")
+  (V32HF "V32QI")
+  (V64HF "V64QI")
+  (V128HF "V128QI")
+  (V256HF "V256QI")
+  (V512HF "V512QI")
+  (V1024HF "V1024QI")
+  (V2048HF "V2048QI")
+  (V1BF "V1QI")
+  (V2BF "V2QI")
+  (V4BF "V4QI")
+  (V8BF "V8QI")
+  (V16BF "V16QI")
+  (V32BF "V32QI")
+  (V64BF "V64QI")
+  (V128BF "V128QI")
+  (V256BF "V256QI")
+  (V512BF "V512QI")
+  (V1024BF "V1024QI")
+  (V2048BF "V2048QI")
+  (V1SF "V1HI")
+  (V2SF "V2HI")
+  (V4SF "V4HI")
+  (V8SF "V8HI")
+  (V16SF "V16HI")
+  (V32SF "V32HI")
+  (V64SF "V64HI")
+  (V128SF "V128HI")
+  (V256SF "V256HI")
+  (V512SF "V512HI")
+  (V1024SF "V1024HI")
+  (V1DF "V1SI")
+  (V2DF "V2SI")
+  (V4DF "V4SI")
+  (V8DF "V8SI")
+  (V16DF "V16SI")
+  (V32DF "V32SI")
+  (V64DF "V64SI")
+  (V128DF "V128SI")
+  (V256DF "V256SI")
+  (V512DF "V512SI")
+])
+
+(define_mode_attr vindex_double_trunc [
+  (RVVM8HI "rvvm4qi") (RVVM4HI "rvvm2qi") (RVVM2HI "rvvm1qi") (RVVM1HI 
"rvvmf2qi") (RVVMF2HI "rvvmf4qi") (RVVMF4HI "rvvmf8qi")
 
-  (V1DI "V1QI")
-  (V2DI "V2QI")
-  (V4DI "V4QI")
-  (V8DI "V8QI")
-  (V16DI "V16QI")
-  (V32DI "V32QI")
-  (V64DI "V64QI")
-  (V128DI "V128QI")
-  (V256DI "V256QI")
-  (V512DI "V512QI")
-])
+  (RVVM8BF "rvvm4qi") (RVVM4BF "rvvm2qi") (RVVM2BF "rvvm1qi") (RVVM1BF 
"rvvmf2qi") (RVVMF2BF "rvvmf4qi") (RVVMF4BF "rvvmf8qi")
 
-; Again in lower case.
-(define_mode_attr v_double_trunc [
-  (RVVM8HI "rvvm4qi") (RVVM4HI "rvvm2qi") (RVVM2HI "rvvm1qi") (RVVM1HI 
"rvvmf2qi") (RVVMF2HI "rvvmf4qi") (RVVMF4HI "rvvmf8qi")
+  (RVVM8HF "rvvm4qi") (RVVM4HF "rvvm2qi") (RVVM2HF "rvvm1qi") (RVVM1HF 
"rvvmf2qi") (RVVMF2HF "rvvmf4qi") (RVVMF4HF "rvvmf8qi")
 
   (RVVM8SI "rvvm4hi") (RVVM4SI "rvvm2hi") (RVVM2SI "rvvm1hi") (RVVM1SI 
"rvvmf2hi") (RVVMF2SI "rvvmf4hi")
 
-  (RVVM8SF "rvvm4hf") (RVVM4SF "rvvm2hf") (RVVM2SF "rvvm1hf") (RVVM1SF 
"rvvmf2hf") (RVVMF2SF "rvvmf4hf")
+  (RVVM8SF "rvvm4hi") (RVVM4SF "rvvm2hi") (RVVM2SF "rvvm1hi") (RVVM1SF 
"rvvmf2hi") (RVVMF2SF "rvvmf4hi")
 
   (RVVM8DI "rvvm4si") (RVVM4DI "rvvm2si") (RVVM2DI "rvvm1si") (RVVM1DI 
"rvvmf2si")
 
-  (RVVM8DF "rvvm4sf") (RVVM4DF "rvvm2sf") (RVVM2DF "rvvm1sf") (RVVM1DF 
"rvvmf2sf")
+  (RVVM8DF "rvvm4si") (RVVM4DF "rvvm2si") (RVVM2DF "rvvm1si") (RVVM1DF 
"rvvmf2si")
 
   (V1HI "v1qi")
   (V2HI "v2qi")
@@ -3053,35 +3941,114 @@ (define_mode_attr v_double_trunc [
   (V128DI "v128si")
   (V256DI "v256si")
   (V512DI "v512si")
-  (V1SF "v1hf")
-  (V2SF "v2hf")
-  (V4SF "v4hf")
-  (V8SF "v8hf")
-  (V16SF "v16hf")
-  (V32SF "v32hf")
-  (V64SF "v64hf")
-  (V128SF "v128hf")
-  (V256SF "v256hf")
-  (V512SF "v512hf")
-  (V1024SF "v1024hf")
-  (V1DF "v1sf")
-  (V2DF "v2sf")
-  (V4DF "v4sf")
-  (V8DF "v8sf")
-  (V16DF "v16sf")
-  (V32DF "v32sf")
-  (V64DF "v64sf")
-  (V128DF "v128sf")
-  (V256DF "v256sf")
-  (V512DF "v512sf")
+  (V1HF "v1qi")
+  (V2HF "v2qi")
+  (V4HF "v4qi")
+  (V8HF "v8qi")
+  (V16HF "v16qi")
+  (V32HF "v32qi")
+  (V64HF "v64qi")
+  (V128HF "v128qi")
+  (V256HF "v256qi")
+  (V512HF "v512qi")
+  (V1024HF "v1024qi")
+  (V2048HF "v2048qi")
+  (V1BF "v1qi")
+  (V2BF "v2qi")
+  (V4BF "v4qi")
+  (V8BF "v8qi")
+  (V16BF "v16qi")
+  (V32BF "v32qi")
+  (V64BF "v64qi")
+  (V128BF "v128qi")
+  (V256BF "v256qi")
+  (V512BF "v512qi")
+  (V1024BF "v1024qi")
+  (V2048BF "v2048qi")
+  (V1SF "v1hi")
+  (V2SF "v2hi")
+  (V4SF "v4hi")
+  (V8SF "v8hi")
+  (V16SF "v16hi")
+  (V32SF "v32hi")
+  (V64SF "v64hi")
+  (V128SF "v128hi")
+  (V256SF "v256hi")
+  (V512SF "v512hi")
+  (V1024SF "v1024hi")
+  (V1DF "v1si")
+  (V2DF "v2si")
+  (V4DF "v4si")
+  (V8DF "v8si")
+  (V16DF "v16si")
+  (V32DF "v32si")
+  (V64DF "v64si")
+  (V128DF "v128si")
+  (V256DF "v256si")
+  (V512DF "v512si")
 ])
 
-(define_mode_attr v_quad_trunc [
+(define_mode_attr VINDEX_QUAD_TRUNC [
+  (RVVM8SI "RVVM2QI") (RVVM4SI "RVVM1QI") (RVVM2SI "RVVMF2QI") (RVVM1SI 
"RVVMF4QI") (RVVMF2SI "RVVMF8QI")
+
+  (RVVM8SF "RVVM2QI") (RVVM4SF "RVVM1QI") (RVVM2SF "RVVMF2QI") (RVVM1SF 
"RVVMF4QI") (RVVMF2SF "RVVMF8QI")
+
+  (RVVM8DI "RVVM2HI") (RVVM4DI "RVVM1HI") (RVVM2DI "RVVMF2HI") (RVVM1DI 
"RVVMF4HI")
+
+  (RVVM8DF "RVVM2HI") (RVVM4DF "RVVM1HI") (RVVM2DF "RVVMF2HI") (RVVM1DF 
"RVVMF4HI")
+
+  (V1SI "V1QI")
+  (V2SI "V2QI")
+  (V4SI "V4QI")
+  (V8SI "V8QI")
+  (V16SI "V16QI")
+  (V32SI "V32QI")
+  (V64SI "V64QI")
+  (V128SI "V128QI")
+  (V256SI "V256QI")
+  (V512SI "V512QI")
+  (V1024SI "V1024QI")
+  (V1DI "V1HI")
+  (V2DI "V2HI")
+  (V4DI "V4HI")
+  (V8DI "V8HI")
+  (V16DI "V16HI")
+  (V32DI "V32HI")
+  (V64DI "V64HI")
+  (V128DI "V128HI")
+  (V256DI "V256HI")
+  (V512DI "V512HI")
+  (V1SF "V1QI")
+  (V2SF "V2QI")
+  (V4SF "V4QI")
+  (V8SF "V8QI")
+  (V16SF "V16QI")
+  (V32SF "V32QI")
+  (V64SF "V64QI")
+  (V128SF "V128QI")
+  (V256SF "V256QI")
+  (V512SF "V512QI")
+  (V1024SF "V512QI")
+  (V1DF "V1HI")
+  (V2DF "V2HI")
+  (V4DF "V4HI")
+  (V8DF "V8HI")
+  (V16DF "V16HI")
+  (V32DF "V32HI")
+  (V64DF "V64HI")
+  (V128DF "V128HI")
+  (V256DF "V256HI")
+  (V512DF "V512HI")
+])
+
+(define_mode_attr vindex_quad_trunc [
   (RVVM8SI "rvvm2qi") (RVVM4SI "rvvm1qi") (RVVM2SI "rvvmf2qi") (RVVM1SI 
"rvvmf4qi") (RVVMF2SI "rvvmf8qi")
 
+  (RVVM8SF "rvvm2qi") (RVVM4SF "rvvm1qi") (RVVM2SF "rvvmf2qi") (RVVM1SF 
"rvvmf4qi") (RVVMF2SF "rvvmf8qi")
+
   (RVVM8DI "rvvm2hi") (RVVM4DI "rvvm1hi") (RVVM2DI "rvvmf2hi") (RVVM1DI 
"rvvmf4hi")
 
-  (RVVM8DF "rvvm2hf") (RVVM4DF "rvvm1hf") (RVVM2DF "rvvmf2hf") (RVVM1DF 
"rvvmf4hf")
+  (RVVM8DF "rvvm2hi") (RVVM4DF "rvvm1hi") (RVVM2DF "rvvmf2hi") (RVVM1DF 
"rvvmf4hi")
 
   (V1SI "v1qi")
   (V2SI "v2qi")
@@ -3104,21 +4071,61 @@ (define_mode_attr v_quad_trunc [
   (V128DI "v128hi")
   (V256DI "v256hi")
   (V512DI "v512hi")
-  (V1DF "v1hf")
-  (V2DF "v2hf")
-  (V4DF "v4hf")
-  (V8DF "v8hf")
-  (V16DF "v16hf")
-  (V32DF "v32hf")
-  (V64DF "v64hf")
-  (V128DF "v128hf")
-  (V256DF "v256hf")
-  (V512DF "v512hf")
+  (V1SF "v1qi")
+  (V2SF "v2qi")
+  (V4SF "v4qi")
+  (V8SF "v8qi")
+  (V16SF "v16qi")
+  (V32SF "v32qi")
+  (V64SF "v64qi")
+  (V128SF "v128qi")
+  (V256SF "v256qi")
+  (V512SF "v512qi")
+  (V1024SF "v512qi")
+  (V1DF "v1hi")
+  (V2DF "v2hi")
+  (V4DF "v4hi")
+  (V8DF "v8hi")
+  (V16DF "v16hi")
+  (V32DF "v32hi")
+  (V64DF "v64hi")
+  (V128DF "v128hi")
+  (V256DF "v256hi")
+  (V512DF "v512hi")
 ])
 
-(define_mode_attr v_oct_trunc [
+(define_mode_attr VINDEX_OCT_TRUNC [
+  (RVVM8DI "RVVM1QI") (RVVM4DI "RVVMF2QI") (RVVM2DI "RVVMF4QI") (RVVM1DI 
"RVVMF8QI")
+
+  (RVVM8DF "RVVM1QI") (RVVM4DF "RVVMF2QI") (RVVM2DF "RVVMF4QI") (RVVM1DF 
"RVVMF8QI")
+
+  (V1DI "V1QI")
+  (V2DI "V2QI")
+  (V4DI "V4QI")
+  (V8DI "V8QI")
+  (V16DI "V16QI")
+  (V32DI "V32QI")
+  (V64DI "V64QI")
+  (V128DI "V128QI")
+  (V256DI "V256QI")
+  (V512DI "V512QI")
+  (V1DF "V1QI")
+  (V2DF "V2QI")
+  (V4DF "V4QI")
+  (V8DF "V8QI")
+  (V16DF "V16QI")
+  (V32DF "V32QI")
+  (V64DF "V64QI")
+  (V128DF "V128QI")
+  (V256DF "V256QI")
+  (V512DF "V512QI")
+])
+
+(define_mode_attr vindex_oct_trunc [
   (RVVM8DI "rvvm1qi") (RVVM4DI "rvvmf2qi") (RVVM2DI "rvvmf4qi") (RVVM1DI 
"rvvmf8qi")
 
+  (RVVM8DF "rvvm1qi") (RVVM4DF "rvvmf2qi") (RVVM2DF "rvvmf4qi") (RVVM1DF 
"rvvmf8qi")
+
   (V1DI "v1qi")
   (V2DI "v2qi")
   (V4DI "v4qi")
@@ -3129,52 +4136,176 @@ (define_mode_attr v_oct_trunc [
   (V128DI "v128qi")
   (V256DI "v256qi")
   (V512DI "v512qi")
+  (V1DF "v1qi")
+  (V2DF "v2qi")
+  (V4DF "v4qi")
+  (V8DF "v8qi")
+  (V16DF "v16qi")
+  (V32DF "v32qi")
+  (V64DF "v64qi")
+  (V128DF "v128qi")
+  (V256DF "v256qi")
+  (V512DF "v512qi")
 ])
 
-(define_mode_attr VINDEX_DOUBLE_TRUNC [
-  (RVVM8HI "RVVM4QI") (RVVM4HI "RVVM2QI") (RVVM2HI "RVVM1QI") (RVVM1HI 
"RVVMF2QI") (RVVMF2HI "RVVMF4QI") (RVVMF4HI "RVVMF8QI")
-
-  (RVVM8BF "RVVM4QI") (RVVM4BF "RVVM2QI") (RVVM2BF "RVVM1QI") (RVVM1BF 
"RVVMF2QI") (RVVMF2BF "RVVMF4QI") (RVVMF4BF "RVVMF8QI")
-
-  (RVVM8HF "RVVM4QI") (RVVM4HF "RVVM2QI") (RVVM2HF "RVVM1QI") (RVVM1HF 
"RVVMF2QI") (RVVMF2HF "RVVMF4QI") (RVVMF4HF "RVVMF8QI")
-
-  (RVVM8SI "RVVM4HI") (RVVM4SI "RVVM2HI") (RVVM2SI "RVVM1HI") (RVVM1SI 
"RVVMF2HI") (RVVMF2SI "RVVMF4HI")
-
-  (RVVM8SF "RVVM4HI") (RVVM4SF "RVVM2HI") (RVVM2SF "RVVM1HI") (RVVM1SF 
"RVVMF2HI") (RVVMF2SF "RVVMF4HI")
-
-  (RVVM8DI "RVVM4SI") (RVVM4DI "RVVM2SI") (RVVM2DI "RVVM1SI") (RVVM1DI 
"RVVMF2SI")
-
-  (RVVM8DF "RVVM4SI") (RVVM4DF "RVVM2SI") (RVVM2DF "RVVM1SI") (RVVM1DF 
"RVVMF2SI")
-])
+(define_mode_attr VINDEX_DOUBLE_EXT [
+  (RVVM4QI "RVVM8HI") (RVVM2QI "RVVM4HI") (RVVM1QI "RVVM2HI") (RVVMF2QI 
"RVVM1HI") (RVVMF4QI "RVVMF2HI") (RVVMF8QI "RVVMF4HI")
 
-(define_mode_attr VINDEX_QUAD_TRUNC [
-  (RVVM8SI "RVVM2QI") (RVVM4SI "RVVM1QI") (RVVM2SI "RVVMF2QI") (RVVM1SI 
"RVVMF4QI") (RVVMF2SI "RVVMF8QI")
+  (RVVM4HI "RVVM8SI") (RVVM2HI "RVVM4SI") (RVVM1HI "RVVM2SI") (RVVMF2HI 
"RVVM1SI") (RVVMF4HI "RVVMF2SI")
 
-  (RVVM8SF "RVVM2QI") (RVVM4SF "RVVM1QI") (RVVM2SF "RVVMF2QI") (RVVM1SF 
"RVVMF4QI") (RVVMF2SF "RVVMF8QI")
+  (RVVM4BF "RVVM8SI") (RVVM2BF "RVVM4SI") (RVVM1BF "RVVM2SI") (RVVMF2BF 
"RVVM1SI") (RVVMF4BF "RVVMF2SI")
 
-  (RVVM8DI "RVVM2HI") (RVVM4DI "RVVM1HI") (RVVM2DI "RVVMF2HI") (RVVM1DI 
"RVVMF4HI")
+  (RVVM4HF "RVVM8SI") (RVVM2HF "RVVM4SI") (RVVM1HF "RVVM2SI") (RVVMF2HF 
"RVVM1SI") (RVVMF4HF "RVVMF2SI")
 
-  (RVVM8DF "RVVM2HI") (RVVM4DF "RVVM1HI") (RVVM2DF "RVVMF2HI") (RVVM1DF 
"RVVMF4HI")
-])
+  (RVVM4SI "RVVM8DI") (RVVM2SI "RVVM4DI") (RVVM1SI "RVVM2DI") (RVVMF2SI 
"RVVM1DI")
 
-(define_mode_attr VINDEX_OCT_TRUNC [
-  (RVVM8DI "RVVM1QI") (RVVM4DI "RVVMF2QI") (RVVM2DI "RVVMF4QI") (RVVM1DI 
"RVVMF8QI")
+  (RVVM4SF "RVVM8DI") (RVVM2SF "RVVM4DI") (RVVM1SF "RVVM2DI") (RVVMF2SF 
"RVVM1DI")
 
-  (RVVM8DF "RVVM1QI") (RVVM4DF "RVVMF2QI") (RVVM2DF "RVVMF4QI") (RVVM1DF 
"RVVMF8QI")
+  (V1QI "V1HI")
+  (V2QI "V2HI")
+  (V4QI "V4HI")
+  (V8QI "V8HI")
+  (V16QI "V16HI")
+  (V32QI "V32HI")
+  (V64QI "V64HI")
+  (V128QI "V128HI")
+  (V256QI "V256HI")
+  (V512QI "V512HI")
+  (V1024QI "V1024HI")
+  (V2048QI "V2048HI")
+  (V1HI "V1SI")
+  (V2HI "V2SI")
+  (V4HI "V4SI")
+  (V8HI "V8SI")
+  (V16HI "V16SI")
+  (V32HI "V32SI")
+  (V64HI "V64SI")
+  (V128HI "V128SI")
+  (V256HI "V256SI")
+  (V512HI "V512SI")
+  (V1024HI "V1024SI")
+  (V1SI "V1DI")
+  (V2SI "V2DI")
+  (V4SI "V4DI")
+  (V8SI "V8DI")
+  (V16SI "V16DI")
+  (V32SI "V32DI")
+  (V64SI "V64DI")
+  (V128SI "V128DI")
+  (V256SI "V256DI")
+  (V512SI "V512DI")
+  (V1HF "V1SI")
+  (V2HF "V2SI")
+  (V4HF "V4SI")
+  (V8HF "V8SI")
+  (V16HF "V16SI")
+  (V32HF "V32SI")
+  (V64HF "V64SI")
+  (V128HF "V128SI")
+  (V256HF "V256SI")
+  (V512HF "V512SI")
+  (V1024HF "V1024SI")
+  (V1BF "V1SI")
+  (V2BF "V2SI")
+  (V4BF "V4SI")
+  (V8BF "V8SI")
+  (V16BF "V16SI")
+  (V32BF "V32SI")
+  (V64BF "V64SI")
+  (V128BF "V128SI")
+  (V256BF "V256SI")
+  (V512BF "V512SI")
+  (V1024BF "V1024SI")
+  (V1SF "V1DI")
+  (V2SF "V2DI")
+  (V4SF "V4DI")
+  (V8SF "V8DI")
+  (V16SF "V16DI")
+  (V32SF "V32DI")
+  (V64SF "V64DI")
+  (V128SF "V128DI")
+  (V256SF "V256DI")
+  (V512SF "V512DI")
 ])
 
-(define_mode_attr VINDEX_DOUBLE_EXT [
-  (RVVM4QI "RVVM8HI") (RVVM2QI "RVVM4HI") (RVVM1QI "RVVM2HI") (RVVMF2QI 
"RVVM1HI") (RVVMF4QI "RVVMF2HI") (RVVMF8QI "RVVMF4HI")
+(define_mode_attr vindex_double_ext [
+  (RVVM4QI "rvvm8hi") (RVVM2QI "rvvm4hi") (RVVM1QI "rvvm2hi") (RVVMF2QI 
"rvvm1hi") (RVVMF4QI "rvvmf2hi") (RVVMF8QI "rvvmf4hi")
 
-  (RVVM4HI "RVVM8SI") (RVVM2HI "RVVM4SI") (RVVM1HI "RVVM2SI") (RVVMF2HI 
"RVVM1SI") (RVVMF4HI "RVVMF2SI")
+  (RVVM4HI "rvvm8si") (RVVM2HI "rvvm4si") (RVVM1HI "rvvm2si") (RVVMF2HI 
"rvvm1si") (RVVMF4HI "rvvmf2si")
 
-  (RVVM4BF "RVVM8SI") (RVVM2BF "RVVM4SI") (RVVM1BF "RVVM2SI") (RVVMF2BF 
"RVVM1SI") (RVVMF4BF "RVVMF2SI")
+  (RVVM4BF "rvvm8si") (RVVM2BF "rvvm4si") (RVVM1BF "rvvm2si") (RVVMF2BF 
"rvvm1si") (RVVMF4BF "rvvmf2si")
 
-  (RVVM4HF "RVVM8SI") (RVVM2HF "RVVM4SI") (RVVM1HF "RVVM2SI") (RVVMF2HF 
"RVVM1SI") (RVVMF4HF "RVVMF2SI")
+  (RVVM4HF "rvvm8si") (RVVM2HF "rvvm4si") (RVVM1HF "rvvm2si") (RVVMF2HF 
"rvvm1si") (RVVMF4HF "rvvmf2si")
 
-  (RVVM4SI "RVVM8DI") (RVVM2SI "RVVM4DI") (RVVM1SI "RVVM2DI") (RVVMF2SI 
"RVVM1DI")
+  (RVVM4SI "rvvm8di") (RVVM2SI "rvvm4di") (RVVM1SI "rvvm2di") (RVVMF2SI 
"rvvm1di")
 
-  (RVVM4SF "RVVM8DI") (RVVM2SF "RVVM4DI") (RVVM1SF "RVVM2DI") (RVVMF2SF 
"RVVM1DI")
+  (RVVM4SF "rvvm8di") (RVVM2SF "rvvm4di") (RVVM1SF "rvvm2di") (RVVMF2SF 
"rvvm1di")
+
+  (V1QI "v1hi")
+  (V2QI "v2hi")
+  (V4QI "v4hi")
+  (V8QI "v8hi")
+  (V16QI "v16hi")
+  (V32QI "v32hi")
+  (V64QI "v64hi")
+  (V128QI "v128hi")
+  (V256QI "v256hi")
+  (V512QI "v512hi")
+  (V1024QI "v1024hi")
+  (V2048QI "v2048hi")
+  (V1HI "v1si")
+  (V2HI "v2si")
+  (V4HI "v4si")
+  (V8HI "v8si")
+  (V16HI "v16si")
+  (V32HI "v32si")
+  (V64HI "v64si")
+  (V128HI "v128si")
+  (V256HI "v256si")
+  (V512HI "v512si")
+  (V1024HI "v1024si")
+  (V1SI "v1di")
+  (V2SI "v2di")
+  (V4SI "v4di")
+  (V8SI "v8di")
+  (V16SI "v16di")
+  (V32SI "v32di")
+  (V64SI "v64di")
+  (V128SI "v128di")
+  (V256SI "v256di")
+  (V512SI "v512di")
+  (V1HF "v1si")
+  (V2HF "v2si")
+  (V4HF "v4si")
+  (V8HF "v8si")
+  (V16HF "v16si")
+  (V32HF "v32si")
+  (V64HF "v64si")
+  (V128HF "v128si")
+  (V256HF "v256si")
+  (V512HF "v512si")
+  (V1024HF "v1024si")
+  (V1BF "v1si")
+  (V2BF "v2si")
+  (V4BF "v4si")
+  (V8BF "v8si")
+  (V16BF "v16si")
+  (V32BF "v32si")
+  (V64BF "v64si")
+  (V128BF "v128si")
+  (V256BF "v256si")
+  (V512BF "v512si")
+  (V1024BF "v1024si")
+  (V1SF "v1di")
+  (V2SF "v2di")
+  (V4SF "v4di")
+  (V8SF "v8di")
+  (V16SF "v16di")
+  (V32SF "v32di")
+  (V64SF "v64di")
+  (V128SF "v128di")
+  (V256SF "v256di")
+  (V512SF "v512di")
 ])
 
 (define_mode_attr VINDEX_QUAD_EXT [
@@ -3185,10 +4316,130 @@ (define_mode_attr VINDEX_QUAD_EXT [
   (RVVM2BF "RVVM8DI") (RVVM1BF "RVVM4DI") (RVVMF2BF "RVVM2DI") (RVVMF4BF 
"RVVM1DI")
 
   (RVVM2HF "RVVM8DI") (RVVM1HF "RVVM4DI") (RVVMF2HF "RVVM2DI") (RVVMF4HF 
"RVVM1DI")
+
+  (V1QI "V1SI")
+  (V2QI "V2SI")
+  (V4QI "V4SI")
+  (V8QI "V8SI")
+  (V16QI "V16SI")
+  (V32QI "V32SI")
+  (V64QI "V64SI")
+  (V128QI "V128SI")
+  (V256QI "V256SI")
+  (V512QI "V512SI")
+  (V1024QI "V1024SI")
+  (V1HI "V1DI")
+  (V2HI "V2DI")
+  (V4HI "V4DI")
+  (V8HI "V8DI")
+  (V16HI "V16DI")
+  (V32HI "V32DI")
+  (V64HI "V64DI")
+  (V128HI "V128DI")
+  (V256HI "V256DI")
+  (V512HI "V512DI")
+  (V1HF "V1DI")
+  (V2HF "V2DI")
+  (V4HF "V4DI")
+  (V8HF "V8DI")
+  (V16HF "V16DI")
+  (V32HF "V32DI")
+  (V64HF "V64DI")
+  (V128HF "V128DI")
+  (V256HF "V256DI")
+  (V512HF "V512DI")
+  (V1BF "V1DI")
+  (V2BF "V2DI")
+  (V4BF "V4DI")
+  (V8BF "V8DI")
+  (V16BF "V16DI")
+  (V32BF "V32DI")
+  (V64BF "V64DI")
+  (V128BF "V128DI")
+  (V256BF "V256DI")
+  (V512BF "V512DI")
+])
+
+(define_mode_attr vindex_quad_ext [
+  (RVVM2QI "rvvm8si") (RVVM1QI "rvvm4si") (RVVMF2QI "rvvm2si") (RVVMF4QI 
"rvvm1si") (RVVMF8QI "rvvmf2si")
+
+  (RVVM2HI "rvvm8di") (RVVM1HI "rvvm4di") (RVVMF2HI "rvvm2di") (RVVMF4HI 
"rvvm1di")
+
+  (RVVM2BF "rvvm8di") (RVVM1BF "rvvm4di") (RVVMF2BF "rvvm2di") (RVVMF4BF 
"rvvm1di")
+
+  (RVVM2HF "rvvm8di") (RVVM1HF "rvvm4di") (RVVMF2HF "rvvm2di") (RVVMF4HF 
"rvvm1di")
+
+  (V1QI "v1si")
+  (V2QI "v2si")
+  (V4QI "v4si")
+  (V8QI "v8si")
+  (V16QI "v16si")
+  (V32QI "v32si")
+  (V64QI "v64si")
+  (V128QI "v128si")
+  (V256QI "v256si")
+  (V512QI "v512si")
+  (V1024QI "v1024si")
+  (V1HI "v1di")
+  (V2HI "v2di")
+  (V4HI "v4di")
+  (V8HI "v8di")
+  (V16HI "v16di")
+  (V32HI "v32di")
+  (V64HI "v64di")
+  (V128HI "v1d8di")
+  (V256HI "v256di")
+  (V512HI "v512di")
+  (V1HF "v1di")
+  (V2HF "v2di")
+  (V4HF "v4di")
+  (V8HF "v8di")
+  (V16HF "v16di")
+  (V32HF "v32di")
+  (V64HF "v64di")
+  (V128HF "v128di")
+  (V256HF "v256di")
+  (V512HF "v512di")
+  (V1BF "v1di")
+  (V2BF "v2di")
+  (V4BF "v4di")
+  (V8BF "v8di")
+  (V16BF "v16di")
+  (V32BF "v32di")
+  (V64BF "v64di")
+  (V128BF "v128di")
+  (V256BF "v256di")
+  (V512BF "v512di")
 ])
 
 (define_mode_attr VINDEX_OCT_EXT [
   (RVVM1QI "RVVM8DI") (RVVMF2QI "RVVM4DI") (RVVMF4QI "RVVM2DI") (RVVMF8QI 
"RVVM1DI")
+
+  (V1QI "V1DI")
+  (V2QI "V2DI")
+  (V4QI "V4DI")
+  (V8QI "V8DI")
+  (V16QI "V16DI")
+  (V32QI "V32DI")
+  (V64QI "V64DI")
+  (V128QI "V128DI")
+  (V256QI "V256DI")
+  (V512QI "V512DI")
+])
+
+(define_mode_attr vindex_oct_ext [
+  (RVVM1QI "rvvm8di") (RVVMF2QI "rvvm4di") (RVVMF4QI "rvvm2di") (RVVMF8QI 
"rvvm1di")
+
+  (V1QI "v1di")
+  (V2QI "v2di")
+  (V4QI "v4di")
+  (V8QI "v8di")
+  (V16QI "v16di")
+  (V32QI "v32di")
+  (V64QI "v64di")
+  (V128QI "v128di")
+  (V256QI "v256di")
+  (V512QI "v512di")
 ])
 
 (define_mode_attr VCONVERT [
diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md
index a345946f601..cca5752e61f 100644
--- a/gcc/config/riscv/vector.md
+++ b/gcc/config/riscv/vector.md
@@ -2680,7 +2680,7 @@ (define_insn 
"@pred_indexed_<order>load<mode>_x8_smaller_eew"
   [(set_attr "type" "vld<order>x")
    (set_attr "mode" "<MODE>")])
 
-(define_insn "@pred_indexed_<order>store<RATIO64:mode><RATIO64I:mode>"
+(define_insn "@pred_indexed_<order>store<mode>_same_eew"
   [(set (mem:BLK (scratch))
        (unspec:BLK
          [(unspec:<VM>
@@ -2690,14 +2690,14 @@ (define_insn 
"@pred_indexed_<order>store<RATIO64:mode><RATIO64I:mode>"
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
           (match_operand 1 "pmode_reg_or_0_operand"      "  rJ")
-          (match_operand:RATIO64I 2 "register_operand" "  vr")
-          (match_operand:RATIO64 3 "register_operand"  "  vr")] ORDER))]
+          (match_operand:<VINDEX> 2 "register_operand" "  vr")
+          (match_operand:VINDEXED 3 "register_operand"  "  vr")] ORDER))]
   "TARGET_VECTOR"
-  "vs<order>xei<RATIO64I:sew>.v\t%3,(%z1),%2%p0"
+  "vs<order>xei<sew>.v\t%3,(%z1),%2%p0"
   [(set_attr "type" "vst<order>x")
-   (set_attr "mode" "<RATIO64:MODE>")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "@pred_indexed_<order>store<RATIO32:mode><RATIO32I:mode>"
+(define_insn "@pred_indexed_<order>store<mode>_x2_greater_eew"
   [(set (mem:BLK (scratch))
        (unspec:BLK
          [(unspec:<VM>
@@ -2707,14 +2707,14 @@ (define_insn 
"@pred_indexed_<order>store<RATIO32:mode><RATIO32I:mode>"
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
           (match_operand 1 "pmode_reg_or_0_operand"      "  rJ")
-          (match_operand:RATIO32I 2 "register_operand" "  vr")
-          (match_operand:RATIO32 3 "register_operand"  "  vr")] ORDER))]
+          (match_operand:<VINDEX_DOUBLE_TRUNC> 2 "register_operand" "  vr")
+          (match_operand:VEEWEXT2 3 "register_operand"  "  vr")] ORDER))]
   "TARGET_VECTOR"
-  "vs<order>xei<RATIO32I:sew>.v\t%3,(%z1),%2%p0"
+  "vs<order>xei<double_trunc_sew>.v\t%3,(%z1),%2%p0"
   [(set_attr "type" "vst<order>x")
-   (set_attr "mode" "<RATIO32:MODE>")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "@pred_indexed_<order>store<RATIO16:mode><RATIO16I:mode>"
+(define_insn "@pred_indexed_<order>store<mode>_x4_greater_eew"
   [(set (mem:BLK (scratch))
        (unspec:BLK
          [(unspec:<VM>
@@ -2724,14 +2724,14 @@ (define_insn 
"@pred_indexed_<order>store<RATIO16:mode><RATIO16I:mode>"
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
           (match_operand 1 "pmode_reg_or_0_operand"      "  rJ")
-          (match_operand:RATIO16I 2 "register_operand" "  vr")
-          (match_operand:RATIO16 3 "register_operand"  "  vr")] ORDER))]
+          (match_operand:<VINDEX_QUAD_TRUNC> 2 "register_operand" "  vr")
+          (match_operand:VEEWEXT4 3 "register_operand"  "  vr")] ORDER))]
   "TARGET_VECTOR"
-  "vs<order>xei<RATIO16I:sew>.v\t%3,(%z1),%2%p0"
+  "vs<order>xei<quad_trunc_sew>.v\t%3,(%z1),%2%p0"
   [(set_attr "type" "vst<order>x")
-   (set_attr "mode" "<RATIO16:MODE>")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "@pred_indexed_<order>store<RATIO8:mode><RATIO8I:mode>"
+(define_insn "@pred_indexed_<order>store<mode>_x8_greater_eew"
   [(set (mem:BLK (scratch))
        (unspec:BLK
          [(unspec:<VM>
@@ -2741,14 +2741,14 @@ (define_insn 
"@pred_indexed_<order>store<RATIO8:mode><RATIO8I:mode>"
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
           (match_operand 1 "pmode_reg_or_0_operand"      "  rJ")
-          (match_operand:RATIO8I 2 "register_operand" "  vr")
-          (match_operand:RATIO8 3 "register_operand"  "  vr")] ORDER))]
+          (match_operand:<VINDEX_OCT_TRUNC> 2 "register_operand" "  vr")
+          (match_operand:VEEWEXT8 3 "register_operand"  "  vr")] ORDER))]
   "TARGET_VECTOR"
-  "vs<order>xei<RATIO8I:sew>.v\t%3,(%z1),%2%p0"
+  "vs<order>xei<quad_trunc_sew>.v\t%3,(%z1),%2%p0"
   [(set_attr "type" "vst<order>x")
-   (set_attr "mode" "<RATIO8:MODE>")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "@pred_indexed_<order>store<RATIO4:mode><RATIO4I:mode>"
+(define_insn "@pred_indexed_<order>store<mode>_x2_smaller_eew"
   [(set (mem:BLK (scratch))
        (unspec:BLK
          [(unspec:<VM>
@@ -2758,14 +2758,14 @@ (define_insn 
"@pred_indexed_<order>store<RATIO4:mode><RATIO4I:mode>"
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
           (match_operand 1 "pmode_reg_or_0_operand"      "  rJ")
-          (match_operand:RATIO4I 2 "register_operand" "  vr")
-          (match_operand:RATIO4 3 "register_operand"  "  vr")] ORDER))]
+          (match_operand:<VINDEX_DOUBLE_EXT> 2 "register_operand" "  vr")
+          (match_operand:VEEWTRUNC2 3 "register_operand"  "  vr")] ORDER))]
   "TARGET_VECTOR"
-  "vs<order>xei<RATIO4I:sew>.v\t%3,(%z1),%2%p0"
+  "vs<order>xei<double_ext_sew>.v\t%3,(%z1),%2%p0"
   [(set_attr "type" "vst<order>x")
-   (set_attr "mode" "<RATIO4:MODE>")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "@pred_indexed_<order>store<RATIO2:mode><RATIO2I:mode>"
+(define_insn "@pred_indexed_<order>store<mode>_x4_smaller_eew"
   [(set (mem:BLK (scratch))
        (unspec:BLK
          [(unspec:<VM>
@@ -2774,15 +2774,15 @@ (define_insn 
"@pred_indexed_<order>store<RATIO2:mode><RATIO2I:mode>"
             (match_operand 5 "const_int_operand"        "    i")
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
-          (match_operand 1 "pmode_reg_or_0_operand"       "  rJ")
-          (match_operand:RATIO2I 2 "register_operand"  "  vr")
-          (match_operand:RATIO2 3 "register_operand"   "  vr")] ORDER))]
+          (match_operand 1 "pmode_reg_or_0_operand"      "  rJ")
+          (match_operand:<VINDEX_QUAD_EXT> 2 "register_operand" "  vr")
+          (match_operand:VEEWTRUNC4 3 "register_operand"  "  vr")] ORDER))]
   "TARGET_VECTOR"
-  "vs<order>xei<RATIO2I:sew>.v\t%3,(%z1),%2%p0"
+  "vs<order>xei<quad_ext_sew>.v\t%3,(%z1),%2%p0"
   [(set_attr "type" "vst<order>x")
-   (set_attr "mode" "<RATIO2:MODE>")])
+   (set_attr "mode" "<MODE>")])
 
-(define_insn "@pred_indexed_<order>store<RATIO1:mode><RATIO1:mode>"
+(define_insn "@pred_indexed_<order>store<mode>_x8_smaller_eew"
   [(set (mem:BLK (scratch))
        (unspec:BLK
          [(unspec:<VM>
@@ -2792,12 +2792,12 @@ (define_insn 
"@pred_indexed_<order>store<RATIO1:mode><RATIO1:mode>"
             (reg:SI VL_REGNUM)
             (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
           (match_operand 1 "pmode_reg_or_0_operand"       "  rJ")
-          (match_operand:RATIO1 2 "register_operand"   "  vr")
-          (match_operand:RATIO1 3 "register_operand"    "  vr")] ORDER))]
+          (match_operand:<VINDEX_OCT_EXT> 2 "register_operand"  "  vr")
+          (match_operand:VEEWTRUNC8 3 "register_operand"   "  vr")] ORDER))]
   "TARGET_VECTOR"
-  "vs<order>xei<RATIO1:sew>.v\t%3,(%z1),%2%p0"
+  "vs<order>xei<oct_ext_sew>.v\t%3,(%z1),%2%p0"
   [(set_attr "type" "vst<order>x")
-   (set_attr "mode" "<RATIO1:MODE>")])
+   (set_attr "mode" "<MODE>")])
 
 ;; 
-------------------------------------------------------------------------------
 ;; ---- Predicated integer binary operations
-- 
2.51.0

Reply via email to