OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [start/] [gdb-5.0/] [opcodes/] [m68k-dis.c] - Diff between revs 579 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 579 Rev 1765
/* Print Motorola 68k instructions.
/* Print Motorola 68k instructions.
   Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 97, 98, 1999
   Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 97, 98, 1999
   Free Software Foundation, Inc.
   Free Software Foundation, Inc.
 
 
This file is free software; you can redistribute it and/or modify
This file is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 
#include "dis-asm.h"
#include "dis-asm.h"
#include "floatformat.h"
#include "floatformat.h"
#include <libiberty.h>
#include <libiberty.h>
#include "opintl.h"
#include "opintl.h"
 
 
#include "opcode/m68k.h"
#include "opcode/m68k.h"
 
 
/* Local function prototypes */
/* Local function prototypes */
 
 
static int
static int
fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
 
 
static void
static void
dummy_print_address PARAMS ((bfd_vma, struct disassemble_info *));
dummy_print_address PARAMS ((bfd_vma, struct disassemble_info *));
 
 
static int
static int
fetch_arg PARAMS ((unsigned char *, int, int, disassemble_info *));
fetch_arg PARAMS ((unsigned char *, int, int, disassemble_info *));
 
 
static void
static void
print_base PARAMS ((int, bfd_vma, disassemble_info*));
print_base PARAMS ((int, bfd_vma, disassemble_info*));
 
 
static unsigned char *
static unsigned char *
print_indexed PARAMS ((int, unsigned char *, bfd_vma, disassemble_info *));
print_indexed PARAMS ((int, unsigned char *, bfd_vma, disassemble_info *));
 
 
static int
static int
print_insn_arg PARAMS ((const char *, unsigned char *, unsigned char *,
print_insn_arg PARAMS ((const char *, unsigned char *, unsigned char *,
                        bfd_vma, disassemble_info *));
                        bfd_vma, disassemble_info *));
 
 
CONST char * CONST fpcr_names[] = {
CONST char * CONST fpcr_names[] = {
  "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
  "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
  "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"};
  "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"};
 
 
static char *const reg_names[] = {
static char *const reg_names[] = {
  "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
  "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
  "%ps", "%pc"};
  "%ps", "%pc"};
 
 
/* Sign-extend an (unsigned char). */
/* Sign-extend an (unsigned char). */
#if __STDC__ == 1
#if __STDC__ == 1
#define COERCE_SIGNED_CHAR(ch) ((signed char)(ch))
#define COERCE_SIGNED_CHAR(ch) ((signed char)(ch))
#else
#else
#define COERCE_SIGNED_CHAR(ch) ((int)(((ch) ^ 0x80) & 0xFF) - 128)
#define COERCE_SIGNED_CHAR(ch) ((int)(((ch) ^ 0x80) & 0xFF) - 128)
#endif
#endif
 
 
/* Get a 1 byte signed integer.  */
/* Get a 1 byte signed integer.  */
#define NEXTBYTE(p)  (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
#define NEXTBYTE(p)  (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
 
 
/* Get a 2 byte signed integer.  */
/* Get a 2 byte signed integer.  */
#define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
#define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
#define NEXTWORD(p)  \
#define NEXTWORD(p)  \
  (p += 2, FETCH_DATA (info, p), \
  (p += 2, FETCH_DATA (info, p), \
   COERCE16 ((p[-2] << 8) + p[-1]))
   COERCE16 ((p[-2] << 8) + p[-1]))
 
 
/* Get a 4 byte signed integer.  */
/* Get a 4 byte signed integer.  */
#define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
#define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
#define NEXTLONG(p)  \
#define NEXTLONG(p)  \
  (p += 4, FETCH_DATA (info, p), \
  (p += 4, FETCH_DATA (info, p), \
   (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
   (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
 
 
/* Get a 4 byte unsigned integer.  */
/* Get a 4 byte unsigned integer.  */
#define NEXTULONG(p)  \
#define NEXTULONG(p)  \
  (p += 4, FETCH_DATA (info, p), \
  (p += 4, FETCH_DATA (info, p), \
   (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
   (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
 
 
/* Get a single precision float.  */
/* Get a single precision float.  */
#define NEXTSINGLE(val, p) \
#define NEXTSINGLE(val, p) \
  (p += 4, FETCH_DATA (info, p), \
  (p += 4, FETCH_DATA (info, p), \
   floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
   floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
 
 
/* Get a double precision float.  */
/* Get a double precision float.  */
#define NEXTDOUBLE(val, p) \
#define NEXTDOUBLE(val, p) \
  (p += 8, FETCH_DATA (info, p), \
  (p += 8, FETCH_DATA (info, p), \
   floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
   floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
 
 
/* Get an extended precision float.  */
/* Get an extended precision float.  */
#define NEXTEXTEND(val, p) \
#define NEXTEXTEND(val, p) \
  (p += 12, FETCH_DATA (info, p), \
  (p += 12, FETCH_DATA (info, p), \
   floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
   floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
 
 
/* Need a function to convert from packed to double
/* Need a function to convert from packed to double
   precision.   Actually, it's easier to print a
   precision.   Actually, it's easier to print a
   packed number than a double anyway, so maybe
   packed number than a double anyway, so maybe
   there should be a special case to handle this... */
   there should be a special case to handle this... */
#define NEXTPACKED(p) \
#define NEXTPACKED(p) \
  (p += 12, FETCH_DATA (info, p), 0.0)
  (p += 12, FETCH_DATA (info, p), 0.0)
 
 


/* Maximum length of an instruction.  */
/* Maximum length of an instruction.  */
#define MAXLEN 22
#define MAXLEN 22
 
 
#include <setjmp.h>
#include <setjmp.h>
 
 
struct private
struct private
{
{
  /* Points to first byte not fetched.  */
  /* Points to first byte not fetched.  */
  bfd_byte *max_fetched;
  bfd_byte *max_fetched;
  bfd_byte the_buffer[MAXLEN];
  bfd_byte the_buffer[MAXLEN];
  bfd_vma insn_start;
  bfd_vma insn_start;
  jmp_buf bailout;
  jmp_buf bailout;
};
};
 
 
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
   to ADDR (exclusive) are valid.  Returns 1 for success, longjmps
   on error.  */
   on error.  */
#define FETCH_DATA(info, addr) \
#define FETCH_DATA(info, addr) \
  ((addr) <= ((struct private *)(info->private_data))->max_fetched \
  ((addr) <= ((struct private *)(info->private_data))->max_fetched \
   ? 1 : fetch_data ((info), (addr)))
   ? 1 : fetch_data ((info), (addr)))
 
 
static int
static int
fetch_data (info, addr)
fetch_data (info, addr)
     struct disassemble_info *info;
     struct disassemble_info *info;
     bfd_byte *addr;
     bfd_byte *addr;
{
{
  int status;
  int status;
  struct private *priv = (struct private *)info->private_data;
  struct private *priv = (struct private *)info->private_data;
  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
 
 
  status = (*info->read_memory_func) (start,
  status = (*info->read_memory_func) (start,
                                      priv->max_fetched,
                                      priv->max_fetched,
                                      addr - priv->max_fetched,
                                      addr - priv->max_fetched,
                                      info);
                                      info);
  if (status != 0)
  if (status != 0)
    {
    {
      (*info->memory_error_func) (status, start, info);
      (*info->memory_error_func) (status, start, info);
      longjmp (priv->bailout, 1);
      longjmp (priv->bailout, 1);
    }
    }
  else
  else
    priv->max_fetched = addr;
    priv->max_fetched = addr;
  return 1;
  return 1;
}
}


/* This function is used to print to the bit-bucket. */
/* This function is used to print to the bit-bucket. */
static int
static int
#ifdef __STDC__
#ifdef __STDC__
dummy_printer (FILE * file, const char * format, ...)
dummy_printer (FILE * file, const char * format, ...)
#else
#else
dummy_printer (file) FILE *file;
dummy_printer (file) FILE *file;
#endif
#endif
 { return 0; }
 { return 0; }
 
 
static void
static void
dummy_print_address (vma, info)
dummy_print_address (vma, info)
     bfd_vma vma;
     bfd_vma vma;
     struct disassemble_info *info;
     struct disassemble_info *info;
{
{
}
}
 
 
/* Print the m68k instruction at address MEMADDR in debugged memory,
/* Print the m68k instruction at address MEMADDR in debugged memory,
   on INFO->STREAM.  Returns length of the instruction, in bytes.  */
   on INFO->STREAM.  Returns length of the instruction, in bytes.  */
 
 
int
int
print_insn_m68k (memaddr, info)
print_insn_m68k (memaddr, info)
     bfd_vma memaddr;
     bfd_vma memaddr;
     disassemble_info *info;
     disassemble_info *info;
{
{
  register int i;
  register int i;
  register unsigned char *p;
  register unsigned char *p;
  unsigned char *save_p;
  unsigned char *save_p;
  register const char *d;
  register const char *d;
  register unsigned long bestmask;
  register unsigned long bestmask;
  const struct m68k_opcode *best = 0;
  const struct m68k_opcode *best = 0;
  unsigned int arch_mask;
  unsigned int arch_mask;
  struct private priv;
  struct private priv;
  bfd_byte *buffer = priv.the_buffer;
  bfd_byte *buffer = priv.the_buffer;
  fprintf_ftype save_printer = info->fprintf_func;
  fprintf_ftype save_printer = info->fprintf_func;
  void (*save_print_address) PARAMS((bfd_vma, struct disassemble_info*))
  void (*save_print_address) PARAMS((bfd_vma, struct disassemble_info*))
    = info->print_address_func;
    = info->print_address_func;
  int major_opcode;
  int major_opcode;
  static int numopcodes[16];
  static int numopcodes[16];
  static const struct m68k_opcode **opcodes[16];
  static const struct m68k_opcode **opcodes[16];
 
 
  if (!opcodes[0])
  if (!opcodes[0])
    {
    {
      /* Speed up the matching by sorting the opcode table on the upper
      /* Speed up the matching by sorting the opcode table on the upper
         four bits of the opcode.  */
         four bits of the opcode.  */
      const struct m68k_opcode **opc_pointer[16];
      const struct m68k_opcode **opc_pointer[16];
 
 
      /* First count how many opcodes are in each of the sixteen buckets.  */
      /* First count how many opcodes are in each of the sixteen buckets.  */
      for (i = 0; i < m68k_numopcodes; i++)
      for (i = 0; i < m68k_numopcodes; i++)
        numopcodes[(m68k_opcodes[i].opcode >> 28) & 15]++;
        numopcodes[(m68k_opcodes[i].opcode >> 28) & 15]++;
 
 
      /* Then create a sorted table of pointers that point into the
      /* Then create a sorted table of pointers that point into the
         unsorted table.  */
         unsorted table.  */
      opc_pointer[0] = ((const struct m68k_opcode **)
      opc_pointer[0] = ((const struct m68k_opcode **)
                        xmalloc (sizeof (struct m68k_opcode *)
                        xmalloc (sizeof (struct m68k_opcode *)
                                 * m68k_numopcodes));
                                 * m68k_numopcodes));
      opcodes[0] = opc_pointer[0];
      opcodes[0] = opc_pointer[0];
      for (i = 1; i < 16; i++)
      for (i = 1; i < 16; i++)
        {
        {
          opc_pointer[i] = opc_pointer[i - 1] + numopcodes[i - 1];
          opc_pointer[i] = opc_pointer[i - 1] + numopcodes[i - 1];
          opcodes[i] = opc_pointer[i];
          opcodes[i] = opc_pointer[i];
        }
        }
 
 
      for (i = 0; i < m68k_numopcodes; i++)
      for (i = 0; i < m68k_numopcodes; i++)
        *opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
        *opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
 
 
    }
    }
 
 
  info->private_data = (PTR) &priv;
  info->private_data = (PTR) &priv;
  /* Tell objdump to use two bytes per chunk and six bytes per line for
  /* Tell objdump to use two bytes per chunk and six bytes per line for
     displaying raw data.  */
     displaying raw data.  */
  info->bytes_per_chunk = 2;
  info->bytes_per_chunk = 2;
  info->bytes_per_line = 6;
  info->bytes_per_line = 6;
  info->display_endian = BFD_ENDIAN_BIG;
  info->display_endian = BFD_ENDIAN_BIG;
  priv.max_fetched = priv.the_buffer;
  priv.max_fetched = priv.the_buffer;
  priv.insn_start = memaddr;
  priv.insn_start = memaddr;
  if (setjmp (priv.bailout) != 0)
  if (setjmp (priv.bailout) != 0)
    /* Error return.  */
    /* Error return.  */
    return -1;
    return -1;
 
 
  switch (info->mach)
  switch (info->mach)
    {
    {
    default:
    default:
    case 0:
    case 0:
      arch_mask = (unsigned int) -1;
      arch_mask = (unsigned int) -1;
      break;
      break;
    case bfd_mach_m68000:
    case bfd_mach_m68000:
      arch_mask = m68000;
      arch_mask = m68000;
      break;
      break;
    case bfd_mach_m68008:
    case bfd_mach_m68008:
      arch_mask = m68008;
      arch_mask = m68008;
      break;
      break;
    case bfd_mach_m68010:
    case bfd_mach_m68010:
      arch_mask = m68010;
      arch_mask = m68010;
      break;
      break;
    case bfd_mach_m68020:
    case bfd_mach_m68020:
      arch_mask = m68020;
      arch_mask = m68020;
      break;
      break;
    case bfd_mach_m68030:
    case bfd_mach_m68030:
      arch_mask = m68030;
      arch_mask = m68030;
      break;
      break;
    case bfd_mach_m68040:
    case bfd_mach_m68040:
      arch_mask = m68040;
      arch_mask = m68040;
      break;
      break;
    case bfd_mach_m68060:
    case bfd_mach_m68060:
      arch_mask = m68060;
      arch_mask = m68060;
      break;
      break;
    }
    }
 
 
  arch_mask |= m68881 | m68851;
  arch_mask |= m68881 | m68851;
 
 
  bestmask = 0;
  bestmask = 0;
  FETCH_DATA (info, buffer + 2);
  FETCH_DATA (info, buffer + 2);
  major_opcode = (buffer[0] >> 4) & 15;
  major_opcode = (buffer[0] >> 4) & 15;
  for (i = 0; i < numopcodes[major_opcode]; i++)
  for (i = 0; i < numopcodes[major_opcode]; i++)
    {
    {
      const struct m68k_opcode *opc = opcodes[major_opcode][i];
      const struct m68k_opcode *opc = opcodes[major_opcode][i];
      unsigned long opcode = opc->opcode;
      unsigned long opcode = opc->opcode;
      unsigned long match = opc->match;
      unsigned long match = opc->match;
 
 
      if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
      if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
          && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
          && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
          /* Only fetch the next two bytes if we need to.  */
          /* Only fetch the next two bytes if we need to.  */
          && (((0xffff & match) == 0)
          && (((0xffff & match) == 0)
              ||
              ||
              (FETCH_DATA (info, buffer + 4)
              (FETCH_DATA (info, buffer + 4)
               && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
               && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
               && ((0xff & buffer[3] & match) == (0xff & opcode)))
               && ((0xff & buffer[3] & match) == (0xff & opcode)))
              )
              )
          && (opc->arch & arch_mask) != 0)
          && (opc->arch & arch_mask) != 0)
        {
        {
          /* Don't use for printout the variants of divul and divsl
          /* Don't use for printout the variants of divul and divsl
             that have the same register number in two places.
             that have the same register number in two places.
             The more general variants will match instead.  */
             The more general variants will match instead.  */
          for (d = opc->args; *d; d += 2)
          for (d = opc->args; *d; d += 2)
            if (d[1] == 'D')
            if (d[1] == 'D')
              break;
              break;
 
 
          /* Don't use for printout the variants of most floating
          /* Don't use for printout the variants of most floating
             point coprocessor instructions which use the same
             point coprocessor instructions which use the same
             register number in two places, as above. */
             register number in two places, as above. */
          if (*d == '\0')
          if (*d == '\0')
            for (d = opc->args; *d; d += 2)
            for (d = opc->args; *d; d += 2)
              if (d[1] == 't')
              if (d[1] == 't')
                break;
                break;
 
 
          /* Don't match fmovel with more than one register; wait for
          /* Don't match fmovel with more than one register; wait for
             fmoveml.  */
             fmoveml.  */
          if (*d == '\0')
          if (*d == '\0')
            {
            {
              for (d = opc->args; *d; d += 2)
              for (d = opc->args; *d; d += 2)
                {
                {
                  if (d[0] == 's' && d[1] == '8')
                  if (d[0] == 's' && d[1] == '8')
                    {
                    {
                      int val;
                      int val;
 
 
                      val = fetch_arg (buffer, d[1], 3, info);
                      val = fetch_arg (buffer, d[1], 3, info);
                      if ((val & (val - 1)) != 0)
                      if ((val & (val - 1)) != 0)
                        break;
                        break;
                    }
                    }
                }
                }
            }
            }
 
 
          if (*d == '\0' && match > bestmask)
          if (*d == '\0' && match > bestmask)
            {
            {
              best = opc;
              best = opc;
              bestmask = match;
              bestmask = match;
            }
            }
        }
        }
    }
    }
 
 
  if (best == 0)
  if (best == 0)
    goto invalid;
    goto invalid;
 
 
  /* Point at first word of argument data,
  /* Point at first word of argument data,
     and at descriptor for first argument.  */
     and at descriptor for first argument.  */
  p = buffer + 2;
  p = buffer + 2;
 
 
  /* Figure out how long the fixed-size portion of the instruction is.
  /* Figure out how long the fixed-size portion of the instruction is.
     The only place this is stored in the opcode table is
     The only place this is stored in the opcode table is
     in the arguments--look for arguments which specify fields in the 2nd
     in the arguments--look for arguments which specify fields in the 2nd
     or 3rd words of the instruction.  */
     or 3rd words of the instruction.  */
  for (d = best->args; *d; d += 2)
  for (d = best->args; *d; d += 2)
    {
    {
      /* I don't think it is necessary to be checking d[0] here; I suspect
      /* I don't think it is necessary to be checking d[0] here; I suspect
         all this could be moved to the case statement below.  */
         all this could be moved to the case statement below.  */
      if (d[0] == '#')
      if (d[0] == '#')
        {
        {
          if (d[1] == 'l' && p - buffer < 6)
          if (d[1] == 'l' && p - buffer < 6)
            p = buffer + 6;
            p = buffer + 6;
          else if (p - buffer < 4 && d[1] != 'C' && d[1] != '8' )
          else if (p - buffer < 4 && d[1] != 'C' && d[1] != '8' )
            p = buffer + 4;
            p = buffer + 4;
        }
        }
      if ((d[0] == 'L' || d[0] == 'l') && d[1] == 'w' && p - buffer < 4)
      if ((d[0] == 'L' || d[0] == 'l') && d[1] == 'w' && p - buffer < 4)
        p = buffer + 4;
        p = buffer + 4;
      switch (d[1])
      switch (d[1])
        {
        {
        case '1':
        case '1':
        case '2':
        case '2':
        case '3':
        case '3':
        case '7':
        case '7':
        case '8':
        case '8':
        case '9':
        case '9':
        case 'i':
        case 'i':
          if (p - buffer < 4)
          if (p - buffer < 4)
            p = buffer + 4;
            p = buffer + 4;
          break;
          break;
        case '4':
        case '4':
        case '5':
        case '5':
        case '6':
        case '6':
          if (p - buffer < 6)
          if (p - buffer < 6)
            p = buffer + 6;
            p = buffer + 6;
          break;
          break;
        default:
        default:
          break;
          break;
        }
        }
    }
    }
 
 
  /* pflusha is an exceptions.  It takes no arguments but is two words
  /* pflusha is an exceptions.  It takes no arguments but is two words
     long.  Recognize it by looking at the lower 16 bits of the mask.  */
     long.  Recognize it by looking at the lower 16 bits of the mask.  */
  if (p - buffer < 4 && (best->match & 0xFFFF) != 0)
  if (p - buffer < 4 && (best->match & 0xFFFF) != 0)
    p = buffer + 4;
    p = buffer + 4;
 
 
  /* lpstop is another exception.  It takes a one word argument but is
  /* lpstop is another exception.  It takes a one word argument but is
     three words long.  */
     three words long.  */
  if (p - buffer < 6
  if (p - buffer < 6
      && (best->match & 0xffff) == 0xffff
      && (best->match & 0xffff) == 0xffff
      && best->args[0] == '#'
      && best->args[0] == '#'
      && best->args[1] == 'w')
      && best->args[1] == 'w')
    {
    {
      /* Copy the one word argument into the usual location for a one
      /* Copy the one word argument into the usual location for a one
         word argument, to simplify printing it.  We can get away with
         word argument, to simplify printing it.  We can get away with
         this because we know exactly what the second word is, and we
         this because we know exactly what the second word is, and we
         aren't going to print anything based on it.  */
         aren't going to print anything based on it.  */
      p = buffer + 6;
      p = buffer + 6;
      FETCH_DATA (info, p);
      FETCH_DATA (info, p);
      buffer[2] = buffer[4];
      buffer[2] = buffer[4];
      buffer[3] = buffer[5];
      buffer[3] = buffer[5];
    }
    }
 
 
  FETCH_DATA (info, p);
  FETCH_DATA (info, p);
 
 
  d = best->args;
  d = best->args;
 
 
  /* We can the operands twice.  The first time we don't print anything,
  /* We can the operands twice.  The first time we don't print anything,
     but look for errors. */
     but look for errors. */
 
 
  save_p = p;
  save_p = p;
  info->print_address_func = dummy_print_address;
  info->print_address_func = dummy_print_address;
  info->fprintf_func = (fprintf_ftype)dummy_printer;
  info->fprintf_func = (fprintf_ftype)dummy_printer;
  for ( ; *d; d += 2)
  for ( ; *d; d += 2)
    {
    {
      int eaten = print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
      int eaten = print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
      if (eaten >= 0)
      if (eaten >= 0)
        p += eaten;
        p += eaten;
      else if (eaten == -1)
      else if (eaten == -1)
        goto invalid;
        goto invalid;
      else
      else
        {
        {
          (*info->fprintf_func)(info->stream,
          (*info->fprintf_func)(info->stream,
                                /* xgettext:c-format */
                                /* xgettext:c-format */
                                _("<internal error in opcode table: %s %s>\n"),
                                _("<internal error in opcode table: %s %s>\n"),
                                best->name,
                                best->name,
                                best->args);
                                best->args);
          goto invalid;
          goto invalid;
        }
        }
 
 
    }
    }
  p = save_p;
  p = save_p;
  info->fprintf_func = save_printer;
  info->fprintf_func = save_printer;
  info->print_address_func = save_print_address;
  info->print_address_func = save_print_address;
 
 
  d = best->args;
  d = best->args;
 
 
  (*info->fprintf_func) (info->stream, "%s", best->name);
  (*info->fprintf_func) (info->stream, "%s", best->name);
 
 
  if (*d)
  if (*d)
    (*info->fprintf_func) (info->stream, " ");
    (*info->fprintf_func) (info->stream, " ");
 
 
  while (*d)
  while (*d)
    {
    {
      p += print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
      p += print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
      d += 2;
      d += 2;
      if (*d && *(d - 2) != 'I' && *d != 'k')
      if (*d && *(d - 2) != 'I' && *d != 'k')
        (*info->fprintf_func) (info->stream, ",");
        (*info->fprintf_func) (info->stream, ",");
    }
    }
  return p - buffer;
  return p - buffer;
 
 
 invalid:
 invalid:
  /* Handle undefined instructions.  */
  /* Handle undefined instructions.  */
  info->fprintf_func = save_printer;
  info->fprintf_func = save_printer;
  info->print_address_func = save_print_address;
  info->print_address_func = save_print_address;
  (*info->fprintf_func) (info->stream, "0%o",
  (*info->fprintf_func) (info->stream, "0%o",
                         (buffer[0] << 8) + buffer[1]);
                         (buffer[0] << 8) + buffer[1]);
  return 2;
  return 2;
}
}
 
 
/* Returns number of bytes "eaten" by the operand, or
/* Returns number of bytes "eaten" by the operand, or
   return -1 if an invalid operand was found, or -2 if
   return -1 if an invalid operand was found, or -2 if
   an opcode tabe error was found. */
   an opcode tabe error was found. */
 
 
static int
static int
print_insn_arg (d, buffer, p0, addr, info)
print_insn_arg (d, buffer, p0, addr, info)
     const char *d;
     const char *d;
     unsigned char *buffer;
     unsigned char *buffer;
     unsigned char *p0;
     unsigned char *p0;
     bfd_vma addr;              /* PC for this arg to be relative to */
     bfd_vma addr;              /* PC for this arg to be relative to */
     disassemble_info *info;
     disassemble_info *info;
{
{
  register int val = 0;
  register int val = 0;
  register int place = d[1];
  register int place = d[1];
  register unsigned char *p = p0;
  register unsigned char *p = p0;
  int regno;
  int regno;
  register CONST char *regname;
  register CONST char *regname;
  register unsigned char *p1;
  register unsigned char *p1;
  double flval;
  double flval;
  int flt_p;
  int flt_p;
  bfd_signed_vma disp;
  bfd_signed_vma disp;
  unsigned int uval;
  unsigned int uval;
 
 
  switch (*d)
  switch (*d)
    {
    {
    case 'c':           /* cache identifier */
    case 'c':           /* cache identifier */
      {
      {
        static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
        static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
        val = fetch_arg (buffer, place, 2, info);
        val = fetch_arg (buffer, place, 2, info);
        (*info->fprintf_func) (info->stream, cacheFieldName[val]);
        (*info->fprintf_func) (info->stream, cacheFieldName[val]);
        break;
        break;
      }
      }
 
 
    case 'a':           /* address register indirect only. Cf. case '+'. */
    case 'a':           /* address register indirect only. Cf. case '+'. */
      {
      {
        (*info->fprintf_func)
        (*info->fprintf_func)
          (info->stream,
          (info->stream,
           "%s@",
           "%s@",
           reg_names [fetch_arg (buffer, place, 3, info) + 8]);
           reg_names [fetch_arg (buffer, place, 3, info) + 8]);
        break;
        break;
      }
      }
 
 
    case '_':           /* 32-bit absolute address for move16. */
    case '_':           /* 32-bit absolute address for move16. */
      {
      {
        uval = NEXTULONG (p);
        uval = NEXTULONG (p);
        (*info->print_address_func) (uval, info);
        (*info->print_address_func) (uval, info);
        break;
        break;
      }
      }
 
 
    case 'C':
    case 'C':
      (*info->fprintf_func) (info->stream, "%%ccr");
      (*info->fprintf_func) (info->stream, "%%ccr");
      break;
      break;
 
 
    case 'S':
    case 'S':
      (*info->fprintf_func) (info->stream, "%%sr");
      (*info->fprintf_func) (info->stream, "%%sr");
      break;
      break;
 
 
    case 'U':
    case 'U':
      (*info->fprintf_func) (info->stream, "%%usp");
      (*info->fprintf_func) (info->stream, "%%usp");
      break;
      break;
 
 
    case 'E':
    case 'E':
      (*info->fprintf_func) (info->stream, "%%acc");
      (*info->fprintf_func) (info->stream, "%%acc");
      break;
      break;
 
 
    case 'G':
    case 'G':
      (*info->fprintf_func) (info->stream, "%%macsr");
      (*info->fprintf_func) (info->stream, "%%macsr");
      break;
      break;
 
 
    case 'H':
    case 'H':
      (*info->fprintf_func) (info->stream, "%%mask");
      (*info->fprintf_func) (info->stream, "%%mask");
      break;
      break;
 
 
    case 'J':
    case 'J':
      {
      {
        static const struct { char *name; int value; } names[]
        static const struct { char *name; int value; } names[]
          = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
          = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
             {"%tc",  0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
             {"%tc",  0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
             {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
             {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
             {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
             {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
             {"%msp", 0x803}, {"%isp", 0x804},
             {"%msp", 0x803}, {"%isp", 0x804},
 
 
             /* Should we be calling this psr like we do in case 'Y'?  */
             /* Should we be calling this psr like we do in case 'Y'?  */
             {"%mmusr",0x805},
             {"%mmusr",0x805},
 
 
             {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808}};
             {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808}};
 
 
        val = fetch_arg (buffer, place, 12, info);
        val = fetch_arg (buffer, place, 12, info);
        for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
        for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
          if (names[regno].value == val)
          if (names[regno].value == val)
            {
            {
              (*info->fprintf_func) (info->stream, "%s", names[regno].name);
              (*info->fprintf_func) (info->stream, "%s", names[regno].name);
              break;
              break;
            }
            }
        if (regno < 0)
        if (regno < 0)
          (*info->fprintf_func) (info->stream, "%d", val);
          (*info->fprintf_func) (info->stream, "%d", val);
      }
      }
      break;
      break;
 
 
    case 'Q':
    case 'Q':
      val = fetch_arg (buffer, place, 3, info);
      val = fetch_arg (buffer, place, 3, info);
      /* 0 means 8, except for the bkpt instruction... */
      /* 0 means 8, except for the bkpt instruction... */
      if (val == 0 && d[1] != 's')
      if (val == 0 && d[1] != 's')
        val = 8;
        val = 8;
      (*info->fprintf_func) (info->stream, "#%d", val);
      (*info->fprintf_func) (info->stream, "#%d", val);
      break;
      break;
 
 
    case 'M':
    case 'M':
      if (place == 'h')
      if (place == 'h')
        {
        {
          static char *const scalefactor_name[] = { "<<", ">>" };
          static char *const scalefactor_name[] = { "<<", ">>" };
          val = fetch_arg (buffer, place, 1, info);
          val = fetch_arg (buffer, place, 1, info);
          (*info->fprintf_func) (info->stream, scalefactor_name[val]);
          (*info->fprintf_func) (info->stream, scalefactor_name[val]);
        }
        }
      else
      else
        {
        {
          val = fetch_arg (buffer, place, 8, info);
          val = fetch_arg (buffer, place, 8, info);
          if (val & 0x80)
          if (val & 0x80)
            val = val - 0x100;
            val = val - 0x100;
          (*info->fprintf_func) (info->stream, "#%d", val);
          (*info->fprintf_func) (info->stream, "#%d", val);
        }
        }
      break;
      break;
 
 
    case 'T':
    case 'T':
      val = fetch_arg (buffer, place, 4, info);
      val = fetch_arg (buffer, place, 4, info);
      (*info->fprintf_func) (info->stream, "#%d", val);
      (*info->fprintf_func) (info->stream, "#%d", val);
      break;
      break;
 
 
    case 'D':
    case 'D':
      (*info->fprintf_func) (info->stream, "%s",
      (*info->fprintf_func) (info->stream, "%s",
                             reg_names[fetch_arg (buffer, place, 3, info)]);
                             reg_names[fetch_arg (buffer, place, 3, info)]);
      break;
      break;
 
 
    case 'A':
    case 'A':
      (*info->fprintf_func)
      (*info->fprintf_func)
        (info->stream, "%s",
        (info->stream, "%s",
         reg_names[fetch_arg (buffer, place, 3, info) + 010]);
         reg_names[fetch_arg (buffer, place, 3, info) + 010]);
      break;
      break;
 
 
    case 'R':
    case 'R':
      (*info->fprintf_func)
      (*info->fprintf_func)
        (info->stream, "%s",
        (info->stream, "%s",
         reg_names[fetch_arg (buffer, place, 4, info)]);
         reg_names[fetch_arg (buffer, place, 4, info)]);
      break;
      break;
 
 
    case 'r':
    case 'r':
      regno = fetch_arg (buffer, place, 4, info);
      regno = fetch_arg (buffer, place, 4, info);
      if (regno > 7)
      if (regno > 7)
        (*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
        (*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
      else
      else
        (*info->fprintf_func) (info->stream, "@(%s)", reg_names[regno]);
        (*info->fprintf_func) (info->stream, "@(%s)", reg_names[regno]);
      break;
      break;
 
 
    case 'F':
    case 'F':
      (*info->fprintf_func)
      (*info->fprintf_func)
        (info->stream, "%%fp%d",
        (info->stream, "%%fp%d",
         fetch_arg (buffer, place, 3, info));
         fetch_arg (buffer, place, 3, info));
      break;
      break;
 
 
    case 'O':
    case 'O':
      val = fetch_arg (buffer, place, 6, info);
      val = fetch_arg (buffer, place, 6, info);
      if (val & 0x20)
      if (val & 0x20)
        (*info->fprintf_func) (info->stream, "%s", reg_names [val & 7]);
        (*info->fprintf_func) (info->stream, "%s", reg_names [val & 7]);
      else
      else
        (*info->fprintf_func) (info->stream, "%d", val);
        (*info->fprintf_func) (info->stream, "%d", val);
      break;
      break;
 
 
    case '+':
    case '+':
      (*info->fprintf_func)
      (*info->fprintf_func)
        (info->stream, "%s@+",
        (info->stream, "%s@+",
         reg_names[fetch_arg (buffer, place, 3, info) + 8]);
         reg_names[fetch_arg (buffer, place, 3, info) + 8]);
      break;
      break;
 
 
    case '-':
    case '-':
      (*info->fprintf_func)
      (*info->fprintf_func)
        (info->stream, "%s@-",
        (info->stream, "%s@-",
         reg_names[fetch_arg (buffer, place, 3, info) + 8]);
         reg_names[fetch_arg (buffer, place, 3, info) + 8]);
      break;
      break;
 
 
    case 'k':
    case 'k':
      if (place == 'k')
      if (place == 'k')
        (*info->fprintf_func)
        (*info->fprintf_func)
          (info->stream, "{%s}",
          (info->stream, "{%s}",
           reg_names[fetch_arg (buffer, place, 3, info)]);
           reg_names[fetch_arg (buffer, place, 3, info)]);
      else if (place == 'C')
      else if (place == 'C')
        {
        {
          val = fetch_arg (buffer, place, 7, info);
          val = fetch_arg (buffer, place, 7, info);
          if ( val > 63 )               /* This is a signed constant. */
          if ( val > 63 )               /* This is a signed constant. */
            val -= 128;
            val -= 128;
          (*info->fprintf_func) (info->stream, "{#%d}", val);
          (*info->fprintf_func) (info->stream, "{#%d}", val);
        }
        }
      else
      else
        return -2;
        return -2;
      break;
      break;
 
 
    case '#':
    case '#':
    case '^':
    case '^':
      p1 = buffer + (*d == '#' ? 2 : 4);
      p1 = buffer + (*d == '#' ? 2 : 4);
      if (place == 's')
      if (place == 's')
        val = fetch_arg (buffer, place, 4, info);
        val = fetch_arg (buffer, place, 4, info);
      else if (place == 'C')
      else if (place == 'C')
        val = fetch_arg (buffer, place, 7, info);
        val = fetch_arg (buffer, place, 7, info);
      else if (place == '8')
      else if (place == '8')
        val = fetch_arg (buffer, place, 3, info);
        val = fetch_arg (buffer, place, 3, info);
      else if (place == '3')
      else if (place == '3')
        val = fetch_arg (buffer, place, 8, info);
        val = fetch_arg (buffer, place, 8, info);
      else if (place == 'b')
      else if (place == 'b')
        val = NEXTBYTE (p1);
        val = NEXTBYTE (p1);
      else if (place == 'w' || place == 'W')
      else if (place == 'w' || place == 'W')
        val = NEXTWORD (p1);
        val = NEXTWORD (p1);
      else if (place == 'l')
      else if (place == 'l')
        val = NEXTLONG (p1);
        val = NEXTLONG (p1);
      else
      else
        return -2;
        return -2;
      (*info->fprintf_func) (info->stream, "#%d", val);
      (*info->fprintf_func) (info->stream, "#%d", val);
      break;
      break;
 
 
    case 'B':
    case 'B':
      if (place == 'b')
      if (place == 'b')
        disp = NEXTBYTE (p);
        disp = NEXTBYTE (p);
      else if (place == 'B')
      else if (place == 'B')
        disp = COERCE_SIGNED_CHAR(buffer[1]);
        disp = COERCE_SIGNED_CHAR(buffer[1]);
      else if (place == 'w' || place == 'W')
      else if (place == 'w' || place == 'W')
        disp = NEXTWORD (p);
        disp = NEXTWORD (p);
      else if (place == 'l' || place == 'L' || place == 'C')
      else if (place == 'l' || place == 'L' || place == 'C')
        disp = NEXTLONG (p);
        disp = NEXTLONG (p);
      else if (place == 'g')
      else if (place == 'g')
        {
        {
          disp = NEXTBYTE (buffer);
          disp = NEXTBYTE (buffer);
          if (disp == 0)
          if (disp == 0)
            disp = NEXTWORD (p);
            disp = NEXTWORD (p);
          else if (disp == -1)
          else if (disp == -1)
            disp = NEXTLONG (p);
            disp = NEXTLONG (p);
        }
        }
      else if (place == 'c')
      else if (place == 'c')
        {
        {
          if (buffer[1] & 0x40)         /* If bit six is one, long offset */
          if (buffer[1] & 0x40)         /* If bit six is one, long offset */
            disp = NEXTLONG (p);
            disp = NEXTLONG (p);
          else
          else
            disp = NEXTWORD (p);
            disp = NEXTWORD (p);
        }
        }
      else
      else
        return -2;
        return -2;
 
 
      (*info->print_address_func) (addr + disp, info);
      (*info->print_address_func) (addr + disp, info);
      break;
      break;
 
 
    case 'd':
    case 'd':
      val = NEXTWORD (p);
      val = NEXTWORD (p);
      (*info->fprintf_func)
      (*info->fprintf_func)
        (info->stream, "%s@(%d)",
        (info->stream, "%s@(%d)",
         reg_names[fetch_arg (buffer, place, 3, info) + 8], val);
         reg_names[fetch_arg (buffer, place, 3, info) + 8], val);
      break;
      break;
 
 
    case 's':
    case 's':
      (*info->fprintf_func) (info->stream, "%s",
      (*info->fprintf_func) (info->stream, "%s",
                             fpcr_names[fetch_arg (buffer, place, 3, info)]);
                             fpcr_names[fetch_arg (buffer, place, 3, info)]);
      break;
      break;
 
 
    case 'I':
    case 'I':
      /* Get coprocessor ID... */
      /* Get coprocessor ID... */
      val = fetch_arg (buffer, 'd', 3, info);
      val = fetch_arg (buffer, 'd', 3, info);
 
 
      if (val != 1)                             /* Unusual coprocessor ID? */
      if (val != 1)                             /* Unusual coprocessor ID? */
        (*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
        (*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
      break;
      break;
 
 
    case '*':
    case '*':
    case '~':
    case '~':
    case '%':
    case '%':
    case ';':
    case ';':
    case '@':
    case '@':
    case '!':
    case '!':
    case '$':
    case '$':
    case '?':
    case '?':
    case '/':
    case '/':
    case '&':
    case '&':
    case '|':
    case '|':
    case '<':
    case '<':
    case '>':
    case '>':
    case 'm':
    case 'm':
    case 'n':
    case 'n':
    case 'o':
    case 'o':
    case 'p':
    case 'p':
    case 'q':
    case 'q':
    case 'v':
    case 'v':
 
 
      if (place == 'd')
      if (place == 'd')
        {
        {
          val = fetch_arg (buffer, 'x', 6, info);
          val = fetch_arg (buffer, 'x', 6, info);
          val = ((val & 7) << 3) + ((val >> 3) & 7);
          val = ((val & 7) << 3) + ((val >> 3) & 7);
        }
        }
      else
      else
        val = fetch_arg (buffer, 's', 6, info);
        val = fetch_arg (buffer, 's', 6, info);
 
 
      /* Get register number assuming address register.  */
      /* Get register number assuming address register.  */
      regno = (val & 7) + 8;
      regno = (val & 7) + 8;
      regname = reg_names[regno];
      regname = reg_names[regno];
      switch (val >> 3)
      switch (val >> 3)
        {
        {
        case 0:
        case 0:
          (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
          (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
          break;
          break;
 
 
        case 1:
        case 1:
          (*info->fprintf_func) (info->stream, "%s", regname);
          (*info->fprintf_func) (info->stream, "%s", regname);
          break;
          break;
 
 
        case 2:
        case 2:
          (*info->fprintf_func) (info->stream, "%s@", regname);
          (*info->fprintf_func) (info->stream, "%s@", regname);
          break;
          break;
 
 
        case 3:
        case 3:
          (*info->fprintf_func) (info->stream, "%s@+", regname);
          (*info->fprintf_func) (info->stream, "%s@+", regname);
          break;
          break;
 
 
        case 4:
        case 4:
          (*info->fprintf_func) (info->stream, "%s@-", regname);
          (*info->fprintf_func) (info->stream, "%s@-", regname);
          break;
          break;
 
 
        case 5:
        case 5:
          val = NEXTWORD (p);
          val = NEXTWORD (p);
          (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
          (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
          break;
          break;
 
 
        case 6:
        case 6:
          p = print_indexed (regno, p, addr, info);
          p = print_indexed (regno, p, addr, info);
          break;
          break;
 
 
        case 7:
        case 7:
          switch (val & 7)
          switch (val & 7)
            {
            {
            case 0:
            case 0:
              val = NEXTWORD (p);
              val = NEXTWORD (p);
              (*info->print_address_func) (val, info);
              (*info->print_address_func) (val, info);
              break;
              break;
 
 
            case 1:
            case 1:
              uval = NEXTULONG (p);
              uval = NEXTULONG (p);
              (*info->print_address_func) (uval, info);
              (*info->print_address_func) (uval, info);
              break;
              break;
 
 
            case 2:
            case 2:
              val = NEXTWORD (p);
              val = NEXTWORD (p);
              (*info->fprintf_func) (info->stream, "%%pc@(");
              (*info->fprintf_func) (info->stream, "%%pc@(");
              (*info->print_address_func) (addr + val, info);
              (*info->print_address_func) (addr + val, info);
              (*info->fprintf_func) (info->stream, ")");
              (*info->fprintf_func) (info->stream, ")");
              break;
              break;
 
 
            case 3:
            case 3:
              p = print_indexed (-1, p, addr, info);
              p = print_indexed (-1, p, addr, info);
              break;
              break;
 
 
            case 4:
            case 4:
              flt_p = 1;        /* Assume it's a float... */
              flt_p = 1;        /* Assume it's a float... */
              switch( place )
              switch( place )
              {
              {
                case 'b':
                case 'b':
                  val = NEXTBYTE (p);
                  val = NEXTBYTE (p);
                  flt_p = 0;
                  flt_p = 0;
                  break;
                  break;
 
 
                case 'w':
                case 'w':
                  val = NEXTWORD (p);
                  val = NEXTWORD (p);
                  flt_p = 0;
                  flt_p = 0;
                  break;
                  break;
 
 
                case 'l':
                case 'l':
                  val = NEXTLONG (p);
                  val = NEXTLONG (p);
                  flt_p = 0;
                  flt_p = 0;
                  break;
                  break;
 
 
                case 'f':
                case 'f':
                  NEXTSINGLE(flval, p);
                  NEXTSINGLE(flval, p);
                  break;
                  break;
 
 
                case 'F':
                case 'F':
                  NEXTDOUBLE(flval, p);
                  NEXTDOUBLE(flval, p);
                  break;
                  break;
 
 
                case 'x':
                case 'x':
                  NEXTEXTEND(flval, p);
                  NEXTEXTEND(flval, p);
                  break;
                  break;
 
 
                case 'p':
                case 'p':
                  flval = NEXTPACKED(p);
                  flval = NEXTPACKED(p);
                  break;
                  break;
 
 
                default:
                default:
                  return -1;
                  return -1;
              }
              }
              if ( flt_p )      /* Print a float? */
              if ( flt_p )      /* Print a float? */
                (*info->fprintf_func) (info->stream, "#%g", flval);
                (*info->fprintf_func) (info->stream, "#%g", flval);
              else
              else
                (*info->fprintf_func) (info->stream, "#%d", val);
                (*info->fprintf_func) (info->stream, "#%d", val);
              break;
              break;
 
 
            default:
            default:
              return -1;
              return -1;
            }
            }
        }
        }
      break;
      break;
 
 
    case 'L':
    case 'L':
    case 'l':
    case 'l':
        if (place == 'w')
        if (place == 'w')
          {
          {
            char doneany;
            char doneany;
            p1 = buffer + 2;
            p1 = buffer + 2;
            val = NEXTWORD (p1);
            val = NEXTWORD (p1);
            /* Move the pointer ahead if this point is farther ahead
            /* Move the pointer ahead if this point is farther ahead
               than the last.  */
               than the last.  */
            p = p1 > p ? p1 : p;
            p = p1 > p ? p1 : p;
            if (val == 0)
            if (val == 0)
              {
              {
                (*info->fprintf_func) (info->stream, "#0");
                (*info->fprintf_func) (info->stream, "#0");
                break;
                break;
              }
              }
            if (*d == 'l')
            if (*d == 'l')
              {
              {
                register int newval = 0;
                register int newval = 0;
                for (regno = 0; regno < 16; ++regno)
                for (regno = 0; regno < 16; ++regno)
                  if (val & (0x8000 >> regno))
                  if (val & (0x8000 >> regno))
                    newval |= 1 << regno;
                    newval |= 1 << regno;
                val = newval;
                val = newval;
              }
              }
            val &= 0xffff;
            val &= 0xffff;
            doneany = 0;
            doneany = 0;
            for (regno = 0; regno < 16; ++regno)
            for (regno = 0; regno < 16; ++regno)
              if (val & (1 << regno))
              if (val & (1 << regno))
                {
                {
                  int first_regno;
                  int first_regno;
                  if (doneany)
                  if (doneany)
                    (*info->fprintf_func) (info->stream, "/");
                    (*info->fprintf_func) (info->stream, "/");
                  doneany = 1;
                  doneany = 1;
                  (*info->fprintf_func) (info->stream, "%s", reg_names[regno]);
                  (*info->fprintf_func) (info->stream, "%s", reg_names[regno]);
                  first_regno = regno;
                  first_regno = regno;
                  while (val & (1 << (regno + 1)))
                  while (val & (1 << (regno + 1)))
                    ++regno;
                    ++regno;
                  if (regno > first_regno)
                  if (regno > first_regno)
                    (*info->fprintf_func) (info->stream, "-%s",
                    (*info->fprintf_func) (info->stream, "-%s",
                                           reg_names[regno]);
                                           reg_names[regno]);
                }
                }
          }
          }
        else if (place == '3')
        else if (place == '3')
          {
          {
            /* `fmovem' insn.  */
            /* `fmovem' insn.  */
            char doneany;
            char doneany;
            val = fetch_arg (buffer, place, 8, info);
            val = fetch_arg (buffer, place, 8, info);
            if (val == 0)
            if (val == 0)
              {
              {
                (*info->fprintf_func) (info->stream, "#0");
                (*info->fprintf_func) (info->stream, "#0");
                break;
                break;
              }
              }
            if (*d == 'l')
            if (*d == 'l')
              {
              {
                register int newval = 0;
                register int newval = 0;
                for (regno = 0; regno < 8; ++regno)
                for (regno = 0; regno < 8; ++regno)
                  if (val & (0x80 >> regno))
                  if (val & (0x80 >> regno))
                    newval |= 1 << regno;
                    newval |= 1 << regno;
                val = newval;
                val = newval;
              }
              }
            val &= 0xff;
            val &= 0xff;
            doneany = 0;
            doneany = 0;
            for (regno = 0; regno < 8; ++regno)
            for (regno = 0; regno < 8; ++regno)
              if (val & (1 << regno))
              if (val & (1 << regno))
                {
                {
                  int first_regno;
                  int first_regno;
                  if (doneany)
                  if (doneany)
                    (*info->fprintf_func) (info->stream, "/");
                    (*info->fprintf_func) (info->stream, "/");
                  doneany = 1;
                  doneany = 1;
                  (*info->fprintf_func) (info->stream, "%%fp%d", regno);
                  (*info->fprintf_func) (info->stream, "%%fp%d", regno);
                  first_regno = regno;
                  first_regno = regno;
                  while (val & (1 << (regno + 1)))
                  while (val & (1 << (regno + 1)))
                    ++regno;
                    ++regno;
                  if (regno > first_regno)
                  if (regno > first_regno)
                    (*info->fprintf_func) (info->stream, "-%%fp%d", regno);
                    (*info->fprintf_func) (info->stream, "-%%fp%d", regno);
                }
                }
          }
          }
        else if (place == '8')
        else if (place == '8')
          {
          {
            /* fmoveml for FP status registers */
            /* fmoveml for FP status registers */
            (*info->fprintf_func) (info->stream, "%s",
            (*info->fprintf_func) (info->stream, "%s",
                                   fpcr_names[fetch_arg (buffer, place, 3,
                                   fpcr_names[fetch_arg (buffer, place, 3,
                                                         info)]);
                                                         info)]);
          }
          }
        else
        else
          return -2;
          return -2;
      break;
      break;
 
 
    case 'X':
    case 'X':
      place = '8';
      place = '8';
    case 'Y':
    case 'Y':
    case 'Z':
    case 'Z':
    case 'W':
    case 'W':
    case '0':
    case '0':
    case '1':
    case '1':
    case '2':
    case '2':
    case '3':
    case '3':
      {
      {
        int val = fetch_arg (buffer, place, 5, info);
        int val = fetch_arg (buffer, place, 5, info);
        char *name = 0;
        char *name = 0;
        switch (val)
        switch (val)
          {
          {
          case 2: name = "%tt0"; break;
          case 2: name = "%tt0"; break;
          case 3: name = "%tt1"; break;
          case 3: name = "%tt1"; break;
          case 0x10: name = "%tc"; break;
          case 0x10: name = "%tc"; break;
          case 0x11: name = "%drp"; break;
          case 0x11: name = "%drp"; break;
          case 0x12: name = "%srp"; break;
          case 0x12: name = "%srp"; break;
          case 0x13: name = "%crp"; break;
          case 0x13: name = "%crp"; break;
          case 0x14: name = "%cal"; break;
          case 0x14: name = "%cal"; break;
          case 0x15: name = "%val"; break;
          case 0x15: name = "%val"; break;
          case 0x16: name = "%scc"; break;
          case 0x16: name = "%scc"; break;
          case 0x17: name = "%ac"; break;
          case 0x17: name = "%ac"; break;
          case 0x18: name = "%psr"; break;
          case 0x18: name = "%psr"; break;
          case 0x19: name = "%pcsr"; break;
          case 0x19: name = "%pcsr"; break;
          case 0x1c:
          case 0x1c:
          case 0x1d:
          case 0x1d:
            {
            {
              int break_reg = ((buffer[3] >> 2) & 7);
              int break_reg = ((buffer[3] >> 2) & 7);
              (*info->fprintf_func)
              (*info->fprintf_func)
                (info->stream, val == 0x1c ? "%%bad%d" : "%%bac%d",
                (info->stream, val == 0x1c ? "%%bad%d" : "%%bac%d",
                 break_reg);
                 break_reg);
            }
            }
            break;
            break;
          default:
          default:
            (*info->fprintf_func) (info->stream, "<mmu register %d>", val);
            (*info->fprintf_func) (info->stream, "<mmu register %d>", val);
          }
          }
        if (name)
        if (name)
          (*info->fprintf_func) (info->stream, "%s", name);
          (*info->fprintf_func) (info->stream, "%s", name);
      }
      }
      break;
      break;
 
 
    case 'f':
    case 'f':
      {
      {
        int fc = fetch_arg (buffer, place, 5, info);
        int fc = fetch_arg (buffer, place, 5, info);
        if (fc == 1)
        if (fc == 1)
          (*info->fprintf_func) (info->stream, "%%dfc");
          (*info->fprintf_func) (info->stream, "%%dfc");
        else if (fc == 0)
        else if (fc == 0)
          (*info->fprintf_func) (info->stream, "%%sfc");
          (*info->fprintf_func) (info->stream, "%%sfc");
        else
        else
          /* xgettext:c-format */
          /* xgettext:c-format */
          (*info->fprintf_func) (info->stream, _("<function code %d>"), fc);
          (*info->fprintf_func) (info->stream, _("<function code %d>"), fc);
      }
      }
      break;
      break;
 
 
    case 'V':
    case 'V':
      (*info->fprintf_func) (info->stream, "%%val");
      (*info->fprintf_func) (info->stream, "%%val");
      break;
      break;
 
 
    case 't':
    case 't':
      {
      {
        int level = fetch_arg (buffer, place, 3, info);
        int level = fetch_arg (buffer, place, 3, info);
        (*info->fprintf_func) (info->stream, "%d", level);
        (*info->fprintf_func) (info->stream, "%d", level);
      }
      }
      break;
      break;
 
 
    case 'u':
    case 'u':
      {
      {
        short is_upper = 0;
        short is_upper = 0;
        int reg = fetch_arg (buffer, place, 5, info);
        int reg = fetch_arg (buffer, place, 5, info);
 
 
        if (reg & 0x10)
        if (reg & 0x10)
          {
          {
            is_upper = 1;
            is_upper = 1;
            reg &= 0xf;
            reg &= 0xf;
          }
          }
        (*info->fprintf_func) (info->stream, "%s%s",
        (*info->fprintf_func) (info->stream, "%s%s",
                               reg_names[reg],
                               reg_names[reg],
                               is_upper ? "u" : "l");
                               is_upper ? "u" : "l");
      }
      }
      break;
      break;
 
 
    default:
    default:
      return -2;
      return -2;
    }
    }
 
 
  return p - p0;
  return p - p0;
}
}
 
 
/* Fetch BITS bits from a position in the instruction specified by CODE.
/* Fetch BITS bits from a position in the instruction specified by CODE.
   CODE is a "place to put an argument", or 'x' for a destination
   CODE is a "place to put an argument", or 'x' for a destination
   that is a general address (mode and register).
   that is a general address (mode and register).
   BUFFER contains the instruction.  */
   BUFFER contains the instruction.  */
 
 
static int
static int
fetch_arg (buffer, code, bits, info)
fetch_arg (buffer, code, bits, info)
     unsigned char *buffer;
     unsigned char *buffer;
     int code;
     int code;
     int bits;
     int bits;
     disassemble_info *info;
     disassemble_info *info;
{
{
  register int val = 0;
  register int val = 0;
  switch (code)
  switch (code)
    {
    {
    case 's':
    case 's':
      val = buffer[1];
      val = buffer[1];
      break;
      break;
 
 
    case 'd':                   /* Destination, for register or quick.  */
    case 'd':                   /* Destination, for register or quick.  */
      val = (buffer[0] << 8) + buffer[1];
      val = (buffer[0] << 8) + buffer[1];
      val >>= 9;
      val >>= 9;
      break;
      break;
 
 
    case 'x':                   /* Destination, for general arg */
    case 'x':                   /* Destination, for general arg */
      val = (buffer[0] << 8) + buffer[1];
      val = (buffer[0] << 8) + buffer[1];
      val >>= 6;
      val >>= 6;
      break;
      break;
 
 
    case 'k':
    case 'k':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = (buffer[3] >> 4);
      val = (buffer[3] >> 4);
      break;
      break;
 
 
    case 'C':
    case 'C':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = buffer[3];
      val = buffer[3];
      break;
      break;
 
 
    case '1':
    case '1':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = (buffer[2] << 8) + buffer[3];
      val = (buffer[2] << 8) + buffer[3];
      val >>= 12;
      val >>= 12;
      break;
      break;
 
 
    case '2':
    case '2':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = (buffer[2] << 8) + buffer[3];
      val = (buffer[2] << 8) + buffer[3];
      val >>= 6;
      val >>= 6;
      break;
      break;
 
 
    case '3':
    case '3':
    case 'j':
    case 'j':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = (buffer[2] << 8) + buffer[3];
      val = (buffer[2] << 8) + buffer[3];
      break;
      break;
 
 
    case '4':
    case '4':
      FETCH_DATA (info, buffer + 5);
      FETCH_DATA (info, buffer + 5);
      val = (buffer[4] << 8) + buffer[5];
      val = (buffer[4] << 8) + buffer[5];
      val >>= 12;
      val >>= 12;
      break;
      break;
 
 
    case '5':
    case '5':
      FETCH_DATA (info, buffer + 5);
      FETCH_DATA (info, buffer + 5);
      val = (buffer[4] << 8) + buffer[5];
      val = (buffer[4] << 8) + buffer[5];
      val >>= 6;
      val >>= 6;
      break;
      break;
 
 
    case '6':
    case '6':
      FETCH_DATA (info, buffer + 5);
      FETCH_DATA (info, buffer + 5);
      val = (buffer[4] << 8) + buffer[5];
      val = (buffer[4] << 8) + buffer[5];
      break;
      break;
 
 
    case '7':
    case '7':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = (buffer[2] << 8) + buffer[3];
      val = (buffer[2] << 8) + buffer[3];
      val >>= 7;
      val >>= 7;
      break;
      break;
 
 
    case '8':
    case '8':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = (buffer[2] << 8) + buffer[3];
      val = (buffer[2] << 8) + buffer[3];
      val >>= 10;
      val >>= 10;
      break;
      break;
 
 
    case '9':
    case '9':
      FETCH_DATA (info, buffer + 3);
      FETCH_DATA (info, buffer + 3);
      val = (buffer[2] << 8) + buffer[3];
      val = (buffer[2] << 8) + buffer[3];
      val >>= 5;
      val >>= 5;
      break;
      break;
 
 
    case 'e':
    case 'e':
      val = (buffer[1] >> 6);
      val = (buffer[1] >> 6);
      break;
      break;
 
 
    case 'm':
    case 'm':
      val = (buffer[1] & 0x40 ? 0x8 : 0)
      val = (buffer[1] & 0x40 ? 0x8 : 0)
        | ((buffer[0] >> 1) & 0x7)
        | ((buffer[0] >> 1) & 0x7)
        | (buffer[3] & 0x80 ? 0x10 : 0);
        | (buffer[3] & 0x80 ? 0x10 : 0);
      break;
      break;
 
 
    case 'n':
    case 'n':
      val = (buffer[1] & 0x40 ? 0x8 : 0) | ((buffer[0] >> 1) & 0x7);
      val = (buffer[1] & 0x40 ? 0x8 : 0) | ((buffer[0] >> 1) & 0x7);
      break;
      break;
 
 
    case 'o':
    case 'o':
      val = (buffer[2] >> 4) | (buffer[3] & 0x80 ? 0x10 : 0);
      val = (buffer[2] >> 4) | (buffer[3] & 0x80 ? 0x10 : 0);
      break;
      break;
 
 
    case 'M':
    case 'M':
      val = buffer[1] | (buffer[3] & 0x40 ? 0x10 : 0);
      val = buffer[1] | (buffer[3] & 0x40 ? 0x10 : 0);
      break;
      break;
 
 
    case 'N':
    case 'N':
      val = buffer[3] | (buffer[3] & 0x40 ? 0x10 : 0);
      val = buffer[3] | (buffer[3] & 0x40 ? 0x10 : 0);
      break;
      break;
 
 
    case 'h':
    case 'h':
      val = buffer[2] >> 2;
      val = buffer[2] >> 2;
      break;
      break;
 
 
    default:
    default:
      abort ();
      abort ();
    }
    }
 
 
  switch (bits)
  switch (bits)
    {
    {
    case 1:
    case 1:
      return val & 1;
      return val & 1;
    case 2:
    case 2:
      return val & 3;
      return val & 3;
    case 3:
    case 3:
      return val & 7;
      return val & 7;
    case 4:
    case 4:
      return val & 017;
      return val & 017;
    case 5:
    case 5:
      return val & 037;
      return val & 037;
    case 6:
    case 6:
      return val & 077;
      return val & 077;
    case 7:
    case 7:
      return val & 0177;
      return val & 0177;
    case 8:
    case 8:
      return val & 0377;
      return val & 0377;
    case 12:
    case 12:
      return val & 07777;
      return val & 07777;
    default:
    default:
      abort ();
      abort ();
    }
    }
}
}
 
 
/* Print an indexed argument.  The base register is BASEREG (-1 for pc).
/* Print an indexed argument.  The base register is BASEREG (-1 for pc).
   P points to extension word, in buffer.
   P points to extension word, in buffer.
   ADDR is the nominal core address of that extension word.  */
   ADDR is the nominal core address of that extension word.  */
 
 
static unsigned char *
static unsigned char *
print_indexed (basereg, p, addr, info)
print_indexed (basereg, p, addr, info)
     int basereg;
     int basereg;
     unsigned char *p;
     unsigned char *p;
     bfd_vma addr;
     bfd_vma addr;
     disassemble_info *info;
     disassemble_info *info;
{
{
  register int word;
  register int word;
  static char *const scales[] = {"", ":2", ":4", ":8"};
  static char *const scales[] = {"", ":2", ":4", ":8"};
  bfd_vma base_disp;
  bfd_vma base_disp;
  bfd_vma outer_disp;
  bfd_vma outer_disp;
  char buf[40];
  char buf[40];
  char vmabuf[50];
  char vmabuf[50];
 
 
  word = NEXTWORD (p);
  word = NEXTWORD (p);
 
 
  /* Generate the text for the index register.
  /* Generate the text for the index register.
     Where this will be output is not yet determined.  */
     Where this will be output is not yet determined.  */
  sprintf (buf, "%s:%c%s",
  sprintf (buf, "%s:%c%s",
           reg_names[(word >> 12) & 0xf],
           reg_names[(word >> 12) & 0xf],
           (word & 0x800) ? 'l' : 'w',
           (word & 0x800) ? 'l' : 'w',
           scales[(word >> 9) & 3]);
           scales[(word >> 9) & 3]);
 
 
  /* Handle the 68000 style of indexing.  */
  /* Handle the 68000 style of indexing.  */
 
 
  if ((word & 0x100) == 0)
  if ((word & 0x100) == 0)
    {
    {
      base_disp = word & 0xff;
      base_disp = word & 0xff;
      if ((base_disp & 0x80) != 0)
      if ((base_disp & 0x80) != 0)
        base_disp -= 0x100;
        base_disp -= 0x100;
      if (basereg == -1)
      if (basereg == -1)
        base_disp += addr;
        base_disp += addr;
      print_base (basereg, base_disp, info);
      print_base (basereg, base_disp, info);
      (*info->fprintf_func) (info->stream, ",%s)", buf);
      (*info->fprintf_func) (info->stream, ",%s)", buf);
      return p;
      return p;
    }
    }
 
 
  /* Handle the generalized kind.  */
  /* Handle the generalized kind.  */
  /* First, compute the displacement to add to the base register.  */
  /* First, compute the displacement to add to the base register.  */
 
 
  if (word & 0200)
  if (word & 0200)
    {
    {
      if (basereg == -1)
      if (basereg == -1)
        basereg = -3;
        basereg = -3;
      else
      else
        basereg = -2;
        basereg = -2;
    }
    }
  if (word & 0100)
  if (word & 0100)
    buf[0] = '\0';
    buf[0] = '\0';
  base_disp = 0;
  base_disp = 0;
  switch ((word >> 4) & 3)
  switch ((word >> 4) & 3)
    {
    {
    case 2:
    case 2:
      base_disp = NEXTWORD (p);
      base_disp = NEXTWORD (p);
      break;
      break;
    case 3:
    case 3:
      base_disp = NEXTLONG (p);
      base_disp = NEXTLONG (p);
    }
    }
  if (basereg == -1)
  if (basereg == -1)
    base_disp += addr;
    base_disp += addr;
 
 
  /* Handle single-level case (not indirect) */
  /* Handle single-level case (not indirect) */
 
 
  if ((word & 7) == 0)
  if ((word & 7) == 0)
    {
    {
      print_base (basereg, base_disp, info);
      print_base (basereg, base_disp, info);
      if (buf[0] != '\0')
      if (buf[0] != '\0')
        (*info->fprintf_func) (info->stream, ",%s", buf);
        (*info->fprintf_func) (info->stream, ",%s", buf);
      (*info->fprintf_func) (info->stream, ")");
      (*info->fprintf_func) (info->stream, ")");
      return p;
      return p;
    }
    }
 
 
  /* Two level.  Compute displacement to add after indirection.  */
  /* Two level.  Compute displacement to add after indirection.  */
 
 
  outer_disp = 0;
  outer_disp = 0;
  switch (word & 3)
  switch (word & 3)
    {
    {
    case 2:
    case 2:
      outer_disp = NEXTWORD (p);
      outer_disp = NEXTWORD (p);
      break;
      break;
    case 3:
    case 3:
      outer_disp = NEXTLONG (p);
      outer_disp = NEXTLONG (p);
    }
    }
 
 
  print_base (basereg, base_disp, info);
  print_base (basereg, base_disp, info);
  if ((word & 4) == 0 && buf[0] != '\0')
  if ((word & 4) == 0 && buf[0] != '\0')
    {
    {
      (*info->fprintf_func) (info->stream, ",%s", buf);
      (*info->fprintf_func) (info->stream, ",%s", buf);
      buf[0] = '\0';
      buf[0] = '\0';
    }
    }
  sprintf_vma (vmabuf, outer_disp);
  sprintf_vma (vmabuf, outer_disp);
  (*info->fprintf_func) (info->stream, ")@(%s", vmabuf);
  (*info->fprintf_func) (info->stream, ")@(%s", vmabuf);
  if (buf[0] != '\0')
  if (buf[0] != '\0')
    (*info->fprintf_func) (info->stream, ",%s", buf);
    (*info->fprintf_func) (info->stream, ",%s", buf);
  (*info->fprintf_func) (info->stream, ")");
  (*info->fprintf_func) (info->stream, ")");
 
 
  return p;
  return p;
}
}
 
 
/* Print a base register REGNO and displacement DISP, on INFO->STREAM.
/* Print a base register REGNO and displacement DISP, on INFO->STREAM.
   REGNO = -1 for pc, -2 for none (suppressed).  */
   REGNO = -1 for pc, -2 for none (suppressed).  */
 
 
static void
static void
print_base (regno, disp, info)
print_base (regno, disp, info)
     int regno;
     int regno;
     bfd_vma disp;
     bfd_vma disp;
     disassemble_info *info;
     disassemble_info *info;
{
{
  if (regno == -1)
  if (regno == -1)
    {
    {
      (*info->fprintf_func) (info->stream, "%%pc@(");
      (*info->fprintf_func) (info->stream, "%%pc@(");
      (*info->print_address_func) (disp, info);
      (*info->print_address_func) (disp, info);
    }
    }
  else
  else
    {
    {
      char buf[50];
      char buf[50];
 
 
      if (regno == -2)
      if (regno == -2)
        (*info->fprintf_func) (info->stream, "@(");
        (*info->fprintf_func) (info->stream, "@(");
      else if (regno == -3)
      else if (regno == -3)
        (*info->fprintf_func) (info->stream, "%%zpc@(");
        (*info->fprintf_func) (info->stream, "%%zpc@(");
      else
      else
        (*info->fprintf_func) (info->stream, "%s@(", reg_names[regno]);
        (*info->fprintf_func) (info->stream, "%s@(", reg_names[regno]);
 
 
      sprintf_vma (buf, disp);
      sprintf_vma (buf, disp);
      (*info->fprintf_func) (info->stream, "%s", buf);
      (*info->fprintf_func) (info->stream, "%s", buf);
    }
    }
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.