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