From 06fe285fd293e999481ec8f5c619658aa5e3b48b Mon Sep 17 00:00:00 2001 From: Graham Markall Date: Thu, 29 Sep 2016 19:25:25 +0100 Subject: [PATCH] arc: Replace ARC_SHORT macro with arc_opcode_len function In preparation for moving to a world where arc instructions can be 2, 4, 6, or 8 bytes in length, replace the ARC_SHORT macro (which is either true of false) with an arc_opcode_len function that returns a length in bytes. There should be no functional change after this commit. gas/ChangeLog: * config/tc-arc.c (assemble_insn): Replace use of ARC_SHORT with arc_opcode_len. include/ChangeLog: * opcode/arc.h (arc_opcode_len): Declare. (ARC_SHORT): Delete. opcodes/ChangeLog: * arc-dis.c (find_format_from_table): Replace use of ARC_SHORT with arc_opcode_len. (find_format_long_instructions): Likewise. * arc-opc.c (arc_opcode_len): New function. --- gas/ChangeLog | 5 +++++ gas/config/tc-arc.c | 6 ++++-- include/ChangeLog | 5 +++++ include/opcode/arc.h | 7 +++---- opcodes/ChangeLog | 7 +++++++ opcodes/arc-dis.c | 8 ++++---- opcodes/arc-opc.c | 10 ++++++++++ 7 files changed, 38 insertions(+), 10 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index d7aa0c18e3b..63a885bcce2 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2016-11-03 Graham Markall + + * config/tc-arc.c (assemble_insn): Replace use of ARC_SHORT with + arc_opcode_len. + 2016-11-03 Graham Markall * config/tc-arc.c (struct arc_insn): Replace short_insn flag with diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index 5ced8f037e2..69dad381a72 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -3879,7 +3879,8 @@ assemble_insn (const struct arc_opcode *opcode, break; case O_pcl: reloc = ARC_RELOC_TABLE (t->X_md)->reloc; - if (ARC_SHORT (opcode->mask) || opcode->insn_class == JUMP) + if (arc_opcode_len (opcode) == 2 + || opcode->insn_class == JUMP) as_bad_where (frag_now->fr_file, frag_now->fr_line, _("Unable to use @pcl relocation for insn %s"), opcode->name); @@ -4011,7 +4012,8 @@ assemble_insn (const struct arc_opcode *opcode, insn->relax = relax_insn_p (opcode, tok, ntok, pflags, nflg); /* Instruction length. */ - insn->len = ARC_SHORT (opcode->mask) ? 2 : 4; + insn->len = arc_opcode_len (opcode); + gas_assert (insn->len == 2 || insn->len == 4); insn->insn = image; diff --git a/include/ChangeLog b/include/ChangeLog index c4ddcb2ffe8..e21ad358daa 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2016-11-03 Graham Markall + + * opcode/arc.h (arc_opcode_len): Declare. + (ARC_SHORT): Delete. + 2016-11-01 Palmer Dabbelt Andrew Waterman diff --git a/include/opcode/arc.h b/include/opcode/arc.h index 724fdeef053..34a7fa73156 100644 --- a/include/opcode/arc.h +++ b/include/opcode/arc.h @@ -175,6 +175,9 @@ extern const unsigned arc_num_long_opcodes; instructions. */ extern const struct arc_opcode arc_opcodes[]; +/* Return length of an instruction represented by OPCODE, in bytes. */ +extern int arc_opcode_len (const struct arc_opcode *opcode); + /* CPU Availability. */ #define ARC_OPCODE_NONE 0x0000 #define ARC_OPCODE_ARC600 0x0001 /* ARC 600 specific insns. */ @@ -228,10 +231,6 @@ extern const struct arc_opcode arc_opcodes[]; #define ARC_XMAC 0x1000 #define ARC_CRC 0x1000 -/* A macro to check for short instructions. */ -#define ARC_SHORT(mask) \ - (((mask) & 0xFFFF0000) ? 0 : 1) - /* The operands table is an array of struct arc_operand. */ struct arc_operand { diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 31809b4b578..634ad27248a 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2016-11-03 Graham Markall + + * arc-dis.c (find_format_from_table): Replace use of ARC_SHORT + with arc_opcode_len. + (find_format_long_instructions): Likewise. + * arc-opc.c (arc_opcode_len): New function. + 2016-11-03 Andrew Burgess * arc-nps400-tbl.h: Fix some instruction masks. diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c index 898512c87b3..a1aaf34c9ca 100644 --- a/opcodes/arc-dis.c +++ b/opcodes/arc-dis.c @@ -272,12 +272,12 @@ find_format_from_table (struct disassemble_info *info, opcode = &arc_table[i++]; - if (ARC_SHORT (opcode->mask) && (insn_len == 2)) + if ((arc_opcode_len (opcode) == 2) && (insn_len == 2)) { if (OPCODE_AC (opcode->opcode) != OPCODE_AC (insn[0])) continue; } - else if (!ARC_SHORT (opcode->mask) && (insn_len == 4)) + else if ((arc_opcode_len (opcode) == 4) && (insn_len == 4)) { if (OPCODE (opcode->opcode) != OPCODE (insn[0])) continue; @@ -400,12 +400,12 @@ find_format_long_instructions (unsigned *insn, opcode = &arc_long_opcodes[i].base_opcode; - if (ARC_SHORT (opcode->mask) && (*insn_len == 2)) + if ((arc_opcode_len (opcode) == 2) && (*insn_len == 2)) { if (OPCODE_AC (opcode->opcode) != OPCODE_AC (insn[0])) continue; } - else if (!ARC_SHORT (opcode->mask) && (*insn_len == 4)) + else if ((arc_opcode_len (opcode) == 4) && (*insn_len == 4)) { if (OPCODE (opcode->opcode) != OPCODE (insn[0])) continue; diff --git a/opcodes/arc-opc.c b/opcodes/arc-opc.c index 65373104687..9eb58d3f639 100644 --- a/opcodes/arc-opc.c +++ b/opcodes/arc-opc.c @@ -2648,3 +2648,13 @@ const struct arc_long_opcode arc_long_opcodes[] = }; const unsigned arc_num_long_opcodes = ARRAY_SIZE (arc_long_opcodes); + +/* Return length of instruction represented by OPCODE in bytes. */ + +int +arc_opcode_len (const struct arc_opcode *opcode) +{ + if (opcode->mask < 0x10000ull) + return 2; + return 4; +} -- 2.30.2