2009-05-25 Tristan Gingold <gingold@adacore.com>
[binutils.git] / opcodes / cris-dis.c
blob01e69cab06c2b4c5ae69d6b76db932812a8b149b
1 /* Disassembler code for CRIS.
2 Copyright 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Axis Communications AB, Lund, Sweden.
5 Written by Hans-Peter Nilsson.
7 This file is part of the GNU opcodes library.
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.
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.
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. */
24 #include "dis-asm.h"
25 #include "sysdep.h"
26 #include "opcode/cris.h"
27 #include "libiberty.h"
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
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
42 /* Sometimes we prefix all registers with this character. */
43 #define REGISTER_PREFIX_CHAR '$'
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
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).
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.
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.
65 FIXME: Make this optional later. */
66 #ifndef TRACE_CASE
67 #define TRACE_CASE (disdata->trace_case)
68 #endif
70 enum cris_disass_family
71 { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
73 /* Stored in the disasm_info->private_data member. */
74 struct cris_disasm_data
76 /* Whether to print something less confusing if we find something
77 matching a switch-construct. */
78 bfd_boolean trace_case;
80 /* Whether this code is flagged as crisv32. FIXME: Should be an enum
81 that includes "compatible". */
82 enum cris_disass_family distype;
85 /* Value of first element in switch. */
86 static long case_offset = 0;
88 /* How many more case-offsets to print. */
89 static long case_offset_counter = 0;
91 /* Number of case offsets. */
92 static long no_of_case_offsets = 0;
94 /* Candidate for next case_offset. */
95 static long last_immediate = 0;
97 static int cris_constraint
98 (const char *, unsigned, unsigned, struct cris_disasm_data *);
100 /* Parse disassembler options and store state in info. FIXME: For the
101 time being, we abuse static variables. */
103 static bfd_boolean
104 cris_parse_disassembler_options (disassemble_info *info,
105 enum cris_disass_family distype)
107 struct cris_disasm_data *disdata;
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;
114 /* Default true. */
115 disdata->trace_case
116 = (info->disassembler_options == NULL
117 || (strcmp (info->disassembler_options, "nocase") != 0));
119 disdata->distype = distype;
120 return TRUE;
123 static const struct cris_spec_reg *
124 spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
126 int i;
128 for (i = 0; cris_spec_regs[i].name != NULL; i++)
130 if (cris_spec_regs[i].number == sreg)
132 if (distype == cris_dis_v32)
133 switch (cris_spec_regs[i].applicable_version)
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:
147 else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
148 return &cris_spec_regs[i];
152 return NULL;
155 /* Return the number of bits in the argument. */
157 static int
158 number_of_bits (unsigned int val)
160 int bits;
162 for (bits = 0; val != 0; val &= val - 1)
163 bits++;
165 return bits;
168 /* Get an entry in the opcode-table. */
170 static const struct cris_opcode *
171 get_opcode_entry (unsigned int insn,
172 unsigned int prefix_insn,
173 struct cris_disasm_data *disdata)
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;
179 const struct cris_opcode *max_matchedp = NULL;
180 const struct cris_opcode **prefix_opc_table = NULL;
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;
189 /* Allocate and clear the opcode-table. */
190 if (opc_table == NULL)
192 opc_table = malloc (65536 * sizeof (opc_table[0]));
193 if (opc_table == NULL)
194 return NULL;
196 memset (opc_table, 0, 65536 * sizeof (const struct cris_opcode *));
198 dip_prefixes
199 = malloc (65536 * sizeof (const struct cris_opcode **));
200 if (dip_prefixes == NULL)
201 return NULL;
203 memset (dip_prefixes, 0, 65536 * sizeof (dip_prefixes[0]));
205 bdapq_m1_prefixes
206 = malloc (65536 * sizeof (const struct cris_opcode **));
207 if (bdapq_m1_prefixes == NULL)
208 return NULL;
210 memset (bdapq_m1_prefixes, 0, 65536 * sizeof (bdapq_m1_prefixes[0]));
212 bdapq_m2_prefixes
213 = malloc (65536 * sizeof (const struct cris_opcode **));
214 if (bdapq_m2_prefixes == NULL)
215 return NULL;
217 memset (bdapq_m2_prefixes, 0, 65536 * sizeof (bdapq_m2_prefixes[0]));
219 bdapq_m4_prefixes
220 = malloc (65536 * sizeof (const struct cris_opcode **));
221 if (bdapq_m4_prefixes == NULL)
222 return NULL;
224 memset (bdapq_m4_prefixes, 0, 65536 * sizeof (bdapq_m4_prefixes[0]));
226 rest_prefixes
227 = malloc (65536 * sizeof (const struct cris_opcode **));
228 if (rest_prefixes == NULL)
229 return NULL;
231 memset (rest_prefixes, 0, 65536 * sizeof (rest_prefixes[0]));
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)
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));
247 if (popcodep == NULL)
248 return NULL;
250 if (popcodep->match == BDAP_QUICK_OPCODE)
252 /* Since some offsets are recognized with "push" macros, we
253 have to have different tables for them. */
254 int offset = (prefix_insn & 255);
256 if (offset > 127)
257 offset -= 256;
259 switch (offset)
261 case -4:
262 prefix_opc_table = bdapq_m4_prefixes;
263 break;
265 case -2:
266 prefix_opc_table = bdapq_m2_prefixes;
267 break;
269 case -1:
270 prefix_opc_table = bdapq_m1_prefixes;
271 break;
273 default:
274 prefix_opc_table = rest_prefixes;
275 break;
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;
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
293 const struct cris_opcode *opcodep;
294 int max_level_of_match = -1;
296 for (opcodep = cris_opcodes;
297 opcodep->name != NULL;
298 opcodep++)
300 int level_of_match;
302 if (disdata->distype == cris_dis_v32)
304 switch (opcodep->applicable_version)
306 case cris_ver_version_all:
307 break;
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;
318 case cris_ver_v3p:
319 case cris_ver_v8p:
320 case cris_ver_v10p:
321 case cris_ver_v32p:
322 break;
324 case cris_ver_v8:
325 abort ();
326 default:
327 abort ();
330 else
332 switch (opcodep->applicable_version)
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;
346 case cris_ver_v32p:
347 continue;
349 case cris_ver_v8:
350 abort ();
351 default:
352 abort ();
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))
375 max_matchedp = opcodep;
376 max_level_of_match = level_of_match;
378 /* If there was a full match, never mind looking
379 further. */
380 if (level_of_match >= 2 * 16)
381 break;
384 /* Fill in the new entry.
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;
397 return max_matchedp;
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). */
404 static int
405 cris_constraint (const char *cs,
406 unsigned int insn,
407 unsigned int prefix_insn,
408 struct cris_disasm_data *disdata)
410 int retval = 0;
411 int tmp;
412 int prefix_ok = 0;
413 const char *s;
415 for (s = cs; *s; s++)
416 switch (*s)
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;
426 case 'U':
427 /* Not recognized at disassembly. */
428 return -1;
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;
440 case 'm':
441 if ((insn & 0x30) == 0x30)
442 return -1;
443 break;
445 case 'S':
446 /* A prefix operand without side-effect. */
447 if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
449 prefix_ok = 1;
450 break;
452 else
453 return -1;
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)
462 if (insn & 0x400)
464 const struct cris_opcode *prefix_opcodep
465 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
467 if (prefix_opcodep->match == DIP_OPCODE)
468 return -1;
471 prefix_ok = 1;
473 break;
475 case 'B':
476 /* If we don't fall through, then the prefix is ok. */
477 prefix_ok = 1;
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)
483 /* Match the prefix insn to BDAPQ. */
484 const struct cris_opcode *prefix_opcodep
485 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
487 if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
489 int pushsize = (prefix_insn & 255);
491 if (pushsize > 127)
492 pushsize -= 256;
494 if (s[1] == 'P')
496 unsigned int spec_reg = (insn >> 12) & 15;
497 const struct cris_spec_reg *sregp
498 = spec_reg_info (spec_reg, disdata->distype);
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;
505 else if (s[1] == 'R')
507 if ((insn & 0x30) == 0x20 && pushsize == -4)
508 break;
510 /* FIXME: Should abort here; next constraint letter
511 *must* be 'P' or 'R'. */
514 return -1;
516 case 'D':
517 retval = (((insn >> 12) & 15) == (insn & 15));
518 if (!retval)
519 return -1;
520 else
521 retval += 4;
522 break;
524 case 'P':
526 const struct cris_spec_reg *sregp
527 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
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.
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. */
541 if (sregp != NULL)
543 retval += 3;
544 break;
546 else
547 return -1;
551 if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
552 return -1;
554 return retval;
557 /* Format number as hex with a leading "0x" into outbuffer. */
559 static char *
560 format_hex (unsigned long number,
561 char *outbuffer,
562 struct cris_disasm_data *disdata)
564 /* Truncate negative numbers on >32-bit hosts. */
565 number &= 0xffffffff;
567 sprintf (outbuffer, "0x%lx", number);
569 /* Save this value for the "case" support. */
570 if (TRACE_CASE)
571 last_immediate = number;
573 return outbuffer + strlen (outbuffer);
576 /* Format number as decimal into outbuffer. Parameter signedp says
577 whether the number should be formatted as signed (!= 0) or
578 unsigned (== 0). */
580 static char *
581 format_dec (long number, char *outbuffer, int signedp)
583 last_immediate = number;
584 if (signedp)
585 sprintf (outbuffer, "%ld", number);
586 else
587 sprintf (outbuffer, "%lu", (unsigned long) number);
589 return outbuffer + strlen (outbuffer);
592 /* Format the name of the general register regno into outbuffer. */
594 static char *
595 format_reg (struct cris_disasm_data *disdata,
596 int regno,
597 char *outbuffer_start,
598 bfd_boolean with_reg_prefix)
600 char *outbuffer = outbuffer_start;
602 if (with_reg_prefix)
603 *outbuffer++ = REGISTER_PREFIX_CHAR;
605 switch (regno)
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;
615 case 14:
616 strcpy (outbuffer, "sp");
617 break;
619 default:
620 sprintf (outbuffer, "r%d", regno);
621 break;
624 return outbuffer_start + strlen (outbuffer_start);
627 /* Format the name of a support register into outbuffer. */
629 static char *
630 format_sup_reg (unsigned int regno,
631 char *outbuffer_start,
632 bfd_boolean with_reg_prefix)
634 char *outbuffer = outbuffer_start;
635 int i;
637 if (with_reg_prefix)
638 *outbuffer++ = REGISTER_PREFIX_CHAR;
640 for (i = 0; cris_support_regs[i].name != NULL; i++)
641 if (cris_support_regs[i].number == regno)
643 sprintf (outbuffer, "%s", cris_support_regs[i].name);
644 return outbuffer_start + strlen (outbuffer_start);
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);
653 /* Return the length of an instruction. */
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)
661 /* Each insn is a word plus "immediate" operands. */
662 unsigned to_skip = 2;
663 const char *template = matchedp->args;
664 const char *s;
666 for (s = template; *s; s++)
667 if ((*s == 's' || *s == 'N' || *s == 'Y')
668 && (insn & 0x400) && (insn & 15) == 15
669 && prefix_matchedp == NULL)
671 /* Immediate via [pc+], so we have to check the size of the
672 operand. */
673 int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
675 if (matchedp->imm_oprnd_size == SIZE_FIX_32)
676 to_skip += 4;
677 else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
679 const struct cris_spec_reg *sregp
680 = spec_reg_info ((insn >> 12) & 15, distype);
682 /* FIXME: Improve error handling; should have been caught
683 earlier. */
684 if (sregp == NULL)
685 return 2;
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;
693 else
694 to_skip += (mode_size + 1) & ~1;
696 else if (*s == 'n')
697 to_skip += 4;
698 else if (*s == 'b')
699 to_skip += 2;
701 return to_skip;
704 /* Print condition code flags. */
706 static char *
707 print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
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;
719 unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
720 int i;
722 for (i = 0; i < 8; i++)
723 if (flagbits & (1 << i))
724 *cp++ = fnames[i];
726 return cp;
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. */
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)
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;
757 /* Print out the name first thing we do. */
758 (*info->fprintf_func) (info->stream, "%s", opcodep->name);
760 cs = opcodep->args;
761 s = cs;
763 /* Ignore any prefix indicator. */
764 if (*s == 'p')
765 s++;
767 if (*s == 'm' || *s == 'M' || *s == 'z')
769 *tp++ = '.';
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)];
777 /* Ignore the size and the space character that follows. */
778 s += 2;
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++ = ' ';
786 /* Fill in the insn-type if deducible from the name (and there's no
787 better way). */
788 if (opcodep->name[0] == 'j')
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;
798 /* We might know some more fields right now. */
799 info->branch_delay_insns = opcodep->delayed;
801 /* Handle operands. */
802 for (; *s; s++)
804 switch (*s)
806 case 'T':
807 tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
808 break;
810 case 'A':
811 if (with_reg_prefix)
812 *tp++ = REGISTER_PREFIX_CHAR;
813 *tp++ = 'a';
814 *tp++ = 'c';
815 *tp++ = 'r';
816 break;
818 case '[':
819 case ']':
820 case ',':
821 *tp++ = *s;
822 break;
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;
830 case 'd':
831 /* Ignore. This is an optional ".d " on the large one of
832 relaxable insns. */
833 break;
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;
842 case 'D':
843 case 'r':
844 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
845 break;
847 case 'R':
848 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
849 break;
851 case 'n':
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);
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;
864 (*info->print_address_func) ((bfd_vma) number, info);
866 break;
868 case 'u':
870 /* Like n but the offset is bits <3:0> in the instruction. */
871 unsigned long number = (buffer[0] & 0xf) * 2 + addr;
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;
879 (*info->print_address_func) ((bfd_vma) number, info);
881 break;
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)
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;
899 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
900 nbytes = 4;
901 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
903 const struct cris_spec_reg *sregp
904 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
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;
919 else
921 int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
923 if (mode_size == 1)
924 nbytes = 2;
925 else
926 nbytes = mode_size;
929 switch (nbytes)
931 case 1:
932 number = buffer[2];
933 if (signedp && number > 127)
934 number -= 256;
935 break;
937 case 2:
938 number = buffer[2] + buffer[3] * 256;
939 if (signedp && number > 32767)
940 number -= 65536;
941 break;
943 case 4:
944 number
945 = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
946 + buffer[5] * 0x1000000;
947 break;
949 default:
950 strcpy (tp, "bug");
951 tp += 3;
952 number = 42;
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
961 unsigned int highbyte = (number >> 24) & 0xff;
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))
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);
980 (*info->print_address_func) ((bfd_vma) number, info);
982 info->target = number;
984 else
985 tp = format_hex (number, tp, disdata);
988 else
990 /* Not an immediate number. Then this is a (possibly
991 prefixed) memory operand. */
992 if (info->insn_type != dis_nonbranch)
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;
1001 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
1002 size = 4;
1003 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
1005 const struct cris_spec_reg *sregp
1006 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
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;
1015 else
1016 size = mode_size;
1018 info->data_size = size;
1021 *tp++ = '[';
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))
1029 if (insn & 0x400)
1031 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
1032 *tp++ = '=';
1036 /* We mainly ignore the prefix format string when the
1037 address-mode syntax is output. */
1038 switch (prefix_opcodep->match)
1040 case DIP_OPCODE:
1041 /* It's [r], [r+] or [pc+]. */
1042 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
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;
1051 info->target = (bfd_vma) number;
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);
1060 (*info->print_address_func) ((bfd_vma) number, info);
1062 else
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);
1070 info->target2 = prefix_insn & 15;
1072 *tp++ = '[';
1073 tp = format_reg (disdata, prefix_insn & 15, tp,
1074 with_reg_prefix);
1075 if (prefix_insn & 0x400)
1076 *tp++ = '+';
1077 *tp++ = ']';
1079 break;
1081 case BDAP_QUICK_OPCODE:
1083 int number;
1085 number = prefix_buffer[0];
1086 if (number > 127)
1087 number -= 256;
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);
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;
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];
1112 info->flags
1113 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
1114 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
1116 | ((prefix_insn & 0x8000)
1117 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
1118 : ((prefix_insn & 0x8000)
1119 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
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;
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);
1133 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
1135 long number;
1136 unsigned int nbytes;
1138 /* It's a value. Get its size. */
1139 int mode_size = 1 << ((prefix_insn >> 4) & 3);
1141 if (mode_size == 1)
1142 nbytes = 2;
1143 else
1144 nbytes = mode_size;
1146 switch (nbytes)
1148 case 1:
1149 number = prefix_buffer[2];
1150 if (number > 127)
1151 number -= 256;
1152 break;
1154 case 2:
1155 number = prefix_buffer[2] + prefix_buffer[3] * 256;
1156 if (number > 32767)
1157 number -= 65536;
1158 break;
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;
1167 default:
1168 strcpy (tp, "bug");
1169 tp += 3;
1170 number = 42;
1173 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
1174 info->target2 = (bfd_vma) number;
1176 /* If the size is dword, then assume it's an
1177 address. */
1178 if (nbytes == 4)
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);
1187 (*info->print_address_func) ((bfd_vma) number, info);
1189 else
1191 if (number >= 0)
1192 *tp++ = '+';
1193 tp = format_dec (number, tp, 1);
1196 else
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];
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
1214 | (((prefix_insn >> 4) == 2)
1216 : (((prefix_insn >> 4) & 3) == 1
1217 ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
1218 : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
1220 break;
1222 default:
1223 (*info->fprintf_func) (info->stream, "?prefix-bug");
1226 /* To mark that the prefix is used, reset it. */
1227 prefix_opcodep = NULL;
1229 else
1231 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
1233 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
1234 info->target = insn & 15;
1236 if (insn & 0x400)
1237 *tp++ = '+';
1239 *tp++ = ']';
1241 break;
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;
1249 case 'I':
1250 tp = format_dec (insn & 63, tp, 0);
1251 break;
1253 case 'b':
1255 int where = buffer[2] + buffer[3] * 256;
1257 if (where > 32767)
1258 where -= 65536;
1260 where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
1262 if (insn == BA_PC_INCR_OPCODE)
1263 info->insn_type = dis_branch;
1264 else
1265 info->insn_type = dis_condbranch;
1267 info->target = (bfd_vma) where;
1269 *tp = 0;
1270 tp = temp;
1271 (*info->fprintf_func) (info->stream, "%s%s ",
1272 temp, cris_cc_strings[insn >> 12]);
1274 (*info->print_address_func) ((bfd_vma) where, info);
1276 break;
1278 case 'c':
1279 tp = format_dec (insn & 31, tp, 0);
1280 break;
1282 case 'C':
1283 tp = format_dec (insn & 15, tp, 0);
1284 break;
1286 case 'o':
1288 long offset = insn & 0xfe;
1289 bfd_vma target;
1291 if (insn & 1)
1292 offset |= ~0xff;
1294 if (opcodep->match == BA_QUICK_OPCODE)
1295 info->insn_type = dis_branch;
1296 else
1297 info->insn_type = dis_condbranch;
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);
1306 break;
1308 case 'Q':
1309 case 'O':
1311 long number = buffer[0];
1313 if (number > 127)
1314 number = number - 256;
1316 tp = format_dec (number, tp, 1);
1317 *tp++ = ',';
1318 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
1320 break;
1322 case 'f':
1323 tp = print_flags (disdata, insn, tp);
1324 break;
1326 case 'i':
1327 tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
1328 break;
1330 case 'P':
1332 const struct cris_spec_reg *sregp
1333 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1335 if (sregp->name == NULL)
1336 /* Should have been caught as a non-match eariler. */
1337 *tp++ = '?';
1338 else
1340 if (with_reg_prefix)
1341 *tp++ = REGISTER_PREFIX_CHAR;
1342 strcpy (tp, sregp->name);
1343 tp += strlen (tp);
1346 break;
1348 default:
1349 strcpy (tp, "???");
1350 tp += 3;
1354 *tp = 0;
1356 if (prefix_opcodep)
1357 (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
1358 prefix_opcodep->name, prefix_opcodep->args);
1360 (*info->fprintf_func) (info->stream, "%s", temp);
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)
1367 if (CONST_STRNEQ (opcodep->name, "sub"))
1368 case_offset = last_immediate;
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;
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;
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;
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. */
1393 static int
1394 print_insn_cris_generic (bfd_vma memaddr,
1395 disassemble_info *info,
1396 bfd_boolean with_reg_prefix)
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;
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;
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.
1416 If we can't get any data, or we do not get enough data, we print
1417 the error message. */
1419 for (nbytes = MAX_BYTES_PER_CRIS_INSN; nbytes > 0; nbytes -= 2)
1421 status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
1422 if (status == 0)
1423 break;
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);
1431 addr = memaddr;
1432 bufp = buffer;
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;
1443 /* If we got any data, disassemble it. */
1444 if (nbytes != 0)
1446 matchedp = NULL;
1448 insn = bufp[0] + bufp[1] * 256;
1450 /* If we're in a case-table, don't disassemble the offsets. */
1451 if (TRACE_CASE && case_offset_counter != 0)
1453 info->insn_type = dis_noninsn;
1454 advance += 2;
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 "");
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--;
1471 /* The default case start (without a "sub" or "add") must be
1472 zero. */
1473 if (case_offset_counter == 0)
1474 case_offset = 0;
1476 else if (insn == 0)
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;
1488 else
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;
1495 matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
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')
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;
1507 insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
1508 matchedp = get_opcode_entry (insn, prefix_insn, disdata);
1510 if (matchedp != NULL)
1512 addr += prefix_size;
1513 bufp += prefix_size;
1514 advance += prefix_size;
1516 else
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;
1527 if (matchedp == NULL)
1529 (*info->fprintf_func) (info->stream, "??0x%x", insn);
1530 advance += 2;
1532 info->insn_type = dis_noninsn;
1534 else
1536 advance
1537 += bytes_to_skip (insn, matchedp, disdata->distype,
1538 prefix_opcodep);
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);
1548 else
1549 info->insn_type = dis_noninsn;
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))
1556 (*info->memory_error_func) (status, memaddr, info);
1557 return -1;
1560 /* Max supported insn size with one folded prefix insn. */
1561 info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
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;
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;
1576 return advance;
1579 /* Disassemble, prefixing register names with `$'. CRIS v0..v10. */
1581 static int
1582 print_insn_cris_with_register_prefix (bfd_vma vma,
1583 disassemble_info *info)
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);
1591 /* Disassemble, prefixing register names with `$'. CRIS v32. */
1593 static int
1594 print_insn_crisv32_with_register_prefix (bfd_vma vma,
1595 disassemble_info *info)
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);
1603 /* Disassemble, prefixing register names with `$'.
1604 Common v10 and v32 subset. */
1606 static int
1607 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
1608 disassemble_info *info)
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);
1616 /* Disassemble, no prefixes on register names. CRIS v0..v10. */
1618 static int
1619 print_insn_cris_without_register_prefix (bfd_vma vma,
1620 disassemble_info *info)
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);
1628 /* Disassemble, no prefixes on register names. CRIS v32. */
1630 static int
1631 print_insn_crisv32_without_register_prefix (bfd_vma vma,
1632 disassemble_info *info)
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);
1640 /* Disassemble, no prefixes on register names.
1641 Common v10 and v32 subset. */
1643 static int
1644 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
1645 disassemble_info *info)
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);
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. */
1658 disassembler_ftype
1659 cris_get_disassembler (bfd *abfd)
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;
1667 if (bfd_get_symbol_leading_char (abfd) == 0)
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;
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;
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;
1686 /* Local variables:
1687 eval: (c-set-style "gnu")
1688 indent-tabs-mode: t
1689 End: */