Committed as it is obvious fix.

gcc/ChangeLog:

        * config/riscv/riscv.md: Rostify the constraints.

---
 gcc/config/riscv/riscv.md | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 4c6f63677df..ff521454876 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -515,13 +515,28 @@
              (match_test "riscv_get_v_regno_alignment (GET_MODE (operands[0])) 
!= 2"))
         (const_string "no")
 
-         (and (eq_attr "group_overlap" "W42,W43")
+         (and (eq_attr "group_overlap" "W42")
              (match_test "riscv_get_v_regno_alignment (GET_MODE (operands[0])) 
!= 4"))
         (const_string "no")
 
-         (and (eq_attr "group_overlap" "W84,W86,W87")
+         (and (eq_attr "group_overlap" "W84")
              (match_test "riscv_get_v_regno_alignment (GET_MODE (operands[0])) 
!= 8"))
         (const_string "no")
+
+         ;; According to RVV ISA:
+         ;; The destination EEW is greater than the source EEW, the source 
EMUL is at least 1,
+        ;; and the overlap is in the highest-numbered part of the destination 
register group
+        ;; (e.g., when LMUL=8, vzext.vf4 v0, v6 is legal, but a source of v0, 
v2, or v4 is not).
+        ;; So the source operand should have LMUL >= 1.
+         (and (eq_attr "group_overlap" "W43")
+             (match_test "riscv_get_v_regno_alignment (GET_MODE (operands[0])) 
!= 4
+                          && riscv_get_v_regno_alignment (GET_MODE 
(operands[3])) >= 1"))
+        (const_string "no")
+
+         (and (eq_attr "group_overlap" "W86,W87")
+             (match_test "riscv_get_v_regno_alignment (GET_MODE (operands[0])) 
!= 8
+                          && riscv_get_v_regno_alignment (GET_MODE 
(operands[3])) >= 1"))
+        (const_string "no")
         ]
        (const_string "yes")))
 
-- 
2.36.3

Reply via email to