1 /* Print Motorola 68k instructions.
2 Copyright (C) 1986-2022 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
22 #include "disassemble.h"
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 /* Error code of print_insn_arg's return value. */
62 enum print_insn_arg_error
64 /* An invalid operand is found. */
65 PRINT_INSN_ARG_INVALID_OPERAND
= -1,
67 /* An opcode table error. */
68 PRINT_INSN_ARG_INVALID_OP_TABLE
= -2,
71 PRINT_INSN_ARG_MEMORY_ERROR
= -3,
74 /* Get a 1 byte signed integer. */
75 #define NEXTBYTE(p, val) \
79 if (!FETCH_DATA (info, p)) \
80 return PRINT_INSN_ARG_MEMORY_ERROR; \
81 val = COERCE_SIGNED_CHAR (p[-1]); \
85 /* Get a 2 byte signed integer. */
86 #define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
88 #define NEXTWORD(p, val, ret_val) \
92 if (!FETCH_DATA (info, p)) \
94 val = COERCE16 ((p[-2] << 8) + p[-1]); \
98 /* Get a 4 byte signed integer. */
99 #define COERCE32(x) (((bfd_vma) (x) ^ 0x80000000) - 0x80000000)
101 #define NEXTLONG(p, val, ret_val) \
105 if (!FETCH_DATA (info, p)) \
107 val = COERCE32 (((((((unsigned) p[-4] << 8) + p[-3]) << 8) \
108 + p[-2]) << 8) + p[-1]); \
112 /* Get a 4 byte unsigned integer. */
113 #define NEXTULONG(p, val) \
117 if (!FETCH_DATA (info, p)) \
118 return PRINT_INSN_ARG_MEMORY_ERROR; \
119 val = (((((((unsigned) p[-4] << 8) + p[-3]) << 8) \
120 + p[-2]) << 8) + p[-1]); \
124 /* Get a single precision float. */
125 #define NEXTSINGLE(val, p) \
129 if (!FETCH_DATA (info, p)) \
130 return PRINT_INSN_ARG_MEMORY_ERROR; \
131 floatformat_to_double (& floatformat_ieee_single_big, \
132 (char *) p - 4, & val); \
136 /* Get a double precision float. */
137 #define NEXTDOUBLE(val, p) \
141 if (!FETCH_DATA (info, p)) \
142 return PRINT_INSN_ARG_MEMORY_ERROR; \
143 floatformat_to_double (& floatformat_ieee_double_big, \
144 (char *) p - 8, & val); \
148 /* Get an extended precision float. */
149 #define NEXTEXTEND(val, p) \
153 if (!FETCH_DATA (info, p)) \
154 return PRINT_INSN_ARG_MEMORY_ERROR; \
155 floatformat_to_double (& floatformat_m68881_ext, \
156 (char *) p - 12, & val); \
160 /* Need a function to convert from packed to double
161 precision. Actually, it's easier to print a
162 packed number than a double anyway, so maybe
163 there should be a special case to handle this... */
164 #define NEXTPACKED(p, val) \
168 if (!FETCH_DATA (info, p)) \
169 return PRINT_INSN_ARG_MEMORY_ERROR; \
175 /* Maximum length of an instruction. */
180 /* Points to first byte not fetched. */
181 bfd_byte
*max_fetched
;
182 bfd_byte the_buffer
[MAXLEN
];
186 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
187 to ADDR (exclusive) are valid. Returns 1 for success, 0 on memory
189 #define FETCH_DATA(info, addr) \
190 ((addr) <= ((struct private *) (info->private_data))->max_fetched \
191 ? 1 : fetch_data ((info), (addr)))
194 fetch_data (struct disassemble_info
*info
, bfd_byte
*addr
)
197 struct private *priv
= (struct private *)info
->private_data
;
198 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
200 status
= (*info
->read_memory_func
) (start
,
202 addr
- priv
->max_fetched
,
206 (*info
->memory_error_func
) (status
, start
, info
);
210 priv
->max_fetched
= addr
;
214 /* This function is used to print to the bit-bucket. */
216 dummy_printer (FILE *file ATTRIBUTE_UNUSED
,
217 const char *format ATTRIBUTE_UNUSED
,
224 dummy_print_address (bfd_vma vma ATTRIBUTE_UNUSED
,
225 struct disassemble_info
*info ATTRIBUTE_UNUSED
)
229 /* Fetch BITS bits from a position in the instruction specified by CODE.
230 CODE is a "place to put an argument", or 'x' for a destination
231 that is a general address (mode and register).
232 BUFFER contains the instruction.
233 Returns -1 on failure. */
236 fetch_arg (unsigned char *buffer
,
239 disassemble_info
*info
)
245 case '/': /* MAC/EMAC mask bit. */
246 val
= buffer
[3] >> 5;
249 case 'G': /* EMAC ACC load. */
250 val
= ((buffer
[3] >> 3) & 0x2) | ((~buffer
[1] >> 7) & 0x1);
253 case 'H': /* EMAC ACC !load. */
254 val
= ((buffer
[3] >> 3) & 0x2) | ((buffer
[1] >> 7) & 0x1);
257 case ']': /* EMAC ACCEXT bit. */
258 val
= buffer
[0] >> 2;
261 case 'I': /* MAC/EMAC scale factor. */
262 val
= buffer
[2] >> 1;
265 case 'F': /* EMAC ACCx. */
266 val
= buffer
[0] >> 1;
277 case 'd': /* Destination, for register or quick. */
278 val
= (buffer
[0] << 8) + buffer
[1];
282 case 'x': /* Destination, for general arg. */
283 val
= (buffer
[0] << 8) + buffer
[1];
288 if (! FETCH_DATA (info
, buffer
+ 3))
290 val
= (buffer
[3] >> 4);
294 if (! FETCH_DATA (info
, buffer
+ 3))
300 if (! FETCH_DATA (info
, buffer
+ 3))
302 val
= (buffer
[2] << 8) + buffer
[3];
307 if (! FETCH_DATA (info
, buffer
+ 3))
309 val
= (buffer
[2] << 8) + buffer
[3];
315 if (! FETCH_DATA (info
, buffer
+ 3))
317 val
= (buffer
[2] << 8) + buffer
[3];
321 if (! FETCH_DATA (info
, buffer
+ 5))
323 val
= (buffer
[4] << 8) + buffer
[5];
328 if (! FETCH_DATA (info
, buffer
+ 5))
330 val
= (buffer
[4] << 8) + buffer
[5];
335 if (! FETCH_DATA (info
, buffer
+ 5))
337 val
= (buffer
[4] << 8) + buffer
[5];
341 if (! FETCH_DATA (info
, buffer
+ 3))
343 val
= (buffer
[2] << 8) + buffer
[3];
348 if (! FETCH_DATA (info
, buffer
+ 3))
350 val
= (buffer
[2] << 8) + buffer
[3];
355 if (! FETCH_DATA (info
, buffer
+ 3))
357 val
= (buffer
[2] << 8) + buffer
[3];
362 val
= (buffer
[1] >> 6);
366 if (! FETCH_DATA (info
, buffer
+ 3))
368 val
= (buffer
[2] >> 1);
372 val
= (buffer
[1] & 0x40 ? 0x8 : 0)
373 | ((buffer
[0] >> 1) & 0x7)
374 | (buffer
[3] & 0x80 ? 0x10 : 0);
378 val
= (buffer
[1] & 0x40 ? 0x8 : 0) | ((buffer
[0] >> 1) & 0x7);
382 val
= (buffer
[2] >> 4) | (buffer
[3] & 0x80 ? 0x10 : 0);
386 val
= (buffer
[1] & 0xf) | (buffer
[3] & 0x40 ? 0x10 : 0);
390 val
= (buffer
[3] & 0xf) | (buffer
[3] & 0x40 ? 0x10 : 0);
394 val
= buffer
[2] >> 2;
401 /* bits is never too big. */
402 return val
& ((1 << bits
) - 1);
405 /* Check if an EA is valid for a particular code. This is required
406 for the EMAC instructions since the type of source address determines
407 if it is a EMAC-load instruciton if the EA is mode 2-5, otherwise it
408 is a non-load EMAC instruction and the bits mean register Ry.
409 A similar case exists for the movem instructions where the register
410 mask is interpreted differently for different EAs. */
413 m68k_valid_ea (char code
, int val
)
416 #define M(n0,n1,n2,n3,n4,n5,n6,n70,n71,n72,n73,n74) \
417 (n0 | n1 << 1 | n2 << 2 | n3 << 3 | n4 << 4 | n5 << 5 | n6 << 6 \
418 | n70 << 7 | n71 << 8 | n72 << 9 | n73 << 10 | n74 << 11)
423 mask
= M (1,1,1,1,1,1,1,1,1,1,1,1);
426 mask
= M (0,0,1,1,1,1,1,1,1,0,0,0);
429 mask
= M (1,1,1,1,1,1,1,1,1,0,0,0);
432 mask
= M (1,0,1,1,1,1,1,1,1,1,1,1);
435 mask
= M (1,0,1,1,1,1,1,1,1,1,1,0);
438 mask
= M (0,0,1,0,0,1,1,1,1,1,1,0);
441 mask
= M (0,0,1,0,0,1,1,1,1,0,0,0);
444 mask
= M (1,0,1,1,1,1,1,1,1,0,0,0);
447 mask
= M (1,0,1,0,0,1,1,1,1,0,0,0);
450 mask
= M (1,0,1,0,0,1,1,1,1,1,1,0);
453 mask
= M (0,0,1,0,0,1,1,1,1,1,1,0);
456 mask
= M (0,0,1,0,1,1,1,1,1,0,0,0);
459 mask
= M (0,0,1,1,0,1,1,1,1,1,1,0);
462 mask
= M (1,1,1,1,1,0,0,0,0,0,0,0);
465 mask
= M (0,0,0,0,0,1,0,0,0,1,0,0);
468 mask
= M (0,0,0,0,0,0,1,1,1,0,1,1);
471 mask
= M (1,1,1,1,1,1,0,0,0,0,0,0);
474 mask
= M (1,0,1,1,1,1,0,0,0,0,0,0);
477 mask
= M (1,0,1,1,1,1,0,1,1,0,0,0);
480 mask
= M (1,0,1,1,1,1,0,0,0,1,0,0);
483 mask
= M (0,0,1,1,1,1,0,0,0,1,0,0);
486 mask
= M (0,0,1,0,0,1,0,0,0,0,0,0);
489 mask
= M (0,0,1,0,0,1,0,0,0,1,0,0);
492 mask
= M (0,0,1,1,1,1,0,0,0,0,0,0);
499 mode
= (val
>> 3) & 7;
502 return (mask
& (1 << mode
)) != 0;
505 /* Print a base register REGNO and displacement DISP, on INFO->STREAM.
506 REGNO = -1 for pc, -2 for none (suppressed). */
509 print_base (int regno
, bfd_vma disp
, disassemble_info
*info
)
513 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
514 (*info
->print_address_func
) (disp
, info
);
519 (*info
->fprintf_func
) (info
->stream
, "@(");
520 else if (regno
== -3)
521 (*info
->fprintf_func
) (info
->stream
, "%%zpc@(");
523 (*info
->fprintf_func
) (info
->stream
, "%s@(", reg_names
[regno
]);
524 (*info
->fprintf_func
) (info
->stream
, "%" PRIx64
, (uint64_t) disp
);
528 /* Print an indexed argument. The base register is BASEREG (-1 for pc).
529 P points to extension word, in buffer.
530 ADDR is the nominal core address of that extension word.
531 Returns NULL upon error. */
533 static unsigned char *
534 print_indexed (int basereg
,
537 disassemble_info
*info
)
540 static char *const scales
[] = { "", ":2", ":4", ":8" };
545 NEXTWORD (p
, word
, NULL
);
547 /* Generate the text for the index register.
548 Where this will be output is not yet determined. */
549 sprintf (buf
, "%s:%c%s",
550 reg_names
[(word
>> 12) & 0xf],
551 (word
& 0x800) ? 'l' : 'w',
552 scales
[(word
>> 9) & 3]);
554 /* Handle the 68000 style of indexing. */
556 if ((word
& 0x100) == 0)
558 base_disp
= word
& 0xff;
559 if ((base_disp
& 0x80) != 0)
563 print_base (basereg
, base_disp
, info
);
564 (*info
->fprintf_func
) (info
->stream
, ",%s)", buf
);
568 /* Handle the generalized kind. */
569 /* First, compute the displacement to add to the base register. */
580 switch ((word
>> 4) & 3)
583 NEXTWORD (p
, base_disp
, NULL
);
586 NEXTLONG (p
, base_disp
, NULL
);
591 /* Handle single-level case (not indirect). */
594 print_base (basereg
, base_disp
, info
);
596 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
597 (*info
->fprintf_func
) (info
->stream
, ")");
601 /* Two level. Compute displacement to add after indirection. */
606 NEXTWORD (p
, outer_disp
, NULL
);
609 NEXTLONG (p
, outer_disp
, NULL
);
612 print_base (basereg
, base_disp
, info
);
613 if ((word
& 4) == 0 && buf
[0] != '\0')
615 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
618 (*info
->fprintf_func
) (info
->stream
, ")@(%" PRIx64
, (uint64_t) outer_disp
);
620 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
621 (*info
->fprintf_func
) (info
->stream
, ")");
626 #define FETCH_ARG(size, val) \
629 val = fetch_arg (buffer, place, size, info); \
631 return PRINT_INSN_ARG_MEMORY_ERROR; \
635 /* Returns number of bytes "eaten" by the operand, or
636 return enum print_insn_arg_error. ADDR is the pc for this arg to be
640 print_insn_arg (const char *d
,
641 unsigned char *buffer
,
644 disassemble_info
*info
)
648 unsigned char *p
= p0
;
659 case 'c': /* Cache identifier. */
661 static char *const cacheFieldName
[] = { "nc", "dc", "ic", "bc" };
663 (*info
->fprintf_func
) (info
->stream
, "%s", cacheFieldName
[val
]);
667 case 'a': /* Address register indirect only. Cf. case '+'. */
670 (*info
->fprintf_func
) (info
->stream
, "%s@", reg_names
[val
+ 8]);
674 case '_': /* 32-bit absolute address for move16. */
677 (*info
->print_address_func
) (uval
, info
);
682 (*info
->fprintf_func
) (info
->stream
, "%%ccr");
686 (*info
->fprintf_func
) (info
->stream
, "%%sr");
690 (*info
->fprintf_func
) (info
->stream
, "%%usp");
694 (*info
->fprintf_func
) (info
->stream
, "%%acc");
698 (*info
->fprintf_func
) (info
->stream
, "%%macsr");
702 (*info
->fprintf_func
) (info
->stream
, "%%mask");
707 /* FIXME: There's a problem here, different m68k processors call the
708 same address different names. The tables below try to get it right
709 using info->mach, but only for v4e. */
710 struct regname
{ char * name
; int value
; };
711 static const struct regname names
[] =
713 {"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
714 {"%tc", 0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
715 {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
716 {"%rgpiobar", 0x009}, {"%acr4",0x00c},
717 {"%acr5",0x00d}, {"%acr6",0x00e}, {"%acr7", 0x00f},
718 {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
719 {"%msp", 0x803}, {"%isp", 0x804},
721 /* Reg c04 is sometimes called flashbar or rambar.
722 Reg c05 is also sometimes called rambar. */
723 {"%rambar0", 0xc04}, {"%rambar1", 0xc05},
725 /* reg c0e is sometimes called mbar2 or secmbar.
726 reg c0f is sometimes called mbar. */
727 {"%mbar0", 0xc0e}, {"%mbar1", 0xc0f},
729 /* Should we be calling this psr like we do in case 'Y'? */
732 {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808},
734 /* Fido added these. */
735 {"%cac", 0xffe}, {"%mbo", 0xfff}
737 /* Alternate names for v4e (MCF5407/5445x/MCF547x/MCF548x), at least. */
738 static const struct regname names_v4e
[] =
740 {"%asid",0x003}, {"%acr0",0x004}, {"%acr1",0x005},
741 {"%acr2",0x006}, {"%acr3",0x007}, {"%mmubar",0x008},
743 unsigned int arch_mask
;
745 arch_mask
= bfd_m68k_mach_to_features (info
->mach
);
747 if (arch_mask
& (mcfisa_b
| mcfisa_c
))
749 for (regno
= ARRAY_SIZE (names_v4e
); --regno
>= 0;)
750 if (names_v4e
[regno
].value
== val
)
752 (*info
->fprintf_func
) (info
->stream
, "%s", names_v4e
[regno
].name
);
758 for (regno
= ARRAY_SIZE (names
) - 1; regno
>= 0; regno
--)
759 if (names
[regno
].value
== val
)
761 (*info
->fprintf_func
) (info
->stream
, "%s", names
[regno
].name
);
765 (*info
->fprintf_func
) (info
->stream
, "0x%x", val
);
771 /* 0 means 8, except for the bkpt instruction... */
772 if (val
== 0 && d
[1] != 's')
774 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
782 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
787 (*info
->fprintf_func
) (info
->stream
, "#%d", val
+1);
792 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
798 static char *const scalefactor_name
[] = { "<<", ">>" };
801 (*info
->fprintf_func
) (info
->stream
, "%s", scalefactor_name
[val
]);
808 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
814 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
819 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
]);
824 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
+ 010]);
829 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
]);
833 FETCH_ARG (4, regno
);
835 (*info
->fprintf_func
) (info
->stream
, "%s@", reg_names
[regno
]);
837 (*info
->fprintf_func
) (info
->stream
, "@(%s)", reg_names
[regno
]);
842 (*info
->fprintf_func
) (info
->stream
, "%%fp%d", val
);
848 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
& 7]);
850 (*info
->fprintf_func
) (info
->stream
, "%d", val
);
855 (*info
->fprintf_func
) (info
->stream
, "%s@+", reg_names
[val
+ 8]);
860 (*info
->fprintf_func
) (info
->stream
, "%s@-", reg_names
[val
+ 8]);
867 (*info
->fprintf_func
) (info
->stream
, "{%s}", reg_names
[val
]);
869 else if (place
== 'C')
872 if (val
> 63) /* This is a signed constant. */
874 (*info
->fprintf_func
) (info
->stream
, "{#%d}", val
);
877 return PRINT_INSN_ARG_INVALID_OPERAND
;
882 p1
= buffer
+ (*d
== '#' ? 2 : 4);
885 else if (place
== 'C')
887 else if (place
== '8')
889 else if (place
== '3')
891 else if (place
== 'b')
893 else if (place
== 'w' || place
== 'W')
894 NEXTWORD (p1
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
895 else if (place
== 'l')
896 NEXTLONG (p1
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
898 return PRINT_INSN_ARG_INVALID_OP_TABLE
;
900 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
906 else if (place
== 'B')
907 disp
= COERCE_SIGNED_CHAR (buffer
[1]);
908 else if (place
== 'w' || place
== 'W')
909 NEXTWORD (p
, disp
, PRINT_INSN_ARG_MEMORY_ERROR
);
910 else if (place
== 'l' || place
== 'L' || place
== 'C')
911 NEXTLONG (p
, disp
, PRINT_INSN_ARG_MEMORY_ERROR
);
912 else if (place
== 'g')
914 NEXTBYTE (buffer
, disp
);
916 NEXTWORD (p
, disp
, PRINT_INSN_ARG_MEMORY_ERROR
);
918 NEXTLONG (p
, disp
, PRINT_INSN_ARG_MEMORY_ERROR
);
920 else if (place
== 'c')
922 if (buffer
[1] & 0x40) /* If bit six is one, long offset. */
923 NEXTLONG (p
, disp
, PRINT_INSN_ARG_MEMORY_ERROR
);
925 NEXTWORD (p
, disp
, PRINT_INSN_ARG_MEMORY_ERROR
);
928 return PRINT_INSN_ARG_INVALID_OP_TABLE
;
930 (*info
->print_address_func
) (addr
+ disp
, info
);
937 NEXTWORD (p
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
939 (*info
->fprintf_func
) (info
->stream
, "%s@(%d)", reg_names
[val1
+ 8], val
);
945 (*info
->fprintf_func
) (info
->stream
, "%s", fpcr_names
[val
]);
950 (*info
->fprintf_func
) (info
->stream
, "%%acc%d", val
);
955 (*info
->fprintf_func
) (info
->stream
, "%%accext%s", val
== 0 ? "01" : "23");
961 (*info
->fprintf_func
) (info
->stream
, "<<");
963 (*info
->fprintf_func
) (info
->stream
, ">>");
965 return PRINT_INSN_ARG_INVALID_OPERAND
;
969 /* Get coprocessor ID... */
970 val
= fetch_arg (buffer
, 'd', 3, info
);
972 return PRINT_INSN_ARG_MEMORY_ERROR
;
973 if (val
!= 1) /* Unusual coprocessor ID? */
974 (*info
->fprintf_func
) (info
->stream
, "(cpid=%d) ", val
);
1003 val
= fetch_arg (buffer
, 'x', 6, info
);
1005 return PRINT_INSN_ARG_MEMORY_ERROR
;
1006 val
= ((val
& 7) << 3) + ((val
>> 3) & 7);
1010 val
= fetch_arg (buffer
, 's', 6, info
);
1012 return PRINT_INSN_ARG_MEMORY_ERROR
;
1015 /* If the <ea> is invalid for *d, then reject this match. */
1016 if (!m68k_valid_ea (*d
, val
))
1017 return PRINT_INSN_ARG_INVALID_OPERAND
;
1019 /* Get register number assuming address register. */
1020 regno
= (val
& 7) + 8;
1021 regname
= reg_names
[regno
];
1025 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
]);
1029 (*info
->fprintf_func
) (info
->stream
, "%s", regname
);
1033 (*info
->fprintf_func
) (info
->stream
, "%s@", regname
);
1037 (*info
->fprintf_func
) (info
->stream
, "%s@+", regname
);
1041 (*info
->fprintf_func
) (info
->stream
, "%s@-", regname
);
1045 NEXTWORD (p
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
1046 (*info
->fprintf_func
) (info
->stream
, "%s@(%d)", regname
, val
);
1050 p
= print_indexed (regno
, p
, addr
, info
);
1052 return PRINT_INSN_ARG_MEMORY_ERROR
;
1059 NEXTWORD (p
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
1060 (*info
->print_address_func
) (val
, info
);
1064 NEXTULONG (p
, uval
);
1065 (*info
->print_address_func
) (uval
, info
);
1069 NEXTWORD (p
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
1070 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
1071 (*info
->print_address_func
) (addr
+ val
, info
);
1072 (*info
->fprintf_func
) (info
->stream
, ")");
1076 p
= print_indexed (-1, p
, addr
, info
);
1078 return PRINT_INSN_ARG_MEMORY_ERROR
;
1082 flt_p
= 1; /* Assume it's a float... */
1091 NEXTWORD (p
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
1096 NEXTLONG (p
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
1101 NEXTSINGLE (flval
, p
);
1105 NEXTDOUBLE (flval
, p
);
1109 NEXTEXTEND (flval
, p
);
1113 NEXTPACKED (p
, flval
);
1117 return PRINT_INSN_ARG_INVALID_OPERAND
;
1119 if (flt_p
) /* Print a float? */
1120 (*info
->fprintf_func
) (info
->stream
, "#0e%g", flval
);
1122 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
1126 return PRINT_INSN_ARG_INVALID_OPERAND
;
1130 /* If place is '/', then this is the case of the mask bit for
1131 mac/emac loads. Now that the arg has been printed, grab the
1132 mask bit and if set, add a '&' to the arg. */
1137 info
->fprintf_func (info
->stream
, "&");
1147 NEXTWORD (p1
, val
, PRINT_INSN_ARG_MEMORY_ERROR
);
1148 /* Move the pointer ahead if this point is farther ahead
1150 p
= p1
> p
? p1
: p
;
1153 (*info
->fprintf_func
) (info
->stream
, "#0");
1160 for (regno
= 0; regno
< 16; ++regno
)
1161 if (val
& (0x8000 >> regno
))
1162 newval
|= 1 << regno
;
1167 for (regno
= 0; regno
< 16; ++regno
)
1168 if (val
& (1 << regno
))
1173 (*info
->fprintf_func
) (info
->stream
, "/");
1175 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[regno
]);
1176 first_regno
= regno
;
1177 while (val
& (1 << (regno
+ 1)))
1179 if (regno
> first_regno
)
1180 (*info
->fprintf_func
) (info
->stream
, "-%s",
1184 else if (place
== '3')
1186 /* `fmovem' insn. */
1192 (*info
->fprintf_func
) (info
->stream
, "#0");
1199 for (regno
= 0; regno
< 8; ++regno
)
1200 if (val
& (0x80 >> regno
))
1201 newval
|= 1 << regno
;
1206 for (regno
= 0; regno
< 8; ++regno
)
1207 if (val
& (1 << regno
))
1211 (*info
->fprintf_func
) (info
->stream
, "/");
1213 (*info
->fprintf_func
) (info
->stream
, "%%fp%d", regno
);
1214 first_regno
= regno
;
1215 while (val
& (1 << (regno
+ 1)))
1217 if (regno
> first_regno
)
1218 (*info
->fprintf_func
) (info
->stream
, "-%%fp%d", regno
);
1221 else if (place
== '8')
1224 /* fmoveml for FP status registers. */
1225 (*info
->fprintf_func
) (info
->stream
, "%s", fpcr_names
[val
]);
1228 return PRINT_INSN_ARG_INVALID_OP_TABLE
;
1247 case 2: name
= "%tt0"; break;
1248 case 3: name
= "%tt1"; break;
1249 case 0x10: name
= "%tc"; break;
1250 case 0x11: name
= "%drp"; break;
1251 case 0x12: name
= "%srp"; break;
1252 case 0x13: name
= "%crp"; break;
1253 case 0x14: name
= "%cal"; break;
1254 case 0x15: name
= "%val"; break;
1255 case 0x16: name
= "%scc"; break;
1256 case 0x17: name
= "%ac"; break;
1257 case 0x18: name
= "%psr"; break;
1258 case 0x19: name
= "%pcsr"; break;
1262 int break_reg
= ((buffer
[3] >> 2) & 7);
1264 (*info
->fprintf_func
)
1265 (info
->stream
, val
== 0x1c ? "%%bad%d" : "%%bac%d",
1270 (*info
->fprintf_func
) (info
->stream
, "<mmu register %d>", val
);
1273 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
1283 (*info
->fprintf_func
) (info
->stream
, "%%dfc");
1285 (*info
->fprintf_func
) (info
->stream
, "%%sfc");
1287 /* xgettext:c-format */
1288 (*info
->fprintf_func
) (info
->stream
, _("<function code %d>"), fc
);
1293 (*info
->fprintf_func
) (info
->stream
, "%%val");
1300 FETCH_ARG (3, level
);
1301 (*info
->fprintf_func
) (info
->stream
, "%d", level
);
1316 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1317 reg_half_names
[reg
],
1318 is_upper
? "u" : "l");
1323 return PRINT_INSN_ARG_INVALID_OP_TABLE
;
1329 /* Try to match the current instruction to best and if so, return the
1330 number of bytes consumed from the instruction stream, else zero.
1331 Return -1 on memory error. */
1334 match_insn_m68k (bfd_vma memaddr
,
1335 disassemble_info
* info
,
1336 const struct m68k_opcode
* best
)
1338 unsigned char *save_p
;
1341 const char *args
= best
->args
;
1343 struct private *priv
= (struct private *) info
->private_data
;
1344 bfd_byte
*buffer
= priv
->the_buffer
;
1345 fprintf_ftype save_printer
= info
->fprintf_func
;
1346 void (* save_print_address
) (bfd_vma
, struct disassemble_info
*)
1347 = info
->print_address_func
;
1352 /* Point at first word of argument data,
1353 and at descriptor for first argument. */
1356 /* Figure out how long the fixed-size portion of the instruction is.
1357 The only place this is stored in the opcode table is
1358 in the arguments--look for arguments which specify fields in the 2nd
1359 or 3rd words of the instruction. */
1360 for (d
= args
; *d
; d
+= 2)
1362 /* I don't think it is necessary to be checking d[0] here;
1363 I suspect all this could be moved to the case statement below. */
1366 if (d
[1] == 'l' && p
- buffer
< 6)
1368 else if (p
- buffer
< 4 && d
[1] != 'C' && d
[1] != '8')
1372 if ((d
[0] == 'L' || d
[0] == 'l') && d
[1] == 'w' && p
- buffer
< 4)
1398 /* pflusha is an exceptions. It takes no arguments but is two words
1399 long. Recognize it by looking at the lower 16 bits of the mask. */
1400 if (p
- buffer
< 4 && (best
->match
& 0xFFFF) != 0)
1403 /* lpstop is another exception. It takes a one word argument but is
1404 three words long. */
1406 && (best
->match
& 0xffff) == 0xffff
1410 /* Copy the one word argument into the usual location for a one
1411 word argument, to simplify printing it. We can get away with
1412 this because we know exactly what the second word is, and we
1413 aren't going to print anything based on it. */
1415 if (!FETCH_DATA (info
, p
))
1417 buffer
[2] = buffer
[4];
1418 buffer
[3] = buffer
[5];
1421 if (!FETCH_DATA (info
, p
))
1425 info
->print_address_func
= dummy_print_address
;
1426 info
->fprintf_func
= (fprintf_ftype
) dummy_printer
;
1428 /* We scan the operands twice. The first time we don't print anything,
1429 but look for errors. */
1430 for (d
= args
; *d
; d
+= 2)
1432 int eaten
= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
1436 else if (eaten
== PRINT_INSN_ARG_INVALID_OPERAND
1437 || eaten
== PRINT_INSN_ARG_MEMORY_ERROR
)
1439 info
->fprintf_func
= save_printer
;
1440 info
->print_address_func
= save_print_address
;
1441 return eaten
== PRINT_INSN_ARG_MEMORY_ERROR
? -1 : 0;
1445 /* We must restore the print functions before trying to print the
1447 info
->fprintf_func
= save_printer
;
1448 info
->print_address_func
= save_print_address
;
1449 info
->fprintf_func (info
->stream
,
1450 /* xgettext:c-format */
1451 _("<internal error in opcode table: %s %s>\n"),
1452 best
->name
, best
->args
);
1458 info
->fprintf_func
= save_printer
;
1459 info
->print_address_func
= save_print_address
;
1463 info
->fprintf_func (info
->stream
, "%s", best
->name
);
1466 info
->fprintf_func (info
->stream
, " ");
1470 p
+= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
1473 if (*d
&& *(d
- 2) != 'I' && *d
!= 'k')
1474 info
->fprintf_func (info
->stream
, ",");
1480 /* Try to interpret the instruction at address MEMADDR as one that
1481 can execute on a processor with the features given by ARCH_MASK.
1482 If successful, print the instruction to INFO->STREAM and return
1483 its length in bytes. Return 0 otherwise. Return -1 on memory
1487 m68k_scan_mask (bfd_vma memaddr
, disassemble_info
*info
,
1488 unsigned int arch_mask
)
1492 static const struct m68k_opcode
**opcodes
[16];
1493 static int numopcodes
[16];
1497 struct private *priv
= (struct private *) info
->private_data
;
1498 bfd_byte
*buffer
= priv
->the_buffer
;
1502 /* Speed up the matching by sorting the opcode
1503 table on the upper four bits of the opcode. */
1504 const struct m68k_opcode
**opc_pointer
[16];
1506 /* First count how many opcodes are in each of the sixteen buckets. */
1507 for (i
= 0; i
< m68k_numopcodes
; i
++)
1508 numopcodes
[(m68k_opcodes
[i
].opcode
>> 28) & 15]++;
1510 /* Then create a sorted table of pointers
1511 that point into the unsorted table. */
1512 opc_pointer
[0] = xmalloc (sizeof (struct m68k_opcode
*)
1514 opcodes
[0] = opc_pointer
[0];
1516 for (i
= 1; i
< 16; i
++)
1518 opc_pointer
[i
] = opc_pointer
[i
- 1] + numopcodes
[i
- 1];
1519 opcodes
[i
] = opc_pointer
[i
];
1522 for (i
= 0; i
< m68k_numopcodes
; i
++)
1523 *opc_pointer
[(m68k_opcodes
[i
].opcode
>> 28) & 15]++ = &m68k_opcodes
[i
];
1526 if (!FETCH_DATA (info
, buffer
+ 2))
1528 major_opcode
= (buffer
[0] >> 4) & 15;
1530 for (i
= 0; i
< numopcodes
[major_opcode
]; i
++)
1532 const struct m68k_opcode
*opc
= opcodes
[major_opcode
][i
];
1533 unsigned long opcode
= opc
->opcode
;
1534 unsigned long match
= opc
->match
;
1535 const char *args
= opc
->args
;
1540 if (((0xff & buffer
[0] & (match
>> 24)) == (0xff & (opcode
>> 24)))
1541 && ((0xff & buffer
[1] & (match
>> 16)) == (0xff & (opcode
>> 16)))
1542 /* Only fetch the next two bytes if we need to. */
1543 && (((0xffff & match
) == 0)
1545 (FETCH_DATA (info
, buffer
+ 4)
1546 && ((0xff & buffer
[2] & (match
>> 8)) == (0xff & (opcode
>> 8)))
1547 && ((0xff & buffer
[3] & match
) == (0xff & opcode
)))
1549 && (opc
->arch
& arch_mask
) != 0)
1551 /* Don't use for printout the variants of divul and divsl
1552 that have the same register number in two places.
1553 The more general variants will match instead. */
1554 for (d
= args
; *d
; d
+= 2)
1558 /* Don't use for printout the variants of most floating
1559 point coprocessor instructions which use the same
1560 register number in two places, as above. */
1562 for (d
= args
; *d
; d
+= 2)
1566 /* Don't match fmovel with more than one register;
1567 wait for fmoveml. */
1570 for (d
= args
; *d
; d
+= 2)
1572 if (d
[0] == 's' && d
[1] == '8')
1574 val
= fetch_arg (buffer
, d
[1], 3, info
);
1577 if ((val
& (val
- 1)) != 0)
1583 /* Don't match FPU insns with non-default coprocessor ID. */
1586 for (d
= args
; *d
; d
+= 2)
1590 val
= fetch_arg (buffer
, 'd', 3, info
);
1598 if ((val
= match_insn_m68k (memaddr
, info
, opc
)))
1605 /* Print the m68k instruction at address MEMADDR in debugged memory,
1606 on INFO->STREAM. Returns length of the instruction, in bytes. */
1609 print_insn_m68k (bfd_vma memaddr
, disassemble_info
*info
)
1611 unsigned int arch_mask
;
1612 struct private priv
;
1615 bfd_byte
*buffer
= priv
.the_buffer
;
1617 info
->private_data
= & priv
;
1618 /* Tell objdump to use two bytes per chunk
1619 and six bytes per line for displaying raw data. */
1620 info
->bytes_per_chunk
= 2;
1621 info
->bytes_per_line
= 6;
1622 info
->display_endian
= BFD_ENDIAN_BIG
;
1623 priv
.max_fetched
= priv
.the_buffer
;
1624 priv
.insn_start
= memaddr
;
1626 arch_mask
= bfd_m68k_mach_to_features (info
->mach
);
1629 /* First try printing an m680x0 instruction. Try printing a Coldfire
1630 one if that fails. */
1631 val
= m68k_scan_mask (memaddr
, info
, m68k_mask
);
1633 val
= m68k_scan_mask (memaddr
, info
, mcf_mask
);
1637 val
= m68k_scan_mask (memaddr
, info
, arch_mask
);
1641 /* Handle undefined instructions. */
1642 info
->fprintf_func (info
->stream
, ".short 0x%04x", (buffer
[0] << 8) + buffer
[1]);
1644 return val
? val
: 2;