OSDN Git Service

opcode/
[pf3gnuchains/pf3gnuchains4x.git] / opcodes / cris-dis.c
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 \f
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
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:  */