1 /* Print Motorola 68k instructions.
2 Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 97, 1998
3 Free Software Foundation, Inc.
5 This file is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
20 #include "floatformat.h"
21 #include <libiberty.h>
24 #include "opcode/m68k.h"
26 /* Local function prototypes */
29 fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
32 dummy_print_address PARAMS ((bfd_vma, struct disassemble_info *));
35 fetch_arg PARAMS ((unsigned char *, int, int, disassemble_info *));
38 print_base PARAMS ((int, bfd_vma, disassemble_info*));
40 static unsigned char *
41 print_indexed PARAMS ((int, unsigned char *, bfd_vma, disassemble_info *));
44 print_insn_arg PARAMS ((const char *, unsigned char *, unsigned char *,
45 bfd_vma, disassemble_info *));
47 CONST char * CONST fpcr_names[] = {
48 "", "%fpiar", "%fpsr", "%fpiar/%fpsr", "%fpcr",
49 "%fpiar/%fpcr", "%fpsr/%fpcr", "%fpiar/%fpsr/%fpcr"};
51 static char *const reg_names[] = {
52 "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
53 "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%fp", "%sp",
56 /* Sign-extend an (unsigned char). */
58 #define COERCE_SIGNED_CHAR(ch) ((signed char)(ch))
60 #define COERCE_SIGNED_CHAR(ch) ((int)(((ch) ^ 0x80) & 0xFF) - 128)
63 /* Get a 1 byte signed integer. */
64 #define NEXTBYTE(p) (p += 2, FETCH_DATA (info, p), COERCE_SIGNED_CHAR(p[-1]))
66 /* Get a 2 byte signed integer. */
67 #define COERCE16(x) ((int) (((x) ^ 0x8000) - 0x8000))
69 (p += 2, FETCH_DATA (info, p), \
70 COERCE16 ((p[-2] << 8) + p[-1]))
72 /* Get a 4 byte signed integer. */
73 #define COERCE32(x) ((bfd_signed_vma) ((x) ^ 0x80000000) - 0x80000000)
75 (p += 4, FETCH_DATA (info, p), \
76 (COERCE32 ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1])))
78 /* Get a 4 byte unsigned integer. */
79 #define NEXTULONG(p) \
80 (p += 4, FETCH_DATA (info, p), \
81 (unsigned int) ((((((p[-4] << 8) + p[-3]) << 8) + p[-2]) << 8) + p[-1]))
83 /* Get a single precision float. */
84 #define NEXTSINGLE(val, p) \
85 (p += 4, FETCH_DATA (info, p), \
86 floatformat_to_double (&floatformat_ieee_single_big, (char *) p - 4, &val))
88 /* Get a double precision float. */
89 #define NEXTDOUBLE(val, p) \
90 (p += 8, FETCH_DATA (info, p), \
91 floatformat_to_double (&floatformat_ieee_double_big, (char *) p - 8, &val))
93 /* Get an extended precision float. */
94 #define NEXTEXTEND(val, p) \
95 (p += 12, FETCH_DATA (info, p), \
96 floatformat_to_double (&floatformat_m68881_ext, (char *) p - 12, &val))
98 /* Need a function to convert from packed to double
99 precision. Actually, it's easier to print a
100 packed number than a double anyway, so maybe
101 there should be a special case to handle this... */
102 #define NEXTPACKED(p) \
103 (p += 12, FETCH_DATA (info, p), 0.0)
106 /* Maximum length of an instruction. */
113 /* Points to first byte not fetched. */
114 bfd_byte *max_fetched;
115 bfd_byte the_buffer[MAXLEN];
120 /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive)
121 to ADDR (exclusive) are valid. Returns 1 for success, longjmps
123 #define FETCH_DATA(info, addr) \
124 ((addr) <= ((struct private *)(info->private_data))->max_fetched \
125 ? 1 : fetch_data ((info), (addr)))
128 fetch_data (info, addr)
129 struct disassemble_info *info;
133 struct private *priv = (struct private *)info->private_data;
134 bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer);
136 status = (*info->read_memory_func) (start,
138 addr - priv->max_fetched,
142 (*info->memory_error_func) (status, start, info);
143 longjmp (priv->bailout, 1);
146 priv->max_fetched = addr;
150 /* This function is used to print to the bit-bucket. */
153 dummy_printer (FILE * file, const char * format, ...)
155 dummy_printer (file) FILE *file;
160 dummy_print_address (vma, info)
162 struct disassemble_info *info;
166 /* Print the m68k instruction at address MEMADDR in debugged memory,
167 on INFO->STREAM. Returns length of the instruction, in bytes. */
170 print_insn_m68k (memaddr, info)
172 disassemble_info *info;
175 register unsigned char *p;
176 unsigned char *save_p;
177 register const char *d;
178 register unsigned long bestmask;
179 const struct m68k_opcode *best = 0;
180 unsigned int arch_mask;
182 bfd_byte *buffer = priv.the_buffer;
183 fprintf_ftype save_printer = info->fprintf_func;
184 void (*save_print_address) PARAMS((bfd_vma, struct disassemble_info*))
185 = info->print_address_func;
187 static int numopcodes[16];
188 static const struct m68k_opcode **opcodes[16];
192 /* Speed up the matching by sorting the opcode table on the upper
193 four bits of the opcode. */
194 const struct m68k_opcode **opc_pointer[16];
196 /* First count how many opcodes are in each of the sixteen buckets. */
197 for (i = 0; i < m68k_numopcodes; i++)
198 numopcodes[(m68k_opcodes[i].opcode >> 28) & 15]++;
200 /* Then create a sorted table of pointers that point into the
202 opc_pointer[0] = ((const struct m68k_opcode **)
203 xmalloc (sizeof (struct m68k_opcode *)
205 opcodes[0] = opc_pointer[0];
206 for (i = 1; i < 16; i++)
208 opc_pointer[i] = opc_pointer[i - 1] + numopcodes[i - 1];
209 opcodes[i] = opc_pointer[i];
212 for (i = 0; i < m68k_numopcodes; i++)
213 *opc_pointer[(m68k_opcodes[i].opcode >> 28) & 15]++ = &m68k_opcodes[i];
217 info->private_data = (PTR) &priv;
218 /* Tell objdump to use two bytes per chunk and six bytes per line for
219 displaying raw data. */
220 info->bytes_per_chunk = 2;
221 info->bytes_per_line = 6;
222 info->display_endian = BFD_ENDIAN_BIG;
223 priv.max_fetched = priv.the_buffer;
224 priv.insn_start = memaddr;
225 if (setjmp (priv.bailout) != 0)
233 arch_mask = (unsigned int) -1;
235 case bfd_mach_m68000:
238 case bfd_mach_m68008:
241 case bfd_mach_m68010:
244 case bfd_mach_m68020:
247 case bfd_mach_m68030:
250 case bfd_mach_m68040:
253 case bfd_mach_m68060:
258 arch_mask |= m68881 | m68851;
261 FETCH_DATA (info, buffer + 2);
262 major_opcode = (buffer[0] >> 4) & 15;
263 for (i = 0; i < numopcodes[major_opcode]; i++)
265 const struct m68k_opcode *opc = opcodes[major_opcode][i];
266 unsigned long opcode = opc->opcode;
267 unsigned long match = opc->match;
269 if (((0xff & buffer[0] & (match >> 24)) == (0xff & (opcode >> 24)))
270 && ((0xff & buffer[1] & (match >> 16)) == (0xff & (opcode >> 16)))
271 /* Only fetch the next two bytes if we need to. */
272 && (((0xffff & match) == 0)
274 (FETCH_DATA (info, buffer + 4)
275 && ((0xff & buffer[2] & (match >> 8)) == (0xff & (opcode >> 8)))
276 && ((0xff & buffer[3] & match) == (0xff & opcode)))
278 && (opc->arch & arch_mask) != 0)
280 /* Don't use for printout the variants of divul and divsl
281 that have the same register number in two places.
282 The more general variants will match instead. */
283 for (d = opc->args; *d; d += 2)
287 /* Don't use for printout the variants of most floating
288 point coprocessor instructions which use the same
289 register number in two places, as above. */
291 for (d = opc->args; *d; d += 2)
295 /* Don't match fmovel with more than one register; wait for
299 for (d = opc->args; *d; d += 2)
301 if (d[0] == 's' && d[1] == '8')
305 val = fetch_arg (buffer, d[1], 3, info);
306 if ((val & (val - 1)) != 0)
312 if (*d == '\0' && match > bestmask)
323 /* Point at first word of argument data,
324 and at descriptor for first argument. */
327 /* Figure out how long the fixed-size portion of the instruction is.
328 The only place this is stored in the opcode table is
329 in the arguments--look for arguments which specify fields in the 2nd
330 or 3rd words of the instruction. */
331 for (d = best->args; *d; d += 2)
333 /* I don't think it is necessary to be checking d[0] here; I suspect
334 all this could be moved to the case statement below. */
337 if (d[1] == 'l' && p - buffer < 6)
339 else if (p - buffer < 4 && d[1] != 'C' && d[1] != '8' )
342 if ((d[0] == 'L' || d[0] == 'l') && d[1] == 'w' && p - buffer < 4)
367 /* pflusha is an exceptions. It takes no arguments but is two words
368 long. Recognize it by looking at the lower 16 bits of the mask. */
369 if (p - buffer < 4 && (best->match & 0xFFFF) != 0)
372 /* lpstop is another exception. It takes a one word argument but is
375 && (best->match & 0xffff) == 0xffff
376 && best->args[0] == '#'
377 && best->args[1] == 'w')
379 /* Copy the one word argument into the usual location for a one
380 word argument, to simplify printing it. We can get away with
381 this because we know exactly what the second word is, and we
382 aren't going to print anything based on it. */
384 FETCH_DATA (info, p);
385 buffer[2] = buffer[4];
386 buffer[3] = buffer[5];
389 FETCH_DATA (info, p);
393 /* We can the operands twice. The first time we don't print anything,
394 but look for errors. */
397 info->print_address_func = dummy_print_address;
398 info->fprintf_func = (fprintf_ftype)dummy_printer;
401 int eaten = print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
404 else if (eaten == -1)
408 (*info->fprintf_func)(info->stream,
409 /* xgettext:c-format */
410 _("<internal error in opcode table: %s %s>\n"),
418 info->fprintf_func = save_printer;
419 info->print_address_func = save_print_address;
423 (*info->fprintf_func) (info->stream, "%s", best->name);
426 (*info->fprintf_func) (info->stream, " ");
430 p += print_insn_arg (d, buffer, p, memaddr + (p - buffer), info);
432 if (*d && *(d - 2) != 'I' && *d != 'k')
433 (*info->fprintf_func) (info->stream, ",");
438 /* Handle undefined instructions. */
439 info->fprintf_func = save_printer;
440 info->print_address_func = save_print_address;
441 (*info->fprintf_func) (info->stream, "0%o",
442 (buffer[0] << 8) + buffer[1]);
446 /* Returns number of bytes "eaten" by the operand, or
447 return -1 if an invalid operand was found, or -2 if
448 an opcode tabe error was found. */
451 print_insn_arg (d, buffer, p0, addr, info)
453 unsigned char *buffer;
455 bfd_vma addr; /* PC for this arg to be relative to */
456 disassemble_info *info;
458 register int val = 0;
459 register int place = d[1];
460 register unsigned char *p = p0;
462 register CONST char *regname;
463 register unsigned char *p1;
471 case 'c': /* cache identifier */
473 static char *const cacheFieldName[] = { "nc", "dc", "ic", "bc" };
474 val = fetch_arg (buffer, place, 2, info);
475 (*info->fprintf_func) (info->stream, cacheFieldName[val]);
479 case 'a': /* address register indirect only. Cf. case '+'. */
481 (*info->fprintf_func)
484 reg_names [fetch_arg (buffer, place, 3, info) + 8]);
488 case '_': /* 32-bit absolute address for move16. */
490 uval = NEXTULONG (p);
491 (*info->print_address_func) (uval, info);
496 (*info->fprintf_func) (info->stream, "%%ccr");
500 (*info->fprintf_func) (info->stream, "%%sr");
504 (*info->fprintf_func) (info->stream, "%%usp");
509 static const struct { char *name; int value; } names[]
510 = {{"%sfc", 0x000}, {"%dfc", 0x001}, {"%cacr", 0x002},
511 {"%tc", 0x003}, {"%itt0",0x004}, {"%itt1", 0x005},
512 {"%dtt0",0x006}, {"%dtt1",0x007}, {"%buscr",0x008},
513 {"%usp", 0x800}, {"%vbr", 0x801}, {"%caar", 0x802},
514 {"%msp", 0x803}, {"%isp", 0x804},
516 /* Should we be calling this psr like we do in case 'Y'? */
519 {"%urp", 0x806}, {"%srp", 0x807}, {"%pcr", 0x808}};
521 val = fetch_arg (buffer, place, 12, info);
522 for (regno = sizeof names / sizeof names[0] - 1; regno >= 0; regno--)
523 if (names[regno].value == val)
525 (*info->fprintf_func) (info->stream, "%s", names[regno].name);
529 (*info->fprintf_func) (info->stream, "%d", val);
534 val = fetch_arg (buffer, place, 3, info);
535 /* 0 means 8, except for the bkpt instruction... */
536 if (val == 0 && d[1] != 's')
538 (*info->fprintf_func) (info->stream, "#%d", val);
542 val = fetch_arg (buffer, place, 8, info);
545 (*info->fprintf_func) (info->stream, "#%d", val);
549 val = fetch_arg (buffer, place, 4, info);
550 (*info->fprintf_func) (info->stream, "#%d", val);
554 (*info->fprintf_func) (info->stream, "%s",
555 reg_names[fetch_arg (buffer, place, 3, info)]);
559 (*info->fprintf_func)
561 reg_names[fetch_arg (buffer, place, 3, info) + 010]);
565 (*info->fprintf_func)
567 reg_names[fetch_arg (buffer, place, 4, info)]);
571 regno = fetch_arg (buffer, place, 4, info);
573 (*info->fprintf_func) (info->stream, "%s@", reg_names[regno]);
575 (*info->fprintf_func) (info->stream, "@(%s)", reg_names[regno]);
579 (*info->fprintf_func)
580 (info->stream, "%%fp%d",
581 fetch_arg (buffer, place, 3, info));
585 val = fetch_arg (buffer, place, 6, info);
587 (*info->fprintf_func) (info->stream, "%s", reg_names [val & 7]);
589 (*info->fprintf_func) (info->stream, "%d", val);
593 (*info->fprintf_func)
594 (info->stream, "%s@+",
595 reg_names[fetch_arg (buffer, place, 3, info) + 8]);
599 (*info->fprintf_func)
600 (info->stream, "%s@-",
601 reg_names[fetch_arg (buffer, place, 3, info) + 8]);
606 (*info->fprintf_func)
607 (info->stream, "{%s}",
608 reg_names[fetch_arg (buffer, place, 3, info)]);
609 else if (place == 'C')
611 val = fetch_arg (buffer, place, 7, info);
612 if ( val > 63 ) /* This is a signed constant. */
614 (*info->fprintf_func) (info->stream, "{#%d}", val);
622 p1 = buffer + (*d == '#' ? 2 : 4);
624 val = fetch_arg (buffer, place, 4, info);
625 else if (place == 'C')
626 val = fetch_arg (buffer, place, 7, info);
627 else if (place == '8')
628 val = fetch_arg (buffer, place, 3, info);
629 else if (place == '3')
630 val = fetch_arg (buffer, place, 8, info);
631 else if (place == 'b')
633 else if (place == 'w' || place == 'W')
635 else if (place == 'l')
639 (*info->fprintf_func) (info->stream, "#%d", val);
645 else if (place == 'B')
646 disp = COERCE_SIGNED_CHAR(buffer[1]);
647 else if (place == 'w' || place == 'W')
649 else if (place == 'l' || place == 'L' || place == 'C')
651 else if (place == 'g')
653 disp = NEXTBYTE (buffer);
659 else if (place == 'c')
661 if (buffer[1] & 0x40) /* If bit six is one, long offset */
669 (*info->print_address_func) (addr + disp, info);
674 (*info->fprintf_func)
675 (info->stream, "%s@(%d)",
676 reg_names[fetch_arg (buffer, place, 3, info) + 8], val);
680 (*info->fprintf_func) (info->stream, "%s",
681 fpcr_names[fetch_arg (buffer, place, 3, info)]);
685 /* Get coprocessor ID... */
686 val = fetch_arg (buffer, 'd', 3, info);
688 if (val != 1) /* Unusual coprocessor ID? */
689 (*info->fprintf_func) (info->stream, "(cpid=%d) ", val);
714 val = fetch_arg (buffer, 'x', 6, info);
715 val = ((val & 7) << 3) + ((val >> 3) & 7);
718 val = fetch_arg (buffer, 's', 6, info);
720 /* Get register number assuming address register. */
721 regno = (val & 7) + 8;
722 regname = reg_names[regno];
726 (*info->fprintf_func) (info->stream, "%s", reg_names[val]);
730 (*info->fprintf_func) (info->stream, "%s", regname);
734 (*info->fprintf_func) (info->stream, "%s@", regname);
738 (*info->fprintf_func) (info->stream, "%s@+", regname);
742 (*info->fprintf_func) (info->stream, "%s@-", regname);
747 (*info->fprintf_func) (info->stream, "%s@(%d)", regname, val);
751 p = print_indexed (regno, p, addr, info);
759 (*info->print_address_func) (val, info);
763 uval = NEXTULONG (p);
764 (*info->print_address_func) (uval, info);
769 (*info->fprintf_func) (info->stream, "%%pc@(");
770 (*info->print_address_func) (addr + val, info);
771 (*info->fprintf_func) (info->stream, ")");
775 p = print_indexed (-1, p, addr, info);
779 flt_p = 1; /* Assume it's a float... */
798 NEXTSINGLE(flval, p);
802 NEXTDOUBLE(flval, p);
806 NEXTEXTEND(flval, p);
810 flval = NEXTPACKED(p);
816 if ( flt_p ) /* Print a float? */
817 (*info->fprintf_func) (info->stream, "#%g", flval);
819 (*info->fprintf_func) (info->stream, "#%d", val);
835 /* Move the pointer ahead if this point is farther ahead
840 (*info->fprintf_func) (info->stream, "#0");
845 register int newval = 0;
846 for (regno = 0; regno < 16; ++regno)
847 if (val & (0x8000 >> regno))
848 newval |= 1 << regno;
853 for (regno = 0; regno < 16; ++regno)
854 if (val & (1 << regno))
858 (*info->fprintf_func) (info->stream, "/");
860 (*info->fprintf_func) (info->stream, "%s", reg_names[regno]);
862 while (val & (1 << (regno + 1)))
864 if (regno > first_regno)
865 (*info->fprintf_func) (info->stream, "-%s",
869 else if (place == '3')
873 val = fetch_arg (buffer, place, 8, info);
876 (*info->fprintf_func) (info->stream, "#0");
881 register int newval = 0;
882 for (regno = 0; regno < 8; ++regno)
883 if (val & (0x80 >> regno))
884 newval |= 1 << regno;
889 for (regno = 0; regno < 8; ++regno)
890 if (val & (1 << regno))
894 (*info->fprintf_func) (info->stream, "/");
896 (*info->fprintf_func) (info->stream, "%%fp%d", regno);
898 while (val & (1 << (regno + 1)))
900 if (regno > first_regno)
901 (*info->fprintf_func) (info->stream, "-%%fp%d", regno);
904 else if (place == '8')
906 /* fmoveml for FP status registers */
907 (*info->fprintf_func) (info->stream, "%s",
908 fpcr_names[fetch_arg (buffer, place, 3,
925 int val = fetch_arg (buffer, place, 5, info);
929 case 2: name = "%tt0"; break;
930 case 3: name = "%tt1"; break;
931 case 0x10: name = "%tc"; break;
932 case 0x11: name = "%drp"; break;
933 case 0x12: name = "%srp"; break;
934 case 0x13: name = "%crp"; break;
935 case 0x14: name = "%cal"; break;
936 case 0x15: name = "%val"; break;
937 case 0x16: name = "%scc"; break;
938 case 0x17: name = "%ac"; break;
939 case 0x18: name = "%psr"; break;
940 case 0x19: name = "%pcsr"; break;
944 int break_reg = ((buffer[3] >> 2) & 7);
945 (*info->fprintf_func)
946 (info->stream, val == 0x1c ? "%%bad%d" : "%%bac%d",
951 (*info->fprintf_func) (info->stream, "<mmu register %d>", val);
954 (*info->fprintf_func) (info->stream, "%s", name);
960 int fc = fetch_arg (buffer, place, 5, info);
962 (*info->fprintf_func) (info->stream, "%%dfc");
964 (*info->fprintf_func) (info->stream, "%%sfc");
966 /* xgettext:c-format */
967 (*info->fprintf_func) (info->stream, _("<function code %d>"), fc);
972 (*info->fprintf_func) (info->stream, "%%val");
977 int level = fetch_arg (buffer, place, 3, info);
978 (*info->fprintf_func) (info->stream, "%d", level);
989 /* Fetch BITS bits from a position in the instruction specified by CODE.
990 CODE is a "place to put an argument", or 'x' for a destination
991 that is a general address (mode and register).
992 BUFFER contains the instruction. */
995 fetch_arg (buffer, code, bits, info)
996 unsigned char *buffer;
999 disassemble_info *info;
1001 register int val = 0;
1008 case 'd': /* Destination, for register or quick. */
1009 val = (buffer[0] << 8) + buffer[1];
1013 case 'x': /* Destination, for general arg */
1014 val = (buffer[0] << 8) + buffer[1];
1019 FETCH_DATA (info, buffer + 3);
1020 val = (buffer[3] >> 4);
1024 FETCH_DATA (info, buffer + 3);
1029 FETCH_DATA (info, buffer + 3);
1030 val = (buffer[2] << 8) + buffer[3];
1035 FETCH_DATA (info, buffer + 3);
1036 val = (buffer[2] << 8) + buffer[3];
1042 FETCH_DATA (info, buffer + 3);
1043 val = (buffer[2] << 8) + buffer[3];
1047 FETCH_DATA (info, buffer + 5);
1048 val = (buffer[4] << 8) + buffer[5];
1053 FETCH_DATA (info, buffer + 5);
1054 val = (buffer[4] << 8) + buffer[5];
1059 FETCH_DATA (info, buffer + 5);
1060 val = (buffer[4] << 8) + buffer[5];
1064 FETCH_DATA (info, buffer + 3);
1065 val = (buffer[2] << 8) + buffer[3];
1070 FETCH_DATA (info, buffer + 3);
1071 val = (buffer[2] << 8) + buffer[3];
1076 FETCH_DATA (info, buffer + 3);
1077 val = (buffer[2] << 8) + buffer[3];
1082 val = (buffer[1] >> 6);
1112 /* Print an indexed argument. The base register is BASEREG (-1 for pc).
1113 P points to extension word, in buffer.
1114 ADDR is the nominal core address of that extension word. */
1116 static unsigned char *
1117 print_indexed (basereg, p, addr, info)
1121 disassemble_info *info;
1124 static char *const scales[] = {"", ":2", ":4", ":8"};
1130 word = NEXTWORD (p);
1132 /* Generate the text for the index register.
1133 Where this will be output is not yet determined. */
1134 sprintf (buf, "%s:%c%s",
1135 reg_names[(word >> 12) & 0xf],
1136 (word & 0x800) ? 'l' : 'w',
1137 scales[(word >> 9) & 3]);
1139 /* Handle the 68000 style of indexing. */
1141 if ((word & 0x100) == 0)
1143 base_disp = word & 0xff;
1144 if ((base_disp & 0x80) != 0)
1148 print_base (basereg, base_disp, info);
1149 (*info->fprintf_func) (info->stream, ",%s)", buf);
1153 /* Handle the generalized kind. */
1154 /* First, compute the displacement to add to the base register. */
1166 switch ((word >> 4) & 3)
1169 base_disp = NEXTWORD (p);
1172 base_disp = NEXTLONG (p);
1177 /* Handle single-level case (not indirect) */
1179 if ((word & 7) == 0)
1181 print_base (basereg, base_disp, info);
1183 (*info->fprintf_func) (info->stream, ",%s", buf);
1184 (*info->fprintf_func) (info->stream, ")");
1188 /* Two level. Compute displacement to add after indirection. */
1194 outer_disp = NEXTWORD (p);
1197 outer_disp = NEXTLONG (p);
1200 print_base (basereg, base_disp, info);
1201 if ((word & 4) == 0 && buf[0] != '\0')
1203 (*info->fprintf_func) (info->stream, ",%s", buf);
1206 sprintf_vma (vmabuf, outer_disp);
1207 (*info->fprintf_func) (info->stream, ")@(%s", vmabuf);
1209 (*info->fprintf_func) (info->stream, ",%s", buf);
1210 (*info->fprintf_func) (info->stream, ")");
1215 /* Print a base register REGNO and displacement DISP, on INFO->STREAM.
1216 REGNO = -1 for pc, -2 for none (suppressed). */
1219 print_base (regno, disp, info)
1222 disassemble_info *info;
1226 (*info->fprintf_func) (info->stream, "%%pc@(");
1227 (*info->print_address_func) (disp, info);
1234 (*info->fprintf_func) (info->stream, "@(");
1235 else if (regno == -3)
1236 (*info->fprintf_func) (info->stream, "%%zpc@(");
1238 (*info->fprintf_func) (info->stream, "%s@(", reg_names[regno]);
1240 sprintf_vma (buf, disp);
1241 (*info->fprintf_func) (info->stream, "%s", buf);