Upload Tizen:Base source
[external/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"
112 };
113
114 /* Macros used to extract instruction fields.  Not all fields have
115    macros defined here, only those which are actually used.  */
116
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_IMM(i,n)   (((i) >> 0) & ((1 << (n)) - 1))
123 #define X_SIMM(i,n)  SEX (X_IMM ((i), (n)), (n))
124 #define X_DISP22(i)  (((i) >> 0) & 0x3fffff)
125 #define X_IMM22(i)   X_DISP22 (i)
126 #define X_DISP30(i)  (((i) >> 0) & 0x3fffffff)
127
128 /* These are for v9.  */
129 #define X_DISP16(i)  (((((i) >> 20) & 3) << 14) | (((i) >> 0) & 0x3fff))
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     case bfd_mach_sparc_sparclet :
226       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLET);
227     case bfd_mach_sparc_sparclite :
228     case bfd_mach_sparc_sparclite_le :
229       /* sparclites insns are recognized by default (because that's how
230          they've always been treated, for better or worse).  Kludge this by
231          indicating generic v8 is also selected.  */
232       return (SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_SPARCLITE)
233               | SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V8));
234     case bfd_mach_sparc_v8plus :
235     case bfd_mach_sparc_v9 :
236       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9);
237     case bfd_mach_sparc_v8plusa :
238     case bfd_mach_sparc_v9a :
239       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9A);
240     case bfd_mach_sparc_v8plusb :
241     case bfd_mach_sparc_v9b :
242       return SPARC_OPCODE_ARCH_MASK (SPARC_OPCODE_ARCH_V9B);
243     }
244   abort ();
245 }
246
247 /* Compare opcodes A and B.  */
248
249 static int
250 compare_opcodes (const void * a, const void * b)
251 {
252   sparc_opcode *op0 = * (sparc_opcode **) a;
253   sparc_opcode *op1 = * (sparc_opcode **) b;
254   unsigned long int match0 = op0->match, match1 = op1->match;
255   unsigned long int lose0 = op0->lose, lose1 = op1->lose;
256   register unsigned int i;
257
258   /* If one (and only one) insn isn't supported by the current architecture,
259      prefer the one that is.  If neither are supported, but they're both for
260      the same architecture, continue processing.  Otherwise (both unsupported
261      and for different architectures), prefer lower numbered arch's (fudged
262      by comparing the bitmasks).  */
263   if (op0->architecture & current_arch_mask)
264     {
265       if (! (op1->architecture & current_arch_mask))
266         return -1;
267     }
268   else
269     {
270       if (op1->architecture & current_arch_mask)
271         return 1;
272       else if (op0->architecture != op1->architecture)
273         return op0->architecture - op1->architecture;
274     }
275
276   /* If a bit is set in both match and lose, there is something
277      wrong with the opcode table.  */
278   if (match0 & lose0)
279     {
280       fprintf
281         (stderr,
282          /* xgettext:c-format */
283          _("Internal error:  bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
284          op0->name, match0, lose0);
285       op0->lose &= ~op0->match;
286       lose0 = op0->lose;
287     }
288
289   if (match1 & lose1)
290     {
291       fprintf
292         (stderr,
293          /* xgettext:c-format */
294          _("Internal error: bad sparc-opcode.h: \"%s\", %#.8lx, %#.8lx\n"),
295          op1->name, match1, lose1);
296       op1->lose &= ~op1->match;
297       lose1 = op1->lose;
298     }
299
300   /* Because the bits that are variable in one opcode are constant in
301      another, it is important to order the opcodes in the right order.  */
302   for (i = 0; i < 32; ++i)
303     {
304       unsigned long int x = 1 << i;
305       int x0 = (match0 & x) != 0;
306       int x1 = (match1 & x) != 0;
307
308       if (x0 != x1)
309         return x1 - x0;
310     }
311
312   for (i = 0; i < 32; ++i)
313     {
314       unsigned long int x = 1 << i;
315       int x0 = (lose0 & x) != 0;
316       int x1 = (lose1 & x) != 0;
317
318       if (x0 != x1)
319         return x1 - x0;
320     }
321
322   /* They are functionally equal.  So as long as the opcode table is
323      valid, we can put whichever one first we want, on aesthetic grounds.  */
324
325   /* Our first aesthetic ground is that aliases defer to real insns.  */
326   {
327     int alias_diff = (op0->flags & F_ALIAS) - (op1->flags & F_ALIAS);
328
329     if (alias_diff != 0)
330       /* Put the one that isn't an alias first.  */
331       return alias_diff;
332   }
333
334   /* Except for aliases, two "identical" instructions had
335      better have the same opcode.  This is a sanity check on the table.  */
336   i = strcmp (op0->name, op1->name);
337   if (i)
338     {
339       if (op0->flags & F_ALIAS) /* If they're both aliases, be arbitrary.  */
340         return i;
341       else
342         fprintf (stderr,
343                  /* xgettext:c-format */
344                  _("Internal error: bad sparc-opcode.h: \"%s\" == \"%s\"\n"),
345                  op0->name, op1->name);
346     }
347
348   /* Fewer arguments are preferred.  */
349   {
350     int length_diff = strlen (op0->args) - strlen (op1->args);
351
352     if (length_diff != 0)
353       /* Put the one with fewer arguments first.  */
354       return length_diff;
355   }
356
357   /* Put 1+i before i+1.  */
358   {
359     char *p0 = (char *) strchr (op0->args, '+');
360     char *p1 = (char *) strchr (op1->args, '+');
361
362     if (p0 && p1)
363       {
364         /* There is a plus in both operands.  Note that a plus
365            sign cannot be the first character in args,
366            so the following [-1]'s are valid.  */
367         if (p0[-1] == 'i' && p1[1] == 'i')
368           /* op0 is i+1 and op1 is 1+i, so op1 goes first.  */
369           return 1;
370         if (p0[1] == 'i' && p1[-1] == 'i')
371           /* op0 is 1+i and op1 is i+1, so op0 goes first.  */
372           return -1;
373       }
374   }
375
376   /* Put 1,i before i,1.  */
377   {
378     int i0 = strncmp (op0->args, "i,1", 3) == 0;
379     int i1 = strncmp (op1->args, "i,1", 3) == 0;
380
381     if (i0 ^ i1)
382       return i0 - i1;
383   }
384
385   /* They are, as far as we can tell, identical.
386      Since qsort may have rearranged the table partially, there is
387      no way to tell which one was first in the opcode table as
388      written, so just say there are equal.  */
389   /* ??? This is no longer true now that we sort a vector of pointers,
390      not the table itself.  */
391   return 0;
392 }
393
394 /* Build a hash table from the opcode table.
395    OPCODE_TABLE is a sorted list of pointers into the opcode table.  */
396
397 static void
398 build_hash_table (const sparc_opcode **opcode_table,
399                   sparc_opcode_hash **hash_table,
400                   int num_opcodes)
401 {
402   int i;
403   int hash_count[HASH_SIZE];
404   static sparc_opcode_hash *hash_buf = NULL;
405
406   /* Start at the end of the table and work backwards so that each
407      chain is sorted.  */
408
409   memset (hash_table, 0, HASH_SIZE * sizeof (hash_table[0]));
410   memset (hash_count, 0, HASH_SIZE * sizeof (hash_count[0]));
411   if (hash_buf != NULL)
412     free (hash_buf);
413   hash_buf = xmalloc (sizeof (* hash_buf) * num_opcodes);
414   for (i = num_opcodes - 1; i >= 0; --i)
415     {
416       int hash = HASH_INSN (opcode_table[i]->match);
417       sparc_opcode_hash *h = &hash_buf[i];
418
419       h->next = hash_table[hash];
420       h->opcode = opcode_table[i];
421       hash_table[hash] = h;
422       ++hash_count[hash];
423     }
424
425 #if 0 /* for debugging */
426   {
427     int min_count = num_opcodes, max_count = 0;
428     int total;
429
430     for (i = 0; i < HASH_SIZE; ++i)
431       {
432         if (hash_count[i] < min_count)
433           min_count = hash_count[i];
434         if (hash_count[i] > max_count)
435           max_count = hash_count[i];
436         total += hash_count[i];
437       }
438
439     printf ("Opcode hash table stats: min %d, max %d, ave %f\n",
440             min_count, max_count, (double) total / HASH_SIZE);
441   }
442 #endif
443 }
444
445 /* Print one instruction from MEMADDR on INFO->STREAM.
446
447    We suffix the instruction with a comment that gives the absolute
448    address involved, as well as its symbolic form, if the instruction
449    is preceded by a findable `sethi' and it either adds an immediate
450    displacement to that register, or it is an `add' or `or' instruction
451    on that register.  */
452
453 int
454 print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
455 {
456   FILE *stream = info->stream;
457   bfd_byte buffer[4];
458   unsigned long insn;
459   sparc_opcode_hash *op;
460   /* Nonzero of opcode table has been initialized.  */
461   static int opcodes_initialized = 0;
462   /* bfd mach number of last call.  */
463   static unsigned long current_mach = 0;
464   bfd_vma (*getword) (const void *);
465
466   if (!opcodes_initialized
467       || info->mach != current_mach)
468     {
469       int i;
470
471       current_arch_mask = compute_arch_mask (info->mach);
472
473       if (!opcodes_initialized)
474         sorted_opcodes =
475           xmalloc (sparc_num_opcodes * sizeof (sparc_opcode *));
476       /* Reset the sorted table so we can resort it.  */
477       for (i = 0; i < sparc_num_opcodes; ++i)
478         sorted_opcodes[i] = &sparc_opcodes[i];
479       qsort ((char *) sorted_opcodes, sparc_num_opcodes,
480              sizeof (sorted_opcodes[0]), compare_opcodes);
481
482       build_hash_table (sorted_opcodes, opcode_hash_table, sparc_num_opcodes);
483       current_mach = info->mach;
484       opcodes_initialized = 1;
485     }
486
487   {
488     int status =
489       (*info->read_memory_func) (memaddr, buffer, sizeof (buffer), info);
490
491     if (status != 0)
492       {
493         (*info->memory_error_func) (status, memaddr, info);
494         return -1;
495       }
496   }
497
498   /* On SPARClite variants such as DANlite (sparc86x), instructions
499      are always big-endian even when the machine is in little-endian mode.  */
500   if (info->endian == BFD_ENDIAN_BIG || info->mach == bfd_mach_sparc_sparclite)
501     getword = bfd_getb32;
502   else
503     getword = bfd_getl32;
504
505   insn = getword (buffer);
506
507   info->insn_info_valid = 1;                    /* We do return this info.  */
508   info->insn_type = dis_nonbranch;              /* Assume non branch insn.  */
509   info->branch_delay_insns = 0;                 /* Assume no delay.  */
510   info->target = 0;                             /* Assume no target known.  */
511
512   for (op = opcode_hash_table[HASH_INSN (insn)]; op; op = op->next)
513     {
514       const sparc_opcode *opcode = op->opcode;
515
516       /* If the insn isn't supported by the current architecture, skip it.  */
517       if (! (opcode->architecture & current_arch_mask))
518         continue;
519
520       if ((opcode->match & insn) == opcode->match
521           && (opcode->lose & insn) == 0)
522         {
523           /* Nonzero means that we have found an instruction which has
524              the effect of adding or or'ing the imm13 field to rs1.  */
525           int imm_added_to_rs1 = 0;
526           int imm_ored_to_rs1 = 0;
527
528           /* Nonzero means that we have found a plus sign in the args
529              field of the opcode table.  */
530           int found_plus = 0;
531
532           /* Nonzero means we have an annulled branch.  */
533           int is_annulled = 0;
534
535           /* Do we have an `add' or `or' instruction combining an
536              immediate with rs1?  */
537           if (opcode->match == 0x80102000) /* or */
538             imm_ored_to_rs1 = 1;
539           if (opcode->match == 0x80002000) /* add */
540             imm_added_to_rs1 = 1;
541
542           if (X_RS1 (insn) != X_RD (insn)
543               && strchr (opcode->args, 'r') != 0)
544               /* Can't do simple format if source and dest are different.  */
545               continue;
546           if (X_RS2 (insn) != X_RD (insn)
547               && strchr (opcode->args, 'O') != 0)
548               /* Can't do simple format if source and dest are different.  */
549               continue;
550
551           (*info->fprintf_func) (stream, opcode->name);
552
553           {
554             const char *s;
555
556             if (opcode->args[0] != ',')
557               (*info->fprintf_func) (stream, " ");
558
559             for (s = opcode->args; *s != '\0'; ++s)
560               {
561                 while (*s == ',')
562                   {
563                     (*info->fprintf_func) (stream, ",");
564                     ++s;
565                     switch (*s)
566                       {
567                       case 'a':
568                         (*info->fprintf_func) (stream, "a");
569                         is_annulled = 1;
570                         ++s;
571                         continue;
572                       case 'N':
573                         (*info->fprintf_func) (stream, "pn");
574                         ++s;
575                         continue;
576
577                       case 'T':
578                         (*info->fprintf_func) (stream, "pt");
579                         ++s;
580                         continue;
581
582                       default:
583                         break;
584                       }
585                   }
586
587                 (*info->fprintf_func) (stream, " ");
588
589                 switch (*s)
590                   {
591                   case '+':
592                     found_plus = 1;
593                     /* Fall through.  */
594
595                   default:
596                     (*info->fprintf_func) (stream, "%c", *s);
597                     break;
598
599                   case '#':
600                     (*info->fprintf_func) (stream, "0");
601                     break;
602
603 #define reg(n)  (*info->fprintf_func) (stream, "%%%s", reg_names[n])
604                   case '1':
605                   case 'r':
606                     reg (X_RS1 (insn));
607                     break;
608
609                   case '2':
610                   case 'O':
611                     reg (X_RS2 (insn));
612                     break;
613
614                   case 'd':
615                     reg (X_RD (insn));
616                     break;
617 #undef  reg
618
619 #define freg(n)         (*info->fprintf_func) (stream, "%%%s", freg_names[n])
620 #define fregx(n)        (*info->fprintf_func) (stream, "%%%s", freg_names[((n) & ~1) | (((n) & 1) << 5)])
621                   case 'e':
622                     freg (X_RS1 (insn));
623                     break;
624                   case 'v':     /* Double/even.  */
625                   case 'V':     /* Quad/multiple of 4.  */
626                     fregx (X_RS1 (insn));
627                     break;
628
629                   case 'f':
630                     freg (X_RS2 (insn));
631                     break;
632                   case 'B':     /* Double/even.  */
633                   case 'R':     /* Quad/multiple of 4.  */
634                     fregx (X_RS2 (insn));
635                     break;
636
637                   case 'g':
638                     freg (X_RD (insn));
639                     break;
640                   case 'H':     /* Double/even.  */
641                   case 'J':     /* Quad/multiple of 4.  */
642                     fregx (X_RD (insn));
643                     break;
644 #undef  freg
645 #undef  fregx
646
647 #define creg(n) (*info->fprintf_func) (stream, "%%c%u", (unsigned int) (n))
648                   case 'b':
649                     creg (X_RS1 (insn));
650                     break;
651
652                   case 'c':
653                     creg (X_RS2 (insn));
654                     break;
655
656                   case 'D':
657                     creg (X_RD (insn));
658                     break;
659 #undef  creg
660
661                   case 'h':
662                     (*info->fprintf_func) (stream, "%%hi(%#x)",
663                                            ((unsigned) 0xFFFFFFFF
664                                             & ((int) X_IMM22 (insn) << 10)));
665                     break;
666
667                   case 'i':     /* 13 bit immediate.  */
668                   case 'I':     /* 11 bit immediate.  */
669                   case 'j':     /* 10 bit immediate.  */
670                     {
671                       int imm;
672
673                       if (*s == 'i')
674                         imm = X_SIMM (insn, 13);
675                       else if (*s == 'I')
676                         imm = X_SIMM (insn, 11);
677                       else
678                         imm = X_SIMM (insn, 10);
679
680                       /* Check to see whether we have a 1+i, and take
681                          note of that fact.
682
683                          Note: because of the way we sort the table,
684                          we will be matching 1+i rather than i+1,
685                          so it is OK to assume that i is after +,
686                          not before it.  */
687                       if (found_plus)
688                         imm_added_to_rs1 = 1;
689
690                       if (imm <= 9)
691                         (*info->fprintf_func) (stream, "%d", imm);
692                       else
693                         (*info->fprintf_func) (stream, "%#x", imm);
694                     }
695                     break;
696
697                   case 'X':     /* 5 bit unsigned immediate.  */
698                   case 'Y':     /* 6 bit unsigned immediate.  */
699                     {
700                       int imm = X_IMM (insn, *s == 'X' ? 5 : 6);
701
702                       if (imm <= 9)
703                         (info->fprintf_func) (stream, "%d", imm);
704                       else
705                         (info->fprintf_func) (stream, "%#x", (unsigned) imm);
706                     }
707                     break;
708
709                   case '3':
710                     (info->fprintf_func) (stream, "%ld", X_IMM (insn, 3));
711                     break;
712
713                   case 'K':
714                     {
715                       int mask = X_MEMBAR (insn);
716                       int bit = 0x40, printed_one = 0;
717                       const char *name;
718
719                       if (mask == 0)
720                         (info->fprintf_func) (stream, "0");
721                       else
722                         while (bit)
723                           {
724                             if (mask & bit)
725                               {
726                                 if (printed_one)
727                                   (info->fprintf_func) (stream, "|");
728                                 name = sparc_decode_membar (bit);
729                                 (info->fprintf_func) (stream, "%s", name);
730                                 printed_one = 1;
731                               }
732                             bit >>= 1;
733                           }
734                       break;
735                     }
736
737                   case 'k':
738                     info->target = memaddr + SEX (X_DISP16 (insn), 16) * 4;
739                     (*info->print_address_func) (info->target, info);
740                     break;
741
742                   case 'G':
743                     info->target = memaddr + SEX (X_DISP19 (insn), 19) * 4;
744                     (*info->print_address_func) (info->target, info);
745                     break;
746
747                   case '6':
748                   case '7':
749                   case '8':
750                   case '9':
751                     (*info->fprintf_func) (stream, "%%fcc%c", *s - '6' + '0');
752                     break;
753
754                   case 'z':
755                     (*info->fprintf_func) (stream, "%%icc");
756                     break;
757
758                   case 'Z':
759                     (*info->fprintf_func) (stream, "%%xcc");
760                     break;
761
762                   case 'E':
763                     (*info->fprintf_func) (stream, "%%ccr");
764                     break;
765
766                   case 's':
767                     (*info->fprintf_func) (stream, "%%fprs");
768                     break;
769
770                   case 'o':
771                     (*info->fprintf_func) (stream, "%%asi");
772                     break;
773
774                   case 'W':
775                     (*info->fprintf_func) (stream, "%%tick");
776                     break;
777
778                   case 'P':
779                     (*info->fprintf_func) (stream, "%%pc");
780                     break;
781
782                   case '?':
783                     if (X_RS1 (insn) == 31)
784                       (*info->fprintf_func) (stream, "%%ver");
785                     else if ((unsigned) X_RS1 (insn) < 17)
786                       (*info->fprintf_func) (stream, "%%%s",
787                                              v9_priv_reg_names[X_RS1 (insn)]);
788                     else
789                       (*info->fprintf_func) (stream, "%%reserved");
790                     break;
791
792                   case '!':
793                     if ((unsigned) X_RD (insn) < 17)
794                       (*info->fprintf_func) (stream, "%%%s",
795                                              v9_priv_reg_names[X_RD (insn)]);
796                     else
797                       (*info->fprintf_func) (stream, "%%reserved");
798                     break;
799
800                   case '$':
801                     if ((unsigned) X_RS1 (insn) < 32)
802                       (*info->fprintf_func) (stream, "%%%s",
803                                              v9_hpriv_reg_names[X_RS1 (insn)]);
804                     else
805                       (*info->fprintf_func) (stream, "%%reserved");
806                     break;
807
808                   case '%':
809                     if ((unsigned) X_RD (insn) < 32)
810                       (*info->fprintf_func) (stream, "%%%s",
811                                              v9_hpriv_reg_names[X_RD (insn)]);
812                     else
813                       (*info->fprintf_func) (stream, "%%reserved");
814                     break;
815
816                   case '/':
817                     if (X_RS1 (insn) < 16 || X_RS1 (insn) > 25)
818                       (*info->fprintf_func) (stream, "%%reserved");
819                     else
820                       (*info->fprintf_func) (stream, "%%%s",
821                                              v9a_asr_reg_names[X_RS1 (insn)-16]);
822                     break;
823
824                   case '_':
825                     if (X_RD (insn) < 16 || X_RD (insn) > 25)
826                       (*info->fprintf_func) (stream, "%%reserved");
827                     else
828                       (*info->fprintf_func) (stream, "%%%s",
829                                              v9a_asr_reg_names[X_RD (insn)-16]);
830                     break;
831
832                   case '*':
833                     {
834                       const char *name = sparc_decode_prefetch (X_RD (insn));
835
836                       if (name)
837                         (*info->fprintf_func) (stream, "%s", name);
838                       else
839                         (*info->fprintf_func) (stream, "%ld", X_RD (insn));
840                       break;
841                     }
842
843                   case 'M':
844                     (*info->fprintf_func) (stream, "%%asr%ld", X_RS1 (insn));
845                     break;
846
847                   case 'm':
848                     (*info->fprintf_func) (stream, "%%asr%ld", X_RD (insn));
849                     break;
850
851                   case 'L':
852                     info->target = memaddr + SEX (X_DISP30 (insn), 30) * 4;
853                     (*info->print_address_func) (info->target, info);
854                     break;
855
856                   case 'n':
857                     (*info->fprintf_func)
858                       (stream, "%#x", SEX (X_DISP22 (insn), 22));
859                     break;
860
861                   case 'l':
862                     info->target = memaddr + SEX (X_DISP22 (insn), 22) * 4;
863                     (*info->print_address_func) (info->target, info);
864                     break;
865
866                   case 'A':
867                     {
868                       const char *name = sparc_decode_asi (X_ASI (insn));
869
870                       if (name)
871                         (*info->fprintf_func) (stream, "%s", name);
872                       else
873                         (*info->fprintf_func) (stream, "(%ld)", X_ASI (insn));
874                       break;
875                     }
876
877                   case 'C':
878                     (*info->fprintf_func) (stream, "%%csr");
879                     break;
880
881                   case 'F':
882                     (*info->fprintf_func) (stream, "%%fsr");
883                     break;
884
885                   case 'p':
886                     (*info->fprintf_func) (stream, "%%psr");
887                     break;
888
889                   case 'q':
890                     (*info->fprintf_func) (stream, "%%fq");
891                     break;
892
893                   case 'Q':
894                     (*info->fprintf_func) (stream, "%%cq");
895                     break;
896
897                   case 't':
898                     (*info->fprintf_func) (stream, "%%tbr");
899                     break;
900
901                   case 'w':
902                     (*info->fprintf_func) (stream, "%%wim");
903                     break;
904
905                   case 'x':
906                     (*info->fprintf_func) (stream, "%ld",
907                                            ((X_LDST_I (insn) << 8)
908                                             + X_ASI (insn)));
909                     break;
910
911                   case 'y':
912                     (*info->fprintf_func) (stream, "%%y");
913                     break;
914
915                   case 'u':
916                   case 'U':
917                     {
918                       int val = *s == 'U' ? X_RS1 (insn) : X_RD (insn);
919                       const char *name = sparc_decode_sparclet_cpreg (val);
920
921                       if (name)
922                         (*info->fprintf_func) (stream, "%s", name);
923                       else
924                         (*info->fprintf_func) (stream, "%%cpreg(%d)", val);
925                       break;
926                     }
927                   }
928               }
929           }
930
931           /* If we are adding or or'ing something to rs1, then
932              check to see whether the previous instruction was
933              a sethi to the same register as in the sethi.
934              If so, attempt to print the result of the add or
935              or (in this context add and or do the same thing)
936              and its symbolic value.  */
937           if (imm_ored_to_rs1 || imm_added_to_rs1)
938             {
939               unsigned long prev_insn;
940               int errcode;
941
942               if (memaddr >= 4)
943                 errcode =
944                   (*info->read_memory_func)
945                   (memaddr - 4, buffer, sizeof (buffer), info);
946               else
947                 errcode = 1;
948
949               prev_insn = getword (buffer);
950
951               if (errcode == 0)
952                 {
953                   /* If it is a delayed branch, we need to look at the
954                      instruction before the delayed branch.  This handles
955                      sequences such as:
956
957                      sethi %o1, %hi(_foo), %o1
958                      call _printf
959                      or %o1, %lo(_foo), %o1  */
960
961                   if (is_delayed_branch (prev_insn))
962                     {
963                       if (memaddr >= 8)
964                         errcode = (*info->read_memory_func)
965                           (memaddr - 8, buffer, sizeof (buffer), info);
966                       else
967                         errcode = 1;
968
969                       prev_insn = getword (buffer);
970                     }
971                 }
972
973               /* If there was a problem reading memory, then assume
974                  the previous instruction was not sethi.  */
975               if (errcode == 0)
976                 {
977                   /* Is it sethi to the same register?  */
978                   if ((prev_insn & 0xc1c00000) == 0x01000000
979                       && X_RD (prev_insn) == X_RS1 (insn))
980                     {
981                       (*info->fprintf_func) (stream, "\t! ");
982                       info->target =
983                         ((unsigned) 0xFFFFFFFF
984                          & ((int) X_IMM22 (prev_insn) << 10));
985                       if (imm_added_to_rs1)
986                         info->target += X_SIMM (insn, 13);
987                       else
988                         info->target |= X_SIMM (insn, 13);
989                       (*info->print_address_func) (info->target, info);
990                       info->insn_type = dis_dref;
991                       info->data_size = 4;  /* FIXME!!! */
992                     }
993                 }
994             }
995
996           if (opcode->flags & (F_UNBR|F_CONDBR|F_JSR))
997             {
998               /* FIXME -- check is_annulled flag.  */
999               (void) is_annulled;
1000               if (opcode->flags & F_UNBR)
1001                 info->insn_type = dis_branch;
1002               if (opcode->flags & F_CONDBR)
1003                 info->insn_type = dis_condbranch;
1004               if (opcode->flags & F_JSR)
1005                 info->insn_type = dis_jsr;
1006               if (opcode->flags & F_DELAYED)
1007                 info->branch_delay_insns = 1;
1008             }
1009
1010           return sizeof (buffer);
1011         }
1012     }
1013
1014   info->insn_type = dis_noninsn;        /* Mark as non-valid instruction.  */
1015   (*info->fprintf_func) (stream, _("unknown"));
1016   return sizeof (buffer);
1017 }