diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2016-09-21 17:09:59 +0100 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2016-09-21 17:09:59 +0100 |
commit | bb7eff5206e4795ac79c177a80fe9f4630aaf730 (patch) | |
tree | ebea7c8fc80d1fbca2c49b1b8988e9a8816b6042 /gas/config/tc-aarch64.c | |
parent | f2a5c4f5af38b146f0bc7e1407e422ac292f9da7 (diff) | |
download | fsf-binutils-gdb-bb7eff5206e4795ac79c177a80fe9f4630aaf730.zip fsf-binutils-gdb-bb7eff5206e4795ac79c177a80fe9f4630aaf730.tar.gz fsf-binutils-gdb-bb7eff5206e4795ac79c177a80fe9f4630aaf730.tar.bz2 |
[AArch64] Add SVE condition codes
SVE defines new names for existing NZCV conditions, to reflect the
result of instructions like PTEST. This patch adds support for these
names.
The patch also adds comments to the disassembly output to show the
alternative names of a condition code. For example:
cinv x0, x1, cc
becomes:
cinv x0, x1, cc // cc = lo, ul, last
and:
b.cc f0 <...>
becomes:
b.cc f0 <...> // b.lo, b.ul, b.last
Doing this for the SVE names follows the practice recommended by the
SVE specification and is definitely useful when reading SVE code.
If the feeling is that it's too distracting elsewhere, we could add
an option to turn it off.
include/
* opcode/aarch64.h (aarch64_cond): Bump array size to 4.
opcodes/
* aarch64-dis.c (remove_dot_suffix): New function, split out from...
(print_mnemonic_name): ...here.
(print_comment): New function.
(print_aarch64_insn): Call it.
* aarch64-opc.c (aarch64_conds): Add SVE names.
(aarch64_print_operand): Print alternative condition names in
a comment.
gas/
* config/tc-aarch64.c (opcode_lookup): Search for the end of
a condition name, rather than assuming that it will have exactly
2 characters.
(parse_operands): Likewise.
* testsuite/gas/aarch64/alias.d: Add new condition-code comments
to the expected output.
* testsuite/gas/aarch64/beq_1.d: Likewise.
* testsuite/gas/aarch64/float-fp16.d: Likewise.
* testsuite/gas/aarch64/int-insns.d: Likewise.
* testsuite/gas/aarch64/no-aliases.d: Likewise.
* testsuite/gas/aarch64/programmer-friendly.d: Likewise.
* testsuite/gas/aarch64/reloc-insn.d: Likewise.
* testsuite/gas/aarch64/b_c_1.d, testsuite/gas/aarch64/b_c_1.s:
New test.
ld/
* testsuite/ld-aarch64/emit-relocs-280.d: Match branch comments.
* testsuite/ld-aarch64/weak-undefined.d: Likewise.
Diffstat (limited to 'gas/config/tc-aarch64.c')
-rw-r--r-- | gas/config/tc-aarch64.c | 58 |
1 files changed, 33 insertions, 25 deletions
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 0aff0e8..bc39fe9 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -4836,41 +4836,44 @@ lookup_mnemonic (const char *start, int len) static templates * opcode_lookup (char **str) { - char *end, *base; + char *end, *base, *dot; const aarch64_cond *cond; char condname[16]; int len; /* Scan up to the end of the mnemonic, which must end in white space, '.', or end of string. */ + dot = 0; for (base = end = *str; is_part_of_name(*end); end++) - if (*end == '.') - break; + if (*end == '.' && !dot) + dot = end; - if (end == base) + if (end == base || dot == base) return 0; inst.cond = COND_ALWAYS; /* Handle a possible condition. */ - if (end[0] == '.') + if (dot) { - cond = hash_find_n (aarch64_cond_hsh, end + 1, 2); + cond = hash_find_n (aarch64_cond_hsh, dot + 1, end - dot - 1); if (cond) { inst.cond = cond->value; - *str = end + 3; + *str = end; } else { - *str = end; + *str = dot; return 0; } + len = dot - base; } else - *str = end; - - len = end - base; + { + *str = end; + len = end - base; + } if (inst.cond == COND_ALWAYS) { @@ -5826,20 +5829,25 @@ parse_operands (char *str, const aarch64_opcode *opcode) case AARCH64_OPND_COND: case AARCH64_OPND_COND1: - info->cond = hash_find_n (aarch64_cond_hsh, str, 2); - str += 2; - if (info->cond == NULL) - { - set_syntax_error (_("invalid condition")); - goto failure; - } - else if (operands[i] == AARCH64_OPND_COND1 - && (info->cond->value & 0xe) == 0xe) - { - /* Not allow AL or NV. */ - set_default_error (); - goto failure; - } + { + char *start = str; + do + str++; + while (ISALPHA (*str)); + info->cond = hash_find_n (aarch64_cond_hsh, start, str - start); + if (info->cond == NULL) + { + set_syntax_error (_("invalid condition")); + goto failure; + } + else if (operands[i] == AARCH64_OPND_COND1 + && (info->cond->value & 0xe) == 0xe) + { + /* Do not allow AL or NV. */ + set_default_error (); + goto failure; + } + } break; case AARCH64_OPND_ADDR_ADRP: |