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