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