Change source files over to GPLv3.
[platform/upstream/binutils.git] / opcodes / cris-dis.c
1 /* Disassembler code for CRIS.
2    Copyright 2000, 2001, 2002, 2004, 2005, 2006, 2007
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   sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
585
586   return outbuffer + strlen (outbuffer);
587 }
588
589 /* Format the name of the general register regno into outbuffer.  */
590
591 static char *
592 format_reg (struct cris_disasm_data *disdata,
593             int regno,
594             char *outbuffer_start,
595             bfd_boolean with_reg_prefix)
596 {
597   char *outbuffer = outbuffer_start;
598
599   if (with_reg_prefix)
600     *outbuffer++ = REGISTER_PREFIX_CHAR;
601
602   switch (regno)
603     {
604     case 15:
605       /* For v32, there is no context in which we output PC.  */
606       if (disdata->distype == cris_dis_v32)
607         strcpy (outbuffer, "acr");
608       else
609         strcpy (outbuffer, "pc");
610       break;
611
612     case 14:
613       strcpy (outbuffer, "sp");
614       break;
615
616     default:
617       sprintf (outbuffer, "r%d", regno);
618       break;
619     }
620
621   return outbuffer_start + strlen (outbuffer_start);
622 }
623
624 /* Format the name of a support register into outbuffer.  */
625
626 static char *
627 format_sup_reg (unsigned int regno,
628                 char *outbuffer_start,
629                 bfd_boolean with_reg_prefix)
630 {
631   char *outbuffer = outbuffer_start;
632   int i;
633
634   if (with_reg_prefix)
635     *outbuffer++ = REGISTER_PREFIX_CHAR;
636
637   for (i = 0; cris_support_regs[i].name != NULL; i++)
638     if (cris_support_regs[i].number == regno)
639       {
640         sprintf (outbuffer, "%s", cris_support_regs[i].name);
641         return outbuffer_start + strlen (outbuffer_start);
642       }
643
644   /* There's supposed to be register names covering all numbers, though
645      some may be generic names.  */
646   sprintf (outbuffer, "format_sup_reg-BUG");
647   return outbuffer_start + strlen (outbuffer_start);
648 }
649
650 /* Return the length of an instruction.  */
651
652 static unsigned
653 bytes_to_skip (unsigned int insn,
654                const struct cris_opcode *matchedp,
655                enum cris_disass_family distype,
656                const struct cris_opcode *prefix_matchedp)
657 {
658   /* Each insn is a word plus "immediate" operands.  */
659   unsigned to_skip = 2;
660   const char *template = matchedp->args;
661   const char *s;
662
663   for (s = template; *s; s++)
664     if ((*s == 's' || *s == 'N' || *s == 'Y')
665         && (insn & 0x400) && (insn & 15) == 15
666         && prefix_matchedp == NULL)
667       {
668         /* Immediate via [pc+], so we have to check the size of the
669            operand.  */
670         int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
671
672         if (matchedp->imm_oprnd_size == SIZE_FIX_32)
673           to_skip += 4;
674         else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
675           {
676             const struct cris_spec_reg *sregp
677               = spec_reg_info ((insn >> 12) & 15, distype);
678
679             /* FIXME: Improve error handling; should have been caught
680                earlier.  */
681             if (sregp == NULL)
682               return 2;
683
684             /* PC is incremented by two, not one, for a byte.  Except on
685                CRISv32, where constants are always DWORD-size for
686                special registers.  */
687             to_skip +=
688               distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
689           }
690         else
691           to_skip += (mode_size + 1) & ~1;
692       }
693     else if (*s == 'n')
694       to_skip += 4;
695     else if (*s == 'b')
696       to_skip += 2;
697
698   return to_skip;
699 }
700
701 /* Print condition code flags.  */
702
703 static char *
704 print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
705 {
706   /* Use the v8 (Etrax 100) flag definitions for disassembly.
707      The differences with v0 (Etrax 1..4) vs. Svinto are:
708       v0 'd' <=> v8 'm'
709       v0 'e' <=> v8 'b'.
710      FIXME: Emit v0..v3 flag names somehow.  */
711   static const char v8_fnames[] = "cvznxibm";
712   static const char v32_fnames[] = "cvznxiup";
713   const char *fnames
714     = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
715
716   unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
717   int i;
718
719   for (i = 0; i < 8; i++)
720     if (flagbits & (1 << i))
721       *cp++ = fnames[i];
722
723   return cp;
724 }
725
726 /* Print out an insn with its operands, and update the info->insn_type
727    fields.  The prefix_opcodep and the rest hold a prefix insn that is
728    supposed to be output as an address mode.  */
729
730 static void
731 print_with_operands (const struct cris_opcode *opcodep,
732                      unsigned int insn,
733                      unsigned char *buffer,
734                      bfd_vma addr,
735                      disassemble_info *info,
736                      /* If a prefix insn was before this insn (and is supposed
737                         to be output as an address), here is a description of
738                         it.  */
739                      const struct cris_opcode *prefix_opcodep,
740                      unsigned int prefix_insn,
741                      unsigned char *prefix_buffer,
742                      bfd_boolean with_reg_prefix)
743 {
744   /* Get a buffer of somewhat reasonable size where we store
745      intermediate parts of the insn.  */
746   char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
747   char *tp = temp;
748   static const char mode_char[] = "bwd?";
749   const char *s;
750   const char *cs;
751   struct cris_disasm_data *disdata
752     = (struct cris_disasm_data *) info->private_data;
753
754   /* Print out the name first thing we do.  */
755   (*info->fprintf_func) (info->stream, "%s", opcodep->name);
756
757   cs = opcodep->args;
758   s = cs;
759
760   /* Ignore any prefix indicator.  */
761   if (*s == 'p')
762     s++;
763
764   if (*s == 'm' || *s == 'M' || *s == 'z')
765     {
766       *tp++ = '.';
767
768       /* Get the size-letter.  */
769       *tp++ = *s == 'M'
770         ? (insn & 0x8000 ? 'd'
771            : insn & 0x4000 ? 'w' : 'b')
772         : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
773
774       /* Ignore the size and the space character that follows.  */
775       s += 2;
776     }
777
778   /* Add a space if this isn't a long-branch, because for those will add
779      the condition part of the name later.  */
780   if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
781     *tp++ = ' ';
782
783   /* Fill in the insn-type if deducible from the name (and there's no
784      better way).  */
785   if (opcodep->name[0] == 'j')
786     {
787       if (CONST_STRNEQ (opcodep->name, "jsr"))
788         /* It's "jsr" or "jsrc".  */
789         info->insn_type = dis_jsr;
790       else
791         /* Any other jump-type insn is considered a branch.  */
792         info->insn_type = dis_branch;
793     }
794
795   /* We might know some more fields right now.  */
796   info->branch_delay_insns = opcodep->delayed;
797
798   /* Handle operands.  */
799   for (; *s; s++)
800     {
801     switch (*s)
802       {
803       case 'T':
804         tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
805         break;
806
807       case 'A':
808         if (with_reg_prefix)
809           *tp++ = REGISTER_PREFIX_CHAR;
810         *tp++ = 'a';
811         *tp++ = 'c';
812         *tp++ = 'r';
813         break;
814         
815       case '[':
816       case ']':
817       case ',':
818         *tp++ = *s;
819         break;
820
821       case '!':
822         /* Ignore at this point; used at earlier stages to avoid
823            recognition if there's a prefix at something that in other
824            ways looks like a "pop".  */
825         break;
826
827       case 'd':
828         /* Ignore.  This is an optional ".d " on the large one of
829            relaxable insns.  */
830         break;
831
832       case 'B':
833         /* This was the prefix that made this a "push".  We've already
834            handled it by recognizing it, so signal that the prefix is
835            handled by setting it to NULL.  */
836         prefix_opcodep = NULL;
837         break;
838
839       case 'D':
840       case 'r':
841         tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
842         break;
843
844       case 'R':
845         tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
846         break;
847
848       case 'n':
849         {
850           /* Like N but pc-relative to the start of the insn.  */
851           unsigned long number
852             = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
853                + buffer[5] * 0x1000000 + addr);
854
855           /* Finish off and output previous formatted bytes.  */
856           *tp = 0;
857           if (temp[0])
858             (*info->fprintf_func) (info->stream, "%s", temp);
859           tp = temp;
860
861           (*info->print_address_func) ((bfd_vma) number, info);
862         }
863         break;
864
865       case 'u':
866         {
867           /* Like n but the offset is bits <3:0> in the instruction.  */
868           unsigned long number = (buffer[0] & 0xf) * 2 + addr;
869
870           /* Finish off and output previous formatted bytes.  */
871           *tp = 0;
872           if (temp[0])
873             (*info->fprintf_func) (info->stream, "%s", temp);
874           tp = temp;
875
876           (*info->print_address_func) ((bfd_vma) number, info);
877         }
878         break;
879
880       case 'N':
881       case 'y':
882       case 'Y':
883       case 'S':
884       case 's':
885         /* Any "normal" memory operand.  */
886         if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
887           {
888             /* We're looking at [pc+], i.e. we need to output an immediate
889                number, where the size can depend on different things.  */
890             long number;
891             int signedp
892               = ((*cs == 'z' && (insn & 0x20))
893                  || opcodep->match == BDAP_QUICK_OPCODE);
894             int nbytes;
895
896             if (opcodep->imm_oprnd_size == SIZE_FIX_32)
897               nbytes = 4;
898             else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
899               {
900                 const struct cris_spec_reg *sregp
901                   = spec_reg_info ((insn >> 12) & 15, disdata->distype);
902
903                 /* A NULL return should have been as a non-match earlier,
904                    so catch it as an internal error in the error-case
905                    below.  */
906                 if (sregp == NULL)
907                   /* Whatever non-valid size.  */
908                   nbytes = 42;
909                 else
910                   /* PC is always incremented by a multiple of two.
911                      For CRISv32, immediates are always 4 bytes for
912                      special registers.  */
913                   nbytes = disdata->distype == cris_dis_v32
914                     ? 4 : (sregp->reg_size + 1) & ~1;
915               }
916             else
917               {
918                 int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
919
920                 if (mode_size == 1)
921                   nbytes = 2;
922                 else
923                   nbytes = mode_size;
924               }
925
926             switch (nbytes)
927               {
928               case 1:
929                 number = buffer[2];
930                 if (signedp && number > 127)
931                   number -= 256;
932                 break;
933
934               case 2:
935                 number = buffer[2] + buffer[3] * 256;
936                 if (signedp && number > 32767)
937                   number -= 65536;
938                 break;
939
940               case 4:
941                 number
942                   = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
943                   + buffer[5] * 0x1000000;
944                 break;
945
946               default:
947                 strcpy (tp, "bug");
948                 tp += 3;
949                 number = 42;
950               }
951
952             if ((*cs == 'z' && (insn & 0x20))
953                 || (opcodep->match == BDAP_QUICK_OPCODE
954                     && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
955               tp = format_dec (number, tp, signedp);
956             else
957               {
958                 unsigned int highbyte = (number >> 24) & 0xff;
959
960                 /* Either output this as an address or as a number.  If it's
961                    a dword with the same high-byte as the address of the
962                    insn, assume it's an address, and also if it's a non-zero
963                    non-0xff high-byte.  If this is a jsr or a jump, then
964                    it's definitely an address.  */
965                 if (nbytes == 4
966                     && (highbyte == ((addr >> 24) & 0xff)
967                         || (highbyte != 0 && highbyte != 0xff)
968                         || info->insn_type == dis_branch
969                         || info->insn_type == dis_jsr))
970                   {
971                     /* Finish off and output previous formatted bytes.  */
972                     *tp = 0;
973                     tp = temp;
974                     if (temp[0])
975                       (*info->fprintf_func) (info->stream, "%s", temp);
976
977                     (*info->print_address_func) ((bfd_vma) number, info);
978
979                     info->target = number;
980                   }
981                 else
982                   tp = format_hex (number, tp, disdata);
983               }
984           }
985         else
986           {
987             /* Not an immediate number.  Then this is a (possibly
988                prefixed) memory operand.  */
989             if (info->insn_type != dis_nonbranch)
990               {
991                 int mode_size
992                   = 1 << ((insn >> 4)
993                           & (opcodep->args[0] == 'z' ? 1 : 3));
994                 int size;
995                 info->insn_type = dis_dref;
996                 info->flags |= CRIS_DIS_FLAG_MEMREF;
997
998                 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
999                   size = 4;
1000                 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
1001                   {
1002                     const struct cris_spec_reg *sregp
1003                       = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1004
1005                     /* FIXME: Improve error handling; should have been caught
1006                        earlier.  */
1007                     if (sregp == NULL)
1008                       size = 4;
1009                     else
1010                       size = sregp->reg_size;
1011                   }
1012                 else
1013                   size = mode_size;
1014
1015                 info->data_size = size;
1016               }
1017
1018             *tp++ = '[';
1019
1020             if (prefix_opcodep
1021                 /* We don't match dip with a postincremented field
1022                    as a side-effect address mode.  */
1023                 && ((insn & 0x400) == 0
1024                     || prefix_opcodep->match != DIP_OPCODE))
1025               {
1026                 if (insn & 0x400)
1027                   {
1028                     tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
1029                     *tp++ = '=';
1030                   }
1031
1032
1033                 /* We mainly ignore the prefix format string when the
1034                    address-mode syntax is output.  */
1035                 switch (prefix_opcodep->match)
1036                   {
1037                   case DIP_OPCODE:
1038                     /* It's [r], [r+] or [pc+].  */
1039                     if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
1040                       {
1041                         /* It's [pc+].  This cannot possibly be anything
1042                            but an address.  */
1043                         unsigned long number
1044                           = prefix_buffer[2] + prefix_buffer[3] * 256
1045                           + prefix_buffer[4] * 65536
1046                           + prefix_buffer[5] * 0x1000000;
1047
1048                         info->target = (bfd_vma) number;
1049
1050                         /* Finish off and output previous formatted
1051                            data.  */
1052                         *tp = 0;
1053                         tp = temp;
1054                         if (temp[0])
1055                           (*info->fprintf_func) (info->stream, "%s", temp);
1056
1057                         (*info->print_address_func) ((bfd_vma) number, info);
1058                       }
1059                     else
1060                       {
1061                         /* For a memref in an address, we use target2.
1062                            In this case, target is zero.  */
1063                         info->flags
1064                           |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
1065                               | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
1066
1067                         info->target2 = prefix_insn & 15;
1068
1069                         *tp++ = '[';
1070                         tp = format_reg (disdata, prefix_insn & 15, tp,
1071                                          with_reg_prefix);
1072                         if (prefix_insn & 0x400)
1073                           *tp++ = '+';
1074                         *tp++ = ']';
1075                       }
1076                     break;
1077
1078                   case BDAP_QUICK_OPCODE:
1079                     {
1080                       int number;
1081
1082                       number = prefix_buffer[0];
1083                       if (number > 127)
1084                         number -= 256;
1085
1086                       /* Output "reg+num" or, if num < 0, "reg-num".  */
1087                       tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
1088                                        with_reg_prefix);
1089                       if (number >= 0)
1090                         *tp++ = '+';
1091                       tp = format_dec (number, tp, 1);
1092
1093                       info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
1094                       info->target = (prefix_insn >> 12) & 15;
1095                       info->target2 = (bfd_vma) number;
1096                       break;
1097                     }
1098
1099                   case BIAP_OPCODE:
1100                     /* Output "r+R.m".  */
1101                     tp = format_reg (disdata, prefix_insn & 15, tp,
1102                                      with_reg_prefix);
1103                     *tp++ = '+';
1104                     tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
1105                                      with_reg_prefix);
1106                     *tp++ = '.';
1107                     *tp++ = mode_char[(prefix_insn >> 4) & 3];
1108
1109                     info->flags
1110                       |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
1111                           | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
1112
1113                           | ((prefix_insn & 0x8000)
1114                              ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
1115                              : ((prefix_insn & 0x8000)
1116                                 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
1117
1118                     /* Is it the casejump?  It's a "adds.w [pc+r%d.w],pc".  */
1119                     if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
1120                       /* Then start interpreting data as offsets.  */
1121                       case_offset_counter = no_of_case_offsets;
1122                     break;
1123
1124                   case BDAP_INDIR_OPCODE:
1125                     /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
1126                        "r-s".  */
1127                     tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
1128                                      with_reg_prefix);
1129
1130                     if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
1131                       {
1132                         long number;
1133                         unsigned int nbytes;
1134
1135                         /* It's a value.  Get its size.  */
1136                         int mode_size = 1 << ((prefix_insn >> 4) & 3);
1137
1138                         if (mode_size == 1)
1139                           nbytes = 2;
1140                         else
1141                           nbytes = mode_size;
1142
1143                         switch (nbytes)
1144                           {
1145                           case 1:
1146                             number = prefix_buffer[2];
1147                             if (number > 127)
1148                               number -= 256;
1149                             break;
1150
1151                           case 2:
1152                             number = prefix_buffer[2] + prefix_buffer[3] * 256;
1153                             if (number > 32767)
1154                               number -= 65536;
1155                             break;
1156
1157                           case 4:
1158                             number
1159                               = prefix_buffer[2] + prefix_buffer[3] * 256
1160                               + prefix_buffer[4] * 65536
1161                               + prefix_buffer[5] * 0x1000000;
1162                             break;
1163
1164                           default:
1165                             strcpy (tp, "bug");
1166                             tp += 3;
1167                             number = 42;
1168                           }
1169
1170                         info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
1171                         info->target2 = (bfd_vma) number;
1172
1173                         /* If the size is dword, then assume it's an
1174                            address.  */
1175                         if (nbytes == 4)
1176                           {
1177                             /* Finish off and output previous formatted
1178                                bytes.  */
1179                             *tp++ = '+';
1180                             *tp = 0;
1181                             tp = temp;
1182                             (*info->fprintf_func) (info->stream, "%s", temp);
1183
1184                             (*info->print_address_func) ((bfd_vma) number, info);
1185                           }
1186                         else
1187                           {
1188                             if (number >= 0)
1189                               *tp++ = '+';
1190                             tp = format_dec (number, tp, 1);
1191                           }
1192                       }
1193                     else
1194                       {
1195                         /* Output "r+[R].m" or "r+[R+].m".  */
1196                         *tp++ = '+';
1197                         *tp++ = '[';
1198                         tp = format_reg (disdata, prefix_insn & 15, tp,
1199                                          with_reg_prefix);
1200                         if (prefix_insn & 0x400)
1201                           *tp++ = '+';
1202                         *tp++ = ']';
1203                         *tp++ = '.';
1204                         *tp++ = mode_char[(prefix_insn >> 4) & 3];
1205
1206                         info->flags
1207                           |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
1208                               | CRIS_DIS_FLAG_MEM_TARGET2_MEM
1209                               | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
1210
1211                               | (((prefix_insn >> 4) == 2)
1212                                  ? 0
1213                                  : (((prefix_insn >> 4) & 3) == 1
1214                                     ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
1215                                     : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
1216                       }
1217                     break;
1218
1219                   default:
1220                     (*info->fprintf_func) (info->stream, "?prefix-bug");
1221                   }
1222
1223                 /* To mark that the prefix is used, reset it.  */
1224                 prefix_opcodep = NULL;
1225               }
1226             else
1227               {
1228                 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
1229
1230                 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
1231                 info->target = insn & 15;
1232
1233                 if (insn & 0x400)
1234                   *tp++ = '+';
1235               }
1236             *tp++ = ']';
1237           }
1238         break;
1239
1240       case 'x':
1241         tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
1242         *tp++ = '.';
1243         *tp++ = mode_char[(insn >> 4) & 3];
1244         break;
1245
1246       case 'I':
1247         tp = format_dec (insn & 63, tp, 0);
1248         break;
1249
1250       case 'b':
1251         {
1252           int where = buffer[2] + buffer[3] * 256;
1253
1254           if (where > 32767)
1255             where -= 65536;
1256
1257           where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
1258
1259           if (insn == BA_PC_INCR_OPCODE)
1260             info->insn_type = dis_branch;
1261           else
1262             info->insn_type = dis_condbranch;
1263
1264           info->target = (bfd_vma) where;
1265
1266           *tp = 0;
1267           tp = temp;
1268           (*info->fprintf_func) (info->stream, "%s%s ",
1269                                  temp, cris_cc_strings[insn >> 12]);
1270
1271           (*info->print_address_func) ((bfd_vma) where, info);
1272         }
1273       break;
1274
1275     case 'c':
1276       tp = format_dec (insn & 31, tp, 0);
1277       break;
1278
1279     case 'C':
1280       tp = format_dec (insn & 15, tp, 0);
1281       break;
1282
1283     case 'o':
1284       {
1285         long offset = insn & 0xfe;
1286         bfd_vma target;
1287
1288         if (insn & 1)
1289           offset |= ~0xff;
1290
1291         if (opcodep->match == BA_QUICK_OPCODE)
1292           info->insn_type = dis_branch;
1293         else
1294           info->insn_type = dis_condbranch;
1295
1296         target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
1297         info->target = target;
1298         *tp = 0;
1299         tp = temp;
1300         (*info->fprintf_func) (info->stream, "%s", temp);
1301         (*info->print_address_func) (target, info);
1302       }
1303       break;
1304
1305     case 'Q':
1306     case 'O':
1307       {
1308         long number = buffer[0];
1309
1310         if (number > 127)
1311           number = number - 256;
1312
1313         tp = format_dec (number, tp, 1);
1314         *tp++ = ',';
1315         tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
1316       }
1317       break;
1318
1319     case 'f':
1320       tp = print_flags (disdata, insn, tp);
1321       break;
1322
1323     case 'i':
1324       tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
1325       break;
1326
1327     case 'P':
1328       {
1329         const struct cris_spec_reg *sregp
1330           = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1331
1332         if (sregp->name == NULL)
1333           /* Should have been caught as a non-match eariler.  */
1334           *tp++ = '?';
1335         else
1336           {
1337             if (with_reg_prefix)
1338               *tp++ = REGISTER_PREFIX_CHAR;
1339             strcpy (tp, sregp->name);
1340             tp += strlen (tp);
1341           }
1342       }
1343       break;
1344
1345     default:
1346       strcpy (tp, "???");
1347       tp += 3;
1348     }
1349   }
1350
1351   *tp = 0;
1352
1353   if (prefix_opcodep)
1354     (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
1355                            prefix_opcodep->name, prefix_opcodep->args);
1356
1357   (*info->fprintf_func) (info->stream, "%s", temp);
1358
1359   /* Get info for matching case-tables, if we don't have any active.
1360      We assume that the last constant seen is used; either in the insn
1361      itself or in a "move.d const,rN, sub.d rN,rM"-like sequence.  */
1362   if (TRACE_CASE && case_offset_counter == 0)
1363     {
1364       if (CONST_STRNEQ (opcodep->name, "sub"))
1365         case_offset = last_immediate;
1366
1367       /* It could also be an "add", if there are negative case-values.  */
1368       else if (CONST_STRNEQ (opcodep->name, "add"))
1369         /* The first case is the negated operand to the add.  */
1370         case_offset = -last_immediate;
1371
1372       /* A bound insn will tell us the number of cases.  */
1373       else if (CONST_STRNEQ (opcodep->name, "bound"))
1374         no_of_case_offsets = last_immediate + 1;
1375
1376       /* A jump or jsr or branch breaks the chain of insns for a
1377          case-table, so assume default first-case again.  */
1378       else if (info->insn_type == dis_jsr
1379                || info->insn_type == dis_branch
1380                || info->insn_type == dis_condbranch)
1381         case_offset = 0;
1382     }
1383 }
1384
1385
1386 /* Print the CRIS instruction at address memaddr on stream.  Returns
1387    length of the instruction, in bytes.  Prefix register names with `$' if
1388    WITH_REG_PREFIX.  */
1389
1390 static int
1391 print_insn_cris_generic (bfd_vma memaddr,
1392                          disassemble_info *info,
1393                          bfd_boolean with_reg_prefix)
1394 {
1395   int nbytes;
1396   unsigned int insn;
1397   const struct cris_opcode *matchedp;
1398   int advance = 0;
1399   struct cris_disasm_data *disdata
1400     = (struct cris_disasm_data *) info->private_data;
1401
1402   /* No instruction will be disassembled as longer than this number of
1403      bytes; stacked prefixes will not be expanded.  */
1404   unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
1405   unsigned char *bufp;
1406   int status = 0;
1407   bfd_vma addr;
1408
1409   /* There will be an "out of range" error after the last instruction.
1410      Reading pairs of bytes in decreasing number, we hope that we will get
1411      at least the amount that we will consume.
1412
1413      If we can't get any data, or we do not get enough data, we print
1414      the error message.  */
1415
1416   for (nbytes = MAX_BYTES_PER_CRIS_INSN; nbytes > 0; nbytes -= 2)
1417     {
1418       status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
1419       if (status == 0)
1420         break;
1421     }
1422
1423   /* If we did not get all we asked for, then clear the rest.
1424      Hopefully this makes a reproducible result in case of errors.  */
1425   if (nbytes != MAX_BYTES_PER_CRIS_INSN)
1426     memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
1427
1428   addr = memaddr;
1429   bufp = buffer;
1430
1431   /* Set some defaults for the insn info.  */
1432   info->insn_info_valid = 1;
1433   info->branch_delay_insns = 0;
1434   info->data_size = 0;
1435   info->insn_type = dis_nonbranch;
1436   info->flags = 0;
1437   info->target = 0;
1438   info->target2 = 0;
1439
1440   /* If we got any data, disassemble it.  */
1441   if (nbytes != 0)
1442     {
1443       matchedp = NULL;
1444
1445       insn = bufp[0] + bufp[1] * 256;
1446
1447       /* If we're in a case-table, don't disassemble the offsets.  */
1448       if (TRACE_CASE && case_offset_counter != 0)
1449         {
1450           info->insn_type = dis_noninsn;
1451           advance += 2;
1452
1453           /* If to print data as offsets, then shortcut here.  */
1454           (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
1455                                  case_offset + no_of_case_offsets
1456                                  - case_offset_counter,
1457                                  case_offset_counter == 1 ? "/default" :
1458                                  "");
1459
1460           (*info->print_address_func) ((bfd_vma)
1461                                        ((short) (insn)
1462                                         + (long) (addr
1463                                                   - (no_of_case_offsets
1464                                                      - case_offset_counter)
1465                                                   * 2)), info);
1466           case_offset_counter--;
1467
1468           /* The default case start (without a "sub" or "add") must be
1469              zero.  */
1470           if (case_offset_counter == 0)
1471             case_offset = 0;
1472         }
1473       else if (insn == 0)
1474         {
1475           /* We're often called to disassemble zeroes.  While this is a
1476              valid "bcc .+2" insn, it is also useless enough and enough
1477              of a nuiscance that we will just output "bcc .+2" for it
1478              and signal it as a noninsn.  */
1479           (*info->fprintf_func) (info->stream,
1480                                  disdata->distype == cris_dis_v32
1481                                  ? "bcc ." : "bcc .+2");
1482           info->insn_type = dis_noninsn;
1483           advance += 2;
1484         }
1485       else
1486         {
1487           const struct cris_opcode *prefix_opcodep = NULL;
1488           unsigned char *prefix_buffer = bufp;
1489           unsigned int prefix_insn = insn;
1490           int prefix_size = 0;
1491
1492           matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
1493
1494           /* Check if we're supposed to write out prefixes as address
1495              modes and if this was a prefix.  */
1496           if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
1497             {
1498               /* If it's a prefix, put it into the prefix vars and get the
1499                  main insn.  */
1500               prefix_size = bytes_to_skip (prefix_insn, matchedp,
1501                                            disdata->distype, NULL);
1502               prefix_opcodep = matchedp;
1503
1504               insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
1505               matchedp = get_opcode_entry (insn, prefix_insn, disdata);
1506
1507               if (matchedp != NULL)
1508                 {
1509                   addr += prefix_size;
1510                   bufp += prefix_size;
1511                   advance += prefix_size;
1512                 }
1513               else
1514                 {
1515                   /* The "main" insn wasn't valid, at least not when
1516                      prefixed.  Put back things enough to output the
1517                      prefix insn only, as a normal insn.  */
1518                   matchedp = prefix_opcodep;
1519                   insn = prefix_insn;
1520                   prefix_opcodep = NULL;
1521                 }
1522             }
1523
1524           if (matchedp == NULL)
1525             {
1526               (*info->fprintf_func) (info->stream, "??0x%x", insn);
1527               advance += 2;
1528
1529               info->insn_type = dis_noninsn;
1530             }
1531           else
1532             {
1533               advance
1534                 += bytes_to_skip (insn, matchedp, disdata->distype,
1535                                   prefix_opcodep);
1536
1537               /* The info_type and assorted fields will be set according
1538                  to the operands.   */
1539               print_with_operands (matchedp, insn, bufp, addr, info,
1540                                    prefix_opcodep, prefix_insn,
1541                                    prefix_buffer, with_reg_prefix);
1542             }
1543         }
1544     }
1545   else
1546     info->insn_type = dis_noninsn;
1547
1548   /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
1549      status when reading that much, and the insn decoding indicated a
1550      length exceeding what we read, there is an error.  */
1551   if (status != 0 && (nbytes == 0 || advance > nbytes))
1552     {
1553       (*info->memory_error_func) (status, memaddr, info);
1554       return -1;
1555     }
1556
1557   /* Max supported insn size with one folded prefix insn.  */
1558   info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
1559
1560   /* I would like to set this to a fixed value larger than the actual
1561      number of bytes to print in order to avoid spaces between bytes,
1562      but objdump.c (2.9.1) does not like that, so we print 16-bit
1563      chunks, which is the next choice.  */
1564   info->bytes_per_chunk = 2;
1565
1566   /* Printing bytes in order of increasing addresses makes sense,
1567      especially on a little-endian target.
1568      This is completely the opposite of what you think; setting this to
1569      BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
1570      we want.  */
1571   info->display_endian = BFD_ENDIAN_BIG;
1572
1573   return advance;
1574 }
1575
1576 /* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
1577
1578 static int
1579 print_insn_cris_with_register_prefix (bfd_vma vma,
1580                                       disassemble_info *info)
1581 {
1582   if (info->private_data == NULL
1583       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
1584     return -1;
1585   return print_insn_cris_generic (vma, info, TRUE);
1586 }
1587
1588 /* Disassemble, prefixing register names with `$'.  CRIS v32.  */
1589
1590 static int
1591 print_insn_crisv32_with_register_prefix (bfd_vma vma,
1592                                          disassemble_info *info)
1593 {
1594   if (info->private_data == NULL
1595       && !cris_parse_disassembler_options (info, cris_dis_v32))
1596     return -1;
1597   return print_insn_cris_generic (vma, info, TRUE);
1598 }
1599
1600 /* Disassemble, prefixing register names with `$'.
1601    Common v10 and v32 subset.  */
1602
1603 static int
1604 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
1605                                              disassemble_info *info)
1606 {
1607   if (info->private_data == NULL
1608       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
1609     return -1;
1610   return print_insn_cris_generic (vma, info, TRUE);
1611 }
1612
1613 /* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
1614
1615 static int
1616 print_insn_cris_without_register_prefix (bfd_vma vma,
1617                                          disassemble_info *info)
1618 {
1619   if (info->private_data == NULL
1620       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
1621     return -1;
1622   return print_insn_cris_generic (vma, info, FALSE);
1623 }
1624
1625 /* Disassemble, no prefixes on register names.  CRIS v32.  */
1626
1627 static int
1628 print_insn_crisv32_without_register_prefix (bfd_vma vma,
1629                                             disassemble_info *info)
1630 {
1631   if (info->private_data == NULL
1632       && !cris_parse_disassembler_options (info, cris_dis_v32))
1633     return -1;
1634   return print_insn_cris_generic (vma, info, FALSE);
1635 }
1636
1637 /* Disassemble, no prefixes on register names.
1638    Common v10 and v32 subset.  */
1639
1640 static int
1641 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
1642                                                 disassemble_info *info)
1643 {
1644   if (info->private_data == NULL
1645       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
1646     return -1;
1647   return print_insn_cris_generic (vma, info, FALSE);
1648 }
1649
1650 /* Return a disassembler-function that prints registers with a `$' prefix,
1651    or one that prints registers without a prefix.
1652    FIXME: We should improve the solution to avoid the multitude of
1653    functions seen above.  */
1654
1655 disassembler_ftype
1656 cris_get_disassembler (bfd *abfd)
1657 {
1658   /* If there's no bfd in sight, we return what is valid as input in all
1659      contexts if fed back to the assembler: disassembly *with* register
1660      prefix.  Unfortunately this will be totally wrong for v32.  */
1661   if (abfd == NULL)
1662     return print_insn_cris_with_register_prefix;
1663
1664   if (bfd_get_symbol_leading_char (abfd) == 0)
1665     {
1666       if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
1667         return print_insn_crisv32_with_register_prefix;
1668       if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
1669         return print_insn_crisv10_v32_with_register_prefix;
1670
1671       /* We default to v10.  This may be specifically specified in the
1672          bfd mach, but is also the default setting.  */
1673       return print_insn_cris_with_register_prefix;
1674     }
1675
1676   if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
1677     return print_insn_crisv32_without_register_prefix;
1678   if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
1679     return print_insn_crisv10_v32_without_register_prefix;
1680   return print_insn_cris_without_register_prefix;
1681 }
1682
1683 /* Local variables:
1684    eval: (c-set-style "gnu")
1685    indent-tabs-mode: t
1686    End:  */