[ARC] Disassemble correctly extension instructions.
authorClaudiu Zissulescu <claziss@synopsys.com>
Thu, 15 Sep 2016 10:24:24 +0000 (12:24 +0200)
committerClaudiu Zissulescu <claziss@synopsys.com>
Fri, 16 Sep 2016 12:49:33 +0000 (14:49 +0200)
For each MAJOR-MINOR opcode tuple, we can have either a 3-operand, or
2-operand, or a single operand instruction format, depending on the
values present in i-field, and a-field.

The disassembler is reading the section containing the extension
instruction format and stores them in a table.  Each table element
represents a linked list with encodings for a particular MAJOR-MINOR
tuple.

The current implementation checks only against the first element of
the list, hence, the issue.

This patch is walking the linked list until empty or finds an opcode
match.  It also adds a test outlining the found problem.

opcodes/
2016-09-15  Claudiu Zissulescu  <claziss@synopsys.com>

* arc-dis.c (find_format): Walk the linked list pointed by einsn.

gas/
2016-09-15  Claudiu Zissulescu  <claziss@synopsys.com>

* testsuite/gas/arc/textinsnxop.d: New file.
* testsuite/gas/arc/textinsnxop.s: Likewise.

gas/ChangeLog
gas/testsuite/gas/arc/textinsnxop.d [new file with mode: 0644]
gas/testsuite/gas/arc/textinsnxop.s [new file with mode: 0644]
opcodes/ChangeLog
opcodes/arc-dis.c

index c2e390a0638263942da263150ab0ccaaf699a3f7..8a4e15f48ec8019b37e124a2df369ccaa47674ea 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-15  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * testsuite/gas/arc/textinsnxop.d: New file.
+       * testsuite/gas/arc/textinsnxop.s: Likewise.
+
 2016-09-15  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
        * testsuite/gas/sparc/sparc.exp (gas_64_check): Run
diff --git a/gas/testsuite/gas/arc/textinsnxop.d b/gas/testsuite/gas/arc/textinsnxop.d
new file mode 100644 (file)
index 0000000..14556e6
--- /dev/null
@@ -0,0 +1,12 @@
+#objdump: -d
+
+.*: +file format .*arc.*
+
+
+Disassembly of section .text:
+
+[0-9a-f]+ <start>:
+   0:  3921 0080               insn1   r0,r1,r2
+   4:  382f 0061               insn2   r0,r1
+   8:  392f 407f               insn3   r1
+   c:  396f 403f               insn4
diff --git a/gas/testsuite/gas/arc/textinsnxop.s b/gas/testsuite/gas/arc/textinsnxop.s
new file mode 100644 (file)
index 0000000..be8111d
--- /dev/null
@@ -0,0 +1,10 @@
+       .extInstruction insn1, 7, 0x21, SUFFIX_NONE, SYNTAX_3OP
+       .extInstruction insn2, 7, 0x21, SUFFIX_NONE, SYNTAX_2OP
+       .extInstruction insn3, 7, 0x21, SUFFIX_NONE, SYNTAX_1OP
+       .extInstruction insn4, 7, 0x21, SUFFIX_NONE, SYNTAX_NOP
+
+start:
+       insn1   r0,r1,r2
+       insn2   r0,r1
+       insn3   r1
+       insn4
index 3a438ea1602fccaf7b1149190b67a0c7c9a1c5c2..4208ba1bd2db483db25a8553ec20a6c4a2be8a68 100644 (file)
@@ -1,3 +1,7 @@
+2016-09-15  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * arc-dis.c (find_format): Walk the linked list pointed by einsn.
+
 2016-09-14  Peter Bergner <bergner@vnet.ibm.com>
 
        * ppc-opc.c (powerpc_opcodes) <slbiag>: New mnemonic.
index ac03b8c3f17f81f95b8cb11b4ae629937207c501..e4df678dfa532f403ea686a4f0361c75610d1113 100644 (file)
@@ -477,15 +477,15 @@ find_format (bfd_vma                       memaddr,
 {
   const struct arc_opcode *opcode = NULL;
   bfd_boolean needs_limm;
-  const extInstruction_t *einsn;
+  const extInstruction_t *einsn, *i;
 
   /* First, try the extension instructions.  */
   einsn = arcExtMap_insn (OPCODE (insn[0]), insn[0]);
-  if (einsn != NULL)
+  for (i = einsn; (i != NULL) && (opcode == NULL); i = i->next)
     {
       const char *errmsg = NULL;
 
-      opcode = arcExtMap_genOpcode (einsn, isa_mask, &errmsg);
+      opcode = arcExtMap_genOpcode (i, isa_mask, &errmsg);
       if (opcode == NULL)
        {
          (*info->fprintf_func) (info->stream, "\