diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/NEWS | 2 | ||||
-rw-r--r-- | gas/config/tc-aarch64.c | 47 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/system-4-invalid.d | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/system-4-invalid.l | 11 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/system-4-invalid.s | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/system-4.d | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/system-4.s | 12 |
7 files changed, 107 insertions, 0 deletions
@@ -21,6 +21,8 @@ * Add support for Armv8-R and Armv8.7-A AArch64. +* Add support for DSB memory nXS barrier instruction for Armv8.7 AArch64. + * Add support for Intel TDX instructions. * Add support for Intel Key Locker instructions. diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index d17d118..2ec1af4 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -6686,12 +6686,49 @@ parse_operands (char *str, const aarch64_opcode *opcode) backtrack_pos = 0; goto failure; } + if (val != PARSE_FAIL + && operands[i] == AARCH64_OPND_BARRIER) + { + /* Regular barriers accept options CRm (C0-C15). + DSB nXS barrier variant accepts values > 15. */ + po_imm_or_fail (0, 15); + } /* This is an extension to accept a 0..15 immediate. */ if (val == PARSE_FAIL) po_imm_or_fail (0, 15); info->barrier = aarch64_barrier_options + val; break; + case AARCH64_OPND_BARRIER_DSB_NXS: + val = parse_barrier (&str); + if (val != PARSE_FAIL) + { + /* DSB nXS barrier variant accept only <option>nXS qualifiers. */ + if (!(val == 16 || val == 20 || val == 24 || val == 28)) + { + set_syntax_error (_("the specified option is not accepted in DSB")); + /* Turn off backtrack as this optional operand is present. */ + backtrack_pos = 0; + goto failure; + } + } + else + { + /* DSB nXS barrier variant accept 5-bit unsigned immediate, with + possible values 16, 20, 24 or 28 , encoded as val<3:2>. */ + if (! parse_constant_immediate (&str, &val, imm_reg_type)) + goto failure; + if (!(val == 16 || val == 20 || val == 24 || val == 28)) + { + set_syntax_error (_("immediate value must be 16, 20, 24, 28")); + goto failure; + } + } + /* Option index is encoded as 2-bit value in val<3:2>. */ + val = (val >> 2) - 4; + info->barrier = aarch64_barrier_dsb_nxs_options + val; + break; + case AARCH64_OPND_PRFOP: val = parse_pldop (&str); /* This is an extension to accept a 0..31 immediate. */ @@ -8782,6 +8819,16 @@ md_begin (void) (void *) (aarch64_barrier_options + i)); } + for (i = 0; i < ARRAY_SIZE (aarch64_barrier_dsb_nxs_options); i++) + { + const char *name = aarch64_barrier_dsb_nxs_options[i].name; + checked_hash_insert (aarch64_barrier_opt_hsh, name, + (void *) (aarch64_barrier_dsb_nxs_options + i)); + /* Also hash the name in the upper case. */ + checked_hash_insert (aarch64_barrier_opt_hsh, get_upper_str (name), + (void *) (aarch64_barrier_dsb_nxs_options + i)); + } + for (i = 0; i < ARRAY_SIZE (aarch64_prfops); i++) { const char* name = aarch64_prfops[i].name; diff --git a/gas/testsuite/gas/aarch64/system-4-invalid.d b/gas/testsuite/gas/aarch64/system-4-invalid.d new file mode 100644 index 0000000..62d38eb --- /dev/null +++ b/gas/testsuite/gas/aarch64/system-4-invalid.d @@ -0,0 +1,3 @@ +#name: Invalid DSB memory nXS barrier variant +#source: system-4-invalid.s +#error_output: system-4-invalid.l diff --git a/gas/testsuite/gas/aarch64/system-4-invalid.l b/gas/testsuite/gas/aarch64/system-4-invalid.l new file mode 100644 index 0000000..5a01e39 --- /dev/null +++ b/gas/testsuite/gas/aarch64/system-4-invalid.l @@ -0,0 +1,11 @@ +.*: Assembler messages: +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #17' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #18' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #19' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #21' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #22' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #23' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #25' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #26' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #27' +.*: Error: immediate value out of range 0 to 15 at operand 1 -- `dsb #29' diff --git a/gas/testsuite/gas/aarch64/system-4-invalid.s b/gas/testsuite/gas/aarch64/system-4-invalid.s new file mode 100644 index 0000000..cadad58 --- /dev/null +++ b/gas/testsuite/gas/aarch64/system-4-invalid.s @@ -0,0 +1,16 @@ +/* Armv8.7-a DSB memory nXS barrier variant. */ +.arch armv8.7-a + + dsb #17 + dsb #18 + dsb #19 + + dsb #21 + dsb #22 + dsb #23 + + dsb #25 + dsb #26 + dsb #27 + + dsb #29 diff --git a/gas/testsuite/gas/aarch64/system-4.d b/gas/testsuite/gas/aarch64/system-4.d new file mode 100644 index 0000000..0f600f8 --- /dev/null +++ b/gas/testsuite/gas/aarch64/system-4.d @@ -0,0 +1,16 @@ +#name: DSB memory nXS barrier variant +#objdump: -dr + +.*: file format .* + +Disassembly of section \.text: + +0+ <.*>: +.*: d503323f dsb oshnxs +.*: d503363f dsb nshnxs +.*: d5033a3f dsb ishnxs +.*: d5033e3f dsb synxs +.*: d503323f dsb oshnxs +.*: d503363f dsb nshnxs +.*: d5033a3f dsb ishnxs +.*: d5033e3f dsb synxs diff --git a/gas/testsuite/gas/aarch64/system-4.s b/gas/testsuite/gas/aarch64/system-4.s new file mode 100644 index 0000000..f95eb35 --- /dev/null +++ b/gas/testsuite/gas/aarch64/system-4.s @@ -0,0 +1,12 @@ +/* Armv8.7-a DSB memory nXS barrier variant. */ +.arch armv8.7-a + + dsb #16 + dsb #20 + dsb #24 + dsb #28 + + dsb oshnxs + dsb nshnxs + dsb ishnxs + dsb synxs |