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