[ARC] Fix disassembler option.
authorClaudiu Zissulescu <claziss@synopsys.com>
Thu, 6 Oct 2016 10:05:27 +0000 (12:05 +0200)
committerClaudiu Zissulescu <claziss@synopsys.com>
Tue, 29 Nov 2016 10:23:24 +0000 (11:23 +0100)
This patch fixes:
- fpus and fpud are swaped.
- quarkse_em doesn't include FPX extensions.
- auto guessed opcode mechanism may ignore the option passed via -M<feature> option.

opcodes/
2016-11-29  Claudiu Zissulescu  <claziss@synopsys.com>

* arc-dis.c (is_compatible_p): Remove function.
(skip_this_opcode): Don't add any decoding class to decode list.
Remove warning.
(find_format_from_table): Go through all opcodes, and warn if we
use a guessed mnemonic.

binutils/
2016-11-29  Claudiu Zissulescu  <claziss@synopsys.com>

* testsuite/binutils-all/arc/objdump.exp (Warning test): Update
test.

binutils/ChangeLog
binutils/testsuite/binutils-all/arc/objdump.exp
opcodes/ChangeLog
opcodes/arc-dis.c

index b0ea872da2fb78afac29d0dd0ae71cd4aa466b5a..eab32c7d6493f9d57170cf7460b65c75c92791f5 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-29  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * testsuite/binutils-all/arc/objdump.exp (Warning test): Update
+       test.
+
 2016-11-27  Ambrogino Modigliani  <ambrogino.modigliani@gmail.com>
 
        * dwarf.c: Fix spelling in comments.
index 58c4a05fbee77c4fe79622cd8c18b19b1d71b519..a988823e06c03db9b428966c475c6ea061a42c48 100644 (file)
@@ -46,7 +46,7 @@ if [is_remote host] {
 
 set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble $objfile"]
 
-set want "Warning: disassembly.*dsubh12\[ \t\]*r0,r2,r4.*dmulh12.f\[ \t\]*r0,r2,r4.*dmulh11.f"
+set want "Warning: disassembly.*vmac2hnfr\[ \t\]*r0,r2,r4.*dmulh12.f\[ \t\]*r0,r2,r4.*dmulh11.f"
 
 if [regexp $want $got] then {
     pass "Warning test"
index 9bfd67be5e8213dbc12a39a0071add085d69e77a..ef016c280e926c06f3138abe838dabc23466f6d4 100644 (file)
@@ -1,3 +1,11 @@
+2016-11-29  Claudiu Zissulescu  <claziss@synopsys.com>
+
+       * arc-dis.c (is_compatible_p): Remove function.
+       (skip_this_opcode): Don't add any decoding class to decode list.
+       Remove warning.
+       (find_format_from_table): Go through all opcodes, and warn if we
+       use a guessed mnemonic.
+
 2016-11-28  Ramiro Polla  <ramiro@hex-rays.com>
            Amit Pawar  <amit.pawar@amd.com>
 
index 31b5a91db57c327587b0fb75ccef01e99a65e967..bcba2c79a424b7207fa52cb6032e6c515d700a79 100644 (file)
@@ -108,21 +108,6 @@ static linkclass decodelist = NULL;
 
 /* Functions implementation.  */
 
-/* Return TRUE when two classes are not opcode conflicting.  */
-
-static bfd_boolean
-is_compatible_p (insn_class_t     classA,
-                insn_subclass_t  sclassA,
-                insn_class_t     classB,
-                insn_subclass_t  sclassB)
-{
-  if (classA == DSP && sclassB == DPX)
-    return FALSE;
-  if (sclassA == DPX && classB == DSP)
-    return FALSE;
-  return TRUE;
-}
-
 /* Add a new element to the decode list.  */
 
 static void
@@ -141,54 +126,34 @@ add_to_decodelist (insn_class_t     insn_class,
    disassembled.  */
 
 static bfd_boolean
-skip_this_opcode (const struct arc_opcode *  opcode,
-                 struct disassemble_info *  info)
+skip_this_opcode (const struct arc_opcode *opcode)
 {
   linkclass t = decodelist;
-  bfd_boolean addme = TRUE;
 
   /* Check opcode for major 0x06, return if it is not in.  */
   if (arc_opcode_len (opcode) == 4
       && OPCODE_32BIT_INSN (opcode->opcode) != 0x06)
     return FALSE;
 
-  while (t != NULL
-        && is_compatible_p (t->insn_class, t->subclass,
-                            opcode->insn_class, opcode->subclass))
+  /* or not a known truble class.  */
+  switch (opcode->insn_class)
+    {
+    case FLOAT:
+    case DSP:
+      break;
+    default:
+      return FALSE;
+    }
+
+  while (t != NULL)
     {
       if ((t->insn_class == opcode->insn_class)
          && (t->subclass == opcode->subclass))
-       addme = FALSE;
+       return FALSE;
       t = t->nxt;
     }
 
-  /* If we found an incompatibility then we must skip.  */
-  if (t != NULL)
-    return TRUE;
-
-  /* Even if we do not precisely know the if the right mnemonics
-     is correctly displayed, keep the disassmbled code class
-     consistent.  */
-  if (addme)
-    {
-      switch (opcode->insn_class)
-       {
-       case DSP:
-       case FLOAT:
-         /* Add to the conflict list only the classes which
-            counts.  */
-         add_to_decodelist (opcode->insn_class, opcode->subclass);
-         /* Warn if we have to decode an opcode and no preferred
-            classes have been chosen.  */
-         info->fprintf_func (info->stream, _("\n\
-Warning: disassembly may be wrong due to guessed opcode class choice.\n\
- Use -M<class[,class]> to select the correct opcode class(es).\n\t\t\t\t"));
-         break;
-       default:
-         break;
-       }
-    }
-  return FALSE;
+  return TRUE;
 }
 
 static bfd_vma
@@ -243,8 +208,10 @@ find_format_from_table (struct disassemble_info *info,
 {
   unsigned int i = 0;
   const struct arc_opcode *opcode = NULL;
+  const struct arc_opcode *t_op = NULL;
   const unsigned char *opidx;
   const unsigned char *flgidx;
+  bfd_boolean warn_p = FALSE;
 
   do
     {
@@ -337,15 +304,29 @@ find_format_from_table (struct disassemble_info *info,
        continue;
 
       if (insn_len == 4
-         && overlaps
-         && skip_this_opcode (opcode, info))
-       continue;
+         && overlaps)
+       {
+         warn_p = TRUE;
+         t_op = opcode;
+         if (skip_this_opcode (opcode))
+           continue;
+       }
 
       /* The instruction is valid.  */
       return opcode;
     }
   while (opcode->mask);
 
+  if (warn_p)
+    {
+      info->fprintf_func (info->stream,
+                         _("\nWarning: disassembly may be wrong due to "
+                           "guessed opcode class choice.\n"
+                           "Use -M<class[,class]> to select the correct "
+                           "opcode class(es).\n\t\t\t\t"));
+      return t_op;
+    }
+
   return NULL;
 }
 
@@ -694,18 +675,22 @@ parse_option (char *option)
     add_to_decodelist (FLOAT, DPX);
 
   else if (CONST_STRNEQ (option, "quarkse_em"))
-    add_to_decodelist (FLOAT, QUARKSE);
+    {
+      add_to_decodelist (FLOAT, DPX);
+      add_to_decodelist (FLOAT, SPX);
+      add_to_decodelist (FLOAT, QUARKSE);
+    }
 
   else if (CONST_STRNEQ (option, "fpuda"))
     add_to_decodelist (FLOAT, DPA);
 
-  else if (CONST_STRNEQ (option, "fpud"))
+  else if (CONST_STRNEQ (option, "fpus"))
     {
       add_to_decodelist (FLOAT, SP);
       add_to_decodelist (FLOAT, CVT);
     }
 
-  else if (CONST_STRNEQ (option, "fpus"))
+  else if (CONST_STRNEQ (option, "fpud"))
     {
       add_to_decodelist (FLOAT, DP);
       add_to_decodelist (FLOAT, CVT);