1 /* Print Motorola 68k instructions.
2 Copyright 1986, 1987, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #include "floatformat.h"
23 #include <libiberty.h>
26 #include "opcode/m68k.h"
28 /* Local function prototypes */
31 fetch_data
PARAMS ((struct disassemble_info
*, bfd_byte
*));
34 dummy_print_address
PARAMS ((bfd_vma
, struct disassemble_info
*));
37 fetch_arg
PARAMS ((unsigned char *, int, int, disassemble_info
*));
40 print_base
PARAMS ((int, bfd_vma
, disassemble_info
*));
42 static unsigned char *
43 print_indexed
PARAMS ((int, unsigned char *, bfd_vma
, disassemble_info
*));
46 print_insn_arg
PARAMS ((const char *, unsigned char *, unsigned char *,
47 bfd_vma
, disassemble_info
*));
49 CONST
char * CONST fpcr_names
[] = {
50 "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
51 "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"
54 static char *const reg_names
[] = {
55 "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
56 "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
60 /* Sign-extend an (unsigned char). */
62 #define COERCE_SIGNED_CHAR(ch) ((signed char) (ch))
64 #define COERCE_SIGNED_CHAR(ch) ((int) (((ch) ^ 0x80) & 0xFF) - 128)
67 /* Get a 1 byte signed integer. */
68 #define NEXTBYTE(p) (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
70 /* Get a 2 byte signed integer. */
71 #define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
73 (p += 2, FETCH_DATA (info, p), \
74 COERCE16 ((p[-2] << 8) + p[-1]))
76 /* Get a 4 byte signed integer. */
77 #define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
79 (p += 4, FETCH_DATA (info, p), \
80 (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
82 /* Get a 4 byte unsigned integer. */
83 #define NEXTULONG(p) \
84 (p += 4, FETCH_DATA (info, p), \
85 (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
87 /* Get a single precision float. */
88 #define NEXTSINGLE(val, p) \
89 (p += 4, FETCH_DATA (info, p), \
90 floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
92 /* Get a double precision float. */
93 #define NEXTDOUBLE(val, p) \
94 (p += 8, FETCH_DATA (info, p), \
95 floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
97 /* Get an extended precision float. */
98 #define NEXTEXTEND(val, p) \
99 (p += 12, FETCH_DATA (info, p), \
100 floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
102 /* Need a function to convert from packed to double
103 precision. Actually, it's easier to print a
104 packed number than a double anyway, so maybe
105 there should be a special case to handle this... */
106 #define NEXTPACKED(p) \
107 (p += 12, FETCH_DATA (info, p), 0.0)
109 /* Maximum length of an instruction. */
115 /* Points to first byte not fetched. */
116 bfd_byte
*max_fetched
;
117 bfd_byte the_buffer
[MAXLEN
];
122 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
123 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
125 #define FETCH_DATA(info, addr) \
126 ((addr) <= ((struct private *) (info->private_data))->max_fetched \
127 ? 1 : fetch_data ((info), (addr)))
130 fetch_data (info
, addr
)
131 struct disassemble_info
*info
;
135 struct private *priv
= (struct private *)info
->private_data
;
136 bfd_vma start
= priv
->insn_start
+ (priv
->max_fetched
- priv
->the_buffer
);
138 status
= (*info
->read_memory_func
) (start
,
140 addr
- priv
->max_fetched
,
144 (*info
->memory_error_func
) (status
, start
, info
);
145 longjmp (priv
->bailout
, 1);
148 priv
->max_fetched
= addr
;
152 /* This function is used to print to the bit-bucket. */
155 dummy_printer (FILE *file ATTRIBUTE_UNUSED
,
156 const char *format ATTRIBUTE_UNUSED
, ...)
159 FILE *file ATTRIBUTE_UNUSED
;
166 dummy_print_address (vma
, info
)
167 bfd_vma vma ATTRIBUTE_UNUSED
;
168 struct disassemble_info
*info ATTRIBUTE_UNUSED
;
172 /* Print the m68k instruction at address MEMADDR in debugged memory,
173 on INFO->STREAM. Returns length of the instruction, in bytes. */
176 print_insn_m68k (memaddr
, info
)
178 disassemble_info
*info
;
181 register unsigned char *p
;
182 unsigned char *save_p
;
183 register const char *d
;
184 register unsigned long bestmask
;
185 const struct m68k_opcode
*best
;
186 unsigned int arch_mask
;
188 bfd_byte
*buffer
= priv
.the_buffer
;
189 fprintf_ftype save_printer
= info
->fprintf_func
;
190 void (*save_print_address
) PARAMS ((bfd_vma
, struct disassemble_info
*))
191 = info
->print_address_func
;
193 static int numopcodes
[16];
194 static const struct m68k_opcode
**opcodes
[16];
198 /* Speed up the matching by sorting the opcode table on the upper
199 four bits of the opcode. */
200 const struct m68k_opcode
**opc_pointer
[16];
202 /* First count how many opcodes are in each of the sixteen buckets. */
203 for (i
= 0; i
< m68k_numopcodes
; i
++)
204 numopcodes
[(m68k_opcodes
[i
].opcode
>> 28) & 15]++;
206 /* Then create a sorted table of pointers that point into the
208 opc_pointer
[0] = ((const struct m68k_opcode
**)
209 xmalloc (sizeof (struct m68k_opcode
*)
211 opcodes
[0] = opc_pointer
[0];
212 for (i
= 1; i
< 16; i
++)
214 opc_pointer
[i
] = opc_pointer
[i
- 1] + numopcodes
[i
- 1];
215 opcodes
[i
] = opc_pointer
[i
];
218 for (i
= 0; i
< m68k_numopcodes
; i
++)
219 *opc_pointer
[(m68k_opcodes
[i
].opcode
>> 28) & 15]++ = &m68k_opcodes
[i
];
223 info
->private_data
= (PTR
) &priv
;
224 /* Tell objdump to use two bytes per chunk and six bytes per line for
225 displaying raw data. */
226 info
->bytes_per_chunk
= 2;
227 info
->bytes_per_line
= 6;
228 info
->display_endian
= BFD_ENDIAN_BIG
;
229 priv
.max_fetched
= priv
.the_buffer
;
230 priv
.insn_start
= memaddr
;
231 if (setjmp (priv
.bailout
) != 0)
240 arch_mask
= (unsigned int) -1;
242 case bfd_mach_m68000
:
245 case bfd_mach_m68008
:
248 case bfd_mach_m68010
:
251 case bfd_mach_m68020
:
254 case bfd_mach_m68030
:
257 case bfd_mach_m68040
:
260 case bfd_mach_m68060
:
263 case bfd_mach_mcf5200
:
266 case bfd_mach_mcf5206e
:
267 arch_mask
= mcf5206e
;
269 case bfd_mach_mcf5307
:
272 case bfd_mach_mcf5407
:
277 arch_mask
|= m68881
| m68851
;
280 FETCH_DATA (info
, buffer
+ 2);
281 major_opcode
= (buffer
[0] >> 4) & 15;
282 for (i
= 0; i
< numopcodes
[major_opcode
]; i
++)
284 const struct m68k_opcode
*opc
= opcodes
[major_opcode
][i
];
285 unsigned long opcode
= opc
->opcode
;
286 unsigned long match
= opc
->match
;
288 if (((0xff & buffer
[0] & (match
>> 24)) == (0xff & (opcode
>> 24)))
289 && ((0xff & buffer
[1] & (match
>> 16)) == (0xff & (opcode
>> 16)))
290 /* Only fetch the next two bytes if we need to. */
291 && (((0xffff & match
) == 0)
293 (FETCH_DATA (info
, buffer
+ 4)
294 && ((0xff & buffer
[2] & (match
>> 8)) == (0xff & (opcode
>> 8)))
295 && ((0xff & buffer
[3] & match
) == (0xff & opcode
)))
297 && (opc
->arch
& arch_mask
) != 0)
299 /* Don't use for printout the variants of divul and divsl
300 that have the same register number in two places.
301 The more general variants will match instead. */
302 for (d
= opc
->args
; *d
; d
+= 2)
306 /* Don't use for printout the variants of most floating
307 point coprocessor instructions which use the same
308 register number in two places, as above. */
310 for (d
= opc
->args
; *d
; d
+= 2)
314 /* Don't match fmovel with more than one register; wait for
318 for (d
= opc
->args
; *d
; d
+= 2)
320 if (d
[0] == 's' && d
[1] == '8')
324 val
= fetch_arg (buffer
, d
[1], 3, info
);
325 if ((val
& (val
- 1)) != 0)
331 if (*d
== '\0' && match
> bestmask
)
342 /* Point at first word of argument data,
343 and at descriptor for first argument. */
346 /* Figure out how long the fixed-size portion of the instruction is.
347 The only place this is stored in the opcode table is
348 in the arguments--look for arguments which specify fields in the 2nd
349 or 3rd words of the instruction. */
350 for (d
= best
->args
; *d
; d
+= 2)
352 /* I don't think it is necessary to be checking d[0] here; I suspect
353 all this could be moved to the case statement below. */
356 if (d
[1] == 'l' && p
- buffer
< 6)
358 else if (p
- buffer
< 4 && d
[1] != 'C' && d
[1] != '8')
361 if ((d
[0] == 'L' || d
[0] == 'l') && d
[1] == 'w' && p
- buffer
< 4)
386 /* pflusha is an exceptions. It takes no arguments but is two words
387 long. Recognize it by looking at the lower 16 bits of the mask. */
388 if (p
- buffer
< 4 && (best
->match
& 0xFFFF) != 0)
391 /* lpstop is another exception. It takes a one word argument but is
394 && (best
->match
& 0xffff) == 0xffff
395 && best
->args
[0] == '#'
396 && best
->args
[1] == 'w')
398 /* Copy the one word argument into the usual location for a one
399 word argument, to simplify printing it. We can get away with
400 this because we know exactly what the second word is, and we
401 aren't going to print anything based on it. */
403 FETCH_DATA (info
, p
);
404 buffer
[2] = buffer
[4];
405 buffer
[3] = buffer
[5];
408 FETCH_DATA (info
, p
);
412 /* We can the operands twice. The first time we don't print anything,
413 but look for errors. */
416 info
->print_address_func
= dummy_print_address
;
417 info
->fprintf_func
= (fprintf_ftype
) dummy_printer
;
420 int eaten
= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
423 else if (eaten
== -1)
427 (*info
->fprintf_func
) (info
->stream
,
428 /* xgettext:c-format */
429 _("<internal error in opcode table: %s %s>\n"),
437 info
->fprintf_func
= save_printer
;
438 info
->print_address_func
= save_print_address
;
442 (*info
->fprintf_func
) (info
->stream
, "%s", best
->name
);
445 (*info
->fprintf_func
) (info
->stream
, " ");
449 p
+= print_insn_arg (d
, buffer
, p
, memaddr
+ (p
- buffer
), info
);
451 if (*d
&& *(d
- 2) != 'I' && *d
!= 'k')
452 (*info
->fprintf_func
) (info
->stream
, ",");
457 /* Handle undefined instructions. */
458 info
->fprintf_func
= save_printer
;
459 info
->print_address_func
= save_print_address
;
460 (*info
->fprintf_func
) (info
->stream
, "0%o",
461 (buffer
[0] << 8) + buffer
[1]);
465 /* Returns number of bytes "eaten" by the operand, or
466 return -1 if an invalid operand was found, or -2 if
467 an opcode tabe error was found. */
470 print_insn_arg (d
, buffer
, p0
, addr
, info
)
472 unsigned char *buffer
;
474 bfd_vma addr
; /* PC for this arg to be relative to */
475 disassemble_info
*info
;
477 register int val
= 0;
478 register int place
= d
[1];
479 register unsigned char *p
= p0
;
481 register CONST
char *regname
;
482 register unsigned char *p1
;
490 case 'c': /* cache identifier */
492 static char *const cacheFieldName
[] = { "nc", "dc", "ic", "bc" };
493 val
= fetch_arg (buffer
, place
, 2, info
);
494 (*info
->fprintf_func
) (info
->stream
, cacheFieldName
[val
]);
498 case 'a': /* address register indirect only. Cf. case '+'. */
500 (*info
->fprintf_func
)
503 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
507 case '_': /* 32-bit absolute address for move16. */
509 uval
= NEXTULONG (p
);
510 (*info
->print_address_func
) (uval
, info
);
515 (*info
->fprintf_func
) (info
->stream
, "%%ccr");
519 (*info
->fprintf_func
) (info
->stream
, "%%sr");
523 (*info
->fprintf_func
) (info
->stream
, "%%usp");
527 (*info
->fprintf_func
) (info
->stream
, "%%acc");
531 (*info
->fprintf_func
) (info
->stream
, "%%macsr");
535 (*info
->fprintf_func
) (info
->stream
, "%%mask");
540 static const struct { char *name
; int value
; } names
[]
541 = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
542 {"%tc", 0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
543 {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
544 {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
545 {"%msp", 0x803}, {"%isp", 0x804},
547 /* Should we be calling this psr like we do in case 'Y'? */
550 {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808}};
552 val
= fetch_arg (buffer
, place
, 12, info
);
553 for (regno
= sizeof names
/ sizeof names
[0] - 1; regno
>= 0; regno
--)
554 if (names
[regno
].value
== val
)
556 (*info
->fprintf_func
) (info
->stream
, "%s", names
[regno
].name
);
560 (*info
->fprintf_func
) (info
->stream
, "%d", val
);
565 val
= fetch_arg (buffer
, place
, 3, info
);
566 /* 0 means 8, except for the bkpt instruction... */
567 if (val
== 0 && d
[1] != 's')
569 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
575 static char *const scalefactor_name
[] = { "<<", ">>" };
576 val
= fetch_arg (buffer
, place
, 1, info
);
577 (*info
->fprintf_func
) (info
->stream
, scalefactor_name
[val
]);
581 val
= fetch_arg (buffer
, place
, 8, info
);
584 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
589 val
= fetch_arg (buffer
, place
, 4, info
);
590 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
594 (*info
->fprintf_func
) (info
->stream
, "%s",
595 reg_names
[fetch_arg (buffer
, place
, 3, info
)]);
599 (*info
->fprintf_func
)
601 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 010]);
605 (*info
->fprintf_func
)
607 reg_names
[fetch_arg (buffer
, place
, 4, info
)]);
611 regno
= fetch_arg (buffer
, place
, 4, info
);
613 (*info
->fprintf_func
) (info
->stream
, "%s@", reg_names
[regno
]);
615 (*info
->fprintf_func
) (info
->stream
, "@(%s)", reg_names
[regno
]);
619 (*info
->fprintf_func
)
620 (info
->stream
, "%%fp%d",
621 fetch_arg (buffer
, place
, 3, info
));
625 val
= fetch_arg (buffer
, place
, 6, info
);
627 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
& 7]);
629 (*info
->fprintf_func
) (info
->stream
, "%d", val
);
633 (*info
->fprintf_func
)
634 (info
->stream
, "%s@+",
635 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
639 (*info
->fprintf_func
)
640 (info
->stream
, "%s@-",
641 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8]);
646 (*info
->fprintf_func
)
647 (info
->stream
, "{%s}",
648 reg_names
[fetch_arg (buffer
, place
, 3, info
)]);
649 else if (place
== 'C')
651 val
= fetch_arg (buffer
, place
, 7, info
);
652 if (val
> 63) /* This is a signed constant. */
654 (*info
->fprintf_func
) (info
->stream
, "{#%d}", val
);
662 p1
= buffer
+ (*d
== '#' ? 2 : 4);
664 val
= fetch_arg (buffer
, place
, 4, info
);
665 else if (place
== 'C')
666 val
= fetch_arg (buffer
, place
, 7, info
);
667 else if (place
== '8')
668 val
= fetch_arg (buffer
, place
, 3, info
);
669 else if (place
== '3')
670 val
= fetch_arg (buffer
, place
, 8, info
);
671 else if (place
== 'b')
673 else if (place
== 'w' || place
== 'W')
675 else if (place
== 'l')
679 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
685 else if (place
== 'B')
686 disp
= COERCE_SIGNED_CHAR (buffer
[1]);
687 else if (place
== 'w' || place
== 'W')
689 else if (place
== 'l' || place
== 'L' || place
== 'C')
691 else if (place
== 'g')
693 disp
= NEXTBYTE (buffer
);
699 else if (place
== 'c')
701 if (buffer
[1] & 0x40) /* If bit six is one, long offset */
709 (*info
->print_address_func
) (addr
+ disp
, info
);
714 (*info
->fprintf_func
)
715 (info
->stream
, "%s@(%d)",
716 reg_names
[fetch_arg (buffer
, place
, 3, info
) + 8], val
);
720 (*info
->fprintf_func
) (info
->stream
, "%s",
721 fpcr_names
[fetch_arg (buffer
, place
, 3, info
)]);
725 /* Get coprocessor ID... */
726 val
= fetch_arg (buffer
, 'd', 3, info
);
728 if (val
!= 1) /* Unusual coprocessor ID? */
729 (*info
->fprintf_func
) (info
->stream
, "(cpid=%d) ", val
);
754 val
= fetch_arg (buffer
, 'x', 6, info
);
755 val
= ((val
& 7) << 3) + ((val
>> 3) & 7);
758 val
= fetch_arg (buffer
, 's', 6, info
);
760 /* Get register number assuming address register. */
761 regno
= (val
& 7) + 8;
762 regname
= reg_names
[regno
];
766 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[val
]);
770 (*info
->fprintf_func
) (info
->stream
, "%s", regname
);
774 (*info
->fprintf_func
) (info
->stream
, "%s@", regname
);
778 (*info
->fprintf_func
) (info
->stream
, "%s@+", regname
);
782 (*info
->fprintf_func
) (info
->stream
, "%s@-", regname
);
787 (*info
->fprintf_func
) (info
->stream
, "%s@(%d)", regname
, val
);
791 p
= print_indexed (regno
, p
, addr
, info
);
799 (*info
->print_address_func
) (val
, info
);
803 uval
= NEXTULONG (p
);
804 (*info
->print_address_func
) (uval
, info
);
809 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
810 (*info
->print_address_func
) (addr
+ val
, info
);
811 (*info
->fprintf_func
) (info
->stream
, ")");
815 p
= print_indexed (-1, p
, addr
, info
);
819 flt_p
= 1; /* Assume it's a float... */
838 NEXTSINGLE (flval
, p
);
842 NEXTDOUBLE (flval
, p
);
846 NEXTEXTEND (flval
, p
);
850 flval
= NEXTPACKED (p
);
856 if (flt_p
) /* Print a float? */
857 (*info
->fprintf_func
) (info
->stream
, "#%g", flval
);
859 (*info
->fprintf_func
) (info
->stream
, "#%d", val
);
875 /* Move the pointer ahead if this point is farther ahead
880 (*info
->fprintf_func
) (info
->stream
, "#0");
885 register int newval
= 0;
886 for (regno
= 0; regno
< 16; ++regno
)
887 if (val
& (0x8000 >> regno
))
888 newval
|= 1 << regno
;
893 for (regno
= 0; regno
< 16; ++regno
)
894 if (val
& (1 << regno
))
898 (*info
->fprintf_func
) (info
->stream
, "/");
900 (*info
->fprintf_func
) (info
->stream
, "%s", reg_names
[regno
]);
902 while (val
& (1 << (regno
+ 1)))
904 if (regno
> first_regno
)
905 (*info
->fprintf_func
) (info
->stream
, "-%s",
909 else if (place
== '3')
913 val
= fetch_arg (buffer
, place
, 8, info
);
916 (*info
->fprintf_func
) (info
->stream
, "#0");
921 register int newval
= 0;
922 for (regno
= 0; regno
< 8; ++regno
)
923 if (val
& (0x80 >> regno
))
924 newval
|= 1 << regno
;
929 for (regno
= 0; regno
< 8; ++regno
)
930 if (val
& (1 << regno
))
934 (*info
->fprintf_func
) (info
->stream
, "/");
936 (*info
->fprintf_func
) (info
->stream
, "%%fp%d", regno
);
938 while (val
& (1 << (regno
+ 1)))
940 if (regno
> first_regno
)
941 (*info
->fprintf_func
) (info
->stream
, "-%%fp%d", regno
);
944 else if (place
== '8')
946 /* fmoveml for FP status registers */
947 (*info
->fprintf_func
) (info
->stream
, "%s",
948 fpcr_names
[fetch_arg (buffer
, place
, 3,
965 int val
= fetch_arg (buffer
, place
, 5, info
);
969 case 2: name
= "%tt0"; break;
970 case 3: name
= "%tt1"; break;
971 case 0x10: name
= "%tc"; break;
972 case 0x11: name
= "%drp"; break;
973 case 0x12: name
= "%srp"; break;
974 case 0x13: name
= "%crp"; break;
975 case 0x14: name
= "%cal"; break;
976 case 0x15: name
= "%val"; break;
977 case 0x16: name
= "%scc"; break;
978 case 0x17: name
= "%ac"; break;
979 case 0x18: name
= "%psr"; break;
980 case 0x19: name
= "%pcsr"; break;
984 int break_reg
= ((buffer
[3] >> 2) & 7);
985 (*info
->fprintf_func
)
986 (info
->stream
, val
== 0x1c ? "%%bad%d" : "%%bac%d",
991 (*info
->fprintf_func
) (info
->stream
, "<mmu register %d>", val
);
994 (*info
->fprintf_func
) (info
->stream
, "%s", name
);
1000 int fc
= fetch_arg (buffer
, place
, 5, info
);
1002 (*info
->fprintf_func
) (info
->stream
, "%%dfc");
1004 (*info
->fprintf_func
) (info
->stream
, "%%sfc");
1006 /* xgettext:c-format */
1007 (*info
->fprintf_func
) (info
->stream
, _("<function code %d>"), fc
);
1012 (*info
->fprintf_func
) (info
->stream
, "%%val");
1017 int level
= fetch_arg (buffer
, place
, 3, info
);
1018 (*info
->fprintf_func
) (info
->stream
, "%d", level
);
1025 int reg
= fetch_arg (buffer
, place
, 5, info
);
1032 (*info
->fprintf_func
) (info
->stream
, "%s%s",
1034 is_upper
? "u" : "l");
1045 /* Fetch BITS bits from a position in the instruction specified by CODE.
1046 CODE is a "place to put an argument", or 'x' for a destination
1047 that is a general address (mode and register).
1048 BUFFER contains the instruction. */
1051 fetch_arg (buffer
, code
, bits
, info
)
1052 unsigned char *buffer
;
1055 disassemble_info
*info
;
1057 register int val
= 0;
1064 case 'd': /* Destination, for register or quick. */
1065 val
= (buffer
[0] << 8) + buffer
[1];
1069 case 'x': /* Destination, for general arg */
1070 val
= (buffer
[0] << 8) + buffer
[1];
1075 FETCH_DATA (info
, buffer
+ 3);
1076 val
= (buffer
[3] >> 4);
1080 FETCH_DATA (info
, buffer
+ 3);
1085 FETCH_DATA (info
, buffer
+ 3);
1086 val
= (buffer
[2] << 8) + buffer
[3];
1091 FETCH_DATA (info
, buffer
+ 3);
1092 val
= (buffer
[2] << 8) + buffer
[3];
1098 FETCH_DATA (info
, buffer
+ 3);
1099 val
= (buffer
[2] << 8) + buffer
[3];
1103 FETCH_DATA (info
, buffer
+ 5);
1104 val
= (buffer
[4] << 8) + buffer
[5];
1109 FETCH_DATA (info
, buffer
+ 5);
1110 val
= (buffer
[4] << 8) + buffer
[5];
1115 FETCH_DATA (info
, buffer
+ 5);
1116 val
= (buffer
[4] << 8) + buffer
[5];
1120 FETCH_DATA (info
, buffer
+ 3);
1121 val
= (buffer
[2] << 8) + buffer
[3];
1126 FETCH_DATA (info
, buffer
+ 3);
1127 val
= (buffer
[2] << 8) + buffer
[3];
1132 FETCH_DATA (info
, buffer
+ 3);
1133 val
= (buffer
[2] << 8) + buffer
[3];
1138 val
= (buffer
[1] >> 6);
1142 val
= (buffer
[1] & 0x40 ? 0x8 : 0)
1143 | ((buffer
[0] >> 1) & 0x7)
1144 | (buffer
[3] & 0x80 ? 0x10 : 0);
1148 val
= (buffer
[1] & 0x40 ? 0x8 : 0) | ((buffer
[0] >> 1) & 0x7);
1152 val
= (buffer
[2] >> 4) | (buffer
[3] & 0x80 ? 0x10 : 0);
1156 val
= buffer
[1] | (buffer
[3] & 0x40 ? 0x10 : 0);
1160 val
= buffer
[3] | (buffer
[3] & 0x40 ? 0x10 : 0);
1164 val
= buffer
[2] >> 2;
1196 /* Print an indexed argument. The base register is BASEREG (-1 for pc).
1197 P points to extension word, in buffer.
1198 ADDR is the nominal core address of that extension word. */
1200 static unsigned char *
1201 print_indexed (basereg
, p
, addr
, info
)
1205 disassemble_info
*info
;
1208 static char *const scales
[] = { "", ":2", ":4", ":8" };
1214 word
= NEXTWORD (p
);
1216 /* Generate the text for the index register.
1217 Where this will be output is not yet determined. */
1218 sprintf (buf
, "%s:%c%s",
1219 reg_names
[(word
>> 12) & 0xf],
1220 (word
& 0x800) ? 'l' : 'w',
1221 scales
[(word
>> 9) & 3]);
1223 /* Handle the 68000 style of indexing. */
1225 if ((word
& 0x100) == 0)
1227 base_disp
= word
& 0xff;
1228 if ((base_disp
& 0x80) != 0)
1232 print_base (basereg
, base_disp
, info
);
1233 (*info
->fprintf_func
) (info
->stream
, ",%s)", buf
);
1237 /* Handle the generalized kind. */
1238 /* First, compute the displacement to add to the base register. */
1250 switch ((word
>> 4) & 3)
1253 base_disp
= NEXTWORD (p
);
1256 base_disp
= NEXTLONG (p
);
1261 /* Handle single-level case (not indirect) */
1263 if ((word
& 7) == 0)
1265 print_base (basereg
, base_disp
, info
);
1267 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
1268 (*info
->fprintf_func
) (info
->stream
, ")");
1272 /* Two level. Compute displacement to add after indirection. */
1278 outer_disp
= NEXTWORD (p
);
1281 outer_disp
= NEXTLONG (p
);
1284 print_base (basereg
, base_disp
, info
);
1285 if ((word
& 4) == 0 && buf
[0] != '\0')
1287 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
1290 sprintf_vma (vmabuf
, outer_disp
);
1291 (*info
->fprintf_func
) (info
->stream
, ")@(%s", vmabuf
);
1293 (*info
->fprintf_func
) (info
->stream
, ",%s", buf
);
1294 (*info
->fprintf_func
) (info
->stream
, ")");
1299 /* Print a base register REGNO and displacement DISP, on INFO->STREAM.
1300 REGNO = -1 for pc, -2 for none (suppressed). */
1303 print_base (regno
, disp
, info
)
1306 disassemble_info
*info
;
1310 (*info
->fprintf_func
) (info
->stream
, "%%pc@(");
1311 (*info
->print_address_func
) (disp
, info
);
1318 (*info
->fprintf_func
) (info
->stream
, "@(");
1319 else if (regno
== -3)
1320 (*info
->fprintf_func
) (info
->stream
, "%%zpc@(");
1322 (*info
->fprintf_func
) (info
->stream
, "%s@(", reg_names
[regno
]);
1324 sprintf_vma (buf
, disp
);
1325 (*info
->fprintf_func
) (info
->stream
, "%s", buf
);