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