diff --git a/bfd/elfxx-riscv.c b/bfd/elfxx-riscv.c
index a3c32941866..411f9976ffe 100644
--- a/bfd/elfxx-riscv.c
+++ b/bfd/elfxx-riscv.c
@@ -1349,6 +1349,7 @@ static struct riscv_supported_ext riscv_supported_vendor_x_ext[] =
 {
   /* CORE-V ISA extension spec: https://docs.openhwgroup.org/projects/cv32e40p-user-manual/en/latest/instruction_set_extensions.html */
   {"xcvmac",		ISA_SPEC_CLASS_DRAFT,	1, 0, 0 },
+  {"xcvalu",           ISA_SPEC_CLASS_DRAFT,   1, 0, 0 },
   {"xtheadba",		ISA_SPEC_CLASS_DRAFT,	1, 0, 0 },
   {"xtheadbb",		ISA_SPEC_CLASS_DRAFT,	1, 0, 0 },
   {"xtheadbs",		ISA_SPEC_CLASS_DRAFT,	1, 0, 0 },
@@ -2543,6 +2544,8 @@ riscv_multi_subset_supports (riscv_parse_subset_t *rps,
       return riscv_subset_supports (rps, "h");
     case INSN_CLASS_XCVMAC:
       return riscv_subset_supports (rps, "xcvmac");
+    case INSN_CLASS_XCVALU:
+      return riscv_subset_supports (rps, "xcvalu");
     case INSN_CLASS_XTHEADBA:
       return riscv_subset_supports (rps, "xtheadba");
     case INSN_CLASS_XTHEADBB:
@@ -2785,6 +2788,8 @@ riscv_multi_subset_supports_ext (riscv_parse_subset_t *rps,
       return _("h");
     case INSN_CLASS_XCVMAC:
       return "xcvmac";
+    case INSN_CLASS_XCVALU:
+      return "xcvalu";
     case INSN_CLASS_XTHEADBA:
       return "xtheadba";
     case INSN_CLASS_XTHEADBB:
diff --git a/gas/config/tc-riscv.c b/gas/config/tc-riscv.c
index 3100a2e135f..4c201e02b80 100644
--- a/gas/config/tc-riscv.c
+++ b/gas/config/tc-riscv.c
@@ -1477,7 +1477,12 @@ validate_riscv_insn (const struct riscv_opcode *opc, int length)
 	      case 'c':
 		switch (*++oparg)
 		  {
+		    case '2':
+		      /* ls2[4:0] */
+		      used_bits |= ENCODE_CV_IS2_UIMM5 (-1U);
+		      break;
 		    case '3':
+		      /* ls3[4:0] */
 		      used_bits |= ENCODE_CV_IS3_UIMM5 (-1U);
 		      break;
 		    default:
@@ -3695,6 +3700,16 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
 		  case 'c':
 		    switch (*++oparg)
 		      {
+			case '2':
+			  my_getExpression (imm_expr, asarg);
+			  check_absolute_expr (ip, imm_expr, FALSE);
+			  asarg = expr_parse_end;
+			  if (imm_expr->X_add_number<0
+			      || imm_expr->X_add_number>31)
+			    break;
+			  ip->insn_opcode
+			    |= ENCODE_CV_IS2_UIMM5 (imm_expr->X_add_number);
+			  continue;
 			case '3':
 			  my_getExpression (imm_expr, asarg);
 			  check_absolute_expr (ip, imm_expr, FALSE);
@@ -3712,7 +3727,7 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
 		  default:
 		    goto unknown_riscv_ip_operand;
 		}
-	    break;
+	      break;
 
 	    default:
 	    unknown_riscv_ip_operand:
diff --git a/gas/doc/c-riscv.texi b/gas/doc/c-riscv.texi
index 1dcdeeb7b36..61e744ae633 100644
--- a/gas/doc/c-riscv.texi
+++ b/gas/doc/c-riscv.texi
@@ -750,6 +750,11 @@ The Xcvmac extension provides instructions for multiply-accumulate operations.
 
 It is documented in @url{https://docs.openhwgroup.org/projects/cv32e40p-user-manual/en/latest/instruction_set_extensions.html}
 
+@item Xcvalu
+The Xcvalu extension provides instructions for general ALU operations.
+
+It is documented in @url{https://docs.openhwgroup.org/projects/cv32e40p-user-manual/en/latest/instruction_set_extensions.html}
+
 @item XTheadBa
 The XTheadBa extension provides instructions for address calculations.
 
diff --git a/gas/testsuite/gas/riscv/cv-alu-boundaries.d b/gas/testsuite/gas/riscv/cv-alu-boundaries.d
new file mode 100644
index 00000000000..907b043aebc
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-boundaries.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-boundaries.s
+#error_output: cv-alu-boundaries.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-boundaries.l b/gas/testsuite/gas/riscv/cv-alu-boundaries.l
new file mode 100644
index 00000000000..fae4022244c
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-boundaries.l
@@ -0,0 +1,14 @@
+.*: Assembler messages:
+.*: Error: illegal operands `cv.subnr 10,t3,t6'
+.*: Error: illegal operands `cv.addrnr t4,26,t6'
+.*: Error: illegal operands `cv.subunr t6,t3,15'
+.*: Error: instruction cv.clipu requires absolute expression
+.*: Error: instruction cv.addn requires absolute expression
+.*: Error: illegal operands `cv.clipu t0,t3,-10'
+.*: Error: illegal operands `cv.clipu t0,t3,500'
+.*: Error: illegal operands `cv.addn t0,t3,t6,-60'
+.*: Error: illegal operands `cv.addn t0,t3,t6,302'
+.*: Error: illegal operands `cv.clipu t0,t3,-1'
+.*: Error: illegal operands `cv.clipu t0,t3,32'
+.*: Error: illegal operands `cv.addn t0,t3,t6,-1'
+.*: Error: illegal operands `cv.addn t0,t3,t6,32'
diff --git a/gas/testsuite/gas/riscv/cv-alu-boundaries.s b/gas/testsuite/gas/riscv/cv-alu-boundaries.s
new file mode 100644
index 00000000000..bb4da949b4a
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-boundaries.s
@@ -0,0 +1,27 @@
+# Destination must be of type register
+target:
+	cv.subnr 10, t3, t6
+# Source 1 must be of type register
+	cv.addrnr t4, 26, t6
+# Source 2 must be of type register
+	cv.subunr t6, t3, 15
+# Five bit immediate must be an absolute value
+	cv.clipu t0, t3, t6
+# Five bit immediate must be an absolute value
+	cv.addn t0, t3, t6, t2
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.clipu t0, t3, -10
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.clipu t0, t3, 500
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.addn t0, t3, t6, -60
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.addn t0, t3, t6, 302
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.clipu t0, t3, -1
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.clipu t0, t3, 32
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.addn t0, t3, t6, -1
+# Five bit immediate must be an absolute value in range [0, 31]
+	cv.addn t0, t3, t6, 32
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-march.d b/gas/testsuite/gas/riscv/cv-alu-fail-march.d
new file mode 100644
index 00000000000..963aa4012da
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-march.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i
+#source: cv-alu-fail-march.s
+#error_output: cv-alu-fail-march.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-march.l b/gas/testsuite/gas/riscv/cv-alu-fail-march.l
new file mode 100644
index 00000000000..11e5a7cd279
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-march.l
@@ -0,0 +1,32 @@
+.*: Assembler messages:
+.*: Error: unrecognized opcode `cv.abs t4,t2', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.slet t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.sletu t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.min t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.minu t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.max t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.maxu t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.exths t4,t2', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.exthz t4,t2', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.extbs t4,t2', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.extbz t4,t2', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.clip t4,t2,5', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.clipu t4,t2,5', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.clipr t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.clipur t4,t2,t6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addn t4,t2,t0,4', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addun t4,t2,t0,4', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addrn t6,t0,t3,9', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addurn t6,t0,t3,14', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addnr t6,t0,t3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addunr t6,t0,t3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addrnr t6,t0,t3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.addurnr t6,t0,t3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.subn t6,t0,t3,6', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.subun t6,t0,t3,24', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.subrn t6,t0,t3,21', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.suburn t6,t0,t3,3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.subnr t6,t0,t3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.subunr t6,t0,t3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.subrnr t6,t0,t3', extension `xcvalu' required
+.*: Error: unrecognized opcode `cv.suburnr t6,t0,t3', extension `xcvalu' required
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-march.s b/gas/testsuite/gas/riscv/cv-alu-fail-march.s
new file mode 100644
index 00000000000..8dd39b7301f
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-march.s
@@ -0,0 +1,33 @@
+# Absence of xcv or xcvalu march option disables all CORE-V general ALU ops extensions
+target:
+	cv.abs t4,t2
+	cv.slet t4,t2,t6
+	cv.sletu t4,t2,t6
+	cv.min t4,t2,t6
+	cv.minu t4,t2,t6
+	cv.max t4,t2,t6
+	cv.maxu t4,t2,t6
+	cv.exths t4,t2
+	cv.exthz t4,t2
+	cv.extbs t4,t2
+	cv.extbz t4,t2
+	cv.clip t4,t2,5
+	cv.clipu t4,t2,5
+	cv.clipr t4,t2,t6
+	cv.clipur t4,t2,t6
+	cv.addn t4, t2, t0, 4
+	cv.addun t4, t2, t0, 4
+	cv.addrn t6, t0, t3, 9
+	cv.addurn t6, t0, t3, 14
+	cv.addnr t6, t0, t3
+	cv.addunr t6, t0, t3
+	cv.addrnr t6, t0, t3
+	cv.addurnr t6, t0, t3
+	cv.subn t6, t0, t3, 6
+	cv.subun t6, t0, t3, 24
+	cv.subrn t6, t0, t3, 21
+	cv.suburn t6, t0, t3, 3
+	cv.subnr t6, t0, t3
+	cv.subunr t6, t0, t3
+	cv.subrnr t6, t0, t3
+	cv.suburnr t6, t0, t3
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.d b/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.d
new file mode 100644
index 00000000000..81b17348c32
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-fail-operand-01.s
+#error_output: cv-alu-fail-operand-01.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.l b/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.l
new file mode 100644
index 00000000000..f670e4341fa
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.l
@@ -0,0 +1,32 @@
+.*: Assembler messages:
+.*: Error: illegal operands `cv.abs 5,t2'
+.*: Error: illegal operands `cv.slet 10,t2,t6'
+.*: Error: illegal operands `cv.sletu 11,t2,t6'
+.*: Error: illegal operands `cv.min 15,t2,t6'
+.*: Error: illegal operands `cv.minu 16,t2,t6'
+.*: Error: illegal operands `cv.max 8,t2,t6'
+.*: Error: illegal operands `cv.maxu 3,t2,t6'
+.*: Error: illegal operands `cv.exths 2,t2'
+.*: Error: illegal operands `cv.exthz 6,t2'
+.*: Error: illegal operands `cv.extbs 4,t2'
+.*: Error: illegal operands `cv.extbz 7,t2'
+.*: Error: illegal operands `cv.clip 17,t2,5'
+.*: Error: illegal operands `cv.clipu 11,t2,5'
+.*: Error: illegal operands `cv.clipr 16,t2,t6'
+.*: Error: illegal operands `cv.clipur 15,t2,t6'
+.*: Error: illegal operands `cv.addn 9,t2,t0,4'
+.*: Error: illegal operands `cv.addun 30,t2,t0,4'
+.*: Error: illegal operands `cv.addrn 21,t0,t3,9'
+.*: Error: illegal operands `cv.addurn 6,t0,t3,14'
+.*: Error: illegal operands `cv.addnr 2,t0,t3'
+.*: Error: illegal operands `cv.addunr 26,t0,t3'
+.*: Error: illegal operands `cv.addrnr 3,t0,t3'
+.*: Error: illegal operands `cv.addurnr 14,t0,t3'
+.*: Error: illegal operands `cv.subn 15,t0,t3,6'
+.*: Error: illegal operands `cv.subun 9,t0,t3,24'
+.*: Error: illegal operands `cv.subrn 24,t0,t3,21'
+.*: Error: illegal operands `cv.suburn 25,t0,t3,3'
+.*: Error: illegal operands `cv.subnr 3,t0,t3'
+.*: Error: illegal operands `cv.subunr 12,t0,t3'
+.*: Error: illegal operands `cv.subrnr 13,t0,t3'
+.*: Error: illegal operands `cv.suburnr 8,t0,t3'
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.s b/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.s
new file mode 100644
index 00000000000..7920ebd53ec
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-01.s
@@ -0,0 +1,33 @@
+# Destination must be of type register
+target:
+	cv.abs 5,t2
+	cv.slet 10,t2,t6
+	cv.sletu 11,t2,t6
+	cv.min 15,t2,t6
+	cv.minu 16,t2,t6
+	cv.max 8,t2,t6
+	cv.maxu 3,t2,t6
+	cv.exths 2,t2
+	cv.exthz 6,t2
+	cv.extbs 4,t2
+	cv.extbz 7,t2
+	cv.clip 17,t2,5
+	cv.clipu 11,t2,5
+	cv.clipr 16,t2,t6
+	cv.clipur 15,t2,t6
+	cv.addn 9,t2,t0,4
+	cv.addun 30,t2,t0,4
+	cv.addrn 21,t0,t3,9
+	cv.addurn 6,t0,t3,14
+	cv.addnr 2,t0,t3
+	cv.addunr 26,t0,t3
+	cv.addrnr 3,t0,t3
+	cv.addurnr 14,t0,t3
+	cv.subn 15,t0,t3,6
+	cv.subun 9,t0,t3,24
+	cv.subrn 24,t0,t3,21
+	cv.suburn 25,t0,t3,3
+	cv.subnr 3,t0,t3
+	cv.subunr 12,t0,t3
+	cv.subrnr 13,t0,t3
+	cv.suburnr 8,t0,t3
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.d b/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.d
new file mode 100644
index 00000000000..46645aaf864
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-fail-operand-02.s
+#error_output: cv-alu-fail-operand-02.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.l b/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.l
new file mode 100644
index 00000000000..0a888c7251b
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.l
@@ -0,0 +1,32 @@
+.*: Assembler messages:
+.*: Error: illegal operands `cv.abs t4,5'
+.*: Error: illegal operands `cv.slet t4,7,t6'
+.*: Error: illegal operands `cv.sletu t4,3,t6'
+.*: Error: illegal operands `cv.min t4,5,t6'
+.*: Error: illegal operands `cv.minu t4,3,t6'
+.*: Error: illegal operands `cv.max t4,4,t6'
+.*: Error: illegal operands `cv.maxu t4,6,t6'
+.*: Error: illegal operands `cv.exths t4,30'
+.*: Error: illegal operands `cv.exthz t4,23'
+.*: Error: illegal operands `cv.extbs t4,25'
+.*: Error: illegal operands `cv.extbz t4,21'
+.*: Error: illegal operands `cv.clip t4,2,5'
+.*: Error: illegal operands `cv.clipu t4,16,5'
+.*: Error: illegal operands `cv.clipr t4,17,t6'
+.*: Error: illegal operands `cv.clipur t4,14,t6'
+.*: Error: illegal operands `cv.addn t4,5,t0,4'
+.*: Error: illegal operands `cv.addun t4,18,t0,4'
+.*: Error: illegal operands `cv.addrn t6,19,t3,9'
+.*: Error: illegal operands `cv.addurn t6,4,t3,14'
+.*: Error: illegal operands `cv.addnr t6,6,t3'
+.*: Error: illegal operands `cv.addunr t6,7,t3'
+.*: Error: illegal operands `cv.addrnr t6,9,t3'
+.*: Error: illegal operands `cv.addurnr t6,5,t3'
+.*: Error: illegal operands `cv.subn t6,11,t3,6'
+.*: Error: illegal operands `cv.subun t6,14,t3,24'
+.*: Error: illegal operands `cv.subrn t6,15,t3,21'
+.*: Error: illegal operands `cv.suburn t6,24,t3,3'
+.*: Error: illegal operands `cv.subnr t6,4,t3'
+.*: Error: illegal operands `cv.subunr t6,8,t3'
+.*: Error: illegal operands `cv.subrnr t6,7,t3'
+.*: Error: illegal operands `cv.suburnr t6,6,t3'
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.s b/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.s
new file mode 100644
index 00000000000..6083f1f5044
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-02.s
@@ -0,0 +1,33 @@
+# Source 1 must be of type register
+target:
+	cv.abs t4,5
+	cv.slet t4,7,t6
+	cv.sletu t4,3,t6
+	cv.min t4,5,t6
+	cv.minu t4,3,t6
+	cv.max t4,4,t6
+	cv.maxu t4,6,t6
+	cv.exths t4,30
+	cv.exthz t4,23
+	cv.extbs t4,25
+	cv.extbz t4,21
+	cv.clip t4,2,5
+	cv.clipu t4,16,5
+	cv.clipr t4,17,t6
+	cv.clipur t4,14,t6
+	cv.addn t4,5,t0,4
+	cv.addun t4,18,t0,4
+	cv.addrn t6,19,t3,9
+	cv.addurn t6,4,t3,14
+	cv.addnr t6,6,t3
+	cv.addunr t6,7,t3
+	cv.addrnr t6,9,t3
+	cv.addurnr t6,5,t3
+	cv.subn t6,11,t3,6
+	cv.subun t6,14,t3,24
+	cv.subrn t6,15,t3,21
+	cv.suburn t6,24,t3,3
+	cv.subnr t6,4,t3
+	cv.subunr t6,8,t3
+	cv.subrnr t6,7,t3
+	cv.suburnr t6,6,t3
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.d b/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.d
new file mode 100644
index 00000000000..6f681289d12
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-fail-operand-03.s
+#error_output: cv-alu-fail-operand-03.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.l b/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.l
new file mode 100644
index 00000000000..c7a11184996
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.l
@@ -0,0 +1,25 @@
+.*: Assembler messages:
+.*: Error: illegal operands `cv.slet t4,t2,3'
+.*: Error: illegal operands `cv.sletu t4,t2,4'
+.*: Error: illegal operands `cv.min t4,t2,13'
+.*: Error: illegal operands `cv.minu t4,t2,7'
+.*: Error: illegal operands `cv.max t4,t2,17'
+.*: Error: illegal operands `cv.maxu t4,t2,30'
+.*: Error: illegal operands `cv.clipr t4,t2,18'
+.*: Error: illegal operands `cv.clipur t4,t2,29'
+.*: Error: illegal operands `cv.addn t4,t2,24,4'
+.*: Error: illegal operands `cv.addun t4,t2,6,4'
+.*: Error: illegal operands `cv.addrn t6,t0,7,9'
+.*: Error: illegal operands `cv.addurn t6,t0,18,14'
+.*: Error: illegal operands `cv.addnr t6,t0,15'
+.*: Error: illegal operands `cv.addunr t6,t0,24'
+.*: Error: illegal operands `cv.addrnr t6,t0,3'
+.*: Error: illegal operands `cv.addurnr t6,t0,2'
+.*: Error: illegal operands `cv.subn t6,t0,1,6'
+.*: Error: illegal operands `cv.subun t6,t0,8,24'
+.*: Error: illegal operands `cv.subrn t6,t0,18,21'
+.*: Error: illegal operands `cv.suburn t6,t0,25,3'
+.*: Error: illegal operands `cv.subnr t6,t0,14'
+.*: Error: illegal operands `cv.subunr t6,t0,7'
+.*: Error: illegal operands `cv.subrnr t6,t0,18'
+.*: Error: illegal operands `cv.suburnr t6,t0,26'
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.s b/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.s
new file mode 100644
index 00000000000..64ee8703579
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-03.s
@@ -0,0 +1,26 @@
+# Source 2 must be of type register
+target:
+	cv.slet t4,t2,3
+	cv.sletu t4,t2,4
+	cv.min t4,t2,13
+	cv.minu t4,t2,7
+	cv.max t4,t2,17
+	cv.maxu t4,t2,30
+	cv.clipr t4,t2,18
+	cv.clipur t4,t2,29
+	cv.addn t4,t2,24,4
+	cv.addun t4,t2,6,4
+	cv.addrn t6,t0,7,9
+	cv.addurn t6,t0,18,14
+	cv.addnr t6,t0,15
+	cv.addunr t6,t0,24
+	cv.addrnr t6,t0,3
+	cv.addurnr t6,t0,2
+	cv.subn t6,t0,1,6
+	cv.subun t6,t0,8,24
+	cv.subrn t6,t0,18,21
+	cv.suburn t6,t0,25,3
+	cv.subnr t6,t0,14
+	cv.subunr t6,t0,7
+	cv.subrnr t6,t0,18
+	cv.suburnr t6,t0,26
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.d b/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.d
new file mode 100644
index 00000000000..634d9bfe091
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-fail-operand-04.s
+#error_output: cv-alu-fail-operand-04.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.l b/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.l
new file mode 100644
index 00000000000..d6fd960f9e0
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.l
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*: Error: instruction cv.clip requires absolute expression
+.*: Error: instruction cv.clipu requires absolute expression
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.s b/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.s
new file mode 100644
index 00000000000..b97d52a77ab
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-04.s
@@ -0,0 +1,4 @@
+# Five bit immediate must be an absolute value
+target:
+	cv.clip t4,t2,t3
+	cv.clipu t4,t2,t3
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.d b/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.d
new file mode 100644
index 00000000000..1b90d3e5757
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-fail-operand-05.s
+#error_output: cv-alu-fail-operand-05.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.l b/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.l
new file mode 100644
index 00000000000..05b5289e743
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.l
@@ -0,0 +1,9 @@
+.*: Assembler messages:
+.*: Error: instruction cv.addn requires absolute expression
+.*: Error: instruction cv.addun requires absolute expression
+.*: Error: instruction cv.addrn requires absolute expression
+.*: Error: instruction cv.addurn requires absolute expression
+.*: Error: instruction cv.subn requires absolute expression
+.*: Error: instruction cv.subun requires absolute expression
+.*: Error: instruction cv.subrn requires absolute expression
+.*: Error: instruction cv.suburn requires absolute expression
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.s b/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.s
new file mode 100644
index 00000000000..1b0ac6f2d59
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-05.s
@@ -0,0 +1,10 @@
+# Five bit immediate must be an absolute value
+target:
+	cv.addn t4,t2,t0,t3
+	cv.addun t4,t2,t0,t3
+	cv.addrn t6,t0,t3,t2
+	cv.addurn t6,t0,t3,t2
+	cv.subn t6,t0,t3,t2
+	cv.subun t6,t0,t3,t2
+	cv.subrn t6,t0,t3,t2
+	cv.suburn t6,t0,t3,t2
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.d b/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.d
new file mode 100644
index 00000000000..0a49e682c85
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-fail-operand-06.s
+#error_output: cv-alu-fail-operand-06.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.l b/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.l
new file mode 100644
index 00000000000..d8059cb5e3a
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.l
@@ -0,0 +1,9 @@
+.*: Assembler messages:
+.*: Error: illegal operands `cv.clip t0,t3,-1'
+.*: Error: illegal operands `cv.clipu t0,t3,-1'
+.*: Error: illegal operands `cv.clip t0,t3,-400'
+.*: Error: illegal operands `cv.clipu t0,t3,-985'
+.*: Error: illegal operands `cv.clip t0,t3,32'
+.*: Error: illegal operands `cv.clipu t0,t3,32'
+.*: Error: illegal operands `cv.clip t0,t3,859'
+.*: Error: illegal operands `cv.clipu t0,t3,7283'
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.s b/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.s
new file mode 100644
index 00000000000..1b810bdda55
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-06.s
@@ -0,0 +1,10 @@
+# Five bit immediate must be an absolute value in range [0, 31]
+target:
+	cv.clip t0,t3,-1
+	cv.clipu t0,t3,-1
+	cv.clip t0,t3,-400
+	cv.clipu t0,t3,-985
+	cv.clip t0,t3,32
+	cv.clipu t0,t3,32
+	cv.clip t0,t3,859
+	cv.clipu t0,t3,7283
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.d b/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.d
new file mode 100644
index 00000000000..06d17fede7c
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.d
@@ -0,0 +1,3 @@
+#as: -march=rv32i_xcvalu
+#source: cv-alu-fail-operand-07.s
+#error_output: cv-alu-fail-operand-07.l
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.l b/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.l
new file mode 100644
index 00000000000..5a34156afc3
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.l
@@ -0,0 +1,33 @@
+.*: Assembler messages:
+.*: Error: illegal operands `cv.addn t4,t2,t0,-1'
+.*: Error: illegal operands `cv.addun t4,t2,t0,-1'
+.*: Error: illegal operands `cv.addrn t6,t0,t3,-1'
+.*: Error: illegal operands `cv.addurn t6,t0,t3,-1'
+.*: Error: illegal operands `cv.subn t6,t0,t3,-1'
+.*: Error: illegal operands `cv.subun t6,t0,t3,-1'
+.*: Error: illegal operands `cv.subrn t6,t0,t3,-1'
+.*: Error: illegal operands `cv.suburn t6,t0,t3,-1'
+.*: Error: illegal operands `cv.addn t4,t2,t0,-34'
+.*: Error: illegal operands `cv.addun t4,t2,t0,-3556'
+.*: Error: illegal operands `cv.addrn t6,t0,t3,-212'
+.*: Error: illegal operands `cv.addurn t6,t0,t3,-6584'
+.*: Error: illegal operands `cv.subn t6,t0,t3,-89'
+.*: Error: illegal operands `cv.subun t6,t0,t3,-9034'
+.*: Error: illegal operands `cv.subrn t6,t0,t3,-234'
+.*: Error: illegal operands `cv.suburn t6,t0,t3,-284'
+.*: Error: illegal operands `cv.addn t4,t2,t0,32'
+.*: Error: illegal operands `cv.addun t4,t2,t0,32'
+.*: Error: illegal operands `cv.addrn t6,t0,t3,32'
+.*: Error: illegal operands `cv.addurn t6,t0,t3,32'
+.*: Error: illegal operands `cv.subn t6,t0,t3,32'
+.*: Error: illegal operands `cv.subun t6,t0,t3,32'
+.*: Error: illegal operands `cv.subrn t6,t0,t3,32'
+.*: Error: illegal operands `cv.suburn t6,t0,t3,32'
+.*: Error: illegal operands `cv.addn t4,t2,t0,320'
+.*: Error: illegal operands `cv.addun t4,t2,t0,34534'
+.*: Error: illegal operands `cv.addrn t6,t0,t3,254'
+.*: Error: illegal operands `cv.addurn t6,t0,t3,398'
+.*: Error: illegal operands `cv.subn t6,t0,t3,89'
+.*: Error: illegal operands `cv.subun t6,t0,t3,3489'
+.*: Error: illegal operands `cv.subrn t6,t0,t3,143'
+.*: Error: illegal operands `cv.suburn t6,t0,t3,234'
diff --git a/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.s b/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.s
new file mode 100644
index 00000000000..04788f69ddd
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-fail-operand-07.s
@@ -0,0 +1,34 @@
+# Five bit immediate must be an absolute value in range [0, 31]
+target:
+	cv.addn t4,t2,t0,-1
+	cv.addun t4,t2,t0,-1
+	cv.addrn t6,t0,t3,-1
+	cv.addurn t6,t0,t3,-1
+	cv.subn t6,t0,t3,-1
+	cv.subun t6,t0,t3,-1
+	cv.subrn t6,t0,t3,-1
+	cv.suburn t6,t0,t3,-1
+	cv.addn t4,t2,t0,-34
+	cv.addun t4,t2,t0,-3556
+	cv.addrn t6,t0,t3,-212
+	cv.addurn t6,t0,t3,-6584
+	cv.subn t6,t0,t3,-89
+	cv.subun t6,t0,t3,-9034
+	cv.subrn t6,t0,t3,-234
+	cv.suburn t6,t0,t3,-284
+	cv.addn t4,t2,t0,32
+	cv.addun t4,t2,t0,32
+	cv.addrn t6,t0,t3,32
+	cv.addurn t6,t0,t3,32
+	cv.subn t6,t0,t3,32
+	cv.subun t6,t0,t3,32
+	cv.subrn t6,t0,t3,32
+	cv.suburn t6,t0,t3,32
+	cv.addn t4,t2,t0,320
+	cv.addun t4,t2,t0,34534
+	cv.addrn t6,t0,t3,254
+	cv.addurn t6,t0,t3,398
+	cv.subn t6,t0,t3,89
+	cv.subun t6,t0,t3,3489
+	cv.subrn t6,t0,t3,143
+	cv.suburn t6,t0,t3,234
diff --git a/gas/testsuite/gas/riscv/cv-alu-insns.d b/gas/testsuite/gas/riscv/cv-alu-insns.d
new file mode 100644
index 00000000000..784cf5ca6cb
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-insns.d
@@ -0,0 +1,102 @@
+#as: -march=rv32i_xcvalu
+#objdump: -d
+
+.*:[ 	]+file format .*
+
+
+Disassembly of section .text:
+
+0+000 <target>:
+[ 	]+0:[ 	]+500332ab[ 	]+cv.abs[ 	]+t0,t1
+[ 	]+4:[ 	]+5003beab[ 	]+cv.abs[ 	]+t4,t2
+[ 	]+8:[ 	]+500f3e2b[ 	]+cv.abs[ 	]+t3,t5
+[ 	]+c:[ 	]+81fe32ab[ 	]+cv.addnr[ 	]+t0,t3,t6
+[ 	]+10:[ 	]+81c2bfab[ 	]+cv.addnr[ 	]+t6,t0,t3
+[ 	]+14:[ 	]+805fbe2b[ 	]+cv.addnr[ 	]+t3,t6,t0
+[ 	]+18:[ 	]+007322db[ 	]+cv.addn[ 	]+t0,t1,t2,0
+[ 	]+1c:[ 	]+0853aedb[ 	]+cv.addn[ 	]+t4,t2,t0,4
+[ 	]+20:[ 	]+3e6f2e5b[ 	]+cv.addn[ 	]+t3,t5,t1,31
+[ 	]+24:[ 	]+85fe32ab[ 	]+cv.addrnr[ 	]+t0,t3,t6
+[ 	]+28:[ 	]+85c2bfab[ 	]+cv.addrnr[ 	]+t6,t0,t3
+[ 	]+2c:[ 	]+845fbe2b[ 	]+cv.addrnr[ 	]+t3,t6,t0
+[ 	]+30:[ 	]+81fe22db[ 	]+cv.addrn[ 	]+t0,t3,t6,0
+[ 	]+34:[ 	]+93c2afdb[ 	]+cv.addrn[ 	]+t6,t0,t3,9
+[ 	]+38:[ 	]+be5fae5b[ 	]+cv.addrn[ 	]+t3,t6,t0,31
+[ 	]+3c:[ 	]+83fe32ab[ 	]+cv.addunr[ 	]+t0,t3,t6
+[ 	]+40:[ 	]+83c2bfab[ 	]+cv.addunr[ 	]+t6,t0,t3
+[ 	]+44:[ 	]+825fbe2b[ 	]+cv.addunr[ 	]+t3,t6,t0
+[ 	]+48:[ 	]+407322db[ 	]+cv.addun[ 	]+t0,t1,t2,0
+[ 	]+4c:[ 	]+4853aedb[ 	]+cv.addun[ 	]+t4,t2,t0,4
+[ 	]+50:[ 	]+7e6f2e5b[ 	]+cv.addun[ 	]+t3,t5,t1,31
+[ 	]+54:[ 	]+87fe32ab[ 	]+cv.addurnr[ 	]+t0,t3,t6
+[ 	]+58:[ 	]+87c2bfab[ 	]+cv.addurnr[ 	]+t6,t0,t3
+[ 	]+5c:[ 	]+865fbe2b[ 	]+cv.addurnr[ 	]+t3,t6,t0
+[ 	]+60:[ 	]+c1fe22db[ 	]+cv.addurn[ 	]+t0,t3,t6,0
+[ 	]+64:[ 	]+ddc2afdb[ 	]+cv.addurn[ 	]+t6,t0,t3,14
+[ 	]+68:[ 	]+fe5fae5b[ 	]+cv.addurn[ 	]+t3,t6,t0,31
+[ 	]+6c:[ 	]+747332ab[ 	]+cv.clipr[ 	]+t0,t1,t2
+[ 	]+70:[ 	]+75f3beab[ 	]+cv.clipr[ 	]+t4,t2,t6
+[ 	]+74:[ 	]+746f3e2b[ 	]+cv.clipr[ 	]+t3,t5,t1
+[ 	]+78:[ 	]+700332ab[ 	]+cv.clip[ 	]+t0,t1,0
+[ 	]+7c:[ 	]+7053beab[ 	]+cv.clip[ 	]+t4,t2,5
+[ 	]+80:[ 	]+71ff3e2b[ 	]+cv.clip[ 	]+t3,t5,31
+[ 	]+84:[ 	]+767332ab[ 	]+cv.clipur[ 	]+t0,t1,t2
+[ 	]+88:[ 	]+77f3beab[ 	]+cv.clipur[ 	]+t4,t2,t6
+[ 	]+8c:[ 	]+766f3e2b[ 	]+cv.clipur[ 	]+t3,t5,t1
+[ 	]+90:[ 	]+720332ab[ 	]+cv.clipu[ 	]+t0,t1,0
+[ 	]+94:[ 	]+7253beab[ 	]+cv.clipu[ 	]+t4,t2,5
+[ 	]+98:[ 	]+73ff3e2b[ 	]+cv.clipu[ 	]+t3,t5,31
+[ 	]+9c:[ 	]+640332ab[ 	]+cv.extbs[ 	]+t0,t1
+[ 	]+a0:[ 	]+6403beab[ 	]+cv.extbs[ 	]+t4,t2
+[ 	]+a4:[ 	]+640f3e2b[ 	]+cv.extbs[ 	]+t3,t5
+[ 	]+a8:[ 	]+660332ab[ 	]+cv.extbz[ 	]+t0,t1
+[ 	]+ac:[ 	]+6603beab[ 	]+cv.extbz[ 	]+t4,t2
+[ 	]+b0:[ 	]+660f3e2b[ 	]+cv.extbz[ 	]+t3,t5
+[ 	]+b4:[ 	]+600332ab[ 	]+cv.exths[ 	]+t0,t1
+[ 	]+b8:[ 	]+6003beab[ 	]+cv.exths[ 	]+t4,t2
+[ 	]+bc:[ 	]+600f3e2b[ 	]+cv.exths[ 	]+t3,t5
+[ 	]+c0:[ 	]+620332ab[ 	]+cv.exthz[ 	]+t0,t1
+[ 	]+c4:[ 	]+6203beab[ 	]+cv.exthz[ 	]+t4,t2
+[ 	]+c8:[ 	]+620f3e2b[ 	]+cv.exthz[ 	]+t3,t5
+[ 	]+cc:[ 	]+5a7332ab[ 	]+cv.max[ 	]+t0,t1,t2
+[ 	]+d0:[ 	]+5bf3beab[ 	]+cv.max[ 	]+t4,t2,t6
+[ 	]+d4:[ 	]+5a6f3e2b[ 	]+cv.max[ 	]+t3,t5,t1
+[ 	]+d8:[ 	]+5c7332ab[ 	]+cv.maxu[ 	]+t0,t1,t2
+[ 	]+dc:[ 	]+5df3beab[ 	]+cv.maxu[ 	]+t4,t2,t6
+[ 	]+e0:[ 	]+5c6f3e2b[ 	]+cv.maxu[ 	]+t3,t5,t1
+[ 	]+e4:[ 	]+567332ab[ 	]+cv.min[ 	]+t0,t1,t2
+[ 	]+e8:[ 	]+57f3beab[ 	]+cv.min[ 	]+t4,t2,t6
+[ 	]+ec:[ 	]+566f3e2b[ 	]+cv.min[ 	]+t3,t5,t1
+[ 	]+f0:[ 	]+587332ab[ 	]+cv.minu[ 	]+t0,t1,t2
+[ 	]+f4:[ 	]+59f3beab[ 	]+cv.minu[ 	]+t4,t2,t6
+[ 	]+f8:[ 	]+586f3e2b[ 	]+cv.minu[ 	]+t3,t5,t1
+[ 	]+fc:[ 	]+527332ab[ 	]+cv.sle[ 	]+t0,t1,t2
+[ 	]+100:[ 	]+53f3beab[ 	]+cv.sle[ 	]+t4,t2,t6
+[ 	]+104:[ 	]+526f3e2b[ 	]+cv.sle[ 	]+t3,t5,t1
+[ 	]+108:[ 	]+547332ab[ 	]+cv.sleu[ 	]+t0,t1,t2
+[ 	]+10c:[ 	]+55f3beab[ 	]+cv.sleu[ 	]+t4,t2,t6
+[ 	]+110:[ 	]+546f3e2b[ 	]+cv.sleu[ 	]+t3,t5,t1
+[ 	]+114:[ 	]+89fe32ab[ 	]+cv.subnr[ 	]+t0,t3,t6
+[ 	]+118:[ 	]+89c2bfab[ 	]+cv.subnr[ 	]+t6,t0,t3
+[ 	]+11c:[ 	]+885fbe2b[ 	]+cv.subnr[ 	]+t3,t6,t0
+[ 	]+120:[ 	]+01fe32db[ 	]+cv.subn[ 	]+t0,t3,t6,0
+[ 	]+124:[ 	]+0dc2bfdb[ 	]+cv.subn[ 	]+t6,t0,t3,6
+[ 	]+128:[ 	]+3e5fbe5b[ 	]+cv.subn[ 	]+t3,t6,t0,31
+[ 	]+12c:[ 	]+8dfe32ab[ 	]+cv.subrnr[ 	]+t0,t3,t6
+[ 	]+130:[ 	]+8dc2bfab[ 	]+cv.subrnr[ 	]+t6,t0,t3
+[ 	]+134:[ 	]+8c5fbe2b[ 	]+cv.subrnr[ 	]+t3,t6,t0
+[ 	]+138:[ 	]+81fe32db[ 	]+cv.subrn[ 	]+t0,t3,t6,0
+[ 	]+13c:[ 	]+abc2bfdb[ 	]+cv.subrn[ 	]+t6,t0,t3,21
+[ 	]+140:[ 	]+be5fbe5b[ 	]+cv.subrn[ 	]+t3,t6,t0,31
+[ 	]+144:[ 	]+8bfe32ab[ 	]+cv.subunr[ 	]+t0,t3,t6
+[ 	]+148:[ 	]+8bc2bfab[ 	]+cv.subunr[ 	]+t6,t0,t3
+[ 	]+14c:[ 	]+8a5fbe2b[ 	]+cv.subunr[ 	]+t3,t6,t0
+[ 	]+150:[ 	]+41fe32db[ 	]+cv.subun[ 	]+t0,t3,t6,0
+[ 	]+154:[ 	]+71c2bfdb[ 	]+cv.subun[ 	]+t6,t0,t3,24
+[ 	]+158:[ 	]+7e5fbe5b[ 	]+cv.subun[ 	]+t3,t6,t0,31
+[ 	]+15c:[ 	]+8ffe32ab[ 	]+cv.suburnr[ 	]+t0,t3,t6
+[ 	]+160:[ 	]+8fc2bfab[ 	]+cv.suburnr[ 	]+t6,t0,t3
+[ 	]+164:[ 	]+8e5fbe2b[ 	]+cv.suburnr[ 	]+t3,t6,t0
+[ 	]+168:[ 	]+c1fe32db[ 	]+cv.suburn[ 	]+t0,t3,t6,0
+[ 	]+16c:[ 	]+c7c2bfdb[ 	]+cv.suburn[ 	]+t6,t0,t3,3
+[ 	]+170:[ 	]+fe5fbe5b[ 	]+cv.suburn[ 	]+t3,t6,t0,31
diff --git a/gas/testsuite/gas/riscv/cv-alu-insns.s b/gas/testsuite/gas/riscv/cv-alu-insns.s
new file mode 100644
index 00000000000..82ea0c3b98d
--- /dev/null
+++ b/gas/testsuite/gas/riscv/cv-alu-insns.s
@@ -0,0 +1,124 @@
+target:
+	cv.abs t0,t1
+	cv.abs t4,t2
+	cv.abs t3,t5
+
+	cv.addnr t0, t3, t6
+	cv.addnr t6, t0, t3
+	cv.addnr t3, t6, t0
+
+	cv.addn t0, t1, t2, 0
+	cv.addn t4, t2, t0, 4
+	cv.addn t3, t5, t1, 31
+
+	cv.addrnr t0, t3, t6
+	cv.addrnr t6, t0, t3
+	cv.addrnr t3, t6, t0
+
+	cv.addrn t0, t3, t6, 0
+	cv.addrn t6, t0, t3, 9
+	cv.addrn t3, t6, t0, 31
+
+	cv.addunr t0, t3, t6
+	cv.addunr t6, t0, t3
+	cv.addunr t3, t6, t0
+
+	cv.addun t0, t1, t2, 0
+	cv.addun t4, t2, t0, 4
+	cv.addun t3, t5, t1, 31
+
+	cv.addurnr t0, t3, t6
+	cv.addurnr t6, t0, t3
+	cv.addurnr t3, t6, t0
+
+	cv.addurn t0, t3, t6, 0
+	cv.addurn t6, t0, t3, 14
+	cv.addurn t3, t6, t0, 31
+
+	cv.clipr t0,t1,t2
+	cv.clipr t4,t2,t6
+	cv.clipr t3,t5,t1
+
+	cv.clip t0,t1,0
+	cv.clip t4,t2,5
+	cv.clip t3,t5,31
+
+	cv.clipur t0,t1,t2
+	cv.clipur t4,t2,t6
+	cv.clipur t3,t5,t1
+
+	cv.clipu t0,t1,0
+	cv.clipu t4,t2,5
+	cv.clipu t3,t5,31
+
+	cv.extbs t0,t1
+	cv.extbs t4,t2
+	cv.extbs t3,t5
+
+	cv.extbz t0,t1
+	cv.extbz t4,t2
+	cv.extbz t3,t5
+
+	cv.exths t0,t1
+	cv.exths t4,t2
+	cv.exths t3,t5
+
+	cv.exthz t0,t1
+	cv.exthz t4,t2
+	cv.exthz t3,t5
+
+	cv.max t0,t1,t2
+	cv.max t4,t2,t6
+	cv.max t3,t5,t1
+
+	cv.maxu t0,t1,t2
+	cv.maxu t4,t2,t6
+	cv.maxu t3,t5,t1
+
+	cv.min t0,t1,t2
+	cv.min t4,t2,t6
+	cv.min t3,t5,t1
+
+	cv.minu t0,t1,t2
+	cv.minu t4,t2,t6
+	cv.minu t3,t5,t1
+
+	cv.sle t0,t1,t2
+	cv.sle t4,t2,t6
+	cv.sle t3,t5,t1
+
+	cv.sleu t0,t1,t2
+	cv.sleu t4,t2,t6
+	cv.sleu t3,t5,t1
+
+	cv.subnr t0, t3, t6
+	cv.subnr t6, t0, t3
+	cv.subnr t3, t6, t0
+
+	cv.subn t0, t3, t6, 0
+	cv.subn t6, t0, t3, 6
+	cv.subn t3, t6, t0, 31
+
+	cv.subrnr t0, t3, t6
+	cv.subrnr t6, t0, t3
+	cv.subrnr t3, t6, t0
+
+	cv.subrn t0, t3, t6, 0
+	cv.subrn t6, t0, t3, 21
+	cv.subrn t3, t6, t0, 31
+
+	cv.subunr t0, t3, t6
+	cv.subunr t6, t0, t3
+	cv.subunr t3, t6, t0
+
+	cv.subun t0, t3, t6, 0
+	cv.subun t6, t0, t3, 24
+	cv.subun t3, t6, t0, 31
+
+	cv.suburnr t0, t3, t6
+	cv.suburnr t6, t0, t3
+	cv.suburnr t3, t6, t0
+
+	cv.suburn t0, t3, t6, 0
+	cv.suburn t6, t0, t3, 3
+	cv.suburn t3, t6, t0, 31
diff --git a/include/opcode/riscv-opc.h b/include/opcode/riscv-opc.h
index 199ae63585f..9e0e090a8a7 100644
--- a/include/opcode/riscv-opc.h
+++ b/include/opcode/riscv-opc.h
@@ -2341,6 +2341,41 @@
 #define MATCH_CV_MACURN    0x8000705b
 #define MATCH_CV_MACHHURN  0xc000705b
 #define MASK_CV_MULMACN    0xc000707f
+/* Vendor-specific (CORE-V) Xcvalu instructions.  */
+#define MATCH_CV_ABS 0x5000302b
+#define MASK_CV_ABS 0xfff0707f
+#define MATCH_CV_SLET 0x5200302b
+#define MASK_CV_SLET 0xfe00707f
+#define MATCH_CV_SLETU 0x5400302b
+#define MATCH_CV_MIN 0x5600302b
+#define MATCH_CV_MINU 0x5800302b
+#define MATCH_CV_MAX 0x5a00302b
+#define MATCH_CV_MAXU 0x5c00302b
+#define MATCH_CV_EXTHS 0x6000302b
+#define MATCH_CV_EXTHZ 0x6200302b
+#define MATCH_CV_EXTBS 0x6400302b
+#define MATCH_CV_EXTBZ 0x6600302b
+#define MATCH_CV_CLIP 0x7000302b
+#define MATCH_CV_CLIPU 0x7200302b
+#define MATCH_CV_CLIPR 0x7400302b
+#define MATCH_CV_CLIPUR 0x7600302b
+#define MATCH_CV_ADDNR 0x8000302b
+#define MATCH_CV_ADDUNR 0x8200302b
+#define MATCH_CV_ADDRNR 0x8400302b
+#define MATCH_CV_ADDURNR 0x8600302b
+#define MATCH_CV_SUBNR 0x8800302b
+#define MATCH_CV_SUBUNR 0x8a00302b
+#define MATCH_CV_SUBRNR 0x8c00302b
+#define MATCH_CV_SUBURNR 0x8e00302b
+#define MATCH_CV_ADDN 0x205b
+#define MASK_CV_ADDN 0xc000707f
+#define MATCH_CV_ADDUN 0x4000205b
+#define MATCH_CV_ADDRN 0x8000205b
+#define MATCH_CV_ADDURN 0xc000205b
+#define MATCH_CV_SUBN 0x305b
+#define MATCH_CV_SUBUN 0x4000305b
+#define MATCH_CV_SUBRN 0x8000305b
+#define MATCH_CV_SUBURN 0xc000305b
 /* Vendor-specific (T-Head) XTheadBa instructions.  */
 #define MATCH_TH_ADDSL 0x0000100b
 #define MASK_TH_ADDSL 0xf800707f
diff --git a/include/opcode/riscv.h b/include/opcode/riscv.h
index 5097d2cf6c1..18236a6150c 100644
--- a/include/opcode/riscv.h
+++ b/include/opcode/riscv.h
@@ -113,6 +113,8 @@ static inline unsigned int riscv_insn_length (insn_t insn)
 #define EXTRACT_ZCB_HALFWORD_UIMM(x) \
   (RV_X(x, 5, 1) << 1)
 /* Vendor-specific (CORE-V) extract macros.  */
+#define EXTRACT_CV_IS2_UIMM5(x) \
+  (RV_X(x, 20, 5))
 #define EXTRACT_CV_IS3_UIMM5(x) \
   (RV_X(x, 25, 5))
 
@@ -167,6 +169,8 @@ static inline unsigned int riscv_insn_length (insn_t insn)
 #define ENCODE_ZCB_HALFWORD_UIMM(x) \
   (RV_X(x, 1, 1) << 5)
 /* Vendor-specific (CORE-V) encode macros.  */
+#define ENCODE_CV_IS2_UIMM5(x) \
+  (RV_X(x, 0, 5) << 20)
 #define ENCODE_CV_IS3_UIMM5(x) \
   (RV_X(x, 0, 5) << 25)
 
@@ -450,6 +454,7 @@ enum riscv_insn_class
   INSN_CLASS_ZICBOZ,
   INSN_CLASS_H,
   INSN_CLASS_XCVMAC,
+  INSN_CLASS_XCVALU,
   INSN_CLASS_XTHEADBA,
   INSN_CLASS_XTHEADBB,
   INSN_CLASS_XTHEADBS,
diff --git a/opcodes/riscv-dis.c b/opcodes/riscv-dis.c
index b16db5113b1..d10a1e393e7 100644
--- a/opcodes/riscv-dis.c
+++ b/opcodes/riscv-dis.c
@@ -432,16 +432,20 @@ print_insn_args (const char *oparg, insn_t l, bfd_vma pc, disassemble_info *info
 	case 'x': /* Vendor-specific operands.  */
 	  switch (*++oparg)
 	    {
-	      /* Vendor-specific (CORE-V) operands.  */
-	      case 'c':
-		switch (*++oparg)
-		  {
-		    case '3':
-		      print (info->stream, dis_style_immediate, "%d",
-			     ((int) EXTRACT_CV_IS3_UIMM5 (l)));
-		      break;
-		  }
-		break;
+	    /* Vendor-specific (CORE-V) operands.  */
+	    case 'c':
+	      switch (*++oparg)
+		{
+		  case '2':
+		    print (info->stream, dis_style_immediate, "%d",
+			   ((int) EXTRACT_CV_IS2_UIMM5 (l)));
+		    break;
+		  case '3':
+		    print (info->stream, dis_style_immediate, "%d",
+			   ((int) EXTRACT_CV_IS3_UIMM5 (l)));
+		    break;
+		}
+	      break;
 	    }
 	  break;
 
diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
index 1b2023b96bd..0b4b4b7dd4d 100644
--- a/opcodes/riscv-opc.c
+++ b/opcodes/riscv-opc.c
@@ -2065,6 +2065,41 @@ const struct riscv_opcode riscv_opcodes[] =
 {"cv.macurn",   0, INSN_CLASS_XCVMAC, "d,s,t,xc3", MATCH_CV_MACURN,   MASK_CV_MULMACN, match_opcode, 0},
 {"cv.machhurn", 0, INSN_CLASS_XCVMAC, "d,s,t,xc3", MATCH_CV_MACHHURN, MASK_CV_MULMACN, match_opcode, 0},
 
+/* Vendor-specific (CORE-V) Xcvalu instructions.  */
+{"cv.abs",     0, INSN_CLASS_XCVALU, "d,s",      MATCH_CV_ABS,     MASK_CV_ABS,  match_opcode, 0},
+{"cv.exths",   0, INSN_CLASS_XCVALU, "d,s",      MATCH_CV_EXTHS,   MASK_CV_ABS,  match_opcode, 0},
+{"cv.exthz",   0, INSN_CLASS_XCVALU, "d,s",      MATCH_CV_EXTHZ,   MASK_CV_ABS,  match_opcode, 0},
+{"cv.extbs",   0, INSN_CLASS_XCVALU, "d,s",      MATCH_CV_EXTBS,   MASK_CV_ABS,  match_opcode, 0},
+{"cv.extbz",   0, INSN_CLASS_XCVALU, "d,s",      MATCH_CV_EXTBZ,   MASK_CV_ABS,  match_opcode, 0},
+{"cv.sle",     0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SLET,    MASK_CV_SLET, match_opcode, 0},
+{"cv.slet",    0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SLET,    MASK_CV_SLET, match_opcode, INSN_ALIAS},
+{"cv.sleu",    0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SLETU,   MASK_CV_SLET, match_opcode, 0},
+{"cv.sletu",   0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SLETU,   MASK_CV_SLET, match_opcode, INSN_ALIAS},
+{"cv.min",     0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_MIN,     MASK_CV_SLET, match_opcode, 0},
+{"cv.minu",    0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_MINU,    MASK_CV_SLET, match_opcode, 0},
+{"cv.max",     0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_MAX,     MASK_CV_SLET, match_opcode, 0},
+{"cv.maxu",    0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_MAXU,    MASK_CV_SLET, match_opcode, 0},
+{"cv.clip",    0, INSN_CLASS_XCVALU, "d,s,xc2",   MATCH_CV_CLIP,    MASK_CV_SLET, match_opcode, 0},
+{"cv.clipu",   0, INSN_CLASS_XCVALU, "d,s,xc2",   MATCH_CV_CLIPU,   MASK_CV_SLET, match_opcode, 0},
+{"cv.clipr",   0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_CLIPR,   MASK_CV_SLET, match_opcode, 0},
+{"cv.clipur",  0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_CLIPUR,  MASK_CV_SLET, match_opcode, 0},
+{"cv.addn",    0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_ADDN,    MASK_CV_ADDN, match_opcode, 0},
+{"cv.addun",   0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_ADDUN,   MASK_CV_ADDN, match_opcode, 0},
+{"cv.addunr",  0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_ADDUNR,  MASK_CV_SLET, match_opcode, 0},
+{"cv.addrn",   0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_ADDRN,   MASK_CV_ADDN, match_opcode, 0},
+{"cv.addurn",  0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_ADDURN,  MASK_CV_ADDN, match_opcode, 0},
+{"cv.addnr",   0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_ADDNR,   MASK_CV_SLET, match_opcode, 0},
+{"cv.addrnr",  0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_ADDRNR,  MASK_CV_SLET, match_opcode, 0},
+{"cv.addurnr", 0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_ADDURNR, MASK_CV_SLET, match_opcode, 0},
+{"cv.subn",    0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_SUBN,    MASK_CV_ADDN, match_opcode, 0},
+{"cv.subun",   0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_SUBUN,   MASK_CV_ADDN, match_opcode, 0},
+{"cv.subrn",   0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_SUBRN,   MASK_CV_ADDN, match_opcode, 0},
+{"cv.suburn",  0, INSN_CLASS_XCVALU, "d,s,t,xc3", MATCH_CV_SUBURN,  MASK_CV_ADDN, match_opcode, 0},
+{"cv.subnr",   0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SUBNR,   MASK_CV_SLET, match_opcode, 0},
+{"cv.subunr",  0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SUBUNR,  MASK_CV_SLET, match_opcode, 0},
+{"cv.subrnr",  0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SUBRNR,  MASK_CV_SLET, match_opcode, 0},
+{"cv.suburnr", 0, INSN_CLASS_XCVALU, "d,s,t",    MATCH_CV_SUBURNR, MASK_CV_SLET, match_opcode, 0},
+
 /* Vendor-specific (T-Head) XTheadBa instructions.  */
 {"th.addsl",    0, INSN_CLASS_XTHEADBA,    "d,s,t,Xu2@25",   MATCH_TH_ADDSL,    MASK_TH_ADDSL,    match_opcode, 0},
 
