10SN/A/* Print Motorola 68k instructions.
27656SN/A   Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
30SN/A   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
40SN/A   Free Software Foundation, Inc.
50SN/A
60SN/A   This file is part of the GNU opcodes library.
72362SN/A
80SN/A   This library is free software; you can redistribute it and/or modify
92362SN/A   it under the terms of the GNU General Public License as published by
100SN/A   the Free Software Foundation; either version 3, or (at your option)
110SN/A   any later version.
120SN/A
130SN/A   It is distributed in the hope that it will be useful, but WITHOUT
140SN/A   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
150SN/A   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
160SN/A   License for more details.
170SN/A
180SN/A   You should have received a copy of the GNU General Public License
190SN/A   along with this program; if not, write to the Free Software
200SN/A   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
212362SN/A   MA 02110-1301, USA.  */
222362SN/A
232362SN/A#include "sysdep.h"
240SN/A#include "dis-asm.h"
250SN/A#include "floatformat.h"
260SN/A#include "libiberty.h"
270SN/A#include "opintl.h"
280SN/A
290SN/A#include "opcode/m68k.h"
300SN/A
310SN/A/* Local function prototypes.  */
320SN/A
330SN/Aconst char * const fpcr_names[] =
340SN/A{
357755SN/A  "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
367755SN/A  "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"
370SN/A};
380SN/A
390SN/Astatic char *const reg_names[] =
400SN/A{
410SN/A  "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
420SN/A  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
430SN/A  "%ps", "%pc"
440SN/A};
450SN/A
460SN/A/* Name of register halves for MAC/EMAC.
470SN/A   Seperate from reg_names since 'spu', 'fpl' look weird.  */
480SN/Astatic char *const reg_half_names[] =
490SN/A{
500SN/A  "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
518565SN/A  "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
520SN/A  "%ps", "%pc"
530SN/A};
540SN/A
550SN/A/* Sign-extend an (unsigned char).  */
560SN/A#if __STDC__ == 1
570SN/A#define COERCE_SIGNED_CHAR(ch) ((signed char) (ch))
587755SN/A#else
590SN/A#define COERCE_SIGNED_CHAR(ch) ((int) (((ch) ^ 0x80) & 0xFF) - 128)
600SN/A#endif
610SN/A
627755SN/A/* Get a 1 byte signed integer.  */
630SN/A#define NEXTBYTE(p, val)			\
640SN/A  do						\
650SN/A    {						\
660SN/A      p += 2;					\
670SN/A      if (!FETCH_DATA (info, p))		\
680SN/A	return -3;				\
690SN/A      val = COERCE_SIGNED_CHAR (p[-1]);		\
700SN/A    }						\
710SN/A  while (0)
720SN/A
730SN/A/* Get a 2 byte signed integer.  */
740SN/A#define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
750SN/A
760SN/A#define NEXTWORD(p, val, ret_val)		\
770SN/A  do						\
787656SN/A    {						\
797656SN/A      p += 2;					\
807755SN/A      if (!FETCH_DATA (info, p))		\
810SN/A	return ret_val;				\
820SN/A      val = COERCE16 ((p[-2] << 8) + p[-1]);	\
830SN/A    }						\
840SN/A  while (0)
850SN/A
860SN/A/* Get a 4 byte signed integer.  */
870SN/A#define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
880SN/A
890SN/A#define NEXTLONG(p, val, ret_val)					\
900SN/A  do									\
910SN/A    {									\
920SN/A      p += 4;								\
930SN/A      if (!FETCH_DATA (info, p))					\
940SN/A	return ret_val;							\
950SN/A      val = COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
960SN/A    }									\
970SN/A  while (0)
980SN/A
990SN/A/* Get a 4 byte unsigned integer.  */
1000SN/A#define NEXTULONG(p, val)						\
1010SN/A  do									\
1020SN/A    {									\
1030SN/A      p += 4;								\
1040SN/A      if (!FETCH_DATA (info, p))					\
1050SN/A	return -3;							\
1060SN/A      val = (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]); \
1070SN/A    }									\
1080SN/A  while (0)
1090SN/A
1100SN/A/* Get a single precision float.  */
1117755SN/A#define NEXTSINGLE(val, p)					\
1127755SN/A  do								\
1130SN/A    {								\
1140SN/A      p += 4;							\
1150SN/A      if (!FETCH_DATA (info, p))				\
1167755SN/A	return -3;						\
1170SN/A      floatformat_to_double (& floatformat_ieee_single_big,	\
1187755SN/A			     (char *) p - 4, & val);		\
1190SN/A    }								\
1200SN/A  while (0)
1210SN/A
1220SN/A/* Get a double precision float.  */
1230SN/A#define NEXTDOUBLE(val, p)					\
1240SN/A  do								\
1250SN/A    {								\
1267755SN/A      p += 8;							\
1270SN/A      if (!FETCH_DATA (info, p))				\
1280SN/A	return -3;						\
1290SN/A      floatformat_to_double (& floatformat_ieee_double_big,	\
130			     (char *) p - 8, & val);		\
131    }								\
132  while (0)
133
134/* Get an extended precision float.  */
135#define NEXTEXTEND(val, p)				\
136  do							\
137    {							\
138      p += 12;						\
139      if (!FETCH_DATA (info, p))			\
140	return -3;					\
141      floatformat_to_double (& floatformat_m68881_ext,	\
142			     (char *) p - 12, & val);	\
143    }							\
144  while (0)
145
146/* Need a function to convert from packed to double
147   precision.   Actually, it's easier to print a
148   packed number than a double anyway, so maybe
149   there should be a special case to handle this... */
150#define NEXTPACKED(p, val)			\
151  do						\
152    {						\
153      p += 12;					\
154      if (!FETCH_DATA (info, p))		\
155	return -3;				\
156      val = 0.0;				\
157    }						\
158  while (0)
159
160
161/* Maximum length of an instruction.  */
162#define MAXLEN 22
163
164#include <setjmp.h>
165
166struct private
167{
168  /* Points to first byte not fetched.  */
169  bfd_byte *max_fetched;
170  bfd_byte the_buffer[MAXLEN];
171  bfd_vma insn_start;
172};
173
174/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
175   to ADDR (exclusive) are valid.  Returns 1 for success, 0 on error.  */
176#define FETCH_DATA(info, addr) \
177  ((addr) <= ((struct private *) (info->private_data))->max_fetched \
178   ? 1 : fetch_data ((info), (addr)))
179
180static int
181fetch_data (struct disassemble_info *info, bfd_byte *addr)
182{
183  int status;
184  struct private *priv = (struct private *)info->private_data;
185  bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
186
187  status = (*info->read_memory_func) (start,
188				      priv->max_fetched,
189				      addr - priv->max_fetched,
190				      info);
191  if (status != 0)
192    {
193      (*info->memory_error_func) (status, start, info);
194      return 0;
195    }
196  else
197    priv->max_fetched = addr;
198  return 1;
199}
200
201/* This function is used to print to the bit-bucket.  */
202static int
203dummy_printer (FILE *file ATTRIBUTE_UNUSED,
204	       const char *format ATTRIBUTE_UNUSED,
205	       ...)
206{
207  return 0;
208}
209
210static void
211dummy_print_address (bfd_vma vma ATTRIBUTE_UNUSED,
212		     struct disassemble_info *info ATTRIBUTE_UNUSED)
213{
214}
215
216/* Fetch BITS bits from a position in the instruction specified by CODE.
217   CODE is a "place to put an argument", or 'x' for a destination
218   that is a general address (mode and register).
219   BUFFER contains the instruction.
220   Returns -1 on failure.  */
221
222static int
223fetch_arg (unsigned char *buffer,
224	   int code,
225	   int bits,
226	   disassemble_info *info)
227{
228  int val = 0;
229
230  switch (code)
231    {
232    case '/': /* MAC/EMAC mask bit.  */
233      val = buffer[3] >> 5;
234      break;
235
236    case 'G': /* EMAC ACC load.  */
237      val = ((buffer[3] >> 3) & 0x2) | ((~buffer[1] >> 7) & 0x1);
238      break;
239
240    case 'H': /* EMAC ACC !load.  */
241      val = ((buffer[3] >> 3) & 0x2) | ((buffer[1] >> 7) & 0x1);
242      break;
243
244    case ']': /* EMAC ACCEXT bit.  */
245      val = buffer[0] >> 2;
246      break;
247
248    case 'I': /* MAC/EMAC scale factor.  */
249      val = buffer[2] >> 1;
250      break;
251
252    case 'F': /* EMAC ACCx.  */
253      val = buffer[0] >> 1;
254      break;
255
256    case 'f':
257      val = buffer[1];
258      break;
259
260    case 's':
261      val = buffer[1];
262      break;
263
264    case 'd':			/* Destination, for register or quick.  */
265      val = (buffer[0] << 8) + buffer[1];
266      val >>= 9;
267      break;
268
269    case 'x':			/* Destination, for general arg.  */
270      val = (buffer[0] << 8) + buffer[1];
271      val >>= 6;
272      break;
273
274    case 'k':
275      if (! FETCH_DATA (info, buffer + 3))
276	return -1;
277      val = (buffer[3] >> 4);
278      break;
279
280    case 'C':
281      if (! FETCH_DATA (info, buffer + 3))
282	return -1;
283      val = buffer[3];
284      break;
285
286    case '1':
287      if (! FETCH_DATA (info, buffer + 3))
288	return -1;
289      val = (buffer[2] << 8) + buffer[3];
290      val >>= 12;
291      break;
292
293    case '2':
294      if (! FETCH_DATA (info, buffer + 3))
295	return -1;
296      val = (buffer[2] << 8) + buffer[3];
297      val >>= 6;
298      break;
299
300    case '3':
301    case 'j':
302      if (! FETCH_DATA (info, buffer + 3))
303	return -1;
304      val = (buffer[2] << 8) + buffer[3];
305      break;
306
307    case '4':
308      if (! FETCH_DATA (info, buffer + 5))
309	return -1;
310      val = (buffer[4] << 8) + buffer[5];
311      val >>= 12;
312      break;
313
314    case '5':
315      if (! FETCH_DATA (info, buffer + 5))
316	return -1;
317      val = (buffer[4] << 8) + buffer[5];
318      val >>= 6;
319      break;
320
321    case '6':
322      if (! FETCH_DATA (info, buffer + 5))
323	return -1;
324      val = (buffer[4] << 8) + buffer[5];
325      break;
326
327    case '7':
328      if (! FETCH_DATA (info, buffer + 3))
329	return -1;
330      val = (buffer[2] << 8) + buffer[3];
331      val >>= 7;
332      break;
333
334    case '8':
335      if (! FETCH_DATA (info, buffer + 3))
336	return -1;
337      val = (buffer[2] << 8) + buffer[3];
338      val >>= 10;
339      break;
340
341    case '9':
342      if (! FETCH_DATA (info, buffer + 3))
343	return -1;
344      val = (buffer[2] << 8) + buffer[3];
345      val >>= 5;
346      break;
347
348    case 'e':
349      val = (buffer[1] >> 6);
350      break;
351
352    case 'E':
353      if (! FETCH_DATA (info, buffer + 3))
354	return -1;
355      val = (buffer[2] >> 1);
356      break;
357
358    case 'm':
359      val = (buffer[1] & 0x40 ? 0x8 : 0)
360	| ((buffer[0] >> 1) & 0x7)
361	| (buffer[3] & 0x80 ? 0x10 : 0);
362      break;
363
364    case 'n':
365      val = (buffer[1] & 0x40 ? 0x8 : 0) | ((buffer[0] >> 1) & 0x7);
366      break;
367
368    case 'o':
369      val = (buffer[2] >> 4) | (buffer[3] & 0x80 ? 0x10 : 0);
370      break;
371
372    case 'M':
373      val = (buffer[1] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
374      break;
375
376    case 'N':
377      val = (buffer[3] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
378      break;
379
380    case 'h':
381      val = buffer[2] >> 2;
382      break;
383
384    default:
385      abort ();
386    }
387
388  /* bits is never too big.  */
389  return val & ((1 << bits) - 1);
390}
391
392/* Check if an EA is valid for a particular code.  This is required
393   for the EMAC instructions since the type of source address determines
394   if it is a EMAC-load instruciton if the EA is mode 2-5, otherwise it
395   is a non-load EMAC instruction and the bits mean register Ry.
396   A similar case exists for the movem instructions where the register
397   mask is interpreted differently for different EAs.  */
398
399static bfd_boolean
400m68k_valid_ea (char code, int val)
401{
402  int mode, mask;
403#define M(n0,n1,n2,n3,n4,n5,n6,n70,n71,n72,n73,n74) \
404  (n0 | n1 << 1 | n2 << 2 | n3 << 3 | n4 << 4 | n5 << 5 | n6 << 6 \
405   | n70 << 7 | n71 << 8 | n72 << 9 | n73 << 10 | n74 << 11)
406
407  switch (code)
408    {
409    case '*':
410      mask = M (1,1,1,1,1,1,1,1,1,1,1,1);
411      break;
412    case '~':
413      mask = M (0,0,1,1,1,1,1,1,1,0,0,0);
414      break;
415    case '%':
416      mask = M (1,1,1,1,1,1,1,1,1,0,0,0);
417      break;
418    case ';':
419      mask = M (1,0,1,1,1,1,1,1,1,1,1,1);
420      break;
421    case '@':
422      mask = M (1,0,1,1,1,1,1,1,1,1,1,0);
423      break;
424    case '!':
425      mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
426      break;
427    case '&':
428      mask = M (0,0,1,0,0,1,1,1,1,0,0,0);
429      break;
430    case '$':
431      mask = M (1,0,1,1,1,1,1,1,1,0,0,0);
432      break;
433    case '?':
434      mask = M (1,0,1,0,0,1,1,1,1,0,0,0);
435      break;
436    case '/':
437      mask = M (1,0,1,0,0,1,1,1,1,1,1,0);
438      break;
439    case '|':
440      mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
441      break;
442    case '>':
443      mask = M (0,0,1,0,1,1,1,1,1,0,0,0);
444      break;
445    case '<':
446      mask = M (0,0,1,1,0,1,1,1,1,1,1,0);
447      break;
448    case 'm':
449      mask = M (1,1,1,1,1,0,0,0,0,0,0,0);
450      break;
451    case 'n':
452      mask = M (0,0,0,0,0,1,0,0,0,1,0,0);
453      break;
454    case 'o':
455      mask = M (0,0,0,0,0,0,1,1,1,0,1,1);
456      break;
457    case 'p':
458      mask = M (1,1,1,1,1,1,0,0,0,0,0,0);
459      break;
460    case 'q':
461      mask = M (1,0,1,1,1,1,0,0,0,0,0,0);
462      break;
463    case 'v':
464      mask = M (1,0,1,1,1,1,0,1,1,0,0,0);
465      break;
466    case 'b':
467      mask = M (1,0,1,1,1,1,0,0,0,1,0,0);
468      break;
469    case 'w':
470      mask = M (0,0,1,1,1,1,0,0,0,1,0,0);
471      break;
472    case 'y':
473      mask = M (0,0,1,0,0,1,0,0,0,0,0,0);
474      break;
475    case 'z':
476      mask = M (0,0,1,0,0,1,0,0,0,1,0,0);
477      break;
478    case '4':
479      mask = M (0,0,1,1,1,1,0,0,0,0,0,0);
480      break;
481    default:
482      abort ();
483    }
484#undef M
485
486  mode = (val >> 3) & 7;
487  if (mode == 7)
488    mode += val & 7;
489  return (mask & (1 << mode)) != 0;
490}
491
492/* Print a base register REGNO and displacement DISP, on INFO->STREAM.
493   REGNO = -1 for pc, -2 for none (suppressed).  */
494
495static void
496print_base (int regno, bfd_vma disp, disassemble_info *info)
497{
498  if (regno == -1)
499    {
500      (*info->fprintf_func) (info->stream, "%%pc@(");
501      (*info->print_address_func) (disp, info);
502    }
503  else
504    {
505      char buf[50];
506
507      if (regno == -2)
508	(*info->fprintf_func) (info->stream, "@(");
509      else if (regno == -3)
510	(*info->fprintf_func) (info->stream, "%%zpc@(");
511      else
512	(*info->fprintf_func) (info->stream, "%s@(", reg_names[regno]);
513
514      sprintf_vma (buf, disp);
515      (*info->fprintf_func) (info->stream, "%s", buf);
516    }
517}
518
519/* Print an indexed argument.  The base register is BASEREG (-1 for pc).
520   P points to extension word, in buffer.
521   ADDR is the nominal core address of that extension word.
522   Returns NULL upon error.  */
523
524static unsigned char *
525print_indexed (int basereg,
526	       unsigned char *p,
527	       bfd_vma addr,
528	       disassemble_info *info)
529{
530  int word;
531  static char *const scales[] = { "", ":2", ":4", ":8" };
532  bfd_vma base_disp;
533  bfd_vma outer_disp;
534  char buf[40];
535  char vmabuf[50];
536
537  NEXTWORD (p, word, NULL);
538
539  /* Generate the text for the index register.
540     Where this will be output is not yet determined.  */
541  sprintf (buf, "%s:%c%s",
542	   reg_names[(word >> 12) & 0xf],
543	   (word & 0x800) ? 'l' : 'w',
544	   scales[(word >> 9) & 3]);
545
546  /* Handle the 68000 style of indexing.  */
547
548  if ((word & 0x100) == 0)
549    {
550      base_disp = word & 0xff;
551      if ((base_disp & 0x80) != 0)
552	base_disp -= 0x100;
553      if (basereg == -1)
554	base_disp += addr;
555      print_base (basereg, base_disp, info);
556      (*info->fprintf_func) (info->stream, ",%s)", buf);
557      return p;
558    }
559
560  /* Handle the generalized kind.  */
561  /* First, compute the displacement to add to the base register.  */
562  if (word & 0200)
563    {
564      if (basereg == -1)
565	basereg = -3;
566      else
567	basereg = -2;
568    }
569  if (word & 0100)
570    buf[0] = '\0';
571  base_disp = 0;
572  switch ((word >> 4) & 3)
573    {
574    case 2:
575      NEXTWORD (p, base_disp, NULL);
576      break;
577    case 3:
578      NEXTLONG (p, base_disp, NULL);
579    }
580  if (basereg == -1)
581    base_disp += addr;
582
583  /* Handle single-level case (not indirect).  */
584  if ((word & 7) == 0)
585    {
586      print_base (basereg, base_disp, info);
587      if (buf[0] != '\0')
588	(*info->fprintf_func) (info->stream, ",%s", buf);
589      (*info->fprintf_func) (info->stream, ")");
590      return p;
591    }
592
593  /* Two level.  Compute displacement to add after indirection.  */
594  outer_disp = 0;
595  switch (word & 3)
596    {
597    case 2:
598      NEXTWORD (p, outer_disp, NULL);
599      break;
600    case 3:
601      NEXTLONG (p, outer_disp, NULL);
602    }
603
604  print_base (basereg, base_disp, info);
605  if ((word & 4) == 0 && buf[0] != '\0')
606    {
607      (*info->fprintf_func) (info->stream, ",%s", buf);
608      buf[0] = '\0';
609    }
610  sprintf_vma (vmabuf, outer_disp);
611  (*info->fprintf_func) (info->stream, ")@(%s", vmabuf);
612  if (buf[0] != '\0')
613    (*info->fprintf_func) (info->stream, ",%s", buf);
614  (*info->fprintf_func) (info->stream, ")");
615
616  return p;
617}
618
619#define FETCH_ARG(size, val)				\
620  do							\
621    {							\
622      val = fetch_arg (buffer, place, size, info);	\
623      if (val < 0)					\
624	return -3;					\
625    }							\
626  while (0)
627
628/* Returns number of bytes "eaten" by the operand, or
629   return -1 if an invalid operand was found, or -2 if
630   an opcode tabe error was found or -3 to simply abort.
631   ADDR is the pc for this arg to be relative to.  */
632
633static int
634print_insn_arg (const char *d,
635		unsigned char *buffer,
636		unsigned char *p0,
637		bfd_vma addr,
638		disassemble_info *info)
639{
640  int val = 0;
641  int place = d[1];
642  unsigned char *p = p0;
643  int regno;
644  const char *regname;
645  unsigned char *p1;
646  double flval;
647  int flt_p;
648  bfd_signed_vma disp;
649  unsigned int uval;
650
651  switch (*d)
652    {
653    case 'c':		/* Cache identifier.  */
654      {
655        static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
656        FETCH_ARG (2, val);
657	(*info->fprintf_func) (info->stream, cacheFieldName[val]);
658        break;
659      }
660
661    case 'a':		/* Address register indirect only. Cf. case '+'.  */
662      {
663	FETCH_ARG (3, val);
664	(*info->fprintf_func) (info->stream, "%s@", reg_names[val + 8]);
665        break;
666      }
667
668    case '_':		/* 32-bit absolute address for move16.  */
669      {
670        NEXTULONG (p, uval);
671	(*info->print_address_func) (uval, info);
672        break;
673      }
674
675    case 'C':
676      (*info->fprintf_func) (info->stream, "%%ccr");
677      break;
678
679    case 'S':
680      (*info->fprintf_func) (info->stream, "%%sr");
681      break;
682
683    case 'U':
684      (*info->fprintf_func) (info->stream, "%%usp");
685      break;
686
687    case 'E':
688      (*info->fprintf_func) (info->stream, "%%acc");
689      break;
690
691    case 'G':
692      (*info->fprintf_func) (info->stream, "%%macsr");
693      break;
694
695    case 'H':
696      (*info->fprintf_func) (info->stream, "%%mask");
697      break;
698
699    case 'J':
700      {
701	/* FIXME: There's a problem here, different m68k processors call the
702	   same address different names.  The tables below try to get it right
703	   using info->mach, but only for v4e.  */
704	struct regname { char * name; int value; };
705	static const struct regname names[] =
706	  {
707	    {"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
708	    {"%tc",  0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
709	    {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
710	    {"%rgpiobar", 0x009}, {"%acr4",0x00c},
711	    {"%acr5",0x00d}, {"%acr6",0x00e}, {"%acr7", 0x00f},
712	    {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
713	    {"%msp", 0x803}, {"%isp", 0x804},
714	    {"%pc", 0x80f},
715	    /* Reg c04 is sometimes called flashbar or rambar.
716	       Reg c05 is also sometimes called rambar.  */
717	    {"%rambar0", 0xc04}, {"%rambar1", 0xc05},
718
719	    /* reg c0e is sometimes called mbar2 or secmbar.
720	       reg c0f is sometimes called mbar.  */
721	    {"%mbar0", 0xc0e}, {"%mbar1", 0xc0f},
722
723	    /* Should we be calling this psr like we do in case 'Y'?  */
724	    {"%mmusr",0x805},
725
726	    {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808},
727
728	    /* Fido added these.  */
729	    {"%cac", 0xffe}, {"%mbo", 0xfff}
730	};
731	/* Alternate names for v4e (MCF5407/5445x/MCF547x/MCF548x), at least.  */
732	static const struct regname names_v4e[] =
733	  {
734	    {"%asid",0x003}, {"%acr0",0x004}, {"%acr1",0x005},
735	    {"%acr2",0x006}, {"%acr3",0x007}, {"%mmubar",0x008},
736	  };
737	unsigned int arch_mask;
738
739	arch_mask = bfd_m68k_mach_to_features (info->mach);
740	FETCH_ARG (12, val);
741	if (arch_mask & (mcfisa_b | mcfisa_c))
742	  {
743	    for (regno = ARRAY_SIZE (names_v4e); --regno >= 0;)
744	      if (names_v4e[regno].value == val)
745		{
746		  (*info->fprintf_func) (info->stream, "%s", names_v4e[regno].name);
747		  break;
748		}
749	    if (regno >= 0)
750	      break;
751	  }
752	for (regno = ARRAY_SIZE (names) - 1; regno >= 0; regno--)
753	  if (names[regno].value == val)
754	    {
755	      (*info->fprintf_func) (info->stream, "%s", names[regno].name);
756	      break;
757	    }
758	if (regno < 0)
759	  (*info->fprintf_func) (info->stream, "0x%x", val);
760      }
761      break;
762
763    case 'Q':
764      FETCH_ARG (3, val);
765      /* 0 means 8, except for the bkpt instruction... */
766      if (val == 0 && d[1] != 's')
767	val = 8;
768      (*info->fprintf_func) (info->stream, "#%d", val);
769      break;
770
771    case 'x':
772      FETCH_ARG (3, val);
773      /* 0 means -1.  */
774      if (val == 0)
775	val = -1;
776      (*info->fprintf_func) (info->stream, "#%d", val);
777      break;
778
779    case 'j':
780      FETCH_ARG (3, val);
781      (*info->fprintf_func) (info->stream, "#%d", val+1);
782      break;
783
784    case 'K':
785      FETCH_ARG (9, val);
786      (*info->fprintf_func) (info->stream, "#%d", val);
787      break;
788
789    case 'M':
790      if (place == 'h')
791	{
792	  static char *const scalefactor_name[] = { "<<", ">>" };
793
794	  FETCH_ARG (1, val);
795	  (*info->fprintf_func) (info->stream, scalefactor_name[val]);
796	}
797      else
798	{
799	  FETCH_ARG (8, val);
800	  if (val & 0x80)
801	    val = val - 0x100;
802	  (*info->fprintf_func) (info->stream, "#%d", val);
803	}
804      break;
805
806    case 'T':
807      FETCH_ARG (4, val);
808      (*info->fprintf_func) (info->stream, "#%d", val);
809      break;
810
811    case 'D':
812      FETCH_ARG (3, val);
813      (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
814      break;
815
816    case 'A':
817      FETCH_ARG (3, val);
818      (*info->fprintf_func) (info->stream, "%s", reg_names[val + 010]);
819      break;
820
821    case 'R':
822      FETCH_ARG (4, val);
823      (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
824      break;
825
826    case 'r':
827      FETCH_ARG (4, regno);
828      if (regno > 7)
829	(*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
830      else
831	(*info->fprintf_func) (info->stream, "@(%s)", reg_names[regno]);
832      break;
833
834    case 'F':
835      FETCH_ARG (3, val);
836      (*info->fprintf_func) (info->stream, "%%fp%d", val);
837      break;
838
839    case 'O':
840      FETCH_ARG (6, val);
841      if (val & 0x20)
842	(*info->fprintf_func) (info->stream, "%s", reg_names[val & 7]);
843      else
844	(*info->fprintf_func) (info->stream, "%d", val);
845      break;
846
847    case '+':
848      FETCH_ARG (3, val);
849      (*info->fprintf_func) (info->stream, "%s@+", reg_names[val + 8]);
850      break;
851
852    case '-':
853      FETCH_ARG (3, val);
854      (*info->fprintf_func) (info->stream, "%s@-", reg_names[val + 8]);
855      break;
856
857    case 'k':
858      if (place == 'k')
859	{
860	  FETCH_ARG (3, val);
861	  (*info->fprintf_func) (info->stream, "{%s}", reg_names[val]);
862	}
863      else if (place == 'C')
864	{
865	  FETCH_ARG (7, val);
866	  if (val > 63)		/* This is a signed constant.  */
867	    val -= 128;
868	  (*info->fprintf_func) (info->stream, "{#%d}", val);
869	}
870      else
871	return -1;
872      break;
873
874    case '#':
875    case '^':
876      p1 = buffer + (*d == '#' ? 2 : 4);
877      if (place == 's')
878	FETCH_ARG (4, val);
879      else if (place == 'C')
880	FETCH_ARG (7, val);
881      else if (place == '8')
882	FETCH_ARG (3, val);
883      else if (place == '3')
884	FETCH_ARG (8, val);
885      else if (place == 'b')
886	NEXTBYTE (p1, val);
887      else if (place == 'w' || place == 'W')
888	NEXTWORD (p1, val, -3);
889      else if (place == 'l')
890	NEXTLONG (p1, val, -3);
891      else
892	return -2;
893
894      (*info->fprintf_func) (info->stream, "#%d", val);
895      break;
896
897    case 'B':
898      if (place == 'b')
899	NEXTBYTE (p, disp);
900      else if (place == 'B')
901	disp = COERCE_SIGNED_CHAR (buffer[1]);
902      else if (place == 'w' || place == 'W')
903	NEXTWORD (p, disp, -3);
904      else if (place == 'l' || place == 'L' || place == 'C')
905	NEXTLONG (p, disp, -3);
906      else if (place == 'g')
907	{
908	  NEXTBYTE (buffer, disp);
909	  if (disp == 0)
910	    NEXTWORD (p, disp, -3);
911	  else if (disp == -1)
912	    NEXTLONG (p, disp, -3);
913	}
914      else if (place == 'c')
915	{
916	  if (buffer[1] & 0x40)		/* If bit six is one, long offset.  */
917	    NEXTLONG (p, disp, -3);
918	  else
919	    NEXTWORD (p, disp, -3);
920	}
921      else
922	return -2;
923
924      (*info->print_address_func) (addr + disp, info);
925      break;
926
927    case 'd':
928      {
929	int val1;
930
931	NEXTWORD (p, val, -3);
932	FETCH_ARG (3, val1);
933	(*info->fprintf_func) (info->stream, "%s@(%d)", reg_names[val1 + 8], val);
934	break;
935      }
936
937    case 's':
938      FETCH_ARG (3, val);
939      (*info->fprintf_func) (info->stream, "%s", fpcr_names[val]);
940      break;
941
942    case 'e':
943      FETCH_ARG (2, val);
944      (*info->fprintf_func) (info->stream, "%%acc%d", val);
945      break;
946
947    case 'g':
948      FETCH_ARG (1, val);
949      (*info->fprintf_func) (info->stream, "%%accext%s", val == 0 ? "01" : "23");
950      break;
951
952    case 'i':
953      FETCH_ARG (2, val);
954      if (val == 1)
955	(*info->fprintf_func) (info->stream, "<<");
956      else if (val == 3)
957	(*info->fprintf_func) (info->stream, ">>");
958      else
959	return -1;
960      break;
961
962    case 'I':
963      /* Get coprocessor ID... */
964      val = fetch_arg (buffer, 'd', 3, info);
965      if (val < 0)
966	return -3;
967      if (val != 1)				/* Unusual coprocessor ID?  */
968	(*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
969      break;
970
971    case '4':
972    case '*':
973    case '~':
974    case '%':
975    case ';':
976    case '@':
977    case '!':
978    case '$':
979    case '?':
980    case '/':
981    case '&':
982    case '|':
983    case '<':
984    case '>':
985    case 'm':
986    case 'n':
987    case 'o':
988    case 'p':
989    case 'q':
990    case 'v':
991    case 'b':
992    case 'w':
993    case 'y':
994    case 'z':
995      if (place == 'd')
996	{
997	  val = fetch_arg (buffer, 'x', 6, info);
998	  if (val < 0)
999	    return -3;
1000	  val = ((val & 7) << 3) + ((val >> 3) & 7);
1001	}
1002      else
1003	{
1004	  val = fetch_arg (buffer, 's', 6, info);
1005	  if (val < 0)
1006	    return -3;
1007	}
1008
1009      /* If the <ea> is invalid for *d, then reject this match.  */
1010      if (!m68k_valid_ea (*d, val))
1011	return -1;
1012
1013      /* Get register number assuming address register.  */
1014      regno = (val & 7) + 8;
1015      regname = reg_names[regno];
1016      switch (val >> 3)
1017	{
1018	case 0:
1019	  (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
1020	  break;
1021
1022	case 1:
1023	  (*info->fprintf_func) (info->stream, "%s", regname);
1024	  break;
1025
1026	case 2:
1027	  (*info->fprintf_func) (info->stream, "%s@", regname);
1028	  break;
1029
1030	case 3:
1031	  (*info->fprintf_func) (info->stream, "%s@+", regname);
1032	  break;
1033
1034	case 4:
1035	  (*info->fprintf_func) (info->stream, "%s@-", regname);
1036	  break;
1037
1038	case 5:
1039	  NEXTWORD (p, val, -3);
1040	  (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
1041	  break;
1042
1043	case 6:
1044	  p = print_indexed (regno, p, addr, info);
1045	  if (p == NULL)
1046	    return -3;
1047	  break;
1048
1049	case 7:
1050	  switch (val & 7)
1051	    {
1052	    case 0:
1053	      NEXTWORD (p, val, -3);
1054	      (*info->print_address_func) (val, info);
1055	      break;
1056
1057	    case 1:
1058	      NEXTULONG (p, uval);
1059	      (*info->print_address_func) (uval, info);
1060	      break;
1061
1062	    case 2:
1063	      NEXTWORD (p, val, -3);
1064	      (*info->fprintf_func) (info->stream, "%%pc@(");
1065	      (*info->print_address_func) (addr + val, info);
1066	      (*info->fprintf_func) (info->stream, ")");
1067	      break;
1068
1069	    case 3:
1070	      p = print_indexed (-1, p, addr, info);
1071	      if (p == NULL)
1072		return -3;
1073	      break;
1074
1075	    case 4:
1076	      flt_p = 1;	/* Assume it's a float... */
1077	      switch (place)
1078	      {
1079		case 'b':
1080		  NEXTBYTE (p, val);
1081		  flt_p = 0;
1082		  break;
1083
1084		case 'w':
1085		  NEXTWORD (p, val, -3);
1086		  flt_p = 0;
1087		  break;
1088
1089		case 'l':
1090		  NEXTLONG (p, val, -3);
1091		  flt_p = 0;
1092		  break;
1093
1094		case 'f':
1095		  NEXTSINGLE (flval, p);
1096		  break;
1097
1098		case 'F':
1099		  NEXTDOUBLE (flval, p);
1100		  break;
1101
1102		case 'x':
1103		  NEXTEXTEND (flval, p);
1104		  break;
1105
1106		case 'p':
1107		  NEXTPACKED (p, flval);
1108		  break;
1109
1110		default:
1111		  return -1;
1112	      }
1113	      if (flt_p)	/* Print a float? */
1114		(*info->fprintf_func) (info->stream, "#0e%g", flval);
1115	      else
1116		(*info->fprintf_func) (info->stream, "#%d", val);
1117	      break;
1118
1119	    default:
1120	      return -1;
1121	    }
1122	}
1123
1124      /* If place is '/', then this is the case of the mask bit for
1125	 mac/emac loads. Now that the arg has been printed, grab the
1126	 mask bit and if set, add a '&' to the arg.  */
1127      if (place == '/')
1128	{
1129	  FETCH_ARG (1, val);
1130	  if (val)
1131	    info->fprintf_func (info->stream, "&");
1132	}
1133      break;
1134
1135    case 'L':
1136    case 'l':
1137	if (place == 'w')
1138	  {
1139	    char doneany;
1140	    p1 = buffer + 2;
1141	    NEXTWORD (p1, val, -3);
1142	    /* Move the pointer ahead if this point is farther ahead
1143	       than the last.  */
1144	    p = p1 > p ? p1 : p;
1145	    if (val == 0)
1146	      {
1147		(*info->fprintf_func) (info->stream, "#0");
1148		break;
1149	      }
1150	    if (*d == 'l')
1151	      {
1152		int newval = 0;
1153
1154		for (regno = 0; regno < 16; ++regno)
1155		  if (val & (0x8000 >> regno))
1156		    newval |= 1 << regno;
1157		val = newval;
1158	      }
1159	    val &= 0xffff;
1160	    doneany = 0;
1161	    for (regno = 0; regno < 16; ++regno)
1162	      if (val & (1 << regno))
1163		{
1164		  int first_regno;
1165
1166		  if (doneany)
1167		    (*info->fprintf_func) (info->stream, "/");
1168		  doneany = 1;
1169		  (*info->fprintf_func) (info->stream, "%s", reg_names[regno]);
1170		  first_regno = regno;
1171		  while (val & (1 << (regno + 1)))
1172		    ++regno;
1173		  if (regno > first_regno)
1174		    (*info->fprintf_func) (info->stream, "-%s",
1175					   reg_names[regno]);
1176		}
1177	  }
1178	else if (place == '3')
1179	  {
1180	    /* `fmovem' insn.  */
1181	    char doneany;
1182
1183	    FETCH_ARG (8, val);
1184	    if (val == 0)
1185	      {
1186		(*info->fprintf_func) (info->stream, "#0");
1187		break;
1188	      }
1189	    if (*d == 'l')
1190	      {
1191		int newval = 0;
1192
1193		for (regno = 0; regno < 8; ++regno)
1194		  if (val & (0x80 >> regno))
1195		    newval |= 1 << regno;
1196		val = newval;
1197	      }
1198	    val &= 0xff;
1199	    doneany = 0;
1200	    for (regno = 0; regno < 8; ++regno)
1201	      if (val & (1 << regno))
1202		{
1203		  int first_regno;
1204		  if (doneany)
1205		    (*info->fprintf_func) (info->stream, "/");
1206		  doneany = 1;
1207		  (*info->fprintf_func) (info->stream, "%%fp%d", regno);
1208		  first_regno = regno;
1209		  while (val & (1 << (regno + 1)))
1210		    ++regno;
1211		  if (regno > first_regno)
1212		    (*info->fprintf_func) (info->stream, "-%%fp%d", regno);
1213		}
1214	  }
1215	else if (place == '8')
1216	  {
1217	    FETCH_ARG (3, val);
1218	    /* fmoveml for FP status registers.  */
1219	    (*info->fprintf_func) (info->stream, "%s", fpcr_names[val]);
1220	  }
1221	else
1222	  return -2;
1223      break;
1224
1225    case 'X':
1226      place = '8';
1227    case 'Y':
1228    case 'Z':
1229    case 'W':
1230    case '0':
1231    case '1':
1232    case '2':
1233    case '3':
1234      {
1235	char *name = 0;
1236
1237	FETCH_ARG (5, val);
1238	switch (val)
1239	  {
1240	  case 2: name = "%tt0"; break;
1241	  case 3: name = "%tt1"; break;
1242	  case 0x10: name = "%tc"; break;
1243	  case 0x11: name = "%drp"; break;
1244	  case 0x12: name = "%srp"; break;
1245	  case 0x13: name = "%crp"; break;
1246	  case 0x14: name = "%cal"; break;
1247	  case 0x15: name = "%val"; break;
1248	  case 0x16: name = "%scc"; break;
1249	  case 0x17: name = "%ac"; break;
1250 	  case 0x18: name = "%psr"; break;
1251	  case 0x19: name = "%pcsr"; break;
1252	  case 0x1c:
1253	  case 0x1d:
1254	    {
1255	      int break_reg = ((buffer[3] >> 2) & 7);
1256
1257	      (*info->fprintf_func)
1258		(info->stream, val == 0x1c ? "%%bad%d" : "%%bac%d",
1259		 break_reg);
1260	    }
1261	    break;
1262	  default:
1263	    (*info->fprintf_func) (info->stream, "<mmu register %d>", val);
1264	  }
1265	if (name)
1266	  (*info->fprintf_func) (info->stream, "%s", name);
1267      }
1268      break;
1269
1270    case 'f':
1271      {
1272	int fc;
1273
1274	FETCH_ARG (5, fc);
1275	if (fc == 1)
1276	  (*info->fprintf_func) (info->stream, "%%dfc");
1277	else if (fc == 0)
1278	  (*info->fprintf_func) (info->stream, "%%sfc");
1279	else
1280	  /* xgettext:c-format */
1281	  (*info->fprintf_func) (info->stream, _("<function code %d>"), fc);
1282      }
1283      break;
1284
1285    case 'V':
1286      (*info->fprintf_func) (info->stream, "%%val");
1287      break;
1288
1289    case 't':
1290      {
1291	int level;
1292
1293	FETCH_ARG (3, level);
1294	(*info->fprintf_func) (info->stream, "%d", level);
1295      }
1296      break;
1297
1298    case 'u':
1299      {
1300	short is_upper = 0;
1301	int reg;
1302
1303	FETCH_ARG (5, reg);
1304	if (reg & 0x10)
1305	  {
1306	    is_upper = 1;
1307	    reg &= 0xf;
1308	  }
1309	(*info->fprintf_func) (info->stream, "%s%s",
1310			       reg_half_names[reg],
1311			       is_upper ? "u" : "l");
1312      }
1313      break;
1314
1315    default:
1316      return -2;
1317    }
1318
1319  return p - p0;
1320}
1321
1322/* Try to match the current instruction to best and if so, return the
1323   number of bytes consumed from the instruction stream, else zero.  */
1324
1325static int
1326match_insn_m68k (bfd_vma memaddr,
1327		 disassemble_info * info,
1328		 const struct m68k_opcode * best)
1329{
1330  unsigned char *save_p;
1331  unsigned char *p;
1332  const char *d;
1333  const char *args = best->args;
1334
1335  struct private *priv = (struct private *) info->private_data;
1336  bfd_byte *buffer = priv->the_buffer;
1337  fprintf_ftype save_printer = info->fprintf_func;
1338  void (* save_print_address) (bfd_vma, struct disassemble_info *)
1339    = info->print_address_func;
1340
1341  if (*args == '.')
1342    args++;
1343
1344  /* Point at first word of argument data,
1345     and at descriptor for first argument.  */
1346  p = buffer + 2;
1347
1348  /* Figure out how long the fixed-size portion of the instruction is.
1349     The only place this is stored in the opcode table is
1350     in the arguments--look for arguments which specify fields in the 2nd
1351     or 3rd words of the instruction.  */
1352  for (d = args; *d; d += 2)
1353    {
1354      /* I don't think it is necessary to be checking d[0] here;
1355	 I suspect all this could be moved to the case statement below.  */
1356      if (d[0] == '#')
1357	{
1358	  if (d[1] == 'l' && p - buffer < 6)
1359	    p = buffer + 6;
1360	  else if (p - buffer < 4 && d[1] != 'C' && d[1] != '8')
1361	    p = buffer + 4;
1362	}
1363
1364      if ((d[0] == 'L' || d[0] == 'l') && d[1] == 'w' && p - buffer < 4)
1365	p = buffer + 4;
1366
1367      switch (d[1])
1368	{
1369	case '1':
1370	case '2':
1371	case '3':
1372	case '7':
1373	case '8':
1374	case '9':
1375	case 'i':
1376	  if (p - buffer < 4)
1377	    p = buffer + 4;
1378	  break;
1379	case '4':
1380	case '5':
1381	case '6':
1382	  if (p - buffer < 6)
1383	    p = buffer + 6;
1384	  break;
1385	default:
1386	  break;
1387	}
1388    }
1389
1390  /* pflusha is an exceptions.  It takes no arguments but is two words
1391     long.  Recognize it by looking at the lower 16 bits of the mask.  */
1392  if (p - buffer < 4 && (best->match & 0xFFFF) != 0)
1393    p = buffer + 4;
1394
1395  /* lpstop is another exception.  It takes a one word argument but is
1396     three words long.  */
1397  if (p - buffer < 6
1398      && (best->match & 0xffff) == 0xffff
1399      && args[0] == '#'
1400      && args[1] == 'w')
1401    {
1402      /* Copy the one word argument into the usual location for a one
1403	 word argument, to simplify printing it.  We can get away with
1404	 this because we know exactly what the second word is, and we
1405	 aren't going to print anything based on it.  */
1406      p = buffer + 6;
1407      FETCH_DATA (info, p);
1408      buffer[2] = buffer[4];
1409      buffer[3] = buffer[5];
1410    }
1411
1412  FETCH_DATA (info, p);
1413
1414  save_p = p;
1415  info->print_address_func = dummy_print_address;
1416  info->fprintf_func = (fprintf_ftype) dummy_printer;
1417
1418  /* We scan the operands twice.  The first time we don't print anything,
1419     but look for errors.  */
1420  for (d = args; *d; d += 2)
1421    {
1422      int eaten = print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
1423
1424      if (eaten >= 0)
1425	p += eaten;
1426      else if (eaten == -1 || eaten == -3)
1427	{
1428	  info->fprintf_func = save_printer;
1429	  info->print_address_func = save_print_address;
1430	  return 0;
1431	}
1432      else
1433	{
1434	  /* We must restore the print functions before trying to print the
1435	     error message.  */
1436	  info->fprintf_func = save_printer;
1437	  info->print_address_func = save_print_address;
1438	  info->fprintf_func (info->stream,
1439			      /* xgettext:c-format */
1440			      _("<internal error in opcode table: %s %s>\n"),
1441			      best->name, best->args);
1442	  return 2;
1443	}
1444    }
1445
1446  p = save_p;
1447  info->fprintf_func = save_printer;
1448  info->print_address_func = save_print_address;
1449
1450  d = args;
1451
1452  info->fprintf_func (info->stream, "%s", best->name);
1453
1454  if (*d)
1455    info->fprintf_func (info->stream, " ");
1456
1457  while (*d)
1458    {
1459      p += print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
1460      d += 2;
1461
1462      if (*d && *(d - 2) != 'I' && *d != 'k')
1463	info->fprintf_func (info->stream, ",");
1464    }
1465
1466  return p - buffer;
1467}
1468
1469/* Try to interpret the instruction at address MEMADDR as one that
1470   can execute on a processor with the features given by ARCH_MASK.
1471   If successful, print the instruction to INFO->STREAM and return
1472   its length in bytes.  Return 0 otherwise.  */
1473
1474static int
1475m68k_scan_mask (bfd_vma memaddr, disassemble_info *info,
1476		unsigned int arch_mask)
1477{
1478  int i;
1479  const char *d;
1480  static const struct m68k_opcode **opcodes[16];
1481  static int numopcodes[16];
1482  int val;
1483  int major_opcode;
1484
1485  struct private *priv = (struct private *) info->private_data;
1486  bfd_byte *buffer = priv->the_buffer;
1487
1488  if (!opcodes[0])
1489    {
1490      /* Speed up the matching by sorting the opcode
1491	 table on the upper four bits of the opcode.  */
1492      const struct m68k_opcode **opc_pointer[16];
1493
1494      /* First count how many opcodes are in each of the sixteen buckets.  */
1495      for (i = 0; i < m68k_numopcodes; i++)
1496	numopcodes[(m68k_opcodes[i].opcode >> 28) & 15]++;
1497
1498      /* Then create a sorted table of pointers
1499	 that point into the unsorted table.  */
1500      opc_pointer[0] = xmalloc (sizeof (struct m68k_opcode *)
1501				* m68k_numopcodes);
1502      opcodes[0] = opc_pointer[0];
1503
1504      for (i = 1; i < 16; i++)
1505	{
1506	  opc_pointer[i] = opc_pointer[i - 1] + numopcodes[i - 1];
1507	  opcodes[i] = opc_pointer[i];
1508	}
1509
1510      for (i = 0; i < m68k_numopcodes; i++)
1511	*opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
1512    }
1513
1514  FETCH_DATA (info, buffer + 2);
1515  major_opcode = (buffer[0] >> 4) & 15;
1516
1517  for (i = 0; i < numopcodes[major_opcode]; i++)
1518    {
1519      const struct m68k_opcode *opc = opcodes[major_opcode][i];
1520      unsigned long opcode = opc->opcode;
1521      unsigned long match = opc->match;
1522      const char *args = opc->args;
1523
1524      if (*args == '.')
1525	args++;
1526
1527      if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
1528	  && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
1529	  /* Only fetch the next two bytes if we need to.  */
1530	  && (((0xffff & match) == 0)
1531	      ||
1532	      (FETCH_DATA (info, buffer + 4)
1533	       && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
1534	       && ((0xff & buffer[3] & match) == (0xff & opcode)))
1535	      )
1536	  && (opc->arch & arch_mask) != 0)
1537	{
1538	  /* Don't use for printout the variants of divul and divsl
1539	     that have the same register number in two places.
1540	     The more general variants will match instead.  */
1541	  for (d = args; *d; d += 2)
1542	    if (d[1] == 'D')
1543	      break;
1544
1545	  /* Don't use for printout the variants of most floating
1546	     point coprocessor instructions which use the same
1547	     register number in two places, as above.  */
1548	  if (*d == '\0')
1549	    for (d = args; *d; d += 2)
1550	      if (d[1] == 't')
1551		break;
1552
1553	  /* Don't match fmovel with more than one register;
1554	     wait for fmoveml.  */
1555	  if (*d == '\0')
1556	    {
1557	      for (d = args; *d; d += 2)
1558		{
1559		  if (d[0] == 's' && d[1] == '8')
1560		    {
1561		      val = fetch_arg (buffer, d[1], 3, info);
1562		      if (val < 0)
1563			return 0;
1564		      if ((val & (val - 1)) != 0)
1565			break;
1566		    }
1567		}
1568	    }
1569
1570	  /* Don't match FPU insns with non-default coprocessor ID.  */
1571	  if (*d == '\0')
1572	    {
1573	      for (d = args; *d; d += 2)
1574		{
1575		  if (d[0] == 'I')
1576		    {
1577		      val = fetch_arg (buffer, 'd', 3, info);
1578		      if (val != 1)
1579			break;
1580		    }
1581		}
1582	    }
1583
1584	  if (*d == '\0')
1585	    if ((val = match_insn_m68k (memaddr, info, opc)))
1586	      return val;
1587	}
1588    }
1589  return 0;
1590}
1591
1592/* Print the m68k instruction at address MEMADDR in debugged memory,
1593   on INFO->STREAM.  Returns length of the instruction, in bytes.  */
1594
1595int
1596print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
1597{
1598  unsigned int arch_mask;
1599  struct private priv;
1600  int val;
1601
1602  bfd_byte *buffer = priv.the_buffer;
1603
1604  info->private_data = & priv;
1605  /* Tell objdump to use two bytes per chunk
1606     and six bytes per line for displaying raw data.  */
1607  info->bytes_per_chunk = 2;
1608  info->bytes_per_line = 6;
1609  info->display_endian = BFD_ENDIAN_BIG;
1610  priv.max_fetched = priv.the_buffer;
1611  priv.insn_start = memaddr;
1612
1613  arch_mask = bfd_m68k_mach_to_features (info->mach);
1614  if (!arch_mask)
1615    {
1616      /* First try printing an m680x0 instruction.  Try printing a Coldfire
1617	 one if that fails.  */
1618      val = m68k_scan_mask (memaddr, info, m68k_mask);
1619      if (val == 0)
1620	val = m68k_scan_mask (memaddr, info, mcf_mask);
1621    }
1622  else
1623    {
1624      val = m68k_scan_mask (memaddr, info, arch_mask);
1625    }
1626
1627  if (val == 0)
1628    /* Handle undefined instructions.  */
1629    info->fprintf_func (info->stream, ".short 0x%04x", (buffer[0] << 8) + buffer[1]);
1630
1631  return val ? val : 2;
1632}
1633