1 /* Print SPARC instructions.
2 Copyright (C) 1989, 91-93, 1995, 1996 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19 #include "opcode/sparc.h"
21 #include "libiberty.h"
24 /* For faster lookup, after insns are sorted they are hashed. */
25 /* ??? I think there is room for even more improvement. */
28 /* It is important that we only look at insn code bits as that is how the
29 opcode table is hashed. OPCODE_BITS is a table of valid bits for each
30 of the main types (0,1,2,3). */
31 static int opcode_bits[4] = { 0x01c00000, 0x0, 0x01f80000, 0x01f80000 };
32 #define HASH_INSN(INSN) \
33 ((((INSN) >> 24) & 0xc0) | (((INSN) & opcode_bits[((INSN) >> 30) & 3]) >> 19))
35 struct opcode_hash *next;
36 struct sparc_opcode *opcode;
38 static struct opcode_hash *opcode_hash_table[HASH_SIZE];
39 static void build_hash_table ();
41 /* Sign-extend a value which is N bits long. */
42 #define SEX(value, bits) \
43 ((((int)(value)) << ((8 * sizeof (int)) - bits)) \
44 >> ((8 * sizeof (int)) - bits) )
46 static char *reg_names[] =
47 { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
48 "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
49 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
50 "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
51 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
52 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
53 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
54 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
55 "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
56 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
57 "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
58 "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
59 /* psr, wim, tbr, fpsr, cpsr are v8 only. */
60 "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
63 #define freg_names (®_names[4 * 8])
65 /* These are ordered according to there register number in
66 rdpr and wrpr insns. */
67 static char *v9_priv_reg_names[] =
69 "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
70 "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
72 /* "ver" - special cased */
75 /* Macros used to extract instruction fields. Not all fields have
76 macros defined here, only those which are actually used. */
78 #define X_RD(i) (((i) >> 25) & 0x1f)
79 #define X_RS1(i) (((i) >> 14) & 0x1f)
80 #define X_LDST_I(i) (((i) >> 13) & 1)
81 #define X_ASI(i) (((i) >> 5) & 0xff)
82 #define X_RS2(i) (((i) >> 0) & 0x1f)
83 #define X_IMM13(i) (((i) >> 0) & 0x1fff)
84 #define X_DISP22(i) (((i) >> 0) & 0x3fffff)
85 #define X_IMM22(i) X_DISP22 (i)
86 #define X_DISP30(i) (((i) >> 0) & 0x3fffffff)
88 /* These are for v9. */
89 #define X_DISP16(i) (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
90 #define X_DISP19(i) (((i) >> 0) & 0x7ffff)
91 #define X_MEMBAR(i) ((i) & 0x7f)
93 /* Here is the union which was used to extract instruction fields
94 before the shift and mask macros were written.
98 unsigned long int code;
106 unsigned int anrs1:5;
107 #define rs1 ldst.anrs1
109 unsigned int anasi:8;
110 #define asi ldst.anasi
111 unsigned int anrs2:5;
112 #define rs2 ldst.anrs2
117 unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1;
118 unsigned int IMM13:13;
119 #define imm13 IMM13.IMM13
127 unsigned int DISP22:22;
128 #define disp22 branch.DISP22
136 unsigned int rcond:3;
138 unsigned int DISP16HI:2;
141 unsigned int DISP16LO:14;
146 unsigned int adisp30:30;
147 #define disp30 call.adisp30
153 /* Nonzero if INSN is the opcode for a delayed branch. */
155 is_delayed_branch (insn)
158 struct opcode_hash *op;
160 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
162 CONST struct sparc_opcode *opcode = op->opcode;
163 if ((opcode->match & insn) == opcode->match
164 && (opcode->lose & insn) == 0)
165 return (opcode->flags & F_DELAYED);
170 /* Nonzero of opcode table has been initialized. */
171 static int opcodes_initialized = 0;
173 /* extern void qsort (); */
174 static int compare_opcodes ();
176 /* Print one instruction from MEMADDR on INFO->STREAM.
178 We suffix the instruction with a comment that gives the absolute
179 address involved, as well as its symbolic form, if the instruction
180 is preceded by a findable `sethi' and it either adds an immediate
181 displacement to that register, or it is an `add' or `or' instruction
185 print_insn_sparc (memaddr, info)
187 disassemble_info *info;
189 FILE *stream = info->stream;
192 register unsigned int i;
193 register struct opcode_hash *op;
194 int sparc_v9_p = bfd_mach_sparc_v9_p (info->mach);
196 if (!opcodes_initialized)
198 qsort ((char *) sparc_opcodes, NUMOPCODES,
199 sizeof (sparc_opcodes[0]), compare_opcodes);
200 build_hash_table (sparc_opcodes, opcode_hash_table, NUMOPCODES);
201 opcodes_initialized = 1;
206 (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
209 (*info->memory_error_func) (status, memaddr, info);
214 insn = bfd_getb32 (buffer);
216 if (DISASM_RAW_INSN (info))
217 (*info->fprintf_func) (stream, "0x%08lx\t", insn);
219 info->insn_info_valid = 1; /* We do return this info */
220 info->insn_type = dis_nonbranch; /* Assume non branch insn */
221 info->branch_delay_insns = 0; /* Assume no delay */
222 info->target = 0; /* Assume no target known */
224 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
226 CONST struct sparc_opcode *opcode = op->opcode;
228 /* If the current architecture isn't sparc64, skip sparc64 insns. */
230 && opcode->architecture >= v9)
233 /* If the current architecture is sparc64, skip sparc32 only insns. */
235 && (opcode->flags & F_NOTV9))
238 if ((opcode->match & insn) == opcode->match
239 && (opcode->lose & insn) == 0)
241 /* Nonzero means that we have found an instruction which has
242 the effect of adding or or'ing the imm13 field to rs1. */
243 int imm_added_to_rs1 = 0;
245 /* Nonzero means that we have found a plus sign in the args
246 field of the opcode table. */
249 /* Nonzero means we have an annulled branch. */
252 /* Do we have an `add' or `or' instruction where rs1 is the same
253 as rsd, and which has the i bit set? */
254 if ((opcode->match == 0x80102000 || opcode->match == 0x80002000)
256 && X_RS1 (insn) == X_RD (insn))
257 imm_added_to_rs1 = 1;
259 if (X_RS1 (insn) != X_RD (insn)
260 && strchr (opcode->args, 'r') != 0)
261 /* Can't do simple format if source and dest are different. */
264 (*info->fprintf_func) (stream, opcode->name);
267 register CONST char *s;
269 if (opcode->args[0] != ',')
270 (*info->fprintf_func) (stream, " ");
271 for (s = opcode->args; *s != '\0'; ++s)
275 (*info->fprintf_func) (stream, ",");
279 (*info->fprintf_func) (stream, "a");
284 (*info->fprintf_func) (stream, "pn");
289 (*info->fprintf_func) (stream, "pt");
295 } /* switch on arg */
296 } /* while there are comma started args */
298 (*info->fprintf_func) (stream, " ");
305 /* note fall-through */
307 (*info->fprintf_func) (stream, "%c", *s);
311 (*info->fprintf_func) (stream, "0");
314 #define reg(n) (*info->fprintf_func) (stream, "%%%s", reg_names[n])
329 #define freg(n) (*info->fprintf_func) (stream, "%%%s", freg_names[n])
330 #define fregx(n) (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)])
334 case 'v': /* double/even */
335 case 'V': /* quad/multiple of 4 */
336 fregx (X_RS1 (insn));
342 case 'B': /* double/even */
343 case 'R': /* quad/multiple of 4 */
344 fregx (X_RS2 (insn));
350 case 'H': /* double/even */
351 case 'J': /* quad/multiple of 4 */
357 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
372 (*info->fprintf_func) (stream, "%%hi(%#x)",
374 & ((int) X_IMM22 (insn) << 10)));
379 int imm = SEX (X_IMM13 (insn), 13);
381 /* Check to see whether we have a 1+i, and take
384 Note: because of the way we sort the table,
385 we will be matching 1+i rather than i+1,
386 so it is OK to assume that i is after +,
389 imm_added_to_rs1 = 1;
392 (*info->fprintf_func) (stream, "%d", imm);
394 (*info->fprintf_func) (stream, "%#x", imm);
398 case 'I': /* 11 bit immediate. */
399 case 'j': /* 10 bit immediate. */
404 imm = SEX (X_IMM13 (insn), 11);
406 imm = SEX (X_IMM13 (insn), 10);
408 /* Check to see whether we have a 1+i, and take
411 Note: because of the way we sort the table,
412 we will be matching 1+i rather than i+1,
413 so it is OK to assume that i is after +,
416 imm_added_to_rs1 = 1;
419 (info->fprintf_func) (stream, "%d", imm);
421 (info->fprintf_func) (stream, "%#x", (unsigned) imm);
427 int mask = X_MEMBAR (insn);
428 int bit = 0x40, printed_one = 0;
432 (info->fprintf_func) (stream, "0");
439 (info->fprintf_func) (stream, "|");
440 name = sparc_decode_membar (bit);
441 (info->fprintf_func) (stream, "%s", name);
450 info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
451 (*info->print_address_func) (info->target, info);
455 info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
456 (*info->print_address_func) (info->target, info);
463 (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
467 (*info->fprintf_func) (stream, "%%icc");
471 (*info->fprintf_func) (stream, "%%xcc");
475 (*info->fprintf_func) (stream, "%%ccr");
479 (*info->fprintf_func) (stream, "%%fprs");
483 (*info->fprintf_func) (stream, "%%asi");
487 (*info->fprintf_func) (stream, "%%tick");
491 (*info->fprintf_func) (stream, "%%pc");
495 if (X_RS1 (insn) == 31)
496 (*info->fprintf_func) (stream, "%%ver");
497 else if ((unsigned) X_RS1 (insn) < 16)
498 (*info->fprintf_func) (stream, "%%%s",
499 v9_priv_reg_names[X_RS1 (insn)]);
501 (*info->fprintf_func) (stream, "%%reserved");
505 if ((unsigned) X_RD (insn) < 15)
506 (*info->fprintf_func) (stream, "%%%s",
507 v9_priv_reg_names[X_RD (insn)]);
509 (*info->fprintf_func) (stream, "%%reserved");
514 char *name = sparc_decode_prefetch (X_RD (insn));
517 (*info->fprintf_func) (stream, "%s", name);
519 (*info->fprintf_func) (stream, "%d", X_RD (insn));
524 (*info->fprintf_func) (stream, "%%asr%d", X_RS1 (insn));
528 (*info->fprintf_func) (stream, "%%asr%d", X_RD (insn));
532 info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
533 (*info->print_address_func) (info->target, info);
537 (*info->fprintf_func)
538 (stream, "%#x", SEX (X_DISP22 (insn), 22));
542 info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
543 (*info->print_address_func) (info->target, info);
548 char *name = sparc_decode_asi (X_ASI (insn));
551 (*info->fprintf_func) (stream, "%s", name);
553 (*info->fprintf_func) (stream, "(%d)", X_ASI (insn));
558 (*info->fprintf_func) (stream, "%%csr");
562 (*info->fprintf_func) (stream, "%%fsr");
566 (*info->fprintf_func) (stream, "%%psr");
570 (*info->fprintf_func) (stream, "%%fq");
574 (*info->fprintf_func) (stream, "%%cq");
578 (*info->fprintf_func) (stream, "%%tbr");
582 (*info->fprintf_func) (stream, "%%wim");
586 (*info->fprintf_func) (stream, "%d",
587 ((X_LDST_I (insn) << 8)
592 (*info->fprintf_func) (stream, "%%y");
598 /* If we are adding or or'ing something to rs1, then
599 check to see whether the previous instruction was
600 a sethi to the same register as in the sethi.
601 If so, attempt to print the result of the add or
602 or (in this context add and or do the same thing)
603 and its symbolic value. */
604 if (imm_added_to_rs1)
606 unsigned long prev_insn;
610 (*info->read_memory_func)
611 (memaddr - 4, buffer, sizeof (buffer), info);
612 prev_insn = bfd_getb32 (buffer);
616 /* If it is a delayed branch, we need to look at the
617 instruction before the delayed branch. This handles
620 sethi %o1, %hi(_foo), %o1
622 or %o1, %lo(_foo), %o1
625 if (is_delayed_branch (prev_insn))
627 errcode = (*info->read_memory_func)
628 (memaddr - 8, buffer, sizeof (buffer), info);
629 prev_insn = bfd_getb32 (buffer);
633 /* If there was a problem reading memory, then assume
634 the previous instruction was not sethi. */
637 /* Is it sethi to the same register? */
638 if ((prev_insn & 0xc1c00000) == 0x01000000
639 && X_RD (prev_insn) == X_RS1 (insn))
641 (*info->fprintf_func) (stream, "\t! ");
643 (0xFFFFFFFF & (int) X_IMM22 (prev_insn) << 10)
644 | SEX (X_IMM13 (insn), 13);
645 (*info->print_address_func) (info->target, info);
646 info->insn_type = dis_dref;
647 info->data_size = 4; /* FIXME!!! */
652 if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
654 /* FIXME -- check is_annulled flag */
655 if (opcode->flags & F_UNBR)
656 info->insn_type = dis_branch;
657 if (opcode->flags & F_CONDBR)
658 info->insn_type = dis_condbranch;
659 if (opcode->flags & F_JSR)
660 info->insn_type = dis_jsr;
661 if (opcode->flags & F_DELAYED)
662 info->branch_delay_insns = 1;
665 return sizeof (buffer);
669 info->insn_type = dis_noninsn; /* Mark as non-valid instruction */
670 (*info->fprintf_func) (stream, "%#8x", insn);
671 return sizeof (buffer);
674 /* Compare opcodes A and B. */
677 compare_opcodes (a, b)
680 struct sparc_opcode *op0 = (struct sparc_opcode *) a;
681 struct sparc_opcode *op1 = (struct sparc_opcode *) b;
682 unsigned long int match0 = op0->match, match1 = op1->match;
683 unsigned long int lose0 = op0->lose, lose1 = op1->lose;
684 register unsigned int i;
686 /* If a bit is set in both match and lose, there is something
687 wrong with the opcode table. */
690 fprintf (stderr, "Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n",
691 op0->name, match0, lose0);
692 op0->lose &= ~op0->match;
698 fprintf (stderr, "Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n",
699 op1->name, match1, lose1);
700 op1->lose &= ~op1->match;
704 /* Because the bits that are variable in one opcode are constant in
705 another, it is important to order the opcodes in the right order. */
706 for (i = 0; i < 32; ++i)
708 unsigned long int x = 1 << i;
709 int x0 = (match0 & x) != 0;
710 int x1 = (match1 & x) != 0;
716 for (i = 0; i < 32; ++i)
718 unsigned long int x = 1 << i;
719 int x0 = (lose0 & x) != 0;
720 int x1 = (lose1 & x) != 0;
726 /* Put non-sparc64 insns ahead of sparc64 ones. */
727 if ((op0->architecture >= v9) != (op1->architecture >= v9))
728 return (op0->architecture >= v9) - (op1->architecture >= v9);
730 /* They are functionally equal. So as long as the opcode table is
731 valid, we can put whichever one first we want, on aesthetic grounds. */
733 /* Our first aesthetic ground is that aliases defer to real insns. */
735 int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
737 /* Put the one that isn't an alias first. */
741 /* Except for aliases, two "identical" instructions had
742 better have the same opcode. This is a sanity check on the table. */
743 i = strcmp (op0->name, op1->name);
745 if (op0->flags & F_ALIAS) /* If they're both aliases, be arbitrary. */
749 "Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n",
750 op0->name, op1->name);
752 /* Fewer arguments are preferred. */
754 int length_diff = strlen (op0->args) - strlen (op1->args);
755 if (length_diff != 0)
756 /* Put the one with fewer arguments first. */
760 /* Put 1+i before i+1. */
762 char *p0 = (char *) strchr(op0->args, '+');
763 char *p1 = (char *) strchr(op1->args, '+');
767 /* There is a plus in both operands. Note that a plus
768 sign cannot be the first character in args,
769 so the following [-1]'s are valid. */
770 if (p0[-1] == 'i' && p1[1] == 'i')
771 /* op0 is i+1 and op1 is 1+i, so op1 goes first. */
773 if (p0[1] == 'i' && p1[-1] == 'i')
774 /* op0 is 1+i and op1 is i+1, so op0 goes first. */
779 /* Put 1,i before i,1. */
781 int i0 = strncmp (op0->args, "i,1", 3) == 0;
782 int i1 = strncmp (op1->args, "i,1", 3) == 0;
788 /* They are, as far as we can tell, identical.
789 Since qsort may have rearranged the table partially, there is
790 no way to tell which one was first in the opcode table as
791 written, so just say there are equal. */
795 /* Build a hash table from the opcode table. */
798 build_hash_table (table, hash_table, num_opcodes)
799 struct sparc_opcode *table;
800 struct opcode_hash **hash_table;
804 int hash_count[HASH_SIZE];
805 static struct opcode_hash *hash_buf = NULL;
807 /* Start at the end of the table and work backwards so that each
810 memset (hash_table, 0, HASH_SIZE * sizeof (hash_table[0]));
811 memset (hash_count, 0, HASH_SIZE * sizeof (hash_count[0]));
812 if (hash_buf != NULL)
814 hash_buf = (struct opcode_hash *) xmalloc (sizeof (struct opcode_hash) * num_opcodes);
815 for (i = num_opcodes - 1; i >= 0; --i)
817 register int hash = HASH_INSN (sparc_opcodes[i].match);
818 register struct opcode_hash *h = &hash_buf[i];
819 h->next = hash_table[hash];
820 h->opcode = &sparc_opcodes[i];
821 hash_table[hash] = h;
825 #if 0 /* for debugging */
827 int min_count = num_opcodes, max_count = 0;
830 for (i = 0; i < HASH_SIZE; ++i)
832 if (hash_count[i] < min_count)
833 min_count = hash_count[i];
834 if (hash_count[i] > max_count)
835 max_count = hash_count[i];
836 total += hash_count[i];
839 printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
840 min_count, max_count, (double) total / HASH_SIZE);