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