aboutsummaryrefslogtreecommitdiff
path: root/opcodes/aarch64-tbl.h
diff options
context:
space:
mode:
Diffstat (limited to 'opcodes/aarch64-tbl.h')
-rw-r--r--opcodes/aarch64-tbl.h107
1 files changed, 106 insertions, 1 deletions
diff --git a/opcodes/aarch64-tbl.h b/opcodes/aarch64-tbl.h
index 3c0e990..48d2fa8 100644
--- a/opcodes/aarch64-tbl.h
+++ b/opcodes/aarch64-tbl.h
@@ -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")