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