gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / opcodes / m68k-dis.c
index 88365706bd54dcb4a17280f194b00f8aded19828..ec896433f27076718c7f5e5d5c8b725592119303 100644 (file)
@@ -1,7 +1,5 @@
 /* Print Motorola 68k instructions.
-   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1986-2020 Free Software Foundation, Inc.
 
    This file is part of the GNU opcodes library.
 
    MA 02110-1301, USA.  */
 
 #include "sysdep.h"
-#include "dis-asm.h"
+#include "disassemble.h"
 #include "floatformat.h"
 #include "libiberty.h"
 #include "opintl.h"
-
+#include "cpu-m68k.h"
 #include "opcode/m68k.h"
 
 /* Local function prototypes.  */
@@ -59,13 +57,27 @@ static char *const reg_half_names[] =
 #define COERCE_SIGNED_CHAR(ch) ((int) (((ch) ^ 0x80) & 0xFF) - 128)
 #endif
 
+/* Error code of print_insn_arg's return value.  */
+
+enum print_insn_arg_error
+  {
+    /* An invalid operand is found.  */
+    PRINT_INSN_ARG_INVALID_OPERAND = -1,
+
+    /* An opcode table error.  */
+    PRINT_INSN_ARG_INVALID_OP_TABLE = -2,
+
+    /* A memory error.  */
+    PRINT_INSN_ARG_MEMORY_ERROR = -3,
+  };
+
 /* Get a 1 byte signed integer.  */
 #define NEXTBYTE(p, val)                       \
   do                                           \
     {                                          \
       p += 2;                                  \
-      if (FETCH_DATA (info, p) < 0)            \
-       return -3;                              \
+      if (!FETCH_DATA (info, p))               \
+       return PRINT_INSN_ARG_MEMORY_ERROR;     \
       val = COERCE_SIGNED_CHAR (p[-1]);                \
     }                                          \
   while (0)
@@ -77,22 +89,23 @@ static char *const reg_half_names[] =
   do                                           \
     {                                          \
       p += 2;                                  \
-      if (FETCH_DATA (info, p) < 0)            \
+      if (!FETCH_DATA (info, p))               \
        return ret_val;                         \
       val = COERCE16 ((p[-2] << 8) + p[-1]);   \
     }                                          \
-  while (0)                                            
+  while (0)
 
 /* Get a 4 byte signed integer.  */
-#define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
+#define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
 
 #define NEXTLONG(p, val, ret_val)                                      \
   do                                                                   \
     {                                                                  \
       p += 4;                                                          \
-      if (FETCH_DATA (info, p) < 0)                                    \
+      if (!FETCH_DATA (info, p))                                       \
        return ret_val;                                                 \
-      val = COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
+      val = COERCE32 (((((((unsigned) p[-4] << 8) + p[-3]) << 8)       \
+                       + p[-2]) << 8) + p[-1]);                        \
     }                                                                  \
   while (0)
 
@@ -101,9 +114,10 @@ static char *const reg_half_names[] =
   do                                                                   \
     {                                                                  \
       p += 4;                                                          \
-      if (FETCH_DATA (info, p) < 0)                                    \
-       return -3;                                                      \
-      val = (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
+      if (!FETCH_DATA (info, p))                                       \
+       return PRINT_INSN_ARG_MEMORY_ERROR;                             \
+      val = (((((((unsigned) p[-4] << 8) + p[-3]) << 8)                        \
+              + p[-2]) << 8) + p[-1]);                                 \
     }                                                                  \
   while (0)
 
@@ -112,8 +126,8 @@ static char *const reg_half_names[] =
   do                                                           \
     {                                                          \
       p += 4;                                                  \
-      if (FETCH_DATA (info, p) < 0)                            \
-       return -3;                                              \
+      if (!FETCH_DATA (info, p))                               \
+       return PRINT_INSN_ARG_MEMORY_ERROR;                     \
       floatformat_to_double (& floatformat_ieee_single_big,    \
                             (char *) p - 4, & val);            \
     }                                                          \
@@ -124,8 +138,8 @@ static char *const reg_half_names[] =
   do                                                           \
     {                                                          \
       p += 8;                                                  \
-      if (FETCH_DATA (info, p) , 0)                            \
-       return -3;                                              \
+      if (!FETCH_DATA (info, p))                               \
+       return PRINT_INSN_ARG_MEMORY_ERROR;                     \
       floatformat_to_double (& floatformat_ieee_double_big,    \
                             (char *) p - 8, & val);            \
     }                                                          \
@@ -136,8 +150,8 @@ static char *const reg_half_names[] =
   do                                                   \
     {                                                  \
       p += 12;                                         \
-      if (FETCH_DATA (info, p) < 0)                    \
-       return -3;                                      \
+      if (!FETCH_DATA (info, p))                       \
+       return PRINT_INSN_ARG_MEMORY_ERROR;             \
       floatformat_to_double (& floatformat_m68881_ext, \
                             (char *) p - 12, & val);   \
     }                                                  \
@@ -151,8 +165,8 @@ static char *const reg_half_names[] =
   do                                           \
     {                                          \
       p += 12;                                 \
-      if (FETCH_DATA (info, p) < 0)            \
-       return -3;                              \
+      if (!FETCH_DATA (info, p))               \
+       return PRINT_INSN_ARG_MEMORY_ERROR;     \
       val = 0.0;                               \
     }                                          \
   while (0)
@@ -161,8 +175,6 @@ static char *const reg_half_names[] =
 /* Maximum length of an instruction.  */
 #define MAXLEN 22
 
-#include <setjmp.h>
-
 struct private
 {
   /* Points to first byte not fetched.  */
@@ -171,11 +183,9 @@ struct private
   bfd_vma insn_start;
 };
 
-static fprintf_ftype save_printer;
-static void (* save_print_address) (bfd_vma, struct disassemble_info *);
-
 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
-   to ADDR (exclusive) are valid.  Returns 1 for success, 0 on error.  */
+   to ADDR (exclusive) are valid.  Returns 1 for success, 0 on memory
+   error.  */
 #define FETCH_DATA(info, addr) \
   ((addr) <= ((struct private *) (info->private_data))->max_fetched \
    ? 1 : fetch_data ((info), (addr)))
@@ -194,8 +204,6 @@ fetch_data (struct disassemble_info *info, bfd_byte *addr)
   if (status != 0)
     {
       (*info->memory_error_func) (status, start, info);
-      info->fprintf_func = save_printer;
-      info->print_address_func = save_print_address;
       return 0;
     }
   else
@@ -626,14 +634,13 @@ print_indexed (int basereg,
     {                                                  \
       val = fetch_arg (buffer, place, size, info);     \
       if (val < 0)                                     \
-       return -3;                                      \
+       return PRINT_INSN_ARG_MEMORY_ERROR;             \
     }                                                  \
   while (0)
 
 /* Returns number of bytes "eaten" by the operand, or
-   return -1 if an invalid operand was found, or -2 if
-   an opcode tabe error was found or -3 to simply abort.
-   ADDR is the pc for this arg to be relative to.  */
+   return enum print_insn_arg_error.  ADDR is the pc for this arg to be
+   relative to.  */
 
 static int
 print_insn_arg (const char *d,
@@ -659,7 +666,7 @@ print_insn_arg (const char *d,
       {
         static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
         FETCH_ARG (2, val);
-       (*info->fprintf_func) (info->stream, cacheFieldName[val]);
+       (*info->fprintf_func) (info->stream, "%s", cacheFieldName[val]);
         break;
       }
 
@@ -704,35 +711,64 @@ print_insn_arg (const char *d,
     case 'J':
       {
        /* FIXME: There's a problem here, different m68k processors call the
-          same address different names. This table can't get it right
-          because it doesn't know which processor it's disassembling for.  */
-       static const struct { char *name; int value; } names[]
-         = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
-            {"%tc",  0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
-             {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
-            {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
-            {"%msp", 0x803}, {"%isp", 0x804},
-            /* reg c04 is sometimes called flashbar or rambar.
-               rec c05 is also sometimes called rambar.  */
-            {"%rambar0", 0xc04}, {"%rambar1", 0xc05},
-
-            /* Should we be calling this psr like we do in case 'Y'?  */
-            {"%mmusr",0x805},
-
-             {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808},
-
-            /* Fido added these.  */
-             {"%cac", 0xffe}, {"%mbo", 0xfff}};
+          same address different names.  The tables below try to get it right
+          using info->mach, but only for v4e.  */
+       struct regname { char * name; int value; };
+       static const struct regname names[] =
+         {
+           {"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
+           {"%tc",  0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
+           {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
+           {"%rgpiobar", 0x009}, {"%acr4",0x00c},
+           {"%acr5",0x00d}, {"%acr6",0x00e}, {"%acr7", 0x00f},
+           {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
+           {"%msp", 0x803}, {"%isp", 0x804},
+           {"%pc", 0x80f},
+           /* Reg c04 is sometimes called flashbar or rambar.
+              Reg c05 is also sometimes called rambar.  */
+           {"%rambar0", 0xc04}, {"%rambar1", 0xc05},
+
+           /* reg c0e is sometimes called mbar2 or secmbar.
+              reg c0f is sometimes called mbar.  */
+           {"%mbar0", 0xc0e}, {"%mbar1", 0xc0f},
+
+           /* Should we be calling this psr like we do in case 'Y'?  */
+           {"%mmusr",0x805},
+
+           {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808},
+
+           /* Fido added these.  */
+           {"%cac", 0xffe}, {"%mbo", 0xfff}
+       };
+       /* Alternate names for v4e (MCF5407/5445x/MCF547x/MCF548x), at least.  */
+       static const struct regname names_v4e[] =
+         {
+           {"%asid",0x003}, {"%acr0",0x004}, {"%acr1",0x005},
+           {"%acr2",0x006}, {"%acr3",0x007}, {"%mmubar",0x008},
+         };
+       unsigned int arch_mask;
 
+       arch_mask = bfd_m68k_mach_to_features (info->mach);
        FETCH_ARG (12, val);
-       for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
+       if (arch_mask & (mcfisa_b | mcfisa_c))
+         {
+           for (regno = ARRAY_SIZE (names_v4e); --regno >= 0;)
+             if (names_v4e[regno].value == val)
+               {
+                 (*info->fprintf_func) (info->stream, "%s", names_v4e[regno].name);
+                 break;
+               }
+           if (regno >= 0)
+             break;
+         }
+       for (regno = ARRAY_SIZE (names) - 1; regno >= 0; regno--)
          if (names[regno].value == val)
            {
              (*info->fprintf_func) (info->stream, "%s", names[regno].name);
              break;
            }
        if (regno < 0)
-         (*info->fprintf_func) (info->stream, "%d", val);
+         (*info->fprintf_func) (info->stream, "0x%x", val);
       }
       break;
 
@@ -768,7 +804,7 @@ print_insn_arg (const char *d,
          static char *const scalefactor_name[] = { "<<", ">>" };
 
          FETCH_ARG (1, val);
-         (*info->fprintf_func) (info->stream, scalefactor_name[val]);
+         (*info->fprintf_func) (info->stream, "%s", scalefactor_name[val]);
        }
       else
        {
@@ -844,7 +880,7 @@ print_insn_arg (const char *d,
          (*info->fprintf_func) (info->stream, "{#%d}", val);
        }
       else
-       return -1;
+       return PRINT_INSN_ARG_INVALID_OPERAND;
       break;
 
     case '#':
@@ -861,11 +897,11 @@ print_insn_arg (const char *d,
       else if (place == 'b')
        NEXTBYTE (p1, val);
       else if (place == 'w' || place == 'W')
-       NEXTWORD (p1, val, -3);
+       NEXTWORD (p1, val, PRINT_INSN_ARG_MEMORY_ERROR);
       else if (place == 'l')
-       NEXTLONG (p1, val, -3);
+       NEXTLONG (p1, val, PRINT_INSN_ARG_MEMORY_ERROR);
       else
-       return -2;
+       return PRINT_INSN_ARG_INVALID_OP_TABLE;
 
       (*info->fprintf_func) (info->stream, "#%d", val);
       break;
@@ -876,26 +912,26 @@ print_insn_arg (const char *d,
       else if (place == 'B')
        disp = COERCE_SIGNED_CHAR (buffer[1]);
       else if (place == 'w' || place == 'W')
-       NEXTWORD (p, disp, -3);
+       NEXTWORD (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
       else if (place == 'l' || place == 'L' || place == 'C')
-       NEXTLONG (p, disp, -3);
+       NEXTLONG (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
       else if (place == 'g')
        {
          NEXTBYTE (buffer, disp);
          if (disp == 0)
-           NEXTWORD (p, disp, -3);
+           NEXTWORD (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
          else if (disp == -1)
-           NEXTLONG (p, disp, -3);
+           NEXTLONG (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
        }
       else if (place == 'c')
        {
          if (buffer[1] & 0x40)         /* If bit six is one, long offset.  */
-           NEXTLONG (p, disp, -3);
+           NEXTLONG (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
          else
-           NEXTWORD (p, disp, -3);
+           NEXTWORD (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
        }
       else
-       return -2;
+       return PRINT_INSN_ARG_INVALID_OP_TABLE;
 
       (*info->print_address_func) (addr + disp, info);
       break;
@@ -904,7 +940,7 @@ print_insn_arg (const char *d,
       {
        int val1;
 
-       NEXTWORD (p, val, -3);
+       NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
        FETCH_ARG (3, val1);
        (*info->fprintf_func) (info->stream, "%s@(%d)", reg_names[val1 + 8], val);
        break;
@@ -932,14 +968,14 @@ print_insn_arg (const char *d,
       else if (val == 3)
        (*info->fprintf_func) (info->stream, ">>");
       else
-       return -1;
+       return PRINT_INSN_ARG_INVALID_OPERAND;
       break;
 
     case 'I':
       /* Get coprocessor ID... */
       val = fetch_arg (buffer, 'd', 3, info);
       if (val < 0)
-       return -3;
+       return PRINT_INSN_ARG_MEMORY_ERROR;
       if (val != 1)                            /* Unusual coprocessor ID?  */
        (*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
       break;
@@ -972,19 +1008,19 @@ print_insn_arg (const char *d,
        {
          val = fetch_arg (buffer, 'x', 6, info);
          if (val < 0)
-           return -3;
+           return PRINT_INSN_ARG_MEMORY_ERROR;
          val = ((val & 7) << 3) + ((val >> 3) & 7);
        }
       else
        {
          val = fetch_arg (buffer, 's', 6, info);
          if (val < 0)
-           return -3;
+           return PRINT_INSN_ARG_MEMORY_ERROR;
        }
 
       /* If the <ea> is invalid for *d, then reject this match.  */
       if (!m68k_valid_ea (*d, val))
-       return -1;
+       return PRINT_INSN_ARG_INVALID_OPERAND;
 
       /* Get register number assuming address register.  */
       regno = (val & 7) + 8;
@@ -1012,21 +1048,21 @@ print_insn_arg (const char *d,
          break;
 
        case 5:
-         NEXTWORD (p, val, -3);
+         NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
          (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
          break;
 
        case 6:
          p = print_indexed (regno, p, addr, info);
          if (p == NULL)
-           return -3;
+           return PRINT_INSN_ARG_MEMORY_ERROR;
          break;
 
        case 7:
          switch (val & 7)
            {
            case 0:
-             NEXTWORD (p, val, -3);
+             NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
              (*info->print_address_func) (val, info);
              break;
 
@@ -1036,7 +1072,7 @@ print_insn_arg (const char *d,
              break;
 
            case 2:
-             NEXTWORD (p, val, -3);
+             NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
              (*info->fprintf_func) (info->stream, "%%pc@(");
              (*info->print_address_func) (addr + val, info);
              (*info->fprintf_func) (info->stream, ")");
@@ -1045,7 +1081,7 @@ print_insn_arg (const char *d,
            case 3:
              p = print_indexed (-1, p, addr, info);
              if (p == NULL)
-               return -3;
+               return PRINT_INSN_ARG_MEMORY_ERROR;
              break;
 
            case 4:
@@ -1058,12 +1094,12 @@ print_insn_arg (const char *d,
                  break;
 
                case 'w':
-                 NEXTWORD (p, val, -3);
+                 NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
                  flt_p = 0;
                  break;
 
                case 'l':
-                 NEXTLONG (p, val, -3);
+                 NEXTLONG (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
                  flt_p = 0;
                  break;
 
@@ -1084,16 +1120,16 @@ print_insn_arg (const char *d,
                  break;
 
                default:
-                 return -1;
+                 return PRINT_INSN_ARG_INVALID_OPERAND;
              }
              if (flt_p)        /* Print a float? */
-               (*info->fprintf_func) (info->stream, "#%g", flval);
+               (*info->fprintf_func) (info->stream, "#0e%g", flval);
              else
                (*info->fprintf_func) (info->stream, "#%d", val);
              break;
 
            default:
-             return -1;
+             return PRINT_INSN_ARG_INVALID_OPERAND;
            }
        }
 
@@ -1114,7 +1150,7 @@ print_insn_arg (const char *d,
          {
            char doneany;
            p1 = buffer + 2;
-           NEXTWORD (p1, val, -3);
+           NEXTWORD (p1, val, PRINT_INSN_ARG_MEMORY_ERROR);
            /* Move the pointer ahead if this point is farther ahead
               than the last.  */
            p = p1 > p ? p1 : p;
@@ -1195,11 +1231,12 @@ print_insn_arg (const char *d,
            (*info->fprintf_func) (info->stream, "%s", fpcr_names[val]);
          }
        else
-         return -2;
+         return PRINT_INSN_ARG_INVALID_OP_TABLE;
       break;
 
     case 'X':
       place = '8';
+      /* Fall through.  */
     case 'Y':
     case 'Z':
     case 'W':
@@ -1208,7 +1245,6 @@ print_insn_arg (const char *d,
     case '2':
     case '3':
       {
-       int val;
        char *name = 0;
 
        FETCH_ARG (5, val);
@@ -1290,14 +1326,15 @@ print_insn_arg (const char *d,
       break;
 
     default:
-      return -2;
+      return PRINT_INSN_ARG_INVALID_OP_TABLE;
     }
 
   return p - p0;
 }
 
 /* Try to match the current instruction to best and if so, return the
-   number of bytes consumed from the instruction stream, else zero.  */
+   number of bytes consumed from the instruction stream, else zero.
+   Return -1 on memory error.  */
 
 static int
 match_insn_m68k (bfd_vma memaddr,
@@ -1317,7 +1354,7 @@ match_insn_m68k (bfd_vma memaddr,
 
   if (*args == '.')
     args++;
-  
+
   /* Point at first word of argument data,
      and at descriptor for first argument.  */
   p = buffer + 2;
@@ -1381,12 +1418,14 @@ match_insn_m68k (bfd_vma memaddr,
         this because we know exactly what the second word is, and we
         aren't going to print anything based on it.  */
       p = buffer + 6;
-      FETCH_DATA (info, p);
+      if (!FETCH_DATA (info, p))
+       return -1;
       buffer[2] = buffer[4];
       buffer[3] = buffer[5];
     }
 
-  FETCH_DATA (info, p);
+  if (!FETCH_DATA (info, p))
+    return -1;
 
   save_p = p;
   info->print_address_func = dummy_print_address;
@@ -1400,14 +1439,13 @@ match_insn_m68k (bfd_vma memaddr,
 
       if (eaten >= 0)
        p += eaten;
-      else if (eaten == -1)
+      else if (eaten == PRINT_INSN_ARG_INVALID_OPERAND
+              || eaten == PRINT_INSN_ARG_MEMORY_ERROR)
        {
          info->fprintf_func = save_printer;
          info->print_address_func = save_print_address;
-         return 0;
+         return eaten == PRINT_INSN_ARG_MEMORY_ERROR ? -1 : 0;
        }
-      else if (eaten == -3)
-       return 0;
       else
        {
          /* We must restore the print functions before trying to print the
@@ -1448,7 +1486,8 @@ match_insn_m68k (bfd_vma memaddr,
 /* Try to interpret the instruction at address MEMADDR as one that
    can execute on a processor with the features given by ARCH_MASK.
    If successful, print the instruction to INFO->STREAM and return
-   its length in bytes.  Return 0 otherwise.  */
+   its length in bytes.  Return 0 otherwise.  Return -1 on memory
+   error.  */
 
 static int
 m68k_scan_mask (bfd_vma memaddr, disassemble_info *info,
@@ -1490,7 +1529,8 @@ m68k_scan_mask (bfd_vma memaddr, disassemble_info *info,
        *opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
     }
 
-  FETCH_DATA (info, buffer + 2);
+  if (!FETCH_DATA (info, buffer + 2))
+    return -1;
   major_opcode = (buffer[0] >> 4) & 15;
 
   for (i = 0; i < numopcodes[major_opcode]; i++)
@@ -1566,7 +1606,7 @@ m68k_scan_mask (bfd_vma memaddr, disassemble_info *info,
        }
     }
   return 0;
-}              
+}
 
 /* Print the m68k instruction at address MEMADDR in debugged memory,
    on INFO->STREAM.  Returns length of the instruction, in bytes.  */
@@ -1574,19 +1614,12 @@ m68k_scan_mask (bfd_vma memaddr, disassemble_info *info,
 int
 print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
 {
-  fprintf_ftype save_printer;
-  void (* save_print_address) (bfd_vma, struct disassemble_info *);
   unsigned int arch_mask;
   struct private priv;
   int val;
 
   bfd_byte *buffer = priv.the_buffer;
 
-  /* Save these printing functions in case we need to restore them
-     later.  */
-  save_printer = info->fprintf_func;
-  save_print_address = info->print_address_func;
-
   info->private_data = & priv;
   /* Tell objdump to use two bytes per chunk
      and six bytes per line for displaying raw data.  */
@@ -1602,7 +1635,7 @@ print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
       /* First try printing an m680x0 instruction.  Try printing a Coldfire
         one if that fails.  */
       val = m68k_scan_mask (memaddr, info, m68k_mask);
-      if (val == 0)
+      if (val <= 0)
        val = m68k_scan_mask (memaddr, info, mcf_mask);
     }
   else
@@ -1612,11 +1645,7 @@ print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
 
   if (val == 0)
     /* Handle undefined instructions.  */
-    info->fprintf_func (info->stream, "0%o", (buffer[0] << 8) + buffer[1]);
-
-  /* Restore print functions.  */
-  info->fprintf_func = save_printer;
-  info->print_address_func = save_print_address;
+    info->fprintf_func (info->stream, ".short 0x%04x", (buffer[0] << 8) + buffer[1]);
 
   return val ? val : 2;
 }
This page took 0.053017 seconds and 4 git commands to generate.