1 /* Print SPARC instructions. 2 Copyright (C) 1989-2014 Free Software Foundation, Inc. 3 4 This file is part of the GNU opcodes library. 5 6 This library is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 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. 15 16 You should have received a copy of the GNU General Public License 17 along with this program; if not, write to the Free Software 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 19 MA 02110-1301, USA. */ 20 21 #include "sysdep.h" 22 #include <stdio.h> 23 #include "opcode/sparc.h" 24 #include "dis-asm.h" 25 #include "libiberty.h" 26 #include "opintl.h" 27 28 /* Bitmask of v9 architectures. */ 29 #define MASK_V9 ((1 << SPARC_OPCODE_ARCH_V9) \ 30 | (1 << SPARC_OPCODE_ARCH_V9A) \ 31 | (1 << SPARC_OPCODE_ARCH_V9B)) 32 /* 1 if INSN is for v9 only. */ 33 #define V9_ONLY_P(insn) (! ((insn)->architecture & ~MASK_V9)) 34 /* 1 if INSN is for v9. */ 35 #define V9_P(insn) (((insn)->architecture & MASK_V9) != 0) 36 37 /* The sorted opcode table. */ 38 static const sparc_opcode **sorted_opcodes; 39 40 /* For faster lookup, after insns are sorted they are hashed. */ 41 /* ??? I think there is room for even more improvement. */ 42 43 #define HASH_SIZE 256 44 /* It is important that we only look at insn code bits as that is how the 45 opcode table is hashed. OPCODE_BITS is a table of valid bits for each 46 of the main types (0,1,2,3). */ 47 static int opcode_bits[4] = { 0x01c00000, 0x0, 0x01f80000, 0x01f80000 }; 48 #define HASH_INSN(INSN) \ 49 ((((INSN) >> 24) & 0xc0) | (((INSN) & opcode_bits[((INSN) >> 30) & 3]) >> 19)) 50 typedef struct sparc_opcode_hash 51 { 52 struct sparc_opcode_hash *next; 53 const sparc_opcode *opcode; 54 } sparc_opcode_hash; 55 56 static sparc_opcode_hash *opcode_hash_table[HASH_SIZE]; 57 58 /* Sign-extend a value which is N bits long. */ 59 #define SEX(value, bits) \ 60 ((((int)(value)) << ((8 * sizeof (int)) - bits)) \ 61 >> ((8 * sizeof (int)) - bits) ) 62 63 static char *reg_names[] = 64 { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7", 65 "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7", 66 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", 67 "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7", 68 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", 69 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", 70 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", 71 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", 72 "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39", 73 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47", 74 "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55", 75 "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63", 76 /* psr, wim, tbr, fpsr, cpsr are v8 only. */ 77 "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr" 78 }; 79 80 #define freg_names (®_names[4 * 8]) 81 82 /* These are ordered according to there register number in 83 rdpr and wrpr insns. */ 84 static char *v9_priv_reg_names[] = 85 { 86 "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl", 87 "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin", 88 "wstate", "fq", "gl" 89 /* "ver" - special cased */ 90 }; 91 92 /* These are ordered according to there register number in 93 rdhpr and wrhpr insns. */ 94 static char *v9_hpriv_reg_names[] = 95 { 96 "hpstate", "htstate", "resv2", "hintp", "resv4", "htba", "hver", 97 "resv7", "resv8", "resv9", "resv10", "resv11", "resv12", "resv13", 98 "resv14", "resv15", "resv16", "resv17", "resv18", "resv19", "resv20", 99 "resv21", "resv22", "resv23", "resv24", "resv25", "resv26", "resv27", 100 "hstick_offset", "hstick_enable", "resv30", "hstick_cmpr" 101 }; 102 103 /* These are ordered according to there register number in 104 rd and wr insns (-16). */ 105 static char *v9a_asr_reg_names[] = 106 { 107 "pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint", 108 "softint", "tick_cmpr", "stick", "stick_cmpr", "cfr", 109 "pause", "mwait" 110 }; 111 112 /* Macros used to extract instruction fields. Not all fields have 113 macros defined here, only those which are actually used. */ 114 115 #define X_RD(i) (((i) >> 25) & 0x1f) 116 #define X_RS1(i) (((i) >> 14) & 0x1f) 117 #define X_LDST_I(i) (((i) >> 13) & 1) 118 #define X_ASI(i) (((i) >> 5) & 0xff) 119 #define X_RS2(i) (((i) >> 0) & 0x1f) 120 #define X_RS3(i) (((i) >> 9) & 0x1f) 121 #define X_IMM(i,n) (((i) >> 0) & ((1 << (n)) - 1)) 122 #define X_SIMM(i,n) SEX (X_IMM ((i), (n)), (n)) 123 #define X_DISP22(i) (((i) >> 0) & 0x3fffff) 124 #define X_IMM22(i) X_DISP22 (i) 125 #define X_DISP30(i) (((i) >> 0) & 0x3fffffff) 126 127 /* These are for v9. */ 128 #define X_DISP16(i) (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff)) 129 #define X_DISP10(i) (((((i) >> 19) & 3) << 8) | (((i) >> 5) & 0xff)) 130 #define X_DISP19(i) (((i) >> 0) & 0x7ffff) 131 #define X_MEMBAR(i) ((i) & 0x7f) 132 133 /* Here is the union which was used to extract instruction fields 134 before the shift and mask macros were written. 135 136 union sparc_insn 137 { 138 unsigned long int code; 139 struct 140 { 141 unsigned int anop:2; 142 #define op ldst.anop 143 unsigned int anrd:5; 144 #define rd ldst.anrd 145 unsigned int op3:6; 146 unsigned int anrs1:5; 147 #define rs1 ldst.anrs1 148 unsigned int i:1; 149 unsigned int anasi:8; 150 #define asi ldst.anasi 151 unsigned int anrs2:5; 152 #define rs2 ldst.anrs2 153 #define shcnt rs2 154 } ldst; 155 struct 156 { 157 unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1; 158 unsigned int IMM13:13; 159 #define imm13 IMM13.IMM13 160 } IMM13; 161 struct 162 { 163 unsigned int anop:2; 164 unsigned int a:1; 165 unsigned int cond:4; 166 unsigned int op2:3; 167 unsigned int DISP22:22; 168 #define disp22 branch.DISP22 169 #define imm22 disp22 170 } branch; 171 struct 172 { 173 unsigned int anop:2; 174 unsigned int a:1; 175 unsigned int z:1; 176 unsigned int rcond:3; 177 unsigned int op2:3; 178 unsigned int DISP16HI:2; 179 unsigned int p:1; 180 unsigned int _rs1:5; 181 unsigned int DISP16LO:14; 182 } branch16; 183 struct 184 { 185 unsigned int anop:2; 186 unsigned int adisp30:30; 187 #define disp30 call.adisp30 188 } call; 189 }; */ 190 191 /* Nonzero if INSN is the opcode for a delayed branch. */ 192 193 static int 194 is_delayed_branch (unsigned long insn) 195 { 196 sparc_opcode_hash *op; 197 198 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next) 199 { 200 const sparc_opcode *opcode = op->opcode; 201 202 if ((opcode->match & insn) == opcode->match 203 && (opcode->lose & insn) == 0) 204 return opcode->flags & F_DELAYED; 205 } 206 return 0; 207 } 208 209 /* extern void qsort (); */ 210 211 /* Records current mask of SPARC_OPCODE_ARCH_FOO values, used to pass value 212 to compare_opcodes. */ 213 static unsigned int current_arch_mask; 214 215 /* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values. */ 216 217 static int 218 compute_arch_mask (unsigned long mach) 219 { 220 switch (mach) 221 { 222 case 0 : 223 case bfd_mach_sparc : 224 return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8) 225 | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_LEON)); 226 case bfd_mach_sparc_sparclet : 227 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET); 228 case bfd_mach_sparc_sparclite : 229 case bfd_mach_sparc_sparclite_le : 230 /* sparclites insns are recognized by default (because that's how 231 they've always been treated, for better or worse). Kludge this by 232 indicating generic v8 is also selected. */ 233 return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE) 234 | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8)); 235 case bfd_mach_sparc_v8plus : 236 case bfd_mach_sparc_v9 : 237 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9); 238 case bfd_mach_sparc_v8plusa : 239 case bfd_mach_sparc_v9a : 240 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A); 241 case bfd_mach_sparc_v8plusb : 242 case bfd_mach_sparc_v9b : 243 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B); 244 } 245 abort (); 246 } 247 248 /* Compare opcodes A and B. */ 249 250 static int 251 compare_opcodes (const void * a, const void * b) 252 { 253 sparc_opcode *op0 = * (sparc_opcode **) a; 254 sparc_opcode *op1 = * (sparc_opcode **) b; 255 unsigned long int match0 = op0->match, match1 = op1->match; 256 unsigned long int lose0 = op0->lose, lose1 = op1->lose; 257 register unsigned int i; 258 259 /* If one (and only one) insn isn't supported by the current architecture, 260 prefer the one that is. If neither are supported, but they're both for 261 the same architecture, continue processing. Otherwise (both unsupported 262 and for different architectures), prefer lower numbered arch's (fudged 263 by comparing the bitmasks). */ 264 if (op0->architecture & current_arch_mask) 265 { 266 if (! (op1->architecture & current_arch_mask)) 267 return -1; 268 } 269 else 270 { 271 if (op1->architecture & current_arch_mask) 272 return 1; 273 else if (op0->architecture != op1->architecture) 274 return op0->architecture - op1->architecture; 275 } 276 277 /* If a bit is set in both match and lose, there is something 278 wrong with the opcode table. */ 279 if (match0 & lose0) 280 { 281 fprintf 282 (stderr, 283 /* xgettext:c-format */ 284 _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"), 285 op0->name, match0, lose0); 286 op0->lose &= ~op0->match; 287 lose0 = op0->lose; 288 } 289 290 if (match1 & lose1) 291 { 292 fprintf 293 (stderr, 294 /* xgettext:c-format */ 295 _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"), 296 op1->name, match1, lose1); 297 op1->lose &= ~op1->match; 298 lose1 = op1->lose; 299 } 300 301 /* Because the bits that are variable in one opcode are constant in 302 another, it is important to order the opcodes in the right order. */ 303 for (i = 0; i < 32; ++i) 304 { 305 unsigned long int x = 1 << i; 306 int x0 = (match0 & x) != 0; 307 int x1 = (match1 & x) != 0; 308 309 if (x0 != x1) 310 return x1 - x0; 311 } 312 313 for (i = 0; i < 32; ++i) 314 { 315 unsigned long int x = 1 << i; 316 int x0 = (lose0 & x) != 0; 317 int x1 = (lose1 & x) != 0; 318 319 if (x0 != x1) 320 return x1 - x0; 321 } 322 323 /* They are functionally equal. So as long as the opcode table is 324 valid, we can put whichever one first we want, on aesthetic grounds. */ 325 326 /* Our first aesthetic ground is that aliases defer to real insns. */ 327 { 328 int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS); 329 330 if (alias_diff != 0) 331 /* Put the one that isn't an alias first. */ 332 return alias_diff; 333 } 334 335 /* Except for aliases, two "identical" instructions had 336 better have the same opcode. This is a sanity check on the table. */ 337 i = strcmp (op0->name, op1->name); 338 if (i) 339 { 340 if (op0->flags & F_ALIAS) 341 { 342 if (op0->flags & F_PREFERRED) 343 return -1; 344 if (op1->flags & F_PREFERRED) 345 return 1; 346 347 /* If they're both aliases, and neither is marked as preferred, 348 be arbitrary. */ 349 return i; 350 } 351 else 352 fprintf (stderr, 353 /* xgettext:c-format */ 354 _("Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"), 355 op0->name, op1->name); 356 } 357 358 /* Fewer arguments are preferred. */ 359 { 360 int length_diff = strlen (op0->args) - strlen (op1->args); 361 362 if (length_diff != 0) 363 /* Put the one with fewer arguments first. */ 364 return length_diff; 365 } 366 367 /* Put 1+i before i+1. */ 368 { 369 char *p0 = (char *) strchr (op0->args, '+'); 370 char *p1 = (char *) strchr (op1->args, '+'); 371 372 if (p0 && p1) 373 { 374 /* There is a plus in both operands. Note that a plus 375 sign cannot be the first character in args, 376 so the following [-1]'s are valid. */ 377 if (p0[-1] == 'i' && p1[1] == 'i') 378 /* op0 is i+1 and op1 is 1+i, so op1 goes first. */ 379 return 1; 380 if (p0[1] == 'i' && p1[-1] == 'i') 381 /* op0 is 1+i and op1 is i+1, so op0 goes first. */ 382 return -1; 383 } 384 } 385 386 /* Put 1,i before i,1. */ 387 { 388 int i0 = strncmp (op0->args, "i,1", 3) == 0; 389 int i1 = strncmp (op1->args, "i,1", 3) == 0; 390 391 if (i0 ^ i1) 392 return i0 - i1; 393 } 394 395 /* They are, as far as we can tell, identical. 396 Since qsort may have rearranged the table partially, there is 397 no way to tell which one was first in the opcode table as 398 written, so just say there are equal. */ 399 /* ??? This is no longer true now that we sort a vector of pointers, 400 not the table itself. */ 401 return 0; 402 } 403 404 /* Build a hash table from the opcode table. 405 OPCODE_TABLE is a sorted list of pointers into the opcode table. */ 406 407 static void 408 build_hash_table (const sparc_opcode **opcode_table, 409 sparc_opcode_hash **hash_table, 410 int num_opcodes) 411 { 412 int i; 413 int hash_count[HASH_SIZE]; 414 static sparc_opcode_hash *hash_buf = NULL; 415 416 /* Start at the end of the table and work backwards so that each 417 chain is sorted. */ 418 419 memset (hash_table, 0, HASH_SIZE * sizeof (hash_table[0])); 420 memset (hash_count, 0, HASH_SIZE * sizeof (hash_count[0])); 421 if (hash_buf != NULL) 422 free (hash_buf); 423 hash_buf = xmalloc (sizeof (* hash_buf) * num_opcodes); 424 for (i = num_opcodes - 1; i >= 0; --i) 425 { 426 int hash = HASH_INSN (opcode_table[i]->match); 427 sparc_opcode_hash *h = &hash_buf[i]; 428 429 h->next = hash_table[hash]; 430 h->opcode = opcode_table[i]; 431 hash_table[hash] = h; 432 ++hash_count[hash]; 433 } 434 435 #if 0 /* for debugging */ 436 { 437 int min_count = num_opcodes, max_count = 0; 438 int total; 439 440 for (i = 0; i < HASH_SIZE; ++i) 441 { 442 if (hash_count[i] < min_count) 443 min_count = hash_count[i]; 444 if (hash_count[i] > max_count) 445 max_count = hash_count[i]; 446 total += hash_count[i]; 447 } 448 449 printf ("Opcode hash table stats: min %d, max %d, ave %f\n", 450 min_count, max_count, (double) total / HASH_SIZE); 451 } 452 #endif 453 } 454 455 /* Print one instruction from MEMADDR on INFO->STREAM. 456 457 We suffix the instruction with a comment that gives the absolute 458 address involved, as well as its symbolic form, if the instruction 459 is preceded by a findable `sethi' and it either adds an immediate 460 displacement to that register, or it is an `add' or `or' instruction 461 on that register. */ 462 463 int 464 print_insn_sparc (bfd_vma memaddr, disassemble_info *info) 465 { 466 FILE *stream = info->stream; 467 bfd_byte buffer[4]; 468 unsigned long insn; 469 sparc_opcode_hash *op; 470 /* Nonzero of opcode table has been initialized. */ 471 static int opcodes_initialized = 0; 472 /* bfd mach number of last call. */ 473 static unsigned long current_mach = 0; 474 bfd_vma (*getword) (const void *); 475 476 if (!opcodes_initialized 477 || info->mach != current_mach) 478 { 479 int i; 480 481 current_arch_mask = compute_arch_mask (info->mach); 482 483 if (!opcodes_initialized) 484 sorted_opcodes = 485 xmalloc (sparc_num_opcodes * sizeof (sparc_opcode *)); 486 /* Reset the sorted table so we can resort it. */ 487 for (i = 0; i < sparc_num_opcodes; ++i) 488 sorted_opcodes[i] = &sparc_opcodes[i]; 489 qsort ((char *) sorted_opcodes, sparc_num_opcodes, 490 sizeof (sorted_opcodes[0]), compare_opcodes); 491 492 build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes); 493 current_mach = info->mach; 494 opcodes_initialized = 1; 495 } 496 497 { 498 int status = 499 (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info); 500 501 if (status != 0) 502 { 503 (*info->memory_error_func) (status, memaddr, info); 504 return -1; 505 } 506 } 507 508 /* On SPARClite variants such as DANlite (sparc86x), instructions 509 are always big-endian even when the machine is in little-endian mode. */ 510 if (info->endian == BFD_ENDIAN_BIG || info->mach == bfd_mach_sparc_sparclite) 511 getword = bfd_getb32; 512 else 513 getword = bfd_getl32; 514 515 insn = getword (buffer); 516 517 info->insn_info_valid = 1; /* We do return this info. */ 518 info->insn_type = dis_nonbranch; /* Assume non branch insn. */ 519 info->branch_delay_insns = 0; /* Assume no delay. */ 520 info->target = 0; /* Assume no target known. */ 521 522 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next) 523 { 524 const sparc_opcode *opcode = op->opcode; 525 526 /* If the insn isn't supported by the current architecture, skip it. */ 527 if (! (opcode->architecture & current_arch_mask)) 528 continue; 529 530 if ((opcode->match & insn) == opcode->match 531 && (opcode->lose & insn) == 0) 532 { 533 /* Nonzero means that we have found an instruction which has 534 the effect of adding or or'ing the imm13 field to rs1. */ 535 int imm_added_to_rs1 = 0; 536 int imm_ored_to_rs1 = 0; 537 538 /* Nonzero means that we have found a plus sign in the args 539 field of the opcode table. */ 540 int found_plus = 0; 541 542 /* Nonzero means we have an annulled branch. */ 543 int is_annulled = 0; 544 545 /* Do we have an `add' or `or' instruction combining an 546 immediate with rs1? */ 547 if (opcode->match == 0x80102000) /* or */ 548 imm_ored_to_rs1 = 1; 549 if (opcode->match == 0x80002000) /* add */ 550 imm_added_to_rs1 = 1; 551 552 if (X_RS1 (insn) != X_RD (insn) 553 && strchr (opcode->args, 'r') != 0) 554 /* Can't do simple format if source and dest are different. */ 555 continue; 556 if (X_RS2 (insn) != X_RD (insn) 557 && strchr (opcode->args, 'O') != 0) 558 /* Can't do simple format if source and dest are different. */ 559 continue; 560 561 (*info->fprintf_func) (stream, "%s", opcode->name); 562 563 { 564 const char *s; 565 566 if (opcode->args[0] != ',') 567 (*info->fprintf_func) (stream, " "); 568 569 for (s = opcode->args; *s != '\0'; ++s) 570 { 571 while (*s == ',') 572 { 573 (*info->fprintf_func) (stream, ","); 574 ++s; 575 switch (*s) 576 { 577 case 'a': 578 (*info->fprintf_func) (stream, "a"); 579 is_annulled = 1; 580 ++s; 581 continue; 582 case 'N': 583 (*info->fprintf_func) (stream, "pn"); 584 ++s; 585 continue; 586 587 case 'T': 588 (*info->fprintf_func) (stream, "pt"); 589 ++s; 590 continue; 591 592 default: 593 break; 594 } 595 } 596 597 (*info->fprintf_func) (stream, " "); 598 599 switch (*s) 600 { 601 case '+': 602 found_plus = 1; 603 /* Fall through. */ 604 605 default: 606 (*info->fprintf_func) (stream, "%c", *s); 607 break; 608 609 case '#': 610 (*info->fprintf_func) (stream, "0"); 611 break; 612 613 #define reg(n) (*info->fprintf_func) (stream, "%%%s", reg_names[n]) 614 case '1': 615 case 'r': 616 reg (X_RS1 (insn)); 617 break; 618 619 case '2': 620 case 'O': 621 reg (X_RS2 (insn)); 622 break; 623 624 case 'd': 625 reg (X_RD (insn)); 626 break; 627 #undef reg 628 629 #define freg(n) (*info->fprintf_func) (stream, "%%%s", freg_names[n]) 630 #define fregx(n) (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)]) 631 case 'e': 632 freg (X_RS1 (insn)); 633 break; 634 case 'v': /* Double/even. */ 635 case 'V': /* Quad/multiple of 4. */ 636 fregx (X_RS1 (insn)); 637 break; 638 639 case 'f': 640 freg (X_RS2 (insn)); 641 break; 642 case 'B': /* Double/even. */ 643 case 'R': /* Quad/multiple of 4. */ 644 fregx (X_RS2 (insn)); 645 break; 646 647 case '4': 648 freg (X_RS3 (insn)); 649 break; 650 case '5': /* Double/even. */ 651 fregx (X_RS3 (insn)); 652 break; 653 654 case 'g': 655 freg (X_RD (insn)); 656 break; 657 case 'H': /* Double/even. */ 658 case 'J': /* Quad/multiple of 4. */ 659 case '}': /* Double/even. */ 660 fregx (X_RD (insn)); 661 break; 662 #undef freg 663 #undef fregx 664 665 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n)) 666 case 'b': 667 creg (X_RS1 (insn)); 668 break; 669 670 case 'c': 671 creg (X_RS2 (insn)); 672 break; 673 674 case 'D': 675 creg (X_RD (insn)); 676 break; 677 #undef creg 678 679 case 'h': 680 (*info->fprintf_func) (stream, "%%hi(%#x)", 681 ((unsigned) 0xFFFFFFFF 682 & ((int) X_IMM22 (insn) << 10))); 683 break; 684 685 case 'i': /* 13 bit immediate. */ 686 case 'I': /* 11 bit immediate. */ 687 case 'j': /* 10 bit immediate. */ 688 { 689 int imm; 690 691 if (*s == 'i') 692 imm = X_SIMM (insn, 13); 693 else if (*s == 'I') 694 imm = X_SIMM (insn, 11); 695 else 696 imm = X_SIMM (insn, 10); 697 698 /* Check to see whether we have a 1+i, and take 699 note of that fact. 700 701 Note: because of the way we sort the table, 702 we will be matching 1+i rather than i+1, 703 so it is OK to assume that i is after +, 704 not before it. */ 705 if (found_plus) 706 imm_added_to_rs1 = 1; 707 708 if (imm <= 9) 709 (*info->fprintf_func) (stream, "%d", imm); 710 else 711 (*info->fprintf_func) (stream, "%#x", imm); 712 } 713 break; 714 715 case ')': /* 5 bit unsigned immediate from RS3. */ 716 (info->fprintf_func) (stream, "%#x", (unsigned int) X_RS3 (insn)); 717 break; 718 719 case 'X': /* 5 bit unsigned immediate. */ 720 case 'Y': /* 6 bit unsigned immediate. */ 721 { 722 int imm = X_IMM (insn, *s == 'X' ? 5 : 6); 723 724 if (imm <= 9) 725 (info->fprintf_func) (stream, "%d", imm); 726 else 727 (info->fprintf_func) (stream, "%#x", (unsigned) imm); 728 } 729 break; 730 731 case '3': 732 (info->fprintf_func) (stream, "%ld", X_IMM (insn, 3)); 733 break; 734 735 case 'K': 736 { 737 int mask = X_MEMBAR (insn); 738 int bit = 0x40, printed_one = 0; 739 const char *name; 740 741 if (mask == 0) 742 (info->fprintf_func) (stream, "0"); 743 else 744 while (bit) 745 { 746 if (mask & bit) 747 { 748 if (printed_one) 749 (info->fprintf_func) (stream, "|"); 750 name = sparc_decode_membar (bit); 751 (info->fprintf_func) (stream, "%s", name); 752 printed_one = 1; 753 } 754 bit >>= 1; 755 } 756 break; 757 } 758 759 case '=': 760 info->target = memaddr + SEX (X_DISP10 (insn), 10) * 4; 761 (*info->print_address_func) (info->target, info); 762 break; 763 764 case 'k': 765 info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4; 766 (*info->print_address_func) (info->target, info); 767 break; 768 769 case 'G': 770 info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4; 771 (*info->print_address_func) (info->target, info); 772 break; 773 774 case '6': 775 case '7': 776 case '8': 777 case '9': 778 (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0'); 779 break; 780 781 case 'z': 782 (*info->fprintf_func) (stream, "%%icc"); 783 break; 784 785 case 'Z': 786 (*info->fprintf_func) (stream, "%%xcc"); 787 break; 788 789 case 'E': 790 (*info->fprintf_func) (stream, "%%ccr"); 791 break; 792 793 case 's': 794 (*info->fprintf_func) (stream, "%%fprs"); 795 break; 796 797 case '{': 798 (*info->fprintf_func) (stream, "%%mcdper"); 799 break; 800 801 case 'o': 802 (*info->fprintf_func) (stream, "%%asi"); 803 break; 804 805 case 'W': 806 (*info->fprintf_func) (stream, "%%tick"); 807 break; 808 809 case 'P': 810 (*info->fprintf_func) (stream, "%%pc"); 811 break; 812 813 case '?': 814 if (X_RS1 (insn) == 31) 815 (*info->fprintf_func) (stream, "%%ver"); 816 else if ((unsigned) X_RS1 (insn) < 17) 817 (*info->fprintf_func) (stream, "%%%s", 818 v9_priv_reg_names[X_RS1 (insn)]); 819 else 820 (*info->fprintf_func) (stream, "%%reserved"); 821 break; 822 823 case '!': 824 if ((unsigned) X_RD (insn) < 17) 825 (*info->fprintf_func) (stream, "%%%s", 826 v9_priv_reg_names[X_RD (insn)]); 827 else 828 (*info->fprintf_func) (stream, "%%reserved"); 829 break; 830 831 case '$': 832 if ((unsigned) X_RS1 (insn) < 32) 833 (*info->fprintf_func) (stream, "%%%s", 834 v9_hpriv_reg_names[X_RS1 (insn)]); 835 else 836 (*info->fprintf_func) (stream, "%%reserved"); 837 break; 838 839 case '%': 840 if ((unsigned) X_RD (insn) < 32) 841 (*info->fprintf_func) (stream, "%%%s", 842 v9_hpriv_reg_names[X_RD (insn)]); 843 else 844 (*info->fprintf_func) (stream, "%%reserved"); 845 break; 846 847 case '/': 848 if (X_RS1 (insn) < 16 || X_RS1 (insn) > 28) 849 (*info->fprintf_func) (stream, "%%reserved"); 850 else 851 (*info->fprintf_func) (stream, "%%%s", 852 v9a_asr_reg_names[X_RS1 (insn)-16]); 853 break; 854 855 case '_': 856 if (X_RD (insn) < 16 || X_RD (insn) > 28) 857 (*info->fprintf_func) (stream, "%%reserved"); 858 else 859 (*info->fprintf_func) (stream, "%%%s", 860 v9a_asr_reg_names[X_RD (insn)-16]); 861 break; 862 863 case '*': 864 { 865 const char *name = sparc_decode_prefetch (X_RD (insn)); 866 867 if (name) 868 (*info->fprintf_func) (stream, "%s", name); 869 else 870 (*info->fprintf_func) (stream, "%ld", X_RD (insn)); 871 break; 872 } 873 874 case 'M': 875 (*info->fprintf_func) (stream, "%%asr%ld", X_RS1 (insn)); 876 break; 877 878 case 'm': 879 (*info->fprintf_func) (stream, "%%asr%ld", X_RD (insn)); 880 break; 881 882 case 'L': 883 info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4; 884 (*info->print_address_func) (info->target, info); 885 break; 886 887 case 'n': 888 (*info->fprintf_func) 889 (stream, "%#x", SEX (X_DISP22 (insn), 22)); 890 break; 891 892 case 'l': 893 info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4; 894 (*info->print_address_func) (info->target, info); 895 break; 896 897 case 'A': 898 { 899 const char *name = sparc_decode_asi (X_ASI (insn)); 900 901 if (name) 902 (*info->fprintf_func) (stream, "%s", name); 903 else 904 (*info->fprintf_func) (stream, "(%ld)", X_ASI (insn)); 905 break; 906 } 907 908 case 'C': 909 (*info->fprintf_func) (stream, "%%csr"); 910 break; 911 912 case 'F': 913 (*info->fprintf_func) (stream, "%%fsr"); 914 break; 915 916 case '(': 917 (*info->fprintf_func) (stream, "%%efsr"); 918 break; 919 920 case 'p': 921 (*info->fprintf_func) (stream, "%%psr"); 922 break; 923 924 case 'q': 925 (*info->fprintf_func) (stream, "%%fq"); 926 break; 927 928 case 'Q': 929 (*info->fprintf_func) (stream, "%%cq"); 930 break; 931 932 case 't': 933 (*info->fprintf_func) (stream, "%%tbr"); 934 break; 935 936 case 'w': 937 (*info->fprintf_func) (stream, "%%wim"); 938 break; 939 940 case 'x': 941 (*info->fprintf_func) (stream, "%ld", 942 ((X_LDST_I (insn) << 8) 943 + X_ASI (insn))); 944 break; 945 946 case 'y': 947 (*info->fprintf_func) (stream, "%%y"); 948 break; 949 950 case 'u': 951 case 'U': 952 { 953 int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn); 954 const char *name = sparc_decode_sparclet_cpreg (val); 955 956 if (name) 957 (*info->fprintf_func) (stream, "%s", name); 958 else 959 (*info->fprintf_func) (stream, "%%cpreg(%d)", val); 960 break; 961 } 962 } 963 } 964 } 965 966 /* If we are adding or or'ing something to rs1, then 967 check to see whether the previous instruction was 968 a sethi to the same register as in the sethi. 969 If so, attempt to print the result of the add or 970 or (in this context add and or do the same thing) 971 and its symbolic value. */ 972 if (imm_ored_to_rs1 || imm_added_to_rs1) 973 { 974 unsigned long prev_insn; 975 int errcode; 976 977 if (memaddr >= 4) 978 errcode = 979 (*info->read_memory_func) 980 (memaddr - 4, buffer, sizeof (buffer), info); 981 else 982 errcode = 1; 983 984 prev_insn = getword (buffer); 985 986 if (errcode == 0) 987 { 988 /* If it is a delayed branch, we need to look at the 989 instruction before the delayed branch. This handles 990 sequences such as: 991 992 sethi %o1, %hi(_foo), %o1 993 call _printf 994 or %o1, %lo(_foo), %o1 */ 995 996 if (is_delayed_branch (prev_insn)) 997 { 998 if (memaddr >= 8) 999 errcode = (*info->read_memory_func) 1000 (memaddr - 8, buffer, sizeof (buffer), info); 1001 else 1002 errcode = 1; 1003 1004 prev_insn = getword (buffer); 1005 } 1006 } 1007 1008 /* If there was a problem reading memory, then assume 1009 the previous instruction was not sethi. */ 1010 if (errcode == 0) 1011 { 1012 /* Is it sethi to the same register? */ 1013 if ((prev_insn & 0xc1c00000) == 0x01000000 1014 && X_RD (prev_insn) == X_RS1 (insn)) 1015 { 1016 (*info->fprintf_func) (stream, "\t! "); 1017 info->target = 1018 ((unsigned) 0xFFFFFFFF 1019 & ((int) X_IMM22 (prev_insn) << 10)); 1020 if (imm_added_to_rs1) 1021 info->target += X_SIMM (insn, 13); 1022 else 1023 info->target |= X_SIMM (insn, 13); 1024 (*info->print_address_func) (info->target, info); 1025 info->insn_type = dis_dref; 1026 info->data_size = 4; /* FIXME!!! */ 1027 } 1028 } 1029 } 1030 1031 if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR)) 1032 { 1033 /* FIXME -- check is_annulled flag. */ 1034 (void) is_annulled; 1035 if (opcode->flags & F_UNBR) 1036 info->insn_type = dis_branch; 1037 if (opcode->flags & F_CONDBR) 1038 info->insn_type = dis_condbranch; 1039 if (opcode->flags & F_JSR) 1040 info->insn_type = dis_jsr; 1041 if (opcode->flags & F_DELAYED) 1042 info->branch_delay_insns = 1; 1043 } 1044 1045 return sizeof (buffer); 1046 } 1047 } 1048 1049 info->insn_type = dis_noninsn; /* Mark as non-valid instruction. */ 1050 (*info->fprintf_func) (stream, _("unknown")); 1051 return sizeof (buffer); 1052 } 1053