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