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