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