Add ColfFire v4 support
[deliverable/binutils-gdb.git] / opcodes / arm-dis.c
index 8fb970245dc8155bc3c745536943096510e9b51b..ac36e88006bd74c351e7b9fd970d11f1af360bd5 100644 (file)
@@ -27,6 +27,7 @@
 #include "coff/internal.h"
 #include "libcoff.h"
 #include "opintl.h"
+#include "safe-ctype.h"
 
 /* FIXME: This shouldn't be done here.  */
 #include "elf-bfd.h"
@@ -71,9 +72,9 @@ static arm_regname regnames[] =
     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "v4", "v5", "v6", "v7",  "v8",  "IP",  "SP",  "LR",  "PC" }},
   { "special-atpcs", "Select special register names used in the ATPCS",
     { "a1", "a2", "a3", "a4", "v1", "v2", "v3", "WR", "v5", "SB", "SL",  "FP",  "IP",  "SP",  "LR",  "PC" }},
-  { "iwmmxt_regnames", "Select register names used on the Intel(r) Wireless MMX(tm) technology coprocessor",
+  { "iwmmxt_regnames", "Select register names used on the Intel Wireless MMX technology coprocessor",
     { "wr0", "wr1", "wr2", "wr3", "wr4", "wr5", "wr6", "wr7", "wr8", "wr9", "wr10", "wr11", "wr12", "wr13", "wr14", "wr15"}},
-  { "iwmmxt_Cregnames", "Select control register names used on the Intel(r) Wireless MMX(tm) technology coprocessor",
+  { "iwmmxt_Cregnames", "Select control register names used on the Intel Wireless MMX technology coprocessor",
     {"wcid", "wcon", "wcssf", "wcasf", "reserved", "reserved", "reserved", "reserved", "wcgr0", "wcgr1", "wcgr2", "wcgr3", "reserved", "reserved", "reserved", "reserved"}}
 };
 
@@ -444,9 +445,11 @@ print_insn_arm (pc, info, given)
 
                    case 'A':
                      func (stream, "[%s", arm_regnames [(given >> 16) & 0xf]);
-                     if ((given & 0x01000000) != 0)
+
+                     if ((given & (1 << 24)) != 0)
                        {
                          int offset = given & 0xff;
+
                          if (offset)
                            func (stream, ", %s#%d]%s",
                                  ((given & 0x00800000) == 0 ? "-" : ""),
@@ -458,12 +461,18 @@ print_insn_arm (pc, info, given)
                      else
                        {
                          int offset = given & 0xff;
-                         if (offset)
-                           func (stream, "], %s#%d",
-                                 ((given & 0x00800000) == 0 ? "-" : ""),
-                                 offset * 4);
+
+                         func (stream, "]");
+
+                         if (given & (1 << 21))
+                           {
+                             if (offset)
+                               func (stream, ", %s#%d",
+                                     ((given & 0x00800000) == 0 ? "-" : ""),
+                                     offset * 4);
+                           }
                          else
-                           func (stream, "]");
+                           func (stream, ", {%d}", offset);
                        }
                      break;
 
@@ -1152,51 +1161,48 @@ parse_arm_disassembler_option (option)
       option += 10;
 
       for (i = NUM_ARM_REGNAMES; i--;)
-       if (streq (option, regnames[i].name))
+       if (strneq (option, regnames[i].name, strlen (regnames[i].name)))
          {
            regname_selected = i;
            break;
          }
 
       if (i < 0)
+       /* XXX - should break 'option' at following delimiter.  */
        fprintf (stderr, _("Unrecognised register name set: %s\n"), option);
     }
-  else if (streq (option, "force-thumb"))
+  else if (strneq (option, "force-thumb", 11))
     force_thumb = 1;
-  else if (streq (option, "no-force-thumb"))
+  else if (strneq (option, "no-force-thumb", 14))
     force_thumb = 0;
   else
+    /* XXX - should break 'option' at following delimiter.  */
     fprintf (stderr, _("Unrecognised disassembler option: %s\n"), option);
 
   return;
 }
 
-/* Parse the string of disassembler options, spliting it at whitespaces.  */
+/* Parse the string of disassembler options, spliting it at whitespaces
+   or commas.  (Whitespace separators supported for backwards compatibility).  */
 
 static void
 parse_disassembler_options (options)
      char * options;
 {
-  char * space;
-
   if (options == NULL)
     return;
 
-  do
+  while (*options)
     {
-      space = strchr (options, ' ');
-
-      if (space)
-       {
-         * space = '\0';
-         parse_arm_disassembler_option (options);
-         * space = ' ';
-         options = space + 1;
-       }
-      else
-       parse_arm_disassembler_option (options);
+      parse_arm_disassembler_option (options);
+
+      /* Skip forward to next seperator.  */
+      while ((*options) && (! ISSPACE (*options)) && (*options != ','))
+       ++ options;
+      /* Skip forward past seperators.  */
+      while (ISSPACE (*options) || (*options == ','))
+       ++ options;      
     }
-  while (space);
 }
 
 /* NOTE: There are no checks in these routines that
This page took 0.025658 seconds and 4 git commands to generate.