diff options
author | Tamar Christina <tamar.christina@arm.com> | 2018-10-03 18:38:42 +0100 |
---|---|---|
committer | Tamar Christina <tamar.christina@arm.com> | 2018-10-03 18:49:37 +0100 |
commit | a68f4cd235a36776d3d9fea7291163b8d8e35869 (patch) | |
tree | 0bb4db63cd8160de4e3f5d4868aa3d5613f73b6f /gas | |
parent | 755b748fd9fbee8cad2e55535d23298e8ac76b15 (diff) | |
download | gdb-a68f4cd235a36776d3d9fea7291163b8d8e35869.zip gdb-a68f4cd235a36776d3d9fea7291163b8d8e35869.tar.gz gdb-a68f4cd235a36776d3d9fea7291163b8d8e35869.tar.bz2 |
AArch64: Add SVE constraints verifier.
This patch adds the verification rules for move prefix constraints.
The Arm SVE instruction MOVPRFX introduces[1] constraints on the instruction at
PC+4. Particularly the following constraints are handled by this patch
* MOVPRFX must be followed by an instruction.
* MOVPRFX can only be followed by non-layout altering directives.
* MOVPRFX destination register MUST be used as the destination register in the
instruction at PC+4, and is not allowed to be used in any other position other than
destructive input. This includes registers that architecturally overlap. e.g. x1
should be treated as z1.
* MOVPRFX must be followed by a restricted set of SVE instructions.
* The size of the destination register of MOVPRFX must be equal to that of
the operation at PC+4.
* The predicate register and operation of MOVPRFX must match that of the instruction
at PC+4
* The predicated instruction at PC+4 must use the merging predicate.
* Architectural aliases and pseudo-instructions need to be supported as well.
* MOVPRFX cannot be the last instruction in a sequence
Any failure to adhere to any of these constrains will emit an assembly warning
and a disassembly note.
[1] https://developer.arm.com/docs/ddi0584/latest/arm-architecture-reference-manual-supplement-the-scalable-vector-extension-sve-for-armv8-a
include/
* opcode/aarch64.h (aarch64_inst): Remove.
(enum err_type): Add ERR_VFI.
(aarch64_is_destructive_by_operands): New.
(init_insn_sequence): New.
(aarch64_decode_insn): Remove param name.
opcodes/
* aarch64-opc.c (init_insn_block): New.
(verify_constraints, aarch64_is_destructive_by_operands): New.
* aarch64-opc.h (verify_constraints): New.
gas/
* config/tc-aarch64.c (output_operand_error_report): Order warnings.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 4 | ||||
-rw-r--r-- | gas/config/tc-aarch64.c | 6 |
2 files changed, 8 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 68fc927..b4cafbb 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,9 @@ 2018-10-03 Tamar Christina <tamar.christina@arm.com> + * config/tc-aarch64.c (output_operand_error_report): Order warnings. + +2018-10-03 Tamar Christina <tamar.christina@arm.com> + * config/tc-aarch64.c (now_instr_sequence): (*insn_sequence, now_instr_sequence): New. (output_operand_error_record, do_encode): Add insn_sequence. diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 206019b..a5fe6bc 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -4807,10 +4807,12 @@ output_operand_error_report (char *str, bfd_boolean non_fatal_only) { gas_assert (curr->detail.kind != AARCH64_OPDE_NIL); DEBUG_TRACE ("\t%s", operand_mismatch_kind_names[curr->detail.kind]); - if (operand_error_higher_severity_p (curr->detail.kind, kind)) + if (operand_error_higher_severity_p (curr->detail.kind, kind) + && (!non_fatal_only || (non_fatal_only && curr->detail.non_fatal))) kind = curr->detail.kind; } - gas_assert (kind != AARCH64_OPDE_NIL); + + gas_assert (kind != AARCH64_OPDE_NIL || non_fatal_only); /* Pick up one of errors of KIND to report. */ largest_error_pos = -2; /* Index can be -1 which means unknown index. */ |