[PATCH, BINUTILS, AARCH64, 6/8] Add Bulk Allocation Tag instructions in Memory Tagging Extension
Richard Earnshaw (lists)
Richard.Earnshaw@arm.com
Fri Nov 9 17:14:00 GMT 2018
On 08/11/2018 10:35, Sudakshina Das wrote:
> On 02/11/18 16:10, Sudakshina Das wrote:
>> Hi Richard
>>
>> On 30/10/18 10:23, Richard Earnshaw (lists) wrote:
>>> On 09/10/2018 18:25, Sudakshina Das wrote:
>>>> Hi
>>>>
>>>> This patch is part of the patch series to add support for ARMv8.5-A
>>>> Memory Tagging Extensions.
>>>> (https://developer.arm.com/products/architecture/cpu-architecture/a-profile/exploration-tools)
>>>>
>>>>
>>>> Memory Tagging Extension (MTE) is an optional extension to
>>>> ARMv8.5-A and is enabled using the +memtag command line option.
>>>>
>>>> This patch add support to the Bulk Allocation Tag instructions from
>>>> MTE. These are the following instructions added in this patch:
>>>> - LDGV <Xt>, [<Xn|SP>]!
>>>> - STGV <Xt>, [<Xn|SP>]!
>>>>
>>>> This needed a new kind of operand for the new addressing [<Xn|SP>]!
>>>> since this has no offset and only takes a pre-indexed version.
>>>> Hence AARCH64_OPND_ADDR_SIMPLE_2 and ldtdgv_indexed are introduced.
>>>> (AARCH64_OPND_ADDR_SIMPLE fulfilled the no offset criteria but does
>>>> not allow writeback). We also needed new encoding and decoding
>>>> functions to be able to do the same.
>>>>
>>>> where
>>>> <Xt> : Is the 64-bit destination GPR.
>>>> <Xn|SP> : Is the 64-bit first source GPR or Stack pointer.
>>>>
>>>> Testing done: Builds and reg tests all pass on aarch64-none-linux-gnu.
>>>> Added test.
>>>>
>>>> Is this ok for trunk?
>>>>
>>>> Thanks
>>>> Sudi
>>>>
>>>> *** include/ChangeLog ***
>>>>
>>>> 2018-xx-xx Sudakshina Das <sudi.das@arm.com>
>>>>
>>>> Â Â Â Â Â * opcode/aarch64.h (aarch64_opnd): Add AARCH64_OPND_ADDR_SIMPLE_2.
>>>> Â Â Â Â Â (aarch64_insn_class): Add ldstgv_indexed.
>>>>
>>>> *** opcodes/ChangeLog ***
>>>>
>>>> 2018-xx-xx Sudakshina Das <sudi.das@arm.com>
>>>>
>>>> Â Â Â Â Â * aarch64-asm.c (aarch64_ins_addr_simple_2): New.
>>>> Â Â Â Â Â * aarch64-asm.h (ins_addr_simple_2): Declare the above.
>>>> Â Â Â Â Â * aarch64-dis.c (aarch64_ext_addr_simple_2): New.
>>>> Â Â Â Â Â * aarch64-dis.h (ext_addr_simple_2): Declare the above.
>>>> Â Â Â Â Â * aarch64-opc.c (operand_general_constraint_met_p): Add case for
>>>> Â Â Â Â Â AARCH64_OPND_ADDR_SIMPLE_2 and ldstgv_indexed.
>>>> Â Â Â Â Â (aarch64_print_operand): Add case for
>>>> Â Â Â Â Â AARCH64_OPND_ADDR_SIMPLE_2.
>>>> Â Â Â Â Â * aarch64-tbl.h (aarch64_opcode_table): Add stgv and ldgv.
>>>> Â Â Â Â Â (AARCH64_OPERANDS): Define ADDR_SIMPLE_2.
>>>> Â Â Â Â Â * aarch64-asm-2.c: Regenarated.
>>>> Â Â Â Â Â * aarch64-dis-2.c: Regenerated.
>>>> Â Â Â Â Â * aarch64-opc-2.c: Regenerated.
>>>>
>>>> *** gas/ChangeLog ***
>>>>
>>>> 2018-xx-xx Sudakshina Das <sudi.das@arm.com>
>>>>
>>>> Â Â Â Â Â * config/tc-aarch64.c (parse_operands): Add switch case for
>>>> Â Â Â Â Â AARCH64_OPND_ADDR_SIMPLE_2 and allow [base]! for it.
>>>> Â Â Â Â Â * testsuite/gas/aarch64/armv8_5-a-mte.s: Add tests for ldgv and
>>>> Â Â Â Â Â stgv.
>>>> Â Â Â Â Â * testsuite/gas/aarch64/armv8_5-a-mte.d: Likewise.
>>>>
>>>>
>>>
>>> Same issue re mte.
>>>
>>> I'd also like to see some error tests, eg for missing the mandatory
>>> write-back character.
>>>
>>> R.
>>>
>>
>> *** include/ChangeLog ***
>>
>> 2018-xx-xx Sudakshina Das <sudi.das@arm.com>
>>
>> Â Â Â Â * opcode/aarch64.h (aarch64_opnd): Add AARCH64_OPND_ADDR_SIMPLE_2.
>> Â Â Â Â (aarch64_insn_class): Add ldstgv_indexed.
>>
>> *** opcodes/ChangeLog ***
>>
>> 2018-xx-xx Sudakshina Das <sudi.das@arm.com>
>>
>> Â Â Â Â * aarch64-asm.c (aarch64_ins_addr_simple_2): New.
>> Â Â Â Â * aarch64-asm.h (ins_addr_simple_2): Declare the above.
>> Â Â Â Â * aarch64-dis.c (aarch64_ext_addr_simple_2): New.
>> Â Â Â Â * aarch64-dis.h (ext_addr_simple_2): Declare the above.
>> Â Â Â Â * aarch64-opc.c (operand_general_constraint_met_p): Add case for
>> Â Â Â Â AARCH64_OPND_ADDR_SIMPLE_2 and ldstgv_indexed.
>> Â Â Â Â (aarch64_print_operand): Add case for
>> Â Â Â Â AARCH64_OPND_ADDR_SIMPLE_2.
>> Â Â Â Â * aarch64-tbl.h (aarch64_opcode_table): Add stgv and ldgv.
>> Â Â Â Â (AARCH64_OPERANDS): Define ADDR_SIMPLE_2.
>> Â Â Â Â * aarch64-asm-2.c: Regenerated.
>> Â Â Â Â * aarch64-dis-2.c: Regenerated.
>> Â Â Â Â * aarch64-opc-2.c: Regenerated.
>>
>> *** gas/ChangeLog ***
>>
>> 2018-xx-xx Sudakshina Das <sudi.das@arm.com>
>>
>> Â Â Â Â * config/tc-aarch64.c (parse_operands): Add switch case for
>> Â Â Â Â AARCH64_OPND_ADDR_SIMPLE_2 and allow [base]! for it.
>> Â Â Â Â (warn_unpredictable_ldst): Exempt ldstgv_indexed for ldgv.
>> Â Â Â Â * testsuite/gas/aarch64/armv8_5-a-memtag.s: Add tests for ldgv
>> Â Â Â Â and stgv.
>> Â Â Â Â * testsuite/gas/aarch64/armv8_5-a-memtag.d: Likewise.
>> Â Â Â Â * testsuite/gas/aarch64/illegal-memtag.s: Likewise
>> Â Â Â Â * testsuite/gas/aarch64/illegal-memtag.l: Likewise
>>
> New patch. Changelog still applies.
OK.
R.
>
> Sudi
>
>> Thanks
>> Sudi
>>
>
>
>
> rb10010.patch
>
> diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c
> index a5eee96233d78bbdcedc552597d056cb442fb245..3fed11cb6c61430f1c4822a1a18b7635c473bebf 100644
> --- a/gas/config/tc-aarch64.c
> +++ b/gas/config/tc-aarch64.c
> @@ -3372,6 +3372,7 @@ parse_shifter_operand_reloc (char **str, aarch64_opnd_info *operand,
> [base,Wm,(S|U)XTW {#imm}]
> Pre-indexed
> [base,#imm]!
> + [base]! // in ld/stgv
> Post-indexed
> [base],#imm
> [base],Xm // in SIMD ld/st structure
> @@ -3680,10 +3681,11 @@ parse_address_main (char **str, aarch64_opnd_info *operand,
> }
>
> /* If at this point neither .preind nor .postind is set, we have a
> - bare [Rn]{!}; reject [Rn]! but accept [Rn] as a shorthand for [Rn,#0]. */
> + bare [Rn]{!}; reject [Rn]! except for ld/stgv but accept [Rn]
> + as a shorthand for [Rn,#0]. */
> if (operand->addr.preind == 0 && operand->addr.postind == 0)
> {
> - if (operand->addr.writeback)
> + if (operand->type != AARCH64_OPND_ADDR_SIMPLE_2 && operand->addr.writeback)
> {
> /* Reject [Rn]! */
> set_syntax_error (_("missing offset in the pre-indexed address"));
> @@ -6137,6 +6139,7 @@ parse_operands (char *str, const aarch64_opcode *opcode)
> break;
>
> case AARCH64_OPND_ADDR_SIMPLE:
> + case AARCH64_OPND_ADDR_SIMPLE_2:
> case AARCH64_OPND_SIMD_ADDR_SIMPLE:
> {
> /* [<Xn|SP>{, #<simm>}] */
> @@ -6146,7 +6149,8 @@ parse_operands (char *str, const aarch64_opcode *opcode)
> po_misc_or_fail (parse_address (&str, info));
> if (info->addr.pcrel || info->addr.offset.is_reg
> || !info->addr.preind || info->addr.postind
> - || info->addr.writeback)
> + || (info->addr.writeback
> + && operands[i] != AARCH64_OPND_ADDR_SIMPLE_2))
> {
> set_syntax_error (_("invalid addressing mode"));
> goto failure;
> @@ -6169,6 +6173,8 @@ parse_operands (char *str, const aarch64_opcode *opcode)
> }
> }
> po_char_or_fail (']');
> + if (operands[i] == AARCH64_OPND_ADDR_SIMPLE_2)
> + po_char_or_fail ('!');
> break;
> }
>
> @@ -6766,6 +6772,14 @@ warn_unpredictable_ldst (aarch64_instruction *instr, char *str)
> && opnds[1].addr.writeback)
> as_warn (_("unpredictable transfer with writeback -- `%s'"), str);
> break;
> +
> + case ldstgv_indexed:
> + /* Load operations must load different registers. */
> + if ((opcode->opcode & (1 << 22))
> + && opnds[0].reg.regno == opnds[1].addr.base_regno)
> + as_warn (_("unpredictable load of register -- `%s'"), str);
> + break;
> +
> case ldstpair_off:
> case ldstnapair_offs:
> case ldstpair_indexed:
> diff --git a/gas/testsuite/gas/aarch64/armv8_5-a-memtag.d b/gas/testsuite/gas/aarch64/armv8_5-a-memtag.d
> index 363bbe2eb3b1da373737c7d6efce9eba3b6bb6a1..fa56bfa64c984da329c150b24852a2278d559b85 100644
> --- a/gas/testsuite/gas/aarch64/armv8_5-a-memtag.d
> +++ b/gas/testsuite/gas/aarch64/armv8_5-a-memtag.d
> @@ -121,3 +121,14 @@ Disassembly of section \.text:
> .*: d960001f ldg xzr, \[x0\]
> .*: d96ff000 ldg x0, \[x0, #4080\]
> .*: d9700000 ldg x0, \[x0, #-4096\]
> +.*: d9e0001b ldgv x27, \[x0\]!
> +.*: d9e00360 ldgv x0, \[x27\]!
> +.*: d9e00379 ldgv x25, \[x27\]!
> +.*: d9e003e0 ldgv x0, \[sp\]!
> +.*: d9e0001f ldgv xzr, \[x0\]!
> +.*: d9a00000 stgv x0, \[x0\]!
> +.*: d9a0001b stgv x27, \[x0\]!
> +.*: d9a00360 stgv x0, \[x27\]!
> +.*: d9a00379 stgv x25, \[x27\]!
> +.*: d9a003e0 stgv x0, \[sp\]!
> +.*: d9a0001f stgv xzr, \[x0\]!
> diff --git a/gas/testsuite/gas/aarch64/armv8_5-a-memtag.s b/gas/testsuite/gas/aarch64/armv8_5-a-memtag.s
> index 62c9436d78fea63a8ac45126c5f85416a1487822..2c2ff8f44460ee9b818efb4b7b7510846a46c136 100644
> --- a/gas/testsuite/gas/aarch64/armv8_5-a-memtag.s
> +++ b/gas/testsuite/gas/aarch64/armv8_5-a-memtag.s
> @@ -30,6 +30,14 @@ func:
> \op [sp], #-4096
> .endm
>
> + .macro expand_ldg_bulk op
> + \op x27, [x0]!
> + \op x0, [x27]!
> + \op x25, [x27]!
> + \op x0, [sp]!
> + \op xzr, [x0]!
> + .endm
> +
> # IRG
> expand_3_reg irg
> irg sp, x0
> @@ -98,3 +106,8 @@ func:
> ldg xzr, [x0, #0]
> ldg x0, [x0, #4080]
> ldg x0, [x0, #-4096]
> +
> + expand_ldg_bulk ldgv
> +
> + stgv x0, [x0]!
> + expand_ldg_bulk stgv
> diff --git a/gas/testsuite/gas/aarch64/illegal-memtag.l b/gas/testsuite/gas/aarch64/illegal-memtag.l
> index dfdf00aba1ea3e21c29ca602de30336b3f00859b..0d499d9ee955d97183dacab50223a692f2e9d080 100644
> --- a/gas/testsuite/gas/aarch64/illegal-memtag.l
> +++ b/gas/testsuite/gas/aarch64/illegal-memtag.l
> @@ -12,6 +12,9 @@
> [^:]*:[0-9]+: Error: immediate offset out of range -1024 to 1008 at operand 3 -- `stgp x1,x2,\[x3,#1009\]'
> [^:]*:[0-9]+: Error: immediate value must be a multiple of 16 at operand 3 -- `stgp x1,x2,\[x3,#33\]'
> [^:]*:[0-9]+: Error: immediate offset out of range -1024 to 1008 at operand 3 -- `stgp x1,x2,\[x3,#-1025\]'
> +[^:]*:[0-9]+: Warning: unpredictable load of register -- `ldgv x1,\[x1\]!'
> +[^:]*:[0-9]+: Error: operand 2 must be a writeback address with base register \(no offset\) -- `ldgv x1,\[x2\]'
> +[^:]*:[0-9]+: Error: operand 2 must be a writeback address with base register \(no offset\) -- `stgv x1,\[x2\]'
> [^:]*:[0-9]+: Error: operand 1 must be an integer or stack pointer register -- `irg xzr,x2,x3'
> [^:]*:[0-9]+: Error: operand 2 must be an integer or stack pointer register -- `irg x1,xzr,x3'
> [^:]*:[0-9]+: Error: operand 3 must be an integer register -- `irg x1,x2,sp'
> @@ -37,3 +40,7 @@
> [^:]*:[0-9]+: Error: 64-bit integer or SP register expected at operand 3 -- `stgp x0,x0,\[xzr\]'
> [^:]*:[0-9]+: Error: operand 1 must be an integer register -- `ldg sp,\[x0,#16\]'
> [^:]*:[0-9]+: Error: 64-bit integer or SP register expected at operand 2 -- `ldg x0,\[xzr,#16\]'
> +[^:]*:[0-9]+: Error: operand 1 must be an integer register -- `ldgv sp,\[x1\]!'
> +[^:]*:[0-9]+: Error: 64-bit integer or SP register expected at operand 2 -- `ldgv x0,\[xzr\]!'
> +[^:]*:[0-9]+: Error: operand 1 must be an integer register -- `stgv sp,\[x1\]!'
> +[^:]*:[0-9]+: Error: 64-bit integer or SP register expected at operand 2 -- `stgv x0,\[xzr\]!'
> diff --git a/gas/testsuite/gas/aarch64/illegal-memtag.s b/gas/testsuite/gas/aarch64/illegal-memtag.s
> index 35d1b12870bee105ede52d86b392afc68c8190d0..7b7dcd94a1a05dbcf5e603b08e6a95835efc5470 100644
> --- a/gas/testsuite/gas/aarch64/illegal-memtag.s
> +++ b/gas/testsuite/gas/aarch64/illegal-memtag.s
> @@ -20,6 +20,14 @@ func:
> stgp x1, x2, [x3, #33]
> stgp x1, x2, [x3, #-1025]
>
> + # LDGV : Warn for Xt == Xn
> + # STGV : Sould not warn for above
> + ldgv x1, [x1]!
> + stgv x1, [x1]!
> + # Error for no writeback
> + ldgv x1, [x2]
> + stgv x1, [x2]
> +
> # Illegal SP/XZR registers
> irg xzr, x2, x3
> irg x1, xzr, x3
> @@ -46,3 +54,7 @@ func:
> stgp x0, x0, [xzr]
> ldg sp, [x0, #16]
> ldg x0, [xzr, #16]
> + ldgv sp, [x1]!
> + ldgv x0, [xzr]!
> + stgv sp, [x1]!
> + stgv x0, [xzr]!
> diff --git a/include/opcode/aarch64.h b/include/opcode/aarch64.h
> index c4c573a478944eca1ef0f7bb84dd95d8354a8e78..08402392236c4248e23d030e1601029b538a341e 100644
> --- a/include/opcode/aarch64.h
> +++ b/include/opcode/aarch64.h
> @@ -275,6 +275,7 @@ enum aarch64_opnd
> AARCH64_OPND_ADDR_PCREL26, /* 26-bit PC-relative address for e.g. BL. */
>
> AARCH64_OPND_ADDR_SIMPLE, /* Address of ld/st exclusive. */
> + AARCH64_OPND_ADDR_SIMPLE_2, /* Address of ld/stgv. */
> AARCH64_OPND_ADDR_REGOFF, /* Address of register offset. */
> AARCH64_OPND_ADDR_SIMM7, /* Address of signed 7-bit immediate. */
> AARCH64_OPND_ADDR_SIMM9, /* Address of signed 9-bit immediate. */
> @@ -561,6 +562,7 @@ enum aarch64_insn_class
> ldstnapair_offs,
> ldstpair_off,
> ldstpair_indexed,
> + ldstgv_indexed,
> loadlit,
> log_imm,
> log_shift,
> diff --git a/opcodes/aarch64-asm.h b/opcodes/aarch64-asm.h
> index 0524f9182eb295c55aa570c1b786b63ef4820e73..fec54489bfd3e32ba24fac9f9a4a629a820024c9 100644
> --- a/opcodes/aarch64-asm.h
> +++ b/opcodes/aarch64-asm.h
> @@ -59,6 +59,7 @@ AARCH64_DECL_OPD_INSERTER (ins_limm);
> AARCH64_DECL_OPD_INSERTER (ins_inv_limm);
> AARCH64_DECL_OPD_INSERTER (ins_ft);
> AARCH64_DECL_OPD_INSERTER (ins_addr_simple);
> +AARCH64_DECL_OPD_INSERTER (ins_addr_simple_2);
> AARCH64_DECL_OPD_INSERTER (ins_addr_offset);
> AARCH64_DECL_OPD_INSERTER (ins_addr_regoff);
> AARCH64_DECL_OPD_INSERTER (ins_addr_simm);
> diff --git a/opcodes/aarch64-asm.c b/opcodes/aarch64-asm.c
> index e53b98a67f9dc9e0b4638695b9c03d55234c5025..e3380cbee96546bc3dd9a9271a4fa3777638beed 100644
> --- a/opcodes/aarch64-asm.c
> +++ b/opcodes/aarch64-asm.c
> @@ -618,6 +618,17 @@ aarch64_ins_addr_simple (const aarch64_operand *self ATTRIBUTE_UNUSED,
> return TRUE;
> }
>
> +/* Encode the address operand for e.g. STGV <Xt>, [<Xn|SP>]!. */
> +bfd_boolean
> +aarch64_ins_addr_simple_2 (const aarch64_operand *self,
> + const aarch64_opnd_info *info, aarch64_insn *code,
> + const aarch64_inst *inst,
> + aarch64_operand_error *errors)
> +
> +{
> + return aarch64_ins_addr_simple (self, info, code, inst, errors);
> +}
> +
> /* Encode the address operand for e.g.
> STR <Qt>, [<Xn|SP>, <R><m>{, <extend> {<amount>}}]. */
> bfd_boolean
> diff --git a/opcodes/aarch64-dis.h b/opcodes/aarch64-dis.h
> index b09a5ee10d3b951b3c93b416b48b8fd91260d1c6..8949852da354ea0296d8fa033d4b5c9d2bf6045b 100644
> --- a/opcodes/aarch64-dis.h
> +++ b/opcodes/aarch64-dis.h
> @@ -82,6 +82,7 @@ AARCH64_DECL_OPD_EXTRACTOR (ext_limm);
> AARCH64_DECL_OPD_EXTRACTOR (ext_inv_limm);
> AARCH64_DECL_OPD_EXTRACTOR (ext_ft);
> AARCH64_DECL_OPD_EXTRACTOR (ext_addr_simple);
> +AARCH64_DECL_OPD_EXTRACTOR (ext_addr_simple_2);
> AARCH64_DECL_OPD_EXTRACTOR (ext_addr_offset);
> AARCH64_DECL_OPD_EXTRACTOR (ext_addr_regoff);
> AARCH64_DECL_OPD_EXTRACTOR (ext_addr_simm);
> diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c
> index defb53dfd2566149f11052f713bf048ecc30334d..fd542aca9baac6cda4c457c64208f1df8ae87f6f 100644
> --- a/opcodes/aarch64-dis.c
> +++ b/opcodes/aarch64-dis.c
> @@ -985,6 +985,23 @@ aarch64_ext_addr_simple (const aarch64_operand *self ATTRIBUTE_UNUSED,
> return TRUE;
> }
>
> +
> +
> +/* Decode the address operand for e.g. STGV <Xt>, [<Xn|SP>]!. */
> +bfd_boolean
> +aarch64_ext_addr_simple_2 (const aarch64_operand *self ATTRIBUTE_UNUSED,
> + aarch64_opnd_info *info,
> + aarch64_insn code,
> + const aarch64_inst *inst ATTRIBUTE_UNUSED,
> + aarch64_operand_error *errors ATTRIBUTE_UNUSED)
> +{
> + /* Rn */
> + info->addr.base_regno = extract_field (FLD_Rn, code, 0);
> + info->addr.writeback = 1;
> + info->addr.preind = 1;
> + return TRUE;
> +}
> +
> /* Decode the address operand for e.g.
> stlur <Xt>, [<Xn|SP>{, <amount>}]. */
> bfd_boolean
> diff --git a/opcodes/aarch64-opc.c b/opcodes/aarch64-opc.c
> index 433336f76848db91da1577b740faea3c2c3bcd68..3bc2cccc7969567a645d2982fd091d67af044c93 100644
> --- a/opcodes/aarch64-opc.c
> +++ b/opcodes/aarch64-opc.c
> @@ -1602,6 +1602,7 @@ operand_general_constraint_met_p (const aarch64_opnd_info *opnds, int idx,
> break;
> case ldst_imm9:
> case ldstpair_indexed:
> + case ldstgv_indexed:
> case asisdlsep:
> case asisdlsop:
> if (opnd->addr.writeback == 0)
> @@ -3556,6 +3557,11 @@ aarch64_print_operand (char *buf, size_t size, bfd_vma pc,
> snprintf (buf, size, "[%s]", name);
> break;
>
> + case AARCH64_OPND_ADDR_SIMPLE_2:
> + name = get_64bit_int_reg_name (opnd->addr.base_regno, 1);
> + snprintf (buf, size, "[%s]!", name);
> + break;
> +
> case AARCH64_OPND_ADDR_REGOFF:
> case AARCH64_OPND_SVE_ADDR_R:
> case AARCH64_OPND_SVE_ADDR_RR:
> diff --git a/opcodes/aarch64-tbl.h b/opcodes/aarch64-tbl.h
> index 1118433a5a03bcaf143dd136582af6661ff1071b..6fb74bfaca0d3067c6d1b07a5d90946887d1b34d 100644
> --- a/opcodes/aarch64-tbl.h
> +++ b/opcodes/aarch64-tbl.h
> @@ -3324,6 +3324,8 @@ struct aarch64_opcode aarch64_opcode_table[] =
> RCPC_INSN ("ldaprb", 0x38bfc000, 0xfffffc00, ldstexcl, OP2 (Rt, ADDR_SIMPLE), QL_W1_LDST_EXC, 0),
> RCPC_INSN ("ldaprh", 0x78bfc000, 0xfffffc00, ldstexcl, OP2 (Rt, ADDR_SIMPLE), QL_W1_LDST_EXC, 0),
> RCPC_INSN ("ldapr", 0xb8bfc000, 0xbffffc00, ldstexcl, OP2 (Rt, ADDR_SIMPLE), QL_R1NIL, F_GPRSIZE_IN_Q),
> + MEMTAG_INSN ("ldgv", 0xd9e00000, 0xfffffc00, ldstgv_indexed, OP2 (Rt, ADDR_SIMPLE_2), QL_STLX, 0),
> + MEMTAG_INSN ("stgv", 0xd9a00000, 0xfffffc00, ldstgv_indexed, OP2 (Rt, ADDR_SIMPLE_2), QL_STLX, 0),
> /* Limited Ordering Regions load/store instructions. */
> _LOR_INSN ("ldlar", 0x88df7c00, 0xbfe08000, ldstexcl, OP2 (Rt, ADDR_SIMPLE), QL_R1NIL, F_GPRSIZE_IN_Q),
> _LOR_INSN ("ldlarb", 0x08df7c00, 0xffe08000, ldstexcl, OP2 (Rt, ADDR_SIMPLE), QL_W1_LDST_EXC, 0),
> @@ -4648,6 +4650,8 @@ struct aarch64_opcode aarch64_opcode_table[] =
> F(FLD_imm26), "26-bit PC-relative address") \
> Y(ADDRESS, addr_simple, "ADDR_SIMPLE", 0, F(), \
> "an address with base register (no offset)") \
> + Y(ADDRESS, addr_simple_2, "ADDR_SIMPLE_2", 0, F(), \
> + "a writeback address with base register (no offset)") \
> Y(ADDRESS, addr_regoff, "ADDR_REGOFF", 0, F(), \
> "an address with register offset") \
> Y(ADDRESS, addr_simm, "ADDR_SIMM7", 0, F(FLD_imm7,FLD_index2), \
>
More information about the Binutils
mailing list