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