aarch64: Add support for predicate-as-counter registers

SME2 adds a new format for the existing SVE predicate registers:
predicates as counters rather than predicates as masks.  In assembly
code, operands that interpret predicates as counters are written
pn<N> rather than p<N>.

This patch adds support for these registers and extends some
existing instructions to support them.  Since the new forms
are just a programmer convenience, there's no need to make them
more restrictive than the earlier predicate-as-mask forms.
This commit is contained in:
Richard Sandiford 2023-03-30 11:09:11 +01:00
parent 586c62819f
commit 503fae1299
22 changed files with 1985 additions and 1602 deletions

View File

@ -307,6 +307,7 @@ struct reloc_entry
BASIC_REG_TYPE(V) /* v[0-31] */ \
BASIC_REG_TYPE(Z) /* z[0-31] */ \
BASIC_REG_TYPE(P) /* p[0-15] */ \
BASIC_REG_TYPE(PN) /* pn[0-15] */ \
BASIC_REG_TYPE(ZA) /* za */ \
BASIC_REG_TYPE(ZAT) /* za[0-15] (ZA tile) */ \
BASIC_REG_TYPE(ZATH) /* za[0-15]h (ZA tile horizontal slice) */ \
@ -440,6 +441,16 @@ get_reg_expected_msg (unsigned int mask, unsigned int seen)
| reg_type_masks[REG_TYPE_ZATHV])))
return N_("expected 'za' rather than a ZA tile at operand %d");
if ((mask & reg_type_masks[REG_TYPE_PN])
&& (seen & reg_type_masks[REG_TYPE_P]))
return N_("expected a predicate-as-counter rather than predicate-as-mask"
" register at operand %d");
if ((mask & reg_type_masks[REG_TYPE_P])
&& (seen & reg_type_masks[REG_TYPE_PN]))
return N_("expected a predicate-as-mask rather than predicate-as-counter"
" register at operand %d");
/* Integer, zero and stack registers. */
if (mask == reg_type_masks[REG_TYPE_R_64])
return N_("expected a 64-bit integer register at operand %d");
@ -456,7 +467,12 @@ get_reg_expected_msg (unsigned int mask, unsigned int seen)
return N_("expected an Advanced SIMD vector register at operand %d");
if (mask == reg_type_masks[REG_TYPE_Z])
return N_("expected an SVE vector register at operand %d");
if (mask == reg_type_masks[REG_TYPE_P])
if (mask == reg_type_masks[REG_TYPE_P]
|| mask == (reg_type_masks[REG_TYPE_P] | reg_type_masks[REG_TYPE_PN]))
/* Use this error for "predicate-as-mask only" and "either kind of
predicate". We report a more specific error if P is used where
PN is expected, and vice versa, so the issue at this point is
"predicate-like" vs. "not predicate-like". */
return N_("expected an SVE predicate register at operand %d");
if (mask == reg_type_masks[REG_TYPE_VZ])
return N_("expected a vector register at operand %d");
@ -1127,6 +1143,7 @@ aarch64_valid_suffix_char_p (aarch64_reg_type type, char ch)
return ch == '.';
case REG_TYPE_P:
case REG_TYPE_PN:
return ch == '.' || ch == '/';
default:
@ -6609,6 +6626,13 @@ parse_operands (char *str, const aarch64_opcode *opcode)
reg_type = REG_TYPE_Z;
goto vector_reg;
case AARCH64_OPND_SVE_PNd:
case AARCH64_OPND_SVE_PNg4_10:
case AARCH64_OPND_SVE_PNn:
case AARCH64_OPND_SVE_PNt:
reg_type = REG_TYPE_PN;
goto vector_reg;
case AARCH64_OPND_Va:
case AARCH64_OPND_Vd:
case AARCH64_OPND_Vn:
@ -6622,7 +6646,9 @@ parse_operands (char *str, const aarch64_opcode *opcode)
goto failure;
info->reg.regno = reg->number;
if ((reg_type == REG_TYPE_P || reg_type == REG_TYPE_Z)
if ((reg_type == REG_TYPE_P
|| reg_type == REG_TYPE_PN
|| reg_type == REG_TYPE_Z)
&& vectype.type == NT_invtype)
/* Unqualified P and Z registers are allowed in certain
contexts. Rely on F_STRICT qualifier checking to catch
@ -8343,9 +8369,12 @@ static const reg_entry reg_names[] = {
/* SVE vector registers. */
REGSET (z, Z), REGSET (Z, Z),
/* SVE predicate registers. */
/* SVE predicate(-as-mask) registers. */
REGSET16 (p, P), REGSET16 (P, P),
/* SVE predicate-as-counter registers. */
REGSET16 (pn, PN), REGSET16 (PN, PN),
/* SME ZA. We model this as a register because it acts syntactically
like ZA0H, supporting qualifier suffixes and indexing. */
REGDEF (za, 0, ZA), REGDEF (ZA, 0, ZA),

View File

@ -0,0 +1,3 @@
#as: -march=armv8-a
#source: sve-sme2-1-invalid.s
#error_output: sve-sme2-1-invalid.l

View File

@ -0,0 +1,51 @@
[^ :]+: Assembler messages:
[^ :]+:[0-9]+: Error: operand mismatch -- `pfalse pn0\.h'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: pfalse pn0\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `pfalse pn0\.s'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: pfalse pn0\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `pfalse pn0\.d'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: pfalse pn0\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `pfalse pn0\.q'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: pfalse pn0\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `pfalse pn0'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: pfalse pn0\.b
[^ :]+:[0-9]+: Error: expected a predicate-as-counter rather than predicate-as-mask register at operand 2 -- `mov pn0\.b,p0\.b'
[^ :]+:[0-9]+: Error: expected a predicate-as-mask rather than predicate-as-counter register at operand 2 -- `mov p0\.b,pn0\.b'
[^ :]+:[0-9]+: Error: operand mismatch -- `mov pn0\.b,pn1\.h'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: mov pn0\.b, pn1\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `mov pn0\.h,pn1\.b'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: mov pn0\.b, pn1\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `mov pn0\.h,pn1\.h'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: mov pn0\.b, pn1\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `mov pn0\.s,pn1\.s'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: mov pn0\.b, pn1\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `mov pn0\.d,pn1\.d'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: mov pn0\.b, pn1\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `mov pn0\.q,pn1\.q'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: mov pn0\.b, pn1\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `mov pn0,pn1'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: mov pn0\.b, pn1\.b
[^ :]+:[0-9]+: Error: operand mismatch -- `ldr pn0\.b,\[x0\]'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: ldr pn0, \[x0\]
[^ :]+:[0-9]+: Error: invalid base register at operand 2 -- `ldr pn0\.b,\[xzr\]'
[^ :]+:[0-9]+: Error: immediate offset out of range -256 to 255 at operand 2 -- `ldr pn0,\[x0,#-257,mul vl\]'
[^ :]+:[0-9]+: Error: immediate offset out of range -256 to 255 at operand 2 -- `ldr pn0,\[x0,#256,mul vl\]'
[^ :]+:[0-9]+: Error: operand mismatch -- `str pn0\.b,\[x0\]'
[^ :]+:[0-9]+: Info: did you mean this\?
[^ :]+:[0-9]+: Info: str pn0, \[x0\]
[^ :]+:[0-9]+: Error: invalid base register at operand 2 -- `str pn0\.b,\[xzr\]'
[^ :]+:[0-9]+: Error: immediate offset out of range -256 to 255 at operand 2 -- `str pn0,\[x0,#-257,mul vl\]'
[^ :]+:[0-9]+: Error: immediate offset out of range -256 to 255 at operand 2 -- `str pn0,\[x0,#256,mul vl\]'

View File

@ -0,0 +1,25 @@
pfalse pn0.h
pfalse pn0.s
pfalse pn0.d
pfalse pn0.q
pfalse pn0
mov pn0.b, p0.b
mov p0.b, pn0.b
mov pn0.b, pn1.h
mov pn0.h, pn1.b
mov pn0.h, pn1.h
mov pn0.s, pn1.s
mov pn0.d, pn1.d
mov pn0.q, pn1.q
mov pn0, pn1
ldr pn0.b, [x0]
ldr pn0.b, [xzr]
ldr pn0, [x0, #-257, mul vl]
ldr pn0, [x0, #256, mul vl]
str pn0.b, [x0]
str pn0.b, [xzr]
str pn0, [x0, #-257, mul vl]
str pn0, [x0, #256, mul vl]

View File

@ -0,0 +1,3 @@
#as: -march=armv8-a
#source: sve-sme2-1.s
#error_output: sve-sme2-1-noarch.l

View File

@ -0,0 +1,25 @@
[^ :]+: Assembler messages:
[^ :]+:[0-9]+: Error: selected processor does not support `pfalse pn0\.b'
[^ :]+:[0-9]+: Error: selected processor does not support `pfalse PN0\.B'
[^ :]+:[0-9]+: Error: selected processor does not support `pfalse pn5\.b'
[^ :]+:[0-9]+: Error: selected processor does not support `pfalse pn15\.b'
[^ :]+:[0-9]+: Error: selected processor does not support `mov pn0\.b,pn0\.b'
[^ :]+:[0-9]+: Error: selected processor does not support `mov pn0\.b,pn15\.b'
[^ :]+:[0-9]+: Error: selected processor does not support `mov pn15\.b,pn0\.b'
[^ :]+:[0-9]+: Error: selected processor does not support `mov pn3\.b,pn12\.b'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn0,\[x0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn15,\[x0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn15,\[x30\]'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn0,\[sp\]'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn0,\[x0,#0,mul vl\]'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn0,\[x0,#-256,mul vl\]'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn0,\[x0,#255,mul vl\]'
[^ :]+:[0-9]+: Error: selected processor does not support `ldr pn11,\[x14,#211,mul vl\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn0,\[x0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn15,\[x0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn15,\[x30\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn0,\[sp\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn0,\[x0,#0,mul vl\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn0,\[x0,#-256,mul vl\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn0,\[x0,#255,mul vl\]'
[^ :]+:[0-9]+: Error: selected processor does not support `str pn5,\[x28,#-56,mul vl\]'

View File

@ -0,0 +1,33 @@
#as: -march=armv8-a+sve
#objdump: -dr
[^:]+: file format .*
[^:]+:
[^:]+:
[^:]+: 2518e400 pfalse p0\.b
[^:]+: 2518e400 pfalse p0\.b
[^:]+: 2518e405 pfalse p5\.b
[^:]+: 2518e40f pfalse p15\.b
[^:]+: 25804000 mov p0\.b, p0\.b
[^:]+: 258f7de0 mov p0\.b, p15\.b
[^:]+: 2580400f mov p15\.b, p0\.b
[^:]+: 258c7183 mov p3\.b, p12\.b
[^:]+: 85800000 ldr p0, \[x0\]
[^:]+: 8580000f ldr p15, \[x0\]
[^:]+: 858003cf ldr p15, \[x30\]
[^:]+: 858003e0 ldr p0, \[sp\]
[^:]+: 85800000 ldr p0, \[x0\]
[^:]+: 85a00000 ldr p0, \[x0, #-256, mul vl\]
[^:]+: 859f1c00 ldr p0, \[x0, #255, mul vl\]
[^:]+: 859a0dcb ldr p11, \[x14, #211, mul vl\]
[^:]+: e5800000 str p0, \[x0\]
[^:]+: e580000f str p15, \[x0\]
[^:]+: e58003cf str p15, \[x30\]
[^:]+: e58003e0 str p0, \[sp\]
[^:]+: e5800000 str p0, \[x0\]
[^:]+: e5a00000 str p0, \[x0, #-256, mul vl\]
[^:]+: e59f1c00 str p0, \[x0, #255, mul vl\]
[^:]+: e5b90385 str p5, \[x28, #-56, mul vl\]

View File

@ -0,0 +1,27 @@
pfalse pn0.b
PFALSE PN0.B
pfalse pn5.b
pfalse pn15.b
mov pn0.b, pn0.b
mov pn0.b, pn15.b
mov pn15.b, pn0.b
mov pn3.b, pn12.b
ldr pn0, [x0]
ldr pn15, [x0]
ldr pn15, [x30]
ldr pn0, [sp]
ldr pn0, [x0, #0, mul vl]
ldr pn0, [x0, #-256, mul vl]
ldr pn0, [x0, #255, mul vl]
ldr pn11, [x14, #211, mul vl]
str pn0, [x0]
str pn15, [x0]
str pn15, [x30]
str pn0, [sp]
str pn0, [x0, #0, mul vl]
str pn0, [x0, #-256, mul vl]
str pn0, [x0, #255, mul vl]
str pn5, [x28, #-56, mul vl]

View File

@ -0,0 +1,3 @@
#as: -march=armv8-a
#source: sve2-sme2-1-invalid.s
#error_output: sve2-sme2-1-invalid.l

View File

@ -0,0 +1,9 @@
[^ :]+: Assembler messages:
[^ :]+:[0-9]+: Error: expected a predicate-as-counter rather than predicate-as-mask register at operand 2 -- `psel pn0,p0,p0\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: expected an SVE predicate register at operand 1 -- `psel pn,pn0,p0\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: expected a predicate-as-mask rather than predicate-as-counter register at operand 3 -- `psel p0,p0,pn0\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: expected a predicate-as-mask rather than predicate-as-counter register at operand 3 -- `psel pn0,pn0,pn0\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: expected a selection register in the range w12-w15 at operand 3 -- `psel pn0,pn0,p0\.b\[w11,0\]'
[^ :]+:[0-9]+: Error: expected a selection register in the range w12-w15 at operand 3 -- `psel pn0,pn0,p0\.b\[w16,0\]'
[^ :]+:[0-9]+: Error: immediate offset out of range 0 to 15 at operand 3 -- `psel pn0,pn0,p0\.b\[w12,-1\]'
[^ :]+:[0-9]+: Error: immediate offset out of range 0 to 15 at operand 3 -- `psel pn0,pn0,p0\.b\[w12,16\]'

View File

@ -0,0 +1,8 @@
psel pn0, p0, p0.b[w12, 0]
psel pn, pn0, p0.b[w12, 0]
psel p0, p0, pn0.b[w12, 0]
psel pn0, pn0, pn0.b[w12, 0]
psel pn0, pn0, p0.b[w11, 0]
psel pn0, pn0, p0.b[w16, 0]
psel pn0, pn0, p0.b[w12, -1]
psel pn0, pn0, p0.b[w12, 16]

View File

@ -0,0 +1,3 @@
#as: -march=armv8-a+sve2
#source: sve2-sme2-1.s
#error_output: sve2-sme2-1-noarch.l

View File

@ -0,0 +1,33 @@
[^ :]+: Assembler messages:
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel PN0,PN0,P0\.B\[W12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn15,pn0,p0\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn15,p0\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p15\.b\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.b\[w15,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.b\[w12,15\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn1,pn13,p6\.b\[w14,11\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.h\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel PN0,PN0,P0\.H\[W12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn15,pn0,p0\.h\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn15,p0\.h\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p15\.h\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.h\[w15,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.h\[w12,7\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn12,pn7,p14\.h\[w13,5\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.s\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel PN0,PN0,P0\.S\[W12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn15,pn0,p0\.s\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn15,p0\.s\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p15\.s\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.s\[w15,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.s\[w12,3\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn6,pn11,p11\.s\[w13,2\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.d\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel PN0,PN0,P0\.D\[W12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn15,pn0,p0\.d\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn15,p0\.d\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p15\.d\[w12,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.d\[w15,0\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn0,pn0,p0\.d\[w12,1\]'
[^ :]+:[0-9]+: Error: selected processor does not support `psel pn7,pn9,p5\.d\[w13,1\]'

View File

@ -0,0 +1,41 @@
#as: -march=armv8-a+sme
#objdump: -dr
[^:]+: file format .*
[^:]+:
[^:]+:
[^:]+: 25244000 psel p0, p0, p0\.b\[w12, 0\]
[^:]+: 25244000 psel p0, p0, p0\.b\[w12, 0\]
[^:]+: 2524400f psel p15, p0, p0\.b\[w12, 0\]
[^:]+: 25247c00 psel p0, p15, p0\.b\[w12, 0\]
[^:]+: 252441e0 psel p0, p0, p15\.b\[w12, 0\]
[^:]+: 25274000 psel p0, p0, p0\.b\[w15, 0\]
[^:]+: 25fc4000 psel p0, p0, p0\.b\[w12, 15\]
[^:]+: 25be74c1 psel p1, p13, p6\.b\[w14, 11\]
[^:]+: 25284000 psel p0, p0, p0\.h\[w12, 0\]
[^:]+: 25284000 psel p0, p0, p0\.h\[w12, 0\]
[^:]+: 2528400f psel p15, p0, p0\.h\[w12, 0\]
[^:]+: 25287c00 psel p0, p15, p0\.h\[w12, 0\]
[^:]+: 252841e0 psel p0, p0, p15\.h\[w12, 0\]
[^:]+: 252b4000 psel p0, p0, p0\.h\[w15, 0\]
[^:]+: 25f84000 psel p0, p0, p0\.h\[w12, 7\]
[^:]+: 25b95dcc psel p12, p7, p14\.h\[w13, 5\]
[^:]+: 25304000 psel p0, p0, p0\.s\[w12, 0\]
[^:]+: 25304000 psel p0, p0, p0\.s\[w12, 0\]
[^:]+: 2530400f psel p15, p0, p0\.s\[w12, 0\]
[^:]+: 25307c00 psel p0, p15, p0\.s\[w12, 0\]
[^:]+: 253041e0 psel p0, p0, p15\.s\[w12, 0\]
[^:]+: 25334000 psel p0, p0, p0\.s\[w15, 0\]
[^:]+: 25f04000 psel p0, p0, p0\.s\[w12, 3\]
[^:]+: 25b16d66 psel p6, p11, p11\.s\[w13, 2\]
[^:]+: 25604000 psel p0, p0, p0\.d\[w12, 0\]
[^:]+: 25604000 psel p0, p0, p0\.d\[w12, 0\]
[^:]+: 2560400f psel p15, p0, p0\.d\[w12, 0\]
[^:]+: 25607c00 psel p0, p15, p0\.d\[w12, 0\]
[^:]+: 256041e0 psel p0, p0, p15\.d\[w12, 0\]
[^:]+: 25634000 psel p0, p0, p0\.d\[w15, 0\]
[^:]+: 25e04000 psel p0, p0, p0\.d\[w12, 1\]
[^:]+: 25e164a7 psel p7, p9, p5\.d\[w13, 1\]

View File

@ -0,0 +1,35 @@
psel pn0, pn0, p0.b[w12, 0]
PSEL PN0, PN0, P0.B[W12, 0]
psel pn15, pn0, p0.b[w12, 0]
psel pn0, pn15, p0.b[w12, 0]
psel pn0, pn0, p15.b[w12, 0]
psel pn0, pn0, p0.b[w15, 0]
psel pn0, pn0, p0.b[w12, 15]
psel pn1, pn13, p6.b[w14, 11]
psel pn0, pn0, p0.h[w12, 0]
PSEL PN0, PN0, P0.H[W12, 0]
psel pn15, pn0, p0.h[w12, 0]
psel pn0, pn15, p0.h[w12, 0]
psel pn0, pn0, p15.h[w12, 0]
psel pn0, pn0, p0.h[w15, 0]
psel pn0, pn0, p0.h[w12, 7]
psel pn12, pn7, p14.h[w13, 5]
psel pn0, pn0, p0.s[w12, 0]
PSEL PN0, PN0, P0.S[W12, 0]
psel pn15, pn0, p0.s[w12, 0]
psel pn0, pn15, p0.s[w12, 0]
psel pn0, pn0, p15.s[w12, 0]
psel pn0, pn0, p0.s[w15, 0]
psel pn0, pn0, p0.s[w12, 3]
psel pn6, pn11, p11.s[w13, 2]
psel pn0, pn0, p0.d[w12, 0]
PSEL PN0, PN0, P0.D[W12, 0]
psel pn15, pn0, p0.d[w12, 0]
psel pn0, pn15, p0.d[w12, 0]
psel pn0, pn0, p15.d[w12, 0]
psel pn0, pn0, p0.d[w15, 0]
psel pn0, pn0, p0.d[w12, 1]
psel pn7, pn9, p5.d[w13, 1]

View File

@ -439,13 +439,17 @@ enum aarch64_opnd
AARCH64_OPND_SVE_PATTERN_SCALED, /* Likewise, with additional MUL factor. */
AARCH64_OPND_SVE_PRFOP, /* SVE prefetch operation. */
AARCH64_OPND_SVE_Pd, /* SVE p0-p15 in Pd. */
AARCH64_OPND_SVE_PNd, /* SVE pn0-pn15 in Pd. */
AARCH64_OPND_SVE_Pg3, /* SVE p0-p7 in Pg. */
AARCH64_OPND_SVE_Pg4_5, /* SVE p0-p15 in Pg, bits [8,5]. */
AARCH64_OPND_SVE_Pg4_10, /* SVE p0-p15 in Pg, bits [13,10]. */
AARCH64_OPND_SVE_PNg4_10, /* SVE pn0-pn15 in Pg, bits [13,10]. */
AARCH64_OPND_SVE_Pg4_16, /* SVE p0-p15 in Pg, bits [19,16]. */
AARCH64_OPND_SVE_Pm, /* SVE p0-p15 in Pm. */
AARCH64_OPND_SVE_Pn, /* SVE p0-p15 in Pn. */
AARCH64_OPND_SVE_PNn, /* SVE pn0-pn15 in Pn. */
AARCH64_OPND_SVE_Pt, /* SVE p0-p15 in Pt. */
AARCH64_OPND_SVE_PNt, /* SVE pn0-pn15 in Pt. */
AARCH64_OPND_SVE_Rm, /* Integer Rm or ZR, alt. SVE position. */
AARCH64_OPND_SVE_Rn_SP, /* Integer Rn or SP, alt. SVE position. */
AARCH64_OPND_SVE_SHLIMM_PRED, /* SVE shift left amount (predicated). */
@ -783,6 +787,7 @@ enum aarch64_op
OP_UXTL2,
OP_MOV_P_P,
OP_MOV_PN_PN,
OP_MOV_Z_P_Z,
OP_MOV_Z_V,
OP_MOV_Z_Z,

View File

@ -479,124 +479,125 @@ aarch64_find_real_opcode (const aarch64_opcode *opcode)
case 1236: /* wfit */
value = 1236; /* --> wfit. */
break;
case 2049: /* bic */
case 1299: /* and */
value = 1299; /* --> and. */
case 2053: /* bic */
case 1300: /* and */
value = 1300; /* --> and. */
break;
case 1282: /* mov */
case 1301: /* and */
value = 1301; /* --> and. */
case 1283: /* mov */
case 1302: /* and */
value = 1302; /* --> and. */
break;
case 1286: /* movs */
case 1302: /* ands */
value = 1302; /* --> ands. */
case 1287: /* movs */
case 1303: /* ands */
value = 1303; /* --> ands. */
break;
case 2050: /* cmple */
case 1337: /* cmpge */
value = 1337; /* --> cmpge. */
case 2054: /* cmple */
case 1338: /* cmpge */
value = 1338; /* --> cmpge. */
break;
case 2053: /* cmplt */
case 1340: /* cmpgt */
value = 1340; /* --> cmpgt. */
case 2057: /* cmplt */
case 1341: /* cmpgt */
value = 1341; /* --> cmpgt. */
break;
case 2051: /* cmplo */
case 1342: /* cmphi */
value = 1342; /* --> cmphi. */
case 2055: /* cmplo */
case 1343: /* cmphi */
value = 1343; /* --> cmphi. */
break;
case 2052: /* cmpls */
case 1345: /* cmphs */
value = 1345; /* --> cmphs. */
case 2056: /* cmpls */
case 1346: /* cmphs */
value = 1346; /* --> cmphs. */
break;
case 1279: /* mov */
case 1367: /* cpy */
value = 1367; /* --> cpy. */
break;
case 1281: /* mov */
case 1280: /* mov */
case 1368: /* cpy */
value = 1368; /* --> cpy. */
break;
case 2060: /* fmov */
case 1284: /* mov */
case 1282: /* mov */
case 1369: /* cpy */
value = 1369; /* --> cpy. */
break;
case 1274: /* mov */
case 1381: /* dup */
value = 1381; /* --> dup. */
case 2064: /* fmov */
case 1285: /* mov */
case 1370: /* cpy */
value = 1370; /* --> cpy. */
break;
case 1276: /* mov */
case 1273: /* mov */
case 1274: /* mov */
case 1382: /* dup */
value = 1382; /* --> dup. */
break;
case 2059: /* fmov */
case 1278: /* mov */
case 1277: /* mov */
case 1273: /* mov */
case 1383: /* dup */
value = 1383; /* --> dup. */
break;
case 1277: /* mov */
case 1384: /* dupm */
value = 1384; /* --> dupm. */
case 2063: /* fmov */
case 1279: /* mov */
case 1384: /* dup */
value = 1384; /* --> dup. */
break;
case 2054: /* eon */
case 1386: /* eor */
value = 1386; /* --> eor. */
case 1278: /* mov */
case 1385: /* dupm */
value = 1385; /* --> dupm. */
break;
case 1287: /* not */
case 1388: /* eor */
value = 1388; /* --> eor. */
case 2058: /* eon */
case 1387: /* eor */
value = 1387; /* --> eor. */
break;
case 1288: /* nots */
case 1389: /* eors */
value = 1389; /* --> eors. */
case 1288: /* not */
case 1389: /* eor */
value = 1389; /* --> eor. */
break;
case 2055: /* facle */
case 1394: /* facge */
value = 1394; /* --> facge. */
case 1289: /* nots */
case 1390: /* eors */
value = 1390; /* --> eors. */
break;
case 2056: /* faclt */
case 1395: /* facgt */
value = 1395; /* --> facgt. */
case 2059: /* facle */
case 1395: /* facge */
value = 1395; /* --> facge. */
break;
case 2057: /* fcmle */
case 1408: /* fcmge */
value = 1408; /* --> fcmge. */
case 2060: /* faclt */
case 1396: /* facgt */
value = 1396; /* --> facgt. */
break;
case 2058: /* fcmlt */
case 1410: /* fcmgt */
value = 1410; /* --> fcmgt. */
case 2061: /* fcmle */
case 1409: /* fcmge */
value = 1409; /* --> fcmge. */
break;
case 2062: /* fcmlt */
case 1411: /* fcmgt */
value = 1411; /* --> fcmgt. */
break;
case 1271: /* fmov */
case 1416: /* fcpy */
value = 1416; /* --> fcpy. */
case 1417: /* fcpy */
value = 1417; /* --> fcpy. */
break;
case 1270: /* fmov */
case 1439: /* fdup */
value = 1439; /* --> fdup. */
case 1440: /* fdup */
value = 1440; /* --> fdup. */
break;
case 1272: /* mov */
case 1770: /* orr */
value = 1770; /* --> orr. */
case 1772: /* orr */
value = 1772; /* --> orr. */
break;
case 2061: /* orn */
case 1771: /* orr */
value = 1771; /* --> orr. */
break;
case 1275: /* mov */
case 2065: /* orn */
case 1773: /* orr */
value = 1773; /* --> orr. */
break;
case 1285: /* movs */
case 1774: /* orrs */
value = 1774; /* --> orrs. */
case 1276: /* mov */
case 1275: /* mov */
case 1775: /* orr */
value = 1775; /* --> orr. */
break;
case 1280: /* mov */
case 1836: /* sel */
value = 1836; /* --> sel. */
case 1286: /* movs */
case 1776: /* orrs */
value = 1776; /* --> orrs. */
break;
case 1283: /* mov */
case 1837: /* sel */
value = 1837; /* --> sel. */
case 1281: /* mov */
case 1839: /* sel */
value = 1839; /* --> sel. */
break;
case 1284: /* mov */
case 1840: /* sel */
value = 1840; /* --> sel. */
break;
default: return NULL;
}
@ -651,20 +652,24 @@ aarch64_insert_operand (const aarch64_operand *self,
case 174:
case 175:
case 176:
case 191:
case 192:
case 193:
case 194:
case 177:
case 178:
case 179:
case 180:
case 195:
case 196:
case 197:
case 198:
case 199:
case 205:
case 208:
case 210:
case 211:
case 200:
case 201:
case 202:
case 203:
case 209:
case 212:
case 214:
case 215:
case 218:
return aarch64_ins_regno (self, info, code, inst, errors);
case 15:
return aarch64_ins_reg_extended (self, info, code, inst, errors);
@ -676,7 +681,7 @@ aarch64_insert_operand (const aarch64_operand *self,
case 33:
case 34:
case 35:
case 222:
case 226:
return aarch64_ins_reglane (self, info, code, inst, errors);
case 36:
return aarch64_ins_reglist (self, info, code, inst, errors);
@ -713,18 +718,18 @@ aarch64_insert_operand (const aarch64_operand *self,
case 84:
case 164:
case 166:
case 183:
case 184:
case 185:
case 186:
case 187:
case 188:
case 189:
case 190:
case 215:
case 221:
case 226:
case 227:
case 191:
case 192:
case 193:
case 194:
case 219:
case 225:
case 230:
case 231:
return aarch64_ins_imm (self, info, code, inst, errors);
case 44:
case 45:
@ -865,40 +870,40 @@ aarch64_insert_operand (const aarch64_operand *self,
return aarch64_ins_sve_limm_mov (self, info, code, inst, errors);
case 165:
return aarch64_ins_sve_scale (self, info, code, inst, errors);
case 177:
case 178:
case 179:
return aarch64_ins_sve_shlimm (self, info, code, inst, errors);
case 180:
case 181:
case 182:
case 183:
return aarch64_ins_sve_shlimm (self, info, code, inst, errors);
case 184:
case 185:
case 186:
return aarch64_ins_sve_shrimm (self, info, code, inst, errors);
case 200:
case 201:
case 202:
case 203:
case 204:
return aarch64_ins_sve_quad_index (self, info, code, inst, errors);
case 205:
case 206:
return aarch64_ins_sve_index (self, info, code, inst, errors);
case 207:
case 209:
return aarch64_ins_sve_reglist (self, info, code, inst, errors);
case 212:
case 208:
return aarch64_ins_sve_quad_index (self, info, code, inst, errors);
case 210:
return aarch64_ins_sve_index (self, info, code, inst, errors);
case 211:
case 213:
return aarch64_ins_sve_reglist (self, info, code, inst, errors);
case 216:
return aarch64_ins_sme_za_hv_tiles (self, info, code, inst, errors);
case 217:
return aarch64_ins_sme_za_array (self, info, code, inst, errors);
case 218:
return aarch64_ins_sme_addr_ri_u4xvl (self, info, code, inst, errors);
case 219:
return aarch64_ins_sme_sm_za (self, info, code, inst, errors);
case 220:
return aarch64_ins_sme_pred_reg_with_index (self, info, code, inst, errors);
return aarch64_ins_sme_za_hv_tiles (self, info, code, inst, errors);
case 221:
return aarch64_ins_sme_za_array (self, info, code, inst, errors);
case 222:
return aarch64_ins_sme_addr_ri_u4xvl (self, info, code, inst, errors);
case 223:
return aarch64_ins_sme_sm_za (self, info, code, inst, errors);
case 224:
case 225:
return aarch64_ins_sme_pred_reg_with_index (self, info, code, inst, errors);
case 227:
case 228:
case 229:
return aarch64_ins_x0_to_x30 (self, info, code, inst, errors);
default: assert (0); abort ();
}

View File

@ -1643,6 +1643,7 @@ do_misc_encoding (aarch64_inst *inst)
encode_asisd_fcvtxn (inst);
break;
case OP_MOV_P_P:
case OP_MOV_PN_PN:
case OP_MOVS_P_P:
/* Copy Pn to Pm and Pg. */
value = extract_field (FLD_SVE_Pn, inst->value, 0);

File diff suppressed because it is too large Load Diff

View File

@ -192,13 +192,17 @@ const struct aarch64_operand aarch64_operands[] =
{AARCH64_OPND_CLASS_IMMEDIATE, "SVE_PATTERN_SCALED", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_pattern}, "an enumeration value such as POW2"},
{AARCH64_OPND_CLASS_IMMEDIATE, "SVE_PRFOP", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_prfop}, "an enumeration value such as PLDL1KEEP"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pd", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pd}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_PNd", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pd}, "an SVE predicate-as-counter register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pg3", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pg3}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pg4_5", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pg4_5}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pg4_10", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pg4_10}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_PNg4_10", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pg4_10}, "an SVE predicate-as-counter register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pg4_16", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pg4_16}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pm", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pm}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pn", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pn}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_PNn", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pn}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_Pt", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pt}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_PRED_REG, "SVE_PNt", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Pt}, "an SVE predicate register"},
{AARCH64_OPND_CLASS_INT_REG, "SVE_Rm", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Rm}, "an integer register or zero"},
{AARCH64_OPND_CLASS_INT_REG, "SVE_Rn_SP", OPD_F_MAYBE_SP | OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_Rn}, "an integer register or SP"},
{AARCH64_OPND_CLASS_IMMEDIATE, "SVE_SHLIMM_PRED", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SVE_tszh,FLD_SVE_imm5}, "a shift-left immediate operand"},
@ -330,16 +334,17 @@ static const unsigned op_enum_table [] =
413,
415,
1275,
1280,
1276,
1281,
1273,
1272,
1276,
1283,
1285,
1277,
1284,
1286,
1282,
1288,
1287,
1283,
1289,
1288,
131,
};

View File

@ -3679,6 +3679,19 @@ aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
aarch64_get_qualifier_name (opnd->qualifier)));
break;
case AARCH64_OPND_SVE_PNd:
case AARCH64_OPND_SVE_PNg4_10:
case AARCH64_OPND_SVE_PNn:
case AARCH64_OPND_SVE_PNt:
if (opnd->qualifier == AARCH64_OPND_QLF_NIL)
snprintf (buf, size, "%s",
style_reg (styler, "pn%d", opnd->reg.regno));
else
snprintf (buf, size, "%s",
style_reg (styler, "pn%d.%s", opnd->reg.regno,
aarch64_get_qualifier_name (opnd->qualifier)));
break;
case AARCH64_OPND_SVE_Za_5:
case AARCH64_OPND_SVE_Za_16:
case AARCH64_OPND_SVE_Zd:

View File

@ -4110,6 +4110,7 @@ const struct aarch64_opcode aarch64_opcode_table[] =
_SVE_INSN ("mov", 0x05202000, 0xff20fc00, sve_index, OP_MOV_Z_V, OP2 (SVE_Zd, SVE_VZn), OP_SVE_VV_BHSDQ, F_ALIAS | F_MISC, 0),
_SVE_INSN ("mov", 0x05203800, 0xff3ffc00, sve_size_bhsd, 0, OP2 (SVE_Zd, Rn_SP), OP_SVE_VR_BHSD, F_ALIAS, 0),
_SVE_INSN ("mov", 0x25804000, 0xfff0c210, sve_misc, OP_MOV_P_P, OP2 (SVE_Pd, SVE_Pn), OP_SVE_BB, F_ALIAS | F_MISC, 0),
_SVE_INSN ("mov", 0x25804000, 0xfff0c210, sve_misc, OP_MOV_PN_PN, OP2 (SVE_PNd, SVE_PNn), OP_SVE_BB, F_ALIAS | F_MISC, 0),
_SVE_INSN ("mov", 0x05202000, 0xff20fc00, sve_index, OP_MOV_Z_Zi, OP2 (SVE_Zd, SVE_Zn_INDEX), OP_SVE_VV_BHSDQ, F_ALIAS | F_MISC, 0),
_SVE_INSN ("mov", 0x05c00000, 0xfffc0000, sve_limm, 0, OP2 (SVE_Zd, SVE_LIMM_MOV), OP_SVE_VU_BHSD, F_ALIAS, 0),
_SVE_INSN ("mov", 0x2538c000, 0xff3fc000, sve_size_bhsd, 0, OP2 (SVE_Zd, SVE_ASIMM), OP_SVE_VU_BHSD, F_ALIAS, 0),
@ -4583,6 +4584,7 @@ const struct aarch64_opcode aarch64_opcode_table[] =
_SVE_INSN ("ldnt1w", 0xa500c000, 0xffe0e000, sve_misc, 0, OP3 (SVE_ZtxN, SVE_Pg3, SVE_ADDR_RX_LSL2), OP_SVE_SZU, F_OD(1), 0),
_SVE_INSN ("ldnt1w", 0xa500e000, 0xfff0e000, sve_misc, 0, OP3 (SVE_ZtxN, SVE_Pg3, SVE_ADDR_RI_S4xVL), OP_SVE_SZU, F_OD(1), 0),
_SVE_INSN ("ldr", 0x85800000, 0xffc0e010, sve_misc, 0, OP2 (SVE_Pt, SVE_ADDR_RI_S9xVL), {}, 0, 0),
_SVE_INSN ("ldr", 0x85800000, 0xffc0e010, sve_misc, 0, OP2 (SVE_PNt, SVE_ADDR_RI_S9xVL), {}, 0, 0),
_SVE_INSN ("ldr", 0x85804000, 0xffc0e000, sve_misc, 0, OP2 (SVE_Zt, SVE_ADDR_RI_S9xVL), {}, 0, 0),
_SVE_INSN ("lsl", 0x04208c00, 0xff20fc00, sve_size_bhs, 0, OP3 (SVE_Zd, SVE_Zn, SVE_Zm_16), OP_SVE_VVD_BHS, 0, 0),
_SVE_INSN ("lsl", 0x04209c00, 0xff20fc00, sve_shift_unpred, 0, OP3 (SVE_Zd, SVE_Zn, SVE_SHLIMM_UNPRED), OP_SVE_VVU_BHSD, 0, 0),
@ -4619,6 +4621,7 @@ const struct aarch64_opcode aarch64_opcode_table[] =
_SVE_INSN ("orrs", 0x25c04000, 0xfff0c210, sve_misc, 0, OP4 (SVE_Pd, SVE_Pg4_10, SVE_Pn, SVE_Pm), OP_SVE_BZBB, F_HAS_ALIAS, 0),
_SVE_INSN ("orv", 0x04182000, 0xff3fe000, sve_size_bhsd, 0, OP3 (SVE_Vd, SVE_Pg3, SVE_Zn), OP_SVE_VUV_BHSD, 0, 0),
_SVE_INSN ("pfalse", 0x2518e400, 0xfffffff0, sve_misc, 0, OP1 (SVE_Pd), OP_SVE_B, 0, 0),
_SVE_INSN ("pfalse", 0x2518e400, 0xfffffff0, sve_misc, 0, OP1 (SVE_PNd), OP_SVE_B, 0, 0),
_SVE_INSN ("pfirst", 0x2558c000, 0xfffffe10, sve_misc, 0, OP3 (SVE_Pd, SVE_Pg4_5, SVE_Pd), OP_SVE_BUB, 0, 2),
_SVE_INSN ("pnext", 0x2519c400, 0xff3ffe10, sve_size_bhsd, 0, OP3 (SVE_Pd, SVE_Pg4_5, SVE_Pd), OP_SVE_VUV_BHSD, 0, 2),
_SVE_INSN ("prfb", 0x8400c000, 0xffe0e010, sve_misc, 0, OP3 (SVE_PRFOP, SVE_Pg3, SVE_ADDR_RX), {}, 0, 0),
@ -4800,6 +4803,7 @@ const struct aarch64_opcode aarch64_opcode_table[] =
_SVE_INSN ("stnt1w", 0xe5006000, 0xffe0e000, sve_misc, 0, OP3 (SVE_ZtxN, SVE_Pg3, SVE_ADDR_RX_LSL2), OP_SVE_SUU, F_OD(1), 0),
_SVE_INSN ("stnt1w", 0xe510e000, 0xfff0e000, sve_misc, 0, OP3 (SVE_ZtxN, SVE_Pg3, SVE_ADDR_RI_S4xVL), OP_SVE_SUU, F_OD(1), 0),
_SVE_INSN ("str", 0xe5800000, 0xffc0e010, sve_misc, 0, OP2 (SVE_Pt, SVE_ADDR_RI_S9xVL), {}, 0, 0),
_SVE_INSN ("str", 0xe5800000, 0xffc0e010, sve_misc, 0, OP2 (SVE_PNt, SVE_ADDR_RI_S9xVL), {}, 0, 0),
_SVE_INSN ("str", 0xe5804000, 0xffc0e000, sve_misc, 0, OP2 (SVE_Zt, SVE_ADDR_RI_S9xVL), {}, 0, 0),
_SVE_INSN ("sub", 0x04200400, 0xff20fc00, sve_size_bhsd, 0, OP3 (SVE_Zd, SVE_Zn, SVE_Zm_16), OP_SVE_VVV_BHSD, 0, 0),
_SVE_INSNC ("sub", 0x2521c000, 0xff3fc000, sve_size_bhsd, 0, OP3 (SVE_Zd, SVE_Zd, SVE_AIMM), OP_SVE_VVU_BHSD, 0, C_SCAN_MOVPRFX, 1),
@ -5272,6 +5276,7 @@ const struct aarch64_opcode aarch64_opcode_table[] =
SME_INSNC ("sclamp", 0x4400c000, 0xff20fc00, sve_size_bhsd, 0, OP3 (SVE_Zd, SVE_Zn, SVE_Zm_16), OP_SVE_VVV_BHSD, 0, C_SCAN_MOVPRFX, 0),
SME_INSNC ("uclamp", 0x4400c400, 0xff20fc00, sve_size_bhsd, 0, OP3 (SVE_Zd, SVE_Zn, SVE_Zm_16), OP_SVE_VVV_BHSD, 0, C_SCAN_MOVPRFX, 0),
SME_INSN ("psel", 0x25204000, 0xff20c210, sme_psel, 0, OP3 (SVE_Pd, SVE_Pg4_10, SME_PnT_Wm_imm), OP_SVE_NN_BHSD, 0, 0),
SME_INSN ("psel", 0x25204000, 0xff20c210, sme_psel, 0, OP3 (SVE_PNd, SVE_PNg4_10, SME_PnT_Wm_imm), OP_SVE_NN_BHSD, 0, 0),
/* SIMD Dot Product (optional in v8.2-A). */
DOT_INSN ("udot", 0x2e009400, 0xbf20fc00, dotproduct, OP3 (Vd, Vn, Vm), QL_V3DOT, F_SIZEQ),
@ -5817,20 +5822,28 @@ const struct aarch64_opcode aarch64_opcode_table[] =
"an enumeration value such as PLDL1KEEP") \
Y(PRED_REG, regno, "SVE_Pd", 0, F(FLD_SVE_Pd), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_PNd", 0, F(FLD_SVE_Pd), \
"an SVE predicate-as-counter register") \
Y(PRED_REG, regno, "SVE_Pg3", 0, F(FLD_SVE_Pg3), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_Pg4_5", 0, F(FLD_SVE_Pg4_5), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_Pg4_10", 0, F(FLD_SVE_Pg4_10), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_PNg4_10", 0, F(FLD_SVE_Pg4_10), \
"an SVE predicate-as-counter register") \
Y(PRED_REG, regno, "SVE_Pg4_16", 0, F(FLD_SVE_Pg4_16), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_Pm", 0, F(FLD_SVE_Pm), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_Pn", 0, F(FLD_SVE_Pn), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_PNn", 0, F(FLD_SVE_Pn), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_Pt", 0, F(FLD_SVE_Pt), \
"an SVE predicate register") \
Y(PRED_REG, regno, "SVE_PNt", 0, F(FLD_SVE_Pt), \
"an SVE predicate register") \
Y(INT_REG, regno, "SVE_Rm", 0, F(FLD_SVE_Rm), \
"an integer register or zero") \
Y(INT_REG, regno, "SVE_Rn_SP", OPD_F_MAYBE_SP, F(FLD_SVE_Rn), \