1 /* Print SPARC instructions.
2 Copyright (C) 1989-2014 Free Software Foundation, Inc.
4 This file is part of the GNU opcodes library.
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)
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.
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. */
23 #include "opcode/sparc.h"
25 #include "libiberty.h"
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)
37 /* The sorted opcode table. */
38 static const sparc_opcode **sorted_opcodes;
40 /* For faster lookup, after insns are sorted they are hashed. */
41 /* ??? I think there is room for even more improvement. */
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
52 struct sparc_opcode_hash *next;
53 const sparc_opcode *opcode;
56 static sparc_opcode_hash *opcode_hash_table[HASH_SIZE];
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) )
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"
80 #define freg_names (®_names[4 * 8])
82 /* These are ordered according to there register number in
83 rdpr and wrpr insns. */
84 static char *v9_priv_reg_names[] =
86 "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
87 "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
89 /* "ver" - special cased */
92 /* These are ordered according to there register number in
93 rdhpr and wrhpr insns. */
94 static char *v9_hpriv_reg_names[] =
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"
103 /* These are ordered according to there register number in
104 rd and wr insns (-16). */
105 static char *v9a_asr_reg_names[] =
107 "pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint",
108 "softint", "tick_cmpr", "stick", "stick_cmpr", "cfr",
112 /* Macros used to extract instruction fields. Not all fields have
113 macros defined here, only those which are actually used. */
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)
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)
133 /* Here is the union which was used to extract instruction fields
134 before the shift and mask macros were written.
138 unsigned long int code;
146 unsigned int anrs1:5;
147 #define rs1 ldst.anrs1
149 unsigned int anasi:8;
150 #define asi ldst.anasi
151 unsigned int anrs2:5;
152 #define rs2 ldst.anrs2
157 unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1;
158 unsigned int IMM13:13;
159 #define imm13 IMM13.IMM13
167 unsigned int DISP22:22;
168 #define disp22 branch.DISP22
176 unsigned int rcond:3;
178 unsigned int DISP16HI:2;
181 unsigned int DISP16LO:14;
186 unsigned int adisp30:30;
187 #define disp30 call.adisp30
191 /* Nonzero if INSN is the opcode for a delayed branch. */
194 is_delayed_branch (unsigned long insn)
196 sparc_opcode_hash *op;
198 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
200 const sparc_opcode *opcode = op->opcode;
202 if ((opcode->match & insn) == opcode->match
203 && (opcode->lose & insn) == 0)
204 return opcode->flags & F_DELAYED;
209 /* extern void qsort (); */
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;
215 /* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values. */
218 compute_arch_mask (unsigned long mach)
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);
248 /* Compare opcodes A and B. */
251 compare_opcodes (const void * a, const void * b)
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;
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)
266 if (! (op1->architecture & current_arch_mask))
271 if (op1->architecture & current_arch_mask)
273 else if (op0->architecture != op1->architecture)
274 return op0->architecture - op1->architecture;
277 /* If a bit is set in both match and lose, there is something
278 wrong with the opcode table. */
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;
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;
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)
305 unsigned long int x = 1 << i;
306 int x0 = (match0 & x) != 0;
307 int x1 = (match1 & x) != 0;
313 for (i = 0; i < 32; ++i)
315 unsigned long int x = 1 << i;
316 int x0 = (lose0 & x) != 0;
317 int x1 = (lose1 & x) != 0;
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. */
326 /* Our first aesthetic ground is that aliases defer to real insns. */
328 int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
331 /* Put the one that isn't an alias first. */
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);
340 if (op0->flags & F_ALIAS)
342 if (op0->flags & F_PREFERRED)
344 if (op1->flags & F_PREFERRED)
347 /* If they're both aliases, and neither is marked as preferred,
353 /* xgettext:c-format */
354 _("Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"),
355 op0->name, op1->name);
358 /* Fewer arguments are preferred. */
360 int length_diff = strlen (op0->args) - strlen (op1->args);
362 if (length_diff != 0)
363 /* Put the one with fewer arguments first. */
367 /* Put 1+i before i+1. */
369 char *p0 = (char *) strchr (op0->args, '+');
370 char *p1 = (char *) strchr (op1->args, '+');
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. */
380 if (p0[1] == 'i' && p1[-1] == 'i')
381 /* op0 is 1+i and op1 is i+1, so op0 goes first. */
386 /* Put 1,i before i,1. */
388 int i0 = strncmp (op0->args, "i,1", 3) == 0;
389 int i1 = strncmp (op1->args, "i,1", 3) == 0;
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. */
404 /* Build a hash table from the opcode table.
405 OPCODE_TABLE is a sorted list of pointers into the opcode table. */
408 build_hash_table (const sparc_opcode **opcode_table,
409 sparc_opcode_hash **hash_table,
413 int hash_count[HASH_SIZE];
414 static sparc_opcode_hash *hash_buf = NULL;
416 /* Start at the end of the table and work backwards so that each
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)
423 hash_buf = xmalloc (sizeof (* hash_buf) * num_opcodes);
424 for (i = num_opcodes - 1; i >= 0; --i)
426 int hash = HASH_INSN (opcode_table[i]->match);
427 sparc_opcode_hash *h = &hash_buf[i];
429 h->next = hash_table[hash];
430 h->opcode = opcode_table[i];
431 hash_table[hash] = h;
435 #if 0 /* for debugging */
437 int min_count = num_opcodes, max_count = 0;
440 for (i = 0; i < HASH_SIZE; ++i)
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];
449 printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
450 min_count, max_count, (double) total / HASH_SIZE);
455 /* Print one instruction from MEMADDR on INFO->STREAM.
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
464 print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
466 FILE *stream = info->stream;
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 *);
476 if (!opcodes_initialized
477 || info->mach != current_mach)
481 current_arch_mask = compute_arch_mask (info->mach);
483 if (!opcodes_initialized)
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);
492 build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes);
493 current_mach = info->mach;
494 opcodes_initialized = 1;
499 (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
503 (*info->memory_error_func) (status, memaddr, info);
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;
513 getword = bfd_getl32;
515 insn = getword (buffer);
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. */
522 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
524 const sparc_opcode *opcode = op->opcode;
526 /* If the insn isn't supported by the current architecture, skip it. */
527 if (! (opcode->architecture & current_arch_mask))
530 if ((opcode->match & insn) == opcode->match
531 && (opcode->lose & insn) == 0)
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;
538 /* Nonzero means that we have found a plus sign in the args
539 field of the opcode table. */
542 /* Nonzero means we have an annulled branch. */
545 /* Do we have an `add' or `or' instruction combining an
546 immediate with rs1? */
547 if (opcode->match == 0x80102000) /* or */
549 if (opcode->match == 0x80002000) /* add */
550 imm_added_to_rs1 = 1;
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. */
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. */
561 (*info->fprintf_func) (stream, "%s", opcode->name);
566 if (opcode->args[0] != ',')
567 (*info->fprintf_func) (stream, " ");
569 for (s = opcode->args; *s != '\0'; ++s)
573 (*info->fprintf_func) (stream, ",");
578 (*info->fprintf_func) (stream, "a");
583 (*info->fprintf_func) (stream, "pn");
588 (*info->fprintf_func) (stream, "pt");
597 (*info->fprintf_func) (stream, " ");
606 (*info->fprintf_func) (stream, "%c", *s);
610 (*info->fprintf_func) (stream, "0");
613 #define reg(n) (*info->fprintf_func) (stream, "%%%s", reg_names[n])
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)])
634 case 'v': /* Double/even. */
635 case 'V': /* Quad/multiple of 4. */
636 fregx (X_RS1 (insn));
642 case 'B': /* Double/even. */
643 case 'R': /* Quad/multiple of 4. */
644 fregx (X_RS2 (insn));
650 case '5': /* Double/even. */
651 fregx (X_RS3 (insn));
657 case 'H': /* Double/even. */
658 case 'J': /* Quad/multiple of 4. */
659 case '}': /* Double/even. */
665 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
680 (*info->fprintf_func) (stream, "%%hi(%#x)",
681 ((unsigned) 0xFFFFFFFF
682 & ((int) X_IMM22 (insn) << 10)));
685 case 'i': /* 13 bit immediate. */
686 case 'I': /* 11 bit immediate. */
687 case 'j': /* 10 bit immediate. */
692 imm = X_SIMM (insn, 13);
694 imm = X_SIMM (insn, 11);
696 imm = X_SIMM (insn, 10);
698 /* Check to see whether we have a 1+i, and take
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 +,
706 imm_added_to_rs1 = 1;
709 (*info->fprintf_func) (stream, "%d", imm);
711 (*info->fprintf_func) (stream, "%#x", imm);
715 case ')': /* 5 bit unsigned immediate from RS3. */
716 (info->fprintf_func) (stream, "%#x", (unsigned int) X_RS3 (insn));
719 case 'X': /* 5 bit unsigned immediate. */
720 case 'Y': /* 6 bit unsigned immediate. */
722 int imm = X_IMM (insn, *s == 'X' ? 5 : 6);
725 (info->fprintf_func) (stream, "%d", imm);
727 (info->fprintf_func) (stream, "%#x", (unsigned) imm);
732 (info->fprintf_func) (stream, "%ld", X_IMM (insn, 3));
737 int mask = X_MEMBAR (insn);
738 int bit = 0x40, printed_one = 0;
742 (info->fprintf_func) (stream, "0");
749 (info->fprintf_func) (stream, "|");
750 name = sparc_decode_membar (bit);
751 (info->fprintf_func) (stream, "%s", name);
760 info->target = memaddr + SEX (X_DISP10 (insn), 10) * 4;
761 (*info->print_address_func) (info->target, info);
765 info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
766 (*info->print_address_func) (info->target, info);
770 info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
771 (*info->print_address_func) (info->target, info);
778 (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
782 (*info->fprintf_func) (stream, "%%icc");
786 (*info->fprintf_func) (stream, "%%xcc");
790 (*info->fprintf_func) (stream, "%%ccr");
794 (*info->fprintf_func) (stream, "%%fprs");
798 (*info->fprintf_func) (stream, "%%mcdper");
802 (*info->fprintf_func) (stream, "%%asi");
806 (*info->fprintf_func) (stream, "%%tick");
810 (*info->fprintf_func) (stream, "%%pc");
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)]);
820 (*info->fprintf_func) (stream, "%%reserved");
824 if ((unsigned) X_RD (insn) < 17)
825 (*info->fprintf_func) (stream, "%%%s",
826 v9_priv_reg_names[X_RD (insn)]);
828 (*info->fprintf_func) (stream, "%%reserved");
832 if ((unsigned) X_RS1 (insn) < 32)
833 (*info->fprintf_func) (stream, "%%%s",
834 v9_hpriv_reg_names[X_RS1 (insn)]);
836 (*info->fprintf_func) (stream, "%%reserved");
840 if ((unsigned) X_RD (insn) < 32)
841 (*info->fprintf_func) (stream, "%%%s",
842 v9_hpriv_reg_names[X_RD (insn)]);
844 (*info->fprintf_func) (stream, "%%reserved");
848 if (X_RS1 (insn) < 16 || X_RS1 (insn) > 28)
849 (*info->fprintf_func) (stream, "%%reserved");
851 (*info->fprintf_func) (stream, "%%%s",
852 v9a_asr_reg_names[X_RS1 (insn)-16]);
856 if (X_RD (insn) < 16 || X_RD (insn) > 28)
857 (*info->fprintf_func) (stream, "%%reserved");
859 (*info->fprintf_func) (stream, "%%%s",
860 v9a_asr_reg_names[X_RD (insn)-16]);
865 const char *name = sparc_decode_prefetch (X_RD (insn));
868 (*info->fprintf_func) (stream, "%s", name);
870 (*info->fprintf_func) (stream, "%ld", X_RD (insn));
875 (*info->fprintf_func) (stream, "%%asr%ld", X_RS1 (insn));
879 (*info->fprintf_func) (stream, "%%asr%ld", X_RD (insn));
883 info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
884 (*info->print_address_func) (info->target, info);
888 (*info->fprintf_func)
889 (stream, "%#x", SEX (X_DISP22 (insn), 22));
893 info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
894 (*info->print_address_func) (info->target, info);
899 const char *name = sparc_decode_asi (X_ASI (insn));
902 (*info->fprintf_func) (stream, "%s", name);
904 (*info->fprintf_func) (stream, "(%ld)", X_ASI (insn));
909 (*info->fprintf_func) (stream, "%%csr");
913 (*info->fprintf_func) (stream, "%%fsr");
917 (*info->fprintf_func) (stream, "%%efsr");
921 (*info->fprintf_func) (stream, "%%psr");
925 (*info->fprintf_func) (stream, "%%fq");
929 (*info->fprintf_func) (stream, "%%cq");
933 (*info->fprintf_func) (stream, "%%tbr");
937 (*info->fprintf_func) (stream, "%%wim");
941 (*info->fprintf_func) (stream, "%ld",
942 ((X_LDST_I (insn) << 8)
947 (*info->fprintf_func) (stream, "%%y");
953 int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn);
954 const char *name = sparc_decode_sparclet_cpreg (val);
957 (*info->fprintf_func) (stream, "%s", name);
959 (*info->fprintf_func) (stream, "%%cpreg(%d)", val);
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)
974 unsigned long prev_insn;
979 (*info->read_memory_func)
980 (memaddr - 4, buffer, sizeof (buffer), info);
984 prev_insn = getword (buffer);
988 /* If it is a delayed branch, we need to look at the
989 instruction before the delayed branch. This handles
992 sethi %o1, %hi(_foo), %o1
994 or %o1, %lo(_foo), %o1 */
996 if (is_delayed_branch (prev_insn))
999 errcode = (*info->read_memory_func)
1000 (memaddr - 8, buffer, sizeof (buffer), info);
1004 prev_insn = getword (buffer);
1008 /* If there was a problem reading memory, then assume
1009 the previous instruction was not sethi. */
1012 /* Is it sethi to the same register? */
1013 if ((prev_insn & 0xc1c00000) == 0x01000000
1014 && X_RD (prev_insn) == X_RS1 (insn))
1016 (*info->fprintf_func) (stream, "\t! ");
1018 ((unsigned) 0xFFFFFFFF
1019 & ((int) X_IMM22 (prev_insn) << 10));
1020 if (imm_added_to_rs1)
1021 info->target += X_SIMM (insn, 13);
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!!! */
1031 if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
1033 /* FIXME -- check is_annulled flag. */
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;
1045 return sizeof (buffer);
1049 info->insn_type = dis_noninsn; /* Mark as non-valid instruction. */
1050 (*info->fprintf_func) (stream, _("unknown"));
1051 return sizeof (buffer);