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.
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.
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.
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. */
23 #include "floatformat.h"
24 #include "libiberty.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",
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",
53 /* Sign-extend an (unsigned char). */
55 #define COERCE_SIGNED_CHAR(ch) ((signed char) (ch))
57 #define COERCE_SIGNED_CHAR(ch) ((int) (((ch) ^ 0x80) & 0xFF) - 128)
60 /* Get a 1 byte signed integer. */
61 #define NEXTBYTE(p) (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
63 /* Get a 2 byte signed integer. */
64 #define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
66 (p += 2, FETCH_DATA (info, p), \
67 COERCE16 ((p[-2] << 8) + p[-1]))
69 /* Get a 4 byte signed integer. */
70 #define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
72 (p += 4, FETCH_DATA (info, p), \
73 (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
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]))
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))
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))
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))
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)
102 /* Maximum length of an instruction. */
109 /* Points to first byte not fetched. */
110 bfd_byte
*max_fetched
;
111 bfd_byte the_buffer
[MAXLEN
];
116 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
117 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
119 #define FETCH_DATA(info, addr) \
120 ((addr) <= ((struct private *) (info->private_data))->max_fetched \
121 ? 1 : fetch_data ((info), (addr)))
124 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
127 struct private *priv
= (struct private *)info
->private_data
;
128 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
130 status
= (*info
->read_memory_func
) (start
,
132 addr
- priv
->max_fetched
,
136 (*info
->memory_error_func
) (status
, start
, info
);
137 longjmp (priv
->bailout
, 1);
140 priv
->max_fetched
= addr
;
144 /* This function is used to print to the bit-bucket. */
146 dummy_printer (FILE *file ATTRIBUTE_UNUSED
,
147 const char *format ATTRIBUTE_UNUSED
,
154 dummy_print_address (bfd_vma vma ATTRIBUTE_UNUSED
,
155 struct disassemble_info
*info ATTRIBUTE_UNUSED
)
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. */
165 fetch_arg (unsigned char *buffer
,
168 disassemble_info
*info
)
174 case '/': /* MAC/EMAC mask bit. */
175 val
= buffer
[3] >> 5;
178 case 'G': /* EMAC ACC load. */
179 val
= ((buffer
[3] >> 3) & 0x2) | ((~buffer
[1] >> 7) & 0x1);
182 case 'H': /* EMAC ACC !load. */
183 val
= ((buffer
[3] >> 3) & 0x2) | ((buffer
[1] >> 7) & 0x1);
186 case ']': /* EMAC ACCEXT bit. */
187 val
= buffer
[0] >> 2;
190 case 'I': /* MAC/EMAC scale factor. */
191 val
= buffer
[2] >> 1;
194 case 'F': /* EMAC ACCx. */
195 val
= buffer
[0] >> 1;
206 case 'd': /* Destination, for register or quick. */
207 val
= (buffer
[0] << 8) + buffer
[1];
211 case 'x': /* Destination, for general arg. */
212 val
= (buffer
[0] << 8) + buffer
[1];
217 FETCH_DATA (info
, buffer
+ 3);
218 val
= (buffer
[3] >> 4);
222 FETCH_DATA (info
, buffer
+ 3);
227 FETCH_DATA (info
, buffer
+ 3);
228 val
= (buffer
[2] << 8) + buffer
[3];
233 FETCH_DATA (info
, buffer
+ 3);
234 val
= (buffer
[2] << 8) + buffer
[3];
240 FETCH_DATA (info
, buffer
+ 3);
241 val
= (buffer
[2] << 8) + buffer
[3];
245 FETCH_DATA (info
, buffer
+ 5);
246 val
= (buffer
[4] << 8) + buffer
[5];
251 FETCH_DATA (info
, buffer
+ 5);
252 val
= (buffer
[4] << 8) + buffer
[5];
257 FETCH_DATA (info
, buffer
+ 5);
258 val
= (buffer
[4] << 8) + buffer
[5];
262 FETCH_DATA (info
, buffer
+ 3);
263 val
= (buffer
[2] << 8) + buffer
[3];
268 FETCH_DATA (info
, buffer
+ 3);
269 val
= (buffer
[2] << 8) + buffer
[3];
274 FETCH_DATA (info
, buffer
+ 3);
275 val
= (buffer
[2] << 8) + buffer
[3];
280 val
= (buffer
[1] >> 6);
284 val
= (buffer
[1] & 0x40 ? 0x8 : 0)
285 | ((buffer
[0] >> 1) & 0x7)
286 | (buffer
[3] & 0x80 ? 0x10 : 0);
290 val
= (buffer
[1] & 0x40 ? 0x8 : 0) | ((buffer
[0] >> 1) & 0x7);
294 val
= (buffer
[2] >> 4) | (buffer
[3] & 0x80 ? 0x10 : 0);
298 val
= (buffer
[1] & 0xf) | (buffer
[3] & 0x40 ? 0x10 : 0);
302 val
= (buffer
[3] & 0xf) | (buffer
[3] & 0x40 ? 0x10 : 0);
306 val
= buffer
[2] >> 2;
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. */
346 m68k_valid_ea (char code
, int val
)
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)
356 mask
= M (1,1,1,1,1,1,1,1,1,1,1,1);
359 mask
= M (0,0,1,1,1,1,1,1,1,0,0,0);
362 mask
= M (1,1,1,1,1,1,1,1,1,0,0,0);
365 mask
= M (1,0,1,1,1,1,1,1,1,1,1,1);
368 mask
= M (1,0,1,1,1,1,1,1,1,1,1,0);
371 mask
= M (0,0,1,0,0,1,1,1,1,1,1,0);
374 mask
= M (0,0,1,0,0,1,1,1,1,0,0,0);
377 mask
= M (1,0,1,1,1,1,1,1,1,0,0,0);
380 mask
= M (1,0,1,0,0,1,1,1,1,0,0,0);
383 mask
= M (1,0,1,0,0,1,1,1,1,1,1,0);
386 mask
= M (0,0,1,0,0,1,1,1,1,1,1,0);
389 mask
= M (0,0,1,0,1,1,1,1,1,0,0,0);
392 mask
= M (0,0,1,1,0,1,1,1,1,1,1,0);
395 mask
= M (1,1,1,1,1,0,0,0,0,0,0,0);
398 mask
= M (0,0,0,0,0,1,0,0,0,1,0,0);
401 mask
= M (0,0,0,0,0,0,1,1,1,0,1,1);
404 mask
= M (1,1,1,1,1,1,0,0,0,0,0,0);
407 mask
= M (1,0,1,1,1,1,0,0,0,0,0,0);
410 mask
= M (1,0,1,1,1,1,0,1,1,0,0,0);
413 mask
= M (1,0,1,1,1,1,0,0,0,1,0,0);
416 mask
= M (0,0,1,1,1,1,0,0,0,1,0,0);
419 mask
= M (0,0,1,0,0,1,0,0,0,0,0,0);
422 mask
= M (0,0,1,0,0,1,0,0,0,1,0,0);
425 mask
= M (0,0,1,1,1,1,0,0,0,0,0,0);
432 mode
= (val
>> 3) & 7;
435 return (mask
& (1 << mode
)) != 0;
438 /* Print a base register REGNO and displacement DISP, on INFO->STREAM.
439 REGNO = -1 for pc, -2 for none (suppressed). */
442 print_base (int regno
, bfd_vma disp
, disassemble_info
*info
)
446 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
447 (*info
->print_address_func
) (disp
, info
);
454 (*info
->fprintf_func
) (info
->stream
, "@(");
455 else if (regno
== -3)
456 (*info
->fprintf_func
) (info
->stream
, "%%zpc@(");
458 (*info
->fprintf_func
) (info
->stream
, "%s@(", reg_names
[regno
]);
460 sprintf_vma (buf
, disp
);
461 (*info
->fprintf_func
) (info
->stream
, "%s", buf
);
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. */
469 static unsigned char *
470 print_indexed (int basereg
,
473 disassemble_info
*info
)
476 static char *const scales
[] = { "", ":2", ":4", ":8" };
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]);
491 /* Handle the 68000 style of indexing. */
493 if ((word
& 0x100) == 0)
495 base_disp
= word
& 0xff;
496 if ((base_disp
& 0x80) != 0)
500 print_base (basereg
, base_disp
, info
);
501 (*info
->fprintf_func
) (info
->stream
, ",%s)", buf
);
505 /* Handle the generalized kind. */
506 /* First, compute the displacement to add to the base register. */
517 switch ((word
>> 4) & 3)
520 base_disp
= NEXTWORD (p
);
523 base_disp
= NEXTLONG (p
);
528 /* Handle single-level case (not indirect). */
531 print_base (basereg
, base_disp
, info
);
533 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
534 (*info
->fprintf_func
) (info
->stream
, ")");
538 /* Two level. Compute displacement to add after indirection. */
543 outer_disp
= NEXTWORD (p
);
546 outer_disp
= NEXTLONG (p
);
549 print_base (basereg
, base_disp
, info
);
550 if ((word
& 4) == 0 && buf
[0] != '\0')
552 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
555 sprintf_vma (vmabuf
, outer_disp
);
556 (*info
->fprintf_func
) (info
->stream
, ")@(%s", vmabuf
);
558 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
559 (*info
->fprintf_func
) (info
->stream
, ")");
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. */
570 print_insn_arg (const char *d
,
571 unsigned char *buffer
,
574 disassemble_info
*info
)
578 unsigned char *p
= p0
;
589 case 'c': /* Cache identifier. */
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
]);
597 case 'a': /* Address register indirect only. Cf. case '+'. */
599 (*info
->fprintf_func
)
602 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
606 case '_': /* 32-bit absolute address for move16. */
608 uval
= NEXTULONG (p
);
609 (*info
->print_address_func
) (uval
, info
);
614 (*info
->fprintf_func
) (info
->stream
, "%%ccr");
618 (*info
->fprintf_func
) (info
->stream
, "%%sr");
622 (*info
->fprintf_func
) (info
->stream
, "%%usp");
626 (*info
->fprintf_func
) (info
->stream
, "%%acc");
630 (*info
->fprintf_func
) (info
->stream
, "%%macsr");
634 (*info
->fprintf_func
) (info
->stream
, "%%mask");
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. */
650 /* Should we be calling this psr like we do in case 'Y'? */
653 {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808},
655 /* Fido added these. */
656 {"%cac", 0xffe}, {"%mbb", 0xfff}};
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
)
662 (*info
->fprintf_func
) (info
->stream
, "%s", names
[regno
].name
);
666 (*info
->fprintf_func
) (info
->stream
, "%d", val
);
671 val
= fetch_arg (buffer
, place
, 3, info
);
672 /* 0 means 8, except for the bkpt instruction... */
673 if (val
== 0 && d
[1] != 's')
675 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
679 val
= fetch_arg (buffer
, place
, 3, info
);
683 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
689 static char *const scalefactor_name
[] = { "<<", ">>" };
690 val
= fetch_arg (buffer
, place
, 1, info
);
691 (*info
->fprintf_func
) (info
->stream
, scalefactor_name
[val
]);
695 val
= fetch_arg (buffer
, place
, 8, info
);
698 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
703 val
= fetch_arg (buffer
, place
, 4, info
);
704 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
708 (*info
->fprintf_func
) (info
->stream
, "%s",
709 reg_names
[fetch_arg (buffer
, place
, 3, info
)]);
713 (*info
->fprintf_func
)
715 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 010]);
719 (*info
->fprintf_func
)
721 reg_names
[fetch_arg (buffer
, place
, 4, info
)]);
725 regno
= fetch_arg (buffer
, place
, 4, info
);
727 (*info
->fprintf_func
) (info
->stream
, "%s@", reg_names
[regno
]);
729 (*info
->fprintf_func
) (info
->stream
, "@(%s)", reg_names
[regno
]);
733 (*info
->fprintf_func
)
734 (info
->stream
, "%%fp%d",
735 fetch_arg (buffer
, place
, 3, info
));
739 val
= fetch_arg (buffer
, place
, 6, info
);
741 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
& 7]);
743 (*info
->fprintf_func
) (info
->stream
, "%d", val
);
747 (*info
->fprintf_func
)
748 (info
->stream
, "%s@+",
749 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
753 (*info
->fprintf_func
)
754 (info
->stream
, "%s@-",
755 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
760 (*info
->fprintf_func
)
761 (info
->stream
, "{%s}",
762 reg_names
[fetch_arg (buffer
, place
, 3, info
)]);
763 else if (place
== 'C')
765 val
= fetch_arg (buffer
, place
, 7, info
);
766 if (val
> 63) /* This is a signed constant. */
768 (*info
->fprintf_func
) (info
->stream
, "{#%d}", val
);
776 p1
= buffer
+ (*d
== '#' ? 2 : 4);
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')
787 else if (place
== 'w' || place
== 'W')
789 else if (place
== 'l')
793 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
799 else if (place
== 'B')
800 disp
= COERCE_SIGNED_CHAR (buffer
[1]);
801 else if (place
== 'w' || place
== 'W')
803 else if (place
== 'l' || place
== 'L' || place
== 'C')
805 else if (place
== 'g')
807 disp
= NEXTBYTE (buffer
);
813 else if (place
== 'c')
815 if (buffer
[1] & 0x40) /* If bit six is one, long offset. */
823 (*info
->print_address_func
) (addr
+ disp
, info
);
828 (*info
->fprintf_func
)
829 (info
->stream
, "%s@(%d)",
830 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8], val
);
834 (*info
->fprintf_func
) (info
->stream
, "%s",
835 fpcr_names
[fetch_arg (buffer
, place
, 3, info
)]);
839 val
= fetch_arg(buffer
, place
, 2, info
);
840 (*info
->fprintf_func
) (info
->stream
, "%%acc%d", val
);
844 val
= fetch_arg(buffer
, place
, 1, info
);
845 (*info
->fprintf_func
) (info
->stream
, "%%accext%s", val
==0 ? "01" : "23");
849 val
= fetch_arg(buffer
, place
, 2, info
);
851 (*info
->fprintf_func
) (info
->stream
, "<<");
853 (*info
->fprintf_func
) (info
->stream
, ">>");
859 /* Get coprocessor ID... */
860 val
= fetch_arg (buffer
, 'd', 3, info
);
862 if (val
!= 1) /* Unusual coprocessor ID? */
863 (*info
->fprintf_func
) (info
->stream
, "(cpid=%d) ", val
);
892 val
= fetch_arg (buffer
, 'x', 6, info
);
893 val
= ((val
& 7) << 3) + ((val
>> 3) & 7);
896 val
= fetch_arg (buffer
, 's', 6, info
);
898 /* If the <ea> is invalid for *d, then reject this match. */
899 if (!m68k_valid_ea (*d
, val
))
902 /* Get register number assuming address register. */
903 regno
= (val
& 7) + 8;
904 regname
= reg_names
[regno
];
908 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
]);
912 (*info
->fprintf_func
) (info
->stream
, "%s", regname
);
916 (*info
->fprintf_func
) (info
->stream
, "%s@", regname
);
920 (*info
->fprintf_func
) (info
->stream
, "%s@+", regname
);
924 (*info
->fprintf_func
) (info
->stream
, "%s@-", regname
);
929 (*info
->fprintf_func
) (info
->stream
, "%s@(%d)", regname
, val
);
933 p
= print_indexed (regno
, p
, addr
, info
);
941 (*info
->print_address_func
) (val
, info
);
945 uval
= NEXTULONG (p
);
946 (*info
->print_address_func
) (uval
, info
);
951 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
952 (*info
->print_address_func
) (addr
+ val
, info
);
953 (*info
->fprintf_func
) (info
->stream
, ")");
957 p
= print_indexed (-1, p
, addr
, info
);
961 flt_p
= 1; /* Assume it's a float... */
980 NEXTSINGLE (flval
, p
);
984 NEXTDOUBLE (flval
, p
);
988 NEXTEXTEND (flval
, p
);
992 flval
= NEXTPACKED (p
);
998 if (flt_p
) /* Print a float? */
999 (*info
->fprintf_func
) (info
->stream
, "#%g", flval
);
1001 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
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. */
1014 val
= fetch_arg (buffer
, place
, 1, info
);
1016 info
->fprintf_func (info
->stream
, "&");
1026 val
= NEXTWORD (p1
);
1027 /* Move the pointer ahead if this point is farther ahead
1029 p
= p1
> p
? p1
: p
;
1032 (*info
->fprintf_func
) (info
->stream
, "#0");
1039 for (regno
= 0; regno
< 16; ++regno
)
1040 if (val
& (0x8000 >> regno
))
1041 newval
|= 1 << regno
;
1046 for (regno
= 0; regno
< 16; ++regno
)
1047 if (val
& (1 << regno
))
1052 (*info
->fprintf_func
) (info
->stream
, "/");
1054 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[regno
]);
1055 first_regno
= regno
;
1056 while (val
& (1 << (regno
+ 1)))
1058 if (regno
> first_regno
)
1059 (*info
->fprintf_func
) (info
->stream
, "-%s",
1063 else if (place
== '3')
1065 /* `fmovem' insn. */
1067 val
= fetch_arg (buffer
, place
, 8, info
);
1070 (*info
->fprintf_func
) (info
->stream
, "#0");
1077 for (regno
= 0; regno
< 8; ++regno
)
1078 if (val
& (0x80 >> regno
))
1079 newval
|= 1 << regno
;
1084 for (regno
= 0; regno
< 8; ++regno
)
1085 if (val
& (1 << regno
))
1089 (*info
->fprintf_func
) (info
->stream
, "/");
1091 (*info
->fprintf_func
) (info
->stream
, "%%fp%d", regno
);
1092 first_regno
= regno
;
1093 while (val
& (1 << (regno
+ 1)))
1095 if (regno
> first_regno
)
1096 (*info
->fprintf_func
) (info
->stream
, "-%%fp%d", regno
);
1099 else if (place
== '8')
1101 /* fmoveml for FP status registers. */
1102 (*info
->fprintf_func
) (info
->stream
, "%s",
1103 fpcr_names
[fetch_arg (buffer
, place
, 3,
1120 int val
= fetch_arg (buffer
, place
, 5, info
);
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;
1140 int break_reg
= ((buffer
[3] >> 2) & 7);
1142 (*info
->fprintf_func
)
1143 (info
->stream
, val
== 0x1c ? "%%bad%d" : "%%bac%d",
1148 (*info
->fprintf_func
) (info
->stream
, "<mmu register %d>", val
);
1151 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
1157 int fc
= fetch_arg (buffer
, place
, 5, info
);
1160 (*info
->fprintf_func
) (info
->stream
, "%%dfc");
1162 (*info
->fprintf_func
) (info
->stream
, "%%sfc");
1164 /* xgettext:c-format */
1165 (*info
->fprintf_func
) (info
->stream
, _("<function code %d>"), fc
);
1170 (*info
->fprintf_func
) (info
->stream
, "%%val");
1175 int level
= fetch_arg (buffer
, place
, 3, info
);
1177 (*info
->fprintf_func
) (info
->stream
, "%d", level
);
1184 int reg
= fetch_arg (buffer
, place
, 5, info
);
1191 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1192 reg_half_names
[reg
],
1193 is_upper
? "u" : "l");
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. */
1208 match_insn_m68k (bfd_vma memaddr
,
1209 disassemble_info
* info
,
1210 const struct m68k_opcode
* best
)
1212 unsigned char *save_p
;
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
;
1222 /* Point at first word of argument data,
1223 and at descriptor for first argument. */
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)
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. */
1236 if (d
[1] == 'l' && p
- buffer
< 6)
1238 else if (p
- buffer
< 4 && d
[1] != 'C' && d
[1] != '8')
1242 if ((d
[0] == 'L' || d
[0] == 'l') && d
[1] == 'w' && p
- buffer
< 4)
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)
1273 /* lpstop is another exception. It takes a one word argument but is
1274 three words long. */
1276 && (best
->match
& 0xffff) == 0xffff
1277 && best
->args
[0] == '#'
1278 && best
->args
[1] == 'w')
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. */
1285 FETCH_DATA (info
, p
);
1286 buffer
[2] = buffer
[4];
1287 buffer
[3] = buffer
[5];
1290 FETCH_DATA (info
, p
);
1295 info
->print_address_func
= dummy_print_address
;
1296 info
->fprintf_func
= (fprintf_ftype
) dummy_printer
;
1298 /* We scan the operands twice. The first time we don't print anything,
1299 but look for errors. */
1302 int eaten
= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
1306 else if (eaten
== -1)
1308 info
->fprintf_func
= save_printer
;
1309 info
->print_address_func
= save_print_address
;
1314 /* We must restore the print functions before trying to print the
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
);
1327 info
->fprintf_func
= save_printer
;
1328 info
->print_address_func
= save_print_address
;
1332 info
->fprintf_func (info
->stream
, "%s", best
->name
);
1335 info
->fprintf_func (info
->stream
, " ");
1339 p
+= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
1342 if (*d
&& *(d
- 2) != 'I' && *d
!= 'k')
1343 info
->fprintf_func (info
->stream
, ",");
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. */
1355 m68k_scan_mask (bfd_vma memaddr
, disassemble_info
*info
,
1356 unsigned int arch_mask
)
1360 static const struct m68k_opcode
**opcodes
[16];
1361 static int numopcodes
[16];
1365 struct private *priv
= (struct private *) info
->private_data
;
1366 bfd_byte
*buffer
= priv
->the_buffer
;
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];
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]++;
1378 /* Then create a sorted table of pointers
1379 that point into the unsorted table. */
1380 opc_pointer
[0] = xmalloc (sizeof (struct m68k_opcode
*)
1382 opcodes
[0] = opc_pointer
[0];
1384 for (i
= 1; i
< 16; i
++)
1386 opc_pointer
[i
] = opc_pointer
[i
- 1] + numopcodes
[i
- 1];
1387 opcodes
[i
] = opc_pointer
[i
];
1390 for (i
= 0; i
< m68k_numopcodes
; i
++)
1391 *opc_pointer
[(m68k_opcodes
[i
].opcode
>> 28) & 15]++ = &m68k_opcodes
[i
];
1394 FETCH_DATA (info
, buffer
+ 2);
1395 major_opcode
= (buffer
[0] >> 4) & 15;
1397 for (i
= 0; i
< numopcodes
[major_opcode
]; i
++)
1399 const struct m68k_opcode
*opc
= opcodes
[major_opcode
][i
];
1400 unsigned long opcode
= opc
->opcode
;
1401 unsigned long match
= opc
->match
;
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)
1408 (FETCH_DATA (info
, buffer
+ 4)
1409 && ((0xff & buffer
[2] & (match
>> 8)) == (0xff & (opcode
>> 8)))
1410 && ((0xff & buffer
[3] & match
) == (0xff & opcode
)))
1412 && (opc
->arch
& arch_mask
) != 0)
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)
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. */
1425 for (d
= opc
->args
; *d
; d
+= 2)
1429 /* Don't match fmovel with more than one register;
1430 wait for fmoveml. */
1433 for (d
= opc
->args
; *d
; d
+= 2)
1435 if (d
[0] == 's' && d
[1] == '8')
1437 val
= fetch_arg (buffer
, d
[1], 3, info
);
1438 if ((val
& (val
- 1)) != 0)
1444 /* Don't match FPU insns with non-default coprocessor ID. */
1447 for (d
= opc
->args
; *d
; d
+= 2)
1451 val
= fetch_arg (buffer
, 'd', 3, info
);
1459 if ((val
= match_insn_m68k (memaddr
, info
, opc
)))
1466 /* Print the m68k instruction at address MEMADDR in debugged memory,
1467 on INFO->STREAM. Returns length of the instruction, in bytes. */
1470 print_insn_m68k (bfd_vma memaddr
, disassemble_info
*info
)
1472 unsigned int arch_mask
;
1473 struct private priv
;
1476 bfd_byte
*buffer
= priv
.the_buffer
;
1478 /* Save these printing functions in case we need to restore them
1480 fprintf_ftype save_printer
= info
->fprintf_func
;
1481 void (* save_print_address
) (bfd_vma
, struct disassemble_info
*)
1482 = info
->print_address_func
;
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
;
1493 if (setjmp (priv
.bailout
) != 0)
1495 /* longjmp may be called while these printing functions are
1496 temporarily replaced with dummy functions. Restore them
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
;
1515 arch_mask
= bfd_m68k_mach_to_features (info
->mach
);
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
);
1524 val
= m68k_scan_mask (memaddr
, info
, mcf_mask
);
1530 val
= m68k_scan_mask (memaddr
, info
, arch_mask
);
1535 /* Handle undefined instructions. */
1536 info
->fprintf_func (info
->stream
, "0%o", (buffer
[0] << 8) + buffer
[1]);