aarch64: Add support for +mops

This patch adds support for FEAT_MOPS, an Armv8.8-A extension
that provides memcpy and memset acceleration instructions.

I took the perhaps controversial decision to generate the individual
instruction forms using macros rather than list them out individually.
This becomes useful with a follow-on patch to check that code follows
the correct P/M/E sequence.
[https://developer.arm.com/documentation/ddi0596/2021-09/Base-Instructions?lang=en]

include/
	* opcode/aarch64.h (AARCH64_FEATURE_MOPS): New macro.
	(AARCH64_ARCH_V8_8): Make armv8.8-a imply AARCH64_FEATURE_MOPS.
	(AARCH64_OPND_MOPS_ADDR_Rd): New aarch64_opnd.
	(AARCH64_OPND_MOPS_ADDR_Rs): Likewise.
	(AARCH64_OPND_MOPS_WB_Rn): Likewise.

opcodes/
	* aarch64-asm.h (ins_x0_to_x30): New inserter.
	* aarch64-asm.c (aarch64_ins_x0_to_x30): New function.
	* aarch64-dis.h (ext_x0_to_x30): New extractor.
	* aarch64-dis.c (aarch64_ext_x0_to_x30): New function.
	* aarch64-tbl.h (aarch64_feature_mops): New feature set.
	(aarch64_feature_mops_memtag): Likewise.
	(MOPS, MOPS_MEMTAG, MOPS_INSN, MOPS_MEMTAG_INSN)
	(MOPS_CPY_OP1_OP2_PME_INSN, MOPS_CPY_OP1_OP2_INSN, MOPS_CPY_OP1_INSN)
	(MOPS_CPY_INSN, MOPS_SET_OP1_OP2_PME_INSN, MOPS_SET_OP1_OP2_INSN)
	(MOPS_SET_INSN): New macros.
	(aarch64_opcode_table): Add MOPS instructions.
	(aarch64_opcode_table): Add entries for AARCH64_OPND_MOPS_ADDR_Rd,
	AARCH64_OPND_MOPS_ADDR_Rs and AARCH64_OPND_MOPS_WB_Rn.
	* aarch64-opc.c (aarch64_print_operand): Handle
	AARCH64_OPND_MOPS_ADDR_Rd, AARCH64_OPND_MOPS_ADDR_Rs and
	AARCH64_OPND_MOPS_WB_Rn.
	(verify_three_different_regs): New function.
	* aarch64-asm-2.c: Regenerate.
	* aarch64-dis-2.c: Likewise.
	* aarch64-opc-2.c: Likewise.

gas/
	* doc/c-aarch64.texi: Document +mops.
	* config/tc-aarch64.c (parse_x0_to_x30): New function.
	(parse_operands): Handle AARCH64_OPND_MOPS_ADDR_Rd,
	AARCH64_OPND_MOPS_ADDR_Rs and AARCH64_OPND_MOPS_WB_Rn.
	(aarch64_features): Add "mops".
	* testsuite/gas/aarch64/mops.s, testsuite/gas/aarch64/mops.d: New test.
	* testsuite/gas/aarch64/mops_invalid.s,
	* testsuite/gas/aarch64/mops_invalid.d,
	* testsuite/gas/aarch64/mops_invalid.l: Likewise.
This commit is contained in:
Richard Sandiford 2021-12-02 15:00:57 +00:00
parent a5e9beead8
commit 6327658ee7
17 changed files with 3133 additions and 33 deletions

View File

@ -3918,6 +3918,22 @@ parse_sve_address (char **str, aarch64_opnd_info *operand,
SHIFTED_MUL_VL);
}
/* Parse a register X0-X30. The register must be 64-bit and register 31
is unallocated. */
static bool
parse_x0_to_x30 (char **str, aarch64_opnd_info *operand)
{
const reg_entry *reg = parse_reg (str);
if (!reg || !aarch64_check_reg_type (reg, REG_TYPE_R_64))
{
set_syntax_error (_(get_reg_expected_msg (REG_TYPE_R_64)));
return false;
}
operand->reg.regno = reg->number;
operand->qualifier = AARCH64_OPND_QLF_X;
return true;
}
/* Parse an operand for a MOVZ, MOVN or MOVK instruction.
Return TRUE on success; otherwise return FALSE. */
static bool
@ -7491,6 +7507,21 @@ parse_operands (char *str, const aarch64_opcode *opcode)
break;
}
case AARCH64_OPND_MOPS_ADDR_Rd:
case AARCH64_OPND_MOPS_ADDR_Rs:
po_char_or_fail ('[');
if (!parse_x0_to_x30 (&str, info))
goto failure;
po_char_or_fail (']');
po_char_or_fail ('!');
break;
case AARCH64_OPND_MOPS_WB_Rn:
if (!parse_x0_to_x30 (&str, info))
goto failure;
po_char_or_fail ('!');
break;
default:
as_fatal (_("unhandled operand code %d"), operands[i]);
}
@ -9929,6 +9960,8 @@ static const struct aarch64_option_cpu_value_table aarch64_features[] = {
AARCH64_ARCH_NONE},
{"pauth", AARCH64_FEATURE (AARCH64_FEATURE_PAC, 0),
AARCH64_ARCH_NONE},
{"mops", AARCH64_FEATURE (AARCH64_FEATURE_MOPS, 0),
AARCH64_ARCH_NONE},
{NULL, AARCH64_ARCH_NONE, AARCH64_ARCH_NONE},
};

View File

@ -193,6 +193,8 @@ automatically cause those extensions to be disabled.
@tab Enable Large System extensions.
@item @code{memtag} @tab ARMv8.5-A @tab No
@tab Enable ARMv8.5-A Memory Tagging Extensions.
@item @code{mops} @tab @tab Armv8.8-A or later
@tab Enable Armv8.8-A memcpy and memset acceleration instructions
@item @code{pan} @tab ARMv8-A @tab ARMv8.1-A or later
@tab Enable Privileged Access Never support.
@item @code{pauth} @tab ARMv8-A @tab No

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,66 @@
.arch armv8.8-a+memtag
dest .req x8
src .req x11
len .req x19
data .req x23
zero .req xzr
.macro pme_seq, op, suffix, r1, r2, r3
\op\()p\()\suffix \r1, \r2, \r3
\op\()m\()\suffix \r1, \r2, \r3
\op\()e\()\suffix \r1, \r2, \r3
.endm
.macro cpy_op1_op2, op, suffix
pme_seq \op, \suffix, [x0]!, [x1]!, x30!
pme_seq \op, \suffix, [x29]!, [x30]!, x0!
pme_seq \op, \suffix, [x30]!, [x0]!, x1!
pme_seq \op, \suffix, [dest]!, [src]!, len!
.endm
.macro cpy_op1, op, suffix
cpy_op1_op2 \op, \suffix
cpy_op1_op2 \op, \suffix\()rn
cpy_op1_op2 \op, \suffix\()wn
cpy_op1_op2 \op, \suffix\()n
.endm
.macro cpy_all, op
cpy_op1 \op
cpy_op1 \op, rt
cpy_op1 \op, wt
cpy_op1 \op, t
.endm
.macro set_op1_op2, op, suffix
pme_seq \op, \suffix, [x0]!, x1!, x30
pme_seq \op, \suffix, [x29]!, x30!, x0
pme_seq \op, \suffix, [x30]!, x0!, xzr
pme_seq \op, \suffix, [dest]!, len!, data
pme_seq \op, \suffix, [dest]!, len!, zero
.endm
.macro set_all, op
set_op1_op2 \op
set_op1_op2 \op, t
set_op1_op2 \op, n
set_op1_op2 \op, tn
.endm
cpy_all cpyf
cpy_all cpy
set_all set
set_all setg
.arch armv8.7-a+mops
cpy_all cpyf
cpy_all cpy
set_all set
.arch armv8.7-a+mops+memtag
set_all setg

View File

@ -0,0 +1 @@
#error_output: mops_invalid.l

View File

@ -0,0 +1,226 @@
[^:]+: Assembler messages:
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `cpyfp x0,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `cpyfp x0!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `cpyfp \[x0\],\[x1\]!,x2!'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `cpyfp \[x0,#0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `cpyfp \[x0,xzr\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: operand 2 must be a register source address with writeback -- `cpyfp \[x1\]!,x0,x2!'
[^:]+:[0-9]+: Error: operand 2 must be a register source address with writeback -- `cpyfp \[x1\]!,x0!,x2!'
[^:]+:[0-9]+: Error: operand 2 must be a register source address with writeback -- `cpyfp \[x1\]!,\[x0\],x2!'
[^:]+:[0-9]+: Error: operand 2 must be a register source address with writeback -- `cpyfp \[x1\]!,\[x0,#0\]!,x2!'
[^:]+:[0-9]+: Error: operand 2 must be a register source address with writeback -- `cpyfp \[x1\]!,\[x0,xzr\]!,x2!'
[^:]+:[0-9]+: Error: operand 3 must be an integer register with writeback -- `cpyfp \[x0\]!,\[x1\]!,x2'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,!x2'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,\[x2\]'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,\[x2\]!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[x31\]!,\[x0\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[sp\]!,\[x0\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[zr\]!,\[x0\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[w30\]!,\[x0\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[w0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[wsp\]!,\[x0\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[wzr\]!,\[x0\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[b0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[h0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[s0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[d0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[q0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[v0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[v0.2d\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[z0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[z0.d\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[p0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[p0.d\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `cpyfp \[foo\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x0\]!,\[x31\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x0\]!,\[sp\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x0\]!,\[zr\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x0\]!,\[w30\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x1\]!,\[w0\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x0\]!,\[wsp\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x0\]!,\[wzr\]!,x1!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `cpyfp \[x1\]!,\[foo\]!,x2!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,x31!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,sp!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,zr!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,w30!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x1\]!,\[x2\]!,w0!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,wsp!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x0\]!,\[x1\]!,wzr!'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 3 -- `cpyfp \[x1\]!,\[x2\]!,foo!'
[^:]+:[0-9]+: Error: the three register operands must be distinct from one another -- `cpyfp \[x0\]!,\[x0\]!,x1!'
[^:]+:[0-9]+: Error: the three register operands must be distinct from one another -- `cpyfp \[x10\]!,\[x1\]!,x10!'
[^:]+:[0-9]+: Error: the three register operands must be distinct from one another -- `cpyfp \[x1\]!,\[x30\]!,x30!'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `setp x0,x1!,x2'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `setp x0!,x1!,x2'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `setp \[x0\],x1!,x2'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `setp \[x0,#0\]!,x1!,x2'
[^:]+:[0-9]+: Error: operand 1 must be a register destination address with writeback -- `setp \[x0,xzr\]!,x1!,x2'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[x31\]!,x0!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[sp\]!,x0!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[zr\]!,x0!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[w30\]!,x0!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[w0\]!,x1!,x2'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[wsp\]!,x0!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[wzr\]!,x0!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 1 -- `setp \[foo\]!,x1!,x2'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x0\]!,x31!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x0\]!,sp!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x0\]!,zr!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x0\]!,w30!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x1\]!,w0!,x2'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x0\]!,wsp!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x0\]!,wzr!,x1'
[^:]+:[0-9]+: Error: integer 64-bit register expected at operand 2 -- `setp \[x1\]!,foo!,x2'
[^:]+:[0-9]+: Error: operand 3 must be an integer register -- `setp \[x30\]!,x0!,sp'
[^:]+:[0-9]+: Error: operand 3 must be an integer register -- `setp \[x30\]!,x0!,wsp'
[^:]+:[0-9]+: Error: operand mismatch -- `setp \[x30\]!,x0!,wzr'
[^:]+:[0-9]+: Info: did you mean this\?
[^:]+:[0-9]+: Info: setp \[x30\]!, x0!, xzr
[^:]+:[0-9]+: Error: the three register operands must be distinct from one another -- `setp \[x0\]!,x0!,x1'
[^:]+:[0-9]+: Error: the three register operands must be distinct from one another -- `setp \[x10\]!,x1!,x10'
[^:]+:[0-9]+: Error: the three register operands must be distinct from one another -- `setp \[x1\]!,x30!,x30'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfp \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfm \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfe \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfprn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfern \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfpwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfewn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfpn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfen \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfprt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmrt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfert \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfprtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmrtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfertrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfprtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmrtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfertwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfprtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmrtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfertn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfpwt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmwt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfewt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfpwtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmwtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfewtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfpwtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmwtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfewtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfpwtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmwtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfewtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfpt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfet \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfptrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfetrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfptwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfetwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfptn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfmtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyfetn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyp \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpym \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpye \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyprn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyern \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpypwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyewn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpypn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyen \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyprt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymrt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyert \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyprtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymrtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyertrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyprtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymrtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyertwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyprtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymrtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyertn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpypwt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymwt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyewt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpypwtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymwtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyewtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpypwtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymwtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyewtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpypwtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymwtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyewtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpypt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymt \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyet \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyptrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymtrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyetrn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyptwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymtwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyetwn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyptn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpymtn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `cpyetn \[x0\]!,\[x1\]!,x2!'
[^:]+:[0-9]+: Error: selected processor does not support `setp \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setm \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `sete \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setpt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setmt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setet \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setpn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setmn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `seten \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setptn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setmtn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setetn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgp \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgm \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setge \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgpt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setget \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgpn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgen \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgptn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmtn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgetn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgp \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgm \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setge \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgpt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setget \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgpn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgen \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgptn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmtn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgetn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgp \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgm \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setge \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgpt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmt \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setget \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgpn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgen \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgptn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgmtn \[x0\]!,x1!,x2'
[^:]+:[0-9]+: Error: selected processor does not support `setgetn \[x0\]!,x1!,x2'

View File

@ -0,0 +1,248 @@
.arch armv8.8-a
cpyfp x0, [x1]!, x2!
cpyfp x0!, [x1]!, x2!
cpyfp [x0], [x1]!, x2!
cpyfp [x0, #0]!, [x1]!, x2!
cpyfp [x0, xzr]!, [x1]!, x2!
cpyfp [x1]!, x0, x2!
cpyfp [x1]!, x0!, x2!
cpyfp [x1]!, [x0], x2!
cpyfp [x1]!, [x0, #0]!, x2!
cpyfp [x1]!, [x0, xzr]!, x2!
cpyfp [x0]!, [x1]!, x2
cpyfp [x0]!, [x1]!, !x2
cpyfp [x0]!, [x1]!, [x2]
cpyfp [x0]!, [x1]!, [x2]!
cpyfp [x31]!, [x0]!, x1!
cpyfp [sp]!, [x0]!, x1!
cpyfp [zr]!, [x0]!, x1!
cpyfp [w30]!, [x0]!, x1!
cpyfp [w0]!, [x1]!, x2!
cpyfp [wsp]!, [x0]!, x1!
cpyfp [wzr]!, [x0]!, x1!
cpyfp [b0]!, [x1]!, x2!
cpyfp [h0]!, [x1]!, x2!
cpyfp [s0]!, [x1]!, x2!
cpyfp [d0]!, [x1]!, x2!
cpyfp [q0]!, [x1]!, x2!
cpyfp [v0]!, [x1]!, x2!
cpyfp [v0.2d]!, [x1]!, x2!
cpyfp [z0]!, [x1]!, x2!
cpyfp [z0.d]!, [x1]!, x2!
cpyfp [p0]!, [x1]!, x2!
cpyfp [p0.d]!, [x1]!, x2!
cpyfp [foo]!, [x1]!, x2!
cpyfp [x0]!, [x31]!, x1!
cpyfp [x0]!, [sp]!, x1!
cpyfp [x0]!, [zr]!, x1!
cpyfp [x0]!, [w30]!, x1!
cpyfp [x1]!, [w0]!, x2!
cpyfp [x0]!, [wsp]!, x1!
cpyfp [x0]!, [wzr]!, x1!
cpyfp [x1]!, [foo]!, x2!
cpyfp [x0]!, [x1]!, x31!
cpyfp [x0]!, [x1]!, sp!
cpyfp [x0]!, [x1]!, zr!
cpyfp [x0]!, [x1]!, w30!
cpyfp [x1]!, [x2]!, w0!
cpyfp [x0]!, [x1]!, wsp!
cpyfp [x0]!, [x1]!, wzr!
cpyfp [x1]!, [x2]!, foo!
cpyfp [x0]!, [x0]!, x1!
cpyfp [x10]!, [x1]!, x10!
cpyfp [x1]!, [x30]!, x30!
setp x0, x1!, x2
setp x0!, x1!, x2
setp [x0], x1!, x2
setp [x0, #0]!, x1!, x2
setp [x0, xzr]!, x1!, x2
setp [x31]!, x0!, x1
setp [sp]!, x0!, x1
setp [zr]!, x0!, x1
setp [w30]!, x0!, x1
setp [w0]!, x1!, x2
setp [wsp]!, x0!, x1
setp [wzr]!, x0!, x1
setp [foo]!, x1!, x2
setp [x0]!, x31!, x1
setp [x0]!, sp!, x1
setp [x0]!, zr!, x1
setp [x0]!, w30!, x1
setp [x1]!, w0!, x2
setp [x0]!, wsp!, x1
setp [x0]!, wzr!, x1
setp [x1]!, foo!, x2
setp [x30]!, x0!, sp
setp [x30]!, x0!, wsp
setp [x30]!, x0!, wzr
setp [x0]!, x0!, x1
setp [x10]!, x1!, x10
setp [x1]!, x30!, x30
.arch armv8.7-a
cpyfp [x0]!, [x1]!, x2!
cpyfm [x0]!, [x1]!, x2!
cpyfe [x0]!, [x1]!, x2!
cpyfprn [x0]!, [x1]!, x2!
cpyfmrn [x0]!, [x1]!, x2!
cpyfern [x0]!, [x1]!, x2!
cpyfpwn [x0]!, [x1]!, x2!
cpyfmwn [x0]!, [x1]!, x2!
cpyfewn [x0]!, [x1]!, x2!
cpyfpn [x0]!, [x1]!, x2!
cpyfmn [x0]!, [x1]!, x2!
cpyfen [x0]!, [x1]!, x2!
cpyfprt [x0]!, [x1]!, x2!
cpyfmrt [x0]!, [x1]!, x2!
cpyfert [x0]!, [x1]!, x2!
cpyfprtrn [x0]!, [x1]!, x2!
cpyfmrtrn [x0]!, [x1]!, x2!
cpyfertrn [x0]!, [x1]!, x2!
cpyfprtwn [x0]!, [x1]!, x2!
cpyfmrtwn [x0]!, [x1]!, x2!
cpyfertwn [x0]!, [x1]!, x2!
cpyfprtn [x0]!, [x1]!, x2!
cpyfmrtn [x0]!, [x1]!, x2!
cpyfertn [x0]!, [x1]!, x2!
cpyfpwt [x0]!, [x1]!, x2!
cpyfmwt [x0]!, [x1]!, x2!
cpyfewt [x0]!, [x1]!, x2!
cpyfpwtrn [x0]!, [x1]!, x2!
cpyfmwtrn [x0]!, [x1]!, x2!
cpyfewtrn [x0]!, [x1]!, x2!
cpyfpwtwn [x0]!, [x1]!, x2!
cpyfmwtwn [x0]!, [x1]!, x2!
cpyfewtwn [x0]!, [x1]!, x2!
cpyfpwtn [x0]!, [x1]!, x2!
cpyfmwtn [x0]!, [x1]!, x2!
cpyfewtn [x0]!, [x1]!, x2!
cpyfpt [x0]!, [x1]!, x2!
cpyfmt [x0]!, [x1]!, x2!
cpyfet [x0]!, [x1]!, x2!
cpyfptrn [x0]!, [x1]!, x2!
cpyfmtrn [x0]!, [x1]!, x2!
cpyfetrn [x0]!, [x1]!, x2!
cpyfptwn [x0]!, [x1]!, x2!
cpyfmtwn [x0]!, [x1]!, x2!
cpyfetwn [x0]!, [x1]!, x2!
cpyfptn [x0]!, [x1]!, x2!
cpyfmtn [x0]!, [x1]!, x2!
cpyfetn [x0]!, [x1]!, x2!
cpyp [x0]!, [x1]!, x2!
cpym [x0]!, [x1]!, x2!
cpye [x0]!, [x1]!, x2!
cpyprn [x0]!, [x1]!, x2!
cpymrn [x0]!, [x1]!, x2!
cpyern [x0]!, [x1]!, x2!
cpypwn [x0]!, [x1]!, x2!
cpymwn [x0]!, [x1]!, x2!
cpyewn [x0]!, [x1]!, x2!
cpypn [x0]!, [x1]!, x2!
cpymn [x0]!, [x1]!, x2!
cpyen [x0]!, [x1]!, x2!
cpyprt [x0]!, [x1]!, x2!
cpymrt [x0]!, [x1]!, x2!
cpyert [x0]!, [x1]!, x2!
cpyprtrn [x0]!, [x1]!, x2!
cpymrtrn [x0]!, [x1]!, x2!
cpyertrn [x0]!, [x1]!, x2!
cpyprtwn [x0]!, [x1]!, x2!
cpymrtwn [x0]!, [x1]!, x2!
cpyertwn [x0]!, [x1]!, x2!
cpyprtn [x0]!, [x1]!, x2!
cpymrtn [x0]!, [x1]!, x2!
cpyertn [x0]!, [x1]!, x2!
cpypwt [x0]!, [x1]!, x2!
cpymwt [x0]!, [x1]!, x2!
cpyewt [x0]!, [x1]!, x2!
cpypwtrn [x0]!, [x1]!, x2!
cpymwtrn [x0]!, [x1]!, x2!
cpyewtrn [x0]!, [x1]!, x2!
cpypwtwn [x0]!, [x1]!, x2!
cpymwtwn [x0]!, [x1]!, x2!
cpyewtwn [x0]!, [x1]!, x2!
cpypwtn [x0]!, [x1]!, x2!
cpymwtn [x0]!, [x1]!, x2!
cpyewtn [x0]!, [x1]!, x2!
cpypt [x0]!, [x1]!, x2!
cpymt [x0]!, [x1]!, x2!
cpyet [x0]!, [x1]!, x2!
cpyptrn [x0]!, [x1]!, x2!
cpymtrn [x0]!, [x1]!, x2!
cpyetrn [x0]!, [x1]!, x2!
cpyptwn [x0]!, [x1]!, x2!
cpymtwn [x0]!, [x1]!, x2!
cpyetwn [x0]!, [x1]!, x2!
cpyptn [x0]!, [x1]!, x2!
cpymtn [x0]!, [x1]!, x2!
cpyetn [x0]!, [x1]!, x2!
setp [x0]!, x1!, x2
setm [x0]!, x1!, x2
sete [x0]!, x1!, x2
setpt [x0]!, x1!, x2
setmt [x0]!, x1!, x2
setet [x0]!, x1!, x2
setpn [x0]!, x1!, x2
setmn [x0]!, x1!, x2
seten [x0]!, x1!, x2
setptn [x0]!, x1!, x2
setmtn [x0]!, x1!, x2
setetn [x0]!, x1!, x2
setgp [x0]!, x1!, x2
setgm [x0]!, x1!, x2
setge [x0]!, x1!, x2
setgpt [x0]!, x1!, x2
setgmt [x0]!, x1!, x2
setget [x0]!, x1!, x2
setgpn [x0]!, x1!, x2
setgmn [x0]!, x1!, x2
setgen [x0]!, x1!, x2
setgptn [x0]!, x1!, x2
setgmtn [x0]!, x1!, x2
setgetn [x0]!, x1!, x2
.arch armv8.7-a+mops
setgp [x0]!, x1!, x2
setgm [x0]!, x1!, x2
setge [x0]!, x1!, x2
setgpt [x0]!, x1!, x2
setgmt [x0]!, x1!, x2
setget [x0]!, x1!, x2
setgpn [x0]!, x1!, x2
setgmn [x0]!, x1!, x2
setgen [x0]!, x1!, x2
setgptn [x0]!, x1!, x2
setgmtn [x0]!, x1!, x2
setgetn [x0]!, x1!, x2
.arch armv8.7-a+memtag
setgp [x0]!, x1!, x2
setgm [x0]!, x1!, x2
setge [x0]!, x1!, x2
setgpt [x0]!, x1!, x2
setgmt [x0]!, x1!, x2
setget [x0]!, x1!, x2
setgpn [x0]!, x1!, x2
setgmn [x0]!, x1!, x2
setgen [x0]!, x1!, x2
setgptn [x0]!, x1!, x2
setgmtn [x0]!, x1!, x2
setgetn [x0]!, x1!, x2

View File

@ -87,6 +87,7 @@ typedef uint32_t aarch64_insn;
#define AARCH64_FEATURE_SSBS (1ULL << 47) /* SSBS mechanism enabled. */
#define AARCH64_FEATURE_MEMTAG (1ULL << 48) /* Memory Tagging Extension. */
#define AARCH64_FEATURE_TME (1ULL << 49) /* Transactional Memory Extension. */
#define AARCH64_FEATURE_MOPS (1ULL << 50) /* Standardization of memory operations. */
#define AARCH64_FEATURE_I8MM (1ULL << 52) /* Matrix Multiply instructions. */
#define AARCH64_FEATURE_F32MM (1ULL << 53)
#define AARCH64_FEATURE_F64MM (1ULL << 54)
@ -143,7 +144,8 @@ typedef uint32_t aarch64_insn;
AARCH64_FEATURE_V8_7 \
| AARCH64_FEATURE_LS64)
#define AARCH64_ARCH_V8_8 AARCH64_FEATURE (AARCH64_ARCH_V8_7, \
AARCH64_FEATURE_V8_8)
AARCH64_FEATURE_V8_8 \
| AARCH64_FEATURE_MOPS)
#define AARCH64_ARCH_V8_R (AARCH64_FEATURE (AARCH64_ARCH_V8_4, \
AARCH64_FEATURE_V8_R) \
& ~(AARCH64_FEATURE_V8_A | AARCH64_FEATURE_LOR))
@ -461,6 +463,9 @@ enum aarch64_opnd
AARCH64_OPND_SME_PnT_Wm_imm, /* SME <Pn>.<T>[<Wm>, #<imm>]. */
AARCH64_OPND_TME_UIMM16, /* TME unsigned 16-bit immediate. */
AARCH64_OPND_SM3_IMM2, /* SM3 encodes lane in bits [13, 14]. */
AARCH64_OPND_MOPS_ADDR_Rd, /* [Rd]!, in bits [0, 4]. */
AARCH64_OPND_MOPS_ADDR_Rs, /* [Rs]!, in bits [16, 20]. */
AARCH64_OPND_MOPS_WB_Rn /* Rn!, in bits [5, 9]. */
};
/* Qualifier constrains an operand. It either specifies a variant of an

View File

@ -893,6 +893,10 @@ aarch64_insert_operand (const aarch64_operand *self,
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);
case 223:
case 224:
case 225:
return aarch64_ins_x0_to_x30 (self, info, code, inst, errors);
default: assert (0); abort ();
}
}

View File

@ -1519,6 +1519,19 @@ aarch64_ins_sme_pred_reg_with_index (const aarch64_operand *self,
return true;
}
/* Insert X0-X30. Register 31 is unallocated. */
bool
aarch64_ins_x0_to_x30 (const aarch64_operand *self,
const aarch64_opnd_info *info,
aarch64_insn *code,
const aarch64_inst *inst ATTRIBUTE_UNUSED,
aarch64_operand_error *errors ATTRIBUTE_UNUSED)
{
assert (info->reg.regno <= 30);
insert_field (self->fields[0], code, info->reg.regno, 0);
return true;
}
/* Miscellaneous encoding functions. */
/* Encode size[0], i.e. bit 22, for

View File

@ -106,6 +106,7 @@ AARCH64_DECL_OPD_INSERTER (ins_sme_sm_za);
AARCH64_DECL_OPD_INSERTER (ins_sme_pred_reg_with_index);
AARCH64_DECL_OPD_INSERTER (ins_imm_rotate1);
AARCH64_DECL_OPD_INSERTER (ins_imm_rotate2);
AARCH64_DECL_OPD_INSERTER (ins_x0_to_x30);
#undef AARCH64_DECL_OPD_INSERTER

File diff suppressed because it is too large Load Diff

View File

@ -2053,6 +2053,17 @@ aarch64_ext_sve_shrimm (const aarch64_operand *self,
info->imm.value = get_top_bit (info->imm.value) * 2 - info->imm.value;
return true;
}
/* Decode X0-X30. Register 31 is unallocated. */
bool
aarch64_ext_x0_to_x30 (const aarch64_operand *self, aarch64_opnd_info *info,
const aarch64_insn code,
const aarch64_inst *inst ATTRIBUTE_UNUSED,
aarch64_operand_error *errors ATTRIBUTE_UNUSED)
{
info->reg.regno = extract_field (self->fields[0], code, 0);
return info->reg.regno <= 30;
}
/* Bitfields that are commonly used to encode certain operands' information
may be partially used as part of the base opcode in some instructions.

View File

@ -130,6 +130,7 @@ AARCH64_DECL_OPD_EXTRACTOR (ext_sme_sm_za);
AARCH64_DECL_OPD_EXTRACTOR (ext_sme_pred_reg_with_index);
AARCH64_DECL_OPD_EXTRACTOR (ext_imm_rotate1);
AARCH64_DECL_OPD_EXTRACTOR (ext_imm_rotate2);
AARCH64_DECL_OPD_EXTRACTOR (ext_x0_to_x30);
#undef AARCH64_DECL_OPD_EXTRACTOR

View File

@ -247,6 +247,9 @@ const struct aarch64_operand aarch64_operands[] =
{AARCH64_OPND_CLASS_SVE_REG, "SME_PnT_Wm_imm", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SME_Rm,FLD_SVE_Pn,FLD_SME_i1,FLD_SME_tszh,FLD_SME_tszl}, "Source scalable predicate register with index "},
{AARCH64_OPND_CLASS_IMMEDIATE, "TME_UIMM16", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_imm16}, "a 16-bit unsigned immediate for TME tcancel"},
{AARCH64_OPND_CLASS_SIMD_ELEMENT, "SM3_IMM2", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_SM3_imm2}, "an indexed SM3 vector immediate"},
{AARCH64_OPND_CLASS_INT_REG, "MOPS_ADDR_Rd", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_Rd}, "a register destination address with writeback"},
{AARCH64_OPND_CLASS_INT_REG, "MOPS_ADDR_Rs", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_Rs}, "a register source address with writeback"},
{AARCH64_OPND_CLASS_INT_REG, "MOPS_WB_Rd", OPD_F_HAS_INSERTER | OPD_F_HAS_EXTRACTOR, {FLD_Rn}, "an integer register with writeback"},
{AARCH64_OPND_CLASS_NIL, "", 0, {0}, "DUMMY"},
};

View File

@ -3921,6 +3921,17 @@ aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
snprintf (buf, size, "%s", opnd->hint_option->name);
break;
case AARCH64_OPND_MOPS_ADDR_Rd:
case AARCH64_OPND_MOPS_ADDR_Rs:
snprintf (buf, size, "[%s]!",
get_int_reg_name (opnd->reg.regno, AARCH64_OPND_QLF_X, 0));
break;
case AARCH64_OPND_MOPS_WB_Rn:
snprintf (buf, size, "%s!",
get_int_reg_name (opnd->reg.regno, AARCH64_OPND_QLF_X, 0));
break;
default:
snprintf (buf, size, "<invalid>");
break;
@ -5409,6 +5420,36 @@ verify_elem_sd (const struct aarch64_inst *inst, const aarch64_insn insn,
return ERR_OK;
}
/* Check an instruction that takes three register operands and that
requires the register numbers to be distinct from one another. */
static enum err_type
verify_three_different_regs (const struct aarch64_inst *inst,
const aarch64_insn insn ATTRIBUTE_UNUSED,
bfd_vma pc ATTRIBUTE_UNUSED,
bool encoding ATTRIBUTE_UNUSED,
aarch64_operand_error *mismatch_detail
ATTRIBUTE_UNUSED,
aarch64_instr_sequence *insn_sequence
ATTRIBUTE_UNUSED)
{
int rd, rs, rn;
rd = inst->operands[0].reg.regno;
rs = inst->operands[1].reg.regno;
rn = inst->operands[2].reg.regno;
if (rd == rs || rd == rn || rs == rn)
{
mismatch_detail->kind = AARCH64_OPDE_SYNTAX_ERROR;
mismatch_detail->error
= _("the three register operands must be distinct from one another");
mismatch_detail->index = -1;
return ERR_UND;
}
return ERR_OK;
}
/* Add INST to the end of INSN_SEQUENCE. */
static void

View File

@ -2493,6 +2493,10 @@ static const aarch64_feature_set aarch64_feature_ls64 =
AARCH64_FEATURE (AARCH64_FEATURE_V8_6 | AARCH64_FEATURE_LS64, 0);
static const aarch64_feature_set aarch64_feature_flagm =
AARCH64_FEATURE (AARCH64_FEATURE_FLAGM, 0);
static const aarch64_feature_set aarch64_feature_mops =
AARCH64_FEATURE (AARCH64_FEATURE_MOPS, 0);
static const aarch64_feature_set aarch64_feature_mops_memtag =
AARCH64_FEATURE (AARCH64_FEATURE_MOPS | AARCH64_FEATURE_MEMTAG, 0);
#define CORE &aarch64_feature_v8
#define FP &aarch64_feature_fp
@ -2544,6 +2548,8 @@ static const aarch64_feature_set aarch64_feature_flagm =
#define ARMV8_7 &aarch64_feature_v8_7
#define LS64 &aarch64_feature_ls64
#define FLAGM &aarch64_feature_flagm
#define MOPS &aarch64_feature_mops
#define MOPS_MEMTAG &aarch64_feature_mops_memtag
#define CORE_INSN(NAME,OPCODE,MASK,CLASS,OP,OPS,QUALS,FLAGS) \
{ NAME, OPCODE, MASK, CLASS, OP, CORE, OPS, QUALS, FLAGS, 0, 0, NULL }
@ -2669,6 +2675,52 @@ static const aarch64_feature_set aarch64_feature_flagm =
{ NAME, OPCODE, MASK, CLASS, 0, LS64, OPS, QUALS, FLAGS, 0, 0, NULL }
#define FLAGM_INSN(NAME,OPCODE,MASK,CLASS,OPS,QUALS,FLAGS) \
{ NAME, OPCODE, MASK, CLASS, 0, FLAGM, OPS, QUALS, FLAGS, 0, 0, NULL }
#define MOPS_INSN(NAME, OPCODE, MASK, CLASS, OPS, QUALS, FLAGS, CONSTRAINTS, VERIFIER) \
{ NAME, OPCODE, MASK, CLASS, 0, MOPS, OPS, QUALS, FLAGS, CONSTRAINTS, \
0, VERIFIER }
#define MOPS_MEMTAG_INSN(NAME, OPCODE, MASK, CLASS, OPS, QUALS, FLAGS, CONSTRAINTS, VERIFIER) \
{ NAME, OPCODE, MASK, CLASS, 0, MOPS_MEMTAG, OPS, QUALS, FLAGS, \
CONSTRAINTS, 0, VERIFIER }
#define MOPS_CPY_OP1_OP2_PME_INSN(NAME, OPCODE, MASK, FLAGS, CONSTRAINTS) \
MOPS_INSN (NAME, OPCODE, MASK, 0, \
OP3 (MOPS_ADDR_Rd, MOPS_ADDR_Rs, MOPS_WB_Rn), QL_I3SAMEX, \
FLAGS, CONSTRAINTS, VERIFIER (three_different_regs))
#define MOPS_CPY_OP1_OP2_INSN(NAME, SUFFIX, OPCODE, MASK) \
MOPS_CPY_OP1_OP2_PME_INSN (NAME "p" SUFFIX, OPCODE, MASK, F_SCAN, 0), \
MOPS_CPY_OP1_OP2_PME_INSN (NAME "m" SUFFIX, OPCODE | 0x400000, MASK, 0, 0), \
MOPS_CPY_OP1_OP2_PME_INSN (NAME "e" SUFFIX, OPCODE | 0x800000, MASK, 0, 0)
#define MOPS_CPY_OP1_INSN(NAME, SUFFIX, OPCODE, MASK) \
MOPS_CPY_OP1_OP2_INSN (NAME, SUFFIX, OPCODE, MASK), \
MOPS_CPY_OP1_OP2_INSN (NAME, SUFFIX "wn", OPCODE | 0x4000, MASK), \
MOPS_CPY_OP1_OP2_INSN (NAME, SUFFIX "rn", OPCODE | 0x8000, MASK), \
MOPS_CPY_OP1_OP2_INSN (NAME, SUFFIX "n", OPCODE | 0xc000, MASK)
#define MOPS_CPY_INSN(NAME, OPCODE, MASK) \
MOPS_CPY_OP1_INSN (NAME, "", OPCODE, MASK), \
MOPS_CPY_OP1_INSN (NAME, "wt", OPCODE | 0x1000, MASK), \
MOPS_CPY_OP1_INSN (NAME, "rt", OPCODE | 0x2000, MASK), \
MOPS_CPY_OP1_INSN (NAME, "t", OPCODE | 0x3000, MASK)
#define MOPS_SET_OP1_OP2_PME_INSN(NAME, OPCODE, MASK, FLAGS, CONSTRAINTS, ISA) \
ISA (NAME, OPCODE, MASK, 0, \
OP3 (MOPS_ADDR_Rd, MOPS_WB_Rn, Rm), QL_I3SAMEX, FLAGS, \
CONSTRAINTS, VERIFIER (three_different_regs))
#define MOPS_SET_OP1_OP2_INSN(NAME, SUFFIX, OPCODE, MASK, ISA) \
MOPS_SET_OP1_OP2_PME_INSN (NAME "p" SUFFIX, OPCODE, MASK, 0, 0, ISA), \
MOPS_SET_OP1_OP2_PME_INSN (NAME "m" SUFFIX, OPCODE | 0x4000, MASK, \
0, 0, ISA), \
MOPS_SET_OP1_OP2_PME_INSN (NAME "e" SUFFIX, OPCODE | 0x8000, MASK, \
0, 0, ISA)
#define MOPS_SET_INSN(NAME, OPCODE, MASK, ISA) \
MOPS_SET_OP1_OP2_INSN (NAME, "", OPCODE, MASK, ISA), \
MOPS_SET_OP1_OP2_INSN (NAME, "t", OPCODE | 0x1000, MASK, ISA), \
MOPS_SET_OP1_OP2_INSN (NAME, "n", OPCODE | 0x2000, MASK, ISA), \
MOPS_SET_OP1_OP2_INSN (NAME, "tn", OPCODE | 0x3000, MASK, ISA)
const struct aarch64_opcode aarch64_opcode_table[] =
{
@ -5312,6 +5364,51 @@ const struct aarch64_opcode aarch64_opcode_table[] =
BFLOAT16_INSN ("bfmlalb", 0x2ec0fc00, 0xffe0fc00, bfloat16, OP3 (Vd, Vn, Vm), QL_BFMMLA, 0),
BFLOAT16_INSN ("bfmlalt", 0x4fc0f000, 0xffc0f400, bfloat16, OP3 (Vd, Vn, Em16), QL_V3BFML4S, 0),
BFLOAT16_INSN ("bfmlalb", 0x0fc0f000, 0xffc0f400, bfloat16, OP3 (Vd, Vn, Em16), QL_V3BFML4S, 0),
/* cpyfp cpyfprn cpyfpwn cpyfpn
cpyfm cpyfmrn cpyfmwn cpyfmn
cpyfe cpyfern cpyfewn cpyfen
cpyfprt cpyfprtrn cpyfprtwn cpyfprtn
cpyfmrt cpyfmrtrn cpyfmrtwn cpyfmrtn
cpyfert cpyfertrn cpyfertwn cpyfertn
cpyfpwt cpyfpwtrn cpyfpwtwn cpyfpwtn
cpyfmwt cpyfmwtrn cpyfmwtwn cpyfmwtn
cpyfewt cpyfewtrn cpyfewtwn cpyfewtn
cpyfpt cpyfptrn cpyfptwn cpyfptn
cpyfmt cpyfmtrn cpyfmtwn cpyfmtn
cpyfet cpyfetrn cpyfetwn cpyfetn. */
MOPS_CPY_INSN ("cpyf", 0x19000400, 0xffe0fc00),
/* cpyp cpyprn cpypwn cpypn
cpym cpymrn cpymwn cpymn
cpye cpyern cpyewn cpyen
cpyprt cpyprtrn cpyprtwn cpyprtn
cpymrt cpymrtrn cpymrtwn cpymrtn
cpyert cpyertrn cpyertwn cpyertn
cpypwt cpypwtrn cpypwtwn cpypwtn
cpymwt cpymwtrn cpymwtwn cpymwtn
cpyewt cpyewtrn cpyewtwn cpyewtn
cpypt cpyptrn cpyptwn cpyptn
cpymt cpymtrn cpymtwn cpymtn
cpyet cpyetrn cpyetwn cpyetn. */
MOPS_CPY_INSN ("cpy", 0x1d000400, 0xffe0fc00),
/* setp setpt setpn setptn
setm setmt setmn setmtn
sete setet seten setetn */
MOPS_SET_INSN ("set", 0x19c00400, 0xffe0fc00, MOPS_INSN),
/* setgp setgpt setgpn setgptn
setgm setgmt setgmn setgmtn
setge setget setgen setgetn */
MOPS_SET_INSN ("setg", 0x1dc00400, 0xffe0fc00, MOPS_MEMTAG_INSN),
{0, 0, 0, 0, 0, 0, {}, {}, 0, 0, 0, NULL},
};
@ -5795,4 +5892,12 @@ const struct aarch64_opcode aarch64_opcode_table[] =
Y(IMMEDIATE, imm, "TME_UIMM16", 0, F(FLD_imm16), \
"a 16-bit unsigned immediate for TME tcancel") \
Y(SIMD_ELEMENT, reglane, "SM3_IMM2", 0, F(FLD_SM3_imm2), \
"an indexed SM3 vector immediate")
"an indexed SM3 vector immediate") \
/* These next two are really register fields; the [...] notation \
is just syntactic sugar. */ \
Y(INT_REG, x0_to_x30, "MOPS_ADDR_Rd", 0, F(FLD_Rd), \
"a register destination address with writeback") \
Y(INT_REG, x0_to_x30, "MOPS_ADDR_Rs", 0, F(FLD_Rs), \
"a register source address with writeback") \
Y(INT_REG, x0_to_x30, "MOPS_WB_Rd", 0, F(FLD_Rn), \
"an integer register with writeback")