[PATCH 3/7] arc: Replace ARC_SHORT macro with arc_opcode_len function
Graham Markall
graham.markall@embecosm.com
Wed Oct 26 12:47:00 GMT 2016
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/config/tc-arc.c b/gas/config/tc-arc.c
index c70aff6..1c63ed8 100644
--- a/gas/config/tc-arc.c
+++ b/gas/config/tc-arc.c
@@ -3870,7 +3870,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);
@@ -4002,7 +4003,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/opcode/arc.h b/include/opcode/arc.h
index 724fdee..34a7fa7 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/arc-dis.c b/opcodes/arc-dis.c
index 898512c..a1aaf34 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 6537310..9eb58d3 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.7.4
More information about the Binutils
mailing list