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