1 /* Print SPARC instructions.
2 Copyright 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2012
4 Free Software Foundation, Inc.
6 This file is part of the GNU opcodes library.
8 This library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 It is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
25 #include "opcode/sparc.h"
27 #include "libiberty.h"
30 /* Bitmask of v9 architectures. */
31 #define MASK_V9 ((1 << SPARC_OPCODE_ARCH_V9) \
32 | (1 << SPARC_OPCODE_ARCH_V9A) \
33 | (1 << SPARC_OPCODE_ARCH_V9B))
34 /* 1 if INSN is for v9 only. */
35 #define V9_ONLY_P(insn) (! ((insn)->architecture & ~MASK_V9))
36 /* 1 if INSN is for v9. */
37 #define V9_P(insn) (((insn)->architecture & MASK_V9) != 0)
39 /* The sorted opcode table. */
40 static const sparc_opcode
**sorted_opcodes
;
42 /* For faster lookup, after insns are sorted they are hashed. */
43 /* ??? I think there is room for even more improvement. */
46 /* It is important that we only look at insn code bits as that is how the
47 opcode table is hashed. OPCODE_BITS is a table of valid bits for each
48 of the main types (0,1,2,3). */
49 static int opcode_bits
[4] = { 0x01c00000, 0x0, 0x01f80000, 0x01f80000 };
50 #define HASH_INSN(INSN) \
51 ((((INSN) >> 24) & 0xc0) | (((INSN) & opcode_bits[((INSN) >> 30) & 3]) >> 19))
52 typedef struct sparc_opcode_hash
54 struct sparc_opcode_hash
*next
;
55 const sparc_opcode
*opcode
;
58 static sparc_opcode_hash
*opcode_hash_table
[HASH_SIZE
];
60 /* Sign-extend a value which is N bits long. */
61 #define SEX(value, bits) \
62 ((((int)(value)) << ((8 * sizeof (int)) - bits)) \
63 >> ((8 * sizeof (int)) - bits) )
65 static char *reg_names
[] =
66 { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
67 "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
68 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
69 "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
70 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
71 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
72 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
73 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
74 "f32", "f33", "f34", "f35", "f36", "f37", "f38", "f39",
75 "f40", "f41", "f42", "f43", "f44", "f45", "f46", "f47",
76 "f48", "f49", "f50", "f51", "f52", "f53", "f54", "f55",
77 "f56", "f57", "f58", "f59", "f60", "f61", "f62", "f63",
78 /* psr, wim, tbr, fpsr, cpsr are v8 only. */
79 "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
82 #define freg_names (®_names[4 * 8])
84 /* These are ordered according to there register number in
85 rdpr and wrpr insns. */
86 static char *v9_priv_reg_names
[] =
88 "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
89 "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
91 /* "ver" - special cased */
94 /* These are ordered according to there register number in
95 rdhpr and wrhpr insns. */
96 static char *v9_hpriv_reg_names
[] =
98 "hpstate", "htstate", "resv2", "hintp", "resv4", "htba", "hver",
99 "resv7", "resv8", "resv9", "resv10", "resv11", "resv12", "resv13",
100 "resv14", "resv15", "resv16", "resv17", "resv18", "resv19", "resv20",
101 "resv21", "resv22", "resv23", "resv24", "resv25", "resv26", "resv27",
102 "resv28", "resv29", "resv30", "hstick_cmpr"
105 /* These are ordered according to there register number in
106 rd and wr insns (-16). */
107 static char *v9a_asr_reg_names
[] =
109 "pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint",
110 "softint", "tick_cmpr", "stick", "stick_cmpr", "cfr",
114 /* Macros used to extract instruction fields. Not all fields have
115 macros defined here, only those which are actually used. */
117 #define X_RD(i) (((i) >> 25) & 0x1f)
118 #define X_RS1(i) (((i) >> 14) & 0x1f)
119 #define X_LDST_I(i) (((i) >> 13) & 1)
120 #define X_ASI(i) (((i) >> 5) & 0xff)
121 #define X_RS2(i) (((i) >> 0) & 0x1f)
122 #define X_RS3(i) (((i) >> 9) & 0x1f)
123 #define X_IMM(i,n) (((i) >> 0) & ((1 << (n)) - 1))
124 #define X_SIMM(i,n) SEX (X_IMM ((i), (n)), (n))
125 #define X_DISP22(i) (((i) >> 0) & 0x3fffff)
126 #define X_IMM22(i) X_DISP22 (i)
127 #define X_DISP30(i) (((i) >> 0) & 0x3fffffff)
129 /* These are for v9. */
130 #define X_DISP16(i) (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
131 #define X_DISP10(i) (((((i) >> 19) & 3) << 8) | (((i) >> 5) & 0xff))
132 #define X_DISP19(i) (((i) >> 0) & 0x7ffff)
133 #define X_MEMBAR(i) ((i) & 0x7f)
135 /* Here is the union which was used to extract instruction fields
136 before the shift and mask macros were written.
140 unsigned long int code;
148 unsigned int anrs1:5;
149 #define rs1 ldst.anrs1
151 unsigned int anasi:8;
152 #define asi ldst.anasi
153 unsigned int anrs2:5;
154 #define rs2 ldst.anrs2
159 unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1;
160 unsigned int IMM13:13;
161 #define imm13 IMM13.IMM13
169 unsigned int DISP22:22;
170 #define disp22 branch.DISP22
178 unsigned int rcond:3;
180 unsigned int DISP16HI:2;
183 unsigned int DISP16LO:14;
188 unsigned int adisp30:30;
189 #define disp30 call.adisp30
193 /* Nonzero if INSN is the opcode for a delayed branch. */
196 is_delayed_branch (unsigned long insn
)
198 sparc_opcode_hash
*op
;
200 for (op
= opcode_hash_table
[HASH_INSN (insn
)]; op
; op
= op
->next
)
202 const sparc_opcode
*opcode
= op
->opcode
;
204 if ((opcode
->match
& insn
) == opcode
->match
205 && (opcode
->lose
& insn
) == 0)
206 return opcode
->flags
& F_DELAYED
;
211 /* extern void qsort (); */
213 /* Records current mask of SPARC_OPCODE_ARCH_FOO values, used to pass value
214 to compare_opcodes. */
215 static unsigned int current_arch_mask
;
217 /* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values. */
220 compute_arch_mask (unsigned long mach
)
225 case bfd_mach_sparc
:
226 return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8
)
227 | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_LEON
));
228 case bfd_mach_sparc_sparclet
:
229 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET
);
230 case bfd_mach_sparc_sparclite
:
231 case bfd_mach_sparc_sparclite_le
:
232 /* sparclites insns are recognized by default (because that's how
233 they've always been treated, for better or worse). Kludge this by
234 indicating generic v8 is also selected. */
235 return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE
)
236 | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8
));
237 case bfd_mach_sparc_v8plus
:
238 case bfd_mach_sparc_v9
:
239 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9
);
240 case bfd_mach_sparc_v8plusa
:
241 case bfd_mach_sparc_v9a
:
242 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A
);
243 case bfd_mach_sparc_v8plusb
:
244 case bfd_mach_sparc_v9b
:
245 return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B
);
250 /* Compare opcodes A and B. */
253 compare_opcodes (const void * a
, const void * b
)
255 sparc_opcode
*op0
= * (sparc_opcode
**) a
;
256 sparc_opcode
*op1
= * (sparc_opcode
**) b
;
257 unsigned long int match0
= op0
->match
, match1
= op1
->match
;
258 unsigned long int lose0
= op0
->lose
, lose1
= op1
->lose
;
259 register unsigned int i
;
261 /* If one (and only one) insn isn't supported by the current architecture,
262 prefer the one that is. If neither are supported, but they're both for
263 the same architecture, continue processing. Otherwise (both unsupported
264 and for different architectures), prefer lower numbered arch's (fudged
265 by comparing the bitmasks). */
266 if (op0
->architecture
& current_arch_mask
)
268 if (! (op1
->architecture
& current_arch_mask
))
273 if (op1
->architecture
& current_arch_mask
)
275 else if (op0
->architecture
!= op1
->architecture
)
276 return op0
->architecture
- op1
->architecture
;
279 /* If a bit is set in both match and lose, there is something
280 wrong with the opcode table. */
285 /* xgettext:c-format */
286 _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
287 op0
->name
, match0
, lose0
);
288 op0
->lose
&= ~op0
->match
;
296 /* xgettext:c-format */
297 _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
298 op1
->name
, match1
, lose1
);
299 op1
->lose
&= ~op1
->match
;
303 /* Because the bits that are variable in one opcode are constant in
304 another, it is important to order the opcodes in the right order. */
305 for (i
= 0; i
< 32; ++i
)
307 unsigned long int x
= 1 << i
;
308 int x0
= (match0
& x
) != 0;
309 int x1
= (match1
& x
) != 0;
315 for (i
= 0; i
< 32; ++i
)
317 unsigned long int x
= 1 << i
;
318 int x0
= (lose0
& x
) != 0;
319 int x1
= (lose1
& x
) != 0;
325 /* They are functionally equal. So as long as the opcode table is
326 valid, we can put whichever one first we want, on aesthetic grounds. */
328 /* Our first aesthetic ground is that aliases defer to real insns. */
330 int alias_diff
= (op0
->flags
& F_ALIAS
) - (op1
->flags
& F_ALIAS
);
333 /* Put the one that isn't an alias first. */
337 /* Except for aliases, two "identical" instructions had
338 better have the same opcode. This is a sanity check on the table. */
339 i
= strcmp (op0
->name
, op1
->name
);
342 if (op0
->flags
& F_ALIAS
)
344 if (op0
->flags
& F_PREFERRED
)
346 if (op1
->flags
& F_PREFERRED
)
349 /* If they're both aliases, and neither is marked as preferred,
355 /* xgettext:c-format */
356 _("Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"),
357 op0
->name
, op1
->name
);
360 /* Fewer arguments are preferred. */
362 int length_diff
= strlen (op0
->args
) - strlen (op1
->args
);
364 if (length_diff
!= 0)
365 /* Put the one with fewer arguments first. */
369 /* Put 1+i before i+1. */
371 char *p0
= (char *) strchr (op0
->args
, '+');
372 char *p1
= (char *) strchr (op1
->args
, '+');
376 /* There is a plus in both operands. Note that a plus
377 sign cannot be the first character in args,
378 so the following [-1]'s are valid. */
379 if (p0
[-1] == 'i' && p1
[1] == 'i')
380 /* op0 is i+1 and op1 is 1+i, so op1 goes first. */
382 if (p0
[1] == 'i' && p1
[-1] == 'i')
383 /* op0 is 1+i and op1 is i+1, so op0 goes first. */
388 /* Put 1,i before i,1. */
390 int i0
= strncmp (op0
->args
, "i,1", 3) == 0;
391 int i1
= strncmp (op1
->args
, "i,1", 3) == 0;
397 /* They are, as far as we can tell, identical.
398 Since qsort may have rearranged the table partially, there is
399 no way to tell which one was first in the opcode table as
400 written, so just say there are equal. */
401 /* ??? This is no longer true now that we sort a vector of pointers,
402 not the table itself. */
406 /* Build a hash table from the opcode table.
407 OPCODE_TABLE is a sorted list of pointers into the opcode table. */
410 build_hash_table (const sparc_opcode
**opcode_table
,
411 sparc_opcode_hash
**hash_table
,
415 int hash_count
[HASH_SIZE
];
416 static sparc_opcode_hash
*hash_buf
= NULL
;
418 /* Start at the end of the table and work backwards so that each
421 memset (hash_table
, 0, HASH_SIZE
* sizeof (hash_table
[0]));
422 memset (hash_count
, 0, HASH_SIZE
* sizeof (hash_count
[0]));
423 if (hash_buf
!= NULL
)
425 hash_buf
= xmalloc (sizeof (* hash_buf
) * num_opcodes
);
426 for (i
= num_opcodes
- 1; i
>= 0; --i
)
428 int hash
= HASH_INSN (opcode_table
[i
]->match
);
429 sparc_opcode_hash
*h
= &hash_buf
[i
];
431 h
->next
= hash_table
[hash
];
432 h
->opcode
= opcode_table
[i
];
433 hash_table
[hash
] = h
;
437 #if 0 /* for debugging */
439 int min_count
= num_opcodes
, max_count
= 0;
442 for (i
= 0; i
< HASH_SIZE
; ++i
)
444 if (hash_count
[i
] < min_count
)
445 min_count
= hash_count
[i
];
446 if (hash_count
[i
] > max_count
)
447 max_count
= hash_count
[i
];
448 total
+= hash_count
[i
];
451 printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
452 min_count
, max_count
, (double) total
/ HASH_SIZE
);
457 /* Print one instruction from MEMADDR on INFO->STREAM.
459 We suffix the instruction with a comment that gives the absolute
460 address involved, as well as its symbolic form, if the instruction
461 is preceded by a findable `sethi' and it either adds an immediate
462 displacement to that register, or it is an `add' or `or' instruction
466 print_insn_sparc (bfd_vma memaddr
, disassemble_info
*info
)
468 FILE *stream
= info
->stream
;
471 sparc_opcode_hash
*op
;
472 /* Nonzero of opcode table has been initialized. */
473 static int opcodes_initialized
= 0;
474 /* bfd mach number of last call. */
475 static unsigned long current_mach
= 0;
476 bfd_vma (*getword
) (const void *);
478 if (!opcodes_initialized
479 || info
->mach
!= current_mach
)
483 current_arch_mask
= compute_arch_mask (info
->mach
);
485 if (!opcodes_initialized
)
487 xmalloc (sparc_num_opcodes
* sizeof (sparc_opcode
*));
488 /* Reset the sorted table so we can resort it. */
489 for (i
= 0; i
< sparc_num_opcodes
; ++i
)
490 sorted_opcodes
[i
] = &sparc_opcodes
[i
];
491 qsort ((char *) sorted_opcodes
, sparc_num_opcodes
,
492 sizeof (sorted_opcodes
[0]), compare_opcodes
);
494 build_hash_table (sorted_opcodes
, opcode_hash_table
, sparc_num_opcodes
);
495 current_mach
= info
->mach
;
496 opcodes_initialized
= 1;
501 (*info
->read_memory_func
) (memaddr
, buffer
, sizeof (buffer
), info
);
505 (*info
->memory_error_func
) (status
, memaddr
, info
);
510 /* On SPARClite variants such as DANlite (sparc86x), instructions
511 are always big-endian even when the machine is in little-endian mode. */
512 if (info
->endian
== BFD_ENDIAN_BIG
|| info
->mach
== bfd_mach_sparc_sparclite
)
513 getword
= bfd_getb32
;
515 getword
= bfd_getl32
;
517 insn
= getword (buffer
);
519 info
->insn_info_valid
= 1; /* We do return this info. */
520 info
->insn_type
= dis_nonbranch
; /* Assume non branch insn. */
521 info
->branch_delay_insns
= 0; /* Assume no delay. */
522 info
->target
= 0; /* Assume no target known. */
524 for (op
= opcode_hash_table
[HASH_INSN (insn
)]; op
; op
= op
->next
)
526 const sparc_opcode
*opcode
= op
->opcode
;
528 /* If the insn isn't supported by the current architecture, skip it. */
529 if (! (opcode
->architecture
& current_arch_mask
))
532 if ((opcode
->match
& insn
) == opcode
->match
533 && (opcode
->lose
& insn
) == 0)
535 /* Nonzero means that we have found an instruction which has
536 the effect of adding or or'ing the imm13 field to rs1. */
537 int imm_added_to_rs1
= 0;
538 int imm_ored_to_rs1
= 0;
540 /* Nonzero means that we have found a plus sign in the args
541 field of the opcode table. */
544 /* Nonzero means we have an annulled branch. */
547 /* Do we have an `add' or `or' instruction combining an
548 immediate with rs1? */
549 if (opcode
->match
== 0x80102000) /* or */
551 if (opcode
->match
== 0x80002000) /* add */
552 imm_added_to_rs1
= 1;
554 if (X_RS1 (insn
) != X_RD (insn
)
555 && strchr (opcode
->args
, 'r') != 0)
556 /* Can't do simple format if source and dest are different. */
558 if (X_RS2 (insn
) != X_RD (insn
)
559 && strchr (opcode
->args
, 'O') != 0)
560 /* Can't do simple format if source and dest are different. */
563 (*info
->fprintf_func
) (stream
, "%s", opcode
->name
);
568 if (opcode
->args
[0] != ',')
569 (*info
->fprintf_func
) (stream
, " ");
571 for (s
= opcode
->args
; *s
!= '\0'; ++s
)
575 (*info
->fprintf_func
) (stream
, ",");
580 (*info
->fprintf_func
) (stream
, "a");
585 (*info
->fprintf_func
) (stream
, "pn");
590 (*info
->fprintf_func
) (stream
, "pt");
599 (*info
->fprintf_func
) (stream
, " ");
608 (*info
->fprintf_func
) (stream
, "%c", *s
);
612 (*info
->fprintf_func
) (stream
, "0");
615 #define reg(n) (*info->fprintf_func) (stream, "%%%s", reg_names[n])
631 #define freg(n) (*info->fprintf_func) (stream, "%%%s", freg_names[n])
632 #define fregx(n) (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)])
636 case 'v': /* Double/even. */
637 case 'V': /* Quad/multiple of 4. */
638 fregx (X_RS1 (insn
));
644 case 'B': /* Double/even. */
645 case 'R': /* Quad/multiple of 4. */
646 fregx (X_RS2 (insn
));
652 case '5': /* Double/even. */
653 fregx (X_RS3 (insn
));
659 case 'H': /* Double/even. */
660 case 'J': /* Quad/multiple of 4. */
666 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
681 (*info
->fprintf_func
) (stream
, "%%hi(%#x)",
682 ((unsigned) 0xFFFFFFFF
683 & ((int) X_IMM22 (insn
) << 10)));
686 case 'i': /* 13 bit immediate. */
687 case 'I': /* 11 bit immediate. */
688 case 'j': /* 10 bit immediate. */
693 imm
= X_SIMM (insn
, 13);
695 imm
= X_SIMM (insn
, 11);
697 imm
= X_SIMM (insn
, 10);
699 /* Check to see whether we have a 1+i, and take
702 Note: because of the way we sort the table,
703 we will be matching 1+i rather than i+1,
704 so it is OK to assume that i is after +,
707 imm_added_to_rs1
= 1;
710 (*info
->fprintf_func
) (stream
, "%d", imm
);
712 (*info
->fprintf_func
) (stream
, "%#x", imm
);
716 case ')': /* 5 bit unsigned immediate from RS3. */
717 (info
->fprintf_func
) (stream
, "%#x", (unsigned int) X_RS3 (insn
));
720 case 'X': /* 5 bit unsigned immediate. */
721 case 'Y': /* 6 bit unsigned immediate. */
723 int imm
= X_IMM (insn
, *s
== 'X' ? 5 : 6);
726 (info
->fprintf_func
) (stream
, "%d", imm
);
728 (info
->fprintf_func
) (stream
, "%#x", (unsigned) imm
);
733 (info
->fprintf_func
) (stream
, "%ld", X_IMM (insn
, 3));
738 int mask
= X_MEMBAR (insn
);
739 int bit
= 0x40, printed_one
= 0;
743 (info
->fprintf_func
) (stream
, "0");
750 (info
->fprintf_func
) (stream
, "|");
751 name
= sparc_decode_membar (bit
);
752 (info
->fprintf_func
) (stream
, "%s", name
);
761 info
->target
= memaddr
+ SEX (X_DISP10 (insn
), 10) * 4;
762 (*info
->print_address_func
) (info
->target
, info
);
766 info
->target
= memaddr
+ SEX (X_DISP16 (insn
), 16) * 4;
767 (*info
->print_address_func
) (info
->target
, info
);
771 info
->target
= memaddr
+ SEX (X_DISP19 (insn
), 19) * 4;
772 (*info
->print_address_func
) (info
->target
, info
);
779 (*info
->fprintf_func
) (stream
, "%%fcc%c", *s
- '6' + '0');
783 (*info
->fprintf_func
) (stream
, "%%icc");
787 (*info
->fprintf_func
) (stream
, "%%xcc");
791 (*info
->fprintf_func
) (stream
, "%%ccr");
795 (*info
->fprintf_func
) (stream
, "%%fprs");
799 (*info
->fprintf_func
) (stream
, "%%asi");
803 (*info
->fprintf_func
) (stream
, "%%tick");
807 (*info
->fprintf_func
) (stream
, "%%pc");
811 if (X_RS1 (insn
) == 31)
812 (*info
->fprintf_func
) (stream
, "%%ver");
813 else if ((unsigned) X_RS1 (insn
) < 17)
814 (*info
->fprintf_func
) (stream
, "%%%s",
815 v9_priv_reg_names
[X_RS1 (insn
)]);
817 (*info
->fprintf_func
) (stream
, "%%reserved");
821 if ((unsigned) X_RD (insn
) < 17)
822 (*info
->fprintf_func
) (stream
, "%%%s",
823 v9_priv_reg_names
[X_RD (insn
)]);
825 (*info
->fprintf_func
) (stream
, "%%reserved");
829 if ((unsigned) X_RS1 (insn
) < 32)
830 (*info
->fprintf_func
) (stream
, "%%%s",
831 v9_hpriv_reg_names
[X_RS1 (insn
)]);
833 (*info
->fprintf_func
) (stream
, "%%reserved");
837 if ((unsigned) X_RD (insn
) < 32)
838 (*info
->fprintf_func
) (stream
, "%%%s",
839 v9_hpriv_reg_names
[X_RD (insn
)]);
841 (*info
->fprintf_func
) (stream
, "%%reserved");
845 if (X_RS1 (insn
) < 16 || X_RS1 (insn
) > 28)
846 (*info
->fprintf_func
) (stream
, "%%reserved");
848 (*info
->fprintf_func
) (stream
, "%%%s",
849 v9a_asr_reg_names
[X_RS1 (insn
)-16]);
853 if (X_RD (insn
) < 16 || X_RD (insn
) > 28)
854 (*info
->fprintf_func
) (stream
, "%%reserved");
856 (*info
->fprintf_func
) (stream
, "%%%s",
857 v9a_asr_reg_names
[X_RD (insn
)-16]);
862 const char *name
= sparc_decode_prefetch (X_RD (insn
));
865 (*info
->fprintf_func
) (stream
, "%s", name
);
867 (*info
->fprintf_func
) (stream
, "%ld", X_RD (insn
));
872 (*info
->fprintf_func
) (stream
, "%%asr%ld", X_RS1 (insn
));
876 (*info
->fprintf_func
) (stream
, "%%asr%ld", X_RD (insn
));
880 info
->target
= memaddr
+ SEX (X_DISP30 (insn
), 30) * 4;
881 (*info
->print_address_func
) (info
->target
, info
);
885 (*info
->fprintf_func
)
886 (stream
, "%#x", SEX (X_DISP22 (insn
), 22));
890 info
->target
= memaddr
+ SEX (X_DISP22 (insn
), 22) * 4;
891 (*info
->print_address_func
) (info
->target
, info
);
896 const char *name
= sparc_decode_asi (X_ASI (insn
));
899 (*info
->fprintf_func
) (stream
, "%s", name
);
901 (*info
->fprintf_func
) (stream
, "(%ld)", X_ASI (insn
));
906 (*info
->fprintf_func
) (stream
, "%%csr");
910 (*info
->fprintf_func
) (stream
, "%%fsr");
914 (*info
->fprintf_func
) (stream
, "%%efsr");
918 (*info
->fprintf_func
) (stream
, "%%psr");
922 (*info
->fprintf_func
) (stream
, "%%fq");
926 (*info
->fprintf_func
) (stream
, "%%cq");
930 (*info
->fprintf_func
) (stream
, "%%tbr");
934 (*info
->fprintf_func
) (stream
, "%%wim");
938 (*info
->fprintf_func
) (stream
, "%ld",
939 ((X_LDST_I (insn
) << 8)
944 (*info
->fprintf_func
) (stream
, "%%y");
950 int val
= *s
== 'U' ? X_RS1 (insn
) : X_RD (insn
);
951 const char *name
= sparc_decode_sparclet_cpreg (val
);
954 (*info
->fprintf_func
) (stream
, "%s", name
);
956 (*info
->fprintf_func
) (stream
, "%%cpreg(%d)", val
);
963 /* If we are adding or or'ing something to rs1, then
964 check to see whether the previous instruction was
965 a sethi to the same register as in the sethi.
966 If so, attempt to print the result of the add or
967 or (in this context add and or do the same thing)
968 and its symbolic value. */
969 if (imm_ored_to_rs1
|| imm_added_to_rs1
)
971 unsigned long prev_insn
;
976 (*info
->read_memory_func
)
977 (memaddr
- 4, buffer
, sizeof (buffer
), info
);
981 prev_insn
= getword (buffer
);
985 /* If it is a delayed branch, we need to look at the
986 instruction before the delayed branch. This handles
989 sethi %o1, %hi(_foo), %o1
991 or %o1, %lo(_foo), %o1 */
993 if (is_delayed_branch (prev_insn
))
996 errcode
= (*info
->read_memory_func
)
997 (memaddr
- 8, buffer
, sizeof (buffer
), info
);
1001 prev_insn
= getword (buffer
);
1005 /* If there was a problem reading memory, then assume
1006 the previous instruction was not sethi. */
1009 /* Is it sethi to the same register? */
1010 if ((prev_insn
& 0xc1c00000) == 0x01000000
1011 && X_RD (prev_insn
) == X_RS1 (insn
))
1013 (*info
->fprintf_func
) (stream
, "\t! ");
1015 ((unsigned) 0xFFFFFFFF
1016 & ((int) X_IMM22 (prev_insn
) << 10));
1017 if (imm_added_to_rs1
)
1018 info
->target
+= X_SIMM (insn
, 13);
1020 info
->target
|= X_SIMM (insn
, 13);
1021 (*info
->print_address_func
) (info
->target
, info
);
1022 info
->insn_type
= dis_dref
;
1023 info
->data_size
= 4; /* FIXME!!! */
1028 if (opcode
->flags
& (F_UNBR
|F_CONDBR
|F_JSR
))
1030 /* FIXME -- check is_annulled flag. */
1032 if (opcode
->flags
& F_UNBR
)
1033 info
->insn_type
= dis_branch
;
1034 if (opcode
->flags
& F_CONDBR
)
1035 info
->insn_type
= dis_condbranch
;
1036 if (opcode
->flags
& F_JSR
)
1037 info
->insn_type
= dis_jsr
;
1038 if (opcode
->flags
& F_DELAYED
)
1039 info
->branch_delay_insns
= 1;
1042 return sizeof (buffer
);
1046 info
->insn_type
= dis_noninsn
; /* Mark as non-valid instruction. */
1047 (*info
->fprintf_func
) (stream
, _("unknown"));
1048 return sizeof (buffer
);