1 /* Disassembler code for CRIS.
2    Copyright 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009
3    Free Software Foundation, Inc.
4    Contributed by Axis Communications AB, Lund, Sweden.
5    Written by Hans-Peter Nilsson.
6 
7    This file is part of the GNU opcodes library.
8 
9    This library is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3, or (at your option)
12    any later version.
13 
14    It is distributed in the hope that it will be useful, but WITHOUT
15    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17    License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22    MA 02110-1301, USA.  */
23 
24 #include "dis-asm.h"
25 #include "sysdep.h"
26 #include "opcode/cris.h"
27 #include "libiberty.h"
28 
29 /* 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
cris_parse_disassembler_options(disassemble_info * info,enum cris_disass_family distype)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 *
spec_reg_info(unsigned int sreg,enum cris_disass_family distype)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
number_of_bits(unsigned int val)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 *
get_opcode_entry(unsigned int insn,unsigned int prefix_insn,struct cris_disasm_data * disdata)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
cris_constraint(const char * cs,unsigned int insn,unsigned int prefix_insn,struct cris_disasm_data * disdata)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 *
format_hex(unsigned long number,char * outbuffer,struct cris_disasm_data * disdata)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 *
format_dec(long number,char * outbuffer,int signedp)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 *
format_reg(struct cris_disasm_data * disdata,int regno,char * outbuffer_start,bfd_boolean with_reg_prefix)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 *
format_sup_reg(unsigned int regno,char * outbuffer_start,bfd_boolean with_reg_prefix)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
bytes_to_skip(unsigned int insn,const struct cris_opcode * matchedp,enum cris_disass_family distype,const struct cris_opcode * prefix_matchedp)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 *
print_flags(struct cris_disasm_data * disdata,unsigned int insn,char * cp)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
print_with_operands(const struct cris_opcode * opcodep,unsigned int insn,unsigned char * buffer,bfd_vma addr,disassemble_info * info,const struct cris_opcode * prefix_opcodep,unsigned int prefix_insn,unsigned char * prefix_buffer,bfd_boolean with_reg_prefix)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
print_insn_cris_generic(bfd_vma memaddr,disassemble_info * info,bfd_boolean with_reg_prefix)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
print_insn_cris_with_register_prefix(bfd_vma vma,disassemble_info * info)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
print_insn_crisv32_with_register_prefix(bfd_vma vma,disassemble_info * info)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
print_insn_crisv10_v32_with_register_prefix(bfd_vma vma,disassemble_info * info)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
print_insn_cris_without_register_prefix(bfd_vma vma,disassemble_info * info)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
print_insn_crisv32_without_register_prefix(bfd_vma vma,disassemble_info * info)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
print_insn_crisv10_v32_without_register_prefix(bfd_vma vma,disassemble_info * info)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
cris_get_disassembler(bfd * abfd)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