[llvm] 55e2772 - [RISCV] Add initial SDNode patterns for unary zvbb instructions
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 13 11:39:10 PDT 2023
Author: Luke Lau
Date: 2023-07-13T19:39:04+01:00
New Revision: 55e2772e9f518af7762ddb62da6bcaacecc1462b
URL: https://github.com/llvm/llvm-project/commit/55e2772e9f518af7762ddb62da6bcaacecc1462b
DIFF: https://github.com/llvm/llvm-project/commit/55e2772e9f518af7762ddb62da6bcaacecc1462b.diff
LOG: [RISCV] Add initial SDNode patterns for unary zvbb instructions
This patch adds pseudos and SDNode patterns for vbrev.v, vrev8.v, vclz.v,
vctz.v and vcpop.v.
I've only added them for integer element types so far since we're lacking tests
for floats.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D155216
Added:
Modified:
llvm/lib/Target/RISCV/RISCVISelLowering.cpp
llvm/lib/Target/RISCV/RISCVInstrInfo.td
llvm/lib/Target/RISCV/RISCVInstrInfoV.td
llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td
llvm/test/CodeGen/RISCV/rvv/bitreverse-sdnode.ll
llvm/test/CodeGen/RISCV/rvv/bswap-sdnode.ll
llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll
llvm/test/CodeGen/RISCV/rvv/ctpop-sdnode.ll
llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll
Removed:
################################################################################
diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
index 5ca897042b4a47..35570af2974297 100644
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -681,9 +681,6 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
setOperationAction({ISD::ROTL, ISD::ROTR}, VT, Expand);
- setOperationAction({ISD::CTTZ, ISD::CTLZ, ISD::CTPOP}, VT, Expand);
-
- setOperationAction(ISD::BSWAP, VT, Expand);
setOperationAction({ISD::VP_BSWAP, ISD::VP_BITREVERSE}, VT, Expand);
setOperationAction({ISD::VP_FSHL, ISD::VP_FSHR}, VT, Expand);
setOperationAction({ISD::VP_CTLZ, ISD::VP_CTLZ_ZERO_UNDEF, ISD::VP_CTTZ,
@@ -754,13 +751,20 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
// Splice
setOperationAction(ISD::VECTOR_SPLICE, VT, Custom);
- // Lower CTLZ_ZERO_UNDEF and CTTZ_ZERO_UNDEF if element of VT in the range
- // of f32.
- EVT FloatVT = MVT::getVectorVT(MVT::f32, VT.getVectorElementCount());
- if (isTypeLegal(FloatVT)) {
- setOperationAction(
- {ISD::CTLZ, ISD::CTLZ_ZERO_UNDEF, ISD::CTTZ_ZERO_UNDEF}, VT,
- Custom);
+ if (Subtarget.hasStdExtZvbb()) {
+ setOperationAction({ISD::BITREVERSE, ISD::BSWAP}, VT, Legal);
+ } else {
+ setOperationAction({ISD::BITREVERSE, ISD::BSWAP}, VT, Expand);
+ setOperationAction({ISD::CTTZ, ISD::CTLZ, ISD::CTPOP}, VT, Expand);
+
+ // Lower CTLZ_ZERO_UNDEF and CTTZ_ZERO_UNDEF if element of VT in the
+ // range of f32.
+ EVT FloatVT = MVT::getVectorVT(MVT::f32, VT.getVectorElementCount());
+ if (isTypeLegal(FloatVT)) {
+ setOperationAction(
+ {ISD::CTLZ, ISD::CTLZ_ZERO_UNDEF, ISD::CTTZ_ZERO_UNDEF}, VT,
+ Custom);
+ }
}
}
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
index 27c2f3cee67313..4b13d514d50849 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -1942,6 +1942,8 @@ include "RISCVInstrInfoZb.td"
include "RISCVInstrInfoZc.td"
include "RISCVInstrInfoZk.td"
include "RISCVInstrInfoV.td"
+include "RISCVInstrInfoZvfbf.td"
+include "RISCVInstrInfoZvk.td"
include "RISCVInstrInfoZfa.td"
include "RISCVInstrInfoZfbfmin.td"
include "RISCVInstrInfoZfh.td"
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
index 43028f4e0c052f..6cf3dbda5b016e 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
@@ -1785,6 +1785,4 @@ let Predicates = [HasVInstructionsI64, IsRV64] in {
}
} // Predicates = [HasVInstructionsI64, IsRV64]
-include "RISCVInstrInfoZvfbf.td"
-include "RISCVInstrInfoZvk.td"
include "RISCVInstrInfoVPseudos.td"
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td b/llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td
index 85985e80d6c51b..eb1391206e8862 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoZvk.td
@@ -177,3 +177,47 @@ let Predicates = [HasStdExtZvksh], RVVConstraint = NoConstraint in {
def VSM3C_VI : PALUVINoVm<0b101011, "vsm3c.vi", uimm5>;
def VSM3ME_VV : PALUVVNoVm<0b100000, OPMVV, "vsm3me.vv">;
} // Predicates = [HasStdExtZvksh]
+
+//===----------------------------------------------------------------------===//
+// Pseudo instructions
+//===----------------------------------------------------------------------===//
+
+multiclass VPseudoUnaryV_V {
+ foreach m = MxList in {
+ let VLMul = m.value in {
+ def "_V_" # m.MX : VPseudoUnaryNoMask<m.vrclass, m.vrclass>;
+ def "_V_" # m.MX # "_MASK" : VPseudoUnaryMask<m.vrclass, m.vrclass>,
+ RISCVMaskedPseudo</*MaskOpIdx*/ 2>;
+ }
+ }
+}
+
+defm PseudoVBREV : VPseudoUnaryV_V;
+defm PseudoVREV8 : VPseudoUnaryV_V;
+defm PseudoVCLZ : VPseudoUnaryV_V;
+defm PseudoVCTZ : VPseudoUnaryV_V;
+defm PseudoVCPOP : VPseudoUnaryV_V;
+
+//===----------------------------------------------------------------------===//
+// SDNode patterns
+//===----------------------------------------------------------------------===//
+
+multiclass VPatUnarySDNode_V<SDPatternOperator op, string instruction_name> {
+ foreach vti = AllIntegerVectors in {
+ let Predicates = GetVTypePredicates<vti>.Predicates in {
+ def : Pat<(vti.Vector (op (vti.Vector vti.RegClass:$rs1))),
+ (!cast<Instruction>(instruction_name#"_V_"#vti.LMul.MX)
+ (vti.Vector (IMPLICIT_DEF)),
+ vti.RegClass:$rs1,
+ vti.AVL, vti.Log2SEW, TA_MA)>;
+ }
+ }
+}
+
+let Predicates = [HasStdExtZvbb] in {
+ defm : VPatUnarySDNode_V<bitreverse, "PseudoVBREV">;
+ defm : VPatUnarySDNode_V<bswap, "PseudoVREV8">;
+ defm : VPatUnarySDNode_V<ctlz, "PseudoVCLZ">;
+ defm : VPatUnarySDNode_V<cttz, "PseudoVCTZ">;
+ defm : VPatUnarySDNode_V<ctpop, "PseudoVCPOP">;
+}
diff --git a/llvm/test/CodeGen/RISCV/rvv/bitreverse-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/bitreverse-sdnode.ll
index 5acb3564a9f36a..5ed6aba4441505 100644
--- a/llvm/test/CodeGen/RISCV/rvv/bitreverse-sdnode.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/bitreverse-sdnode.ll
@@ -1,6 +1,8 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
+; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
+; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
define <vscale x 1 x i8> @bitreverse_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-LABEL: bitreverse_nxv1i8:
@@ -24,6 +26,12 @@ define <vscale x 1 x i8> @bitreverse_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v8
; CHECK-NEXT: vor.vv v8, v9, v8
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv1i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i8> @llvm.bitreverse.nxv1i8(<vscale x 1 x i8> %va)
ret <vscale x 1 x i8> %a
}
@@ -51,6 +59,12 @@ define <vscale x 2 x i8> @bitreverse_nxv2i8(<vscale x 2 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v8
; CHECK-NEXT: vor.vv v8, v9, v8
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv2i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i8> @llvm.bitreverse.nxv2i8(<vscale x 2 x i8> %va)
ret <vscale x 2 x i8> %a
}
@@ -78,6 +92,12 @@ define <vscale x 4 x i8> @bitreverse_nxv4i8(<vscale x 4 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v8
; CHECK-NEXT: vor.vv v8, v9, v8
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv4i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i8> @llvm.bitreverse.nxv4i8(<vscale x 4 x i8> %va)
ret <vscale x 4 x i8> %a
}
@@ -105,6 +125,12 @@ define <vscale x 8 x i8> @bitreverse_nxv8i8(<vscale x 8 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v8
; CHECK-NEXT: vor.vv v8, v9, v8
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv8i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m1, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i8> @llvm.bitreverse.nxv8i8(<vscale x 8 x i8> %va)
ret <vscale x 8 x i8> %a
}
@@ -132,6 +158,12 @@ define <vscale x 16 x i8> @bitreverse_nxv16i8(<vscale x 16 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v8
; CHECK-NEXT: vor.vv v8, v10, v8
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv16i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m2, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i8> @llvm.bitreverse.nxv16i8(<vscale x 16 x i8> %va)
ret <vscale x 16 x i8> %a
}
@@ -159,6 +191,12 @@ define <vscale x 32 x i8> @bitreverse_nxv32i8(<vscale x 32 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v8
; CHECK-NEXT: vor.vv v8, v12, v8
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv32i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m4, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i8> @llvm.bitreverse.nxv32i8(<vscale x 32 x i8> %va)
ret <vscale x 32 x i8> %a
}
@@ -186,6 +224,12 @@ define <vscale x 64 x i8> @bitreverse_nxv64i8(<vscale x 64 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v8
; CHECK-NEXT: vor.vv v8, v16, v8
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv64i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m8, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 64 x i8> @llvm.bitreverse.nxv64i8(<vscale x 64 x i8> %va)
ret <vscale x 64 x i8> %a
}
@@ -249,6 +293,12 @@ define <vscale x 1 x i16> @bitreverse_nxv1i16(<vscale x 1 x i16> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v9, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv1i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i16> @llvm.bitreverse.nxv1i16(<vscale x 1 x i16> %va)
ret <vscale x 1 x i16> %a
}
@@ -312,6 +362,12 @@ define <vscale x 2 x i16> @bitreverse_nxv2i16(<vscale x 2 x i16> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v9, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv2i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i16> @llvm.bitreverse.nxv2i16(<vscale x 2 x i16> %va)
ret <vscale x 2 x i16> %a
}
@@ -375,6 +431,12 @@ define <vscale x 4 x i16> @bitreverse_nxv4i16(<vscale x 4 x i16> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v9, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv4i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m1, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i16> @llvm.bitreverse.nxv4i16(<vscale x 4 x i16> %va)
ret <vscale x 4 x i16> %a
}
@@ -438,6 +500,12 @@ define <vscale x 8 x i16> @bitreverse_nxv8i16(<vscale x 8 x i16> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v10, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv8i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m2, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i16> @llvm.bitreverse.nxv8i16(<vscale x 8 x i16> %va)
ret <vscale x 8 x i16> %a
}
@@ -501,6 +569,12 @@ define <vscale x 16 x i16> @bitreverse_nxv16i16(<vscale x 16 x i16> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v12, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv16i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m4, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i16> @llvm.bitreverse.nxv16i16(<vscale x 16 x i16> %va)
ret <vscale x 16 x i16> %a
}
@@ -564,6 +638,12 @@ define <vscale x 32 x i16> @bitreverse_nxv32i16(<vscale x 32 x i16> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v16, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv32i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m8, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i16> @llvm.bitreverse.nxv32i16(<vscale x 32 x i16> %va)
ret <vscale x 32 x i16> %a
}
@@ -643,6 +723,12 @@ define <vscale x 1 x i32> @bitreverse_nxv1i32(<vscale x 1 x i32> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v9, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv1i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i32> @llvm.bitreverse.nxv1i32(<vscale x 1 x i32> %va)
ret <vscale x 1 x i32> %a
}
@@ -722,6 +808,12 @@ define <vscale x 2 x i32> @bitreverse_nxv2i32(<vscale x 2 x i32> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v9, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv2i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i32> @llvm.bitreverse.nxv2i32(<vscale x 2 x i32> %va)
ret <vscale x 2 x i32> %a
}
@@ -801,6 +893,12 @@ define <vscale x 4 x i32> @bitreverse_nxv4i32(<vscale x 4 x i32> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v10, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv4i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m2, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i32> @llvm.bitreverse.nxv4i32(<vscale x 4 x i32> %va)
ret <vscale x 4 x i32> %a
}
@@ -880,6 +978,12 @@ define <vscale x 8 x i32> @bitreverse_nxv8i32(<vscale x 8 x i32> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v12, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv8i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i32> @llvm.bitreverse.nxv8i32(<vscale x 8 x i32> %va)
ret <vscale x 8 x i32> %a
}
@@ -959,6 +1063,12 @@ define <vscale x 16 x i32> @bitreverse_nxv16i32(<vscale x 16 x i32> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v16, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv16i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m8, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i32> @llvm.bitreverse.nxv16i32(<vscale x 16 x i32> %va)
ret <vscale x 16 x i32> %a
}
@@ -1096,6 +1206,12 @@ define <vscale x 1 x i64> @bitreverse_nxv1i64(<vscale x 1 x i64> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v9, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv1i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i64> @llvm.bitreverse.nxv1i64(<vscale x 1 x i64> %va)
ret <vscale x 1 x i64> %a
}
@@ -1233,6 +1349,12 @@ define <vscale x 2 x i64> @bitreverse_nxv2i64(<vscale x 2 x i64> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v10, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv2i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i64> @llvm.bitreverse.nxv2i64(<vscale x 2 x i64> %va)
ret <vscale x 2 x i64> %a
}
@@ -1370,6 +1492,12 @@ define <vscale x 4 x i64> @bitreverse_nxv4i64(<vscale x 4 x i64> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v12, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv4i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m4, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i64> @llvm.bitreverse.nxv4i64(<vscale x 4 x i64> %va)
ret <vscale x 4 x i64> %a
}
@@ -1521,6 +1649,12 @@ define <vscale x 8 x i64> @bitreverse_nxv8i64(<vscale x 8 x i64> %va) {
; RV64-NEXT: vadd.vv v8, v8, v8
; RV64-NEXT: vor.vv v8, v16, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bitreverse_nxv8i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m8, ta, ma
+; CHECK-ZVBB-NEXT: vbrev.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i64> @llvm.bitreverse.nxv8i64(<vscale x 8 x i64> %va)
ret <vscale x 8 x i64> %a
}
diff --git a/llvm/test/CodeGen/RISCV/rvv/bswap-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/bswap-sdnode.ll
index e9015e0fa37991..83c740d6cda4d6 100644
--- a/llvm/test/CodeGen/RISCV/rvv/bswap-sdnode.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/bswap-sdnode.ll
@@ -1,6 +1,8 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
+; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
+; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
define <vscale x 1 x i16> @bswap_nxv1i16(<vscale x 1 x i16> %va) {
; CHECK-LABEL: bswap_nxv1i16:
@@ -10,6 +12,12 @@ define <vscale x 1 x i16> @bswap_nxv1i16(<vscale x 1 x i16> %va) {
; CHECK-NEXT: vsll.vi v8, v8, 8
; CHECK-NEXT: vor.vv v8, v8, v9
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv1i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i16> @llvm.bswap.nxv1i16(<vscale x 1 x i16> %va)
ret <vscale x 1 x i16> %a
}
@@ -23,6 +31,12 @@ define <vscale x 2 x i16> @bswap_nxv2i16(<vscale x 2 x i16> %va) {
; CHECK-NEXT: vsll.vi v8, v8, 8
; CHECK-NEXT: vor.vv v8, v8, v9
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv2i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i16> @llvm.bswap.nxv2i16(<vscale x 2 x i16> %va)
ret <vscale x 2 x i16> %a
}
@@ -36,6 +50,12 @@ define <vscale x 4 x i16> @bswap_nxv4i16(<vscale x 4 x i16> %va) {
; CHECK-NEXT: vsll.vi v8, v8, 8
; CHECK-NEXT: vor.vv v8, v8, v9
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv4i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m1, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i16> @llvm.bswap.nxv4i16(<vscale x 4 x i16> %va)
ret <vscale x 4 x i16> %a
}
@@ -49,6 +69,12 @@ define <vscale x 8 x i16> @bswap_nxv8i16(<vscale x 8 x i16> %va) {
; CHECK-NEXT: vsll.vi v8, v8, 8
; CHECK-NEXT: vor.vv v8, v8, v10
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv8i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m2, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i16> @llvm.bswap.nxv8i16(<vscale x 8 x i16> %va)
ret <vscale x 8 x i16> %a
}
@@ -62,6 +88,12 @@ define <vscale x 16 x i16> @bswap_nxv16i16(<vscale x 16 x i16> %va) {
; CHECK-NEXT: vsll.vi v8, v8, 8
; CHECK-NEXT: vor.vv v8, v8, v12
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv16i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m4, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i16> @llvm.bswap.nxv16i16(<vscale x 16 x i16> %va)
ret <vscale x 16 x i16> %a
}
@@ -75,6 +107,12 @@ define <vscale x 32 x i16> @bswap_nxv32i16(<vscale x 32 x i16> %va) {
; CHECK-NEXT: vsll.vi v8, v8, 8
; CHECK-NEXT: vor.vv v8, v8, v16
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv32i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m8, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i16> @llvm.bswap.nxv32i16(<vscale x 32 x i16> %va)
ret <vscale x 32 x i16> %a
}
@@ -112,6 +150,12 @@ define <vscale x 1 x i32> @bswap_nxv1i32(<vscale x 1 x i32> %va) {
; RV64-NEXT: vor.vv v8, v8, v10
; RV64-NEXT: vor.vv v8, v8, v9
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv1i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i32> @llvm.bswap.nxv1i32(<vscale x 1 x i32> %va)
ret <vscale x 1 x i32> %a
}
@@ -149,6 +193,12 @@ define <vscale x 2 x i32> @bswap_nxv2i32(<vscale x 2 x i32> %va) {
; RV64-NEXT: vor.vv v8, v8, v10
; RV64-NEXT: vor.vv v8, v8, v9
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv2i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i32> @llvm.bswap.nxv2i32(<vscale x 2 x i32> %va)
ret <vscale x 2 x i32> %a
}
@@ -186,6 +236,12 @@ define <vscale x 4 x i32> @bswap_nxv4i32(<vscale x 4 x i32> %va) {
; RV64-NEXT: vor.vv v8, v8, v12
; RV64-NEXT: vor.vv v8, v8, v10
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv4i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m2, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i32> @llvm.bswap.nxv4i32(<vscale x 4 x i32> %va)
ret <vscale x 4 x i32> %a
}
@@ -223,6 +279,12 @@ define <vscale x 8 x i32> @bswap_nxv8i32(<vscale x 8 x i32> %va) {
; RV64-NEXT: vor.vv v8, v8, v16
; RV64-NEXT: vor.vv v8, v8, v12
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv8i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i32> @llvm.bswap.nxv8i32(<vscale x 8 x i32> %va)
ret <vscale x 8 x i32> %a
}
@@ -260,6 +322,12 @@ define <vscale x 16 x i32> @bswap_nxv16i32(<vscale x 16 x i32> %va) {
; RV64-NEXT: vor.vv v8, v8, v24
; RV64-NEXT: vor.vv v8, v8, v16
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv16i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m8, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i32> @llvm.bswap.nxv16i32(<vscale x 16 x i32> %va)
ret <vscale x 16 x i32> %a
}
@@ -337,6 +405,12 @@ define <vscale x 1 x i64> @bswap_nxv1i64(<vscale x 1 x i64> %va) {
; RV64-NEXT: vor.vv v8, v8, v10
; RV64-NEXT: vor.vv v8, v9, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv1i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i64> @llvm.bswap.nxv1i64(<vscale x 1 x i64> %va)
ret <vscale x 1 x i64> %a
}
@@ -414,6 +488,12 @@ define <vscale x 2 x i64> @bswap_nxv2i64(<vscale x 2 x i64> %va) {
; RV64-NEXT: vor.vv v8, v8, v12
; RV64-NEXT: vor.vv v8, v10, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv2i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i64> @llvm.bswap.nxv2i64(<vscale x 2 x i64> %va)
ret <vscale x 2 x i64> %a
}
@@ -491,6 +571,12 @@ define <vscale x 4 x i64> @bswap_nxv4i64(<vscale x 4 x i64> %va) {
; RV64-NEXT: vor.vv v8, v8, v16
; RV64-NEXT: vor.vv v8, v12, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv4i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m4, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i64> @llvm.bswap.nxv4i64(<vscale x 4 x i64> %va)
ret <vscale x 4 x i64> %a
}
@@ -582,6 +668,12 @@ define <vscale x 8 x i64> @bswap_nxv8i64(<vscale x 8 x i64> %va) {
; RV64-NEXT: vor.vv v8, v8, v24
; RV64-NEXT: vor.vv v8, v16, v8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: bswap_nxv8i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m8, ta, ma
+; CHECK-ZVBB-NEXT: vrev8.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i64> @llvm.bswap.nxv8i64(<vscale x 8 x i64> %va)
ret <vscale x 8 x i64> %a
}
diff --git a/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll
index 5e7aa202fe9f2e..8b8e10b0c514ca 100644
--- a/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/ctlz-sdnode.ll
@@ -5,6 +5,8 @@
; RUN: llc -mtriple=riscv64 -mattr=+zve64f,+f -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-F,RV64
; RUN: llc -mtriple=riscv32 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-D,RV32
; RUN: llc -mtriple=riscv64 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-D,RV64
+; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
+; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
define <vscale x 1 x i8> @ctlz_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-ZVE64X-LABEL: ctlz_nxv1i8:
@@ -58,6 +60,12 @@ define <vscale x 1 x i8> @ctlz_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-D-NEXT: li a0, 8
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv1i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 false)
ret <vscale x 1 x i8> %a
}
@@ -115,6 +123,12 @@ define <vscale x 2 x i8> @ctlz_nxv2i8(<vscale x 2 x i8> %va) {
; CHECK-D-NEXT: li a0, 8
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv2i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 false)
ret <vscale x 2 x i8> %a
}
@@ -172,6 +186,12 @@ define <vscale x 4 x i8> @ctlz_nxv4i8(<vscale x 4 x i8> %va) {
; CHECK-D-NEXT: li a0, 8
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv4i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 false)
ret <vscale x 4 x i8> %a
}
@@ -229,6 +249,12 @@ define <vscale x 8 x i8> @ctlz_nxv8i8(<vscale x 8 x i8> %va) {
; CHECK-D-NEXT: li a0, 8
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv8i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 false)
ret <vscale x 8 x i8> %a
}
@@ -286,6 +312,12 @@ define <vscale x 16 x i8> @ctlz_nxv16i8(<vscale x 16 x i8> %va) {
; CHECK-D-NEXT: li a0, 8
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv16i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 false)
ret <vscale x 16 x i8> %a
}
@@ -315,6 +347,12 @@ define <vscale x 32 x i8> @ctlz_nxv32i8(<vscale x 32 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v12
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv32i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 false)
ret <vscale x 32 x i8> %a
}
@@ -344,6 +382,12 @@ define <vscale x 64 x i8> @ctlz_nxv64i8(<vscale x 64 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v16
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv64i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 false)
ret <vscale x 64 x i8> %a
}
@@ -437,6 +481,12 @@ define <vscale x 1 x i16> @ctlz_nxv1i16(<vscale x 1 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv1i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 false)
ret <vscale x 1 x i16> %a
}
@@ -530,6 +580,12 @@ define <vscale x 2 x i16> @ctlz_nxv2i16(<vscale x 2 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv2i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 false)
ret <vscale x 2 x i16> %a
}
@@ -623,6 +679,12 @@ define <vscale x 4 x i16> @ctlz_nxv4i16(<vscale x 4 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv4i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 false)
ret <vscale x 4 x i16> %a
}
@@ -716,6 +778,12 @@ define <vscale x 8 x i16> @ctlz_nxv8i16(<vscale x 8 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv8i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 false)
ret <vscale x 8 x i16> %a
}
@@ -809,6 +877,12 @@ define <vscale x 16 x i16> @ctlz_nxv16i16(<vscale x 16 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv16i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 false)
ret <vscale x 16 x i16> %a
}
@@ -880,6 +954,12 @@ define <vscale x 32 x i16> @ctlz_nxv32i16(<vscale x 32 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv32i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 false)
ret <vscale x 32 x i16> %a
}
@@ -985,6 +1065,12 @@ define <vscale x 1 x i32> @ctlz_nxv1i32(<vscale x 1 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv1i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 false)
ret <vscale x 1 x i32> %a
}
@@ -1090,6 +1176,12 @@ define <vscale x 2 x i32> @ctlz_nxv2i32(<vscale x 2 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv2i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 false)
ret <vscale x 2 x i32> %a
}
@@ -1195,6 +1287,12 @@ define <vscale x 4 x i32> @ctlz_nxv4i32(<vscale x 4 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv4i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 false)
ret <vscale x 4 x i32> %a
}
@@ -1300,6 +1398,12 @@ define <vscale x 8 x i32> @ctlz_nxv8i32(<vscale x 8 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vminu.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv8i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 false)
ret <vscale x 8 x i32> %a
}
@@ -1403,6 +1507,12 @@ define <vscale x 16 x i32> @ctlz_nxv16i32(<vscale x 16 x i32> %va) {
; CHECK-D-NEXT: vminu.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv16i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 false)
ret <vscale x 16 x i32> %a
}
@@ -1544,6 +1654,12 @@ define <vscale x 1 x i64> @ctlz_nxv1i64(<vscale x 1 x i64> %va) {
; CHECK-D-NEXT: vminu.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv1i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 false)
ret <vscale x 1 x i64> %a
}
@@ -1685,6 +1801,12 @@ define <vscale x 2 x i64> @ctlz_nxv2i64(<vscale x 2 x i64> %va) {
; CHECK-D-NEXT: vminu.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv2i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 false)
ret <vscale x 2 x i64> %a
}
@@ -1826,6 +1948,12 @@ define <vscale x 4 x i64> @ctlz_nxv4i64(<vscale x 4 x i64> %va) {
; CHECK-D-NEXT: vminu.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv4i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 false)
ret <vscale x 4 x i64> %a
}
@@ -1967,6 +2095,12 @@ define <vscale x 8 x i64> @ctlz_nxv8i64(<vscale x 8 x i64> %va) {
; CHECK-D-NEXT: vminu.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_nxv8i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 false)
ret <vscale x 8 x i64> %a
}
@@ -2020,6 +2154,12 @@ define <vscale x 1 x i8> @ctlz_zero_undef_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-D-NEXT: li a0, 134
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i8> @llvm.ctlz.nxv1i8(<vscale x 1 x i8> %va, i1 true)
ret <vscale x 1 x i8> %a
}
@@ -2072,6 +2212,12 @@ define <vscale x 2 x i8> @ctlz_zero_undef_nxv2i8(<vscale x 2 x i8> %va) {
; CHECK-D-NEXT: li a0, 134
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i8> @llvm.ctlz.nxv2i8(<vscale x 2 x i8> %va, i1 true)
ret <vscale x 2 x i8> %a
}
@@ -2124,6 +2270,12 @@ define <vscale x 4 x i8> @ctlz_zero_undef_nxv4i8(<vscale x 4 x i8> %va) {
; CHECK-D-NEXT: li a0, 134
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i8> @llvm.ctlz.nxv4i8(<vscale x 4 x i8> %va, i1 true)
ret <vscale x 4 x i8> %a
}
@@ -2176,6 +2328,12 @@ define <vscale x 8 x i8> @ctlz_zero_undef_nxv8i8(<vscale x 8 x i8> %va) {
; CHECK-D-NEXT: li a0, 134
; CHECK-D-NEXT: vrsub.vx v8, v10, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i8> @llvm.ctlz.nxv8i8(<vscale x 8 x i8> %va, i1 true)
ret <vscale x 8 x i8> %a
}
@@ -2228,6 +2386,12 @@ define <vscale x 16 x i8> @ctlz_zero_undef_nxv16i8(<vscale x 16 x i8> %va) {
; CHECK-D-NEXT: li a0, 134
; CHECK-D-NEXT: vrsub.vx v8, v12, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv16i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i8> @llvm.ctlz.nxv16i8(<vscale x 16 x i8> %va, i1 true)
ret <vscale x 16 x i8> %a
}
@@ -2256,6 +2420,12 @@ define <vscale x 32 x i8> @ctlz_zero_undef_nxv32i8(<vscale x 32 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v12
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv32i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i8> @llvm.ctlz.nxv32i8(<vscale x 32 x i8> %va, i1 true)
ret <vscale x 32 x i8> %a
}
@@ -2284,6 +2454,12 @@ define <vscale x 64 x i8> @ctlz_zero_undef_nxv64i8(<vscale x 64 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v16
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv64i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 64 x i8> @llvm.ctlz.nxv64i8(<vscale x 64 x i8> %va, i1 true)
ret <vscale x 64 x i8> %a
}
@@ -2372,6 +2548,12 @@ define <vscale x 1 x i16> @ctlz_zero_undef_nxv1i16(<vscale x 1 x i16> %va) {
; CHECK-D-NEXT: li a0, 142
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i16> @llvm.ctlz.nxv1i16(<vscale x 1 x i16> %va, i1 true)
ret <vscale x 1 x i16> %a
}
@@ -2460,6 +2642,12 @@ define <vscale x 2 x i16> @ctlz_zero_undef_nxv2i16(<vscale x 2 x i16> %va) {
; CHECK-D-NEXT: li a0, 142
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i16> @llvm.ctlz.nxv2i16(<vscale x 2 x i16> %va, i1 true)
ret <vscale x 2 x i16> %a
}
@@ -2548,6 +2736,12 @@ define <vscale x 4 x i16> @ctlz_zero_undef_nxv4i16(<vscale x 4 x i16> %va) {
; CHECK-D-NEXT: li a0, 142
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i16> @llvm.ctlz.nxv4i16(<vscale x 4 x i16> %va, i1 true)
ret <vscale x 4 x i16> %a
}
@@ -2636,6 +2830,12 @@ define <vscale x 8 x i16> @ctlz_zero_undef_nxv8i16(<vscale x 8 x i16> %va) {
; CHECK-D-NEXT: li a0, 142
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i16> @llvm.ctlz.nxv8i16(<vscale x 8 x i16> %va, i1 true)
ret <vscale x 8 x i16> %a
}
@@ -2724,6 +2924,12 @@ define <vscale x 16 x i16> @ctlz_zero_undef_nxv16i16(<vscale x 16 x i16> %va) {
; CHECK-D-NEXT: li a0, 142
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv16i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i16> @llvm.ctlz.nxv16i16(<vscale x 16 x i16> %va, i1 true)
ret <vscale x 16 x i16> %a
}
@@ -2794,6 +3000,12 @@ define <vscale x 32 x i16> @ctlz_zero_undef_nxv32i16(<vscale x 32 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv32i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i16> @llvm.ctlz.nxv32i16(<vscale x 32 x i16> %va, i1 true)
ret <vscale x 32 x i16> %a
}
@@ -2894,6 +3106,12 @@ define <vscale x 1 x i32> @ctlz_zero_undef_nxv1i32(<vscale x 1 x i32> %va) {
; CHECK-D-NEXT: li a0, 1054
; CHECK-D-NEXT: vrsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i32> @llvm.ctlz.nxv1i32(<vscale x 1 x i32> %va, i1 true)
ret <vscale x 1 x i32> %a
}
@@ -2994,6 +3212,12 @@ define <vscale x 2 x i32> @ctlz_zero_undef_nxv2i32(<vscale x 2 x i32> %va) {
; CHECK-D-NEXT: li a0, 1054
; CHECK-D-NEXT: vrsub.vx v8, v10, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i32> @llvm.ctlz.nxv2i32(<vscale x 2 x i32> %va, i1 true)
ret <vscale x 2 x i32> %a
}
@@ -3094,6 +3318,12 @@ define <vscale x 4 x i32> @ctlz_zero_undef_nxv4i32(<vscale x 4 x i32> %va) {
; CHECK-D-NEXT: li a0, 1054
; CHECK-D-NEXT: vrsub.vx v8, v12, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i32> @llvm.ctlz.nxv4i32(<vscale x 4 x i32> %va, i1 true)
ret <vscale x 4 x i32> %a
}
@@ -3194,6 +3424,12 @@ define <vscale x 8 x i32> @ctlz_zero_undef_nxv8i32(<vscale x 8 x i32> %va) {
; CHECK-D-NEXT: li a0, 1054
; CHECK-D-NEXT: vrsub.vx v8, v16, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i32> @llvm.ctlz.nxv8i32(<vscale x 8 x i32> %va, i1 true)
ret <vscale x 8 x i32> %a
}
@@ -3292,6 +3528,12 @@ define <vscale x 16 x i32> @ctlz_zero_undef_nxv16i32(<vscale x 16 x i32> %va) {
; CHECK-D-NEXT: vrsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv16i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i32> @llvm.ctlz.nxv16i32(<vscale x 16 x i32> %va, i1 true)
ret <vscale x 16 x i32> %a
}
@@ -3428,6 +3670,12 @@ define <vscale x 1 x i64> @ctlz_zero_undef_nxv1i64(<vscale x 1 x i64> %va) {
; CHECK-D-NEXT: vrsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv1i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i64> @llvm.ctlz.nxv1i64(<vscale x 1 x i64> %va, i1 true)
ret <vscale x 1 x i64> %a
}
@@ -3564,6 +3812,12 @@ define <vscale x 2 x i64> @ctlz_zero_undef_nxv2i64(<vscale x 2 x i64> %va) {
; CHECK-D-NEXT: vrsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv2i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i64> @llvm.ctlz.nxv2i64(<vscale x 2 x i64> %va, i1 true)
ret <vscale x 2 x i64> %a
}
@@ -3700,6 +3954,12 @@ define <vscale x 4 x i64> @ctlz_zero_undef_nxv4i64(<vscale x 4 x i64> %va) {
; CHECK-D-NEXT: vrsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv4i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m4, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i64> @llvm.ctlz.nxv4i64(<vscale x 4 x i64> %va, i1 true)
ret <vscale x 4 x i64> %a
}
@@ -3836,6 +4096,12 @@ define <vscale x 8 x i64> @ctlz_zero_undef_nxv8i64(<vscale x 8 x i64> %va) {
; CHECK-D-NEXT: vrsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctlz_zero_undef_nxv8i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m8, ta, ma
+; CHECK-ZVBB-NEXT: vclz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i64> @llvm.ctlz.nxv8i64(<vscale x 8 x i64> %va, i1 true)
ret <vscale x 8 x i64> %a
}
diff --git a/llvm/test/CodeGen/RISCV/rvv/ctpop-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/ctpop-sdnode.ll
index f2cfd54a43563e..af3d9f09e10851 100644
--- a/llvm/test/CodeGen/RISCV/rvv/ctpop-sdnode.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/ctpop-sdnode.ll
@@ -1,6 +1,8 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
+; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
+; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
define <vscale x 1 x i8> @ctpop_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-LABEL: ctpop_nxv1i8:
@@ -19,6 +21,12 @@ define <vscale x 1 x i8> @ctpop_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v9
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv1i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i8> @llvm.ctpop.nxv1i8(<vscale x 1 x i8> %va)
ret <vscale x 1 x i8> %a
}
@@ -41,6 +49,12 @@ define <vscale x 2 x i8> @ctpop_nxv2i8(<vscale x 2 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v9
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv2i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i8> @llvm.ctpop.nxv2i8(<vscale x 2 x i8> %va)
ret <vscale x 2 x i8> %a
}
@@ -63,6 +77,12 @@ define <vscale x 4 x i8> @ctpop_nxv4i8(<vscale x 4 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v9
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv4i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i8> @llvm.ctpop.nxv4i8(<vscale x 4 x i8> %va)
ret <vscale x 4 x i8> %a
}
@@ -85,6 +105,12 @@ define <vscale x 8 x i8> @ctpop_nxv8i8(<vscale x 8 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v9
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv8i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m1, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i8> @llvm.ctpop.nxv8i8(<vscale x 8 x i8> %va)
ret <vscale x 8 x i8> %a
}
@@ -107,6 +133,12 @@ define <vscale x 16 x i8> @ctpop_nxv16i8(<vscale x 16 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v10
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv16i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m2, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i8> @llvm.ctpop.nxv16i8(<vscale x 16 x i8> %va)
ret <vscale x 16 x i8> %a
}
@@ -129,6 +161,12 @@ define <vscale x 32 x i8> @ctpop_nxv32i8(<vscale x 32 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v12
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv32i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m4, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i8> @llvm.ctpop.nxv32i8(<vscale x 32 x i8> %va)
ret <vscale x 32 x i8> %a
}
@@ -151,6 +189,12 @@ define <vscale x 64 x i8> @ctpop_nxv64i8(<vscale x 64 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v16
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv64i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m8, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 64 x i8> @llvm.ctpop.nxv64i8(<vscale x 64 x i8> %va)
ret <vscale x 64 x i8> %a
}
@@ -204,6 +248,12 @@ define <vscale x 1 x i16> @ctpop_nxv1i16(<vscale x 1 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv1i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i16> @llvm.ctpop.nxv1i16(<vscale x 1 x i16> %va)
ret <vscale x 1 x i16> %a
}
@@ -257,6 +307,12 @@ define <vscale x 2 x i16> @ctpop_nxv2i16(<vscale x 2 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv2i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i16> @llvm.ctpop.nxv2i16(<vscale x 2 x i16> %va)
ret <vscale x 2 x i16> %a
}
@@ -310,6 +366,12 @@ define <vscale x 4 x i16> @ctpop_nxv4i16(<vscale x 4 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv4i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m1, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i16> @llvm.ctpop.nxv4i16(<vscale x 4 x i16> %va)
ret <vscale x 4 x i16> %a
}
@@ -363,6 +425,12 @@ define <vscale x 8 x i16> @ctpop_nxv8i16(<vscale x 8 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv8i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m2, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i16> @llvm.ctpop.nxv8i16(<vscale x 8 x i16> %va)
ret <vscale x 8 x i16> %a
}
@@ -416,6 +484,12 @@ define <vscale x 16 x i16> @ctpop_nxv16i16(<vscale x 16 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv16i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m4, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i16> @llvm.ctpop.nxv16i16(<vscale x 16 x i16> %va)
ret <vscale x 16 x i16> %a
}
@@ -469,6 +543,12 @@ define <vscale x 32 x i16> @ctpop_nxv32i16(<vscale x 32 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv32i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m8, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i16> @llvm.ctpop.nxv32i16(<vscale x 32 x i16> %va)
ret <vscale x 32 x i16> %a
}
@@ -524,6 +604,12 @@ define <vscale x 1 x i32> @ctpop_nxv1i32(<vscale x 1 x i32> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 24
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv1i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i32> @llvm.ctpop.nxv1i32(<vscale x 1 x i32> %va)
ret <vscale x 1 x i32> %a
}
@@ -579,6 +665,12 @@ define <vscale x 2 x i32> @ctpop_nxv2i32(<vscale x 2 x i32> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 24
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv2i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i32> @llvm.ctpop.nxv2i32(<vscale x 2 x i32> %va)
ret <vscale x 2 x i32> %a
}
@@ -634,6 +726,12 @@ define <vscale x 4 x i32> @ctpop_nxv4i32(<vscale x 4 x i32> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 24
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv4i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m2, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i32> @llvm.ctpop.nxv4i32(<vscale x 4 x i32> %va)
ret <vscale x 4 x i32> %a
}
@@ -689,6 +787,12 @@ define <vscale x 8 x i32> @ctpop_nxv8i32(<vscale x 8 x i32> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 24
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv8i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i32> @llvm.ctpop.nxv8i32(<vscale x 8 x i32> %va)
ret <vscale x 8 x i32> %a
}
@@ -744,6 +848,12 @@ define <vscale x 16 x i32> @ctpop_nxv16i32(<vscale x 16 x i32> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 24
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv16i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m8, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i32> @llvm.ctpop.nxv16i32(<vscale x 16 x i32> %va)
ret <vscale x 16 x i32> %a
}
@@ -828,6 +938,12 @@ define <vscale x 1 x i64> @ctpop_nxv1i64(<vscale x 1 x i64> %va) {
; RV64-NEXT: li a0, 56
; RV64-NEXT: vsrl.vx v8, v8, a0
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv1i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i64> @llvm.ctpop.nxv1i64(<vscale x 1 x i64> %va)
ret <vscale x 1 x i64> %a
}
@@ -912,6 +1028,12 @@ define <vscale x 2 x i64> @ctpop_nxv2i64(<vscale x 2 x i64> %va) {
; RV64-NEXT: li a0, 56
; RV64-NEXT: vsrl.vx v8, v8, a0
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv2i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i64> @llvm.ctpop.nxv2i64(<vscale x 2 x i64> %va)
ret <vscale x 2 x i64> %a
}
@@ -996,6 +1118,12 @@ define <vscale x 4 x i64> @ctpop_nxv4i64(<vscale x 4 x i64> %va) {
; RV64-NEXT: li a0, 56
; RV64-NEXT: vsrl.vx v8, v8, a0
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv4i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m4, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i64> @llvm.ctpop.nxv4i64(<vscale x 4 x i64> %va)
ret <vscale x 4 x i64> %a
}
@@ -1080,6 +1208,12 @@ define <vscale x 8 x i64> @ctpop_nxv8i64(<vscale x 8 x i64> %va) {
; RV64-NEXT: li a0, 56
; RV64-NEXT: vsrl.vx v8, v8, a0
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: ctpop_nxv8i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m8, ta, ma
+; CHECK-ZVBB-NEXT: vcpop.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i64> @llvm.ctpop.nxv8i64(<vscale x 8 x i64> %va)
ret <vscale x 8 x i64> %a
}
diff --git a/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll
index c80a0e0e75a906..68134bc0e4e4c9 100644
--- a/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/cttz-sdnode.ll
@@ -5,6 +5,8 @@
; RUN: llc -mtriple=riscv64 -mattr=+zve64f,+f -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-F,RV64,RV64F
; RUN: llc -mtriple=riscv32 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-D,RV32,RV32D
; RUN: llc -mtriple=riscv64 -mattr=+v,+d -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,CHECK-D,RV64,RV64D
+; RUN: llc -mtriple=riscv32 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
+; RUN: llc -mtriple=riscv64 -mattr=+v,+experimental-zvbb -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK-ZVBB
define <vscale x 1 x i8> @cttz_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-ZVE64X-LABEL: cttz_nxv1i8:
@@ -61,6 +63,12 @@ define <vscale x 1 x i8> @cttz_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-D-NEXT: vsub.vx v8, v9, a0
; CHECK-D-NEXT: vmerge.vim v8, v8, 8, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv1i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i8> @llvm.cttz.nxv1i8(<vscale x 1 x i8> %va, i1 false)
ret <vscale x 1 x i8> %a
}
@@ -121,6 +129,12 @@ define <vscale x 2 x i8> @cttz_nxv2i8(<vscale x 2 x i8> %va) {
; CHECK-D-NEXT: vsub.vx v8, v9, a0
; CHECK-D-NEXT: vmerge.vim v8, v8, 8, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv2i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i8> @llvm.cttz.nxv2i8(<vscale x 2 x i8> %va, i1 false)
ret <vscale x 2 x i8> %a
}
@@ -181,6 +195,12 @@ define <vscale x 4 x i8> @cttz_nxv4i8(<vscale x 4 x i8> %va) {
; CHECK-D-NEXT: vsub.vx v8, v9, a0
; CHECK-D-NEXT: vmerge.vim v8, v8, 8, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv4i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i8> @llvm.cttz.nxv4i8(<vscale x 4 x i8> %va, i1 false)
ret <vscale x 4 x i8> %a
}
@@ -241,6 +261,12 @@ define <vscale x 8 x i8> @cttz_nxv8i8(<vscale x 8 x i8> %va) {
; CHECK-D-NEXT: vsub.vx v8, v9, a0
; CHECK-D-NEXT: vmerge.vim v8, v8, 8, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv8i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i8> @llvm.cttz.nxv8i8(<vscale x 8 x i8> %va, i1 false)
ret <vscale x 8 x i8> %a
}
@@ -301,6 +327,12 @@ define <vscale x 16 x i8> @cttz_nxv16i8(<vscale x 16 x i8> %va) {
; CHECK-D-NEXT: vsub.vx v8, v10, a0
; CHECK-D-NEXT: vmerge.vim v8, v8, 8, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv16i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i8> @llvm.cttz.nxv16i8(<vscale x 16 x i8> %va, i1 false)
ret <vscale x 16 x i8> %a
}
@@ -327,6 +359,12 @@ define <vscale x 32 x i8> @cttz_nxv32i8(<vscale x 32 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v12
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv32i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i8> @llvm.cttz.nxv32i8(<vscale x 32 x i8> %va, i1 false)
ret <vscale x 32 x i8> %a
}
@@ -353,6 +391,12 @@ define <vscale x 64 x i8> @cttz_nxv64i8(<vscale x 64 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v16
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv64i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 64 x i8> @llvm.cttz.nxv64i8(<vscale x 64 x i8> %va, i1 false)
ret <vscale x 64 x i8> %a
}
@@ -442,6 +486,12 @@ define <vscale x 1 x i16> @cttz_nxv1i16(<vscale x 1 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vmerge.vxm v8, v9, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv1i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i16> @llvm.cttz.nxv1i16(<vscale x 1 x i16> %va, i1 false)
ret <vscale x 1 x i16> %a
}
@@ -531,6 +581,12 @@ define <vscale x 2 x i16> @cttz_nxv2i16(<vscale x 2 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vmerge.vxm v8, v9, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv2i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i16> @llvm.cttz.nxv2i16(<vscale x 2 x i16> %va, i1 false)
ret <vscale x 2 x i16> %a
}
@@ -620,6 +676,12 @@ define <vscale x 4 x i16> @cttz_nxv4i16(<vscale x 4 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vmerge.vxm v8, v9, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv4i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i16> @llvm.cttz.nxv4i16(<vscale x 4 x i16> %va, i1 false)
ret <vscale x 4 x i16> %a
}
@@ -709,6 +771,12 @@ define <vscale x 8 x i16> @cttz_nxv8i16(<vscale x 8 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vmerge.vxm v8, v10, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv8i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i16> @llvm.cttz.nxv8i16(<vscale x 8 x i16> %va, i1 false)
ret <vscale x 8 x i16> %a
}
@@ -798,6 +866,12 @@ define <vscale x 16 x i16> @cttz_nxv16i16(<vscale x 16 x i16> %va) {
; CHECK-D-NEXT: li a0, 16
; CHECK-D-NEXT: vmerge.vxm v8, v12, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv16i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i16> @llvm.cttz.nxv16i16(<vscale x 16 x i16> %va, i1 false)
ret <vscale x 16 x i16> %a
}
@@ -859,6 +933,12 @@ define <vscale x 32 x i16> @cttz_nxv32i16(<vscale x 32 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv32i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i16> @llvm.cttz.nxv32i16(<vscale x 32 x i16> %va, i1 false)
ret <vscale x 32 x i16> %a
}
@@ -956,6 +1036,12 @@ define <vscale x 1 x i32> @cttz_nxv1i32(<vscale x 1 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vmerge.vxm v8, v9, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv1i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i32> @llvm.cttz.nxv1i32(<vscale x 1 x i32> %va, i1 false)
ret <vscale x 1 x i32> %a
}
@@ -1053,6 +1139,12 @@ define <vscale x 2 x i32> @cttz_nxv2i32(<vscale x 2 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vmerge.vxm v8, v9, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv2i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i32> @llvm.cttz.nxv2i32(<vscale x 2 x i32> %va, i1 false)
ret <vscale x 2 x i32> %a
}
@@ -1150,6 +1242,12 @@ define <vscale x 4 x i32> @cttz_nxv4i32(<vscale x 4 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vmerge.vxm v8, v10, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv4i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i32> @llvm.cttz.nxv4i32(<vscale x 4 x i32> %va, i1 false)
ret <vscale x 4 x i32> %a
}
@@ -1247,6 +1345,12 @@ define <vscale x 8 x i32> @cttz_nxv8i32(<vscale x 8 x i32> %va) {
; CHECK-D-NEXT: li a0, 32
; CHECK-D-NEXT: vmerge.vxm v8, v12, a0, v0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv8i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i32> @llvm.cttz.nxv8i32(<vscale x 8 x i32> %va, i1 false)
ret <vscale x 8 x i32> %a
}
@@ -1342,6 +1446,12 @@ define <vscale x 16 x i32> @cttz_nxv16i32(<vscale x 16 x i32> %va) {
; CHECK-D-NEXT: vmerge.vxm v8, v16, a1, v0
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv16i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i32> @llvm.cttz.nxv16i32(<vscale x 16 x i32> %va, i1 false)
ret <vscale x 16 x i32> %a
}
@@ -1506,6 +1616,12 @@ define <vscale x 1 x i64> @cttz_nxv1i64(<vscale x 1 x i64> %va) {
; RV64D-NEXT: vmerge.vxm v8, v9, a1, v0
; RV64D-NEXT: fsrm a0
; RV64D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv1i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i64> @llvm.cttz.nxv1i64(<vscale x 1 x i64> %va, i1 false)
ret <vscale x 1 x i64> %a
}
@@ -1670,6 +1786,12 @@ define <vscale x 2 x i64> @cttz_nxv2i64(<vscale x 2 x i64> %va) {
; RV64D-NEXT: vmerge.vxm v8, v10, a1, v0
; RV64D-NEXT: fsrm a0
; RV64D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv2i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i64> @llvm.cttz.nxv2i64(<vscale x 2 x i64> %va, i1 false)
ret <vscale x 2 x i64> %a
}
@@ -1834,6 +1956,12 @@ define <vscale x 4 x i64> @cttz_nxv4i64(<vscale x 4 x i64> %va) {
; RV64D-NEXT: vmerge.vxm v8, v12, a1, v0
; RV64D-NEXT: fsrm a0
; RV64D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv4i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i64> @llvm.cttz.nxv4i64(<vscale x 4 x i64> %va, i1 false)
ret <vscale x 4 x i64> %a
}
@@ -1998,6 +2126,12 @@ define <vscale x 8 x i64> @cttz_nxv8i64(<vscale x 8 x i64> %va) {
; RV64D-NEXT: vmerge.vxm v8, v16, a1, v0
; RV64D-NEXT: fsrm a0
; RV64D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_nxv8i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i64> @llvm.cttz.nxv8i64(<vscale x 8 x i64> %va, i1 false)
ret <vscale x 8 x i64> %a
}
@@ -2054,6 +2188,12 @@ define <vscale x 1 x i8> @cttz_zero_undef_nxv1i8(<vscale x 1 x i8> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv1i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i8> @llvm.cttz.nxv1i8(<vscale x 1 x i8> %va, i1 true)
ret <vscale x 1 x i8> %a
}
@@ -2109,6 +2249,12 @@ define <vscale x 2 x i8> @cttz_zero_undef_nxv2i8(<vscale x 2 x i8> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv2i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i8> @llvm.cttz.nxv2i8(<vscale x 2 x i8> %va, i1 true)
ret <vscale x 2 x i8> %a
}
@@ -2164,6 +2310,12 @@ define <vscale x 4 x i8> @cttz_zero_undef_nxv4i8(<vscale x 4 x i8> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv4i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i8> @llvm.cttz.nxv4i8(<vscale x 4 x i8> %va, i1 true)
ret <vscale x 4 x i8> %a
}
@@ -2219,6 +2371,12 @@ define <vscale x 8 x i8> @cttz_zero_undef_nxv8i8(<vscale x 8 x i8> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v10, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv8i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i8> @llvm.cttz.nxv8i8(<vscale x 8 x i8> %va, i1 true)
ret <vscale x 8 x i8> %a
}
@@ -2274,6 +2432,12 @@ define <vscale x 16 x i8> @cttz_zero_undef_nxv16i8(<vscale x 16 x i8> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v12, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv16i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i8> @llvm.cttz.nxv16i8(<vscale x 16 x i8> %va, i1 true)
ret <vscale x 16 x i8> %a
}
@@ -2299,6 +2463,12 @@ define <vscale x 32 x i8> @cttz_zero_undef_nxv32i8(<vscale x 32 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v12
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv32i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i8> @llvm.cttz.nxv32i8(<vscale x 32 x i8> %va, i1 true)
ret <vscale x 32 x i8> %a
}
@@ -2324,6 +2494,12 @@ define <vscale x 64 x i8> @cttz_zero_undef_nxv64i8(<vscale x 64 x i8> %va) {
; CHECK-NEXT: vadd.vv v8, v8, v16
; CHECK-NEXT: vand.vi v8, v8, 15
; CHECK-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv64i8:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e8, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 64 x i8> @llvm.cttz.nxv64i8(<vscale x 64 x i8> %va, i1 true)
ret <vscale x 64 x i8> %a
}
@@ -2406,6 +2582,12 @@ define <vscale x 1 x i16> @cttz_zero_undef_nxv1i16(<vscale x 1 x i16> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv1i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i16> @llvm.cttz.nxv1i16(<vscale x 1 x i16> %va, i1 true)
ret <vscale x 1 x i16> %a
}
@@ -2488,6 +2670,12 @@ define <vscale x 2 x i16> @cttz_zero_undef_nxv2i16(<vscale x 2 x i16> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv2i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i16> @llvm.cttz.nxv2i16(<vscale x 2 x i16> %va, i1 true)
ret <vscale x 2 x i16> %a
}
@@ -2570,6 +2758,12 @@ define <vscale x 4 x i16> @cttz_zero_undef_nxv4i16(<vscale x 4 x i16> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv4i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i16> @llvm.cttz.nxv4i16(<vscale x 4 x i16> %va, i1 true)
ret <vscale x 4 x i16> %a
}
@@ -2652,6 +2846,12 @@ define <vscale x 8 x i16> @cttz_zero_undef_nxv8i16(<vscale x 8 x i16> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv8i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i16> @llvm.cttz.nxv8i16(<vscale x 8 x i16> %va, i1 true)
ret <vscale x 8 x i16> %a
}
@@ -2734,6 +2934,12 @@ define <vscale x 16 x i16> @cttz_zero_undef_nxv16i16(<vscale x 16 x i16> %va) {
; CHECK-D-NEXT: li a0, 127
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv16i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i16> @llvm.cttz.nxv16i16(<vscale x 16 x i16> %va, i1 true)
ret <vscale x 16 x i16> %a
}
@@ -2794,6 +3000,12 @@ define <vscale x 32 x i16> @cttz_zero_undef_nxv32i16(<vscale x 32 x i16> %va) {
; RV64-NEXT: vmul.vx v8, v8, a0
; RV64-NEXT: vsrl.vi v8, v8, 8
; RV64-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv32i16:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e16, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 32 x i16> @llvm.cttz.nxv32i16(<vscale x 32 x i16> %va, i1 true)
ret <vscale x 32 x i16> %a
}
@@ -2884,6 +3096,12 @@ define <vscale x 1 x i32> @cttz_zero_undef_nxv1i32(<vscale x 1 x i32> %va) {
; CHECK-D-NEXT: li a0, 1023
; CHECK-D-NEXT: vsub.vx v8, v8, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv1i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, mf2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i32> @llvm.cttz.nxv1i32(<vscale x 1 x i32> %va, i1 true)
ret <vscale x 1 x i32> %a
}
@@ -2974,6 +3192,12 @@ define <vscale x 2 x i32> @cttz_zero_undef_nxv2i32(<vscale x 2 x i32> %va) {
; CHECK-D-NEXT: li a0, 1023
; CHECK-D-NEXT: vsub.vx v8, v10, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv2i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i32> @llvm.cttz.nxv2i32(<vscale x 2 x i32> %va, i1 true)
ret <vscale x 2 x i32> %a
}
@@ -3064,6 +3288,12 @@ define <vscale x 4 x i32> @cttz_zero_undef_nxv4i32(<vscale x 4 x i32> %va) {
; CHECK-D-NEXT: li a0, 1023
; CHECK-D-NEXT: vsub.vx v8, v12, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv4i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i32> @llvm.cttz.nxv4i32(<vscale x 4 x i32> %va, i1 true)
ret <vscale x 4 x i32> %a
}
@@ -3154,6 +3384,12 @@ define <vscale x 8 x i32> @cttz_zero_undef_nxv8i32(<vscale x 8 x i32> %va) {
; CHECK-D-NEXT: li a0, 1023
; CHECK-D-NEXT: vsub.vx v8, v16, a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv8i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i32> @llvm.cttz.nxv8i32(<vscale x 8 x i32> %va, i1 true)
ret <vscale x 8 x i32> %a
}
@@ -3242,6 +3478,12 @@ define <vscale x 16 x i32> @cttz_zero_undef_nxv16i32(<vscale x 16 x i32> %va) {
; CHECK-D-NEXT: vsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv16i32:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e32, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 16 x i32> @llvm.cttz.nxv16i32(<vscale x 16 x i32> %va, i1 true)
ret <vscale x 16 x i32> %a
}
@@ -3363,6 +3605,12 @@ define <vscale x 1 x i64> @cttz_zero_undef_nxv1i64(<vscale x 1 x i64> %va) {
; CHECK-D-NEXT: vsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv1i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 1 x i64> @llvm.cttz.nxv1i64(<vscale x 1 x i64> %va, i1 true)
ret <vscale x 1 x i64> %a
}
@@ -3484,6 +3732,12 @@ define <vscale x 2 x i64> @cttz_zero_undef_nxv2i64(<vscale x 2 x i64> %va) {
; CHECK-D-NEXT: vsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv2i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m2, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 2 x i64> @llvm.cttz.nxv2i64(<vscale x 2 x i64> %va, i1 true)
ret <vscale x 2 x i64> %a
}
@@ -3605,6 +3859,12 @@ define <vscale x 4 x i64> @cttz_zero_undef_nxv4i64(<vscale x 4 x i64> %va) {
; CHECK-D-NEXT: vsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv4i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m4, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 4 x i64> @llvm.cttz.nxv4i64(<vscale x 4 x i64> %va, i1 true)
ret <vscale x 4 x i64> %a
}
@@ -3726,6 +3986,12 @@ define <vscale x 8 x i64> @cttz_zero_undef_nxv8i64(<vscale x 8 x i64> %va) {
; CHECK-D-NEXT: vsub.vx v8, v8, a1
; CHECK-D-NEXT: fsrm a0
; CHECK-D-NEXT: ret
+;
+; CHECK-ZVBB-LABEL: cttz_zero_undef_nxv8i64:
+; CHECK-ZVBB: # %bb.0:
+; CHECK-ZVBB-NEXT: vsetvli a0, zero, e64, m8, ta, ma
+; CHECK-ZVBB-NEXT: vctz.v v8, v8
+; CHECK-ZVBB-NEXT: ret
%a = call <vscale x 8 x i64> @llvm.cttz.nxv8i64(<vscale x 8 x i64> %va, i1 true)
ret <vscale x 8 x i64> %a
}
More information about the llvm-commits
mailing list