arc: Replace ARC_SHORT macro with arc_opcode_len function
authorGraham Markall <graham.markall@embecosm.com>
Thu, 29 Sep 2016 18:25:25 +0000 (19:25 +0100)
committerGraham Markall <graham.markall@embecosm.com>
Thu, 3 Nov 2016 17:14:37 +0000 (17:14 +0000)
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
gas/config/tc-arc.c
include/ChangeLog
include/opcode/arc.h
opcodes/ChangeLog
opcodes/arc-dis.c
opcodes/arc-opc.c

index d7aa0c18e3b7c498b333a8d2c16f842559c854b5..63a885bcce2beca2255d538b0b6b9eb96aa23168 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-03  Graham Markall  <graham.markall@embecosm.com>
+
+       * config/tc-arc.c (assemble_insn): Replace use of ARC_SHORT with
+       arc_opcode_len.
+
 2016-11-03  Graham Markall  <graham.markall@embecosm.com>
 
        * config/tc-arc.c (struct arc_insn): Replace short_insn flag with
index 5ced8f037e2a418216eece8164e195584552d557..69dad381a727ff9d4eea677f7e26353a1aa6fa4e 100644 (file)
@@ -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;
 
index c4ddcb2ffe81a905da3b2e0dde7af9905e922ecf..e21ad358daa12da56afd2380dc2bb402e48c6a5d 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-03  Graham Markall  <graham.markall@embecosm.com>
+
+       * opcode/arc.h (arc_opcode_len): Declare.
+       (ARC_SHORT): Delete.
+
 2016-11-01  Palmer Dabbelt  <palmer@dabbelt.com>
            Andrew Waterman <andrew@sifive.com>
 
index 724fdeef053602ad4694ffda5972951e4484d010..34a7fa7315600fa7d5599667f830593976934b04 100644 (file)
@@ -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
 {
index 31809b4b57859a081d1d21f68040b5362d2ca5d0..634ad27248a4e17a23e0b047bb79bb4bff833b0b 100644 (file)
@@ -1,3 +1,10 @@
+2016-11-03  Graham Markall  <graham.markall@embecosm.com>
+
+       * 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  <andrew.burgess@embecosm.com>
 
        * arc-nps400-tbl.h: Fix some instruction masks.
index 898512c87b3fa8cf63c8a6be2f9634c8d897422c..a1aaf34c9caca5e156f2e153f551026735107e31 100644 (file)
@@ -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;
index 65373104687ae37ff3fad44374c085270e6e5e52..9eb58d3f63912a698bb2c4e6e0c9eac81c481528 100644 (file)
@@ -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;
+}