[llvm] bfd1395 - [AArch64][SVE2] Add the SVE2.1 while predicate-as-counter instructions
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 1 07:33:46 PDT 2022
Author: David Sherwood
Date: 2022-11-01T14:33:39Z
New Revision: bfd139562b29a63be8f0f548a30ce3fc985e04db
URL: https://github.com/llvm/llvm-project/commit/bfd139562b29a63be8f0f548a30ce3fc985e04db
DIFF: https://github.com/llvm/llvm-project/commit/bfd139562b29a63be8f0f548a30ce3fc985e04db.diff
LOG: [AArch64][SVE2] Add the SVE2.1 while predicate-as-counter instructions
This patch adds the assembly/disassembly for the following
predicate-as-counter instructions:
whilelt: While incrementing signed scalar less than scalar
whilele: While incrementing signed scalar less than or equal to scalar
whilegt: While incrementing signed scalar greater than scalar
whilege: While incrementing signed scalar greater than or equal to scalar
whilelo: While incrementing unsigned scalar lower than scalar
whilels: While incrementing unsigned scalar lower or same as scalar
whilehs: While decrementing unsigned scalar higher or same as scalar
whilehi: While decrementing unsigned scalar higher than scalar
The reference can be found here:
https://developer.arm.com/documentation/ddi0602/2022-09
Differential Revision: https://reviews.llvm.org/D136750
Added:
llvm/test/MC/AArch64/SVE2p1/whilege-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilege.s
llvm/test/MC/AArch64/SVE2p1/whilegt-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilegt.s
llvm/test/MC/AArch64/SVE2p1/whilehi-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilehi.s
llvm/test/MC/AArch64/SVE2p1/whilehs-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilehs.s
llvm/test/MC/AArch64/SVE2p1/whilele-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilele.s
llvm/test/MC/AArch64/SVE2p1/whilelo-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilelo.s
llvm/test/MC/AArch64/SVE2p1/whilels-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilels.s
llvm/test/MC/AArch64/SVE2p1/whilelt-diagnostics.s
llvm/test/MC/AArch64/SVE2p1/whilelt.s
Modified:
llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
llvm/lib/Target/AArch64/SVEInstrFormats.td
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
index 2c587341c068b..bef0f715e46ac 100644
--- a/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
+++ b/llvm/lib/Target/AArch64/AArch64SVEInstrInfo.td
@@ -3671,4 +3671,13 @@ defm STNT1B_4Z_IMM : sve2p1_mem_cst_si_4z<"stnt1b", 0b00, 0b1, ZZZZ_b_mul_r>;
defm STNT1H_4Z_IMM : sve2p1_mem_cst_si_4z<"stnt1h", 0b01, 0b1, ZZZZ_h_mul_r>;
defm STNT1W_4Z_IMM : sve2p1_mem_cst_si_4z<"stnt1w", 0b10, 0b1, ZZZZ_s_mul_r>;
defm STNT1D_4Z_IMM : sve2p1_mem_cst_si_4z<"stnt1d", 0b11, 0b1, ZZZZ_d_mul_r>;
+
+defm WHILEGE_CXX : sve2p1_int_while_rr_pn<"whilege", 0b000>;
+defm WHILEGT_CXX : sve2p1_int_while_rr_pn<"whilegt", 0b001>;
+defm WHILELT_CXX : sve2p1_int_while_rr_pn<"whilelt", 0b010>;
+defm WHILELE_CXX : sve2p1_int_while_rr_pn<"whilele", 0b011>;
+defm WHILEHS_CXX : sve2p1_int_while_rr_pn<"whilehs", 0b100>;
+defm WHILEHI_CXX : sve2p1_int_while_rr_pn<"whilehi", 0b101>;
+defm WHILELO_CXX : sve2p1_int_while_rr_pn<"whilelo", 0b110>;
+defm WHILELS_CXX : sve2p1_int_while_rr_pn<"whilels", 0b111>;
} // End HasSVE2p1_or_HasSME2
diff --git a/llvm/lib/Target/AArch64/SVEInstrFormats.td b/llvm/lib/Target/AArch64/SVEInstrFormats.td
index 1d9f38ac44068..fa98fa57d0e49 100644
--- a/llvm/lib/Target/AArch64/SVEInstrFormats.td
+++ b/llvm/lib/Target/AArch64/SVEInstrFormats.td
@@ -9058,3 +9058,37 @@ multiclass sve2p1_pcount_pn<string mnemonic, bits<3> opc> {
def _S : sve2p1_pcount_pn<mnemonic, opc, 0b10, PNR32>;
def _D : sve2p1_pcount_pn<mnemonic, opc, 0b11, PNR64>;
}
+
+
+class sve2p1_int_while_rr_pn<string mnemonic, bits<2> sz, bits<3> opc,
+ PNRP8to15RegOp pnrty>
+ : I<(outs pnrty:$PNd), (ins GPR64:$Rn, GPR64:$Rm, sve_vec_len_specifier_enum:$vl),
+ mnemonic, "\t$PNd, $Rn, $Rm, $vl",
+ "", []>, Sched<[]> {
+ bits<3> PNd;
+ bits<5> Rn;
+ bits<1> vl;
+ bits<5> Rm;
+ let Inst{31-24} = 0b00100101;
+ let Inst{23-22} = sz;
+ let Inst{21} = 0b1;
+ let Inst{20-16} = Rm;
+ let Inst{15-14} = 0b01;
+ let Inst{13} = vl;
+ let Inst{12} = 0b0;
+ let Inst{11-10} = opc{2-1};
+ let Inst{9-5} = Rn;
+ let Inst{4} = 0b1;
+ let Inst{3} = opc{0};
+ let Inst{2-0} = PNd;
+
+ let Defs = [NZCV];
+}
+
+
+multiclass sve2p1_int_while_rr_pn<string mnemonic, bits<3> opc> {
+ def _B : sve2p1_int_while_rr_pn<mnemonic, 0b00, opc, PNR8_p8to15>;
+ def _H : sve2p1_int_while_rr_pn<mnemonic, 0b01, opc, PNR16_p8to15>;
+ def _S : sve2p1_int_while_rr_pn<mnemonic, 0b10, opc, PNR32_p8to15>;
+ def _D : sve2p1_int_while_rr_pn<mnemonic, 0b11, opc, PNR64_p8to15>;
+}
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilege-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilege-diagnostics.s
new file mode 100644
index 0000000000000..908fe56cdc8dc
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilege-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilege pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilege pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilege pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilege pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilege pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilege pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilege pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilege pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilege.s b/llvm/test/MC/AArch64/SVE2p1/whilege.s
new file mode 100644
index 0000000000000..8ebe63660fdd7
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilege.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilege pn8.h, x0, x0, vlx2 // 00100101-01100000-01000000-00010000
+// CHECK-INST: whilege pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x40,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604010 <unknown>
+
+whilege pn13.h, x10, x21, vlx2 // 00100101-01110101-01000001-01010101
+// CHECK-INST: whilege pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x41,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25754155 <unknown>
+
+whilege pn15.h, x13, x8, vlx4 // 00100101-01101000-01100001-10110111
+// CHECK-INST: whilege pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x61,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 256861b7 <unknown>
+
+whilege pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01100011-11110111
+// CHECK-INST: whilege pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x63,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f63f7 <unknown>
+
+whilege pn8.s, x0, x0, vlx2 // 00100101-10100000-01000000-00010000
+// CHECK-INST: whilege pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x40,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04010 <unknown>
+
+whilege pn13.s, x10, x21, vlx2 // 00100101-10110101-01000001-01010101
+// CHECK-INST: whilege pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x41,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b54155 <unknown>
+
+whilege pn15.s, x13, x8, vlx4 // 00100101-10101000-01100001-10110111
+// CHECK-INST: whilege pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x61,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a861b7 <unknown>
+
+whilege pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01100011-11110111
+// CHECK-INST: whilege pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x63,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf63f7 <unknown>
+
+whilege pn8.d, x0, x0, vlx2 // 00100101-11100000-01000000-00010000
+// CHECK-INST: whilege pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x40,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04010 <unknown>
+
+whilege pn13.d, x10, x21, vlx2 // 00100101-11110101-01000001-01010101
+// CHECK-INST: whilege pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x41,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f54155 <unknown>
+
+whilege pn15.d, x13, x8, vlx4 // 00100101-11101000-01100001-10110111
+// CHECK-INST: whilege pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x61,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e861b7 <unknown>
+
+whilege pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01100011-11110111
+// CHECK-INST: whilege pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x63,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff63f7 <unknown>
+
+whilege pn8.b, x0, x0, vlx2 // 00100101-00100000-01000000-00010000
+// CHECK-INST: whilege pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x40,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204010 <unknown>
+
+whilege pn13.b, x10, x21, vlx2 // 00100101-00110101-01000001-01010101
+// CHECK-INST: whilege pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x41,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25354155 <unknown>
+
+whilege pn15.b, x13, x8, vlx4 // 00100101-00101000-01100001-10110111
+// CHECK-INST: whilege pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x61,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 252861b7 <unknown>
+
+whilege pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01100011-11110111
+// CHECK-INST: whilege pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x63,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f63f7 <unknown>
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilegt-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilegt-diagnostics.s
new file mode 100644
index 0000000000000..5735ac79b903d
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilegt-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilegt pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilegt pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilegt pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilegt pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilegt pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilegt pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilegt pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilegt pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilegt.s b/llvm/test/MC/AArch64/SVE2p1/whilegt.s
new file mode 100644
index 0000000000000..c3f4d5ec8cd1d
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilegt.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilegt pn8.h, x0, x0, vlx2 // 00100101-01100000-01000000-00011000
+// CHECK-INST: whilegt pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x40,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604018 <unknown>
+
+whilegt pn13.h, x10, x21, vlx2 // 00100101-01110101-01000001-01011101
+// CHECK-INST: whilegt pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x41,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 2575415d <unknown>
+
+whilegt pn15.h, x13, x8, vlx4 // 00100101-01101000-01100001-10111111
+// CHECK-INST: whilegt pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x61,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 256861bf <unknown>
+
+whilegt pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01100011-11111111
+// CHECK-INST: whilegt pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x63,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f63ff <unknown>
+
+whilegt pn8.s, x0, x0, vlx2 // 00100101-10100000-01000000-00011000
+// CHECK-INST: whilegt pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x40,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04018 <unknown>
+
+whilegt pn13.s, x10, x21, vlx2 // 00100101-10110101-01000001-01011101
+// CHECK-INST: whilegt pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x41,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b5415d <unknown>
+
+whilegt pn15.s, x13, x8, vlx4 // 00100101-10101000-01100001-10111111
+// CHECK-INST: whilegt pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x61,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a861bf <unknown>
+
+whilegt pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01100011-11111111
+// CHECK-INST: whilegt pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x63,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf63ff <unknown>
+
+whilegt pn8.d, x0, x0, vlx2 // 00100101-11100000-01000000-00011000
+// CHECK-INST: whilegt pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x40,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04018 <unknown>
+
+whilegt pn13.d, x10, x21, vlx2 // 00100101-11110101-01000001-01011101
+// CHECK-INST: whilegt pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x41,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f5415d <unknown>
+
+whilegt pn15.d, x13, x8, vlx4 // 00100101-11101000-01100001-10111111
+// CHECK-INST: whilegt pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x61,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e861bf <unknown>
+
+whilegt pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01100011-11111111
+// CHECK-INST: whilegt pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x63,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff63ff <unknown>
+
+whilegt pn8.b, x0, x0, vlx2 // 00100101-00100000-01000000-00011000
+// CHECK-INST: whilegt pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x40,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204018 <unknown>
+
+whilegt pn13.b, x10, x21, vlx2 // 00100101-00110101-01000001-01011101
+// CHECK-INST: whilegt pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x41,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 2535415d <unknown>
+
+whilegt pn15.b, x13, x8, vlx4 // 00100101-00101000-01100001-10111111
+// CHECK-INST: whilegt pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x61,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 252861bf <unknown>
+
+whilegt pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01100011-11111111
+// CHECK-INST: whilegt pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x63,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f63ff <unknown>
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilehi-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilehi-diagnostics.s
new file mode 100644
index 0000000000000..382646e48cc42
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilehi-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilehi pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilehi pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilehi pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilehi pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilehi pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilehi pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilehi pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilehi pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilehi.s b/llvm/test/MC/AArch64/SVE2p1/whilehi.s
new file mode 100644
index 0000000000000..b3e6426996f36
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilehi.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilehi pn8.h, x0, x0, vlx2 // 00100101-01100000-01001000-00011000
+// CHECK-INST: whilehi pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x48,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604818 <unknown>
+
+whilehi pn13.h, x10, x21, vlx2 // 00100101-01110101-01001001-01011101
+// CHECK-INST: whilehi pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x49,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 2575495d <unknown>
+
+whilehi pn15.h, x13, x8, vlx4 // 00100101-01101000-01101001-10111111
+// CHECK-INST: whilehi pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x69,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 256869bf <unknown>
+
+whilehi pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01101011-11111111
+// CHECK-INST: whilehi pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6b,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f6bff <unknown>
+
+whilehi pn8.s, x0, x0, vlx2 // 00100101-10100000-01001000-00011000
+// CHECK-INST: whilehi pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x48,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04818 <unknown>
+
+whilehi pn13.s, x10, x21, vlx2 // 00100101-10110101-01001001-01011101
+// CHECK-INST: whilehi pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x49,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b5495d <unknown>
+
+whilehi pn15.s, x13, x8, vlx4 // 00100101-10101000-01101001-10111111
+// CHECK-INST: whilehi pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x69,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a869bf <unknown>
+
+whilehi pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01101011-11111111
+// CHECK-INST: whilehi pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6b,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf6bff <unknown>
+
+whilehi pn8.d, x0, x0, vlx2 // 00100101-11100000-01001000-00011000
+// CHECK-INST: whilehi pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x48,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04818 <unknown>
+
+whilehi pn13.d, x10, x21, vlx2 // 00100101-11110101-01001001-01011101
+// CHECK-INST: whilehi pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x49,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f5495d <unknown>
+
+whilehi pn15.d, x13, x8, vlx4 // 00100101-11101000-01101001-10111111
+// CHECK-INST: whilehi pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x69,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e869bf <unknown>
+
+whilehi pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01101011-11111111
+// CHECK-INST: whilehi pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6b,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff6bff <unknown>
+
+whilehi pn8.b, x0, x0, vlx2 // 00100101-00100000-01001000-00011000
+// CHECK-INST: whilehi pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x48,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204818 <unknown>
+
+whilehi pn13.b, x10, x21, vlx2 // 00100101-00110101-01001001-01011101
+// CHECK-INST: whilehi pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x49,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 2535495d <unknown>
+
+whilehi pn15.b, x13, x8, vlx4 // 00100101-00101000-01101001-10111111
+// CHECK-INST: whilehi pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x69,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 252869bf <unknown>
+
+whilehi pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01101011-11111111
+// CHECK-INST: whilehi pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6b,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f6bff <unknown>
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilehs-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilehs-diagnostics.s
new file mode 100644
index 0000000000000..d799f940ec9f9
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilehs-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilehs pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilehs pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilehs pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilehs pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilehs pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilehs pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilehs pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilehs pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilehs.s b/llvm/test/MC/AArch64/SVE2p1/whilehs.s
new file mode 100644
index 0000000000000..68c58191f2185
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilehs.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilehs pn8.h, x0, x0, vlx2 // 00100101-01100000-01001000-00010000
+// CHECK-INST: whilehs pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x48,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604810 <unknown>
+
+whilehs pn13.h, x10, x21, vlx2 // 00100101-01110101-01001001-01010101
+// CHECK-INST: whilehs pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x49,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25754955 <unknown>
+
+whilehs pn15.h, x13, x8, vlx4 // 00100101-01101000-01101001-10110111
+// CHECK-INST: whilehs pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x69,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 256869b7 <unknown>
+
+whilehs pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01101011-11110111
+// CHECK-INST: whilehs pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6b,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f6bf7 <unknown>
+
+whilehs pn8.s, x0, x0, vlx2 // 00100101-10100000-01001000-00010000
+// CHECK-INST: whilehs pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x48,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04810 <unknown>
+
+whilehs pn13.s, x10, x21, vlx2 // 00100101-10110101-01001001-01010101
+// CHECK-INST: whilehs pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x49,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b54955 <unknown>
+
+whilehs pn15.s, x13, x8, vlx4 // 00100101-10101000-01101001-10110111
+// CHECK-INST: whilehs pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x69,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a869b7 <unknown>
+
+whilehs pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01101011-11110111
+// CHECK-INST: whilehs pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6b,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf6bf7 <unknown>
+
+whilehs pn8.d, x0, x0, vlx2 // 00100101-11100000-01001000-00010000
+// CHECK-INST: whilehs pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x48,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04810 <unknown>
+
+whilehs pn13.d, x10, x21, vlx2 // 00100101-11110101-01001001-01010101
+// CHECK-INST: whilehs pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x49,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f54955 <unknown>
+
+whilehs pn15.d, x13, x8, vlx4 // 00100101-11101000-01101001-10110111
+// CHECK-INST: whilehs pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x69,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e869b7 <unknown>
+
+whilehs pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01101011-11110111
+// CHECK-INST: whilehs pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6b,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff6bf7 <unknown>
+
+whilehs pn8.b, x0, x0, vlx2 // 00100101-00100000-01001000-00010000
+// CHECK-INST: whilehs pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x48,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204810 <unknown>
+
+whilehs pn13.b, x10, x21, vlx2 // 00100101-00110101-01001001-01010101
+// CHECK-INST: whilehs pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x49,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25354955 <unknown>
+
+whilehs pn15.b, x13, x8, vlx4 // 00100101-00101000-01101001-10110111
+// CHECK-INST: whilehs pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x69,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 252869b7 <unknown>
+
+whilehs pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01101011-11110111
+// CHECK-INST: whilehs pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6b,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f6bf7 <unknown>
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilele-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilele-diagnostics.s
new file mode 100644
index 0000000000000..666ce7de3074a
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilele-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilele pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilele pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilele pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilele pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilele pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilele pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilele pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilele pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilele.s b/llvm/test/MC/AArch64/SVE2p1/whilele.s
new file mode 100644
index 0000000000000..0e00c508700eb
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilele.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilele pn8.h, x0, x0, vlx2 // 00100101-01100000-01000100-00011000
+// CHECK-INST: whilele pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x44,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604418 <unknown>
+
+whilele pn13.h, x10, x21, vlx2 // 00100101-01110101-01000101-01011101
+// CHECK-INST: whilele pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x45,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 2575455d <unknown>
+
+whilele pn15.h, x13, x8, vlx4 // 00100101-01101000-01100101-10111111
+// CHECK-INST: whilele pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x65,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 256865bf <unknown>
+
+whilele pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01100111-11111111
+// CHECK-INST: whilele pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x67,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f67ff <unknown>
+
+whilele pn8.s, x0, x0, vlx2 // 00100101-10100000-01000100-00011000
+// CHECK-INST: whilele pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x44,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04418 <unknown>
+
+whilele pn13.s, x10, x21, vlx2 // 00100101-10110101-01000101-01011101
+// CHECK-INST: whilele pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x45,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b5455d <unknown>
+
+whilele pn15.s, x13, x8, vlx4 // 00100101-10101000-01100101-10111111
+// CHECK-INST: whilele pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x65,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a865bf <unknown>
+
+whilele pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01100111-11111111
+// CHECK-INST: whilele pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x67,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf67ff <unknown>
+
+whilele pn8.d, x0, x0, vlx2 // 00100101-11100000-01000100-00011000
+// CHECK-INST: whilele pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x44,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04418 <unknown>
+
+whilele pn13.d, x10, x21, vlx2 // 00100101-11110101-01000101-01011101
+// CHECK-INST: whilele pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x45,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f5455d <unknown>
+
+whilele pn15.d, x13, x8, vlx4 // 00100101-11101000-01100101-10111111
+// CHECK-INST: whilele pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x65,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e865bf <unknown>
+
+whilele pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01100111-11111111
+// CHECK-INST: whilele pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x67,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff67ff <unknown>
+
+whilele pn8.b, x0, x0, vlx2 // 00100101-00100000-01000100-00011000
+// CHECK-INST: whilele pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x44,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204418 <unknown>
+
+whilele pn13.b, x10, x21, vlx2 // 00100101-00110101-01000101-01011101
+// CHECK-INST: whilele pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x45,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 2535455d <unknown>
+
+whilele pn15.b, x13, x8, vlx4 // 00100101-00101000-01100101-10111111
+// CHECK-INST: whilele pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x65,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 252865bf <unknown>
+
+whilele pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01100111-11111111
+// CHECK-INST: whilele pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x67,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f67ff <unknown>
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilelo-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilelo-diagnostics.s
new file mode 100644
index 0000000000000..4258893a4a01a
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilelo-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilelo pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilelo pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilelo pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilelo pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilelo pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilelo pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilelo pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilelo pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilelo.s b/llvm/test/MC/AArch64/SVE2p1/whilelo.s
new file mode 100644
index 0000000000000..094747151bd58
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilelo.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilelo pn8.h, x0, x0, vlx2 // 00100101-01100000-01001100-00010000
+// CHECK-INST: whilelo pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x4c,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604c10 <unknown>
+
+whilelo pn13.h, x10, x21, vlx2 // 00100101-01110101-01001101-01010101
+// CHECK-INST: whilelo pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x4d,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25754d55 <unknown>
+
+whilelo pn15.h, x13, x8, vlx4 // 00100101-01101000-01101101-10110111
+// CHECK-INST: whilelo pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x6d,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25686db7 <unknown>
+
+whilelo pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01101111-11110111
+// CHECK-INST: whilelo pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6f,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f6ff7 <unknown>
+
+whilelo pn8.s, x0, x0, vlx2 // 00100101-10100000-01001100-00010000
+// CHECK-INST: whilelo pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x4c,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04c10 <unknown>
+
+whilelo pn13.s, x10, x21, vlx2 // 00100101-10110101-01001101-01010101
+// CHECK-INST: whilelo pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x4d,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b54d55 <unknown>
+
+whilelo pn15.s, x13, x8, vlx4 // 00100101-10101000-01101101-10110111
+// CHECK-INST: whilelo pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x6d,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a86db7 <unknown>
+
+whilelo pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01101111-11110111
+// CHECK-INST: whilelo pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6f,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf6ff7 <unknown>
+
+whilelo pn8.d, x0, x0, vlx2 // 00100101-11100000-01001100-00010000
+// CHECK-INST: whilelo pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x4c,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04c10 <unknown>
+
+whilelo pn13.d, x10, x21, vlx2 // 00100101-11110101-01001101-01010101
+// CHECK-INST: whilelo pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x4d,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f54d55 <unknown>
+
+whilelo pn15.d, x13, x8, vlx4 // 00100101-11101000-01101101-10110111
+// CHECK-INST: whilelo pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x6d,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e86db7 <unknown>
+
+whilelo pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01101111-11110111
+// CHECK-INST: whilelo pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6f,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff6ff7 <unknown>
+
+whilelo pn8.b, x0, x0, vlx2 // 00100101-00100000-01001100-00010000
+// CHECK-INST: whilelo pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x4c,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204c10 <unknown>
+
+whilelo pn13.b, x10, x21, vlx2 // 00100101-00110101-01001101-01010101
+// CHECK-INST: whilelo pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x4d,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25354d55 <unknown>
+
+whilelo pn15.b, x13, x8, vlx4 // 00100101-00101000-01101101-10110111
+// CHECK-INST: whilelo pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x6d,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25286db7 <unknown>
+
+whilelo pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01101111-11110111
+// CHECK-INST: whilelo pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x6f,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f6ff7 <unknown>
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilels-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilels-diagnostics.s
new file mode 100644
index 0000000000000..765c3555c801b
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilels-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilels pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilels pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilels pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilels pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilels pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilels pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilels pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilels pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilels.s b/llvm/test/MC/AArch64/SVE2p1/whilels.s
new file mode 100644
index 0000000000000..608f48483ab25
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilels.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilels pn8.h, x0, x0, vlx2 // 00100101-01100000-01001100-00011000
+// CHECK-INST: whilels pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x4c,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604c18 <unknown>
+
+whilels pn13.h, x10, x21, vlx2 // 00100101-01110101-01001101-01011101
+// CHECK-INST: whilels pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x4d,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25754d5d <unknown>
+
+whilels pn15.h, x13, x8, vlx4 // 00100101-01101000-01101101-10111111
+// CHECK-INST: whilels pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x6d,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25686dbf <unknown>
+
+whilels pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01101111-11111111
+// CHECK-INST: whilels pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6f,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f6fff <unknown>
+
+whilels pn8.s, x0, x0, vlx2 // 00100101-10100000-01001100-00011000
+// CHECK-INST: whilels pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x4c,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04c18 <unknown>
+
+whilels pn13.s, x10, x21, vlx2 // 00100101-10110101-01001101-01011101
+// CHECK-INST: whilels pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x4d,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b54d5d <unknown>
+
+whilels pn15.s, x13, x8, vlx4 // 00100101-10101000-01101101-10111111
+// CHECK-INST: whilels pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x6d,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a86dbf <unknown>
+
+whilels pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01101111-11111111
+// CHECK-INST: whilels pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6f,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf6fff <unknown>
+
+whilels pn8.d, x0, x0, vlx2 // 00100101-11100000-01001100-00011000
+// CHECK-INST: whilels pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x4c,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04c18 <unknown>
+
+whilels pn13.d, x10, x21, vlx2 // 00100101-11110101-01001101-01011101
+// CHECK-INST: whilels pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x4d,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f54d5d <unknown>
+
+whilels pn15.d, x13, x8, vlx4 // 00100101-11101000-01101101-10111111
+// CHECK-INST: whilels pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x6d,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e86dbf <unknown>
+
+whilels pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01101111-11111111
+// CHECK-INST: whilels pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6f,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff6fff <unknown>
+
+whilels pn8.b, x0, x0, vlx2 // 00100101-00100000-01001100-00011000
+// CHECK-INST: whilels pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x18,0x4c,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204c18 <unknown>
+
+whilels pn13.b, x10, x21, vlx2 // 00100101-00110101-01001101-01011101
+// CHECK-INST: whilels pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x5d,0x4d,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25354d5d <unknown>
+
+whilels pn15.b, x13, x8, vlx4 // 00100101-00101000-01101101-10111111
+// CHECK-INST: whilels pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xbf,0x6d,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25286dbf <unknown>
+
+whilels pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01101111-11111111
+// CHECK-INST: whilels pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xff,0x6f,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f6fff <unknown>
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilelt-diagnostics.s b/llvm/test/MC/AArch64/SVE2p1/whilelt-diagnostics.s
new file mode 100644
index 0000000000000..54c2c05d43cde
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilelt-diagnostics.s
@@ -0,0 +1,30 @@
+// RUN: not llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 2>&1 < %s | FileCheck %s
+
+// --------------------------------------------------------------------------//
+// Invalid Pattern
+
+whilelt pn8.b, x0, x0, vlx1
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: invalid operand
+// CHECK-NEXT: whilelt pn8.b, x0, x0, vlx1
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+whilelt pn8.b, x0, x0
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: too few operands for instruction
+// CHECK-NEXT: whilelt pn8.b, x0, x0
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Invalid use of predicate without suffix
+
+whilelt pn8, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilelt pn8, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
+
+// --------------------------------------------------------------------------//
+// Out of range Predicate register
+
+whilelt pn7.b, x0, x0, vlx2
+// CHECK: [[@LINE-1]]:{{[0-9]+}}: error: Invalid predicate register, expected PN in range pn8..pn15 with element suffix.
+// CHECK-NEXT: whilelt pn7.b, x0, x0, vlx2
+// CHECK-NOT: [[@LINE-1]]:{{[0-9]+}}:
diff --git a/llvm/test/MC/AArch64/SVE2p1/whilelt.s b/llvm/test/MC/AArch64/SVE2p1/whilelt.s
new file mode 100644
index 0000000000000..fe67c928146d9
--- /dev/null
+++ b/llvm/test/MC/AArch64/SVE2p1/whilelt.s
@@ -0,0 +1,110 @@
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sve2p1 < %s \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+// RUN: not llvm-mc -triple=aarch64 -show-encoding < %s 2>&1 \
+// RUN: | FileCheck %s --check-prefix=CHECK-ERROR
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d --mattr=+sme2 - | FileCheck %s --check-prefix=CHECK-INST
+// RUN: llvm-mc -triple=aarch64 -filetype=obj -mattr=+sme2 < %s \
+// RUN: | llvm-objdump -d - | FileCheck %s --check-prefix=CHECK-UNKNOWN
+// RUN: llvm-mc -triple=aarch64 -show-encoding -mattr=+sme2 < %s \
+// RUN: | sed '/.text/d' | sed 's/.*encoding: //g' \
+// RUN: | llvm-mc -triple=aarch64 -mattr=+sme2 -disassemble -show-encoding \
+// RUN: | FileCheck %s --check-prefixes=CHECK-ENCODING,CHECK-INST
+
+whilelt pn8.h, x0, x0, vlx2 // 00100101-01100000-01000100-00010000
+// CHECK-INST: whilelt pn8.h, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x44,0x60,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25604410 <unknown>
+
+whilelt pn13.h, x10, x21, vlx2 // 00100101-01110101-01000101-01010101
+// CHECK-INST: whilelt pn13.h, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x45,0x75,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25754555 <unknown>
+
+whilelt pn15.h, x13, x8, vlx4 // 00100101-01101000-01100101-10110111
+// CHECK-INST: whilelt pn15.h, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x65,0x68,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 256865b7 <unknown>
+
+whilelt pn15.h, xzr, xzr, vlx4 // 00100101-01111111-01100111-11110111
+// CHECK-INST: whilelt pn15.h, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x67,0x7f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 257f67f7 <unknown>
+
+whilelt pn8.s, x0, x0, vlx2 // 00100101-10100000-01000100-00010000
+// CHECK-INST: whilelt pn8.s, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x44,0xa0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a04410 <unknown>
+
+whilelt pn13.s, x10, x21, vlx2 // 00100101-10110101-01000101-01010101
+// CHECK-INST: whilelt pn13.s, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x45,0xb5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25b54555 <unknown>
+
+whilelt pn15.s, x13, x8, vlx4 // 00100101-10101000-01100101-10110111
+// CHECK-INST: whilelt pn15.s, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x65,0xa8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25a865b7 <unknown>
+
+whilelt pn15.s, xzr, xzr, vlx4 // 00100101-10111111-01100111-11110111
+// CHECK-INST: whilelt pn15.s, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x67,0xbf,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25bf67f7 <unknown>
+
+whilelt pn8.d, x0, x0, vlx2 // 00100101-11100000-01000100-00010000
+// CHECK-INST: whilelt pn8.d, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x44,0xe0,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e04410 <unknown>
+
+whilelt pn13.d, x10, x21, vlx2 // 00100101-11110101-01000101-01010101
+// CHECK-INST: whilelt pn13.d, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x45,0xf5,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25f54555 <unknown>
+
+whilelt pn15.d, x13, x8, vlx4 // 00100101-11101000-01100101-10110111
+// CHECK-INST: whilelt pn15.d, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x65,0xe8,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25e865b7 <unknown>
+
+whilelt pn15.d, xzr, xzr, vlx4 // 00100101-11111111-01100111-11110111
+// CHECK-INST: whilelt pn15.d, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x67,0xff,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25ff67f7 <unknown>
+
+whilelt pn8.b, x0, x0, vlx2 // 00100101-00100000-01000100-00010000
+// CHECK-INST: whilelt pn8.b, x0, x0, vlx2
+// CHECK-ENCODING: [0x10,0x44,0x20,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25204410 <unknown>
+
+whilelt pn13.b, x10, x21, vlx2 // 00100101-00110101-01000101-01010101
+// CHECK-INST: whilelt pn13.b, x10, x21, vlx2
+// CHECK-ENCODING: [0x55,0x45,0x35,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 25354555 <unknown>
+
+whilelt pn15.b, x13, x8, vlx4 // 00100101-00101000-01100101-10110111
+// CHECK-INST: whilelt pn15.b, x13, x8, vlx4
+// CHECK-ENCODING: [0xb7,0x65,0x28,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 252865b7 <unknown>
+
+whilelt pn15.b, xzr, xzr, vlx4 // 00100101-00111111-01100111-11110111
+// CHECK-INST: whilelt pn15.b, xzr, xzr, vlx4
+// CHECK-ENCODING: [0xf7,0x67,0x3f,0x25]
+// CHECK-ERROR: instruction requires: sme2 or sve2p1
+// CHECK-UNKNOWN: 253f67f7 <unknown>
More information about the llvm-commits
mailing list