Home | History | Annotate | Download | only in opcodes
      1 /* Disassembler code for CRIS.
      2    Copyright (C) 2000-2016 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   bfd_boolean 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 bfd_boolean
    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 	    bfd_boolean 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 		bfd_boolean 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 		     bfd_boolean 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 (CONST_STRNEQ (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 	  unsigned long number
    855 	    = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
    856 	       + buffer[5] * 0x1000000 + addr);
    857 
    858 	  /* Finish off and output previous formatted bytes.  */
    859 	  *tp = 0;
    860 	  if (temp[0])
    861 	    (*info->fprintf_func) (info->stream, "%s", temp);
    862 	  tp = temp;
    863 
    864 	  (*info->print_address_func) ((bfd_vma) number, info);
    865 	}
    866 	break;
    867 
    868       case 'u':
    869 	{
    870 	  /* Like n but the offset is bits <3:0> in the instruction.  */
    871 	  unsigned long number = (buffer[0] & 0xf) * 2 + addr;
    872 
    873 	  /* Finish off and output previous formatted bytes.  */
    874 	  *tp = 0;
    875 	  if (temp[0])
    876 	    (*info->fprintf_func) (info->stream, "%s", temp);
    877 	  tp = temp;
    878 
    879 	  (*info->print_address_func) ((bfd_vma) number, info);
    880 	}
    881 	break;
    882 
    883       case 'N':
    884       case 'y':
    885       case 'Y':
    886       case 'S':
    887       case 's':
    888 	/* Any "normal" memory operand.  */
    889 	if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
    890 	  {
    891 	    /* We're looking at [pc+], i.e. we need to output an immediate
    892 	       number, where the size can depend on different things.  */
    893 	    long number;
    894 	    int signedp
    895 	      = ((*cs == 'z' && (insn & 0x20))
    896 		 || opcodep->match == BDAP_QUICK_OPCODE);
    897 	    int nbytes;
    898 
    899 	    if (opcodep->imm_oprnd_size == SIZE_FIX_32)
    900 	      nbytes = 4;
    901 	    else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
    902 	      {
    903 		const struct cris_spec_reg *sregp
    904 		  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
    905 
    906 		/* A NULL return should have been as a non-match earlier,
    907 		   so catch it as an internal error in the error-case
    908 		   below.  */
    909 		if (sregp == NULL)
    910 		  /* Whatever non-valid size.  */
    911 		  nbytes = 42;
    912 		else
    913 		  /* PC is always incremented by a multiple of two.
    914 		     For CRISv32, immediates are always 4 bytes for
    915 		     special registers.  */
    916 		  nbytes = disdata->distype == cris_dis_v32
    917 		    ? 4 : (sregp->reg_size + 1) & ~1;
    918 	      }
    919 	    else
    920 	      {
    921 		int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
    922 
    923 		if (mode_size == 1)
    924 		  nbytes = 2;
    925 		else
    926 		  nbytes = mode_size;
    927 	      }
    928 
    929 	    switch (nbytes)
    930 	      {
    931 	      case 1:
    932 		number = buffer[2];
    933 		if (signedp && number > 127)
    934 		  number -= 256;
    935 		break;
    936 
    937 	      case 2:
    938 		number = buffer[2] + buffer[3] * 256;
    939 		if (signedp && number > 32767)
    940 		  number -= 65536;
    941 		break;
    942 
    943 	      case 4:
    944 		number
    945 		  = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
    946 		  + buffer[5] * 0x1000000;
    947 		break;
    948 
    949 	      default:
    950 		strcpy (tp, "bug");
    951 		tp += 3;
    952 		number = 42;
    953 	      }
    954 
    955 	    if ((*cs == 'z' && (insn & 0x20))
    956 		|| (opcodep->match == BDAP_QUICK_OPCODE
    957 		    && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
    958 	      tp = format_dec (number, tp, signedp);
    959 	    else
    960 	      {
    961 		unsigned int highbyte = (number >> 24) & 0xff;
    962 
    963 		/* Either output this as an address or as a number.  If it's
    964 		   a dword with the same high-byte as the address of the
    965 		   insn, assume it's an address, and also if it's a non-zero
    966 		   non-0xff high-byte.  If this is a jsr or a jump, then
    967 		   it's definitely an address.  */
    968 		if (nbytes == 4
    969 		    && (highbyte == ((addr >> 24) & 0xff)
    970 			|| (highbyte != 0 && highbyte != 0xff)
    971 			|| info->insn_type == dis_branch
    972 			|| info->insn_type == dis_jsr))
    973 		  {
    974 		    /* Finish off and output previous formatted bytes.  */
    975 		    *tp = 0;
    976 		    tp = temp;
    977 		    if (temp[0])
    978 		      (*info->fprintf_func) (info->stream, "%s", temp);
    979 
    980 		    (*info->print_address_func) ((bfd_vma) number, info);
    981 
    982 		    info->target = number;
    983 		  }
    984 		else
    985 		  tp = format_hex (number, tp, disdata);
    986 	      }
    987 	  }
    988 	else
    989 	  {
    990 	    /* Not an immediate number.  Then this is a (possibly
    991 	       prefixed) memory operand.  */
    992 	    if (info->insn_type != dis_nonbranch)
    993 	      {
    994 		int mode_size
    995 		  = 1 << ((insn >> 4)
    996 			  & (opcodep->args[0] == 'z' ? 1 : 3));
    997 		int size;
    998 		info->insn_type = dis_dref;
    999 		info->flags |= CRIS_DIS_FLAG_MEMREF;
   1000 
   1001 		if (opcodep->imm_oprnd_size == SIZE_FIX_32)
   1002 		  size = 4;
   1003 		else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
   1004 		  {
   1005 		    const struct cris_spec_reg *sregp
   1006 		      = spec_reg_info ((insn >> 12) & 15, disdata->distype);
   1007 
   1008 		    /* FIXME: Improve error handling; should have been caught
   1009 		       earlier.  */
   1010 		    if (sregp == NULL)
   1011 		      size = 4;
   1012 		    else
   1013 		      size = sregp->reg_size;
   1014 		  }
   1015 		else
   1016 		  size = mode_size;
   1017 
   1018 		info->data_size = size;
   1019 	      }
   1020 
   1021 	    *tp++ = '[';
   1022 
   1023 	    if (prefix_opcodep
   1024 		/* We don't match dip with a postincremented field
   1025 		   as a side-effect address mode.  */
   1026 		&& ((insn & 0x400) == 0
   1027 		    || prefix_opcodep->match != DIP_OPCODE))
   1028 	      {
   1029 		if (insn & 0x400)
   1030 		  {
   1031 		    tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
   1032 		    *tp++ = '=';
   1033 		  }
   1034 
   1035 
   1036 		/* We mainly ignore the prefix format string when the
   1037 		   address-mode syntax is output.  */
   1038 		switch (prefix_opcodep->match)
   1039 		  {
   1040 		  case DIP_OPCODE:
   1041 		    /* It's [r], [r+] or [pc+].  */
   1042 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
   1043 		      {
   1044 			/* It's [pc+].  This cannot possibly be anything
   1045 			   but an address.  */
   1046 			unsigned long number
   1047 			  = prefix_buffer[2] + prefix_buffer[3] * 256
   1048 			  + prefix_buffer[4] * 65536
   1049 			  + prefix_buffer[5] * 0x1000000;
   1050 
   1051 			info->target = (bfd_vma) number;
   1052 
   1053 			/* Finish off and output previous formatted
   1054 			   data.  */
   1055 			*tp = 0;
   1056 			tp = temp;
   1057 			if (temp[0])
   1058 			  (*info->fprintf_func) (info->stream, "%s", temp);
   1059 
   1060 			(*info->print_address_func) ((bfd_vma) number, info);
   1061 		      }
   1062 		    else
   1063 		      {
   1064 			/* For a memref in an address, we use target2.
   1065 			   In this case, target is zero.  */
   1066 			info->flags
   1067 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
   1068 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
   1069 
   1070 			info->target2 = prefix_insn & 15;
   1071 
   1072 			*tp++ = '[';
   1073 			tp = format_reg (disdata, prefix_insn & 15, tp,
   1074 					 with_reg_prefix);
   1075 			if (prefix_insn & 0x400)
   1076 			  *tp++ = '+';
   1077 			*tp++ = ']';
   1078 		      }
   1079 		    break;
   1080 
   1081 		  case BDAP_QUICK_OPCODE:
   1082 		    {
   1083 		      int number;
   1084 
   1085 		      number = prefix_buffer[0];
   1086 		      if (number > 127)
   1087 			number -= 256;
   1088 
   1089 		      /* Output "reg+num" or, if num < 0, "reg-num".  */
   1090 		      tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
   1091 				       with_reg_prefix);
   1092 		      if (number >= 0)
   1093 			*tp++ = '+';
   1094 		      tp = format_dec (number, tp, 1);
   1095 
   1096 		      info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
   1097 		      info->target = (prefix_insn >> 12) & 15;
   1098 		      info->target2 = (bfd_vma) number;
   1099 		      break;
   1100 		    }
   1101 
   1102 		  case BIAP_OPCODE:
   1103 		    /* Output "r+R.m".  */
   1104 		    tp = format_reg (disdata, prefix_insn & 15, tp,
   1105 				     with_reg_prefix);
   1106 		    *tp++ = '+';
   1107 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
   1108 				     with_reg_prefix);
   1109 		    *tp++ = '.';
   1110 		    *tp++ = mode_char[(prefix_insn >> 4) & 3];
   1111 
   1112 		    info->flags
   1113 		      |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
   1114 			  | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
   1115 
   1116 			  | ((prefix_insn & 0x8000)
   1117 			     ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
   1118 			     : ((prefix_insn & 0x8000)
   1119 				? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
   1120 
   1121 		    /* Is it the casejump?  It's a "adds.w [pc+r%d.w],pc".  */
   1122 		    if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
   1123 		      /* Then start interpreting data as offsets.  */
   1124 		      case_offset_counter = no_of_case_offsets;
   1125 		    break;
   1126 
   1127 		  case BDAP_INDIR_OPCODE:
   1128 		    /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
   1129 		       "r-s".  */
   1130 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
   1131 				     with_reg_prefix);
   1132 
   1133 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
   1134 		      {
   1135 			long number;
   1136 			unsigned int nbytes;
   1137 
   1138 			/* It's a value.  Get its size.  */
   1139 			int mode_size = 1 << ((prefix_insn >> 4) & 3);
   1140 
   1141 			if (mode_size == 1)
   1142 			  nbytes = 2;
   1143 			else
   1144 			  nbytes = mode_size;
   1145 
   1146 			switch (nbytes)
   1147 			  {
   1148 			  case 1:
   1149 			    number = prefix_buffer[2];
   1150 			    if (number > 127)
   1151 			      number -= 256;
   1152 			    break;
   1153 
   1154 			  case 2:
   1155 			    number = prefix_buffer[2] + prefix_buffer[3] * 256;
   1156 			    if (number > 32767)
   1157 			      number -= 65536;
   1158 			    break;
   1159 
   1160 			  case 4:
   1161 			    number
   1162 			      = prefix_buffer[2] + prefix_buffer[3] * 256
   1163 			      + prefix_buffer[4] * 65536
   1164 			      + prefix_buffer[5] * 0x1000000;
   1165 			    break;
   1166 
   1167 			  default:
   1168 			    strcpy (tp, "bug");
   1169 			    tp += 3;
   1170 			    number = 42;
   1171 			  }
   1172 
   1173 			info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
   1174 			info->target2 = (bfd_vma) number;
   1175 
   1176 			/* If the size is dword, then assume it's an
   1177 			   address.  */
   1178 			if (nbytes == 4)
   1179 			  {
   1180 			    /* Finish off and output previous formatted
   1181 			       bytes.  */
   1182 			    *tp++ = '+';
   1183 			    *tp = 0;
   1184 			    tp = temp;
   1185 			    (*info->fprintf_func) (info->stream, "%s", temp);
   1186 
   1187 			    (*info->print_address_func) ((bfd_vma) number, info);
   1188 			  }
   1189 			else
   1190 			  {
   1191 			    if (number >= 0)
   1192 			      *tp++ = '+';
   1193 			    tp = format_dec (number, tp, 1);
   1194 			  }
   1195 		      }
   1196 		    else
   1197 		      {
   1198 			/* Output "r+[R].m" or "r+[R+].m".  */
   1199 			*tp++ = '+';
   1200 			*tp++ = '[';
   1201 			tp = format_reg (disdata, prefix_insn & 15, tp,
   1202 					 with_reg_prefix);
   1203 			if (prefix_insn & 0x400)
   1204 			  *tp++ = '+';
   1205 			*tp++ = ']';
   1206 			*tp++ = '.';
   1207 			*tp++ = mode_char[(prefix_insn >> 4) & 3];
   1208 
   1209 			info->flags
   1210 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
   1211 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM
   1212 			      | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
   1213 
   1214 			      | (((prefix_insn >> 4) == 2)
   1215 				 ? 0
   1216 				 : (((prefix_insn >> 4) & 3) == 1
   1217 				    ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
   1218 				    : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
   1219 		      }
   1220 		    break;
   1221 
   1222 		  default:
   1223 		    (*info->fprintf_func) (info->stream, "?prefix-bug");
   1224 		  }
   1225 
   1226 		/* To mark that the prefix is used, reset it.  */
   1227 		prefix_opcodep = NULL;
   1228 	      }
   1229 	    else
   1230 	      {
   1231 		tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
   1232 
   1233 		info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
   1234 		info->target = insn & 15;
   1235 
   1236 		if (insn & 0x400)
   1237 		  *tp++ = '+';
   1238 	      }
   1239 	    *tp++ = ']';
   1240 	  }
   1241 	break;
   1242 
   1243       case 'x':
   1244 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
   1245 	*tp++ = '.';
   1246 	*tp++ = mode_char[(insn >> 4) & 3];
   1247 	break;
   1248 
   1249       case 'I':
   1250 	tp = format_dec (insn & 63, tp, 0);
   1251 	break;
   1252 
   1253       case 'b':
   1254 	{
   1255 	  int where = buffer[2] + buffer[3] * 256;
   1256 
   1257 	  if (where > 32767)
   1258 	    where -= 65536;
   1259 
   1260 	  where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
   1261 
   1262 	  if (insn == BA_PC_INCR_OPCODE)
   1263 	    info->insn_type = dis_branch;
   1264 	  else
   1265 	    info->insn_type = dis_condbranch;
   1266 
   1267 	  info->target = (bfd_vma) where;
   1268 
   1269 	  *tp = 0;
   1270 	  tp = temp;
   1271 	  (*info->fprintf_func) (info->stream, "%s%s ",
   1272 				 temp, cris_cc_strings[insn >> 12]);
   1273 
   1274 	  (*info->print_address_func) ((bfd_vma) where, info);
   1275 	}
   1276       break;
   1277 
   1278     case 'c':
   1279       tp = format_dec (insn & 31, tp, 0);
   1280       break;
   1281 
   1282     case 'C':
   1283       tp = format_dec (insn & 15, tp, 0);
   1284       break;
   1285 
   1286     case 'o':
   1287       {
   1288 	long offset = insn & 0xfe;
   1289 	bfd_vma target;
   1290 
   1291 	if (insn & 1)
   1292 	  offset |= ~0xff;
   1293 
   1294 	if (opcodep->match == BA_QUICK_OPCODE)
   1295 	  info->insn_type = dis_branch;
   1296 	else
   1297 	  info->insn_type = dis_condbranch;
   1298 
   1299 	target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
   1300 	info->target = target;
   1301 	*tp = 0;
   1302 	tp = temp;
   1303 	(*info->fprintf_func) (info->stream, "%s", temp);
   1304 	(*info->print_address_func) (target, info);
   1305       }
   1306       break;
   1307 
   1308     case 'Q':
   1309     case 'O':
   1310       {
   1311 	long number = buffer[0];
   1312 
   1313 	if (number > 127)
   1314 	  number = number - 256;
   1315 
   1316 	tp = format_dec (number, tp, 1);
   1317 	*tp++ = ',';
   1318 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
   1319       }
   1320       break;
   1321 
   1322     case 'f':
   1323       tp = print_flags (disdata, insn, tp);
   1324       break;
   1325 
   1326     case 'i':
   1327       tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
   1328       break;
   1329 
   1330     case 'P':
   1331       {
   1332 	const struct cris_spec_reg *sregp
   1333 	  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
   1334 
   1335 	if (sregp->name == NULL)
   1336 	  /* Should have been caught as a non-match eariler.  */
   1337 	  *tp++ = '?';
   1338 	else
   1339 	  {
   1340 	    if (with_reg_prefix)
   1341 	      *tp++ = REGISTER_PREFIX_CHAR;
   1342 	    strcpy (tp, sregp->name);
   1343 	    tp += strlen (tp);
   1344 	  }
   1345       }
   1346       break;
   1347 
   1348     default:
   1349       strcpy (tp, "???");
   1350       tp += 3;
   1351     }
   1352   }
   1353 
   1354   *tp = 0;
   1355 
   1356   if (prefix_opcodep)
   1357     (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
   1358 			   prefix_opcodep->name, prefix_opcodep->args);
   1359 
   1360   (*info->fprintf_func) (info->stream, "%s", temp);
   1361 
   1362   /* Get info for matching case-tables, if we don't have any active.
   1363      We assume that the last constant seen is used; either in the insn
   1364      itself or in a "move.d const,rN, sub.d rN,rM"-like sequence.  */
   1365   if (TRACE_CASE && case_offset_counter == 0)
   1366     {
   1367       if (CONST_STRNEQ (opcodep->name, "sub"))
   1368 	case_offset = last_immediate;
   1369 
   1370       /* It could also be an "add", if there are negative case-values.  */
   1371       else if (CONST_STRNEQ (opcodep->name, "add"))
   1372 	/* The first case is the negated operand to the add.  */
   1373 	case_offset = -last_immediate;
   1374 
   1375       /* A bound insn will tell us the number of cases.  */
   1376       else if (CONST_STRNEQ (opcodep->name, "bound"))
   1377 	no_of_case_offsets = last_immediate + 1;
   1378 
   1379       /* A jump or jsr or branch breaks the chain of insns for a
   1380 	 case-table, so assume default first-case again.  */
   1381       else if (info->insn_type == dis_jsr
   1382 	       || info->insn_type == dis_branch
   1383 	       || info->insn_type == dis_condbranch)
   1384 	case_offset = 0;
   1385     }
   1386 }
   1387 
   1388 
   1389 /* Print the CRIS instruction at address memaddr on stream.  Returns
   1390    length of the instruction, in bytes.  Prefix register names with `$' if
   1391    WITH_REG_PREFIX.  */
   1392 
   1393 static int
   1394 print_insn_cris_generic (bfd_vma memaddr,
   1395 			 disassemble_info *info,
   1396 			 bfd_boolean with_reg_prefix)
   1397 {
   1398   int nbytes;
   1399   unsigned int insn;
   1400   const struct cris_opcode *matchedp;
   1401   int advance = 0;
   1402   struct cris_disasm_data *disdata
   1403     = (struct cris_disasm_data *) info->private_data;
   1404 
   1405   /* No instruction will be disassembled as longer than this number of
   1406      bytes; stacked prefixes will not be expanded.  */
   1407   unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
   1408   unsigned char *bufp;
   1409   int status = 0;
   1410   bfd_vma addr;
   1411 
   1412   /* There will be an "out of range" error after the last instruction.
   1413      Reading pairs of bytes in decreasing number, we hope that we will get
   1414      at least the amount that we will consume.
   1415 
   1416      If we can't get any data, or we do not get enough data, we print
   1417      the error message.  */
   1418 
   1419   for (nbytes = MAX_BYTES_PER_CRIS_INSN; nbytes > 0; nbytes -= 2)
   1420     {
   1421       status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
   1422       if (status == 0)
   1423 	break;
   1424     }
   1425 
   1426   /* If we did not get all we asked for, then clear the rest.
   1427      Hopefully this makes a reproducible result in case of errors.  */
   1428   if (nbytes != MAX_BYTES_PER_CRIS_INSN)
   1429     memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
   1430 
   1431   addr = memaddr;
   1432   bufp = buffer;
   1433 
   1434   /* Set some defaults for the insn info.  */
   1435   info->insn_info_valid = 1;
   1436   info->branch_delay_insns = 0;
   1437   info->data_size = 0;
   1438   info->insn_type = dis_nonbranch;
   1439   info->flags = 0;
   1440   info->target = 0;
   1441   info->target2 = 0;
   1442 
   1443   /* If we got any data, disassemble it.  */
   1444   if (nbytes != 0)
   1445     {
   1446       matchedp = NULL;
   1447 
   1448       insn = bufp[0] + bufp[1] * 256;
   1449 
   1450       /* If we're in a case-table, don't disassemble the offsets.  */
   1451       if (TRACE_CASE && case_offset_counter != 0)
   1452 	{
   1453 	  info->insn_type = dis_noninsn;
   1454 	  advance += 2;
   1455 
   1456 	  /* If to print data as offsets, then shortcut here.  */
   1457 	  (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
   1458 				 case_offset + no_of_case_offsets
   1459 				 - case_offset_counter,
   1460 				 case_offset_counter == 1 ? "/default" :
   1461 				 "");
   1462 
   1463 	  (*info->print_address_func) ((bfd_vma)
   1464 				       ((short) (insn)
   1465 					+ (long) (addr
   1466 						  - (no_of_case_offsets
   1467 						     - case_offset_counter)
   1468 						  * 2)), info);
   1469 	  case_offset_counter--;
   1470 
   1471 	  /* The default case start (without a "sub" or "add") must be
   1472 	     zero.  */
   1473 	  if (case_offset_counter == 0)
   1474 	    case_offset = 0;
   1475 	}
   1476       else if (insn == 0)
   1477 	{
   1478 	  /* We're often called to disassemble zeroes.  While this is a
   1479 	     valid "bcc .+2" insn, it is also useless enough and enough
   1480 	     of a nuiscance that we will just output "bcc .+2" for it
   1481 	     and signal it as a noninsn.  */
   1482 	  (*info->fprintf_func) (info->stream,
   1483 				 disdata->distype == cris_dis_v32
   1484 				 ? "bcc ." : "bcc .+2");
   1485 	  info->insn_type = dis_noninsn;
   1486 	  advance += 2;
   1487 	}
   1488       else
   1489 	{
   1490 	  const struct cris_opcode *prefix_opcodep = NULL;
   1491 	  unsigned char *prefix_buffer = bufp;
   1492 	  unsigned int prefix_insn = insn;
   1493 	  int prefix_size = 0;
   1494 
   1495 	  matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
   1496 
   1497 	  /* Check if we're supposed to write out prefixes as address
   1498 	     modes and if this was a prefix.  */
   1499 	  if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
   1500 	    {
   1501 	      /* If it's a prefix, put it into the prefix vars and get the
   1502 		 main insn.  */
   1503 	      prefix_size = bytes_to_skip (prefix_insn, matchedp,
   1504 					   disdata->distype, NULL);
   1505 	      prefix_opcodep = matchedp;
   1506 
   1507 	      insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
   1508 	      matchedp = get_opcode_entry (insn, prefix_insn, disdata);
   1509 
   1510 	      if (matchedp != NULL)
   1511 		{
   1512 		  addr += prefix_size;
   1513 		  bufp += prefix_size;
   1514 		  advance += prefix_size;
   1515 		}
   1516 	      else
   1517 		{
   1518 		  /* The "main" insn wasn't valid, at least not when
   1519 		     prefixed.  Put back things enough to output the
   1520 		     prefix insn only, as a normal insn.  */
   1521 		  matchedp = prefix_opcodep;
   1522 		  insn = prefix_insn;
   1523 		  prefix_opcodep = NULL;
   1524 		}
   1525 	    }
   1526 
   1527 	  if (matchedp == NULL)
   1528 	    {
   1529 	      (*info->fprintf_func) (info->stream, "??0x%x", insn);
   1530 	      advance += 2;
   1531 
   1532 	      info->insn_type = dis_noninsn;
   1533 	    }
   1534 	  else
   1535 	    {
   1536 	      advance
   1537 		+= bytes_to_skip (insn, matchedp, disdata->distype,
   1538 				  prefix_opcodep);
   1539 
   1540 	      /* The info_type and assorted fields will be set according
   1541 		 to the operands.   */
   1542 	      print_with_operands (matchedp, insn, bufp, addr, info,
   1543 				   prefix_opcodep, prefix_insn,
   1544 				   prefix_buffer, with_reg_prefix);
   1545 	    }
   1546 	}
   1547     }
   1548   else
   1549     info->insn_type = dis_noninsn;
   1550 
   1551   /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
   1552      status when reading that much, and the insn decoding indicated a
   1553      length exceeding what we read, there is an error.  */
   1554   if (status != 0 && (nbytes == 0 || advance > nbytes))
   1555     {
   1556       (*info->memory_error_func) (status, memaddr, info);
   1557       return -1;
   1558     }
   1559 
   1560   /* Max supported insn size with one folded prefix insn.  */
   1561   info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
   1562 
   1563   /* I would like to set this to a fixed value larger than the actual
   1564      number of bytes to print in order to avoid spaces between bytes,
   1565      but objdump.c (2.9.1) does not like that, so we print 16-bit
   1566      chunks, which is the next choice.  */
   1567   info->bytes_per_chunk = 2;
   1568 
   1569   /* Printing bytes in order of increasing addresses makes sense,
   1570      especially on a little-endian target.
   1571      This is completely the opposite of what you think; setting this to
   1572      BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
   1573      we want.  */
   1574   info->display_endian = BFD_ENDIAN_BIG;
   1575 
   1576   return advance;
   1577 }
   1578 
   1579 /* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
   1580 
   1581 static int
   1582 print_insn_cris_with_register_prefix (bfd_vma vma,
   1583 				      disassemble_info *info)
   1584 {
   1585   if (info->private_data == NULL
   1586       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
   1587     return -1;
   1588   return print_insn_cris_generic (vma, info, TRUE);
   1589 }
   1590 
   1591 /* Disassemble, prefixing register names with `$'.  CRIS v32.  */
   1592 
   1593 static int
   1594 print_insn_crisv32_with_register_prefix (bfd_vma vma,
   1595 					 disassemble_info *info)
   1596 {
   1597   if (info->private_data == NULL
   1598       && !cris_parse_disassembler_options (info, cris_dis_v32))
   1599     return -1;
   1600   return print_insn_cris_generic (vma, info, TRUE);
   1601 }
   1602 
   1603 /* Disassemble, prefixing register names with `$'.
   1604    Common v10 and v32 subset.  */
   1605 
   1606 static int
   1607 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
   1608 					     disassemble_info *info)
   1609 {
   1610   if (info->private_data == NULL
   1611       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
   1612     return -1;
   1613   return print_insn_cris_generic (vma, info, TRUE);
   1614 }
   1615 
   1616 /* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
   1617 
   1618 static int
   1619 print_insn_cris_without_register_prefix (bfd_vma vma,
   1620 					 disassemble_info *info)
   1621 {
   1622   if (info->private_data == NULL
   1623       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
   1624     return -1;
   1625   return print_insn_cris_generic (vma, info, FALSE);
   1626 }
   1627 
   1628 /* Disassemble, no prefixes on register names.  CRIS v32.  */
   1629 
   1630 static int
   1631 print_insn_crisv32_without_register_prefix (bfd_vma vma,
   1632 					    disassemble_info *info)
   1633 {
   1634   if (info->private_data == NULL
   1635       && !cris_parse_disassembler_options (info, cris_dis_v32))
   1636     return -1;
   1637   return print_insn_cris_generic (vma, info, FALSE);
   1638 }
   1639 
   1640 /* Disassemble, no prefixes on register names.
   1641    Common v10 and v32 subset.  */
   1642 
   1643 static int
   1644 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
   1645 						disassemble_info *info)
   1646 {
   1647   if (info->private_data == NULL
   1648       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
   1649     return -1;
   1650   return print_insn_cris_generic (vma, info, FALSE);
   1651 }
   1652 
   1653 /* Return a disassembler-function that prints registers with a `$' prefix,
   1654    or one that prints registers without a prefix.
   1655    FIXME: We should improve the solution to avoid the multitude of
   1656    functions seen above.  */
   1657 
   1658 disassembler_ftype
   1659 cris_get_disassembler (bfd *abfd)
   1660 {
   1661   /* If there's no bfd in sight, we return what is valid as input in all
   1662      contexts if fed back to the assembler: disassembly *with* register
   1663      prefix.  Unfortunately this will be totally wrong for v32.  */
   1664   if (abfd == NULL)
   1665     return print_insn_cris_with_register_prefix;
   1666 
   1667   if (bfd_get_symbol_leading_char (abfd) == 0)
   1668     {
   1669       if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
   1670 	return print_insn_crisv32_with_register_prefix;
   1671       if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
   1672 	return print_insn_crisv10_v32_with_register_prefix;
   1673 
   1674       /* We default to v10.  This may be specifically specified in the
   1675 	 bfd mach, but is also the default setting.  */
   1676       return print_insn_cris_with_register_prefix;
   1677     }
   1678 
   1679   if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
   1680     return print_insn_crisv32_without_register_prefix;
   1681   if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
   1682     return print_insn_crisv10_v32_without_register_prefix;
   1683   return print_insn_cris_without_register_prefix;
   1684 }
   1685 
   1686 /* Local variables:
   1687    eval: (c-set-style "gnu")
   1688    indent-tabs-mode: t
   1689    End:  */
   1690