gas/arc: Replace short_insn flag with insn length field
authorGraham Markall <graham.markall@embecosm.com>
Wed, 6 Jul 2016 14:04:37 +0000 (15:04 +0100)
committerGraham Markall <graham.markall@embecosm.com>
Thu, 3 Nov 2016 17:14:37 +0000 (17:14 +0000)
When assembling an instruction replace the short_insn boolean flag with
an integer field for holding the instruction length.  This is in
preparation for moving to a world where instructions can be 2, 4, 6, or
8 bytes in length.

gas/ChangeLog:

* config/tc-arc.c (struct arc_insn): Replace short_insn flag with
len field.
(apply_fixups): Update to use len field.
(emit_insn0): Simplify code, making use of len field.
(md_convert_frag): Update to use len field.
(assemble_insn): Update to use len field.

gas/ChangeLog
gas/config/tc-arc.c

index 386b65e5c2a03df947bc58a8636b781f8c860503..d7aa0c18e3b7c498b333a8d2c16f842559c854b5 100644 (file)
@@ -1,3 +1,12 @@
+2016-11-03  Graham Markall  <graham.markall@embecosm.com>
+
+       * config/tc-arc.c (struct arc_insn): Replace short_insn flag with
+       len field.
+       (apply_fixups): Update to use len field.
+       (emit_insn0): Simplify code, making use of len field.
+       (md_convert_frag): Update to use len field.
+       (assemble_insn): Update to use len field.
+
 2016-11-03  Siddhesh Poyarekar  <siddhesh.poyarekar@linaro.org>
 
        * config/tc-aarch64.c (aarch64_cpus): Add falkor.
index 5b552e3f69390e9875b9079f8edebc5f8f7e22b5..5ced8f037e2a418216eece8164e195584552d557 100644 (file)
@@ -308,8 +308,7 @@ struct arc_insn
   int nfixups;
   struct arc_fixup fixups[MAX_INSN_FIXUPS];
   long limm;
-  bfd_boolean short_insn; /* Boolean value: TRUE if current insn is
-                            short.  */
+  unsigned int len;       /* Length of instruction in bytes.  */
   bfd_boolean has_limm;   /* Boolean value: TRUE if limm field is
                             valid.  */
   bfd_boolean relax;     /* Boolean value: TRUE if needs
@@ -1343,10 +1342,10 @@ apply_fixups (struct arc_insn *insn, fragS *fragP, int fix)
 
       /* FIXME! the reloc size is wrong in the BFD file.
         When it is fixed please delete me.  */
-      size = (insn->short_insn && !fixup->islong) ? 2 : 4;
+      size = ((insn->len == 2) && !fixup->islong) ? 2 : 4;
 
       if (fixup->islong)
-       offset = (insn->short_insn) ? 2 : 4;
+       offset = insn->len;
 
       /* Some fixups are only used internally, thus no howto.  */
       if ((int) fixup->reloc == 0)
@@ -1356,7 +1355,7 @@ apply_fixups (struct arc_insn *insn, fragS *fragP, int fix)
        {
          /* FIXME! the reloc size is wrong in the BFD file.
             When it is fixed please enable me.
-            size = (insn->short_insn && !fixup->islong) ? 2 : 4; */
+            size = ((insn->len == 2 && !fixup->islong) ? 2 : 4; */
          pcrel = fixup->pcrel;
        }
       else
@@ -1397,48 +1396,22 @@ static void
 emit_insn0 (struct arc_insn *insn, char *where, bfd_boolean relax)
 {
   char *f = where;
+  size_t total_len;
 
   pr_debug ("Emit insn : 0x%x\n", insn->insn);
-  pr_debug ("\tShort   : 0x%d\n", insn->short_insn);
+  pr_debug ("\tShort   : 0x%d\n", (insn->len == 2));
   pr_debug ("\tLong imm: 0x%lx\n", insn->limm);
 
   /* Write out the instruction.  */
-  if (insn->short_insn)
-    {
-      if (insn->has_limm)
-       {
-         if (!relax)
-           f = frag_more (6);
-         md_number_to_chars (f, insn->insn, 2);
-         md_number_to_chars_midend (f + 2, insn->limm, 4);
-         dwarf2_emit_insn (6);
-       }
-      else
-       {
-         if (!relax)
-           f = frag_more (2);
-         md_number_to_chars (f, insn->insn, 2);
-         dwarf2_emit_insn (2);
-       }
-    }
-  else
-    {
-      if (insn->has_limm)
-       {
-         if (!relax)
-           f = frag_more (8);
-         md_number_to_chars_midend (f, insn->insn, 4);
-         md_number_to_chars_midend (f + 4, insn->limm, 4);
-         dwarf2_emit_insn (8);
-       }
-      else
-       {
-         if (!relax)
-           f = frag_more (4);
-         md_number_to_chars_midend (f, insn->insn, 4);
-         dwarf2_emit_insn (4);
-       }
-    }
+  total_len = insn->len + (insn->has_limm ? 4 : 0);
+  if (!relax)
+    f = frag_more (total_len);
+
+  md_number_to_chars_midend(f, insn->insn, insn->len);
+
+  if (insn->has_limm)
+    md_number_to_chars_midend (f + insn->len, insn->limm, 4);
+  dwarf2_emit_insn (total_len);
 
   if (!relax)
     apply_fixups (insn, frag_now, (f - frag_now->fr_literal));
@@ -3262,7 +3235,7 @@ md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
 
   apply_fixups (&insn, fragP, fix);
 
-  size = insn.short_insn ? (insn.has_limm ? 6 : 2) : (insn.has_limm ? 8 : 4);
+  size = insn.len + (insn.has_limm ? 4 : 0);
   gas_assert (table_entry->rlx_length == size);
   emit_insn0 (&insn, dest, TRUE);
 
@@ -4037,8 +4010,8 @@ assemble_insn (const struct arc_opcode *opcode,
 
   insn->relax = relax_insn_p (opcode, tok, ntok, pflags, nflg);
 
-  /* Short instruction?  */
-  insn->short_insn = ARC_SHORT (opcode->mask) ? TRUE : FALSE;
+  /* Instruction length.  */
+  insn->len = ARC_SHORT (opcode->mask) ? 2 : 4;
 
   insn->insn = image;