Lint fixes from Paul Eggert (eggert@twinsun.com):
[deliverable/binutils-gdb.git] / gdb / m68k-pinsn.c
index bef5eb890dcc0d6dd391a7603570edb7f49863d6..b67f5ccfb3c748fb8d53edfbab5d0dc7241f3c8b 100644 (file)
@@ -1,5 +1,5 @@
 /* Print Motorola 68k instructions for GDB, the GNU debugger.
-   Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1986, 1987, 1989, 1991, 1992, 1993 Free Software Foundation, Inc.
 
 This file is part of GDB.
 
@@ -19,10 +19,24 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #include "defs.h"
 #include "symtab.h"
-#include "opcode/m68k.h"
 #include "gdbcore.h"
 #include "ieee-float.h"
 
+/* Opcode/m68k.h is a massive table.  As a kludge, break it up into
+   two pieces.  This makes nonportable C -- FIXME -- it assumes that
+   two data items declared near each other will be contiguous in
+   memory.  This kludge can be removed, FIXME, when GCC is fixed to not
+   be a hog about initializers.  */
+
+#ifdef __GNUC__
+#define        BREAK_UP_BIG_DECL       }; \
+                               struct m68k_opcode m68k_opcodes_2[] = {
+#define        AND_OTHER_PART          sizeof (m68k_opcodes_2)
+#endif
+
+#include "opcode/m68k.h"
+
+
 /* Local function prototypes */
 
 static int
@@ -41,12 +55,9 @@ print_insn_arg PARAMS ((char *, unsigned char *, unsigned char *, CORE_ADDR,
 /* 68k instructions are never longer than this many bytes.  */
 #define MAXLEN 22
 
-/* Number of elements in the opcode table.  */
-#define NOPCODES (sizeof m68k_opcodes / sizeof m68k_opcodes[0])
-
-extern char *reg_names[];
-char *fpcr_names[] = { "", "fpiar", "fpsr", "fpiar/fpsr", "fpcr",
-                    "fpiar/fpcr", "fpsr/fpcr", "fpiar-fpcr"};
+const char * const fpcr_names[] = {
+  "", "fpiar", "fpsr", "fpiar/fpsr", "fpcr",
+  "fpiar/fpcr", "fpsr/fpcr", "fpiar/fpsr/fpcr"};
 
 /* Define accessors for 68K's 1, 2, and 4-byte signed quantities.
    The _SHIFT values move the quantity to the high order end of an
@@ -92,7 +103,7 @@ print_insn (memaddr, stream)
 
   bestmask = 0;
   best = -1;
-  for (i = 0; i < NOPCODES; i++)
+  for (i = 0; i < numopcodes; i++)
     {
       register unsigned int opcode = m68k_opcodes[i].opcode;
       register unsigned int match = m68k_opcodes[i].match;
@@ -181,13 +192,37 @@ print_insn_arg (d, buffer, p, addr, stream)
   register int val;
   register int place = d[1];
   int regno;
-  register char *regname;
+  register const char *regname;
   register unsigned char *p1;
   double flval;
   int flt_p;
 
   switch (*d)
     {
+    case 'c':          /* cache identifier */
+      {
+        static char *cacheFieldName[] = { "NOP", "dc", "ic", "bc" };
+        val = fetch_arg (buffer, place, 2);
+        fprintf_filtered (stream, cacheFieldName[val]);
+        break;
+      }
+
+    case 'a':          /* address register indirect only. Cf. case '+'. */
+      {
+        fprintf_filtered (stream,
+                         "%s@",
+                         reg_names [fetch_arg (buffer, place, 3) + 8]);
+        break;
+      }
+
+    case '_':          /* 32-bit absolute address for move16. */
+      {
+        val = NEXTLONG (p);
+        fprintf_filtered (stream, "@#");
+       print_address (val, stream);
+        break;
+      }
+
     case 'C':
       fprintf_filtered (stream, "ccr");
       break;
@@ -204,8 +239,11 @@ print_insn_arg (d, buffer, p, addr, stream)
       {
        static struct { char *name; int value; } names[]
          = {{"sfc", 0x000}, {"dfc", 0x001}, {"cacr", 0x002},
+            {"tc",  0x003}, {"itt0",0x004}, {"itt1", 0x005},
+             {"dtt0",0x006}, {"dtt1",0x007},
             {"usp", 0x800}, {"vbr", 0x801}, {"caar", 0x802},
-            {"msp", 0x803}, {"isp", 0x804}};
+            {"msp", 0x803}, {"isp", 0x804}, {"mmusr",0x805},
+             {"urp", 0x806}, {"srp", 0x807}};
 
        val = fetch_arg (buffer, place, 12);
        for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
@@ -252,6 +290,10 @@ print_insn_arg (d, buffer, p, addr, stream)
       fprintf_filtered (stream, "%s", reg_names[fetch_arg (buffer, place, 4)]);
       break;
 
+    case 'r':
+      fprintf_filtered (stream, "%s@", reg_names[fetch_arg (buffer, place, 4)]);
+      break;
+
     case 'F':
       fprintf_filtered (stream, "fp%d", fetch_arg (buffer, place, 3));
       break;
@@ -372,6 +414,7 @@ print_insn_arg (d, buffer, p, addr, stream)
     case '?':
     case '/':
     case '&':
+    case '`':
 
       if (place == 'd')
        {
@@ -466,10 +509,13 @@ print_insn_arg (d, buffer, p, addr, stream)
                  flval = NEXTDOUBLE(p);
                  break;
 
+#ifdef HAVE_68881
                case 'x':
-                 ieee_extended_to_double (ext_format_68881, p, &flval);
+                 ieee_extended_to_double (&ext_format_68881,
+                                          (char *)p, &flval);
                  p += 12;
                  break;
+#endif
 
                case 'p':
                  p += 12;
@@ -653,12 +699,18 @@ fetch_arg (buffer, code, bits)
       val >>= 10;
       break;
 
+    case 'e':
+      val = (buffer[1] >> 6);
+      break;
+
     default:
       abort ();
     }
 
   switch (bits)
     {
+    case 2:
+      return val & 3;
     case 3:
       return val & 7;
     case 4:
This page took 0.025125 seconds and 4 git commands to generate.