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