aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2023-03-30 11:09:12 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2023-03-30 11:09:12 +0100
commitcbd11b8818335007cf960e0cecc4dec445f80327 (patch)
tree0c93cdb222610d90df1b5d74fd31c55b3c6db96f /gas
parent99e01a66b4c619fb8c7d6f978038eb7a3661c160 (diff)
downloadgdb-cbd11b8818335007cf960e0cecc4dec445f80327.zip
gdb-cbd11b8818335007cf960e0cecc4dec445f80327.tar.gz
gdb-cbd11b8818335007cf960e0cecc4dec445f80327.tar.bz2
aarch64: Add the SME2 ZT0 instructions
SME2 adds lookup table instructions for quantisation. They use a new lookup table register called ZT0. LUTI2 takes an unsuffixed SVE vector index of the form Zn[<imm>], which is the first time that this syntax has been used.
Diffstat (limited to 'gas')
-rw-r--r--gas/config/tc-aarch64.c73
-rw-r--r--gas/testsuite/gas/aarch64/sme-4-illegal.l6
-rw-r--r--gas/testsuite/gas/aarch64/sme2-8-invalid.d3
-rw-r--r--gas/testsuite/gas/aarch64/sme2-8-invalid.l208
-rw-r--r--gas/testsuite/gas/aarch64/sme2-8-invalid.s116
-rw-r--r--gas/testsuite/gas/aarch64/sme2-8-noarch.d3
-rw-r--r--gas/testsuite/gas/aarch64/sme2-8-noarch.l104
-rw-r--r--gas/testsuite/gas/aarch64/sme2-8.d112
-rw-r--r--gas/testsuite/gas/aarch64/sme2-8.s124
-rw-r--r--gas/testsuite/gas/aarch64/sve-invalid.l8
-rw-r--r--gas/testsuite/gas/aarch64/sve-invalid.s1
11 files changed, 746 insertions, 12 deletions
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
index a433925..652fd4e 100644
--- a/gas/config/tc-aarch64.c
+++ b/gas/config/tc-aarch64.c
@@ -312,6 +312,7 @@ struct reloc_entry
BASIC_REG_TYPE(ZAT) /* za[0-15] (ZA tile) */ \
BASIC_REG_TYPE(ZATH) /* za[0-15]h (ZA tile horizontal slice) */ \
BASIC_REG_TYPE(ZATV) /* za[0-15]v (ZA tile vertical slice) */ \
+ BASIC_REG_TYPE(ZT0) /* zt0 */ \
/* Typecheck: any 64-bit int reg (inc SP exc XZR). */ \
MULTI_REG_TYPE(R64_SP, REG_TYPE(R_64) | REG_TYPE(SP_64)) \
/* Typecheck: same, plus SVE registers. */ \
@@ -483,11 +484,11 @@ get_reg_expected_msg (unsigned int mask, unsigned int seen)
if (mask == reg_type_masks[REG_TYPE_VZP])
return N_("expected a vector or predicate register at operand %d");
- /* ZA-related registers. */
+ /* SME-related registers. */
if (mask == reg_type_masks[REG_TYPE_ZA])
return N_("expected a ZA array vector at operand %d");
- if (mask == reg_type_masks[REG_TYPE_ZA_ZAT])
- return N_("expected 'za' or a ZA tile at operand %d");
+ if (mask == (reg_type_masks[REG_TYPE_ZA_ZAT] | reg_type_masks[REG_TYPE_ZT0]))
+ return N_("expected ZT0 or a ZA mask at operand %d");
if (mask == reg_type_masks[REG_TYPE_ZAT])
return N_("expected a ZA tile at operand %d");
if (mask == reg_type_masks[REG_TYPE_ZATHV])
@@ -1279,7 +1280,10 @@ parse_typed_reg (char **ccp, aarch64_reg_type type,
if (!(flags & PTR_FULL_REG) && skip_past_char (&str, '['))
{
/* Reject Sn[index] syntax. */
- if (reg->type != REG_TYPE_PN && !is_typed_vecreg)
+ if (reg->type != REG_TYPE_Z
+ && reg->type != REG_TYPE_PN
+ && reg->type != REG_TYPE_ZT0
+ && !is_typed_vecreg)
{
first_error (_("this type of register can't be indexed"));
return NULL;
@@ -6722,6 +6726,12 @@ parse_operands (char *str, const aarch64_opcode *opcode)
case AARCH64_OPND_SVE_Zm4_11_INDEX:
case AARCH64_OPND_SVE_Zm4_INDEX:
case AARCH64_OPND_SVE_Zn_INDEX:
+ case AARCH64_OPND_SME_Zn_INDEX1_16:
+ case AARCH64_OPND_SME_Zn_INDEX2_15:
+ case AARCH64_OPND_SME_Zn_INDEX2_16:
+ case AARCH64_OPND_SME_Zn_INDEX3_14:
+ case AARCH64_OPND_SME_Zn_INDEX3_15:
+ case AARCH64_OPND_SME_Zn_INDEX4_14:
reg_type = REG_TYPE_Z;
goto vector_reg_index;
@@ -6735,14 +6745,23 @@ parse_operands (char *str, const aarch64_opcode *opcode)
reg = aarch64_reg_parse (&str, reg_type, &vectype);
if (!reg)
goto failure;
- if (vectype.type == NT_invtype || !(vectype.defined & NTA_HASINDEX))
+ if (!(vectype.defined & NTA_HASINDEX))
goto failure;
+ if (reg->type == REG_TYPE_Z && vectype.type == NT_invtype)
+ /* Unqualified Zn[index] is allowed in LUTI2 instructions. */
+ info->qualifier = AARCH64_OPND_QLF_NIL;
+ else
+ {
+ if (vectype.type == NT_invtype)
+ goto failure;
+ info->qualifier = vectype_to_qualifier (&vectype);
+ if (info->qualifier == AARCH64_OPND_QLF_NIL)
+ goto failure;
+ }
+
info->reglane.regno = reg->number;
info->reglane.index = vectype.index;
- info->qualifier = vectype_to_qualifier (&vectype);
- if (info->qualifier == AARCH64_OPND_QLF_NIL)
- goto failure;
break;
case AARCH64_OPND_SVE_ZnxN:
@@ -7740,6 +7759,39 @@ parse_operands (char *str, const aarch64_opcode *opcode)
goto failure;
break;
+ case AARCH64_OPND_SME_ZT0:
+ po_reg_or_fail (REG_TYPE_ZT0);
+ break;
+
+ case AARCH64_OPND_SME_ZT0_INDEX:
+ reg = aarch64_reg_parse (&str, REG_TYPE_ZT0, &vectype);
+ if (!reg || vectype.type != NT_invtype)
+ goto failure;
+ if (!(vectype.defined & NTA_HASINDEX))
+ {
+ set_syntax_error (_("missing register index"));
+ goto failure;
+ }
+ info->imm.value = vectype.index;
+ break;
+
+ case AARCH64_OPND_SME_ZT0_LIST:
+ if (*str != '{')
+ {
+ set_expected_reglist_error (REG_TYPE_ZT0, parse_reg (&str));
+ goto failure;
+ }
+ str++;
+ if (!parse_typed_reg (&str, REG_TYPE_ZT0, &vectype, PTR_IN_REGLIST))
+ goto failure;
+ if (*str != '}')
+ {
+ set_syntax_error (_("expected '}' after ZT0"));
+ goto failure;
+ }
+ str++;
+ break;
+
case AARCH64_OPND_SME_PNn3_INDEX1:
case AARCH64_OPND_SME_PNn3_INDEX2:
reg = aarch64_reg_parse (&str, REG_TYPE_PN, &vectype);
@@ -8462,7 +8514,10 @@ static const reg_entry reg_names[] = {
REGSET16S (za, h, ZATH), REGSET16S (ZA, H, ZATH),
/* SME ZA tile registers (vertical slice). */
- REGSET16S (za, v, ZATV), REGSET16S (ZA, V, ZATV)
+ REGSET16S (za, v, ZATV), REGSET16S (ZA, V, ZATV),
+
+ /* SME2 ZT0. */
+ REGDEF (zt0, 0, ZT0), REGDEF (ZT0, 0, ZT0)
};
#undef REGDEF
diff --git a/gas/testsuite/gas/aarch64/sme-4-illegal.l b/gas/testsuite/gas/aarch64/sme-4-illegal.l
index 86e3154..a9e9852 100644
--- a/gas/testsuite/gas/aarch64/sme-4-illegal.l
+++ b/gas/testsuite/gas/aarch64/sme-4-illegal.l
@@ -22,11 +22,11 @@
[^:]*:[0-9]+: Error: syntax error in register list at operand 1 -- `zero {za,}'
[^:]*:[0-9]+: Error: unexpected character `}' in element size at operand 1 -- `zero {za.}'
[^:]*:[0-9]+: Error: expected '}' at operand 1 -- `zero {za-}'
-[^:]*:[0-9]+: Error: expected 'za' or a ZA tile at operand 1 -- `zero {za_}'
+[^:]*:[0-9]+: Error: expected ZT0 or a ZA mask at operand 1 -- `zero {za_}'
[^:]*:[0-9]+: Error: expected '}' at operand 1 -- `zero {za#}'
-[^:]*:[0-9]+: Error: expected 'za' or a ZA tile at operand 1 -- `zero {zaX}'
+[^:]*:[0-9]+: Error: expected ZT0 or a ZA mask at operand 1 -- `zero {zaX}'
[^:]*:[0-9]+: Error: missing ZA tile size at operand 1 -- `zero {za0}'
-[^:]*:[0-9]+: Error: expected 'za' or a ZA tile at operand 1 -- `zero {zax}'
+[^:]*:[0-9]+: Error: expected ZT0 or a ZA mask at operand 1 -- `zero {zax}'
[^:]*:[0-9]+: Error: expected '}' at operand 1 -- `zero {za{}'
[^:]*:[0-9]+: Error: unexpected characters following instruction at operand 1 -- `zero {za}}'
[^:]*:[0-9]+: Error: ZA tile masks do not operate at .Q granularity at operand 1 -- `zero {za0\.q}'
diff --git a/gas/testsuite/gas/aarch64/sme2-8-invalid.d b/gas/testsuite/gas/aarch64/sme2-8-invalid.d
new file mode 100644
index 0000000..d9f587d
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-8-invalid.d
@@ -0,0 +1,3 @@
+#as: -march=armv8-a
+#source: sme2-8-invalid.s
+#error_output: sme2-8-invalid.l
diff --git a/gas/testsuite/gas/aarch64/sme2-8-invalid.l b/gas/testsuite/gas/aarch64/sme2-8-invalid.l
new file mode 100644
index 0000000..afea8bb
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-8-invalid.l
@@ -0,0 +1,208 @@
+[^ :]+: Assembler messages:
+[^ :]+:[0-9]+: Error: expected '{' at operand 1 -- `zero 0'
+[^ :]+:[0-9]+: Error: expected '{' at operand 1 -- `zero zt0'
+[^ :]+:[0-9]+: Error: syntax error in register list at operand 1 -- `zero {'
+[^ :]+:[0-9]+: Error: expected ZT0 or a ZA mask at operand 1 -- `zero {foo}'
+[^ :]+:[0-9]+: Error: expected ZT0 or a ZA mask at operand 1 -- `zero {zt}'
+[^ :]+:[0-9]+: Error: expected ZT0 or a ZA mask at operand 1 -- `zero {x0}'
+[^ :]+:[0-9]+: Error: expected ZT0 or a ZA mask at operand 1 -- `zero {z0}'
+[^ :]+:[0-9]+: Error: expected '}' after ZT0 at operand 1 -- `zero {zt0'
+[^ :]+:[0-9]+: Error: expected '}' after ZT0 at operand 1 -- `zero {zt0\.b}'
+[^ :]+:[0-9]+: Error: expected '}' after ZT0 at operand 1 -- `zero {zt0,zt0}'
+[^ :]+:[0-9]+: Error: expected a register at operand 1 -- `movt 0,zt0\[0\]'
+[^ :]+:[0-9]+: Error: expected a register at operand 2 -- `movt x0,0'
+[^ :]+:[0-9]+: Error: missing register index at operand 1 -- `movt zt0,x0'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 1 -- `movt za\[0\],x0'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 1 -- `movt za0\[0\],x0'
+[^ :]+:[0-9]+: Error: bad expression at operand 1 -- `movt zt0\[#0\],x0'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 56 at operand 1 -- `movt zt0\[-1\],x0'
+[^ :]+:[0-9]+: Error: byte index must be a multiple of 8 at operand 1 -- `movt zt0\[1\],x0'
+[^ :]+:[0-9]+: Error: byte index must be a multiple of 8 at operand 1 -- `movt zt0\[2\],x0'
+[^ :]+:[0-9]+: Error: byte index must be a multiple of 8 at operand 1 -- `movt zt0\[4\],x0'
+[^ :]+:[0-9]+: Error: byte index must be a multiple of 8 at operand 1 -- `movt zt0\[7\],x0'
+[^ :]+:[0-9]+: Error: byte index must be a multiple of 8 at operand 1 -- `movt zt0\[49\],x0'
+[^ :]+:[0-9]+: Error: byte index must be a multiple of 8 at operand 1 -- `movt zt0\[50\],x0'
+[^ :]+:[0-9]+: Error: byte index must be a multiple of 8 at operand 1 -- `movt zt0\[52\],x0'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 56 at operand 1 -- `movt zt0\[57\],x0'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 56 at operand 1 -- `movt zt0\[64\],x0'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 56 at operand 1 -- `movt zt0\[1<<32\],x0'
+[^ :]+:[0-9]+: Error: missing register index at operand 1 -- `movt zt0\.b\[0\],x0'
+[^ :]+:[0-9]+: Error: missing register index at operand 1 -- `movt zt0/z\[0\],x0'
+[^ :]+:[0-9]+: Error: expected an integer or zero register at operand 2 -- `movt zt0\[0\],sp'
+[^ :]+:[0-9]+: Error: operand mismatch -- `movt zt0\[0\],w0'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: movt zt0\[0\], x0
+[^ :]+:[0-9]+: Error: expected an integer or zero register at operand 2 -- `movt zt0\[0\],wsp'
+[^ :]+:[0-9]+: Error: operand mismatch -- `movt zt0\[0\],wzr'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: movt zt0\[0\], xzr
+[^ :]+:[0-9]+: Error: expected an integer or zero register at operand 2 -- `movt zt0\[0\],0'
+[^ :]+:[0-9]+: Error: expected a register at operand 1 -- `ldr 0,\[x0\]'
+[^ :]+:[0-9]+: Error: invalid addressing mode at operand 2 -- `ldr zt0,0'
+[^ :]+:[0-9]+: Error: operand 2 must be an address with base register \(no offset\) -- `ldr zt0,\[x0,#0\]'
+[^ :]+:[0-9]+: Error: expected a register at operand 1 -- `ldr Zt0,\[x0\]'
+[^ :]+:[0-9]+: Error: expected a register at operand 1 -- `ldr zT0,\[x0\]'
+[^ :]+:[0-9]+: Error: '\]' expected at operand 2 -- `ldr zt0,\[x0,#0,mul vl\]'
+[^ :]+:[0-9]+: Error: expected a 64-bit base register at operand 2 -- `ldr zt0,\[w0\]'
+[^ :]+:[0-9]+: Error: missing offset in the pre-indexed address at operand 2 -- `ldr zt0,\[x0\]!'
+[^ :]+:[0-9]+: Error: invalid base register at operand 2 -- `ldr zt0,\[xzr\]'
+[^ :]+:[0-9]+: Error: expected a 64-bit base register at operand 2 -- `ldr zt0,\[wsp\]'
+[^ :]+:[0-9]+: Error: invalid addressing mode at operand 2 -- `ldr zt0,\[x0,xzr\]'
+[^ :]+:[0-9]+: Error: invalid addressing mode at operand 2 -- `ldr zt0,\[x1,x2\]'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 15 at operand 3 -- `luti2 z0\.b,zt0,z0\[-1\]'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 15 at operand 3 -- `luti2 z0\.b,zt0,z0\[16\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 z0\.b,zt0,z0\.b\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 z0,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 z0\.d,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 z0\.q,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: expected an SVE vector register at operand 3 -- `luti2 z0\.b,zt0,zt0'
+[^ :]+:[0-9]+: Error: expected a register or register list at operand 1 -- `luti2 0,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: expected a register at operand 2 -- `luti2 z0\.b,0,z0\[0\]'
+[^ :]+:[0-9]+: Error: expected an SVE vector register at operand 3 -- `luti2 z0\.b,zt0,0'
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti2 {z1\.b-z2\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti2 {z0\.b-z1\.b},z0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti2 {z0\.b-z1\.b},za,z0\[0\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 {z0\.h-z1\.h},zt0,z0\.h\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 7 at operand 3 -- `luti2 {z0\.h-z1\.h},zt0,z0\[-1\]'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 7 at operand 3 -- `luti2 {z0\.h-z1\.h},zt0,z0\[8\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 {z0\.d-z1\.d},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 {z0\.q-z1\.q},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti2 {z1\.s-z4\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti2 {z2\.s-z5\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti2 {z3\.s-z6\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti2 {z0\.s-z3\.s},z0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti2 {z0\.b-z3\.b},za,z0\[0\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 {z0\.b-z3\.b},zt0,z0\.b\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 {z0\.s-z3\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 3 at operand 3 -- `luti2 {z0\.b-z3\.b},zt0,z0\[-1\]'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 3 at operand 3 -- `luti2 {z0\.b-z3\.b},zt0,z0\[4\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 {z0\.d-z3\.d},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 {z0\.s-z3\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti2 {z0\.q-z3\.q},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti2 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti2 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti2 {z0\.s-z3\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: expected a register or register list at operand 1 -- `luti4 0,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: expected a register at operand 2 -- `luti4 z0\.b,0,z0\[0\]'
+[^ :]+:[0-9]+: Error: expected an SVE vector register at operand 3 -- `luti4 z0\.b,zt0,0'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 7 at operand 3 -- `luti4 z0\.h,zt0,z0\[-1\]'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 7 at operand 3 -- `luti4 z0\.h,zt0,z0\[8\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 z0\.h,zt0,z0\.h\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 z0,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 z0\.d,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 z0\.q,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 z0\.b, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 z0\.h, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 z0\.s, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: expected an SVE vector register at operand 3 -- `luti4 z0\.h,zt0,zt0'
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti4 {z1\.h-z2\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti4 {z0\.h-z1\.h},z0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti4 {z0\.h-z1\.h},za,z0\[0\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 {z0\.h-z1\.h},zt0,z0\.h\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 3 at operand 3 -- `luti4 {z0\.h-z1\.h},zt0,z0\[-1\]'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 3 at operand 3 -- `luti4 {z0\.h-z1\.h},zt0,z0\[4\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 {z0\.d-z1\.d},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 {z0\.q-z1\.q},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti4 {z1\.s-z4\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti4 {z2\.s-z5\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: start register out of range at operand 1 -- `luti4 {z3\.s-z6\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti4 {z0\.s-z3\.s},z0,z0\[0\]'
+[^ :]+:[0-9]+: Error: unexpected register type at operand 2 -- `luti4 {z0\.s-z3\.s},za,z0\[0\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 {z0\.s-z3\.s},zt0,z0\.s\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 {z0\.s-z3\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 1 at operand 3 -- `luti4 {z0\.s-z3\.s},zt0,z0\[-1\]'
+[^ :]+:[0-9]+: Error: register element index out of range 0 to 1 at operand 3 -- `luti4 {z0\.s-z3\.s},zt0,z0\[2\]'
+[^ :]+:[0-9]+: Error: expected a list of 2 registers at operand 1 -- `luti4 {z0\.b-z3\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 {z0\.d-z3\.d},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 {z0\.s-z3\.s}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Error: operand mismatch -- `luti4 {z0\.q-z3\.q},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Info: did you mean this\?
+[^ :]+:[0-9]+: Info: luti4 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: other valid variant\(s\):
+[^ :]+:[0-9]+: Info: luti4 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^ :]+:[0-9]+: Info: luti4 {z0\.s-z3\.s}, zt0, z0\[0\]
diff --git a/gas/testsuite/gas/aarch64/sme2-8-invalid.s b/gas/testsuite/gas/aarch64/sme2-8-invalid.s
new file mode 100644
index 0000000..a9712c7
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-8-invalid.s
@@ -0,0 +1,116 @@
+ zero 0
+
+ zero zt0
+ zero {
+ zero { foo }
+ zero { zt }
+ zero { x0 }
+ zero { z0 }
+ zero { zt0
+ zero { zt0.b }
+ zero { zt0, zt0 }
+
+ movt 0, zt0[0]
+ movt x0, 0
+
+ movt zt0, x0
+ movt za[0], x0
+ movt za0[0], x0
+ movt zt0[#0], x0
+ movt zt0[-1], x0
+ movt zt0[1],x0
+ movt zt0[2],x0
+ movt zt0[4],x0
+ movt zt0[7],x0
+ movt zt0[49],x0
+ movt zt0[50],x0
+ movt zt0[52],x0
+ movt zt0[57],x0
+ movt zt0[64], x0
+ movt zt0[1<<32], x0
+ movt zt0.b[0], x0
+ movt zt0/z[0], x0
+ movt zt0[0], sp
+ movt zt0[0], w0
+ movt zt0[0], wsp
+ movt zt0[0], wzr
+ movt zt0[0], 0
+
+ ldr 0, [x0]
+ ldr zt0, 0
+
+ ldr zt0, [x0, #0]
+ ldr Zt0, [x0]
+ ldr zT0, [x0]
+ ldr zt0, [x0, #0, mul vl]
+ ldr zt0, [w0]
+ ldr zt0, [x0]!
+ ldr zt0, [xzr]
+ ldr zt0, [wsp]
+ ldr zt0, [x0, xzr]
+ ldr zt0, [x1, x2]
+
+ luti2 z0.b, zt0, z0[-1]
+ luti2 z0.b, zt0, z0[16]
+ luti2 z0.b, zt0, z0.b[0]
+ luti2 z0, zt0, z0[0]
+ luti2 z0.d, zt0, z0[0]
+ luti2 z0.q, zt0, z0[0]
+ luti2 z0.b, zt0, zt0
+
+ luti2 0, zt0, z0[0]
+ luti2 z0.b, 0, z0[0]
+ luti2 z0.b, zt0, 0
+
+ luti2 { z1.b - z2.b }, zt0, z0[0]
+ luti2 { z0.b - z1.b }, z0, z0[0]
+ luti2 { z0.b - z1.b }, za, z0[0]
+ luti2 { z0.h - z1.h }, zt0, z0.h[0]
+ luti2 { z0.h - z1.h }, zt0, z0[-1]
+ luti2 { z0.h - z1.h }, zt0, z0[8]
+ luti2 { z0.d - z1.d }, zt0, z0[0]
+ luti2 { z0.q - z1.q }, zt0, z0[0]
+
+ luti2 { z1.s - z4.s }, zt0, z0[0]
+ luti2 { z2.s - z5.s }, zt0, z0[0]
+ luti2 { z3.s - z6.s }, zt0, z0[0]
+ luti2 { z0.s - z3.s }, z0, z0[0]
+ luti2 { z0.b - z3.b }, za, z0[0]
+ luti2 { z0.b - z3.b }, zt0, z0.b[0]
+ luti2 { z0.b - z3.b }, zt0, z0[-1]
+ luti2 { z0.b - z3.b }, zt0, z0[4]
+ luti2 { z0.d - z3.d }, zt0, z0[0]
+ luti2 { z0.q - z3.q }, zt0, z0[0]
+
+ luti4 0, zt0, z0[0]
+ luti4 z0.b, 0, z0[0]
+ luti4 z0.b, zt0, 0
+
+ luti4 z0.h, zt0, z0[-1]
+ luti4 z0.h, zt0, z0[8]
+ luti4 z0.h, zt0, z0.h[0]
+ luti4 z0, zt0, z0[0]
+ luti4 z0.d, zt0, z0[0]
+ luti4 z0.q, zt0, z0[0]
+ luti4 z0.h, zt0, zt0
+
+ luti4 { z1.h - z2.h }, zt0, z0[0]
+ luti4 { z0.h - z1.h }, z0, z0[0]
+ luti4 { z0.h - z1.h }, za, z0[0]
+ luti4 { z0.h - z1.h }, zt0, z0.h[0]
+ luti4 { z0.h - z1.h }, zt0, z0[-1]
+ luti4 { z0.h - z1.h }, zt0, z0[4]
+ luti4 { z0.d - z1.d }, zt0, z0[0]
+ luti4 { z0.q - z1.q }, zt0, z0[0]
+
+ luti4 { z1.s - z4.s }, zt0, z0[0]
+ luti4 { z2.s - z5.s }, zt0, z0[0]
+ luti4 { z3.s - z6.s }, zt0, z0[0]
+ luti4 { z0.s - z3.s }, z0, z0[0]
+ luti4 { z0.s - z3.s }, za, z0[0]
+ luti4 { z0.s - z3.s }, zt0, z0.s[0]
+ luti4 { z0.s - z3.s }, zt0, z0[-1]
+ luti4 { z0.s - z3.s }, zt0, z0[2]
+ luti4 { z0.b - z3.b }, zt0, z0[0]
+ luti4 { z0.d - z3.d }, zt0, z0[0]
+ luti4 { z0.q - z3.q }, zt0, z0[0]
diff --git a/gas/testsuite/gas/aarch64/sme2-8-noarch.d b/gas/testsuite/gas/aarch64/sme2-8-noarch.d
new file mode 100644
index 0000000..116e9d6
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-8-noarch.d
@@ -0,0 +1,3 @@
+#as: -march=armv8-a+sme
+#source: sme2-8.s
+#error_output: sme2-8-noarch.l
diff --git a/gas/testsuite/gas/aarch64/sme2-8-noarch.l b/gas/testsuite/gas/aarch64/sme2-8-noarch.l
new file mode 100644
index 0000000..994b359
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-8-noarch.l
@@ -0,0 +1,104 @@
+[^ :]+: Assembler messages:
+[^ :]+:[0-9]+: Error: selected processor does not support `zero {zt0}'
+[^ :]+:[0-9]+: Error: selected processor does not support `zero {ZT0}'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt x0,zt0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt X0,ZT0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt x30,zt0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt xzr,zt0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt x0,zt0\[56\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt x9,zt0\[24\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt x15,zt0\[40\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt x22,zt0\[48\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[0\],x0'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt ZT0\[0\],X0'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[56\],x0'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[0\],x30'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[0\],xzr'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[8\],x20'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[16\],x25'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[32\],x27'
+[^ :]+:[0-9]+: Error: selected processor does not support `movt zt0\[24\],x29'
+[^ :]+:[0-9]+: Error: selected processor does not support `ldr zt0,\[x0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `ldr ZT0,\[X0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `ldr zt0,\[x30\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `ldr zt0,\[sp\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `str zt0,\[x0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `str ZT0,\[X0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `str zt0,\[x30\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `str zt0,\[sp\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.b,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 Z0\.B,ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z31\.b,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.b,zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.b,zt0,z0\[15\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.h,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z31\.h,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.h,zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.h,zt0,z0\[15\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.s,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z31\.s,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.s,zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 z0\.s,zt0,z0\[15\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.b-z1\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {Z0\.B-Z1\.B},ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z30\.b-z31\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.b-z1\.b},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.b-z1\.b},zt0,z0\[7\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.h-z1\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z30\.h-z31\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.h-z1\.h},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.h-z1\.h},zt0,z0\[7\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.s-z1\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z30\.s-z31\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.s-z1\.s},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.s-z1\.s},zt0,z0\[7\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.b-z3\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {Z0\.B-Z3\.B},ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z28\.b-z31\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.b-z3\.b},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.b-z3\.b},zt0,z0\[3\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.h-z3\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z28\.h-z31\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.h-z3\.h},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.h-z3\.h},zt0,z0\[3\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.s-z3\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z28\.s-z31\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.s-z3\.s},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti2 {z0\.s-z3\.s},zt0,z0\[3\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.b,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 Z0\.b,ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z31\.b,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.b,zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.b,zt0,z0\[7\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.h,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 Z0\.H,ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z31\.h,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.h,zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.h,zt0,z0\[7\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.s,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z31\.s,zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.s,zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 z0\.s,zt0,z0\[7\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.b-z1\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {Z0\.b-Z1\.b},ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z30\.b-z31\.b},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.b-z1\.b},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.b-z1\.b},zt0,z0\[3\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.h-z1\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {Z0\.H-Z1\.H},ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z30\.h-z31\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.h-z1\.h},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.h-z1\.h},zt0,z0\[3\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.s-z1\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z30\.s-z31\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.s-z1\.s},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.s-z1\.s},zt0,z0\[3\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.h-z3\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {Z0\.H-Z3\.H},ZT0,Z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z28\.h-z31\.h},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.h-z3\.h},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.h-z3\.h},zt0,z0\[1\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.s-z3\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z28\.s-z31\.s},zt0,z0\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.s-z3\.s},zt0,z31\[0\]'
+[^ :]+:[0-9]+: Error: selected processor does not support `luti4 {z0\.s-z3\.s},zt0,z0\[1\]'
diff --git a/gas/testsuite/gas/aarch64/sme2-8.d b/gas/testsuite/gas/aarch64/sme2-8.d
new file mode 100644
index 0000000..a129dff
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-8.d
@@ -0,0 +1,112 @@
+#as: -march=armv8-a+sme2
+#objdump: -dr
+
+[^:]+: file format .*
+
+
+[^:]+:
+
+[^:]+:
+[^:]+: c0480001 zero {zt0}
+[^:]+: c0480001 zero {zt0}
+[^:]+: c04c03e0 movt x0, zt0\[0\]
+[^:]+: c04c03e0 movt x0, zt0\[0\]
+[^:]+: c04c03fe movt x30, zt0\[0\]
+[^:]+: c04c03ff movt xzr, zt0\[0\]
+[^:]+: c04c73e0 movt x0, zt0\[56\]
+[^:]+: c04c33e9 movt x9, zt0\[24\]
+[^:]+: c04c53ef movt x15, zt0\[40\]
+[^:]+: c04c63f6 movt x22, zt0\[48\]
+[^:]+: c04e03e0 movt zt0\[0\], x0
+[^:]+: c04e03e0 movt zt0\[0\], x0
+[^:]+: c04e73e0 movt zt0\[56\], x0
+[^:]+: c04e03fe movt zt0\[0\], x30
+[^:]+: c04e03ff movt zt0\[0\], xzr
+[^:]+: c04e13f4 movt zt0\[8\], x20
+[^:]+: c04e23f9 movt zt0\[16\], x25
+[^:]+: c04e43fb movt zt0\[32\], x27
+[^:]+: c04e33fd movt zt0\[24\], x29
+[^:]+: e11f8000 ldr zt0, \[x0\]
+[^:]+: e11f8000 ldr zt0, \[x0\]
+[^:]+: e11f83c0 ldr zt0, \[x30\]
+[^:]+: e11f83e0 ldr zt0, \[sp\]
+[^:]+: e13f8000 str zt0, \[x0\]
+[^:]+: e13f8000 str zt0, \[x0\]
+[^:]+: e13f83c0 str zt0, \[x30\]
+[^:]+: e13f83e0 str zt0, \[sp\]
+[^:]+: c0cc0000 luti2 z0\.b, zt0, z0\[0\]
+[^:]+: c0cc0000 luti2 z0\.b, zt0, z0\[0\]
+[^:]+: c0cc001f luti2 z31\.b, zt0, z0\[0\]
+[^:]+: c0cc03e0 luti2 z0\.b, zt0, z31\[0\]
+[^:]+: c0cfc000 luti2 z0\.b, zt0, z0\[15\]
+[^:]+: c0cc1000 luti2 z0\.h, zt0, z0\[0\]
+[^:]+: c0cc101f luti2 z31\.h, zt0, z0\[0\]
+[^:]+: c0cc13e0 luti2 z0\.h, zt0, z31\[0\]
+[^:]+: c0cfd000 luti2 z0\.h, zt0, z0\[15\]
+[^:]+: c0cc2000 luti2 z0\.s, zt0, z0\[0\]
+[^:]+: c0cc201f luti2 z31\.s, zt0, z0\[0\]
+[^:]+: c0cc23e0 luti2 z0\.s, zt0, z31\[0\]
+[^:]+: c0cfe000 luti2 z0\.s, zt0, z0\[15\]
+[^:]+: c08c4000 luti2 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^:]+: c08c4000 luti2 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^:]+: c08c401e luti2 {z30\.b-z31\.b}, zt0, z0\[0\]
+[^:]+: c08c43e0 luti2 {z0\.b-z1\.b}, zt0, z31\[0\]
+[^:]+: c08fc000 luti2 {z0\.b-z1\.b}, zt0, z0\[7\]
+[^:]+: c08c5000 luti2 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^:]+: c08c501e luti2 {z30\.h-z31\.h}, zt0, z0\[0\]
+[^:]+: c08c53e0 luti2 {z0\.h-z1\.h}, zt0, z31\[0\]
+[^:]+: c08fd000 luti2 {z0\.h-z1\.h}, zt0, z0\[7\]
+[^:]+: c08c6000 luti2 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^:]+: c08c601e luti2 {z30\.s-z31\.s}, zt0, z0\[0\]
+[^:]+: c08c63e0 luti2 {z0\.s-z1\.s}, zt0, z31\[0\]
+[^:]+: c08fe000 luti2 {z0\.s-z1\.s}, zt0, z0\[7\]
+[^:]+: c08c8000 luti2 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^:]+: c08c8000 luti2 {z0\.b-z3\.b}, zt0, z0\[0\]
+[^:]+: c08c801c luti2 {z28\.b-z31\.b}, zt0, z0\[0\]
+[^:]+: c08c83e0 luti2 {z0\.b-z3\.b}, zt0, z31\[0\]
+[^:]+: c08f8000 luti2 {z0\.b-z3\.b}, zt0, z0\[3\]
+[^:]+: c08c9000 luti2 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^:]+: c08c901c luti2 {z28\.h-z31\.h}, zt0, z0\[0\]
+[^:]+: c08c93e0 luti2 {z0\.h-z3\.h}, zt0, z31\[0\]
+[^:]+: c08f9000 luti2 {z0\.h-z3\.h}, zt0, z0\[3\]
+[^:]+: c08ca000 luti2 {z0\.s-z3\.s}, zt0, z0\[0\]
+[^:]+: c08ca01c luti2 {z28\.s-z31\.s}, zt0, z0\[0\]
+[^:]+: c08ca3e0 luti2 {z0\.s-z3\.s}, zt0, z31\[0\]
+[^:]+: c08fa000 luti2 {z0\.s-z3\.s}, zt0, z0\[3\]
+[^:]+: c0ca0000 luti4 z0\.b, zt0, z0\[0\]
+[^:]+: c0ca0000 luti4 z0\.b, zt0, z0\[0\]
+[^:]+: c0ca001f luti4 z31\.b, zt0, z0\[0\]
+[^:]+: c0ca03e0 luti4 z0\.b, zt0, z31\[0\]
+[^:]+: c0cbc000 luti4 z0\.b, zt0, z0\[7\]
+[^:]+: c0ca1000 luti4 z0\.h, zt0, z0\[0\]
+[^:]+: c0ca1000 luti4 z0\.h, zt0, z0\[0\]
+[^:]+: c0ca101f luti4 z31\.h, zt0, z0\[0\]
+[^:]+: c0ca13e0 luti4 z0\.h, zt0, z31\[0\]
+[^:]+: c0cbd000 luti4 z0\.h, zt0, z0\[7\]
+[^:]+: c0ca2000 luti4 z0\.s, zt0, z0\[0\]
+[^:]+: c0ca201f luti4 z31\.s, zt0, z0\[0\]
+[^:]+: c0ca23e0 luti4 z0\.s, zt0, z31\[0\]
+[^:]+: c0cbe000 luti4 z0\.s, zt0, z0\[7\]
+[^:]+: c08a4000 luti4 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^:]+: c08a4000 luti4 {z0\.b-z1\.b}, zt0, z0\[0\]
+[^:]+: c08a401e luti4 {z30\.b-z31\.b}, zt0, z0\[0\]
+[^:]+: c08a43e0 luti4 {z0\.b-z1\.b}, zt0, z31\[0\]
+[^:]+: c08bc000 luti4 {z0\.b-z1\.b}, zt0, z0\[3\]
+[^:]+: c08a5000 luti4 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^:]+: c08a5000 luti4 {z0\.h-z1\.h}, zt0, z0\[0\]
+[^:]+: c08a501e luti4 {z30\.h-z31\.h}, zt0, z0\[0\]
+[^:]+: c08a53e0 luti4 {z0\.h-z1\.h}, zt0, z31\[0\]
+[^:]+: c08bd000 luti4 {z0\.h-z1\.h}, zt0, z0\[3\]
+[^:]+: c08a6000 luti4 {z0\.s-z1\.s}, zt0, z0\[0\]
+[^:]+: c08a601e luti4 {z30\.s-z31\.s}, zt0, z0\[0\]
+[^:]+: c08a63e0 luti4 {z0\.s-z1\.s}, zt0, z31\[0\]
+[^:]+: c08be000 luti4 {z0\.s-z1\.s}, zt0, z0\[3\]
+[^:]+: c08a9000 luti4 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^:]+: c08a9000 luti4 {z0\.h-z3\.h}, zt0, z0\[0\]
+[^:]+: c08a901c luti4 {z28\.h-z31\.h}, zt0, z0\[0\]
+[^:]+: c08a93e0 luti4 {z0\.h-z3\.h}, zt0, z31\[0\]
+[^:]+: c08b9000 luti4 {z0\.h-z3\.h}, zt0, z0\[1\]
+[^:]+: c08aa000 luti4 {z0\.s-z3\.s}, zt0, z0\[0\]
+[^:]+: c08aa01c luti4 {z28\.s-z31\.s}, zt0, z0\[0\]
+[^:]+: c08aa3e0 luti4 {z0\.s-z3\.s}, zt0, z31\[0\]
+[^:]+: c08ba000 luti4 {z0\.s-z3\.s}, zt0, z0\[1\]
diff --git a/gas/testsuite/gas/aarch64/sme2-8.s b/gas/testsuite/gas/aarch64/sme2-8.s
new file mode 100644
index 0000000..2bd5449
--- /dev/null
+++ b/gas/testsuite/gas/aarch64/sme2-8.s
@@ -0,0 +1,124 @@
+ zero { zt0 }
+ ZERO { ZT0 }
+
+ movt x0, zt0[0]
+ MOVT X0, ZT0[0]
+ movt x30, zt0[0]
+ movt xzr, zt0[0]
+ movt x0, zt0[56]
+ movt x9, zt0[24]
+ movt x15, zt0[40]
+ movt x22, zt0[48]
+
+ movt zt0[0], x0
+ MOVT ZT0[0], X0
+ movt zt0[56], x0
+ movt zt0[0], x30
+ movt zt0[0], xzr
+ movt zt0[8], x20
+ movt zt0[16], x25
+ movt zt0[32], x27
+ movt zt0[24], x29
+
+ ldr zt0, [x0]
+ LDR ZT0, [X0]
+ ldr zt0, [x30]
+ ldr zt0, [sp]
+
+ str zt0, [x0]
+ STR ZT0, [X0]
+ str zt0, [x30]
+ str zt0, [sp]
+
+ luti2 z0.b, zt0, z0[0]
+ LUTI2 Z0.B, ZT0, Z0[0]
+ luti2 z31.b, zt0, z0[0]
+ luti2 z0.b, zt0, z31[0]
+ luti2 z0.b, zt0, z0[15]
+
+ luti2 z0.h, zt0, z0[0]
+ luti2 z31.h, zt0, z0[0]
+ luti2 z0.h, zt0, z31[0]
+ luti2 z0.h, zt0, z0[15]
+
+ luti2 z0.s, zt0, z0[0]
+ luti2 z31.s, zt0, z0[0]
+ luti2 z0.s, zt0, z31[0]
+ luti2 z0.s, zt0, z0[15]
+
+ luti2 { z0.b - z1.b }, zt0, z0[0]
+ LUTI2 { Z0.B - Z1.B }, ZT0, Z0[0]
+ luti2 { z30.b - z31.b }, zt0, z0[0]
+ luti2 { z0.b - z1.b }, zt0, z31[0]
+ luti2 { z0.b - z1.b }, zt0, z0[7]
+
+ luti2 { z0.h - z1.h }, zt0, z0[0]
+ luti2 { z30.h - z31.h }, zt0, z0[0]
+ luti2 { z0.h - z1.h }, zt0, z31[0]
+ luti2 { z0.h - z1.h }, zt0, z0[7]
+
+ luti2 { z0.s - z1.s }, zt0, z0[0]
+ luti2 { z30.s - z31.s }, zt0, z0[0]
+ luti2 { z0.s - z1.s }, zt0, z31[0]
+ luti2 { z0.s - z1.s }, zt0, z0[7]
+
+ luti2 { z0.b - z3.b }, zt0, z0[0]
+ LUTI2 { Z0.B - Z3.B }, ZT0, Z0[0]
+ luti2 { z28.b - z31.b }, zt0, z0[0]
+ luti2 { z0.b - z3.b }, zt0, z31[0]
+ luti2 { z0.b - z3.b }, zt0, z0[3]
+
+ luti2 { z0.h - z3.h }, zt0, z0[0]
+ luti2 { z28.h - z31.h }, zt0, z0[0]
+ luti2 { z0.h - z3.h }, zt0, z31[0]
+ luti2 { z0.h - z3.h }, zt0, z0[3]
+
+ luti2 { z0.s - z3.s }, zt0, z0[0]
+ luti2 { z28.s - z31.s }, zt0, z0[0]
+ luti2 { z0.s - z3.s }, zt0, z31[0]
+ luti2 { z0.s - z3.s }, zt0, z0[3]
+
+ luti4 z0.b, zt0, z0[0]
+ LUTI4 Z0.b, ZT0, Z0[0]
+ luti4 z31.b, zt0, z0[0]
+ luti4 z0.b, zt0, z31[0]
+ luti4 z0.b, zt0, z0[7]
+
+ luti4 z0.h, zt0, z0[0]
+ LUTI4 Z0.H, ZT0, Z0[0]
+ luti4 z31.h, zt0, z0[0]
+ luti4 z0.h, zt0, z31[0]
+ luti4 z0.h, zt0, z0[7]
+
+ luti4 z0.s, zt0, z0[0]
+ luti4 z31.s, zt0, z0[0]
+ luti4 z0.s, zt0, z31[0]
+ luti4 z0.s, zt0, z0[7]
+
+ luti4 { z0.b - z1.b }, zt0, z0[0]
+ LUTI4 { Z0.b - Z1.b }, ZT0, Z0[0]
+ luti4 { z30.b - z31.b }, zt0, z0[0]
+ luti4 { z0.b - z1.b }, zt0, z31[0]
+ luti4 { z0.b - z1.b }, zt0, z0[3]
+
+ luti4 { z0.h - z1.h }, zt0, z0[0]
+ LUTI4 { Z0.H - Z1.H }, ZT0, Z0[0]
+ luti4 { z30.h - z31.h }, zt0, z0[0]
+ luti4 { z0.h - z1.h }, zt0, z31[0]
+ luti4 { z0.h - z1.h }, zt0, z0[3]
+
+ luti4 { z0.s - z1.s }, zt0, z0[0]
+ luti4 { z30.s - z31.s }, zt0, z0[0]
+ luti4 { z0.s - z1.s }, zt0, z31[0]
+ luti4 { z0.s - z1.s }, zt0, z0[3]
+
+ luti4 { z0.h - z3.h }, zt0, z0[0]
+ LUTI4 { Z0.H - Z3.H }, ZT0, Z0[0]
+ luti4 { z28.h - z31.h }, zt0, z0[0]
+ luti4 { z0.h - z3.h }, zt0, z31[0]
+ luti4 { z0.h - z3.h }, zt0, z0[1]
+
+ luti4 { z0.s - z3.s }, zt0, z0[0]
+ luti4 { z28.s - z31.s }, zt0, z0[0]
+ luti4 { z0.s - z3.s }, zt0, z31[0]
+ luti4 { z0.s - z3.s }, zt0, z0[1]
diff --git a/gas/testsuite/gas/aarch64/sve-invalid.l b/gas/testsuite/gas/aarch64/sve-invalid.l
index 00352f8..a02fbfe 100644
--- a/gas/testsuite/gas/aarch64/sve-invalid.l
+++ b/gas/testsuite/gas/aarch64/sve-invalid.l
@@ -932,6 +932,14 @@
.*: Error: register element index out of range 0 to 63 at operand 2 -- `dup z0\.b,z1\.b\[-1\]'
.*: Error: register element index out of range 0 to 63 at operand 2 -- `dup z0\.b,z1\.b\[64\]'
.*: Error: constant expression required at operand 2 -- `dup z0\.b,z1\.b\[x0\]'
+.*: Error: operand mismatch -- `dup z0\.b,z1\[0\]'
+.*: Info: did you mean this\?
+.*: Info: dup z0\.b, z1\.b\[0\]
+.*: Info: other valid variant\(s\):
+.*: Info: dup z0\.h, z1\.h\[0\]
+.*: Info: dup z0\.s, z1\.s\[0\]
+.*: Info: dup z0\.d, z1\.d\[0\]
+.*: Info: dup z0\.q, z1\.q\[0\]
.*: Error: register element index out of range 0 to 31 at operand 2 -- `dup z0\.h,z1\.h\[-1\]'
.*: Error: register element index out of range 0 to 31 at operand 2 -- `dup z0\.h,z1\.h\[32\]'
.*: Error: constant expression required at operand 2 -- `dup z0\.h,z1\.h\[x0\]'
diff --git a/gas/testsuite/gas/aarch64/sve-invalid.s b/gas/testsuite/gas/aarch64/sve-invalid.s
index b56a08d..c374396 100644
--- a/gas/testsuite/gas/aarch64/sve-invalid.s
+++ b/gas/testsuite/gas/aarch64/sve-invalid.s
@@ -1143,6 +1143,7 @@
dup z0.b, z1.b[63] // OK
dup z0.b, z1.b[64]
dup z0.b, z1.b[x0]
+ dup z0.b, z1[0]
dup z0.h, z1.h[-1]
dup z0.h, z1.h[0] // OK