This patch adds support for the hyperprivileged registers %hstick_offset
[deliverable/binutils-gdb.git] / opcodes / sparc-dis.c
1 /* Print SPARC instructions.
2 Copyright (C) 1989-2014 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21 #include "sysdep.h"
22 #include <stdio.h>
23 #include "opcode/sparc.h"
24 #include "dis-asm.h"
25 #include "libiberty.h"
26 #include "opintl.h"
27
28 /* Bitmask of v9 architectures. */
29 #define MASK_V9 ((1 << SPARC_OPCODE_ARCH_V9) \
30 | (1 << SPARC_OPCODE_ARCH_V9A) \
31 | (1 << SPARC_OPCODE_ARCH_V9B))
32 /* 1 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)
36
37 /* The sorted opcode table. */
38 static const sparc_opcode **sorted_opcodes;
39
40 /* For faster lookup, after insns are sorted they are hashed. */
41 /* ??? I think there is room for even more improvement. */
42
43 #define HASH_SIZE 256
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
51 {
52 struct sparc_opcode_hash *next;
53 const sparc_opcode *opcode;
54 } sparc_opcode_hash;
55
56 static sparc_opcode_hash *opcode_hash_table[HASH_SIZE];
57
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) )
62
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"
78 };
79
80 #define freg_names (&reg_names[4 * 8])
81
82 /* These are ordered according to there register number in
83 rdpr and wrpr insns. */
84 static char *v9_priv_reg_names[] =
85 {
86 "tpc", "tnpc", "tstate", "tt", "tick", "tba", "pstate", "tl",
87 "pil", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
88 "wstate", "fq", "gl"
89 /* "ver" - special cased */
90 };
91
92 /* These are ordered according to there register number in
93 rdhpr and wrhpr insns. */
94 static char *v9_hpriv_reg_names[] =
95 {
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"
101 };
102
103 /* These are ordered according to there register number in
104 rd and wr insns (-16). */
105 static char *v9a_asr_reg_names[] =
106 {
107 "pcr", "pic", "dcr", "gsr", "set_softint", "clear_softint",
108 "softint", "tick_cmpr", "stick", "stick_cmpr", "cfr",
109 "pause", "cps"
110 };
111
112 /* Macros used to extract instruction fields. Not all fields have
113 macros defined here, only those which are actually used. */
114
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)
126
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)
132
133 /* Here is the union which was used to extract instruction fields
134 before the shift and mask macros were written.
135
136 union sparc_insn
137 {
138 unsigned long int code;
139 struct
140 {
141 unsigned int anop:2;
142 #define op ldst.anop
143 unsigned int anrd:5;
144 #define rd ldst.anrd
145 unsigned int op3:6;
146 unsigned int anrs1:5;
147 #define rs1 ldst.anrs1
148 unsigned int i:1;
149 unsigned int anasi:8;
150 #define asi ldst.anasi
151 unsigned int anrs2:5;
152 #define rs2 ldst.anrs2
153 #define shcnt rs2
154 } ldst;
155 struct
156 {
157 unsigned int anop:2, anrd:5, op3:6, anrs1:5, i:1;
158 unsigned int IMM13:13;
159 #define imm13 IMM13.IMM13
160 } IMM13;
161 struct
162 {
163 unsigned int anop:2;
164 unsigned int a:1;
165 unsigned int cond:4;
166 unsigned int op2:3;
167 unsigned int DISP22:22;
168 #define disp22 branch.DISP22
169 #define imm22 disp22
170 } branch;
171 struct
172 {
173 unsigned int anop:2;
174 unsigned int a:1;
175 unsigned int z:1;
176 unsigned int rcond:3;
177 unsigned int op2:3;
178 unsigned int DISP16HI:2;
179 unsigned int p:1;
180 unsigned int _rs1:5;
181 unsigned int DISP16LO:14;
182 } branch16;
183 struct
184 {
185 unsigned int anop:2;
186 unsigned int adisp30:30;
187 #define disp30 call.adisp30
188 } call;
189 }; */
190
191 /* Nonzero if INSN is the opcode for a delayed branch. */
192
193 static int
194 is_delayed_branch (unsigned long insn)
195 {
196 sparc_opcode_hash *op;
197
198 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
199 {
200 const sparc_opcode *opcode = op->opcode;
201
202 if ((opcode->match & insn) == opcode->match
203 && (opcode->lose & insn) == 0)
204 return opcode->flags & F_DELAYED;
205 }
206 return 0;
207 }
208
209 /* extern void qsort (); */
210
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;
214
215 /* Given BFD mach number, return a mask of SPARC_OPCODE_ARCH_FOO values. */
216
217 static int
218 compute_arch_mask (unsigned long mach)
219 {
220 switch (mach)
221 {
222 case 0 :
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);
244 }
245 abort ();
246 }
247
248 /* Compare opcodes A and B. */
249
250 static int
251 compare_opcodes (const void * a, const void * b)
252 {
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;
258
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)
265 {
266 if (! (op1->architecture & current_arch_mask))
267 return -1;
268 }
269 else
270 {
271 if (op1->architecture & current_arch_mask)
272 return 1;
273 else if (op0->architecture != op1->architecture)
274 return op0->architecture - op1->architecture;
275 }
276
277 /* If a bit is set in both match and lose, there is something
278 wrong with the opcode table. */
279 if (match0 & lose0)
280 {
281 fprintf
282 (stderr,
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;
287 lose0 = op0->lose;
288 }
289
290 if (match1 & lose1)
291 {
292 fprintf
293 (stderr,
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;
298 lose1 = op1->lose;
299 }
300
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)
304 {
305 unsigned long int x = 1 << i;
306 int x0 = (match0 & x) != 0;
307 int x1 = (match1 & x) != 0;
308
309 if (x0 != x1)
310 return x1 - x0;
311 }
312
313 for (i = 0; i < 32; ++i)
314 {
315 unsigned long int x = 1 << i;
316 int x0 = (lose0 & x) != 0;
317 int x1 = (lose1 & x) != 0;
318
319 if (x0 != x1)
320 return x1 - x0;
321 }
322
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. */
325
326 /* Our first aesthetic ground is that aliases defer to real insns. */
327 {
328 int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
329
330 if (alias_diff != 0)
331 /* Put the one that isn't an alias first. */
332 return alias_diff;
333 }
334
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);
338 if (i)
339 {
340 if (op0->flags & F_ALIAS)
341 {
342 if (op0->flags & F_PREFERRED)
343 return -1;
344 if (op1->flags & F_PREFERRED)
345 return 1;
346
347 /* If they're both aliases, and neither is marked as preferred,
348 be arbitrary. */
349 return i;
350 }
351 else
352 fprintf (stderr,
353 /* xgettext:c-format */
354 _("Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"),
355 op0->name, op1->name);
356 }
357
358 /* Fewer arguments are preferred. */
359 {
360 int length_diff = strlen (op0->args) - strlen (op1->args);
361
362 if (length_diff != 0)
363 /* Put the one with fewer arguments first. */
364 return length_diff;
365 }
366
367 /* Put 1+i before i+1. */
368 {
369 char *p0 = (char *) strchr (op0->args, '+');
370 char *p1 = (char *) strchr (op1->args, '+');
371
372 if (p0 && p1)
373 {
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. */
379 return 1;
380 if (p0[1] == 'i' && p1[-1] == 'i')
381 /* op0 is 1+i and op1 is i+1, so op0 goes first. */
382 return -1;
383 }
384 }
385
386 /* Put 1,i before i,1. */
387 {
388 int i0 = strncmp (op0->args, "i,1", 3) == 0;
389 int i1 = strncmp (op1->args, "i,1", 3) == 0;
390
391 if (i0 ^ i1)
392 return i0 - i1;
393 }
394
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. */
401 return 0;
402 }
403
404 /* Build a hash table from the opcode table.
405 OPCODE_TABLE is a sorted list of pointers into the opcode table. */
406
407 static void
408 build_hash_table (const sparc_opcode **opcode_table,
409 sparc_opcode_hash **hash_table,
410 int num_opcodes)
411 {
412 int i;
413 int hash_count[HASH_SIZE];
414 static sparc_opcode_hash *hash_buf = NULL;
415
416 /* Start at the end of the table and work backwards so that each
417 chain is sorted. */
418
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)
422 free (hash_buf);
423 hash_buf = xmalloc (sizeof (* hash_buf) * num_opcodes);
424 for (i = num_opcodes - 1; i >= 0; --i)
425 {
426 int hash = HASH_INSN (opcode_table[i]->match);
427 sparc_opcode_hash *h = &hash_buf[i];
428
429 h->next = hash_table[hash];
430 h->opcode = opcode_table[i];
431 hash_table[hash] = h;
432 ++hash_count[hash];
433 }
434
435 #if 0 /* for debugging */
436 {
437 int min_count = num_opcodes, max_count = 0;
438 int total;
439
440 for (i = 0; i < HASH_SIZE; ++i)
441 {
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];
447 }
448
449 printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
450 min_count, max_count, (double) total / HASH_SIZE);
451 }
452 #endif
453 }
454
455 /* Print one instruction from MEMADDR on INFO->STREAM.
456
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
461 on that register. */
462
463 int
464 print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
465 {
466 FILE *stream = info->stream;
467 bfd_byte buffer[4];
468 unsigned long insn;
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 *);
475
476 if (!opcodes_initialized
477 || info->mach != current_mach)
478 {
479 int i;
480
481 current_arch_mask = compute_arch_mask (info->mach);
482
483 if (!opcodes_initialized)
484 sorted_opcodes =
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);
491
492 build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes);
493 current_mach = info->mach;
494 opcodes_initialized = 1;
495 }
496
497 {
498 int status =
499 (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
500
501 if (status != 0)
502 {
503 (*info->memory_error_func) (status, memaddr, info);
504 return -1;
505 }
506 }
507
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;
512 else
513 getword = bfd_getl32;
514
515 insn = getword (buffer);
516
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. */
521
522 for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
523 {
524 const sparc_opcode *opcode = op->opcode;
525
526 /* If the insn isn't supported by the current architecture, skip it. */
527 if (! (opcode->architecture & current_arch_mask))
528 continue;
529
530 if ((opcode->match & insn) == opcode->match
531 && (opcode->lose & insn) == 0)
532 {
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;
537
538 /* Nonzero means that we have found a plus sign in the args
539 field of the opcode table. */
540 int found_plus = 0;
541
542 /* Nonzero means we have an annulled branch. */
543 int is_annulled = 0;
544
545 /* Do we have an `add' or `or' instruction combining an
546 immediate with rs1? */
547 if (opcode->match == 0x80102000) /* or */
548 imm_ored_to_rs1 = 1;
549 if (opcode->match == 0x80002000) /* add */
550 imm_added_to_rs1 = 1;
551
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. */
555 continue;
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. */
559 continue;
560
561 (*info->fprintf_func) (stream, "%s", opcode->name);
562
563 {
564 const char *s;
565
566 if (opcode->args[0] != ',')
567 (*info->fprintf_func) (stream, " ");
568
569 for (s = opcode->args; *s != '\0'; ++s)
570 {
571 while (*s == ',')
572 {
573 (*info->fprintf_func) (stream, ",");
574 ++s;
575 switch (*s)
576 {
577 case 'a':
578 (*info->fprintf_func) (stream, "a");
579 is_annulled = 1;
580 ++s;
581 continue;
582 case 'N':
583 (*info->fprintf_func) (stream, "pn");
584 ++s;
585 continue;
586
587 case 'T':
588 (*info->fprintf_func) (stream, "pt");
589 ++s;
590 continue;
591
592 default:
593 break;
594 }
595 }
596
597 (*info->fprintf_func) (stream, " ");
598
599 switch (*s)
600 {
601 case '+':
602 found_plus = 1;
603 /* Fall through. */
604
605 default:
606 (*info->fprintf_func) (stream, "%c", *s);
607 break;
608
609 case '#':
610 (*info->fprintf_func) (stream, "0");
611 break;
612
613 #define reg(n) (*info->fprintf_func) (stream, "%%%s", reg_names[n])
614 case '1':
615 case 'r':
616 reg (X_RS1 (insn));
617 break;
618
619 case '2':
620 case 'O':
621 reg (X_RS2 (insn));
622 break;
623
624 case 'd':
625 reg (X_RD (insn));
626 break;
627 #undef reg
628
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)])
631 case 'e':
632 freg (X_RS1 (insn));
633 break;
634 case 'v': /* Double/even. */
635 case 'V': /* Quad/multiple of 4. */
636 fregx (X_RS1 (insn));
637 break;
638
639 case 'f':
640 freg (X_RS2 (insn));
641 break;
642 case 'B': /* Double/even. */
643 case 'R': /* Quad/multiple of 4. */
644 fregx (X_RS2 (insn));
645 break;
646
647 case '4':
648 freg (X_RS3 (insn));
649 break;
650 case '5': /* Double/even. */
651 fregx (X_RS3 (insn));
652 break;
653
654 case 'g':
655 freg (X_RD (insn));
656 break;
657 case 'H': /* Double/even. */
658 case 'J': /* Quad/multiple of 4. */
659 fregx (X_RD (insn));
660 break;
661 #undef freg
662 #undef fregx
663
664 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
665 case 'b':
666 creg (X_RS1 (insn));
667 break;
668
669 case 'c':
670 creg (X_RS2 (insn));
671 break;
672
673 case 'D':
674 creg (X_RD (insn));
675 break;
676 #undef creg
677
678 case 'h':
679 (*info->fprintf_func) (stream, "%%hi(%#x)",
680 ((unsigned) 0xFFFFFFFF
681 & ((int) X_IMM22 (insn) << 10)));
682 break;
683
684 case 'i': /* 13 bit immediate. */
685 case 'I': /* 11 bit immediate. */
686 case 'j': /* 10 bit immediate. */
687 {
688 int imm;
689
690 if (*s == 'i')
691 imm = X_SIMM (insn, 13);
692 else if (*s == 'I')
693 imm = X_SIMM (insn, 11);
694 else
695 imm = X_SIMM (insn, 10);
696
697 /* Check to see whether we have a 1+i, and take
698 note of that fact.
699
700 Note: because of the way we sort the table,
701 we will be matching 1+i rather than i+1,
702 so it is OK to assume that i is after +,
703 not before it. */
704 if (found_plus)
705 imm_added_to_rs1 = 1;
706
707 if (imm <= 9)
708 (*info->fprintf_func) (stream, "%d", imm);
709 else
710 (*info->fprintf_func) (stream, "%#x", imm);
711 }
712 break;
713
714 case ')': /* 5 bit unsigned immediate from RS3. */
715 (info->fprintf_func) (stream, "%#x", (unsigned int) X_RS3 (insn));
716 break;
717
718 case 'X': /* 5 bit unsigned immediate. */
719 case 'Y': /* 6 bit unsigned immediate. */
720 {
721 int imm = X_IMM (insn, *s == 'X' ? 5 : 6);
722
723 if (imm <= 9)
724 (info->fprintf_func) (stream, "%d", imm);
725 else
726 (info->fprintf_func) (stream, "%#x", (unsigned) imm);
727 }
728 break;
729
730 case '3':
731 (info->fprintf_func) (stream, "%ld", X_IMM (insn, 3));
732 break;
733
734 case 'K':
735 {
736 int mask = X_MEMBAR (insn);
737 int bit = 0x40, printed_one = 0;
738 const char *name;
739
740 if (mask == 0)
741 (info->fprintf_func) (stream, "0");
742 else
743 while (bit)
744 {
745 if (mask & bit)
746 {
747 if (printed_one)
748 (info->fprintf_func) (stream, "|");
749 name = sparc_decode_membar (bit);
750 (info->fprintf_func) (stream, "%s", name);
751 printed_one = 1;
752 }
753 bit >>= 1;
754 }
755 break;
756 }
757
758 case '=':
759 info->target = memaddr + SEX (X_DISP10 (insn), 10) * 4;
760 (*info->print_address_func) (info->target, info);
761 break;
762
763 case 'k':
764 info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
765 (*info->print_address_func) (info->target, info);
766 break;
767
768 case 'G':
769 info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
770 (*info->print_address_func) (info->target, info);
771 break;
772
773 case '6':
774 case '7':
775 case '8':
776 case '9':
777 (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
778 break;
779
780 case 'z':
781 (*info->fprintf_func) (stream, "%%icc");
782 break;
783
784 case 'Z':
785 (*info->fprintf_func) (stream, "%%xcc");
786 break;
787
788 case 'E':
789 (*info->fprintf_func) (stream, "%%ccr");
790 break;
791
792 case 's':
793 (*info->fprintf_func) (stream, "%%fprs");
794 break;
795
796 case 'o':
797 (*info->fprintf_func) (stream, "%%asi");
798 break;
799
800 case 'W':
801 (*info->fprintf_func) (stream, "%%tick");
802 break;
803
804 case 'P':
805 (*info->fprintf_func) (stream, "%%pc");
806 break;
807
808 case '?':
809 if (X_RS1 (insn) == 31)
810 (*info->fprintf_func) (stream, "%%ver");
811 else if ((unsigned) X_RS1 (insn) < 17)
812 (*info->fprintf_func) (stream, "%%%s",
813 v9_priv_reg_names[X_RS1 (insn)]);
814 else
815 (*info->fprintf_func) (stream, "%%reserved");
816 break;
817
818 case '!':
819 if ((unsigned) X_RD (insn) < 17)
820 (*info->fprintf_func) (stream, "%%%s",
821 v9_priv_reg_names[X_RD (insn)]);
822 else
823 (*info->fprintf_func) (stream, "%%reserved");
824 break;
825
826 case '$':
827 if ((unsigned) X_RS1 (insn) < 32)
828 (*info->fprintf_func) (stream, "%%%s",
829 v9_hpriv_reg_names[X_RS1 (insn)]);
830 else
831 (*info->fprintf_func) (stream, "%%reserved");
832 break;
833
834 case '%':
835 if ((unsigned) X_RD (insn) < 32)
836 (*info->fprintf_func) (stream, "%%%s",
837 v9_hpriv_reg_names[X_RD (insn)]);
838 else
839 (*info->fprintf_func) (stream, "%%reserved");
840 break;
841
842 case '/':
843 if (X_RS1 (insn) < 16 || X_RS1 (insn) > 28)
844 (*info->fprintf_func) (stream, "%%reserved");
845 else
846 (*info->fprintf_func) (stream, "%%%s",
847 v9a_asr_reg_names[X_RS1 (insn)-16]);
848 break;
849
850 case '_':
851 if (X_RD (insn) < 16 || X_RD (insn) > 28)
852 (*info->fprintf_func) (stream, "%%reserved");
853 else
854 (*info->fprintf_func) (stream, "%%%s",
855 v9a_asr_reg_names[X_RD (insn)-16]);
856 break;
857
858 case '*':
859 {
860 const char *name = sparc_decode_prefetch (X_RD (insn));
861
862 if (name)
863 (*info->fprintf_func) (stream, "%s", name);
864 else
865 (*info->fprintf_func) (stream, "%ld", X_RD (insn));
866 break;
867 }
868
869 case 'M':
870 (*info->fprintf_func) (stream, "%%asr%ld", X_RS1 (insn));
871 break;
872
873 case 'm':
874 (*info->fprintf_func) (stream, "%%asr%ld", X_RD (insn));
875 break;
876
877 case 'L':
878 info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
879 (*info->print_address_func) (info->target, info);
880 break;
881
882 case 'n':
883 (*info->fprintf_func)
884 (stream, "%#x", SEX (X_DISP22 (insn), 22));
885 break;
886
887 case 'l':
888 info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
889 (*info->print_address_func) (info->target, info);
890 break;
891
892 case 'A':
893 {
894 const char *name = sparc_decode_asi (X_ASI (insn));
895
896 if (name)
897 (*info->fprintf_func) (stream, "%s", name);
898 else
899 (*info->fprintf_func) (stream, "(%ld)", X_ASI (insn));
900 break;
901 }
902
903 case 'C':
904 (*info->fprintf_func) (stream, "%%csr");
905 break;
906
907 case 'F':
908 (*info->fprintf_func) (stream, "%%fsr");
909 break;
910
911 case '(':
912 (*info->fprintf_func) (stream, "%%efsr");
913 break;
914
915 case 'p':
916 (*info->fprintf_func) (stream, "%%psr");
917 break;
918
919 case 'q':
920 (*info->fprintf_func) (stream, "%%fq");
921 break;
922
923 case 'Q':
924 (*info->fprintf_func) (stream, "%%cq");
925 break;
926
927 case 't':
928 (*info->fprintf_func) (stream, "%%tbr");
929 break;
930
931 case 'w':
932 (*info->fprintf_func) (stream, "%%wim");
933 break;
934
935 case 'x':
936 (*info->fprintf_func) (stream, "%ld",
937 ((X_LDST_I (insn) << 8)
938 + X_ASI (insn)));
939 break;
940
941 case 'y':
942 (*info->fprintf_func) (stream, "%%y");
943 break;
944
945 case 'u':
946 case 'U':
947 {
948 int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn);
949 const char *name = sparc_decode_sparclet_cpreg (val);
950
951 if (name)
952 (*info->fprintf_func) (stream, "%s", name);
953 else
954 (*info->fprintf_func) (stream, "%%cpreg(%d)", val);
955 break;
956 }
957 }
958 }
959 }
960
961 /* If we are adding or or'ing something to rs1, then
962 check to see whether the previous instruction was
963 a sethi to the same register as in the sethi.
964 If so, attempt to print the result of the add or
965 or (in this context add and or do the same thing)
966 and its symbolic value. */
967 if (imm_ored_to_rs1 || imm_added_to_rs1)
968 {
969 unsigned long prev_insn;
970 int errcode;
971
972 if (memaddr >= 4)
973 errcode =
974 (*info->read_memory_func)
975 (memaddr - 4, buffer, sizeof (buffer), info);
976 else
977 errcode = 1;
978
979 prev_insn = getword (buffer);
980
981 if (errcode == 0)
982 {
983 /* If it is a delayed branch, we need to look at the
984 instruction before the delayed branch. This handles
985 sequences such as:
986
987 sethi %o1, %hi(_foo), %o1
988 call _printf
989 or %o1, %lo(_foo), %o1 */
990
991 if (is_delayed_branch (prev_insn))
992 {
993 if (memaddr >= 8)
994 errcode = (*info->read_memory_func)
995 (memaddr - 8, buffer, sizeof (buffer), info);
996 else
997 errcode = 1;
998
999 prev_insn = getword (buffer);
1000 }
1001 }
1002
1003 /* If there was a problem reading memory, then assume
1004 the previous instruction was not sethi. */
1005 if (errcode == 0)
1006 {
1007 /* Is it sethi to the same register? */
1008 if ((prev_insn & 0xc1c00000) == 0x01000000
1009 && X_RD (prev_insn) == X_RS1 (insn))
1010 {
1011 (*info->fprintf_func) (stream, "\t! ");
1012 info->target =
1013 ((unsigned) 0xFFFFFFFF
1014 & ((int) X_IMM22 (prev_insn) << 10));
1015 if (imm_added_to_rs1)
1016 info->target += X_SIMM (insn, 13);
1017 else
1018 info->target |= X_SIMM (insn, 13);
1019 (*info->print_address_func) (info->target, info);
1020 info->insn_type = dis_dref;
1021 info->data_size = 4; /* FIXME!!! */
1022 }
1023 }
1024 }
1025
1026 if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
1027 {
1028 /* FIXME -- check is_annulled flag. */
1029 (void) is_annulled;
1030 if (opcode->flags & F_UNBR)
1031 info->insn_type = dis_branch;
1032 if (opcode->flags & F_CONDBR)
1033 info->insn_type = dis_condbranch;
1034 if (opcode->flags & F_JSR)
1035 info->insn_type = dis_jsr;
1036 if (opcode->flags & F_DELAYED)
1037 info->branch_delay_insns = 1;
1038 }
1039
1040 return sizeof (buffer);
1041 }
1042 }
1043
1044 info->insn_type = dis_noninsn; /* Mark as non-valid instruction. */
1045 (*info->fprintf_func) (stream, _("unknown"));
1046 return sizeof (buffer);
1047 }
This page took 0.051111 seconds and 5 git commands to generate.