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