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