Home | History | Annotate | Line # | Download | only in opcodes
cris-dis.c revision 1.1
      1  1.1  skrll /* Disassembler code for CRIS.
      2  1.1  skrll    Copyright 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008
      3  1.1  skrll    Free Software Foundation, Inc.
      4  1.1  skrll    Contributed by Axis Communications AB, Lund, Sweden.
      5  1.1  skrll    Written by Hans-Peter Nilsson.
      6  1.1  skrll 
      7  1.1  skrll    This file is part of the GNU opcodes library.
      8  1.1  skrll 
      9  1.1  skrll    This library is free software; you can redistribute it and/or modify
     10  1.1  skrll    it under the terms of the GNU General Public License as published by
     11  1.1  skrll    the Free Software Foundation; either version 3, or (at your option)
     12  1.1  skrll    any later version.
     13  1.1  skrll 
     14  1.1  skrll    It is distributed in the hope that it will be useful, but WITHOUT
     15  1.1  skrll    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     16  1.1  skrll    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     17  1.1  skrll    License for more details.
     18  1.1  skrll 
     19  1.1  skrll    You should have received a copy of the GNU General Public License
     20  1.1  skrll    along with this program; if not, write to the Free Software
     21  1.1  skrll    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     22  1.1  skrll    MA 02110-1301, USA.  */
     23  1.1  skrll 
     24  1.1  skrll #include "dis-asm.h"
     25  1.1  skrll #include "sysdep.h"
     26  1.1  skrll #include "opcode/cris.h"
     27  1.1  skrll #include "libiberty.h"
     28  1.1  skrll 
     29  1.1  skrll /* No instruction will be disassembled longer than this.  In theory, and
     31  1.1  skrll    in silicon, address prefixes can be cascaded.  In practice, cascading
     32  1.1  skrll    is not used by GCC, and not supported by the assembler.  */
     33  1.1  skrll #ifndef MAX_BYTES_PER_CRIS_INSN
     34  1.1  skrll #define MAX_BYTES_PER_CRIS_INSN 8
     35  1.1  skrll #endif
     36  1.1  skrll 
     37  1.1  skrll /* Whether or not to decode prefixes, folding it into the following
     38  1.1  skrll    instruction.  FIXME: Make this optional later.  */
     39  1.1  skrll #ifndef PARSE_PREFIX
     40  1.1  skrll #define PARSE_PREFIX 1
     41  1.1  skrll #endif
     42  1.1  skrll 
     43  1.1  skrll /* Sometimes we prefix all registers with this character.  */
     44  1.1  skrll #define REGISTER_PREFIX_CHAR '$'
     45  1.1  skrll 
     46  1.1  skrll /* Whether or not to trace the following sequence:
     47  1.1  skrll    sub* X,r%d
     48  1.1  skrll    bound* Y,r%d
     49  1.1  skrll    adds.w [pc+r%d.w],pc
     50  1.1  skrll 
     51  1.1  skrll    This is the assembly form of a switch-statement in C.
     52  1.1  skrll    The "sub is optional.  If there is none, then X will be zero.
     53  1.1  skrll    X is the value of the first case,
     54  1.1  skrll    Y is the number of cases (including default).
     55  1.1  skrll 
     56  1.1  skrll    This results in case offsets printed on the form:
     57  1.1  skrll     case N: -> case_address
     58  1.1  skrll    where N is an estimation on the corresponding 'case' operand in C,
     59  1.1  skrll    and case_address is where execution of that case continues after the
     60  1.1  skrll    sequence presented above.
     61  1.1  skrll 
     62  1.1  skrll    The old style of output was to print the offsets as instructions,
     63  1.1  skrll    which made it hard to follow "case"-constructs in the disassembly,
     64  1.1  skrll    and caused a lot of annoying warnings about undefined instructions.
     65  1.1  skrll 
     66  1.1  skrll    FIXME: Make this optional later.  */
     67  1.1  skrll #ifndef TRACE_CASE
     68  1.1  skrll #define TRACE_CASE (disdata->trace_case)
     69  1.1  skrll #endif
     70  1.1  skrll 
     71  1.1  skrll enum cris_disass_family
     72  1.1  skrll  { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
     73  1.1  skrll 
     74  1.1  skrll /* Stored in the disasm_info->private_data member.  */
     75  1.1  skrll struct cris_disasm_data
     76  1.1  skrll {
     77  1.1  skrll   /* Whether to print something less confusing if we find something
     78  1.1  skrll      matching a switch-construct.  */
     79  1.1  skrll   bfd_boolean trace_case;
     80  1.1  skrll 
     81  1.1  skrll   /* Whether this code is flagged as crisv32.  FIXME: Should be an enum
     82  1.1  skrll      that includes "compatible".  */
     83  1.1  skrll   enum cris_disass_family distype;
     84  1.1  skrll };
     85  1.1  skrll 
     86  1.1  skrll /* Value of first element in switch.  */
     87  1.1  skrll static long case_offset = 0;
     88  1.1  skrll 
     89  1.1  skrll /* How many more case-offsets to print.  */
     90  1.1  skrll static long case_offset_counter = 0;
     91  1.1  skrll 
     92  1.1  skrll /* Number of case offsets.  */
     93  1.1  skrll static long no_of_case_offsets = 0;
     94  1.1  skrll 
     95  1.1  skrll /* Candidate for next case_offset.  */
     96  1.1  skrll static long last_immediate = 0;
     97  1.1  skrll 
     98  1.1  skrll static int cris_constraint
     99  1.1  skrll   (const char *, unsigned, unsigned, struct cris_disasm_data *);
    100  1.1  skrll 
    101  1.1  skrll /* Parse disassembler options and store state in info.  FIXME: For the
    102  1.1  skrll    time being, we abuse static variables.  */
    103  1.1  skrll 
    104  1.1  skrll static bfd_boolean
    105  1.1  skrll cris_parse_disassembler_options (disassemble_info *info,
    106  1.1  skrll 				 enum cris_disass_family distype)
    107  1.1  skrll {
    108  1.1  skrll   struct cris_disasm_data *disdata;
    109  1.1  skrll 
    110  1.1  skrll   info->private_data = calloc (1, sizeof (struct cris_disasm_data));
    111  1.1  skrll   disdata = (struct cris_disasm_data *) info->private_data;
    112  1.1  skrll   if (disdata == NULL)
    113  1.1  skrll     return FALSE;
    114  1.1  skrll 
    115  1.1  skrll   /* Default true.  */
    116  1.1  skrll   disdata->trace_case
    117  1.1  skrll     = (info->disassembler_options == NULL
    118  1.1  skrll        || (strcmp (info->disassembler_options, "nocase") != 0));
    119  1.1  skrll 
    120  1.1  skrll   disdata->distype = distype;
    121  1.1  skrll   return TRUE;
    122  1.1  skrll }
    123  1.1  skrll 
    124  1.1  skrll static const struct cris_spec_reg *
    125  1.1  skrll spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
    126  1.1  skrll {
    127  1.1  skrll   int i;
    128  1.1  skrll 
    129  1.1  skrll   for (i = 0; cris_spec_regs[i].name != NULL; i++)
    130  1.1  skrll     {
    131  1.1  skrll       if (cris_spec_regs[i].number == sreg)
    132  1.1  skrll 	{
    133  1.1  skrll 	  if (distype == cris_dis_v32)
    134  1.1  skrll 	    switch (cris_spec_regs[i].applicable_version)
    135  1.1  skrll 	      {
    136  1.1  skrll 	      case cris_ver_warning:
    137  1.1  skrll 	      case cris_ver_version_all:
    138  1.1  skrll 	      case cris_ver_v3p:
    139  1.1  skrll 	      case cris_ver_v8p:
    140  1.1  skrll 	      case cris_ver_v10p:
    141  1.1  skrll 	      case cris_ver_v32p:
    142  1.1  skrll 		/* No ambiguous sizes or register names with CRISv32.  */
    143  1.1  skrll 		if (cris_spec_regs[i].warning == NULL)
    144  1.1  skrll 		  return &cris_spec_regs[i];
    145  1.1  skrll 	      default:
    146  1.1  skrll 		;
    147  1.1  skrll 	      }
    148  1.1  skrll 	  else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
    149  1.1  skrll 	    return &cris_spec_regs[i];
    150  1.1  skrll 	}
    151  1.1  skrll     }
    152  1.1  skrll 
    153  1.1  skrll   return NULL;
    154  1.1  skrll }
    155  1.1  skrll 
    156  1.1  skrll /* Return the number of bits in the argument.  */
    157  1.1  skrll 
    158  1.1  skrll static int
    159  1.1  skrll number_of_bits (unsigned int val)
    160  1.1  skrll {
    161  1.1  skrll   int bits;
    162  1.1  skrll 
    163  1.1  skrll   for (bits = 0; val != 0; val &= val - 1)
    164  1.1  skrll     bits++;
    165  1.1  skrll 
    166  1.1  skrll   return bits;
    167  1.1  skrll }
    168  1.1  skrll 
    169  1.1  skrll /* Get an entry in the opcode-table.  */
    170  1.1  skrll 
    171  1.1  skrll static const struct cris_opcode *
    172  1.1  skrll get_opcode_entry (unsigned int insn,
    173  1.1  skrll 		  unsigned int prefix_insn,
    174  1.1  skrll 		  struct cris_disasm_data *disdata)
    175  1.1  skrll {
    176  1.1  skrll   /* For non-prefixed insns, we keep a table of pointers, indexed by the
    177  1.1  skrll      insn code.  Each entry is initialized when found to be NULL.  */
    178  1.1  skrll   static const struct cris_opcode **opc_table = NULL;
    179  1.1  skrll 
    180  1.1  skrll   const struct cris_opcode *max_matchedp = NULL;
    181  1.1  skrll   const struct cris_opcode **prefix_opc_table = NULL;
    182  1.1  skrll 
    183  1.1  skrll   /* We hold a table for each prefix that need to be handled differently.  */
    184  1.1  skrll   static const struct cris_opcode **dip_prefixes = NULL;
    185  1.1  skrll   static const struct cris_opcode **bdapq_m1_prefixes = NULL;
    186  1.1  skrll   static const struct cris_opcode **bdapq_m2_prefixes = NULL;
    187  1.1  skrll   static const struct cris_opcode **bdapq_m4_prefixes = NULL;
    188  1.1  skrll   static const struct cris_opcode **rest_prefixes = NULL;
    189  1.1  skrll 
    190  1.1  skrll   /* Allocate and clear the opcode-table.  */
    191  1.1  skrll   if (opc_table == NULL)
    192  1.1  skrll     {
    193  1.1  skrll       opc_table = malloc (65536 * sizeof (opc_table[0]));
    194  1.1  skrll       if (opc_table == NULL)
    195  1.1  skrll 	return NULL;
    196  1.1  skrll 
    197  1.1  skrll       memset (opc_table, 0, 65536 * sizeof (const struct cris_opcode *));
    198  1.1  skrll 
    199  1.1  skrll       dip_prefixes
    200  1.1  skrll 	= malloc (65536 * sizeof (const struct cris_opcode **));
    201  1.1  skrll       if (dip_prefixes == NULL)
    202  1.1  skrll 	return NULL;
    203  1.1  skrll 
    204  1.1  skrll       memset (dip_prefixes, 0, 65536 * sizeof (dip_prefixes[0]));
    205  1.1  skrll 
    206  1.1  skrll       bdapq_m1_prefixes
    207  1.1  skrll 	= malloc (65536 * sizeof (const struct cris_opcode **));
    208  1.1  skrll       if (bdapq_m1_prefixes == NULL)
    209  1.1  skrll 	return NULL;
    210  1.1  skrll 
    211  1.1  skrll       memset (bdapq_m1_prefixes, 0, 65536 * sizeof (bdapq_m1_prefixes[0]));
    212  1.1  skrll 
    213  1.1  skrll       bdapq_m2_prefixes
    214  1.1  skrll 	= malloc (65536 * sizeof (const struct cris_opcode **));
    215  1.1  skrll       if (bdapq_m2_prefixes == NULL)
    216  1.1  skrll 	return NULL;
    217  1.1  skrll 
    218  1.1  skrll       memset (bdapq_m2_prefixes, 0, 65536 * sizeof (bdapq_m2_prefixes[0]));
    219  1.1  skrll 
    220  1.1  skrll       bdapq_m4_prefixes
    221  1.1  skrll 	= malloc (65536 * sizeof (const struct cris_opcode **));
    222  1.1  skrll       if (bdapq_m4_prefixes == NULL)
    223  1.1  skrll 	return NULL;
    224  1.1  skrll 
    225  1.1  skrll       memset (bdapq_m4_prefixes, 0, 65536 * sizeof (bdapq_m4_prefixes[0]));
    226  1.1  skrll 
    227  1.1  skrll       rest_prefixes
    228  1.1  skrll 	= malloc (65536 * sizeof (const struct cris_opcode **));
    229  1.1  skrll       if (rest_prefixes == NULL)
    230  1.1  skrll 	return NULL;
    231  1.1  skrll 
    232  1.1  skrll       memset (rest_prefixes, 0, 65536 * sizeof (rest_prefixes[0]));
    233  1.1  skrll     }
    234  1.1  skrll 
    235  1.1  skrll   /* Get the right table if this is a prefix.
    236  1.1  skrll      This code is connected to cris_constraints in that it knows what
    237  1.1  skrll      prefixes play a role in recognition of patterns; the necessary
    238  1.1  skrll      state is reflected by which table is used.  If constraints
    239  1.1  skrll      involving match or non-match of prefix insns are changed, then this
    240  1.1  skrll      probably needs changing too.  */
    241  1.1  skrll   if (prefix_insn != NO_CRIS_PREFIX)
    242  1.1  skrll     {
    243  1.1  skrll       const struct cris_opcode *popcodep
    244  1.1  skrll 	= (opc_table[prefix_insn] != NULL
    245  1.1  skrll 	   ? opc_table[prefix_insn]
    246  1.1  skrll 	   : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
    247  1.1  skrll 
    248  1.1  skrll       if (popcodep == NULL)
    249  1.1  skrll 	return NULL;
    250  1.1  skrll 
    251  1.1  skrll       if (popcodep->match == BDAP_QUICK_OPCODE)
    252  1.1  skrll 	{
    253  1.1  skrll 	  /* Since some offsets are recognized with "push" macros, we
    254  1.1  skrll 	     have to have different tables for them.  */
    255  1.1  skrll 	  int offset = (prefix_insn & 255);
    256  1.1  skrll 
    257  1.1  skrll 	  if (offset > 127)
    258  1.1  skrll 	    offset -= 256;
    259  1.1  skrll 
    260  1.1  skrll 	  switch (offset)
    261  1.1  skrll 	    {
    262  1.1  skrll 	    case -4:
    263  1.1  skrll 	      prefix_opc_table = bdapq_m4_prefixes;
    264  1.1  skrll 	      break;
    265  1.1  skrll 
    266  1.1  skrll 	    case -2:
    267  1.1  skrll 	      prefix_opc_table = bdapq_m2_prefixes;
    268  1.1  skrll 	      break;
    269  1.1  skrll 
    270  1.1  skrll 	    case -1:
    271  1.1  skrll 	      prefix_opc_table = bdapq_m1_prefixes;
    272  1.1  skrll 	      break;
    273  1.1  skrll 
    274  1.1  skrll 	    default:
    275  1.1  skrll 	      prefix_opc_table = rest_prefixes;
    276  1.1  skrll 	      break;
    277  1.1  skrll 	    }
    278  1.1  skrll 	}
    279  1.1  skrll       else if (popcodep->match == DIP_OPCODE)
    280  1.1  skrll 	/* We don't allow postincrement when the prefix is DIP, so use a
    281  1.1  skrll 	   different table for DIP.  */
    282  1.1  skrll 	prefix_opc_table = dip_prefixes;
    283  1.1  skrll       else
    284  1.1  skrll 	prefix_opc_table = rest_prefixes;
    285  1.1  skrll     }
    286  1.1  skrll 
    287  1.1  skrll   if (prefix_insn != NO_CRIS_PREFIX
    288  1.1  skrll       && prefix_opc_table[insn] != NULL)
    289  1.1  skrll     max_matchedp = prefix_opc_table[insn];
    290  1.1  skrll   else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
    291  1.1  skrll     max_matchedp = opc_table[insn];
    292  1.1  skrll   else
    293  1.1  skrll     {
    294  1.1  skrll       const struct cris_opcode *opcodep;
    295  1.1  skrll       int max_level_of_match = -1;
    296  1.1  skrll 
    297  1.1  skrll       for (opcodep = cris_opcodes;
    298  1.1  skrll 	   opcodep->name != NULL;
    299  1.1  skrll 	   opcodep++)
    300  1.1  skrll 	{
    301  1.1  skrll 	  int level_of_match;
    302  1.1  skrll 
    303  1.1  skrll 	  if (disdata->distype == cris_dis_v32)
    304  1.1  skrll 	    {
    305  1.1  skrll 	      switch (opcodep->applicable_version)
    306  1.1  skrll 		{
    307  1.1  skrll 		case cris_ver_version_all:
    308  1.1  skrll 		  break;
    309  1.1  skrll 
    310  1.1  skrll 		case cris_ver_v0_3:
    311  1.1  skrll 		case cris_ver_v0_10:
    312  1.1  skrll 		case cris_ver_v3_10:
    313  1.1  skrll 		case cris_ver_sim_v0_10:
    314  1.1  skrll 		case cris_ver_v8_10:
    315  1.1  skrll 		case cris_ver_v10:
    316  1.1  skrll 		case cris_ver_warning:
    317  1.1  skrll 		  continue;
    318  1.1  skrll 
    319  1.1  skrll 		case cris_ver_v3p:
    320  1.1  skrll 		case cris_ver_v8p:
    321  1.1  skrll 		case cris_ver_v10p:
    322  1.1  skrll 		case cris_ver_v32p:
    323  1.1  skrll 		  break;
    324  1.1  skrll 
    325  1.1  skrll 		case cris_ver_v8:
    326  1.1  skrll 		  abort ();
    327  1.1  skrll 		default:
    328  1.1  skrll 		  abort ();
    329  1.1  skrll 		}
    330  1.1  skrll 	    }
    331  1.1  skrll 	  else
    332  1.1  skrll 	    {
    333  1.1  skrll 	      switch (opcodep->applicable_version)
    334  1.1  skrll 		{
    335  1.1  skrll 		case cris_ver_version_all:
    336  1.1  skrll 		case cris_ver_v0_3:
    337  1.1  skrll 		case cris_ver_v3p:
    338  1.1  skrll 		case cris_ver_v0_10:
    339  1.1  skrll 		case cris_ver_v8p:
    340  1.1  skrll 		case cris_ver_v8_10:
    341  1.1  skrll 		case cris_ver_v10:
    342  1.1  skrll 		case cris_ver_sim_v0_10:
    343  1.1  skrll 		case cris_ver_v10p:
    344  1.1  skrll 		case cris_ver_warning:
    345  1.1  skrll 		  break;
    346  1.1  skrll 
    347  1.1  skrll 		case cris_ver_v32p:
    348  1.1  skrll 		  continue;
    349  1.1  skrll 
    350  1.1  skrll 		case cris_ver_v8:
    351  1.1  skrll 		  abort ();
    352  1.1  skrll 		default:
    353  1.1  skrll 		  abort ();
    354  1.1  skrll 		}
    355  1.1  skrll 	    }
    356  1.1  skrll 
    357  1.1  skrll 	  /* We give a double lead for bits matching the template in
    358  1.1  skrll 	     cris_opcodes.  Not even, because then "move p8,r10" would
    359  1.1  skrll 	     be given 2 bits lead over "clear.d r10".  When there's a
    360  1.1  skrll 	     tie, the first entry in the table wins.  This is
    361  1.1  skrll 	     deliberate, to avoid a more complicated recognition
    362  1.1  skrll 	     formula.  */
    363  1.1  skrll 	  if ((opcodep->match & insn) == opcodep->match
    364  1.1  skrll 	      && (opcodep->lose & insn) == 0
    365  1.1  skrll 	      && ((level_of_match
    366  1.1  skrll 		   = cris_constraint (opcodep->args,
    367  1.1  skrll 				      insn,
    368  1.1  skrll 				      prefix_insn,
    369  1.1  skrll 				      disdata))
    370  1.1  skrll 		  >= 0)
    371  1.1  skrll 	      && ((level_of_match
    372  1.1  skrll 		   += 2 * number_of_bits (opcodep->match
    373  1.1  skrll 					  | opcodep->lose))
    374  1.1  skrll 			  > max_level_of_match))
    375  1.1  skrll 		    {
    376  1.1  skrll 		      max_matchedp = opcodep;
    377  1.1  skrll 		      max_level_of_match = level_of_match;
    378  1.1  skrll 
    379  1.1  skrll 		      /* If there was a full match, never mind looking
    380  1.1  skrll 			 further.  */
    381  1.1  skrll 		      if (level_of_match >= 2 * 16)
    382  1.1  skrll 			break;
    383  1.1  skrll 		    }
    384  1.1  skrll 		}
    385  1.1  skrll       /* Fill in the new entry.
    386  1.1  skrll 
    387  1.1  skrll 	 If there are changes to the opcode-table involving prefixes, and
    388  1.1  skrll 	 disassembly then does not work correctly, try removing the
    389  1.1  skrll 	 else-clause below that fills in the prefix-table.  If that
    390  1.1  skrll 	 helps, you need to change the prefix_opc_table setting above, or
    391  1.1  skrll 	 something related.  */
    392  1.1  skrll       if (prefix_insn == NO_CRIS_PREFIX)
    393  1.1  skrll 	opc_table[insn] = max_matchedp;
    394  1.1  skrll       else
    395  1.1  skrll 	prefix_opc_table[insn] = max_matchedp;
    396  1.1  skrll     }
    397  1.1  skrll 
    398  1.1  skrll   return max_matchedp;
    399  1.1  skrll }
    400  1.1  skrll 
    401  1.1  skrll /* Return -1 if the constraints of a bitwise-matched instruction say
    402  1.1  skrll    that there is no match.  Otherwise return a nonnegative number
    403  1.1  skrll    indicating the confidence in the match (higher is better).  */
    404  1.1  skrll 
    405  1.1  skrll static int
    406  1.1  skrll cris_constraint (const char *cs,
    407  1.1  skrll 		 unsigned int insn,
    408  1.1  skrll 		 unsigned int prefix_insn,
    409  1.1  skrll 		 struct cris_disasm_data *disdata)
    410  1.1  skrll {
    411  1.1  skrll   int retval = 0;
    412  1.1  skrll   int tmp;
    413  1.1  skrll   int prefix_ok = 0;
    414  1.1  skrll   const char *s;
    415  1.1  skrll 
    416  1.1  skrll   for (s = cs; *s; s++)
    417  1.1  skrll     switch (*s)
    418  1.1  skrll       {
    419  1.1  skrll       case '!':
    420  1.1  skrll 	/* Do not recognize "pop" if there's a prefix and then only for
    421  1.1  skrll            v0..v10.  */
    422  1.1  skrll 	if (prefix_insn != NO_CRIS_PREFIX
    423  1.1  skrll 	    || disdata->distype != cris_dis_v0_v10)
    424  1.1  skrll 	  return -1;
    425  1.1  skrll 	break;
    426  1.1  skrll 
    427  1.1  skrll       case 'U':
    428  1.1  skrll 	/* Not recognized at disassembly.  */
    429  1.1  skrll 	return -1;
    430  1.1  skrll 
    431  1.1  skrll       case 'M':
    432  1.1  skrll 	/* Size modifier for "clear", i.e. special register 0, 4 or 8.
    433  1.1  skrll 	   Check that it is one of them.  Only special register 12 could
    434  1.1  skrll 	   be mismatched, but checking for matches is more logical than
    435  1.1  skrll 	   checking for mismatches when there are only a few cases.  */
    436  1.1  skrll 	tmp = ((insn >> 12) & 0xf);
    437  1.1  skrll 	if (tmp != 0 && tmp != 4 && tmp != 8)
    438  1.1  skrll 	  return -1;
    439  1.1  skrll 	break;
    440  1.1  skrll 
    441  1.1  skrll       case 'm':
    442  1.1  skrll 	if ((insn & 0x30) == 0x30)
    443  1.1  skrll 	  return -1;
    444  1.1  skrll 	break;
    445  1.1  skrll 
    446  1.1  skrll       case 'S':
    447  1.1  skrll 	/* A prefix operand without side-effect.  */
    448  1.1  skrll 	if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
    449  1.1  skrll 	  {
    450  1.1  skrll 	    prefix_ok = 1;
    451  1.1  skrll 	    break;
    452  1.1  skrll 	  }
    453  1.1  skrll 	else
    454  1.1  skrll 	  return -1;
    455  1.1  skrll 
    456  1.1  skrll       case 's':
    457  1.1  skrll       case 'y':
    458  1.1  skrll       case 'Y':
    459  1.1  skrll 	/* If this is a prefixed insn with postincrement (side-effect),
    460  1.1  skrll 	   the prefix must not be DIP.  */
    461  1.1  skrll 	if (prefix_insn != NO_CRIS_PREFIX)
    462  1.1  skrll 	  {
    463  1.1  skrll 	    if (insn & 0x400)
    464  1.1  skrll 	      {
    465  1.1  skrll 		const struct cris_opcode *prefix_opcodep
    466  1.1  skrll 		  = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
    467  1.1  skrll 
    468  1.1  skrll 		if (prefix_opcodep->match == DIP_OPCODE)
    469  1.1  skrll 		  return -1;
    470  1.1  skrll 	      }
    471  1.1  skrll 
    472  1.1  skrll 	    prefix_ok = 1;
    473  1.1  skrll 	  }
    474  1.1  skrll 	break;
    475  1.1  skrll 
    476  1.1  skrll       case 'B':
    477  1.1  skrll 	/* If we don't fall through, then the prefix is ok.  */
    478  1.1  skrll 	prefix_ok = 1;
    479  1.1  skrll 
    480  1.1  skrll 	/* A "push" prefix.  Check for valid "push" size.
    481  1.1  skrll 	   In case of special register, it may be != 4.  */
    482  1.1  skrll 	if (prefix_insn != NO_CRIS_PREFIX)
    483  1.1  skrll 	  {
    484  1.1  skrll 	    /* Match the prefix insn to BDAPQ.  */
    485  1.1  skrll 	    const struct cris_opcode *prefix_opcodep
    486  1.1  skrll 	      = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
    487  1.1  skrll 
    488  1.1  skrll 	    if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
    489  1.1  skrll 	      {
    490  1.1  skrll 		int pushsize = (prefix_insn & 255);
    491  1.1  skrll 
    492  1.1  skrll 		if (pushsize > 127)
    493  1.1  skrll 		  pushsize -= 256;
    494  1.1  skrll 
    495  1.1  skrll 		if (s[1] == 'P')
    496  1.1  skrll 		  {
    497  1.1  skrll 		    unsigned int spec_reg = (insn >> 12) & 15;
    498  1.1  skrll 		    const struct cris_spec_reg *sregp
    499  1.1  skrll 		      = spec_reg_info (spec_reg, disdata->distype);
    500  1.1  skrll 
    501  1.1  skrll 		    /* For a special-register, the "prefix size" must
    502  1.1  skrll 		       match the size of the register.  */
    503  1.1  skrll 		    if (sregp && sregp->reg_size == (unsigned int) -pushsize)
    504  1.1  skrll 		      break;
    505  1.1  skrll 		  }
    506  1.1  skrll 		else if (s[1] == 'R')
    507  1.1  skrll 		  {
    508  1.1  skrll 		    if ((insn & 0x30) == 0x20 && pushsize == -4)
    509  1.1  skrll 		      break;
    510  1.1  skrll 		  }
    511  1.1  skrll 		/* FIXME:  Should abort here; next constraint letter
    512  1.1  skrll 		   *must* be 'P' or 'R'.  */
    513  1.1  skrll 	      }
    514  1.1  skrll 	  }
    515  1.1  skrll 	return -1;
    516  1.1  skrll 
    517  1.1  skrll       case 'D':
    518  1.1  skrll 	retval = (((insn >> 12) & 15) == (insn & 15));
    519  1.1  skrll 	if (!retval)
    520  1.1  skrll 	  return -1;
    521  1.1  skrll 	else
    522  1.1  skrll 	  retval += 4;
    523  1.1  skrll 	break;
    524  1.1  skrll 
    525  1.1  skrll       case 'P':
    526  1.1  skrll 	{
    527  1.1  skrll 	  const struct cris_spec_reg *sregp
    528  1.1  skrll 	    = spec_reg_info ((insn >> 12) & 15, disdata->distype);
    529  1.1  skrll 
    530  1.1  skrll 	  /* Since we match four bits, we will give a value of 4-1 = 3
    531  1.1  skrll 	     in a match.  If there is a corresponding exact match of a
    532  1.1  skrll 	     special register in another pattern, it will get a value of
    533  1.1  skrll 	     4, which will be higher.  This should be correct in that an
    534  1.1  skrll 	     exact pattern would match better than a general pattern.
    535  1.1  skrll 
    536  1.1  skrll 	     Note that there is a reason for not returning zero; the
    537  1.1  skrll 	     pattern for "clear" is partly  matched in the bit-pattern
    538  1.1  skrll 	     (the two lower bits must be zero), while the bit-pattern
    539  1.1  skrll 	     for a move from a special register is matched in the
    540  1.1  skrll 	     register constraint.  */
    541  1.1  skrll 
    542  1.1  skrll 	  if (sregp != NULL)
    543  1.1  skrll 	    {
    544  1.1  skrll 	      retval += 3;
    545  1.1  skrll 	      break;
    546  1.1  skrll 	    }
    547  1.1  skrll 	  else
    548  1.1  skrll 	    return -1;
    549  1.1  skrll 	}
    550  1.1  skrll       }
    551  1.1  skrll 
    552  1.1  skrll   if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
    553  1.1  skrll     return -1;
    554  1.1  skrll 
    555  1.1  skrll   return retval;
    556  1.1  skrll }
    557  1.1  skrll 
    558  1.1  skrll /* Format number as hex with a leading "0x" into outbuffer.  */
    559  1.1  skrll 
    560  1.1  skrll static char *
    561  1.1  skrll format_hex (unsigned long number,
    562  1.1  skrll 	    char *outbuffer,
    563  1.1  skrll 	    struct cris_disasm_data *disdata)
    564  1.1  skrll {
    565  1.1  skrll   /* Truncate negative numbers on >32-bit hosts.  */
    566  1.1  skrll   number &= 0xffffffff;
    567  1.1  skrll 
    568  1.1  skrll   sprintf (outbuffer, "0x%lx", number);
    569  1.1  skrll 
    570  1.1  skrll   /* Save this value for the "case" support.  */
    571  1.1  skrll   if (TRACE_CASE)
    572  1.1  skrll     last_immediate = number;
    573  1.1  skrll 
    574  1.1  skrll   return outbuffer + strlen (outbuffer);
    575  1.1  skrll }
    576  1.1  skrll 
    577  1.1  skrll /* Format number as decimal into outbuffer.  Parameter signedp says
    578  1.1  skrll    whether the number should be formatted as signed (!= 0) or
    579  1.1  skrll    unsigned (== 0).  */
    580  1.1  skrll 
    581  1.1  skrll static char *
    582  1.1  skrll format_dec (long number, char *outbuffer, int signedp)
    583  1.1  skrll {
    584  1.1  skrll   last_immediate = number;
    585  1.1  skrll   if (signedp)
    586  1.1  skrll     sprintf (outbuffer, "%ld", number);
    587  1.1  skrll   else
    588  1.1  skrll     sprintf (outbuffer, "%lu", (unsigned long) number);
    589  1.1  skrll 
    590  1.1  skrll   return outbuffer + strlen (outbuffer);
    591  1.1  skrll }
    592  1.1  skrll 
    593  1.1  skrll /* Format the name of the general register regno into outbuffer.  */
    594  1.1  skrll 
    595  1.1  skrll static char *
    596  1.1  skrll format_reg (struct cris_disasm_data *disdata,
    597  1.1  skrll 	    int regno,
    598  1.1  skrll 	    char *outbuffer_start,
    599  1.1  skrll 	    bfd_boolean with_reg_prefix)
    600  1.1  skrll {
    601  1.1  skrll   char *outbuffer = outbuffer_start;
    602  1.1  skrll 
    603  1.1  skrll   if (with_reg_prefix)
    604  1.1  skrll     *outbuffer++ = REGISTER_PREFIX_CHAR;
    605  1.1  skrll 
    606  1.1  skrll   switch (regno)
    607  1.1  skrll     {
    608  1.1  skrll     case 15:
    609  1.1  skrll       /* For v32, there is no context in which we output PC.  */
    610  1.1  skrll       if (disdata->distype == cris_dis_v32)
    611  1.1  skrll 	strcpy (outbuffer, "acr");
    612  1.1  skrll       else
    613  1.1  skrll 	strcpy (outbuffer, "pc");
    614  1.1  skrll       break;
    615  1.1  skrll 
    616  1.1  skrll     case 14:
    617  1.1  skrll       strcpy (outbuffer, "sp");
    618  1.1  skrll       break;
    619  1.1  skrll 
    620  1.1  skrll     default:
    621  1.1  skrll       sprintf (outbuffer, "r%d", regno);
    622  1.1  skrll       break;
    623  1.1  skrll     }
    624  1.1  skrll 
    625  1.1  skrll   return outbuffer_start + strlen (outbuffer_start);
    626  1.1  skrll }
    627  1.1  skrll 
    628  1.1  skrll /* Format the name of a support register into outbuffer.  */
    629  1.1  skrll 
    630  1.1  skrll static char *
    631  1.1  skrll format_sup_reg (unsigned int regno,
    632  1.1  skrll 		char *outbuffer_start,
    633  1.1  skrll 		bfd_boolean with_reg_prefix)
    634  1.1  skrll {
    635  1.1  skrll   char *outbuffer = outbuffer_start;
    636  1.1  skrll   int i;
    637  1.1  skrll 
    638  1.1  skrll   if (with_reg_prefix)
    639  1.1  skrll     *outbuffer++ = REGISTER_PREFIX_CHAR;
    640  1.1  skrll 
    641  1.1  skrll   for (i = 0; cris_support_regs[i].name != NULL; i++)
    642  1.1  skrll     if (cris_support_regs[i].number == regno)
    643  1.1  skrll       {
    644  1.1  skrll 	sprintf (outbuffer, "%s", cris_support_regs[i].name);
    645  1.1  skrll 	return outbuffer_start + strlen (outbuffer_start);
    646  1.1  skrll       }
    647  1.1  skrll 
    648  1.1  skrll   /* There's supposed to be register names covering all numbers, though
    649  1.1  skrll      some may be generic names.  */
    650  1.1  skrll   sprintf (outbuffer, "format_sup_reg-BUG");
    651  1.1  skrll   return outbuffer_start + strlen (outbuffer_start);
    652  1.1  skrll }
    653  1.1  skrll 
    654  1.1  skrll /* Return the length of an instruction.  */
    655  1.1  skrll 
    656  1.1  skrll static unsigned
    657  1.1  skrll bytes_to_skip (unsigned int insn,
    658  1.1  skrll 	       const struct cris_opcode *matchedp,
    659  1.1  skrll 	       enum cris_disass_family distype,
    660  1.1  skrll 	       const struct cris_opcode *prefix_matchedp)
    661  1.1  skrll {
    662  1.1  skrll   /* Each insn is a word plus "immediate" operands.  */
    663  1.1  skrll   unsigned to_skip = 2;
    664  1.1  skrll   const char *template = matchedp->args;
    665  1.1  skrll   const char *s;
    666  1.1  skrll 
    667  1.1  skrll   for (s = template; *s; s++)
    668  1.1  skrll     if ((*s == 's' || *s == 'N' || *s == 'Y')
    669  1.1  skrll 	&& (insn & 0x400) && (insn & 15) == 15
    670  1.1  skrll 	&& prefix_matchedp == NULL)
    671  1.1  skrll       {
    672  1.1  skrll 	/* Immediate via [pc+], so we have to check the size of the
    673  1.1  skrll 	   operand.  */
    674  1.1  skrll 	int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
    675  1.1  skrll 
    676  1.1  skrll 	if (matchedp->imm_oprnd_size == SIZE_FIX_32)
    677  1.1  skrll 	  to_skip += 4;
    678  1.1  skrll 	else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
    679  1.1  skrll 	  {
    680  1.1  skrll 	    const struct cris_spec_reg *sregp
    681  1.1  skrll 	      = spec_reg_info ((insn >> 12) & 15, distype);
    682  1.1  skrll 
    683  1.1  skrll 	    /* FIXME: Improve error handling; should have been caught
    684  1.1  skrll 	       earlier.  */
    685  1.1  skrll 	    if (sregp == NULL)
    686  1.1  skrll 	      return 2;
    687  1.1  skrll 
    688  1.1  skrll 	    /* PC is incremented by two, not one, for a byte.  Except on
    689  1.1  skrll 	       CRISv32, where constants are always DWORD-size for
    690  1.1  skrll 	       special registers.  */
    691  1.1  skrll 	    to_skip +=
    692  1.1  skrll 	      distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
    693  1.1  skrll 	  }
    694  1.1  skrll 	else
    695  1.1  skrll 	  to_skip += (mode_size + 1) & ~1;
    696  1.1  skrll       }
    697  1.1  skrll     else if (*s == 'n')
    698  1.1  skrll       to_skip += 4;
    699  1.1  skrll     else if (*s == 'b')
    700  1.1  skrll       to_skip += 2;
    701  1.1  skrll 
    702  1.1  skrll   return to_skip;
    703  1.1  skrll }
    704  1.1  skrll 
    705  1.1  skrll /* Print condition code flags.  */
    706  1.1  skrll 
    707  1.1  skrll static char *
    708  1.1  skrll print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
    709  1.1  skrll {
    710  1.1  skrll   /* Use the v8 (Etrax 100) flag definitions for disassembly.
    711  1.1  skrll      The differences with v0 (Etrax 1..4) vs. Svinto are:
    712  1.1  skrll       v0 'd' <=> v8 'm'
    713  1.1  skrll       v0 'e' <=> v8 'b'.
    714  1.1  skrll      FIXME: Emit v0..v3 flag names somehow.  */
    715  1.1  skrll   static const char v8_fnames[] = "cvznxibm";
    716  1.1  skrll   static const char v32_fnames[] = "cvznxiup";
    717  1.1  skrll   const char *fnames
    718  1.1  skrll     = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
    719  1.1  skrll 
    720  1.1  skrll   unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
    721  1.1  skrll   int i;
    722  1.1  skrll 
    723  1.1  skrll   for (i = 0; i < 8; i++)
    724  1.1  skrll     if (flagbits & (1 << i))
    725  1.1  skrll       *cp++ = fnames[i];
    726  1.1  skrll 
    727  1.1  skrll   return cp;
    728  1.1  skrll }
    729  1.1  skrll 
    730  1.1  skrll /* Print out an insn with its operands, and update the info->insn_type
    731  1.1  skrll    fields.  The prefix_opcodep and the rest hold a prefix insn that is
    732  1.1  skrll    supposed to be output as an address mode.  */
    733  1.1  skrll 
    734  1.1  skrll static void
    735  1.1  skrll print_with_operands (const struct cris_opcode *opcodep,
    736  1.1  skrll 		     unsigned int insn,
    737  1.1  skrll 		     unsigned char *buffer,
    738  1.1  skrll 		     bfd_vma addr,
    739  1.1  skrll 		     disassemble_info *info,
    740  1.1  skrll 		     /* If a prefix insn was before this insn (and is supposed
    741  1.1  skrll 			to be output as an address), here is a description of
    742  1.1  skrll 			it.  */
    743  1.1  skrll 		     const struct cris_opcode *prefix_opcodep,
    744  1.1  skrll 		     unsigned int prefix_insn,
    745  1.1  skrll 		     unsigned char *prefix_buffer,
    746  1.1  skrll 		     bfd_boolean with_reg_prefix)
    747  1.1  skrll {
    748  1.1  skrll   /* Get a buffer of somewhat reasonable size where we store
    749  1.1  skrll      intermediate parts of the insn.  */
    750  1.1  skrll   char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
    751  1.1  skrll   char *tp = temp;
    752  1.1  skrll   static const char mode_char[] = "bwd?";
    753  1.1  skrll   const char *s;
    754  1.1  skrll   const char *cs;
    755  1.1  skrll   struct cris_disasm_data *disdata
    756  1.1  skrll     = (struct cris_disasm_data *) info->private_data;
    757  1.1  skrll 
    758  1.1  skrll   /* Print out the name first thing we do.  */
    759  1.1  skrll   (*info->fprintf_func) (info->stream, "%s", opcodep->name);
    760  1.1  skrll 
    761  1.1  skrll   cs = opcodep->args;
    762  1.1  skrll   s = cs;
    763  1.1  skrll 
    764  1.1  skrll   /* Ignore any prefix indicator.  */
    765  1.1  skrll   if (*s == 'p')
    766  1.1  skrll     s++;
    767  1.1  skrll 
    768  1.1  skrll   if (*s == 'm' || *s == 'M' || *s == 'z')
    769  1.1  skrll     {
    770  1.1  skrll       *tp++ = '.';
    771  1.1  skrll 
    772  1.1  skrll       /* Get the size-letter.  */
    773  1.1  skrll       *tp++ = *s == 'M'
    774  1.1  skrll 	? (insn & 0x8000 ? 'd'
    775  1.1  skrll 	   : insn & 0x4000 ? 'w' : 'b')
    776  1.1  skrll 	: mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
    777  1.1  skrll 
    778  1.1  skrll       /* Ignore the size and the space character that follows.  */
    779  1.1  skrll       s += 2;
    780  1.1  skrll     }
    781  1.1  skrll 
    782  1.1  skrll   /* Add a space if this isn't a long-branch, because for those will add
    783  1.1  skrll      the condition part of the name later.  */
    784  1.1  skrll   if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
    785  1.1  skrll     *tp++ = ' ';
    786  1.1  skrll 
    787  1.1  skrll   /* Fill in the insn-type if deducible from the name (and there's no
    788  1.1  skrll      better way).  */
    789  1.1  skrll   if (opcodep->name[0] == 'j')
    790  1.1  skrll     {
    791  1.1  skrll       if (CONST_STRNEQ (opcodep->name, "jsr"))
    792  1.1  skrll 	/* It's "jsr" or "jsrc".  */
    793  1.1  skrll 	info->insn_type = dis_jsr;
    794  1.1  skrll       else
    795  1.1  skrll 	/* Any other jump-type insn is considered a branch.  */
    796  1.1  skrll 	info->insn_type = dis_branch;
    797  1.1  skrll     }
    798  1.1  skrll 
    799  1.1  skrll   /* We might know some more fields right now.  */
    800  1.1  skrll   info->branch_delay_insns = opcodep->delayed;
    801  1.1  skrll 
    802  1.1  skrll   /* Handle operands.  */
    803  1.1  skrll   for (; *s; s++)
    804  1.1  skrll     {
    805  1.1  skrll     switch (*s)
    806  1.1  skrll       {
    807  1.1  skrll       case 'T':
    808  1.1  skrll 	tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
    809  1.1  skrll 	break;
    810  1.1  skrll 
    811  1.1  skrll       case 'A':
    812  1.1  skrll 	if (with_reg_prefix)
    813  1.1  skrll 	  *tp++ = REGISTER_PREFIX_CHAR;
    814  1.1  skrll 	*tp++ = 'a';
    815  1.1  skrll 	*tp++ = 'c';
    816  1.1  skrll 	*tp++ = 'r';
    817  1.1  skrll 	break;
    818  1.1  skrll 
    819  1.1  skrll       case '[':
    820  1.1  skrll       case ']':
    821  1.1  skrll       case ',':
    822  1.1  skrll 	*tp++ = *s;
    823  1.1  skrll 	break;
    824  1.1  skrll 
    825  1.1  skrll       case '!':
    826  1.1  skrll 	/* Ignore at this point; used at earlier stages to avoid
    827  1.1  skrll 	   recognition if there's a prefix at something that in other
    828  1.1  skrll 	   ways looks like a "pop".  */
    829  1.1  skrll 	break;
    830  1.1  skrll 
    831  1.1  skrll       case 'd':
    832  1.1  skrll 	/* Ignore.  This is an optional ".d " on the large one of
    833  1.1  skrll 	   relaxable insns.  */
    834  1.1  skrll 	break;
    835  1.1  skrll 
    836  1.1  skrll       case 'B':
    837  1.1  skrll 	/* This was the prefix that made this a "push".  We've already
    838  1.1  skrll 	   handled it by recognizing it, so signal that the prefix is
    839  1.1  skrll 	   handled by setting it to NULL.  */
    840  1.1  skrll 	prefix_opcodep = NULL;
    841  1.1  skrll 	break;
    842  1.1  skrll 
    843  1.1  skrll       case 'D':
    844  1.1  skrll       case 'r':
    845  1.1  skrll 	tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
    846  1.1  skrll 	break;
    847  1.1  skrll 
    848  1.1  skrll       case 'R':
    849  1.1  skrll 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
    850  1.1  skrll 	break;
    851  1.1  skrll 
    852  1.1  skrll       case 'n':
    853  1.1  skrll 	{
    854  1.1  skrll 	  /* Like N but pc-relative to the start of the insn.  */
    855  1.1  skrll 	  unsigned long number
    856  1.1  skrll 	    = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
    857  1.1  skrll 	       + buffer[5] * 0x1000000 + addr);
    858  1.1  skrll 
    859  1.1  skrll 	  /* Finish off and output previous formatted bytes.  */
    860  1.1  skrll 	  *tp = 0;
    861  1.1  skrll 	  if (temp[0])
    862  1.1  skrll 	    (*info->fprintf_func) (info->stream, "%s", temp);
    863  1.1  skrll 	  tp = temp;
    864  1.1  skrll 
    865  1.1  skrll 	  (*info->print_address_func) ((bfd_vma) number, info);
    866  1.1  skrll 	}
    867  1.1  skrll 	break;
    868  1.1  skrll 
    869  1.1  skrll       case 'u':
    870  1.1  skrll 	{
    871  1.1  skrll 	  /* Like n but the offset is bits <3:0> in the instruction.  */
    872  1.1  skrll 	  unsigned long number = (buffer[0] & 0xf) * 2 + addr;
    873  1.1  skrll 
    874  1.1  skrll 	  /* Finish off and output previous formatted bytes.  */
    875  1.1  skrll 	  *tp = 0;
    876  1.1  skrll 	  if (temp[0])
    877  1.1  skrll 	    (*info->fprintf_func) (info->stream, "%s", temp);
    878  1.1  skrll 	  tp = temp;
    879  1.1  skrll 
    880  1.1  skrll 	  (*info->print_address_func) ((bfd_vma) number, info);
    881  1.1  skrll 	}
    882  1.1  skrll 	break;
    883  1.1  skrll 
    884  1.1  skrll       case 'N':
    885  1.1  skrll       case 'y':
    886  1.1  skrll       case 'Y':
    887  1.1  skrll       case 'S':
    888  1.1  skrll       case 's':
    889  1.1  skrll 	/* Any "normal" memory operand.  */
    890  1.1  skrll 	if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
    891  1.1  skrll 	  {
    892  1.1  skrll 	    /* We're looking at [pc+], i.e. we need to output an immediate
    893  1.1  skrll 	       number, where the size can depend on different things.  */
    894  1.1  skrll 	    long number;
    895  1.1  skrll 	    int signedp
    896  1.1  skrll 	      = ((*cs == 'z' && (insn & 0x20))
    897  1.1  skrll 		 || opcodep->match == BDAP_QUICK_OPCODE);
    898  1.1  skrll 	    int nbytes;
    899  1.1  skrll 
    900  1.1  skrll 	    if (opcodep->imm_oprnd_size == SIZE_FIX_32)
    901  1.1  skrll 	      nbytes = 4;
    902  1.1  skrll 	    else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
    903  1.1  skrll 	      {
    904  1.1  skrll 		const struct cris_spec_reg *sregp
    905  1.1  skrll 		  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
    906  1.1  skrll 
    907  1.1  skrll 		/* A NULL return should have been as a non-match earlier,
    908  1.1  skrll 		   so catch it as an internal error in the error-case
    909  1.1  skrll 		   below.  */
    910  1.1  skrll 		if (sregp == NULL)
    911  1.1  skrll 		  /* Whatever non-valid size.  */
    912  1.1  skrll 		  nbytes = 42;
    913  1.1  skrll 		else
    914  1.1  skrll 		  /* PC is always incremented by a multiple of two.
    915  1.1  skrll 		     For CRISv32, immediates are always 4 bytes for
    916  1.1  skrll 		     special registers.  */
    917  1.1  skrll 		  nbytes = disdata->distype == cris_dis_v32
    918  1.1  skrll 		    ? 4 : (sregp->reg_size + 1) & ~1;
    919  1.1  skrll 	      }
    920  1.1  skrll 	    else
    921  1.1  skrll 	      {
    922  1.1  skrll 		int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
    923  1.1  skrll 
    924  1.1  skrll 		if (mode_size == 1)
    925  1.1  skrll 		  nbytes = 2;
    926  1.1  skrll 		else
    927  1.1  skrll 		  nbytes = mode_size;
    928  1.1  skrll 	      }
    929  1.1  skrll 
    930  1.1  skrll 	    switch (nbytes)
    931  1.1  skrll 	      {
    932  1.1  skrll 	      case 1:
    933  1.1  skrll 		number = buffer[2];
    934  1.1  skrll 		if (signedp && number > 127)
    935  1.1  skrll 		  number -= 256;
    936  1.1  skrll 		break;
    937  1.1  skrll 
    938  1.1  skrll 	      case 2:
    939  1.1  skrll 		number = buffer[2] + buffer[3] * 256;
    940  1.1  skrll 		if (signedp && number > 32767)
    941  1.1  skrll 		  number -= 65536;
    942  1.1  skrll 		break;
    943  1.1  skrll 
    944  1.1  skrll 	      case 4:
    945  1.1  skrll 		number
    946  1.1  skrll 		  = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
    947  1.1  skrll 		  + buffer[5] * 0x1000000;
    948  1.1  skrll 		break;
    949  1.1  skrll 
    950  1.1  skrll 	      default:
    951  1.1  skrll 		strcpy (tp, "bug");
    952  1.1  skrll 		tp += 3;
    953  1.1  skrll 		number = 42;
    954  1.1  skrll 	      }
    955  1.1  skrll 
    956  1.1  skrll 	    if ((*cs == 'z' && (insn & 0x20))
    957  1.1  skrll 		|| (opcodep->match == BDAP_QUICK_OPCODE
    958  1.1  skrll 		    && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
    959  1.1  skrll 	      tp = format_dec (number, tp, signedp);
    960  1.1  skrll 	    else
    961  1.1  skrll 	      {
    962  1.1  skrll 		unsigned int highbyte = (number >> 24) & 0xff;
    963  1.1  skrll 
    964  1.1  skrll 		/* Either output this as an address or as a number.  If it's
    965  1.1  skrll 		   a dword with the same high-byte as the address of the
    966  1.1  skrll 		   insn, assume it's an address, and also if it's a non-zero
    967  1.1  skrll 		   non-0xff high-byte.  If this is a jsr or a jump, then
    968  1.1  skrll 		   it's definitely an address.  */
    969  1.1  skrll 		if (nbytes == 4
    970  1.1  skrll 		    && (highbyte == ((addr >> 24) & 0xff)
    971  1.1  skrll 			|| (highbyte != 0 && highbyte != 0xff)
    972  1.1  skrll 			|| info->insn_type == dis_branch
    973  1.1  skrll 			|| info->insn_type == dis_jsr))
    974  1.1  skrll 		  {
    975  1.1  skrll 		    /* Finish off and output previous formatted bytes.  */
    976  1.1  skrll 		    *tp = 0;
    977  1.1  skrll 		    tp = temp;
    978  1.1  skrll 		    if (temp[0])
    979  1.1  skrll 		      (*info->fprintf_func) (info->stream, "%s", temp);
    980  1.1  skrll 
    981  1.1  skrll 		    (*info->print_address_func) ((bfd_vma) number, info);
    982  1.1  skrll 
    983  1.1  skrll 		    info->target = number;
    984  1.1  skrll 		  }
    985  1.1  skrll 		else
    986  1.1  skrll 		  tp = format_hex (number, tp, disdata);
    987  1.1  skrll 	      }
    988  1.1  skrll 	  }
    989  1.1  skrll 	else
    990  1.1  skrll 	  {
    991  1.1  skrll 	    /* Not an immediate number.  Then this is a (possibly
    992  1.1  skrll 	       prefixed) memory operand.  */
    993  1.1  skrll 	    if (info->insn_type != dis_nonbranch)
    994  1.1  skrll 	      {
    995  1.1  skrll 		int mode_size
    996  1.1  skrll 		  = 1 << ((insn >> 4)
    997  1.1  skrll 			  & (opcodep->args[0] == 'z' ? 1 : 3));
    998  1.1  skrll 		int size;
    999  1.1  skrll 		info->insn_type = dis_dref;
   1000  1.1  skrll 		info->flags |= CRIS_DIS_FLAG_MEMREF;
   1001  1.1  skrll 
   1002  1.1  skrll 		if (opcodep->imm_oprnd_size == SIZE_FIX_32)
   1003  1.1  skrll 		  size = 4;
   1004  1.1  skrll 		else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
   1005  1.1  skrll 		  {
   1006  1.1  skrll 		    const struct cris_spec_reg *sregp
   1007  1.1  skrll 		      = spec_reg_info ((insn >> 12) & 15, disdata->distype);
   1008  1.1  skrll 
   1009  1.1  skrll 		    /* FIXME: Improve error handling; should have been caught
   1010  1.1  skrll 		       earlier.  */
   1011  1.1  skrll 		    if (sregp == NULL)
   1012  1.1  skrll 		      size = 4;
   1013  1.1  skrll 		    else
   1014  1.1  skrll 		      size = sregp->reg_size;
   1015  1.1  skrll 		  }
   1016  1.1  skrll 		else
   1017  1.1  skrll 		  size = mode_size;
   1018  1.1  skrll 
   1019  1.1  skrll 		info->data_size = size;
   1020  1.1  skrll 	      }
   1021  1.1  skrll 
   1022  1.1  skrll 	    *tp++ = '[';
   1023  1.1  skrll 
   1024  1.1  skrll 	    if (prefix_opcodep
   1025  1.1  skrll 		/* We don't match dip with a postincremented field
   1026  1.1  skrll 		   as a side-effect address mode.  */
   1027  1.1  skrll 		&& ((insn & 0x400) == 0
   1028  1.1  skrll 		    || prefix_opcodep->match != DIP_OPCODE))
   1029  1.1  skrll 	      {
   1030  1.1  skrll 		if (insn & 0x400)
   1031  1.1  skrll 		  {
   1032  1.1  skrll 		    tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
   1033  1.1  skrll 		    *tp++ = '=';
   1034  1.1  skrll 		  }
   1035  1.1  skrll 
   1036  1.1  skrll 
   1037  1.1  skrll 		/* We mainly ignore the prefix format string when the
   1038  1.1  skrll 		   address-mode syntax is output.  */
   1039  1.1  skrll 		switch (prefix_opcodep->match)
   1040  1.1  skrll 		  {
   1041  1.1  skrll 		  case DIP_OPCODE:
   1042  1.1  skrll 		    /* It's [r], [r+] or [pc+].  */
   1043  1.1  skrll 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
   1044  1.1  skrll 		      {
   1045  1.1  skrll 			/* It's [pc+].  This cannot possibly be anything
   1046  1.1  skrll 			   but an address.  */
   1047  1.1  skrll 			unsigned long number
   1048  1.1  skrll 			  = prefix_buffer[2] + prefix_buffer[3] * 256
   1049  1.1  skrll 			  + prefix_buffer[4] * 65536
   1050  1.1  skrll 			  + prefix_buffer[5] * 0x1000000;
   1051  1.1  skrll 
   1052  1.1  skrll 			info->target = (bfd_vma) number;
   1053  1.1  skrll 
   1054  1.1  skrll 			/* Finish off and output previous formatted
   1055  1.1  skrll 			   data.  */
   1056  1.1  skrll 			*tp = 0;
   1057  1.1  skrll 			tp = temp;
   1058  1.1  skrll 			if (temp[0])
   1059  1.1  skrll 			  (*info->fprintf_func) (info->stream, "%s", temp);
   1060  1.1  skrll 
   1061  1.1  skrll 			(*info->print_address_func) ((bfd_vma) number, info);
   1062  1.1  skrll 		      }
   1063  1.1  skrll 		    else
   1064  1.1  skrll 		      {
   1065  1.1  skrll 			/* For a memref in an address, we use target2.
   1066  1.1  skrll 			   In this case, target is zero.  */
   1067  1.1  skrll 			info->flags
   1068  1.1  skrll 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
   1069  1.1  skrll 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
   1070  1.1  skrll 
   1071  1.1  skrll 			info->target2 = prefix_insn & 15;
   1072  1.1  skrll 
   1073  1.1  skrll 			*tp++ = '[';
   1074  1.1  skrll 			tp = format_reg (disdata, prefix_insn & 15, tp,
   1075  1.1  skrll 					 with_reg_prefix);
   1076  1.1  skrll 			if (prefix_insn & 0x400)
   1077  1.1  skrll 			  *tp++ = '+';
   1078  1.1  skrll 			*tp++ = ']';
   1079  1.1  skrll 		      }
   1080  1.1  skrll 		    break;
   1081  1.1  skrll 
   1082  1.1  skrll 		  case BDAP_QUICK_OPCODE:
   1083  1.1  skrll 		    {
   1084  1.1  skrll 		      int number;
   1085  1.1  skrll 
   1086  1.1  skrll 		      number = prefix_buffer[0];
   1087  1.1  skrll 		      if (number > 127)
   1088  1.1  skrll 			number -= 256;
   1089  1.1  skrll 
   1090  1.1  skrll 		      /* Output "reg+num" or, if num < 0, "reg-num".  */
   1091  1.1  skrll 		      tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
   1092  1.1  skrll 				       with_reg_prefix);
   1093  1.1  skrll 		      if (number >= 0)
   1094  1.1  skrll 			*tp++ = '+';
   1095  1.1  skrll 		      tp = format_dec (number, tp, 1);
   1096  1.1  skrll 
   1097  1.1  skrll 		      info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
   1098  1.1  skrll 		      info->target = (prefix_insn >> 12) & 15;
   1099  1.1  skrll 		      info->target2 = (bfd_vma) number;
   1100  1.1  skrll 		      break;
   1101  1.1  skrll 		    }
   1102  1.1  skrll 
   1103  1.1  skrll 		  case BIAP_OPCODE:
   1104  1.1  skrll 		    /* Output "r+R.m".  */
   1105  1.1  skrll 		    tp = format_reg (disdata, prefix_insn & 15, tp,
   1106  1.1  skrll 				     with_reg_prefix);
   1107  1.1  skrll 		    *tp++ = '+';
   1108  1.1  skrll 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
   1109  1.1  skrll 				     with_reg_prefix);
   1110  1.1  skrll 		    *tp++ = '.';
   1111  1.1  skrll 		    *tp++ = mode_char[(prefix_insn >> 4) & 3];
   1112  1.1  skrll 
   1113  1.1  skrll 		    info->flags
   1114  1.1  skrll 		      |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
   1115  1.1  skrll 			  | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
   1116  1.1  skrll 
   1117  1.1  skrll 			  | ((prefix_insn & 0x8000)
   1118  1.1  skrll 			     ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
   1119  1.1  skrll 			     : ((prefix_insn & 0x8000)
   1120  1.1  skrll 				? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
   1121  1.1  skrll 
   1122  1.1  skrll 		    /* Is it the casejump?  It's a "adds.w [pc+r%d.w],pc".  */
   1123  1.1  skrll 		    if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
   1124  1.1  skrll 		      /* Then start interpreting data as offsets.  */
   1125  1.1  skrll 		      case_offset_counter = no_of_case_offsets;
   1126  1.1  skrll 		    break;
   1127  1.1  skrll 
   1128  1.1  skrll 		  case BDAP_INDIR_OPCODE:
   1129  1.1  skrll 		    /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
   1130  1.1  skrll 		       "r-s".  */
   1131  1.1  skrll 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
   1132  1.1  skrll 				     with_reg_prefix);
   1133  1.1  skrll 
   1134  1.1  skrll 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
   1135  1.1  skrll 		      {
   1136  1.1  skrll 			long number;
   1137  1.1  skrll 			unsigned int nbytes;
   1138  1.1  skrll 
   1139  1.1  skrll 			/* It's a value.  Get its size.  */
   1140  1.1  skrll 			int mode_size = 1 << ((prefix_insn >> 4) & 3);
   1141  1.1  skrll 
   1142  1.1  skrll 			if (mode_size == 1)
   1143  1.1  skrll 			  nbytes = 2;
   1144  1.1  skrll 			else
   1145  1.1  skrll 			  nbytes = mode_size;
   1146  1.1  skrll 
   1147  1.1  skrll 			switch (nbytes)
   1148  1.1  skrll 			  {
   1149  1.1  skrll 			  case 1:
   1150  1.1  skrll 			    number = prefix_buffer[2];
   1151  1.1  skrll 			    if (number > 127)
   1152  1.1  skrll 			      number -= 256;
   1153  1.1  skrll 			    break;
   1154  1.1  skrll 
   1155  1.1  skrll 			  case 2:
   1156  1.1  skrll 			    number = prefix_buffer[2] + prefix_buffer[3] * 256;
   1157  1.1  skrll 			    if (number > 32767)
   1158  1.1  skrll 			      number -= 65536;
   1159  1.1  skrll 			    break;
   1160  1.1  skrll 
   1161  1.1  skrll 			  case 4:
   1162  1.1  skrll 			    number
   1163  1.1  skrll 			      = prefix_buffer[2] + prefix_buffer[3] * 256
   1164  1.1  skrll 			      + prefix_buffer[4] * 65536
   1165  1.1  skrll 			      + prefix_buffer[5] * 0x1000000;
   1166  1.1  skrll 			    break;
   1167  1.1  skrll 
   1168  1.1  skrll 			  default:
   1169  1.1  skrll 			    strcpy (tp, "bug");
   1170  1.1  skrll 			    tp += 3;
   1171  1.1  skrll 			    number = 42;
   1172  1.1  skrll 			  }
   1173  1.1  skrll 
   1174  1.1  skrll 			info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
   1175  1.1  skrll 			info->target2 = (bfd_vma) number;
   1176  1.1  skrll 
   1177  1.1  skrll 			/* If the size is dword, then assume it's an
   1178  1.1  skrll 			   address.  */
   1179  1.1  skrll 			if (nbytes == 4)
   1180  1.1  skrll 			  {
   1181  1.1  skrll 			    /* Finish off and output previous formatted
   1182  1.1  skrll 			       bytes.  */
   1183  1.1  skrll 			    *tp++ = '+';
   1184  1.1  skrll 			    *tp = 0;
   1185  1.1  skrll 			    tp = temp;
   1186  1.1  skrll 			    (*info->fprintf_func) (info->stream, "%s", temp);
   1187  1.1  skrll 
   1188  1.1  skrll 			    (*info->print_address_func) ((bfd_vma) number, info);
   1189  1.1  skrll 			  }
   1190  1.1  skrll 			else
   1191  1.1  skrll 			  {
   1192  1.1  skrll 			    if (number >= 0)
   1193  1.1  skrll 			      *tp++ = '+';
   1194  1.1  skrll 			    tp = format_dec (number, tp, 1);
   1195  1.1  skrll 			  }
   1196  1.1  skrll 		      }
   1197  1.1  skrll 		    else
   1198  1.1  skrll 		      {
   1199  1.1  skrll 			/* Output "r+[R].m" or "r+[R+].m".  */
   1200  1.1  skrll 			*tp++ = '+';
   1201  1.1  skrll 			*tp++ = '[';
   1202  1.1  skrll 			tp = format_reg (disdata, prefix_insn & 15, tp,
   1203  1.1  skrll 					 with_reg_prefix);
   1204  1.1  skrll 			if (prefix_insn & 0x400)
   1205  1.1  skrll 			  *tp++ = '+';
   1206  1.1  skrll 			*tp++ = ']';
   1207  1.1  skrll 			*tp++ = '.';
   1208  1.1  skrll 			*tp++ = mode_char[(prefix_insn >> 4) & 3];
   1209  1.1  skrll 
   1210  1.1  skrll 			info->flags
   1211  1.1  skrll 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
   1212  1.1  skrll 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM
   1213  1.1  skrll 			      | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
   1214  1.1  skrll 
   1215  1.1  skrll 			      | (((prefix_insn >> 4) == 2)
   1216  1.1  skrll 				 ? 0
   1217  1.1  skrll 				 : (((prefix_insn >> 4) & 3) == 1
   1218  1.1  skrll 				    ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
   1219  1.1  skrll 				    : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
   1220  1.1  skrll 		      }
   1221  1.1  skrll 		    break;
   1222  1.1  skrll 
   1223  1.1  skrll 		  default:
   1224  1.1  skrll 		    (*info->fprintf_func) (info->stream, "?prefix-bug");
   1225  1.1  skrll 		  }
   1226  1.1  skrll 
   1227  1.1  skrll 		/* To mark that the prefix is used, reset it.  */
   1228  1.1  skrll 		prefix_opcodep = NULL;
   1229  1.1  skrll 	      }
   1230  1.1  skrll 	    else
   1231  1.1  skrll 	      {
   1232  1.1  skrll 		tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
   1233  1.1  skrll 
   1234  1.1  skrll 		info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
   1235  1.1  skrll 		info->target = insn & 15;
   1236  1.1  skrll 
   1237  1.1  skrll 		if (insn & 0x400)
   1238  1.1  skrll 		  *tp++ = '+';
   1239  1.1  skrll 	      }
   1240  1.1  skrll 	    *tp++ = ']';
   1241  1.1  skrll 	  }
   1242  1.1  skrll 	break;
   1243  1.1  skrll 
   1244  1.1  skrll       case 'x':
   1245  1.1  skrll 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
   1246  1.1  skrll 	*tp++ = '.';
   1247  1.1  skrll 	*tp++ = mode_char[(insn >> 4) & 3];
   1248  1.1  skrll 	break;
   1249  1.1  skrll 
   1250  1.1  skrll       case 'I':
   1251  1.1  skrll 	tp = format_dec (insn & 63, tp, 0);
   1252  1.1  skrll 	break;
   1253  1.1  skrll 
   1254  1.1  skrll       case 'b':
   1255  1.1  skrll 	{
   1256  1.1  skrll 	  int where = buffer[2] + buffer[3] * 256;
   1257  1.1  skrll 
   1258  1.1  skrll 	  if (where > 32767)
   1259  1.1  skrll 	    where -= 65536;
   1260  1.1  skrll 
   1261  1.1  skrll 	  where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
   1262  1.1  skrll 
   1263  1.1  skrll 	  if (insn == BA_PC_INCR_OPCODE)
   1264  1.1  skrll 	    info->insn_type = dis_branch;
   1265  1.1  skrll 	  else
   1266  1.1  skrll 	    info->insn_type = dis_condbranch;
   1267  1.1  skrll 
   1268  1.1  skrll 	  info->target = (bfd_vma) where;
   1269  1.1  skrll 
   1270  1.1  skrll 	  *tp = 0;
   1271  1.1  skrll 	  tp = temp;
   1272  1.1  skrll 	  (*info->fprintf_func) (info->stream, "%s%s ",
   1273  1.1  skrll 				 temp, cris_cc_strings[insn >> 12]);
   1274  1.1  skrll 
   1275  1.1  skrll 	  (*info->print_address_func) ((bfd_vma) where, info);
   1276  1.1  skrll 	}
   1277  1.1  skrll       break;
   1278  1.1  skrll 
   1279  1.1  skrll     case 'c':
   1280  1.1  skrll       tp = format_dec (insn & 31, tp, 0);
   1281  1.1  skrll       break;
   1282  1.1  skrll 
   1283  1.1  skrll     case 'C':
   1284  1.1  skrll       tp = format_dec (insn & 15, tp, 0);
   1285  1.1  skrll       break;
   1286  1.1  skrll 
   1287  1.1  skrll     case 'o':
   1288  1.1  skrll       {
   1289  1.1  skrll 	long offset = insn & 0xfe;
   1290  1.1  skrll 	bfd_vma target;
   1291  1.1  skrll 
   1292  1.1  skrll 	if (insn & 1)
   1293  1.1  skrll 	  offset |= ~0xff;
   1294  1.1  skrll 
   1295  1.1  skrll 	if (opcodep->match == BA_QUICK_OPCODE)
   1296  1.1  skrll 	  info->insn_type = dis_branch;
   1297  1.1  skrll 	else
   1298  1.1  skrll 	  info->insn_type = dis_condbranch;
   1299  1.1  skrll 
   1300  1.1  skrll 	target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
   1301  1.1  skrll 	info->target = target;
   1302  1.1  skrll 	*tp = 0;
   1303  1.1  skrll 	tp = temp;
   1304  1.1  skrll 	(*info->fprintf_func) (info->stream, "%s", temp);
   1305  1.1  skrll 	(*info->print_address_func) (target, info);
   1306  1.1  skrll       }
   1307  1.1  skrll       break;
   1308  1.1  skrll 
   1309  1.1  skrll     case 'Q':
   1310  1.1  skrll     case 'O':
   1311  1.1  skrll       {
   1312  1.1  skrll 	long number = buffer[0];
   1313  1.1  skrll 
   1314  1.1  skrll 	if (number > 127)
   1315  1.1  skrll 	  number = number - 256;
   1316  1.1  skrll 
   1317  1.1  skrll 	tp = format_dec (number, tp, 1);
   1318  1.1  skrll 	*tp++ = ',';
   1319  1.1  skrll 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
   1320  1.1  skrll       }
   1321  1.1  skrll       break;
   1322  1.1  skrll 
   1323  1.1  skrll     case 'f':
   1324  1.1  skrll       tp = print_flags (disdata, insn, tp);
   1325  1.1  skrll       break;
   1326  1.1  skrll 
   1327  1.1  skrll     case 'i':
   1328  1.1  skrll       tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
   1329  1.1  skrll       break;
   1330  1.1  skrll 
   1331  1.1  skrll     case 'P':
   1332  1.1  skrll       {
   1333  1.1  skrll 	const struct cris_spec_reg *sregp
   1334  1.1  skrll 	  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
   1335  1.1  skrll 
   1336  1.1  skrll 	if (sregp->name == NULL)
   1337  1.1  skrll 	  /* Should have been caught as a non-match eariler.  */
   1338  1.1  skrll 	  *tp++ = '?';
   1339  1.1  skrll 	else
   1340  1.1  skrll 	  {
   1341  1.1  skrll 	    if (with_reg_prefix)
   1342  1.1  skrll 	      *tp++ = REGISTER_PREFIX_CHAR;
   1343  1.1  skrll 	    strcpy (tp, sregp->name);
   1344  1.1  skrll 	    tp += strlen (tp);
   1345  1.1  skrll 	  }
   1346  1.1  skrll       }
   1347  1.1  skrll       break;
   1348  1.1  skrll 
   1349  1.1  skrll     default:
   1350  1.1  skrll       strcpy (tp, "???");
   1351  1.1  skrll       tp += 3;
   1352  1.1  skrll     }
   1353  1.1  skrll   }
   1354  1.1  skrll 
   1355  1.1  skrll   *tp = 0;
   1356  1.1  skrll 
   1357  1.1  skrll   if (prefix_opcodep)
   1358  1.1  skrll     (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
   1359  1.1  skrll 			   prefix_opcodep->name, prefix_opcodep->args);
   1360  1.1  skrll 
   1361  1.1  skrll   (*info->fprintf_func) (info->stream, "%s", temp);
   1362  1.1  skrll 
   1363  1.1  skrll   /* Get info for matching case-tables, if we don't have any active.
   1364  1.1  skrll      We assume that the last constant seen is used; either in the insn
   1365  1.1  skrll      itself or in a "move.d const,rN, sub.d rN,rM"-like sequence.  */
   1366  1.1  skrll   if (TRACE_CASE && case_offset_counter == 0)
   1367  1.1  skrll     {
   1368  1.1  skrll       if (CONST_STRNEQ (opcodep->name, "sub"))
   1369  1.1  skrll 	case_offset = last_immediate;
   1370  1.1  skrll 
   1371  1.1  skrll       /* It could also be an "add", if there are negative case-values.  */
   1372  1.1  skrll       else if (CONST_STRNEQ (opcodep->name, "add"))
   1373  1.1  skrll 	/* The first case is the negated operand to the add.  */
   1374  1.1  skrll 	case_offset = -last_immediate;
   1375  1.1  skrll 
   1376  1.1  skrll       /* A bound insn will tell us the number of cases.  */
   1377  1.1  skrll       else if (CONST_STRNEQ (opcodep->name, "bound"))
   1378  1.1  skrll 	no_of_case_offsets = last_immediate + 1;
   1379  1.1  skrll 
   1380  1.1  skrll       /* A jump or jsr or branch breaks the chain of insns for a
   1381  1.1  skrll 	 case-table, so assume default first-case again.  */
   1382  1.1  skrll       else if (info->insn_type == dis_jsr
   1383  1.1  skrll 	       || info->insn_type == dis_branch
   1384  1.1  skrll 	       || info->insn_type == dis_condbranch)
   1385  1.1  skrll 	case_offset = 0;
   1386  1.1  skrll     }
   1387  1.1  skrll }
   1388  1.1  skrll 
   1389  1.1  skrll 
   1390  1.1  skrll /* Print the CRIS instruction at address memaddr on stream.  Returns
   1391  1.1  skrll    length of the instruction, in bytes.  Prefix register names with `$' if
   1392  1.1  skrll    WITH_REG_PREFIX.  */
   1393  1.1  skrll 
   1394  1.1  skrll static int
   1395  1.1  skrll print_insn_cris_generic (bfd_vma memaddr,
   1396  1.1  skrll 			 disassemble_info *info,
   1397  1.1  skrll 			 bfd_boolean with_reg_prefix)
   1398  1.1  skrll {
   1399  1.1  skrll   int nbytes;
   1400  1.1  skrll   unsigned int insn;
   1401  1.1  skrll   const struct cris_opcode *matchedp;
   1402  1.1  skrll   int advance = 0;
   1403  1.1  skrll   struct cris_disasm_data *disdata
   1404  1.1  skrll     = (struct cris_disasm_data *) info->private_data;
   1405  1.1  skrll 
   1406  1.1  skrll   /* No instruction will be disassembled as longer than this number of
   1407  1.1  skrll      bytes; stacked prefixes will not be expanded.  */
   1408  1.1  skrll   unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
   1409  1.1  skrll   unsigned char *bufp;
   1410  1.1  skrll   int status = 0;
   1411  1.1  skrll   bfd_vma addr;
   1412  1.1  skrll 
   1413  1.1  skrll   /* There will be an "out of range" error after the last instruction.
   1414  1.1  skrll      Reading pairs of bytes in decreasing number, we hope that we will get
   1415  1.1  skrll      at least the amount that we will consume.
   1416  1.1  skrll 
   1417  1.1  skrll      If we can't get any data, or we do not get enough data, we print
   1418  1.1  skrll      the error message.  */
   1419  1.1  skrll 
   1420  1.1  skrll   for (nbytes = MAX_BYTES_PER_CRIS_INSN; nbytes > 0; nbytes -= 2)
   1421  1.1  skrll     {
   1422  1.1  skrll       status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
   1423  1.1  skrll       if (status == 0)
   1424  1.1  skrll 	break;
   1425  1.1  skrll     }
   1426  1.1  skrll 
   1427  1.1  skrll   /* If we did not get all we asked for, then clear the rest.
   1428  1.1  skrll      Hopefully this makes a reproducible result in case of errors.  */
   1429  1.1  skrll   if (nbytes != MAX_BYTES_PER_CRIS_INSN)
   1430  1.1  skrll     memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
   1431  1.1  skrll 
   1432  1.1  skrll   addr = memaddr;
   1433  1.1  skrll   bufp = buffer;
   1434  1.1  skrll 
   1435  1.1  skrll   /* Set some defaults for the insn info.  */
   1436  1.1  skrll   info->insn_info_valid = 1;
   1437  1.1  skrll   info->branch_delay_insns = 0;
   1438  1.1  skrll   info->data_size = 0;
   1439  1.1  skrll   info->insn_type = dis_nonbranch;
   1440  1.1  skrll   info->flags = 0;
   1441  1.1  skrll   info->target = 0;
   1442  1.1  skrll   info->target2 = 0;
   1443  1.1  skrll 
   1444  1.1  skrll   /* If we got any data, disassemble it.  */
   1445  1.1  skrll   if (nbytes != 0)
   1446  1.1  skrll     {
   1447  1.1  skrll       matchedp = NULL;
   1448  1.1  skrll 
   1449  1.1  skrll       insn = bufp[0] + bufp[1] * 256;
   1450  1.1  skrll 
   1451  1.1  skrll       /* If we're in a case-table, don't disassemble the offsets.  */
   1452  1.1  skrll       if (TRACE_CASE && case_offset_counter != 0)
   1453  1.1  skrll 	{
   1454  1.1  skrll 	  info->insn_type = dis_noninsn;
   1455  1.1  skrll 	  advance += 2;
   1456  1.1  skrll 
   1457  1.1  skrll 	  /* If to print data as offsets, then shortcut here.  */
   1458  1.1  skrll 	  (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
   1459  1.1  skrll 				 case_offset + no_of_case_offsets
   1460  1.1  skrll 				 - case_offset_counter,
   1461  1.1  skrll 				 case_offset_counter == 1 ? "/default" :
   1462  1.1  skrll 				 "");
   1463  1.1  skrll 
   1464  1.1  skrll 	  (*info->print_address_func) ((bfd_vma)
   1465  1.1  skrll 				       ((short) (insn)
   1466  1.1  skrll 					+ (long) (addr
   1467  1.1  skrll 						  - (no_of_case_offsets
   1468  1.1  skrll 						     - case_offset_counter)
   1469  1.1  skrll 						  * 2)), info);
   1470  1.1  skrll 	  case_offset_counter--;
   1471  1.1  skrll 
   1472  1.1  skrll 	  /* The default case start (without a "sub" or "add") must be
   1473  1.1  skrll 	     zero.  */
   1474  1.1  skrll 	  if (case_offset_counter == 0)
   1475  1.1  skrll 	    case_offset = 0;
   1476  1.1  skrll 	}
   1477  1.1  skrll       else if (insn == 0)
   1478  1.1  skrll 	{
   1479  1.1  skrll 	  /* We're often called to disassemble zeroes.  While this is a
   1480  1.1  skrll 	     valid "bcc .+2" insn, it is also useless enough and enough
   1481  1.1  skrll 	     of a nuiscance that we will just output "bcc .+2" for it
   1482  1.1  skrll 	     and signal it as a noninsn.  */
   1483  1.1  skrll 	  (*info->fprintf_func) (info->stream,
   1484  1.1  skrll 				 disdata->distype == cris_dis_v32
   1485  1.1  skrll 				 ? "bcc ." : "bcc .+2");
   1486  1.1  skrll 	  info->insn_type = dis_noninsn;
   1487  1.1  skrll 	  advance += 2;
   1488  1.1  skrll 	}
   1489  1.1  skrll       else
   1490  1.1  skrll 	{
   1491  1.1  skrll 	  const struct cris_opcode *prefix_opcodep = NULL;
   1492  1.1  skrll 	  unsigned char *prefix_buffer = bufp;
   1493  1.1  skrll 	  unsigned int prefix_insn = insn;
   1494  1.1  skrll 	  int prefix_size = 0;
   1495  1.1  skrll 
   1496  1.1  skrll 	  matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
   1497  1.1  skrll 
   1498  1.1  skrll 	  /* Check if we're supposed to write out prefixes as address
   1499  1.1  skrll 	     modes and if this was a prefix.  */
   1500  1.1  skrll 	  if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
   1501  1.1  skrll 	    {
   1502  1.1  skrll 	      /* If it's a prefix, put it into the prefix vars and get the
   1503  1.1  skrll 		 main insn.  */
   1504  1.1  skrll 	      prefix_size = bytes_to_skip (prefix_insn, matchedp,
   1505  1.1  skrll 					   disdata->distype, NULL);
   1506  1.1  skrll 	      prefix_opcodep = matchedp;
   1507  1.1  skrll 
   1508  1.1  skrll 	      insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
   1509  1.1  skrll 	      matchedp = get_opcode_entry (insn, prefix_insn, disdata);
   1510  1.1  skrll 
   1511  1.1  skrll 	      if (matchedp != NULL)
   1512  1.1  skrll 		{
   1513  1.1  skrll 		  addr += prefix_size;
   1514  1.1  skrll 		  bufp += prefix_size;
   1515  1.1  skrll 		  advance += prefix_size;
   1516  1.1  skrll 		}
   1517  1.1  skrll 	      else
   1518  1.1  skrll 		{
   1519  1.1  skrll 		  /* The "main" insn wasn't valid, at least not when
   1520  1.1  skrll 		     prefixed.  Put back things enough to output the
   1521  1.1  skrll 		     prefix insn only, as a normal insn.  */
   1522  1.1  skrll 		  matchedp = prefix_opcodep;
   1523  1.1  skrll 		  insn = prefix_insn;
   1524  1.1  skrll 		  prefix_opcodep = NULL;
   1525  1.1  skrll 		}
   1526  1.1  skrll 	    }
   1527  1.1  skrll 
   1528  1.1  skrll 	  if (matchedp == NULL)
   1529  1.1  skrll 	    {
   1530  1.1  skrll 	      (*info->fprintf_func) (info->stream, "??0x%x", insn);
   1531  1.1  skrll 	      advance += 2;
   1532  1.1  skrll 
   1533  1.1  skrll 	      info->insn_type = dis_noninsn;
   1534  1.1  skrll 	    }
   1535  1.1  skrll 	  else
   1536  1.1  skrll 	    {
   1537  1.1  skrll 	      advance
   1538  1.1  skrll 		+= bytes_to_skip (insn, matchedp, disdata->distype,
   1539  1.1  skrll 				  prefix_opcodep);
   1540  1.1  skrll 
   1541  1.1  skrll 	      /* The info_type and assorted fields will be set according
   1542  1.1  skrll 		 to the operands.   */
   1543  1.1  skrll 	      print_with_operands (matchedp, insn, bufp, addr, info,
   1544  1.1  skrll 				   prefix_opcodep, prefix_insn,
   1545  1.1  skrll 				   prefix_buffer, with_reg_prefix);
   1546  1.1  skrll 	    }
   1547  1.1  skrll 	}
   1548  1.1  skrll     }
   1549  1.1  skrll   else
   1550  1.1  skrll     info->insn_type = dis_noninsn;
   1551  1.1  skrll 
   1552  1.1  skrll   /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
   1553  1.1  skrll      status when reading that much, and the insn decoding indicated a
   1554  1.1  skrll      length exceeding what we read, there is an error.  */
   1555  1.1  skrll   if (status != 0 && (nbytes == 0 || advance > nbytes))
   1556  1.1  skrll     {
   1557  1.1  skrll       (*info->memory_error_func) (status, memaddr, info);
   1558  1.1  skrll       return -1;
   1559  1.1  skrll     }
   1560  1.1  skrll 
   1561  1.1  skrll   /* Max supported insn size with one folded prefix insn.  */
   1562  1.1  skrll   info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
   1563  1.1  skrll 
   1564  1.1  skrll   /* I would like to set this to a fixed value larger than the actual
   1565  1.1  skrll      number of bytes to print in order to avoid spaces between bytes,
   1566  1.1  skrll      but objdump.c (2.9.1) does not like that, so we print 16-bit
   1567  1.1  skrll      chunks, which is the next choice.  */
   1568  1.1  skrll   info->bytes_per_chunk = 2;
   1569  1.1  skrll 
   1570  1.1  skrll   /* Printing bytes in order of increasing addresses makes sense,
   1571  1.1  skrll      especially on a little-endian target.
   1572  1.1  skrll      This is completely the opposite of what you think; setting this to
   1573  1.1  skrll      BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
   1574  1.1  skrll      we want.  */
   1575  1.1  skrll   info->display_endian = BFD_ENDIAN_BIG;
   1576  1.1  skrll 
   1577  1.1  skrll   return advance;
   1578  1.1  skrll }
   1579  1.1  skrll 
   1580  1.1  skrll /* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
   1581  1.1  skrll 
   1582  1.1  skrll static int
   1583  1.1  skrll print_insn_cris_with_register_prefix (bfd_vma vma,
   1584  1.1  skrll 				      disassemble_info *info)
   1585  1.1  skrll {
   1586  1.1  skrll   if (info->private_data == NULL
   1587  1.1  skrll       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
   1588  1.1  skrll     return -1;
   1589  1.1  skrll   return print_insn_cris_generic (vma, info, TRUE);
   1590  1.1  skrll }
   1591  1.1  skrll 
   1592  1.1  skrll /* Disassemble, prefixing register names with `$'.  CRIS v32.  */
   1593  1.1  skrll 
   1594  1.1  skrll static int
   1595  1.1  skrll print_insn_crisv32_with_register_prefix (bfd_vma vma,
   1596  1.1  skrll 					 disassemble_info *info)
   1597  1.1  skrll {
   1598  1.1  skrll   if (info->private_data == NULL
   1599  1.1  skrll       && !cris_parse_disassembler_options (info, cris_dis_v32))
   1600  1.1  skrll     return -1;
   1601  1.1  skrll   return print_insn_cris_generic (vma, info, TRUE);
   1602  1.1  skrll }
   1603  1.1  skrll 
   1604  1.1  skrll /* Disassemble, prefixing register names with `$'.
   1605  1.1  skrll    Common v10 and v32 subset.  */
   1606  1.1  skrll 
   1607  1.1  skrll static int
   1608  1.1  skrll print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
   1609  1.1  skrll 					     disassemble_info *info)
   1610  1.1  skrll {
   1611  1.1  skrll   if (info->private_data == NULL
   1612  1.1  skrll       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
   1613  1.1  skrll     return -1;
   1614  1.1  skrll   return print_insn_cris_generic (vma, info, TRUE);
   1615  1.1  skrll }
   1616  1.1  skrll 
   1617  1.1  skrll /* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
   1618  1.1  skrll 
   1619  1.1  skrll static int
   1620  1.1  skrll print_insn_cris_without_register_prefix (bfd_vma vma,
   1621  1.1  skrll 					 disassemble_info *info)
   1622  1.1  skrll {
   1623  1.1  skrll   if (info->private_data == NULL
   1624  1.1  skrll       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
   1625  1.1  skrll     return -1;
   1626  1.1  skrll   return print_insn_cris_generic (vma, info, FALSE);
   1627  1.1  skrll }
   1628  1.1  skrll 
   1629  1.1  skrll /* Disassemble, no prefixes on register names.  CRIS v32.  */
   1630  1.1  skrll 
   1631  1.1  skrll static int
   1632  1.1  skrll print_insn_crisv32_without_register_prefix (bfd_vma vma,
   1633  1.1  skrll 					    disassemble_info *info)
   1634  1.1  skrll {
   1635  1.1  skrll   if (info->private_data == NULL
   1636  1.1  skrll       && !cris_parse_disassembler_options (info, cris_dis_v32))
   1637  1.1  skrll     return -1;
   1638  1.1  skrll   return print_insn_cris_generic (vma, info, FALSE);
   1639  1.1  skrll }
   1640  1.1  skrll 
   1641  1.1  skrll /* Disassemble, no prefixes on register names.
   1642  1.1  skrll    Common v10 and v32 subset.  */
   1643  1.1  skrll 
   1644  1.1  skrll static int
   1645  1.1  skrll print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
   1646  1.1  skrll 						disassemble_info *info)
   1647  1.1  skrll {
   1648  1.1  skrll   if (info->private_data == NULL
   1649  1.1  skrll       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
   1650  1.1  skrll     return -1;
   1651  1.1  skrll   return print_insn_cris_generic (vma, info, FALSE);
   1652  1.1  skrll }
   1653  1.1  skrll 
   1654  1.1  skrll /* Return a disassembler-function that prints registers with a `$' prefix,
   1655  1.1  skrll    or one that prints registers without a prefix.
   1656  1.1  skrll    FIXME: We should improve the solution to avoid the multitude of
   1657  1.1  skrll    functions seen above.  */
   1658  1.1  skrll 
   1659  1.1  skrll disassembler_ftype
   1660  1.1  skrll cris_get_disassembler (bfd *abfd)
   1661  1.1  skrll {
   1662  1.1  skrll   /* If there's no bfd in sight, we return what is valid as input in all
   1663  1.1  skrll      contexts if fed back to the assembler: disassembly *with* register
   1664  1.1  skrll      prefix.  Unfortunately this will be totally wrong for v32.  */
   1665  1.1  skrll   if (abfd == NULL)
   1666  1.1  skrll     return print_insn_cris_with_register_prefix;
   1667  1.1  skrll 
   1668  1.1  skrll   if (bfd_get_symbol_leading_char (abfd) == 0)
   1669  1.1  skrll     {
   1670  1.1  skrll       if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
   1671  1.1  skrll 	return print_insn_crisv32_with_register_prefix;
   1672  1.1  skrll       if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
   1673  1.1  skrll 	return print_insn_crisv10_v32_with_register_prefix;
   1674  1.1  skrll 
   1675  1.1  skrll       /* We default to v10.  This may be specifically specified in the
   1676  1.1  skrll 	 bfd mach, but is also the default setting.  */
   1677  1.1  skrll       return print_insn_cris_with_register_prefix;
   1678  1.1  skrll     }
   1679  1.1  skrll 
   1680  1.1  skrll   if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
   1681  1.1  skrll     return print_insn_crisv32_without_register_prefix;
   1682  1.1  skrll   if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
   1683  1.1  skrll     return print_insn_crisv10_v32_without_register_prefix;
   1684  1.1  skrll   return print_insn_cris_without_register_prefix;
   1685  1.1  skrll }
   1686  1.1  skrll 
   1687  1.1  skrll /* Local variables:
   1688  1.1  skrll    eval: (c-set-style "gnu")
   1689  1.1  skrll    indent-tabs-mode: t
   1690                End:  */
   1691