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