Fix test for sections with different VMA<->LMA relationships so that it only applies...
[binutils-gdb.git] / opcodes / m68k-dis.c
blobbc2f82031c8dbc27c1b9b324c0f7b8988396fc94
1 /* Print Motorola 68k instructions.
2 Copyright (C) 1986-2024 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
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.
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.
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. */
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"
29 /* Local function prototypes. */
31 const char * const fpcr_names[] =
33 "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
34 "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"
37 static char *const reg_names[] =
39 "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
40 "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
41 "%ps", "%pc"
44 /* Name of register halves for MAC/EMAC.
45 Seperate from reg_names since 'spu', 'fpl' look weird. */
46 static char *const reg_half_names[] =
48 "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
49 "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
50 "%ps", "%pc"
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
60 /* Error code of print_insn_arg's return value. */
62 enum print_insn_arg_error
64 /* An invalid operand is found. */
65 PRINT_INSN_ARG_INVALID_OPERAND = -1,
67 /* An opcode table error. */
68 PRINT_INSN_ARG_INVALID_OP_TABLE = -2,
70 /* A memory error. */
71 PRINT_INSN_ARG_MEMORY_ERROR = -3,
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)
85 /* Get a 2 byte signed integer. */
86 #define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
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)
98 /* Get a 4 byte signed integer. */
99 #define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
101 #define NEXTLONG(p, val, ret_val) \
102 do \
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]); \
110 while (0)
112 /* Get a 4 byte unsigned integer. */
113 #define NEXTULONG(p, val) \
114 do \
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]); \
122 while (0)
124 /* Get a single precision float. */
125 #define NEXTSINGLE(val, p) \
126 do \
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); \
134 while (0)
136 /* Get a double precision float. */
137 #define NEXTDOUBLE(val, p) \
138 do \
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); \
146 while (0)
148 /* Get an extended precision float. */
149 #define NEXTEXTEND(val, p) \
150 do \
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); \
158 while (0)
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 \
167 p += 12; \
168 if (!FETCH_DATA (info, p)) \
169 return PRINT_INSN_ARG_MEMORY_ERROR; \
170 val = 0.0; \
172 while (0)
175 /* Maximum length of an instruction. */
176 #define MAXLEN 22
178 struct private
180 /* Points to first byte not fetched. */
181 bfd_byte *max_fetched;
182 bfd_byte the_buffer[MAXLEN];
183 bfd_vma insn_start;
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)))
193 static int
194 fetch_data (struct disassemble_info *info, bfd_byte *addr)
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);
200 status = (*info->read_memory_func) (start,
201 priv->max_fetched,
202 addr - priv->max_fetched,
203 info);
204 if (status != 0)
206 (*info->memory_error_func) (status, start, info);
207 return 0;
209 else
210 priv->max_fetched = addr;
211 return 1;
214 /* This function is used to print to the bit-bucket. */
215 static int
216 dummy_printer (void *file ATTRIBUTE_UNUSED,
217 enum disassembler_style style ATTRIBUTE_UNUSED,
218 const char *format ATTRIBUTE_UNUSED,
219 ...)
221 return 0;
224 static void
225 dummy_print_address (bfd_vma vma ATTRIBUTE_UNUSED,
226 struct disassemble_info *info ATTRIBUTE_UNUSED)
230 /* Fetch BITS bits from a position in the instruction specified by CODE.
231 CODE is a "place to put an argument", or 'x' for a destination
232 that is a general address (mode and register).
233 BUFFER contains the instruction.
234 Returns -1 on failure. */
236 static int
237 fetch_arg (unsigned char *buffer,
238 int code,
239 int bits,
240 disassemble_info *info)
242 int val = 0;
244 switch (code)
246 case '/': /* MAC/EMAC mask bit. */
247 val = buffer[3] >> 5;
248 break;
250 case 'G': /* EMAC ACC load. */
251 val = ((buffer[3] >> 3) & 0x2) | ((~buffer[1] >> 7) & 0x1);
252 break;
254 case 'H': /* EMAC ACC !load. */
255 val = ((buffer[3] >> 3) & 0x2) | ((buffer[1] >> 7) & 0x1);
256 break;
258 case ']': /* EMAC ACCEXT bit. */
259 val = buffer[0] >> 2;
260 break;
262 case 'I': /* MAC/EMAC scale factor. */
263 val = buffer[2] >> 1;
264 break;
266 case 'F': /* EMAC ACCx. */
267 val = buffer[0] >> 1;
268 break;
270 case 'f':
271 val = buffer[1];
272 break;
274 case 's':
275 val = buffer[1];
276 break;
278 case 'd': /* Destination, for register or quick. */
279 val = (buffer[0] << 8) + buffer[1];
280 val >>= 9;
281 break;
283 case 'x': /* Destination, for general arg. */
284 val = (buffer[0] << 8) + buffer[1];
285 val >>= 6;
286 break;
288 case 'k':
289 if (! FETCH_DATA (info, buffer + 3))
290 return -1;
291 val = (buffer[3] >> 4);
292 break;
294 case 'C':
295 if (! FETCH_DATA (info, buffer + 3))
296 return -1;
297 val = buffer[3];
298 break;
300 case '1':
301 if (! FETCH_DATA (info, buffer + 3))
302 return -1;
303 val = (buffer[2] << 8) + buffer[3];
304 val >>= 12;
305 break;
307 case '2':
308 if (! FETCH_DATA (info, buffer + 3))
309 return -1;
310 val = (buffer[2] << 8) + buffer[3];
311 val >>= 6;
312 break;
314 case '3':
315 case 'j':
316 if (! FETCH_DATA (info, buffer + 3))
317 return -1;
318 val = (buffer[2] << 8) + buffer[3];
319 break;
321 case '4':
322 if (! FETCH_DATA (info, buffer + 5))
323 return -1;
324 val = (buffer[4] << 8) + buffer[5];
325 val >>= 12;
326 break;
328 case '5':
329 if (! FETCH_DATA (info, buffer + 5))
330 return -1;
331 val = (buffer[4] << 8) + buffer[5];
332 val >>= 6;
333 break;
335 case '6':
336 if (! FETCH_DATA (info, buffer + 5))
337 return -1;
338 val = (buffer[4] << 8) + buffer[5];
339 break;
341 case '7':
342 if (! FETCH_DATA (info, buffer + 3))
343 return -1;
344 val = (buffer[2] << 8) + buffer[3];
345 val >>= 7;
346 break;
348 case '8':
349 if (! FETCH_DATA (info, buffer + 3))
350 return -1;
351 val = (buffer[2] << 8) + buffer[3];
352 val >>= 10;
353 break;
355 case '9':
356 if (! FETCH_DATA (info, buffer + 3))
357 return -1;
358 val = (buffer[2] << 8) + buffer[3];
359 val >>= 5;
360 break;
362 case 'e':
363 val = (buffer[1] >> 6);
364 break;
366 case 'E':
367 if (! FETCH_DATA (info, buffer + 3))
368 return -1;
369 val = (buffer[2] >> 1);
370 break;
372 case 'm':
373 val = (buffer[1] & 0x40 ? 0x8 : 0)
374 | ((buffer[0] >> 1) & 0x7)
375 | (buffer[3] & 0x80 ? 0x10 : 0);
376 break;
378 case 'n':
379 val = (buffer[1] & 0x40 ? 0x8 : 0) | ((buffer[0] >> 1) & 0x7);
380 break;
382 case 'o':
383 val = (buffer[2] >> 4) | (buffer[3] & 0x80 ? 0x10 : 0);
384 break;
386 case 'M':
387 val = (buffer[1] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
388 break;
390 case 'N':
391 val = (buffer[3] & 0xf) | (buffer[3] & 0x40 ? 0x10 : 0);
392 break;
394 case 'h':
395 val = buffer[2] >> 2;
396 break;
398 default:
399 abort ();
402 /* bits is never too big. */
403 return val & ((1 << bits) - 1);
406 /* Check if an EA is valid for a particular code. This is required
407 for the EMAC instructions since the type of source address determines
408 if it is a EMAC-load instruciton if the EA is mode 2-5, otherwise it
409 is a non-load EMAC instruction and the bits mean register Ry.
410 A similar case exists for the movem instructions where the register
411 mask is interpreted differently for different EAs. */
413 static bool
414 m68k_valid_ea (char code, int val)
416 int mode, mask;
417 #define M(n0,n1,n2,n3,n4,n5,n6,n70,n71,n72,n73,n74) \
418 (n0 | n1 << 1 | n2 << 2 | n3 << 3 | n4 << 4 | n5 << 5 | n6 << 6 \
419 | n70 << 7 | n71 << 8 | n72 << 9 | n73 << 10 | n74 << 11)
421 switch (code)
423 case '*':
424 mask = M (1,1,1,1,1,1,1,1,1,1,1,1);
425 break;
426 case '~':
427 mask = M (0,0,1,1,1,1,1,1,1,0,0,0);
428 break;
429 case '%':
430 mask = M (1,1,1,1,1,1,1,1,1,0,0,0);
431 break;
432 case ';':
433 mask = M (1,0,1,1,1,1,1,1,1,1,1,1);
434 break;
435 case '@':
436 mask = M (1,0,1,1,1,1,1,1,1,1,1,0);
437 break;
438 case '!':
439 mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
440 break;
441 case '&':
442 mask = M (0,0,1,0,0,1,1,1,1,0,0,0);
443 break;
444 case '$':
445 mask = M (1,0,1,1,1,1,1,1,1,0,0,0);
446 break;
447 case '?':
448 mask = M (1,0,1,0,0,1,1,1,1,0,0,0);
449 break;
450 case '/':
451 mask = M (1,0,1,0,0,1,1,1,1,1,1,0);
452 break;
453 case '|':
454 mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
455 break;
456 case '>':
457 mask = M (0,0,1,0,1,1,1,1,1,0,0,0);
458 break;
459 case '<':
460 mask = M (0,0,1,1,0,1,1,1,1,1,1,0);
461 break;
462 case 'm':
463 mask = M (1,1,1,1,1,0,0,0,0,0,0,0);
464 break;
465 case 'n':
466 mask = M (0,0,0,0,0,1,0,0,0,1,0,0);
467 break;
468 case 'o':
469 mask = M (0,0,0,0,0,0,1,1,1,0,1,1);
470 break;
471 case 'p':
472 mask = M (1,1,1,1,1,1,0,0,0,0,0,0);
473 break;
474 case 'q':
475 mask = M (1,0,1,1,1,1,0,0,0,0,0,0);
476 break;
477 case 'v':
478 mask = M (1,0,1,1,1,1,0,1,1,0,0,0);
479 break;
480 case 'b':
481 mask = M (1,0,1,1,1,1,0,0,0,1,0,0);
482 break;
483 case 'w':
484 mask = M (0,0,1,1,1,1,0,0,0,1,0,0);
485 break;
486 case 'y':
487 mask = M (0,0,1,0,0,1,0,0,0,0,0,0);
488 break;
489 case 'z':
490 mask = M (0,0,1,0,0,1,0,0,0,1,0,0);
491 break;
492 case '4':
493 mask = M (0,0,1,1,1,1,0,0,0,0,0,0);
494 break;
495 default:
496 abort ();
498 #undef M
500 mode = (val >> 3) & 7;
501 if (mode == 7)
502 mode += val & 7;
503 return (mask & (1 << mode)) != 0;
506 /* Print a base register REGNO and displacement DISP, on INFO->STREAM.
507 REGNO = -1 for pc, -2 for none (suppressed). */
509 static void
510 print_base (int regno, bfd_vma disp, disassemble_info *info)
512 if (regno == -1)
514 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%pc");
515 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
516 (*info->print_address_func) (disp, info);
518 else
520 if (regno == -3)
521 (*info->fprintf_styled_func) (info->stream, dis_style_register,
522 "%%zpc");
523 else if (regno != -2)
524 (*info->fprintf_styled_func) (info->stream, dis_style_register,
525 "%s", reg_names[regno]);
526 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
527 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
528 "%" PRIx64, (uint64_t) disp);
532 /* Print the index register of an indexed argument, as encoded in the
533 extension word. */
535 static void
536 print_index_register (int ext, disassemble_info *info)
538 (*info->fprintf_styled_func) (info->stream, dis_style_register,
539 "%s", reg_names[(ext >> 12) & 0xf]);
540 (*info->fprintf_styled_func) (info->stream, dis_style_text,
541 ":%c", ext & 0x800 ? 'l' : 'w');
542 if ((ext >> 9) & 3)
544 (*info->fprintf_styled_func) (info->stream, dis_style_text, ":");
545 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
546 "%d", 1 << ((ext >> 9) & 3));
550 /* Print an indexed argument. The base register is BASEREG (-1 for pc).
551 P points to extension word, in buffer.
552 ADDR is the nominal core address of that extension word.
553 Returns NULL upon error. */
555 static unsigned char *
556 print_indexed (int basereg,
557 unsigned char *p,
558 bfd_vma addr,
559 disassemble_info *info)
561 int word;
562 bfd_vma base_disp;
563 bfd_vma outer_disp;
564 bool print_index = true;
566 NEXTWORD (p, word, NULL);
568 /* Handle the 68000 style of indexing. */
570 if ((word & 0x100) == 0)
572 base_disp = word & 0xff;
573 if ((base_disp & 0x80) != 0)
574 base_disp -= 0x100;
575 if (basereg == -1)
576 base_disp += addr;
577 print_base (basereg, base_disp, info);
578 (*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
579 print_index_register (word, info);
580 (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
581 return p;
584 /* Handle the generalized kind. */
585 /* First, compute the displacement to add to the base register. */
586 if (word & 0200)
588 if (basereg == -1)
589 basereg = -3;
590 else
591 basereg = -2;
593 if (word & 0100)
594 print_index = false;
595 base_disp = 0;
596 switch ((word >> 4) & 3)
598 case 2:
599 NEXTWORD (p, base_disp, NULL);
600 break;
601 case 3:
602 NEXTLONG (p, base_disp, NULL);
604 if (basereg == -1)
605 base_disp += addr;
607 /* Handle single-level case (not indirect). */
608 if ((word & 7) == 0)
610 print_base (basereg, base_disp, info);
611 if (print_index)
613 (*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
614 print_index_register (word, info);
616 (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
617 return p;
620 /* Two level. Compute displacement to add after indirection. */
621 outer_disp = 0;
622 switch (word & 3)
624 case 2:
625 NEXTWORD (p, outer_disp, NULL);
626 break;
627 case 3:
628 NEXTLONG (p, outer_disp, NULL);
631 print_base (basereg, base_disp, info);
632 if ((word & 4) == 0 && print_index)
634 (*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
635 print_index_register (word, info);
636 print_index = false;
638 (*info->fprintf_styled_func) (info->stream, dis_style_text,
639 ")@(");
640 (*info->fprintf_styled_func) (info->stream, dis_style_address_offset,
641 "%" PRIx64, (uint64_t) outer_disp);
642 if (print_index)
644 (*info->fprintf_styled_func) (info->stream, dis_style_text, ",");
645 print_index_register (word, info);
647 (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
649 return p;
652 #define FETCH_ARG(size, val) \
653 do \
655 val = fetch_arg (buffer, place, size, info); \
656 if (val < 0) \
657 return PRINT_INSN_ARG_MEMORY_ERROR; \
659 while (0)
661 /* Returns number of bytes "eaten" by the operand, or
662 return enum print_insn_arg_error. ADDR is the pc for this arg to be
663 relative to. */
665 static int
666 print_insn_arg (const char *d,
667 unsigned char *buffer,
668 unsigned char *p0,
669 bfd_vma addr,
670 disassemble_info *info)
672 int val = 0;
673 int place = d[1];
674 unsigned char *p = p0;
675 int regno;
676 const char *regname;
677 unsigned char *p1;
678 double flval;
679 int flt_p;
680 bfd_signed_vma disp;
681 unsigned int uval;
683 switch (*d)
685 case 'c': /* Cache identifier. */
687 static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
688 FETCH_ARG (2, val);
689 (*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
690 "%s", cacheFieldName[val]);
691 break;
694 case 'a': /* Address register indirect only. Cf. case '+'. */
696 FETCH_ARG (3, val);
697 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%s",
698 reg_names[val + 8]);
699 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
700 break;
703 case '_': /* 32-bit absolute address for move16. */
705 NEXTULONG (p, uval);
706 (*info->print_address_func) (uval, info);
707 break;
710 case 'C':
711 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%ccr");
712 break;
714 case 'S':
715 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%sr");
716 break;
718 case 'U':
719 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%usp");
720 break;
722 case 'E':
723 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%acc");
724 break;
726 case 'G':
727 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%macsr");
728 break;
730 case 'H':
731 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%mask");
732 break;
734 case 'J':
736 /* FIXME: There's a problem here, different m68k processors call the
737 same address different names. The tables below try to get it right
738 using info->mach, but only for v4e. */
739 struct regname { char * name; int value; };
740 static const struct regname names[] =
742 {"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
743 {"%tc", 0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
744 {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
745 {"%rgpiobar", 0x009}, {"%acr4",0x00c},
746 {"%acr5",0x00d}, {"%acr6",0x00e}, {"%acr7", 0x00f},
747 {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
748 {"%msp", 0x803}, {"%isp", 0x804},
749 {"%pc", 0x80f},
750 /* Reg c04 is sometimes called flashbar or rambar.
751 Reg c05 is also sometimes called rambar. */
752 {"%rambar0", 0xc04}, {"%rambar1", 0xc05},
754 /* reg c0e is sometimes called mbar2 or secmbar.
755 reg c0f is sometimes called mbar. */
756 {"%mbar0", 0xc0e}, {"%mbar1", 0xc0f},
758 /* Should we be calling this psr like we do in case 'Y'? */
759 {"%mmusr",0x805},
761 {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808},
763 /* Fido added these. */
764 {"%cac", 0xffe}, {"%mbo", 0xfff}
766 /* Alternate names for v4e (MCF5407/5445x/MCF547x/MCF548x), at least. */
767 static const struct regname names_v4e[] =
769 {"%asid",0x003}, {"%acr0",0x004}, {"%acr1",0x005},
770 {"%acr2",0x006}, {"%acr3",0x007}, {"%mmubar",0x008},
772 unsigned int arch_mask;
774 arch_mask = bfd_m68k_mach_to_features (info->mach);
775 FETCH_ARG (12, val);
776 if (arch_mask & (mcfisa_b | mcfisa_c))
778 for (regno = ARRAY_SIZE (names_v4e); --regno >= 0;)
779 if (names_v4e[regno].value == val)
781 (*info->fprintf_styled_func) (info->stream, dis_style_register,
782 "%s", names_v4e[regno].name);
783 break;
785 if (regno >= 0)
786 break;
788 for (regno = ARRAY_SIZE (names) - 1; regno >= 0; regno--)
789 if (names[regno].value == val)
791 (*info->fprintf_styled_func) (info->stream, dis_style_register,
792 "%s", names[regno].name);
793 break;
795 if (regno < 0)
796 (*info->fprintf_styled_func) (info->stream, dis_style_text, "0x%x", val);
798 break;
800 case 'Q':
801 FETCH_ARG (3, val);
802 /* 0 means 8, except for the bkpt instruction... */
803 if (val == 0 && d[1] != 's')
804 val = 8;
805 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
806 "#%d", val);
807 break;
809 case 'x':
810 FETCH_ARG (3, val);
811 /* 0 means -1. */
812 if (val == 0)
813 val = -1;
814 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
815 "#%d", val);
816 break;
818 case 'j':
819 FETCH_ARG (3, val);
820 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
821 "#%d", val+1);
822 break;
824 case 'K':
825 FETCH_ARG (9, val);
826 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
827 "#%d", val);
828 break;
830 case 'M':
831 if (place == 'h')
833 static char *const scalefactor_name[] = { "<<", ">>" };
835 FETCH_ARG (1, val);
836 (*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
837 "%s", scalefactor_name[val]);
839 else
841 FETCH_ARG (8, val);
842 if (val & 0x80)
843 val = val - 0x100;
844 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
845 "#%d", val);
847 break;
849 case 'T':
850 FETCH_ARG (4, val);
851 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
852 "#%d", val);
853 break;
855 case 'D':
856 FETCH_ARG (3, val);
857 (*info->fprintf_styled_func) (info->stream, dis_style_register,
858 "%s", reg_names[val]);
859 break;
861 case 'A':
862 FETCH_ARG (3, val);
863 (*info->fprintf_styled_func) (info->stream, dis_style_register,
864 "%s", reg_names[val + 010]);
865 break;
867 case 'R':
868 FETCH_ARG (4, val);
869 (*info->fprintf_styled_func) (info->stream, dis_style_register,
870 "%s", reg_names[val]);
871 break;
873 case 'r':
874 FETCH_ARG (4, regno);
875 if (regno > 7)
877 (*info->fprintf_styled_func) (info->stream, dis_style_register,
878 "%s", reg_names[regno]);
879 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
881 else
883 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
884 (*info->fprintf_styled_func) (info->stream, dis_style_register,
885 "%s", reg_names[regno]);
886 (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
888 break;
890 case 'F':
891 FETCH_ARG (3, val);
892 (*info->fprintf_styled_func) (info->stream, dis_style_register,
893 "%%fp%d", val);
894 break;
896 case 'O':
897 FETCH_ARG (6, val);
898 if (val & 0x20)
899 (*info->fprintf_styled_func) (info->stream, dis_style_register,
900 "%s", reg_names[val & 7]);
901 else
902 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
903 "%d", val);
904 break;
906 case '+':
907 FETCH_ARG (3, val);
908 (*info->fprintf_styled_func) (info->stream, dis_style_register,
909 "%s", reg_names[val + 8]);
910 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@+");
911 break;
913 case '-':
914 FETCH_ARG (3, val);
915 (*info->fprintf_styled_func) (info->stream, dis_style_register,
916 "%s", reg_names[val + 8]);
917 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@-");
918 break;
920 case 'k':
921 if (place == 'k')
923 FETCH_ARG (3, val);
924 (*info->fprintf_styled_func) (info->stream, dis_style_text, "{");
925 (*info->fprintf_styled_func) (info->stream, dis_style_register,
926 "%s", reg_names[val]);
927 (*info->fprintf_styled_func) (info->stream, dis_style_text, "}");
929 else if (place == 'C')
931 FETCH_ARG (7, val);
932 if (val > 63) /* This is a signed constant. */
933 val -= 128;
934 (*info->fprintf_styled_func) (info->stream, dis_style_text, "{");
935 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
936 "#%d", val);
937 (*info->fprintf_styled_func) (info->stream, dis_style_text, "}");
939 else
940 return PRINT_INSN_ARG_INVALID_OPERAND;
941 break;
943 case '#':
944 case '^':
945 p1 = buffer + (*d == '#' ? 2 : 4);
946 if (place == 's')
947 FETCH_ARG (4, val);
948 else if (place == 'C')
949 FETCH_ARG (7, val);
950 else if (place == '8')
951 FETCH_ARG (3, val);
952 else if (place == '3')
953 FETCH_ARG (8, val);
954 else if (place == 'b')
955 NEXTBYTE (p1, val);
956 else if (place == 'w' || place == 'W')
957 NEXTWORD (p1, val, PRINT_INSN_ARG_MEMORY_ERROR);
958 else if (place == 'l')
959 NEXTLONG (p1, val, PRINT_INSN_ARG_MEMORY_ERROR);
960 else
961 return PRINT_INSN_ARG_INVALID_OP_TABLE;
963 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
964 "#%d", val);
965 break;
967 case 'B':
968 if (place == 'b')
969 NEXTBYTE (p, disp);
970 else if (place == 'B')
971 disp = COERCE_SIGNED_CHAR (buffer[1]);
972 else if (place == 'w' || place == 'W')
973 NEXTWORD (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
974 else if (place == 'l' || place == 'L' || place == 'C')
975 NEXTLONG (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
976 else if (place == 'g')
978 NEXTBYTE (buffer, disp);
979 if (disp == 0)
980 NEXTWORD (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
981 else if (disp == -1)
982 NEXTLONG (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
984 else if (place == 'c')
986 if (buffer[1] & 0x40) /* If bit six is one, long offset. */
987 NEXTLONG (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
988 else
989 NEXTWORD (p, disp, PRINT_INSN_ARG_MEMORY_ERROR);
991 else
992 return PRINT_INSN_ARG_INVALID_OP_TABLE;
994 (*info->print_address_func) (addr + disp, info);
995 break;
997 case 'd':
999 int val1;
1001 NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
1002 FETCH_ARG (3, val1);
1003 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1004 "%s", reg_names[val1 + 8]);
1005 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
1006 (*info->fprintf_styled_func) (info->stream, dis_style_address_offset,
1007 "%d", val);
1008 (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
1009 break;
1012 case 's':
1013 FETCH_ARG (3, val);
1014 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1015 "%s", fpcr_names[val]);
1016 break;
1018 case 'e':
1019 FETCH_ARG (2, val);
1020 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1021 "%%acc%d", val);
1022 break;
1024 case 'g':
1025 FETCH_ARG (1, val);
1026 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1027 "%%accext%s", val == 0 ? "01" : "23");
1028 break;
1030 case 'i':
1031 FETCH_ARG (2, val);
1032 if (val == 1)
1033 (*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
1034 "<<");
1035 else if (val == 3)
1036 (*info->fprintf_styled_func) (info->stream, dis_style_sub_mnemonic,
1037 ">>");
1038 else
1039 return PRINT_INSN_ARG_INVALID_OPERAND;
1040 break;
1042 case 'I':
1043 /* Get coprocessor ID... */
1044 val = fetch_arg (buffer, 'd', 3, info);
1045 if (val < 0)
1046 return PRINT_INSN_ARG_MEMORY_ERROR;
1047 if (val != 1) /* Unusual coprocessor ID? */
1048 (*info->fprintf_styled_func) (info->stream, dis_style_text,
1049 "(cpid=%d) ", val);
1050 break;
1052 case '4':
1053 case '*':
1054 case '~':
1055 case '%':
1056 case ';':
1057 case '@':
1058 case '!':
1059 case '$':
1060 case '?':
1061 case '/':
1062 case '&':
1063 case '|':
1064 case '<':
1065 case '>':
1066 case 'm':
1067 case 'n':
1068 case 'o':
1069 case 'p':
1070 case 'q':
1071 case 'v':
1072 case 'b':
1073 case 'w':
1074 case 'y':
1075 case 'z':
1076 if (place == 'd')
1078 val = fetch_arg (buffer, 'x', 6, info);
1079 if (val < 0)
1080 return PRINT_INSN_ARG_MEMORY_ERROR;
1081 val = ((val & 7) << 3) + ((val >> 3) & 7);
1083 else
1085 val = fetch_arg (buffer, 's', 6, info);
1086 if (val < 0)
1087 return PRINT_INSN_ARG_MEMORY_ERROR;
1090 /* If the <ea> is invalid for *d, then reject this match. */
1091 if (!m68k_valid_ea (*d, val))
1092 return PRINT_INSN_ARG_INVALID_OPERAND;
1094 /* Get register number assuming address register. */
1095 regno = (val & 7) + 8;
1096 regname = reg_names[regno];
1097 switch (val >> 3)
1099 case 0:
1100 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1101 "%s", reg_names[val]);
1102 break;
1104 case 1:
1105 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1106 "%s", regname);
1107 break;
1109 case 2:
1110 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1111 "%s", regname);
1112 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@");
1113 break;
1115 case 3:
1116 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1117 "%s", regname);
1118 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@+");
1119 break;
1121 case 4:
1122 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1123 "%s", regname);
1124 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@-");
1125 break;
1127 case 5:
1128 NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
1129 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1130 "%s", regname);
1131 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
1132 (*info->fprintf_styled_func) (info->stream, dis_style_address_offset,
1133 "%d", val);
1134 (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
1135 break;
1137 case 6:
1138 p = print_indexed (regno, p, addr, info);
1139 if (p == NULL)
1140 return PRINT_INSN_ARG_MEMORY_ERROR;
1141 break;
1143 case 7:
1144 switch (val & 7)
1146 case 0:
1147 NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
1148 (*info->print_address_func) (val, info);
1149 break;
1151 case 1:
1152 NEXTULONG (p, uval);
1153 (*info->print_address_func) (uval, info);
1154 break;
1156 case 2:
1157 NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
1158 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1159 "%%pc");
1160 (*info->fprintf_styled_func) (info->stream, dis_style_text, "@(");
1161 (*info->print_address_func) (addr + val, info);
1162 (*info->fprintf_styled_func) (info->stream, dis_style_text, ")");
1163 break;
1165 case 3:
1166 p = print_indexed (-1, p, addr, info);
1167 if (p == NULL)
1168 return PRINT_INSN_ARG_MEMORY_ERROR;
1169 break;
1171 case 4:
1172 flt_p = 1; /* Assume it's a float... */
1173 switch (place)
1175 case 'b':
1176 NEXTBYTE (p, val);
1177 flt_p = 0;
1178 break;
1180 case 'w':
1181 NEXTWORD (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
1182 flt_p = 0;
1183 break;
1185 case 'l':
1186 NEXTLONG (p, val, PRINT_INSN_ARG_MEMORY_ERROR);
1187 flt_p = 0;
1188 break;
1190 case 'f':
1191 NEXTSINGLE (flval, p);
1192 break;
1194 case 'F':
1195 NEXTDOUBLE (flval, p);
1196 break;
1198 case 'x':
1199 NEXTEXTEND (flval, p);
1200 break;
1202 case 'p':
1203 NEXTPACKED (p, flval);
1204 break;
1206 default:
1207 return PRINT_INSN_ARG_INVALID_OPERAND;
1209 if (flt_p) /* Print a float? */
1210 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
1211 "#0e%g", flval);
1212 else
1213 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
1214 "#%d", val);
1215 break;
1217 default:
1218 return PRINT_INSN_ARG_INVALID_OPERAND;
1222 /* If place is '/', then this is the case of the mask bit for
1223 mac/emac loads. Now that the arg has been printed, grab the
1224 mask bit and if set, add a '&' to the arg. */
1225 if (place == '/')
1227 FETCH_ARG (1, val);
1228 if (val)
1229 info->fprintf_styled_func (info->stream, dis_style_text, "&");
1231 break;
1233 case 'L':
1234 case 'l':
1235 if (place == 'w')
1237 char doneany;
1238 p1 = buffer + 2;
1239 NEXTWORD (p1, val, PRINT_INSN_ARG_MEMORY_ERROR);
1240 /* Move the pointer ahead if this point is farther ahead
1241 than the last. */
1242 p = p1 > p ? p1 : p;
1243 if (val == 0)
1245 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
1246 "#0");
1247 break;
1249 if (*d == 'l')
1251 int newval = 0;
1253 for (regno = 0; regno < 16; ++regno)
1254 if (val & (0x8000 >> regno))
1255 newval |= 1 << regno;
1256 val = newval;
1258 val &= 0xffff;
1259 doneany = 0;
1260 for (regno = 0; regno < 16; ++regno)
1261 if (val & (1 << regno))
1263 int first_regno;
1265 if (doneany)
1266 (*info->fprintf_styled_func) (info->stream, dis_style_text,
1267 "/");
1268 doneany = 1;
1269 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1270 "%s", reg_names[regno]);
1271 first_regno = regno;
1272 while (val & (1 << (regno + 1)))
1273 ++regno;
1274 if (regno > first_regno)
1276 (*info->fprintf_styled_func) (info->stream,
1277 dis_style_text, "-");
1278 (*info->fprintf_styled_func) (info->stream,
1279 dis_style_register, "%s",
1280 reg_names[regno]);
1284 else if (place == '3')
1286 /* `fmovem' insn. */
1287 char doneany;
1289 FETCH_ARG (8, val);
1290 if (val == 0)
1292 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
1293 "#0");
1294 break;
1296 if (*d == 'l')
1298 int newval = 0;
1300 for (regno = 0; regno < 8; ++regno)
1301 if (val & (0x80 >> regno))
1302 newval |= 1 << regno;
1303 val = newval;
1305 val &= 0xff;
1306 doneany = 0;
1307 for (regno = 0; regno < 8; ++regno)
1308 if (val & (1 << regno))
1310 int first_regno;
1311 if (doneany)
1312 (*info->fprintf_styled_func) (info->stream, dis_style_text,
1313 "/");
1314 doneany = 1;
1315 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1316 "%%fp%d", regno);
1317 first_regno = regno;
1318 while (val & (1 << (regno + 1)))
1319 ++regno;
1320 if (regno > first_regno)
1322 (*info->fprintf_styled_func) (info->stream,
1323 dis_style_text, "-");
1324 (*info->fprintf_styled_func) (info->stream,
1325 dis_style_register,
1326 "%%fp%d", regno);
1330 else if (place == '8')
1332 FETCH_ARG (3, val);
1333 /* fmoveml for FP status registers. */
1334 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1335 "%s", fpcr_names[val]);
1337 else
1338 return PRINT_INSN_ARG_INVALID_OP_TABLE;
1339 break;
1341 case 'X':
1342 place = '8';
1343 /* Fall through. */
1344 case 'Y':
1345 case 'Z':
1346 case 'W':
1347 case '0':
1348 case '1':
1349 case '2':
1350 case '3':
1352 char *name = 0;
1354 FETCH_ARG (5, val);
1355 switch (val)
1357 case 2: name = "%tt0"; break;
1358 case 3: name = "%tt1"; break;
1359 case 0x10: name = "%tc"; break;
1360 case 0x11: name = "%drp"; break;
1361 case 0x12: name = "%srp"; break;
1362 case 0x13: name = "%crp"; break;
1363 case 0x14: name = "%cal"; break;
1364 case 0x15: name = "%val"; break;
1365 case 0x16: name = "%scc"; break;
1366 case 0x17: name = "%ac"; break;
1367 case 0x18: name = "%psr"; break;
1368 case 0x19: name = "%pcsr"; break;
1369 case 0x1c:
1370 case 0x1d:
1372 int break_reg = ((buffer[3] >> 2) & 7);
1374 (*info->fprintf_styled_func)
1375 (info->stream, dis_style_register,
1376 val == 0x1c ? "%%bad%d" : "%%bac%d", break_reg);
1378 break;
1379 default:
1380 (*info->fprintf_styled_func) (info->stream, dis_style_text,
1381 "<mmu register %d>", val);
1383 if (name)
1384 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1385 "%s", name);
1387 break;
1389 case 'f':
1391 int fc;
1393 FETCH_ARG (5, fc);
1394 if (fc == 1)
1395 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1396 "%%dfc");
1397 else if (fc == 0)
1398 (*info->fprintf_styled_func) (info->stream, dis_style_register,
1399 "%%sfc");
1400 else
1401 /* xgettext:c-format */
1402 (*info->fprintf_styled_func) (info->stream, dis_style_text,
1403 _("<function code %d>"), fc);
1405 break;
1407 case 'V':
1408 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%%val");
1409 break;
1411 case 't':
1413 int level;
1415 FETCH_ARG (3, level);
1416 (*info->fprintf_styled_func) (info->stream, dis_style_immediate,
1417 "%d", level);
1419 break;
1421 case 'u':
1423 short is_upper = 0;
1424 int reg;
1426 FETCH_ARG (5, reg);
1427 if (reg & 0x10)
1429 is_upper = 1;
1430 reg &= 0xf;
1432 (*info->fprintf_styled_func) (info->stream, dis_style_register, "%s%s",
1433 reg_half_names[reg],
1434 is_upper ? "u" : "l");
1436 break;
1438 default:
1439 return PRINT_INSN_ARG_INVALID_OP_TABLE;
1442 return p - p0;
1445 /* Try to match the current instruction to best and if so, return the
1446 number of bytes consumed from the instruction stream, else zero.
1447 Return -1 on memory error. */
1449 static int
1450 match_insn_m68k (bfd_vma memaddr,
1451 disassemble_info * info,
1452 const struct m68k_opcode * best)
1454 unsigned char *save_p;
1455 unsigned char *p;
1456 const char *d;
1457 const char *args = best->args;
1459 struct private *priv = (struct private *) info->private_data;
1460 bfd_byte *buffer = priv->the_buffer;
1461 fprintf_styled_ftype save_printer = info->fprintf_styled_func;
1462 void (* save_print_address) (bfd_vma, struct disassemble_info *)
1463 = info->print_address_func;
1465 if (*args == '.')
1466 args++;
1468 /* Point at first word of argument data,
1469 and at descriptor for first argument. */
1470 p = buffer + 2;
1472 /* Figure out how long the fixed-size portion of the instruction is.
1473 The only place this is stored in the opcode table is
1474 in the arguments--look for arguments which specify fields in the 2nd
1475 or 3rd words of the instruction. */
1476 for (d = args; *d; d += 2)
1478 /* I don't think it is necessary to be checking d[0] here;
1479 I suspect all this could be moved to the case statement below. */
1480 if (d[0] == '#')
1482 if (d[1] == 'l' && p - buffer < 6)
1483 p = buffer + 6;
1484 else if (p - buffer < 4 && d[1] != 'C' && d[1] != '8')
1485 p = buffer + 4;
1488 if ((d[0] == 'L' || d[0] == 'l') && d[1] == 'w' && p - buffer < 4)
1489 p = buffer + 4;
1491 switch (d[1])
1493 case '1':
1494 case '2':
1495 case '3':
1496 case '7':
1497 case '8':
1498 case '9':
1499 case 'i':
1500 if (p - buffer < 4)
1501 p = buffer + 4;
1502 break;
1503 case '4':
1504 case '5':
1505 case '6':
1506 if (p - buffer < 6)
1507 p = buffer + 6;
1508 break;
1509 default:
1510 break;
1514 /* pflusha is an exceptions. It takes no arguments but is two words
1515 long. Recognize it by looking at the lower 16 bits of the mask. */
1516 if (p - buffer < 4 && (best->match & 0xFFFF) != 0)
1517 p = buffer + 4;
1519 /* lpstop is another exception. It takes a one word argument but is
1520 three words long. */
1521 if (p - buffer < 6
1522 && (best->match & 0xffff) == 0xffff
1523 && args[0] == '#'
1524 && args[1] == 'w')
1526 /* Copy the one word argument into the usual location for a one
1527 word argument, to simplify printing it. We can get away with
1528 this because we know exactly what the second word is, and we
1529 aren't going to print anything based on it. */
1530 p = buffer + 6;
1531 if (!FETCH_DATA (info, p))
1532 return -1;
1533 buffer[2] = buffer[4];
1534 buffer[3] = buffer[5];
1537 if (!FETCH_DATA (info, p))
1538 return -1;
1540 save_p = p;
1541 info->print_address_func = dummy_print_address;
1542 info->fprintf_styled_func = dummy_printer;
1544 /* We scan the operands twice. The first time we don't print anything,
1545 but look for errors. */
1546 for (d = args; *d; d += 2)
1548 int eaten = print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
1550 if (eaten >= 0)
1551 p += eaten;
1552 else if (eaten == PRINT_INSN_ARG_INVALID_OPERAND
1553 || eaten == PRINT_INSN_ARG_MEMORY_ERROR)
1555 info->fprintf_styled_func = save_printer;
1556 info->print_address_func = save_print_address;
1557 return eaten == PRINT_INSN_ARG_MEMORY_ERROR ? -1 : 0;
1559 else
1561 /* We must restore the print functions before trying to print the
1562 error message. */
1563 info->fprintf_styled_func = save_printer;
1564 info->print_address_func = save_print_address;
1565 info->fprintf_styled_func (info->stream, dis_style_text,
1566 /* xgettext:c-format */
1567 _("<internal error in opcode table: %s %s>\n"),
1568 best->name, best->args);
1569 return 2;
1573 p = save_p;
1574 info->fprintf_styled_func = save_printer;
1575 info->print_address_func = save_print_address;
1577 d = args;
1579 info->fprintf_styled_func (info->stream, dis_style_mnemonic, "%s", best->name);
1581 if (*d)
1582 info->fprintf_styled_func (info->stream, dis_style_text, " ");
1584 while (*d)
1586 p += print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
1587 d += 2;
1589 if (*d && *(d - 2) != 'I' && *d != 'k')
1590 info->fprintf_styled_func (info->stream, dis_style_text, ",");
1593 return p - buffer;
1596 /* Try to interpret the instruction at address MEMADDR as one that
1597 can execute on a processor with the features given by ARCH_MASK.
1598 If successful, print the instruction to INFO->STREAM and return
1599 its length in bytes. Return 0 otherwise. Return -1 on memory
1600 error. */
1602 static int
1603 m68k_scan_mask (bfd_vma memaddr, disassemble_info *info,
1604 unsigned int arch_mask)
1606 int i;
1607 const char *d;
1608 static const struct m68k_opcode **opcodes[16];
1609 static int numopcodes[16];
1610 int val;
1611 int major_opcode;
1613 struct private *priv = (struct private *) info->private_data;
1614 bfd_byte *buffer = priv->the_buffer;
1616 if (!opcodes[0])
1618 /* Speed up the matching by sorting the opcode
1619 table on the upper four bits of the opcode. */
1620 const struct m68k_opcode **opc_pointer[16];
1622 /* First count how many opcodes are in each of the sixteen buckets. */
1623 for (i = 0; i < m68k_numopcodes; i++)
1624 numopcodes[(m68k_opcodes[i].opcode >> 28) & 15]++;
1626 /* Then create a sorted table of pointers
1627 that point into the unsorted table. */
1628 opc_pointer[0] = xmalloc (sizeof (struct m68k_opcode *)
1629 * m68k_numopcodes);
1630 opcodes[0] = opc_pointer[0];
1632 for (i = 1; i < 16; i++)
1634 opc_pointer[i] = opc_pointer[i - 1] + numopcodes[i - 1];
1635 opcodes[i] = opc_pointer[i];
1638 for (i = 0; i < m68k_numopcodes; i++)
1639 *opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
1642 if (!FETCH_DATA (info, buffer + 2))
1643 return -1;
1644 major_opcode = (buffer[0] >> 4) & 15;
1646 for (i = 0; i < numopcodes[major_opcode]; i++)
1648 const struct m68k_opcode *opc = opcodes[major_opcode][i];
1649 unsigned long opcode = opc->opcode;
1650 unsigned long match = opc->match;
1651 const char *args = opc->args;
1653 if (*args == '.')
1654 args++;
1656 if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
1657 && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
1658 /* Only fetch the next two bytes if we need to. */
1659 && (((0xffff & match) == 0)
1661 (FETCH_DATA (info, buffer + 4)
1662 && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
1663 && ((0xff & buffer[3] & match) == (0xff & opcode)))
1665 && (opc->arch & arch_mask) != 0)
1667 /* Don't use for printout the variants of divul and divsl
1668 that have the same register number in two places.
1669 The more general variants will match instead. */
1670 for (d = args; *d; d += 2)
1671 if (d[1] == 'D')
1672 break;
1674 /* Don't use for printout the variants of most floating
1675 point coprocessor instructions which use the same
1676 register number in two places, as above. */
1677 if (*d == '\0')
1678 for (d = args; *d; d += 2)
1679 if (d[1] == 't')
1680 break;
1682 /* Don't match fmovel with more than one register;
1683 wait for fmoveml. */
1684 if (*d == '\0')
1686 for (d = args; *d; d += 2)
1688 if (d[0] == 's' && d[1] == '8')
1690 val = fetch_arg (buffer, d[1], 3, info);
1691 if (val < 0)
1692 return 0;
1693 if ((val & (val - 1)) != 0)
1694 break;
1699 /* Don't match FPU insns with non-default coprocessor ID. */
1700 if (*d == '\0')
1702 for (d = args; *d; d += 2)
1704 if (d[0] == 'I')
1706 val = fetch_arg (buffer, 'd', 3, info);
1707 if (val != 1)
1708 break;
1713 if (*d == '\0')
1714 if ((val = match_insn_m68k (memaddr, info, opc)))
1715 return val;
1718 return 0;
1721 /* Print the m68k instruction at address MEMADDR in debugged memory,
1722 on INFO->STREAM. Returns length of the instruction, in bytes. */
1725 print_insn_m68k (bfd_vma memaddr, disassemble_info *info)
1727 unsigned int arch_mask;
1728 struct private priv;
1729 int val;
1731 bfd_byte *buffer = priv.the_buffer;
1733 info->private_data = & priv;
1734 /* Tell objdump to use two bytes per chunk
1735 and six bytes per line for displaying raw data. */
1736 info->bytes_per_chunk = 2;
1737 info->bytes_per_line = 6;
1738 info->display_endian = BFD_ENDIAN_BIG;
1739 priv.max_fetched = priv.the_buffer;
1740 priv.insn_start = memaddr;
1742 arch_mask = bfd_m68k_mach_to_features (info->mach);
1743 if (!arch_mask)
1745 /* First try printing an m680x0 instruction. Try printing a Coldfire
1746 one if that fails. */
1747 val = m68k_scan_mask (memaddr, info, m68k_mask);
1748 if (val <= 0)
1749 val = m68k_scan_mask (memaddr, info, mcf_mask);
1751 else
1753 val = m68k_scan_mask (memaddr, info, arch_mask);
1756 if (val == 0)
1758 /* Handle undefined instructions. */
1759 info->fprintf_styled_func (info->stream, dis_style_assembler_directive,
1760 ".short");
1761 info->fprintf_styled_func (info->stream, dis_style_text, " ");
1762 info->fprintf_styled_func (info->stream, dis_style_immediate,
1763 "0x%04x", (buffer[0] << 8) + buffer[1]);
1766 return val ? val : 2;