1 /* Disassembler code for CRIS.
2 Copyright 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Axis Communications AB, Lund, Sweden.
4 Written by Hans-Peter Nilsson.
6 This file is part of the GNU binutils and GDB, the GNU debugger.
8 This program is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published by the
10 Free Software Foundation; either version 2, or (at your option) any later
13 This program is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, see <http://www.gnu.org/licenses/>. */
23 #include "target-cris/opcode-cris.h"
24 //#include "libiberty.h"
27 void *qemu_malloc(size_t len
); /* can't include qemu-common.h here */
31 #define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
33 /* cris-opc.c -- Table of opcodes for the CRIS processor.
34 Copyright 2000, 2001, 2004 Free Software Foundation, Inc.
35 Contributed by Axis Communications AB, Lund, Sweden.
36 Originally written for GAS 1.38.1 by Mikael Asker.
37 Reorganized by Hans-Peter Nilsson.
39 This file is part of GAS, GDB and the GNU binutils.
41 GAS, GDB, and GNU binutils is free software; you can redistribute it
42 and/or modify it under the terms of the GNU General Public License as
43 published by the Free Software Foundation; either version 2, or (at your
44 option) any later version.
46 GAS, GDB, and GNU binutils are distributed in the hope that they will be
47 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
48 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
49 GNU General Public License for more details.
51 You should have received a copy of the GNU General Public License
52 along with this program; if not, see <http://www.gnu.org/licenses/>. */
58 /* This table isn't used for CRISv32 and the size of immediate operands. */
59 const struct cris_spec_reg
62 {"bz", 0, 1, cris_ver_v32p
, NULL
},
63 {"p0", 0, 1, 0, NULL
},
64 {"vr", 1, 1, 0, NULL
},
65 {"p1", 1, 1, 0, NULL
},
66 {"pid", 2, 1, cris_ver_v32p
, NULL
},
67 {"p2", 2, 1, cris_ver_v32p
, NULL
},
68 {"p2", 2, 1, cris_ver_warning
, NULL
},
69 {"srs", 3, 1, cris_ver_v32p
, NULL
},
70 {"p3", 3, 1, cris_ver_v32p
, NULL
},
71 {"p3", 3, 1, cris_ver_warning
, NULL
},
72 {"wz", 4, 2, cris_ver_v32p
, NULL
},
73 {"p4", 4, 2, 0, NULL
},
74 {"ccr", 5, 2, cris_ver_v0_10
, NULL
},
75 {"exs", 5, 4, cris_ver_v32p
, NULL
},
76 {"p5", 5, 2, cris_ver_v0_10
, NULL
},
77 {"p5", 5, 4, cris_ver_v32p
, NULL
},
78 {"dcr0",6, 2, cris_ver_v0_3
, NULL
},
79 {"eda", 6, 4, cris_ver_v32p
, NULL
},
80 {"p6", 6, 2, cris_ver_v0_3
, NULL
},
81 {"p6", 6, 4, cris_ver_v32p
, NULL
},
82 {"dcr1/mof", 7, 4, cris_ver_v10p
,
83 "Register `dcr1/mof' with ambiguous size specified. Guessing 4 bytes"},
84 {"dcr1/mof", 7, 2, cris_ver_v0_3
,
85 "Register `dcr1/mof' with ambiguous size specified. Guessing 2 bytes"},
86 {"mof", 7, 4, cris_ver_v10p
, NULL
},
87 {"dcr1",7, 2, cris_ver_v0_3
, NULL
},
88 {"p7", 7, 4, cris_ver_v10p
, NULL
},
89 {"p7", 7, 2, cris_ver_v0_3
, NULL
},
90 {"dz", 8, 4, cris_ver_v32p
, NULL
},
91 {"p8", 8, 4, 0, NULL
},
92 {"ibr", 9, 4, cris_ver_v0_10
, NULL
},
93 {"ebp", 9, 4, cris_ver_v32p
, NULL
},
94 {"p9", 9, 4, 0, NULL
},
95 {"irp", 10, 4, cris_ver_v0_10
, NULL
},
96 {"erp", 10, 4, cris_ver_v32p
, NULL
},
97 {"p10", 10, 4, 0, NULL
},
98 {"srp", 11, 4, 0, NULL
},
99 {"p11", 11, 4, 0, NULL
},
100 /* For disassembly use only. Accept at assembly with a warning. */
101 {"bar/dtp0", 12, 4, cris_ver_warning
,
102 "Ambiguous register `bar/dtp0' specified"},
103 {"nrp", 12, 4, cris_ver_v32p
, NULL
},
104 {"bar", 12, 4, cris_ver_v8_10
, NULL
},
105 {"dtp0",12, 4, cris_ver_v0_3
, NULL
},
106 {"p12", 12, 4, 0, NULL
},
107 /* For disassembly use only. Accept at assembly with a warning. */
108 {"dccr/dtp1",13, 4, cris_ver_warning
,
109 "Ambiguous register `dccr/dtp1' specified"},
110 {"ccs", 13, 4, cris_ver_v32p
, NULL
},
111 {"dccr",13, 4, cris_ver_v8_10
, NULL
},
112 {"dtp1",13, 4, cris_ver_v0_3
, NULL
},
113 {"p13", 13, 4, 0, NULL
},
114 {"brp", 14, 4, cris_ver_v3_10
, NULL
},
115 {"usp", 14, 4, cris_ver_v32p
, NULL
},
116 {"p14", 14, 4, cris_ver_v3p
, NULL
},
117 {"usp", 15, 4, cris_ver_v10
, NULL
},
118 {"spc", 15, 4, cris_ver_v32p
, NULL
},
119 {"p15", 15, 4, cris_ver_v10p
, NULL
},
120 {NULL
, 0, 0, cris_ver_version_all
, NULL
}
123 /* Add version specifiers to this table when necessary.
124 The (now) regular coding of register names suggests a simpler
126 const struct cris_support_reg cris_support_regs
[] =
147 /* All CRIS opcodes are 16 bits.
149 - The match component is a mask saying which bits must match a
150 particular opcode in order for an instruction to be an instance
153 - The args component is a string containing characters symbolically
154 matching the operands of an instruction. Used for both assembly
157 Operand-matching characters:
160 A The string "ACR" (case-insensitive).
161 B Not really an operand. It causes a "BDAP -size,SP" prefix to be
162 output for the PUSH alias-instructions and recognizes a push-
163 prefix at disassembly. This letter isn't recognized for v32.
164 Must be followed by a R or P letter.
165 ! Non-match pattern, will not match if there's a prefix insn.
166 b Non-matching operand, used for branches with 16-bit
167 displacement. Only recognized by the disassembler.
168 c 5-bit unsigned immediate in bits <4:0>.
169 C 4-bit unsigned immediate in bits <3:0>.
170 d At assembly, optionally (as in put other cases before this one)
171 ".d" or ".D" at the start of the operands, followed by one space
172 character. At disassembly, nothing.
173 D General register in bits <15:12> and <3:0>.
174 f List of flags in bits <15:12> and <3:0>.
175 i 6-bit signed immediate in bits <5:0>.
176 I 6-bit unsigned immediate in bits <5:0>.
177 M Size modifier (B, W or D) for CLEAR instructions.
178 m Size modifier (B, W or D) in bits <5:4>
179 N A 32-bit dword, like in the difference between s and y.
180 This has no effect on bits in the opcode. Can also be expressed
182 n As N, but PC-relative (to the start of the instruction).
183 o [-128..127] word offset in bits <7:1> and <0>. Used by 8-bit
185 O [-128..127] offset in bits <7:0>. Also matches a comma and a
186 general register after the expression, in bits <15:12>. Used
187 only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
188 P Special register in bits <15:12>.
189 p Indicates that the insn is a prefix insn. Must be first
191 Q As O, but don't relax; force an 8-bit offset.
192 R General register in bits <15:12>.
193 r General register in bits <3:0>.
194 S Source operand in bit <10> and a prefix; a 3-operand prefix
196 s Source operand in bits <10> and <3:0>, optionally with a
197 side-effect prefix, except [pc] (the name, not R15 as in ACR)
198 isn't allowed for v32 and higher.
199 T Support register in bits <15:12>.
200 u 4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
201 U Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
202 Not recognized at disassembly.
203 x Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
204 y Like 's' but do not allow an integer at assembly.
205 Y The difference s-y; only an integer is allowed.
206 z Size modifier (B or W) in bit <4>. */
209 /* Please note the order of the opcodes in this table is significant.
210 The assembler requires that all instances of the same mnemonic must
211 be consecutive. If they aren't, the assembler might not recognize
212 them, or may indicate an internal error.
214 The disassembler should not normally care about the order of the
215 opcodes, but will prefer an earlier alternative if the "match-score"
216 (see cris-dis.c) is computed as equal.
218 It should not be significant for proper execution that this table is
219 in alphabetical order, but please follow that convention for an easy
222 const struct cris_opcode
225 {"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE
, 0,
228 {"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE
, 0,
229 cris_reg_mode_add_sub_cmp_and_or_move_op
},
231 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD
, 0,
232 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
234 {"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE
,
236 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
238 {"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE
,
240 cris_three_operand_add_sub_cmp_and_or_op
},
242 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD
,
244 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
246 {"addc", 0x0570, 0x0A80, "r,R", 0, SIZE_FIX_32
,
248 cris_not_implemented_op
},
250 {"addc", 0x09A0, 0x0250, "s,R", 0, SIZE_FIX_32
,
252 cris_not_implemented_op
},
254 {"addi", 0x0540, 0x0A80, "x,r,A", 0, SIZE_NONE
,
258 {"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE
, 0,
261 /* This collates after "addo", but we want to disassemble as "addoq",
263 {"addoq", 0x0100, 0x0E00, "Q,A", 0, SIZE_NONE
,
265 cris_not_implemented_op
},
267 {"addo", 0x0940, 0x0280, "m s,R,A", 0, SIZE_FIELD_SIGNED
,
269 cris_not_implemented_op
},
271 /* This must be located after the insn above, lest we misinterpret
272 "addo.b -1,r0,acr" as "addo .b-1,r0,acr". FIXME: Sounds like a
274 {"addo", 0x0100, 0x0E00, "O,A", 0, SIZE_NONE
,
276 cris_not_implemented_op
},
278 {"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE
, 0,
279 cris_quick_mode_add_sub_op
},
281 {"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE
, 0,
282 cris_reg_mode_add_sub_cmp_and_or_move_op
},
284 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
285 {"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD
, 0,
286 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
288 {"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE
,
290 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
292 {"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE
,
294 cris_three_operand_add_sub_cmp_and_or_op
},
296 {"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE
, 0,
297 cris_reg_mode_add_sub_cmp_and_or_move_op
},
299 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
300 {"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD
, 0,
301 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
303 {"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE
,
305 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
307 {"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE
,
309 cris_three_operand_add_sub_cmp_and_or_op
},
311 {"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE
, 0,
312 cris_reg_mode_add_sub_cmp_and_or_move_op
},
314 {"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD
, 0,
315 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
317 {"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE
,
319 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
321 {"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE
,
323 cris_three_operand_add_sub_cmp_and_or_op
},
325 {"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE
, 0,
326 cris_quick_mode_and_cmp_move_or_op
},
328 {"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE
, 0,
331 {"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE
, 0,
334 {"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE
, 0,
337 /* FIXME: Should use branch #defines. */
338 {"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE
, 0,
339 cris_sixteen_bit_offset_branch_op
},
343 0x0F00+(0xF-CC_A
)*0x1000, "o", 1, SIZE_NONE
, 0,
344 cris_eight_bit_offset_branch_op
},
346 /* Needs to come after the usual "ba o", which might be relaxed to
348 {"ba", BA_DWORD_OPCODE
,
349 0xffff & (~BA_DWORD_OPCODE
), "n", 0, SIZE_FIX_32
,
351 cris_none_reg_mode_jump_op
},
353 {"bas", 0x0EBF, 0x0140, "n,P", 0, SIZE_FIX_32
,
355 cris_none_reg_mode_jump_op
},
357 {"basc", 0x0EFF, 0x0100, "n,P", 0, SIZE_FIX_32
,
359 cris_none_reg_mode_jump_op
},
362 BRANCH_QUICK_OPCODE
+CC_CC
*0x1000,
363 0x0f00+(0xF-CC_CC
)*0x1000, "o", 1, SIZE_NONE
, 0,
364 cris_eight_bit_offset_branch_op
},
367 BRANCH_QUICK_OPCODE
+CC_CS
*0x1000,
368 0x0f00+(0xF-CC_CS
)*0x1000, "o", 1, SIZE_NONE
, 0,
369 cris_eight_bit_offset_branch_op
},
372 BDAP_INDIR_OPCODE
, BDAP_INDIR_Z_BITS
, "pm s,R", 0, SIZE_FIELD_SIGNED
,
377 BDAP_QUICK_OPCODE
, BDAP_QUICK_Z_BITS
, "pO", 0, SIZE_NONE
,
379 cris_quick_mode_bdap_prefix
},
382 BRANCH_QUICK_OPCODE
+CC_EQ
*0x1000,
383 0x0f00+(0xF-CC_EQ
)*0x1000, "o", 1, SIZE_NONE
, 0,
384 cris_eight_bit_offset_branch_op
},
386 /* This is deliberately put before "bext" to trump it, even though not
387 in alphabetical order, since we don't do excluding version checks
390 BRANCH_QUICK_OPCODE
+CC_EXT
*0x1000,
391 0x0f00+(0xF-CC_EXT
)*0x1000, "o", 1, SIZE_NONE
,
393 cris_eight_bit_offset_branch_op
},
396 BRANCH_QUICK_OPCODE
+CC_EXT
*0x1000,
397 0x0f00+(0xF-CC_EXT
)*0x1000, "o", 1, SIZE_NONE
,
399 cris_eight_bit_offset_branch_op
},
402 BRANCH_QUICK_OPCODE
+CC_GE
*0x1000,
403 0x0f00+(0xF-CC_GE
)*0x1000, "o", 1, SIZE_NONE
, 0,
404 cris_eight_bit_offset_branch_op
},
407 BRANCH_QUICK_OPCODE
+CC_GT
*0x1000,
408 0x0f00+(0xF-CC_GT
)*0x1000, "o", 1, SIZE_NONE
, 0,
409 cris_eight_bit_offset_branch_op
},
412 BRANCH_QUICK_OPCODE
+CC_HI
*0x1000,
413 0x0f00+(0xF-CC_HI
)*0x1000, "o", 1, SIZE_NONE
, 0,
414 cris_eight_bit_offset_branch_op
},
417 BRANCH_QUICK_OPCODE
+CC_HS
*0x1000,
418 0x0f00+(0xF-CC_HS
)*0x1000, "o", 1, SIZE_NONE
, 0,
419 cris_eight_bit_offset_branch_op
},
421 {"biap", BIAP_OPCODE
, BIAP_Z_BITS
, "pm r,R", 0, SIZE_NONE
,
426 BRANCH_QUICK_OPCODE
+CC_LE
*0x1000,
427 0x0f00+(0xF-CC_LE
)*0x1000, "o", 1, SIZE_NONE
, 0,
428 cris_eight_bit_offset_branch_op
},
431 BRANCH_QUICK_OPCODE
+CC_LO
*0x1000,
432 0x0f00+(0xF-CC_LO
)*0x1000, "o", 1, SIZE_NONE
, 0,
433 cris_eight_bit_offset_branch_op
},
436 BRANCH_QUICK_OPCODE
+CC_LS
*0x1000,
437 0x0f00+(0xF-CC_LS
)*0x1000, "o", 1, SIZE_NONE
, 0,
438 cris_eight_bit_offset_branch_op
},
441 BRANCH_QUICK_OPCODE
+CC_LT
*0x1000,
442 0x0f00+(0xF-CC_LT
)*0x1000, "o", 1, SIZE_NONE
, 0,
443 cris_eight_bit_offset_branch_op
},
446 BRANCH_QUICK_OPCODE
+CC_MI
*0x1000,
447 0x0f00+(0xF-CC_MI
)*0x1000, "o", 1, SIZE_NONE
, 0,
448 cris_eight_bit_offset_branch_op
},
450 {"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32
,
452 cris_not_implemented_op
},
454 {"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE
,
456 cris_not_implemented_op
},
458 {"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE
,
460 cris_not_implemented_op
},
463 BRANCH_QUICK_OPCODE
+CC_NE
*0x1000,
464 0x0f00+(0xF-CC_NE
)*0x1000, "o", 1, SIZE_NONE
, 0,
465 cris_eight_bit_offset_branch_op
},
467 {"bound", 0x05c0, 0x0A00, "m r,R", 0, SIZE_NONE
, 0,
468 cris_two_operand_bound_op
},
469 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
470 {"bound", 0x09c0, 0x0200, "m s,R", 0, SIZE_FIELD
,
472 cris_two_operand_bound_op
},
473 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
474 {"bound", 0x0dcf, 0x0200, "m Y,R", 0, SIZE_FIELD
, 0,
475 cris_two_operand_bound_op
},
476 {"bound", 0x09c0, 0x0200, "m S,D", 0, SIZE_NONE
,
478 cris_two_operand_bound_op
},
479 {"bound", 0x09c0, 0x0600, "m S,R,r", 0, SIZE_NONE
,
481 cris_three_operand_bound_op
},
484 BRANCH_QUICK_OPCODE
+CC_PL
*0x1000,
485 0x0f00+(0xF-CC_PL
)*0x1000, "o", 1, SIZE_NONE
, 0,
486 cris_eight_bit_offset_branch_op
},
488 {"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE
,
493 BRANCH_QUICK_OPCODE
+CC_EXT
*0x1000,
494 0x0f00+(0xF-CC_EXT
)*0x1000, "o", 1, SIZE_NONE
,
496 cris_eight_bit_offset_branch_op
},
498 {"bsr", 0xBEBF, 0x4140, "n", 0, SIZE_FIX_32
,
500 cris_none_reg_mode_jump_op
},
502 {"bsrc", 0xBEFF, 0x4100, "n", 0, SIZE_FIX_32
,
504 cris_none_reg_mode_jump_op
},
506 {"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32
,
508 cris_not_implemented_op
},
510 {"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE
,
512 cris_not_implemented_op
},
514 {"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE
,
516 cris_not_implemented_op
},
518 {"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE
, 0,
520 {"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE
, 0,
524 BRANCH_QUICK_OPCODE
+CC_VC
*0x1000,
525 0x0f00+(0xF-CC_VC
)*0x1000, "o", 1, SIZE_NONE
, 0,
526 cris_eight_bit_offset_branch_op
},
529 BRANCH_QUICK_OPCODE
+CC_VS
*0x1000,
530 0x0f00+(0xF-CC_VS
)*0x1000, "o", 1, SIZE_NONE
, 0,
531 cris_eight_bit_offset_branch_op
},
533 {"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE
, 0,
534 cris_reg_mode_clear_op
},
536 {"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE
, 0,
537 cris_none_reg_mode_clear_test_op
},
539 {"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE
,
541 cris_none_reg_mode_clear_test_op
},
543 {"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE
, 0,
546 {"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE
, 0,
547 cris_reg_mode_add_sub_cmp_and_or_move_op
},
549 {"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD
, 0,
550 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
552 {"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE
,
554 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
556 {"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE
, 0,
557 cris_quick_mode_and_cmp_move_or_op
},
559 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
560 {"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD
, 0,
561 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
563 {"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE
,
565 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
567 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
568 {"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD
, 0,
569 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
571 {"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE
,
573 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
575 {"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE
, 0,
578 {"dip", DIP_OPCODE
, DIP_Z_BITS
, "ps", 0, SIZE_FIX_32
,
582 {"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD
, 0,
583 cris_not_implemented_op
},
585 {"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE
, 0,
586 cris_dstep_logshift_mstep_neg_not_op
},
588 {"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE
, 0,
591 {"fidxd", 0x0ab0, 0xf540, "[r]", 0, SIZE_NONE
,
593 cris_not_implemented_op
},
595 {"fidxi", 0x0d30, 0xF2C0, "[r]", 0, SIZE_NONE
,
597 cris_not_implemented_op
},
599 {"ftagd", 0x1AB0, 0xE540, "[r]", 0, SIZE_NONE
,
601 cris_not_implemented_op
},
603 {"ftagi", 0x1D30, 0xE2C0, "[r]", 0, SIZE_NONE
,
605 cris_not_implemented_op
},
607 {"halt", 0xF930, 0x06CF, "", 0, SIZE_NONE
,
609 cris_not_implemented_op
},
611 {"jas", 0x09B0, 0x0640, "r,P", 0, SIZE_NONE
,
613 cris_reg_mode_jump_op
},
615 {"jas", 0x0DBF, 0x0240, "N,P", 0, SIZE_FIX_32
,
617 cris_reg_mode_jump_op
},
619 {"jasc", 0x0B30, 0x04C0, "r,P", 0, SIZE_NONE
,
621 cris_reg_mode_jump_op
},
623 {"jasc", 0x0F3F, 0x00C0, "N,P", 0, SIZE_FIX_32
,
625 cris_reg_mode_jump_op
},
627 {"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE
,
629 cris_reg_mode_jump_op
},
631 {"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32
,
633 cris_none_reg_mode_jump_op
},
635 {"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE
,
637 cris_none_reg_mode_jump_op
},
639 {"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE
,
641 cris_reg_mode_jump_op
},
643 {"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32
,
645 cris_none_reg_mode_jump_op
},
647 {"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE
,
649 cris_none_reg_mode_jump_op
},
651 {"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE
,
653 cris_reg_mode_jump_op
},
655 {"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32
,
657 cris_none_reg_mode_jump_op
},
659 {"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE
,
661 cris_none_reg_mode_jump_op
},
663 {"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE
, 0,
664 cris_reg_mode_jump_op
},
666 {"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32
,
668 cris_none_reg_mode_jump_op
},
670 {"jsr", 0xBDBF, 0x4240, "N", 0, SIZE_FIX_32
,
672 cris_none_reg_mode_jump_op
},
674 {"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE
,
676 cris_none_reg_mode_jump_op
},
678 {"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE
,
680 cris_reg_mode_jump_op
},
682 {"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32
,
684 cris_none_reg_mode_jump_op
},
686 {"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE
,
688 cris_none_reg_mode_jump_op
},
690 {"jsrc", 0xBB30, 0x44C0, "r", 0, SIZE_NONE
,
692 cris_reg_mode_jump_op
},
694 {"jsrc", 0xBF3F, 0x40C0, "N", 0, SIZE_FIX_32
,
696 cris_reg_mode_jump_op
},
698 {"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE
, 0,
699 cris_reg_mode_jump_op
},
702 JUMP_INDIR_OPCODE
, JUMP_INDIR_Z_BITS
, "s", 0, SIZE_FIX_32
,
704 cris_none_reg_mode_jump_op
},
707 JUMP_INDIR_OPCODE
, JUMP_INDIR_Z_BITS
, "S", 0, SIZE_NONE
,
709 cris_none_reg_mode_jump_op
},
711 {"jump", 0x09F0, 0x060F, "P", 0, SIZE_NONE
,
713 cris_none_reg_mode_jump_op
},
716 JUMP_PC_INCR_OPCODE_V32
,
717 (0xffff & ~JUMP_PC_INCR_OPCODE_V32
), "N", 0, SIZE_FIX_32
,
719 cris_none_reg_mode_jump_op
},
721 {"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32
,
723 cris_none_reg_mode_jump_op
},
725 {"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE
,
727 cris_none_reg_mode_jump_op
},
729 {"lapc", 0x0970, 0x0680, "U,R", 0, SIZE_NONE
,
731 cris_not_implemented_op
},
733 {"lapc", 0x0D7F, 0x0280, "dn,R", 0, SIZE_FIX_32
,
735 cris_not_implemented_op
},
737 {"lapcq", 0x0970, 0x0680, "u,R", 0, SIZE_NONE
,
741 {"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE
, 0,
742 cris_dstep_logshift_mstep_neg_not_op
},
744 {"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE
, 0,
745 cris_dstep_logshift_mstep_neg_not_op
},
747 {"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE
, 0,
748 cris_dstep_logshift_mstep_neg_not_op
},
750 {"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE
, 0,
751 cris_dstep_logshift_mstep_neg_not_op
},
753 {"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE
,
755 cris_not_implemented_op
},
757 {"mcp", 0x07f0, 0x0800, "P,r", 0, SIZE_NONE
,
759 cris_not_implemented_op
},
761 {"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE
, 0,
762 cris_reg_mode_add_sub_cmp_and_or_move_op
},
764 {"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD
, 0,
765 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
767 {"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE
,
769 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
771 {"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE
, 0,
772 cris_move_to_preg_op
},
774 {"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE
, 0,
775 cris_reg_mode_move_from_preg_op
},
777 {"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD
, 0,
778 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
780 {"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE
,
782 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
785 MOVE_M_TO_PREG_OPCODE
, MOVE_M_TO_PREG_ZBITS
,
786 "s,P", 0, SIZE_SPEC_REG
, 0,
787 cris_move_to_preg_op
},
789 {"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE
,
791 cris_move_to_preg_op
},
793 {"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG
, 0,
794 cris_none_reg_mode_move_from_preg_op
},
796 {"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE
,
798 cris_none_reg_mode_move_from_preg_op
},
800 {"move", 0x0B70, 0x0480, "r,T", 0, SIZE_NONE
,
802 cris_not_implemented_op
},
804 {"move", 0x0F70, 0x0080, "T,r", 0, SIZE_NONE
,
806 cris_not_implemented_op
},
808 {"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32
, 0,
809 cris_move_reg_to_mem_movem_op
},
811 {"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE
,
813 cris_move_reg_to_mem_movem_op
},
815 {"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32
, 0,
816 cris_move_mem_to_reg_movem_op
},
818 {"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE
,
820 cris_move_mem_to_reg_movem_op
},
822 {"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE
, 0,
823 cris_quick_mode_and_cmp_move_or_op
},
825 {"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE
, 0,
826 cris_reg_mode_add_sub_cmp_and_or_move_op
},
828 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
829 {"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD
, 0,
830 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
832 {"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE
,
834 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
836 {"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE
, 0,
837 cris_reg_mode_add_sub_cmp_and_or_move_op
},
839 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
840 {"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD
, 0,
841 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
843 {"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE
,
845 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
847 {"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE
,
849 cris_dstep_logshift_mstep_neg_not_op
},
851 {"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE
,
855 {"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE
,
859 {"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE
, 0,
860 cris_dstep_logshift_mstep_neg_not_op
},
862 {"nop", NOP_OPCODE
, NOP_Z_BITS
, "", 0, SIZE_NONE
,
866 {"nop", NOP_OPCODE_V32
, NOP_Z_BITS_V32
, "", 0, SIZE_NONE
,
870 {"not", 0x8770, 0x7880, "r", 0, SIZE_NONE
, 0,
871 cris_dstep_logshift_mstep_neg_not_op
},
873 {"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE
, 0,
874 cris_reg_mode_add_sub_cmp_and_or_move_op
},
876 {"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD
, 0,
877 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
879 {"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE
,
881 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
883 {"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE
,
885 cris_three_operand_add_sub_cmp_and_or_op
},
887 {"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE
, 0,
888 cris_quick_mode_and_cmp_move_or_op
},
890 {"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE
,
892 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
894 {"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE
,
896 cris_none_reg_mode_move_from_preg_op
},
898 {"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE
,
900 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
902 {"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE
,
904 cris_move_to_preg_op
},
906 {"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE
,
908 cris_not_implemented_op
},
910 {"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE
,
912 cris_not_implemented_op
},
914 {"rfe", 0x2930, 0xD6CF, "", 0, SIZE_NONE
,
916 cris_not_implemented_op
},
918 {"rfg", 0x4930, 0xB6CF, "", 0, SIZE_NONE
,
920 cris_not_implemented_op
},
922 {"rfn", 0x5930, 0xA6CF, "", 0, SIZE_NONE
,
924 cris_not_implemented_op
},
926 {"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE
,
928 cris_reg_mode_move_from_preg_op
},
930 {"ret", 0xB9F0, 0x460F, "", 1, SIZE_NONE
,
932 cris_reg_mode_move_from_preg_op
},
934 {"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE
,
936 cris_reg_mode_move_from_preg_op
},
938 {"rete", 0xA9F0, 0x560F, "", 1, SIZE_NONE
,
940 cris_reg_mode_move_from_preg_op
},
942 {"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE
,
944 cris_reg_mode_move_from_preg_op
},
946 {"retn", 0xC9F0, 0x360F, "", 1, SIZE_NONE
,
948 cris_reg_mode_move_from_preg_op
},
950 {"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE
,
952 cris_not_implemented_op
},
954 {"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE
,
956 cris_not_implemented_op
},
960 0x0AC0+(0xf-CC_A
)*0x1000, "r", 0, SIZE_NONE
, 0,
964 0x0530+CC_EXT
*0x1000,
965 0x0AC0+(0xf-CC_EXT
)*0x1000, "r", 0, SIZE_NONE
,
971 0x0AC0+(0xf-CC_CC
)*0x1000, "r", 0, SIZE_NONE
, 0,
976 0x0AC0+(0xf-CC_CS
)*0x1000, "r", 0, SIZE_NONE
, 0,
981 0x0AC0+(0xf-CC_EQ
)*0x1000, "r", 0, SIZE_NONE
, 0,
984 {"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE
, 0,
987 {"sfe", 0x3930, 0xC6CF, "", 0, SIZE_NONE
,
989 cris_not_implemented_op
},
991 /* Need to have "swf" in front of "sext" so it is the one displayed in
994 0x0530+CC_EXT
*0x1000,
995 0x0AC0+(0xf-CC_EXT
)*0x1000, "r", 0, SIZE_NONE
,
1000 0x0530+CC_EXT
*0x1000,
1001 0x0AC0+(0xf-CC_EXT
)*0x1000, "r", 0, SIZE_NONE
,
1006 0x0530+CC_GE
*0x1000,
1007 0x0AC0+(0xf-CC_GE
)*0x1000, "r", 0, SIZE_NONE
, 0,
1011 0x0530+CC_GT
*0x1000,
1012 0x0AC0+(0xf-CC_GT
)*0x1000, "r", 0, SIZE_NONE
, 0,
1016 0x0530+CC_HI
*0x1000,
1017 0x0AC0+(0xf-CC_HI
)*0x1000, "r", 0, SIZE_NONE
, 0,
1021 0x0530+CC_HS
*0x1000,
1022 0x0AC0+(0xf-CC_HS
)*0x1000, "r", 0, SIZE_NONE
, 0,
1026 0x0530+CC_LE
*0x1000,
1027 0x0AC0+(0xf-CC_LE
)*0x1000, "r", 0, SIZE_NONE
, 0,
1031 0x0530+CC_LO
*0x1000,
1032 0x0AC0+(0xf-CC_LO
)*0x1000, "r", 0, SIZE_NONE
, 0,
1036 0x0530+CC_LS
*0x1000,
1037 0x0AC0+(0xf-CC_LS
)*0x1000, "r", 0, SIZE_NONE
, 0,
1041 0x0530+CC_LT
*0x1000,
1042 0x0AC0+(0xf-CC_LT
)*0x1000, "r", 0, SIZE_NONE
, 0,
1046 0x0530+CC_MI
*0x1000,
1047 0x0AC0+(0xf-CC_MI
)*0x1000, "r", 0, SIZE_NONE
, 0,
1051 0x0530+CC_NE
*0x1000,
1052 0x0AC0+(0xf-CC_NE
)*0x1000, "r", 0, SIZE_NONE
, 0,
1056 0x0530+CC_PL
*0x1000,
1057 0x0AC0+(0xf-CC_PL
)*0x1000, "r", 0, SIZE_NONE
, 0,
1060 {"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE
, 0,
1061 cris_reg_mode_add_sub_cmp_and_or_move_op
},
1063 {"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD
, 0,
1064 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
1066 {"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE
,
1068 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
1070 {"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE
,
1072 cris_three_operand_add_sub_cmp_and_or_op
},
1074 {"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE
, 0,
1075 cris_quick_mode_add_sub_op
},
1077 {"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE
, 0,
1078 cris_reg_mode_add_sub_cmp_and_or_move_op
},
1080 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
1081 {"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD
, 0,
1082 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
1084 {"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE
,
1086 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
1088 {"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE
,
1090 cris_three_operand_add_sub_cmp_and_or_op
},
1092 {"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE
, 0,
1093 cris_reg_mode_add_sub_cmp_and_or_move_op
},
1095 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
1096 {"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD
, 0,
1097 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
1099 {"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE
,
1101 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
1103 {"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE
,
1105 cris_three_operand_add_sub_cmp_and_or_op
},
1108 0x0530+CC_VC
*0x1000,
1109 0x0AC0+(0xf-CC_VC
)*0x1000, "r", 0, SIZE_NONE
, 0,
1113 0x0530+CC_VS
*0x1000,
1114 0x0AC0+(0xf-CC_VS
)*0x1000, "r", 0, SIZE_NONE
, 0,
1117 /* The insn "swapn" is the same as "not" and will be disassembled as
1118 such, but the swap* family of mnmonics are generally v8-and-higher
1119 only, so count it in. */
1120 {"swapn", 0x8770, 0x7880, "r", 0, SIZE_NONE
,
1122 cris_not_implemented_op
},
1124 {"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE
,
1126 cris_not_implemented_op
},
1128 {"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE
,
1130 cris_not_implemented_op
},
1132 {"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE
,
1134 cris_not_implemented_op
},
1136 {"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE
,
1138 cris_not_implemented_op
},
1140 {"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE
,
1142 cris_not_implemented_op
},
1144 {"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE
,
1146 cris_not_implemented_op
},
1148 {"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE
,
1150 cris_not_implemented_op
},
1152 {"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE
,
1154 cris_not_implemented_op
},
1156 {"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE
,
1158 cris_not_implemented_op
},
1160 {"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE
,
1162 cris_not_implemented_op
},
1164 {"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE
,
1166 cris_not_implemented_op
},
1168 {"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE
,
1170 cris_not_implemented_op
},
1172 {"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE
,
1174 cris_not_implemented_op
},
1176 {"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE
,
1178 cris_not_implemented_op
},
1180 {"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE
,
1182 cris_reg_mode_test_op
},
1184 {"test", 0x0b80, 0xf040, "m y", 0, SIZE_FIELD
, 0,
1185 cris_none_reg_mode_clear_test_op
},
1187 {"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE
,
1189 cris_none_reg_mode_clear_test_op
},
1191 {"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE
, 0,
1194 {NULL
, 0, 0, NULL
, 0, 0, 0, cris_not_implemented_op
}
1197 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
1216 /* This is a placeholder. In v0, this would be "ext". In v32, this
1217 is "sb". See cris_conds15. */
1221 /* Different names and semantics for condition 1111 (0xf). */
1222 const struct cris_cond15 cris_cond15s
[] =
1224 /* FIXME: In what version did condition "ext" disappear? */
1225 {"ext", cris_ver_v0_3
},
1226 {"wf", cris_ver_v10
},
1227 {"sb", cris_ver_v32p
},
1234 * eval: (c-set-style "gnu")
1235 * indent-tabs-mode: t
1240 /* No instruction will be disassembled longer than this. In theory, and
1241 in silicon, address prefixes can be cascaded. In practice, cascading
1242 is not used by GCC, and not supported by the assembler. */
1243 #ifndef MAX_BYTES_PER_CRIS_INSN
1244 #define MAX_BYTES_PER_CRIS_INSN 8
1247 /* Whether or not to decode prefixes, folding it into the following
1248 instruction. FIXME: Make this optional later. */
1249 #ifndef PARSE_PREFIX
1250 #define PARSE_PREFIX 1
1253 /* Sometimes we prefix all registers with this character. */
1254 #define REGISTER_PREFIX_CHAR '$'
1256 /* Whether or not to trace the following sequence:
1259 adds.w [pc+r%d.w],pc
1261 This is the assembly form of a switch-statement in C.
1262 The "sub is optional. If there is none, then X will be zero.
1263 X is the value of the first case,
1264 Y is the number of cases (including default).
1266 This results in case offsets printed on the form:
1267 case N: -> case_address
1268 where N is an estimation on the corresponding 'case' operand in C,
1269 and case_address is where execution of that case continues after the
1270 sequence presented above.
1272 The old style of output was to print the offsets as instructions,
1273 which made it hard to follow "case"-constructs in the disassembly,
1274 and caused a lot of annoying warnings about undefined instructions.
1276 FIXME: Make this optional later. */
1278 #define TRACE_CASE (disdata->trace_case)
1281 enum cris_disass_family
1282 { cris_dis_v0_v10
, cris_dis_common_v10_v32
, cris_dis_v32
};
1284 /* Stored in the disasm_info->private_data member. */
1285 struct cris_disasm_data
1287 /* Whether to print something less confusing if we find something
1288 matching a switch-construct. */
1289 bfd_boolean trace_case
;
1291 /* Whether this code is flagged as crisv32. FIXME: Should be an enum
1292 that includes "compatible". */
1293 enum cris_disass_family distype
;
1296 /* Value of first element in switch. */
1297 static long case_offset
= 0;
1299 /* How many more case-offsets to print. */
1300 static long case_offset_counter
= 0;
1302 /* Number of case offsets. */
1303 static long no_of_case_offsets
= 0;
1305 /* Candidate for next case_offset. */
1306 static long last_immediate
= 0;
1308 static int cris_constraint
1309 (const char *, unsigned, unsigned, struct cris_disasm_data
*);
1311 /* Parse disassembler options and store state in info. FIXME: For the
1312 time being, we abuse static variables. */
1315 cris_parse_disassembler_options (disassemble_info
*info
,
1316 enum cris_disass_family distype
)
1318 struct cris_disasm_data
*disdata
;
1320 info
->private_data
= calloc (1, sizeof (struct cris_disasm_data
));
1321 disdata
= (struct cris_disasm_data
*) info
->private_data
;
1322 if (disdata
== NULL
)
1327 = (info
->disassembler_options
== NULL
1328 || (strcmp (info
->disassembler_options
, "nocase") != 0));
1330 disdata
->distype
= distype
;
1334 static const struct cris_spec_reg
*
1335 spec_reg_info (unsigned int sreg
, enum cris_disass_family distype
)
1339 for (i
= 0; cris_spec_regs
[i
].name
!= NULL
; i
++)
1341 if (cris_spec_regs
[i
].number
== sreg
)
1343 if (distype
== cris_dis_v32
)
1344 switch (cris_spec_regs
[i
].applicable_version
)
1346 case cris_ver_warning
:
1347 case cris_ver_version_all
:
1352 /* No ambiguous sizes or register names with CRISv32. */
1353 if (cris_spec_regs
[i
].warning
== NULL
)
1354 return &cris_spec_regs
[i
];
1358 else if (cris_spec_regs
[i
].applicable_version
!= cris_ver_v32p
)
1359 return &cris_spec_regs
[i
];
1366 /* Return the number of bits in the argument. */
1369 number_of_bits (unsigned int val
)
1373 for (bits
= 0; val
!= 0; val
&= val
- 1)
1379 /* Get an entry in the opcode-table. */
1381 static const struct cris_opcode
*
1382 get_opcode_entry (unsigned int insn
,
1383 unsigned int prefix_insn
,
1384 struct cris_disasm_data
*disdata
)
1386 /* For non-prefixed insns, we keep a table of pointers, indexed by the
1387 insn code. Each entry is initialized when found to be NULL. */
1388 static const struct cris_opcode
**opc_table
= NULL
;
1390 const struct cris_opcode
*max_matchedp
= NULL
;
1391 const struct cris_opcode
**prefix_opc_table
= NULL
;
1393 /* We hold a table for each prefix that need to be handled differently. */
1394 static const struct cris_opcode
**dip_prefixes
= NULL
;
1395 static const struct cris_opcode
**bdapq_m1_prefixes
= NULL
;
1396 static const struct cris_opcode
**bdapq_m2_prefixes
= NULL
;
1397 static const struct cris_opcode
**bdapq_m4_prefixes
= NULL
;
1398 static const struct cris_opcode
**rest_prefixes
= NULL
;
1400 /* Allocate and clear the opcode-table. */
1401 if (opc_table
== NULL
)
1403 opc_table
= qemu_malloc (65536 * sizeof (opc_table
[0]));
1405 memset (opc_table
, 0, 65536 * sizeof (const struct cris_opcode
*));
1408 = qemu_malloc (65536 * sizeof (const struct cris_opcode
**));
1410 memset (dip_prefixes
, 0, 65536 * sizeof (dip_prefixes
[0]));
1413 = qemu_malloc (65536 * sizeof (const struct cris_opcode
**));
1415 memset (bdapq_m1_prefixes
, 0, 65536 * sizeof (bdapq_m1_prefixes
[0]));
1418 = qemu_malloc (65536 * sizeof (const struct cris_opcode
**));
1420 memset (bdapq_m2_prefixes
, 0, 65536 * sizeof (bdapq_m2_prefixes
[0]));
1423 = qemu_malloc (65536 * sizeof (const struct cris_opcode
**));
1425 memset (bdapq_m4_prefixes
, 0, 65536 * sizeof (bdapq_m4_prefixes
[0]));
1428 = qemu_malloc (65536 * sizeof (const struct cris_opcode
**));
1430 memset (rest_prefixes
, 0, 65536 * sizeof (rest_prefixes
[0]));
1433 /* Get the right table if this is a prefix.
1434 This code is connected to cris_constraints in that it knows what
1435 prefixes play a role in recognition of patterns; the necessary
1436 state is reflected by which table is used. If constraints
1437 involving match or non-match of prefix insns are changed, then this
1438 probably needs changing too. */
1439 if (prefix_insn
!= NO_CRIS_PREFIX
)
1441 const struct cris_opcode
*popcodep
1442 = (opc_table
[prefix_insn
] != NULL
1443 ? opc_table
[prefix_insn
]
1444 : get_opcode_entry (prefix_insn
, NO_CRIS_PREFIX
, disdata
));
1446 if (popcodep
== NULL
)
1449 if (popcodep
->match
== BDAP_QUICK_OPCODE
)
1451 /* Since some offsets are recognized with "push" macros, we
1452 have to have different tables for them. */
1453 int offset
= (prefix_insn
& 255);
1461 prefix_opc_table
= bdapq_m4_prefixes
;
1465 prefix_opc_table
= bdapq_m2_prefixes
;
1469 prefix_opc_table
= bdapq_m1_prefixes
;
1473 prefix_opc_table
= rest_prefixes
;
1477 else if (popcodep
->match
== DIP_OPCODE
)
1478 /* We don't allow postincrement when the prefix is DIP, so use a
1479 different table for DIP. */
1480 prefix_opc_table
= dip_prefixes
;
1482 prefix_opc_table
= rest_prefixes
;
1485 if (prefix_insn
!= NO_CRIS_PREFIX
1486 && prefix_opc_table
[insn
] != NULL
)
1487 max_matchedp
= prefix_opc_table
[insn
];
1488 else if (prefix_insn
== NO_CRIS_PREFIX
&& opc_table
[insn
] != NULL
)
1489 max_matchedp
= opc_table
[insn
];
1492 const struct cris_opcode
*opcodep
;
1493 int max_level_of_match
= -1;
1495 for (opcodep
= cris_opcodes
;
1496 opcodep
->name
!= NULL
;
1501 if (disdata
->distype
== cris_dis_v32
)
1503 switch (opcodep
->applicable_version
)
1505 case cris_ver_version_all
:
1509 case cris_ver_v0_10
:
1510 case cris_ver_v3_10
:
1511 case cris_ver_sim_v0_10
:
1512 case cris_ver_v8_10
:
1514 case cris_ver_warning
:
1531 switch (opcodep
->applicable_version
)
1533 case cris_ver_version_all
:
1536 case cris_ver_v0_10
:
1538 case cris_ver_v8_10
:
1540 case cris_ver_sim_v0_10
:
1542 case cris_ver_warning
:
1555 /* We give a double lead for bits matching the template in
1556 cris_opcodes. Not even, because then "move p8,r10" would
1557 be given 2 bits lead over "clear.d r10". When there's a
1558 tie, the first entry in the table wins. This is
1559 deliberate, to avoid a more complicated recognition
1561 if ((opcodep
->match
& insn
) == opcodep
->match
1562 && (opcodep
->lose
& insn
) == 0
1564 = cris_constraint (opcodep
->args
,
1570 += 2 * number_of_bits (opcodep
->match
1572 > max_level_of_match
))
1574 max_matchedp
= opcodep
;
1575 max_level_of_match
= level_of_match
;
1577 /* If there was a full match, never mind looking
1579 if (level_of_match
>= 2 * 16)
1583 /* Fill in the new entry.
1585 If there are changes to the opcode-table involving prefixes, and
1586 disassembly then does not work correctly, try removing the
1587 else-clause below that fills in the prefix-table. If that
1588 helps, you need to change the prefix_opc_table setting above, or
1589 something related. */
1590 if (prefix_insn
== NO_CRIS_PREFIX
)
1591 opc_table
[insn
] = max_matchedp
;
1593 prefix_opc_table
[insn
] = max_matchedp
;
1596 return max_matchedp
;
1599 /* Return -1 if the constraints of a bitwise-matched instruction say
1600 that there is no match. Otherwise return a nonnegative number
1601 indicating the confidence in the match (higher is better). */
1604 cris_constraint (const char *cs
,
1606 unsigned int prefix_insn
,
1607 struct cris_disasm_data
*disdata
)
1614 for (s
= cs
; *s
; s
++)
1618 /* Do not recognize "pop" if there's a prefix and then only for
1620 if (prefix_insn
!= NO_CRIS_PREFIX
1621 || disdata
->distype
!= cris_dis_v0_v10
)
1626 /* Not recognized at disassembly. */
1630 /* Size modifier for "clear", i.e. special register 0, 4 or 8.
1631 Check that it is one of them. Only special register 12 could
1632 be mismatched, but checking for matches is more logical than
1633 checking for mismatches when there are only a few cases. */
1634 tmp
= ((insn
>> 12) & 0xf);
1635 if (tmp
!= 0 && tmp
!= 4 && tmp
!= 8)
1640 if ((insn
& 0x30) == 0x30)
1645 /* A prefix operand without side-effect. */
1646 if (prefix_insn
!= NO_CRIS_PREFIX
&& (insn
& 0x400) == 0)
1657 /* If this is a prefixed insn with postincrement (side-effect),
1658 the prefix must not be DIP. */
1659 if (prefix_insn
!= NO_CRIS_PREFIX
)
1663 const struct cris_opcode
*prefix_opcodep
1664 = get_opcode_entry (prefix_insn
, NO_CRIS_PREFIX
, disdata
);
1666 if (prefix_opcodep
->match
== DIP_OPCODE
)
1675 /* If we don't fall through, then the prefix is ok. */
1678 /* A "push" prefix. Check for valid "push" size.
1679 In case of special register, it may be != 4. */
1680 if (prefix_insn
!= NO_CRIS_PREFIX
)
1682 /* Match the prefix insn to BDAPQ. */
1683 const struct cris_opcode
*prefix_opcodep
1684 = get_opcode_entry (prefix_insn
, NO_CRIS_PREFIX
, disdata
);
1686 if (prefix_opcodep
->match
== BDAP_QUICK_OPCODE
)
1688 int pushsize
= (prefix_insn
& 255);
1695 unsigned int spec_reg
= (insn
>> 12) & 15;
1696 const struct cris_spec_reg
*sregp
1697 = spec_reg_info (spec_reg
, disdata
->distype
);
1699 /* For a special-register, the "prefix size" must
1700 match the size of the register. */
1701 if (sregp
&& sregp
->reg_size
== (unsigned int) -pushsize
)
1704 else if (s
[1] == 'R')
1706 if ((insn
& 0x30) == 0x20 && pushsize
== -4)
1709 /* FIXME: Should abort here; next constraint letter
1710 *must* be 'P' or 'R'. */
1716 retval
= (((insn
>> 12) & 15) == (insn
& 15));
1725 const struct cris_spec_reg
*sregp
1726 = spec_reg_info ((insn
>> 12) & 15, disdata
->distype
);
1728 /* Since we match four bits, we will give a value of 4-1 = 3
1729 in a match. If there is a corresponding exact match of a
1730 special register in another pattern, it will get a value of
1731 4, which will be higher. This should be correct in that an
1732 exact pattern would match better than a general pattern.
1734 Note that there is a reason for not returning zero; the
1735 pattern for "clear" is partly matched in the bit-pattern
1736 (the two lower bits must be zero), while the bit-pattern
1737 for a move from a special register is matched in the
1738 register constraint. */
1750 if (prefix_insn
!= NO_CRIS_PREFIX
&& ! prefix_ok
)
1756 /* Format number as hex with a leading "0x" into outbuffer. */
1759 format_hex (unsigned long number
,
1761 struct cris_disasm_data
*disdata
)
1763 /* Truncate negative numbers on >32-bit hosts. */
1764 number
&= 0xffffffff;
1766 sprintf (outbuffer
, "0x%lx", number
);
1768 /* Save this value for the "case" support. */
1770 last_immediate
= number
;
1772 return outbuffer
+ strlen (outbuffer
);
1775 /* Format number as decimal into outbuffer. Parameter signedp says
1776 whether the number should be formatted as signed (!= 0) or
1780 format_dec (long number
, char *outbuffer
, int signedp
)
1782 last_immediate
= number
;
1783 sprintf (outbuffer
, signedp
? "%ld" : "%lu", number
);
1785 return outbuffer
+ strlen (outbuffer
);
1788 /* Format the name of the general register regno into outbuffer. */
1791 format_reg (struct cris_disasm_data
*disdata
,
1793 char *outbuffer_start
,
1794 bfd_boolean with_reg_prefix
)
1796 char *outbuffer
= outbuffer_start
;
1798 if (with_reg_prefix
)
1799 *outbuffer
++ = REGISTER_PREFIX_CHAR
;
1804 /* For v32, there is no context in which we output PC. */
1805 if (disdata
->distype
== cris_dis_v32
)
1806 strcpy (outbuffer
, "acr");
1808 strcpy (outbuffer
, "pc");
1812 strcpy (outbuffer
, "sp");
1816 sprintf (outbuffer
, "r%d", regno
);
1820 return outbuffer_start
+ strlen (outbuffer_start
);
1823 /* Format the name of a support register into outbuffer. */
1826 format_sup_reg (unsigned int regno
,
1827 char *outbuffer_start
,
1828 bfd_boolean with_reg_prefix
)
1830 char *outbuffer
= outbuffer_start
;
1833 if (with_reg_prefix
)
1834 *outbuffer
++ = REGISTER_PREFIX_CHAR
;
1836 for (i
= 0; cris_support_regs
[i
].name
!= NULL
; i
++)
1837 if (cris_support_regs
[i
].number
== regno
)
1839 sprintf (outbuffer
, "%s", cris_support_regs
[i
].name
);
1840 return outbuffer_start
+ strlen (outbuffer_start
);
1843 /* There's supposed to be register names covering all numbers, though
1844 some may be generic names. */
1845 sprintf (outbuffer
, "format_sup_reg-BUG");
1846 return outbuffer_start
+ strlen (outbuffer_start
);
1849 /* Return the length of an instruction. */
1852 bytes_to_skip (unsigned int insn
,
1853 const struct cris_opcode
*matchedp
,
1854 enum cris_disass_family distype
,
1855 const struct cris_opcode
*prefix_matchedp
)
1857 /* Each insn is a word plus "immediate" operands. */
1858 unsigned to_skip
= 2;
1859 const char *template = matchedp
->args
;
1862 for (s
= template; *s
; s
++)
1863 if ((*s
== 's' || *s
== 'N' || *s
== 'Y')
1864 && (insn
& 0x400) && (insn
& 15) == 15
1865 && prefix_matchedp
== NULL
)
1867 /* Immediate via [pc+], so we have to check the size of the
1869 int mode_size
= 1 << ((insn
>> 4) & (*template == 'z' ? 1 : 3));
1871 if (matchedp
->imm_oprnd_size
== SIZE_FIX_32
)
1873 else if (matchedp
->imm_oprnd_size
== SIZE_SPEC_REG
)
1875 const struct cris_spec_reg
*sregp
1876 = spec_reg_info ((insn
>> 12) & 15, distype
);
1878 /* FIXME: Improve error handling; should have been caught
1883 /* PC is incremented by two, not one, for a byte. Except on
1884 CRISv32, where constants are always DWORD-size for
1885 special registers. */
1887 distype
== cris_dis_v32
? 4 : (sregp
->reg_size
+ 1) & ~1;
1890 to_skip
+= (mode_size
+ 1) & ~1;
1900 /* Print condition code flags. */
1903 print_flags (struct cris_disasm_data
*disdata
, unsigned int insn
, char *cp
)
1905 /* Use the v8 (Etrax 100) flag definitions for disassembly.
1906 The differences with v0 (Etrax 1..4) vs. Svinto are:
1909 FIXME: Emit v0..v3 flag names somehow. */
1910 static const char v8_fnames
[] = "cvznxibm";
1911 static const char v32_fnames
[] = "cvznxiup";
1913 = disdata
->distype
== cris_dis_v32
? v32_fnames
: v8_fnames
;
1915 unsigned char flagbits
= (((insn
>> 8) & 0xf0) | (insn
& 15));
1918 for (i
= 0; i
< 8; i
++)
1919 if (flagbits
& (1 << i
))
1925 /* Print out an insn with its operands, and update the info->insn_type
1926 fields. The prefix_opcodep and the rest hold a prefix insn that is
1927 supposed to be output as an address mode. */
1930 print_with_operands (const struct cris_opcode
*opcodep
,
1932 unsigned char *buffer
,
1934 disassemble_info
*info
,
1935 /* If a prefix insn was before this insn (and is supposed
1936 to be output as an address), here is a description of
1938 const struct cris_opcode
*prefix_opcodep
,
1939 unsigned int prefix_insn
,
1940 unsigned char *prefix_buffer
,
1941 bfd_boolean with_reg_prefix
)
1943 /* Get a buffer of somewhat reasonable size where we store
1944 intermediate parts of the insn. */
1945 char temp
[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
1947 static const char mode_char
[] = "bwd?";
1950 struct cris_disasm_data
*disdata
1951 = (struct cris_disasm_data
*) info
->private_data
;
1953 /* Print out the name first thing we do. */
1954 (*info
->fprintf_func
) (info
->stream
, "%s", opcodep
->name
);
1959 /* Ignore any prefix indicator. */
1963 if (*s
== 'm' || *s
== 'M' || *s
== 'z')
1967 /* Get the size-letter. */
1969 ? (insn
& 0x8000 ? 'd'
1970 : insn
& 0x4000 ? 'w' : 'b')
1971 : mode_char
[(insn
>> 4) & (*s
== 'z' ? 1 : 3)];
1973 /* Ignore the size and the space character that follows. */
1977 /* Add a space if this isn't a long-branch, because for those will add
1978 the condition part of the name later. */
1979 if (opcodep
->match
!= (BRANCH_PC_LOW
+ BRANCH_INCR_HIGH
* 256))
1982 /* Fill in the insn-type if deducible from the name (and there's no
1984 if (opcodep
->name
[0] == 'j')
1986 if (CONST_STRNEQ (opcodep
->name
, "jsr"))
1987 /* It's "jsr" or "jsrc". */
1988 info
->insn_type
= dis_jsr
;
1990 /* Any other jump-type insn is considered a branch. */
1991 info
->insn_type
= dis_branch
;
1994 /* We might know some more fields right now. */
1995 info
->branch_delay_insns
= opcodep
->delayed
;
1997 /* Handle operands. */
2003 tp
= format_sup_reg ((insn
>> 12) & 15, tp
, with_reg_prefix
);
2007 if (with_reg_prefix
)
2008 *tp
++ = REGISTER_PREFIX_CHAR
;
2021 /* Ignore at this point; used at earlier stages to avoid
2022 recognition if there's a prefix at something that in other
2023 ways looks like a "pop". */
2027 /* Ignore. This is an optional ".d " on the large one of
2032 /* This was the prefix that made this a "push". We've already
2033 handled it by recognizing it, so signal that the prefix is
2034 handled by setting it to NULL. */
2035 prefix_opcodep
= NULL
;
2040 tp
= format_reg (disdata
, insn
& 15, tp
, with_reg_prefix
);
2044 tp
= format_reg (disdata
, (insn
>> 12) & 15, tp
, with_reg_prefix
);
2049 /* Like N but pc-relative to the start of the insn. */
2050 unsigned long number
2051 = (buffer
[2] + buffer
[3] * 256 + buffer
[4] * 65536
2052 + buffer
[5] * 0x1000000 + addr
);
2054 /* Finish off and output previous formatted bytes. */
2057 (*info
->fprintf_func
) (info
->stream
, "%s", temp
);
2060 (*info
->print_address_func
) ((bfd_vma
) number
, info
);
2066 /* Like n but the offset is bits <3:0> in the instruction. */
2067 unsigned long number
= (buffer
[0] & 0xf) * 2 + addr
;
2069 /* Finish off and output previous formatted bytes. */
2072 (*info
->fprintf_func
) (info
->stream
, "%s", temp
);
2075 (*info
->print_address_func
) ((bfd_vma
) number
, info
);
2084 /* Any "normal" memory operand. */
2085 if ((insn
& 0x400) && (insn
& 15) == 15 && prefix_opcodep
== NULL
)
2087 /* We're looking at [pc+], i.e. we need to output an immediate
2088 number, where the size can depend on different things. */
2091 = ((*cs
== 'z' && (insn
& 0x20))
2092 || opcodep
->match
== BDAP_QUICK_OPCODE
);
2095 if (opcodep
->imm_oprnd_size
== SIZE_FIX_32
)
2097 else if (opcodep
->imm_oprnd_size
== SIZE_SPEC_REG
)
2099 const struct cris_spec_reg
*sregp
2100 = spec_reg_info ((insn
>> 12) & 15, disdata
->distype
);
2102 /* A NULL return should have been as a non-match earlier,
2103 so catch it as an internal error in the error-case
2106 /* Whatever non-valid size. */
2109 /* PC is always incremented by a multiple of two.
2110 For CRISv32, immediates are always 4 bytes for
2111 special registers. */
2112 nbytes
= disdata
->distype
== cris_dis_v32
2113 ? 4 : (sregp
->reg_size
+ 1) & ~1;
2117 int mode_size
= 1 << ((insn
>> 4) & (*cs
== 'z' ? 1 : 3));
2129 if (signedp
&& number
> 127)
2134 number
= buffer
[2] + buffer
[3] * 256;
2135 if (signedp
&& number
> 32767)
2141 = buffer
[2] + buffer
[3] * 256 + buffer
[4] * 65536
2142 + buffer
[5] * 0x1000000;
2151 if ((*cs
== 'z' && (insn
& 0x20))
2152 || (opcodep
->match
== BDAP_QUICK_OPCODE
2153 && (nbytes
<= 2 || buffer
[1 + nbytes
] == 0)))
2154 tp
= format_dec (number
, tp
, signedp
);
2157 unsigned int highbyte
= (number
>> 24) & 0xff;
2159 /* Either output this as an address or as a number. If it's
2160 a dword with the same high-byte as the address of the
2161 insn, assume it's an address, and also if it's a non-zero
2162 non-0xff high-byte. If this is a jsr or a jump, then
2163 it's definitely an address. */
2165 && (highbyte
== ((addr
>> 24) & 0xff)
2166 || (highbyte
!= 0 && highbyte
!= 0xff)
2167 || info
->insn_type
== dis_branch
2168 || info
->insn_type
== dis_jsr
))
2170 /* Finish off and output previous formatted bytes. */
2174 (*info
->fprintf_func
) (info
->stream
, "%s", temp
);
2176 (*info
->print_address_func
) ((bfd_vma
) number
, info
);
2178 info
->target
= number
;
2181 tp
= format_hex (number
, tp
, disdata
);
2186 /* Not an immediate number. Then this is a (possibly
2187 prefixed) memory operand. */
2188 if (info
->insn_type
!= dis_nonbranch
)
2192 & (opcodep
->args
[0] == 'z' ? 1 : 3));
2194 info
->insn_type
= dis_dref
;
2195 info
->flags
|= CRIS_DIS_FLAG_MEMREF
;
2197 if (opcodep
->imm_oprnd_size
== SIZE_FIX_32
)
2199 else if (opcodep
->imm_oprnd_size
== SIZE_SPEC_REG
)
2201 const struct cris_spec_reg
*sregp
2202 = spec_reg_info ((insn
>> 12) & 15, disdata
->distype
);
2204 /* FIXME: Improve error handling; should have been caught
2209 size
= sregp
->reg_size
;
2214 info
->data_size
= size
;
2220 /* We don't match dip with a postincremented field
2221 as a side-effect address mode. */
2222 && ((insn
& 0x400) == 0
2223 || prefix_opcodep
->match
!= DIP_OPCODE
))
2227 tp
= format_reg (disdata
, insn
& 15, tp
, with_reg_prefix
);
2232 /* We mainly ignore the prefix format string when the
2233 address-mode syntax is output. */
2234 switch (prefix_opcodep
->match
)
2237 /* It's [r], [r+] or [pc+]. */
2238 if ((prefix_insn
& 0x400) && (prefix_insn
& 15) == 15)
2240 /* It's [pc+]. This cannot possibly be anything
2242 unsigned long number
2243 = prefix_buffer
[2] + prefix_buffer
[3] * 256
2244 + prefix_buffer
[4] * 65536
2245 + prefix_buffer
[5] * 0x1000000;
2247 info
->target
= (bfd_vma
) number
;
2249 /* Finish off and output previous formatted
2254 (*info
->fprintf_func
) (info
->stream
, "%s", temp
);
2256 (*info
->print_address_func
) ((bfd_vma
) number
, info
);
2260 /* For a memref in an address, we use target2.
2261 In this case, target is zero. */
2263 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2264 | CRIS_DIS_FLAG_MEM_TARGET2_MEM
);
2266 info
->target2
= prefix_insn
& 15;
2269 tp
= format_reg (disdata
, prefix_insn
& 15, tp
,
2271 if (prefix_insn
& 0x400)
2277 case BDAP_QUICK_OPCODE
:
2281 number
= prefix_buffer
[0];
2285 /* Output "reg+num" or, if num < 0, "reg-num". */
2286 tp
= format_reg (disdata
, (prefix_insn
>> 12) & 15, tp
,
2290 tp
= format_dec (number
, tp
, 1);
2292 info
->flags
|= CRIS_DIS_FLAG_MEM_TARGET_IS_REG
;
2293 info
->target
= (prefix_insn
>> 12) & 15;
2294 info
->target2
= (bfd_vma
) number
;
2299 /* Output "r+R.m". */
2300 tp
= format_reg (disdata
, prefix_insn
& 15, tp
,
2303 tp
= format_reg (disdata
, (prefix_insn
>> 12) & 15, tp
,
2306 *tp
++ = mode_char
[(prefix_insn
>> 4) & 3];
2309 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2310 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2312 | ((prefix_insn
& 0x8000)
2313 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
2314 : ((prefix_insn
& 0x8000)
2315 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2
: 0)));
2317 /* Is it the casejump? It's a "adds.w [pc+r%d.w],pc". */
2318 if (insn
== 0xf83f && (prefix_insn
& ~0xf000) == 0x55f)
2319 /* Then start interpreting data as offsets. */
2320 case_offset_counter
= no_of_case_offsets
;
2323 case BDAP_INDIR_OPCODE
:
2324 /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
2326 tp
= format_reg (disdata
, (prefix_insn
>> 12) & 15, tp
,
2329 if ((prefix_insn
& 0x400) && (prefix_insn
& 15) == 15)
2332 unsigned int nbytes
;
2334 /* It's a value. Get its size. */
2335 int mode_size
= 1 << ((prefix_insn
>> 4) & 3);
2345 number
= prefix_buffer
[2];
2351 number
= prefix_buffer
[2] + prefix_buffer
[3] * 256;
2358 = prefix_buffer
[2] + prefix_buffer
[3] * 256
2359 + prefix_buffer
[4] * 65536
2360 + prefix_buffer
[5] * 0x1000000;
2369 info
->flags
|= CRIS_DIS_FLAG_MEM_TARGET_IS_REG
;
2370 info
->target2
= (bfd_vma
) number
;
2372 /* If the size is dword, then assume it's an
2376 /* Finish off and output previous formatted
2381 (*info
->fprintf_func
) (info
->stream
, "%s", temp
);
2383 (*info
->print_address_func
) ((bfd_vma
) number
, info
);
2389 tp
= format_dec (number
, tp
, 1);
2394 /* Output "r+[R].m" or "r+[R+].m". */
2397 tp
= format_reg (disdata
, prefix_insn
& 15, tp
,
2399 if (prefix_insn
& 0x400)
2403 *tp
++ = mode_char
[(prefix_insn
>> 4) & 3];
2406 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2407 | CRIS_DIS_FLAG_MEM_TARGET2_MEM
2408 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2410 | (((prefix_insn
>> 4) == 2)
2412 : (((prefix_insn
>> 4) & 3) == 1
2413 ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
2414 : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE
)));
2419 (*info
->fprintf_func
) (info
->stream
, "?prefix-bug");
2422 /* To mark that the prefix is used, reset it. */
2423 prefix_opcodep
= NULL
;
2427 tp
= format_reg (disdata
, insn
& 15, tp
, with_reg_prefix
);
2429 info
->flags
|= CRIS_DIS_FLAG_MEM_TARGET_IS_REG
;
2430 info
->target
= insn
& 15;
2440 tp
= format_reg (disdata
, (insn
>> 12) & 15, tp
, with_reg_prefix
);
2442 *tp
++ = mode_char
[(insn
>> 4) & 3];
2446 tp
= format_dec (insn
& 63, tp
, 0);
2451 int where
= buffer
[2] + buffer
[3] * 256;
2456 where
+= addr
+ ((disdata
->distype
== cris_dis_v32
) ? 0 : 4);
2458 if (insn
== BA_PC_INCR_OPCODE
)
2459 info
->insn_type
= dis_branch
;
2461 info
->insn_type
= dis_condbranch
;
2463 info
->target
= (bfd_vma
) where
;
2467 (*info
->fprintf_func
) (info
->stream
, "%s%s ",
2468 temp
, cris_cc_strings
[insn
>> 12]);
2470 (*info
->print_address_func
) ((bfd_vma
) where
, info
);
2475 tp
= format_dec (insn
& 31, tp
, 0);
2479 tp
= format_dec (insn
& 15, tp
, 0);
2484 long offset
= insn
& 0xfe;
2490 if (opcodep
->match
== BA_QUICK_OPCODE
)
2491 info
->insn_type
= dis_branch
;
2493 info
->insn_type
= dis_condbranch
;
2495 target
= addr
+ ((disdata
->distype
== cris_dis_v32
) ? 0 : 2) + offset
;
2496 info
->target
= target
;
2499 (*info
->fprintf_func
) (info
->stream
, "%s", temp
);
2500 (*info
->print_address_func
) (target
, info
);
2507 long number
= buffer
[0];
2510 number
= number
- 256;
2512 tp
= format_dec (number
, tp
, 1);
2514 tp
= format_reg (disdata
, (insn
>> 12) & 15, tp
, with_reg_prefix
);
2519 tp
= print_flags (disdata
, insn
, tp
);
2523 tp
= format_dec ((insn
& 32) ? (insn
& 31) | ~31L : insn
& 31, tp
, 1);
2528 const struct cris_spec_reg
*sregp
2529 = spec_reg_info ((insn
>> 12) & 15, disdata
->distype
);
2531 if (sregp
->name
== NULL
)
2532 /* Should have been caught as a non-match eariler. */
2536 if (with_reg_prefix
)
2537 *tp
++ = REGISTER_PREFIX_CHAR
;
2538 strcpy (tp
, sregp
->name
);
2553 (*info
->fprintf_func
) (info
->stream
, " (OOPS unused prefix \"%s: %s\")",
2554 prefix_opcodep
->name
, prefix_opcodep
->args
);
2556 (*info
->fprintf_func
) (info
->stream
, "%s", temp
);
2558 /* Get info for matching case-tables, if we don't have any active.
2559 We assume that the last constant seen is used; either in the insn
2560 itself or in a "move.d const,rN, sub.d rN,rM"-like sequence. */
2561 if (TRACE_CASE
&& case_offset_counter
== 0)
2563 if (CONST_STRNEQ (opcodep
->name
, "sub"))
2564 case_offset
= last_immediate
;
2566 /* It could also be an "add", if there are negative case-values. */
2567 else if (CONST_STRNEQ (opcodep
->name
, "add"))
2568 /* The first case is the negated operand to the add. */
2569 case_offset
= -last_immediate
;
2571 /* A bound insn will tell us the number of cases. */
2572 else if (CONST_STRNEQ (opcodep
->name
, "bound"))
2573 no_of_case_offsets
= last_immediate
+ 1;
2575 /* A jump or jsr or branch breaks the chain of insns for a
2576 case-table, so assume default first-case again. */
2577 else if (info
->insn_type
== dis_jsr
2578 || info
->insn_type
== dis_branch
2579 || info
->insn_type
== dis_condbranch
)
2585 /* Print the CRIS instruction at address memaddr on stream. Returns
2586 length of the instruction, in bytes. Prefix register names with `$' if
2590 print_insn_cris_generic (bfd_vma memaddr
,
2591 disassemble_info
*info
,
2592 bfd_boolean with_reg_prefix
)
2596 const struct cris_opcode
*matchedp
;
2598 struct cris_disasm_data
*disdata
2599 = (struct cris_disasm_data
*) info
->private_data
;
2601 /* No instruction will be disassembled as longer than this number of
2602 bytes; stacked prefixes will not be expanded. */
2603 unsigned char buffer
[MAX_BYTES_PER_CRIS_INSN
];
2604 unsigned char *bufp
;
2608 /* There will be an "out of range" error after the last instruction.
2609 Reading pairs of bytes in decreasing number, we hope that we will get
2610 at least the amount that we will consume.
2612 If we can't get any data, or we do not get enough data, we print
2613 the error message. */
2615 nbytes
= info
->buffer_length
;
2616 if (nbytes
> MAX_BYTES_PER_CRIS_INSN
)
2617 nbytes
= MAX_BYTES_PER_CRIS_INSN
;
2618 status
= (*info
->read_memory_func
) (memaddr
, buffer
, nbytes
, info
);
2620 /* If we did not get all we asked for, then clear the rest.
2621 Hopefully this makes a reproducible result in case of errors. */
2622 if (nbytes
!= MAX_BYTES_PER_CRIS_INSN
)
2623 memset (buffer
+ nbytes
, 0, MAX_BYTES_PER_CRIS_INSN
- nbytes
);
2628 /* Set some defaults for the insn info. */
2629 info
->insn_info_valid
= 1;
2630 info
->branch_delay_insns
= 0;
2631 info
->data_size
= 0;
2632 info
->insn_type
= dis_nonbranch
;
2637 /* If we got any data, disassemble it. */
2642 insn
= bufp
[0] + bufp
[1] * 256;
2644 /* If we're in a case-table, don't disassemble the offsets. */
2645 if (TRACE_CASE
&& case_offset_counter
!= 0)
2647 info
->insn_type
= dis_noninsn
;
2650 /* If to print data as offsets, then shortcut here. */
2651 (*info
->fprintf_func
) (info
->stream
, "case %ld%s: -> ",
2652 case_offset
+ no_of_case_offsets
2653 - case_offset_counter
,
2654 case_offset_counter
== 1 ? "/default" :
2657 (*info
->print_address_func
) ((bfd_vma
)
2660 - (no_of_case_offsets
2661 - case_offset_counter
)
2663 case_offset_counter
--;
2665 /* The default case start (without a "sub" or "add") must be
2667 if (case_offset_counter
== 0)
2672 /* We're often called to disassemble zeroes. While this is a
2673 valid "bcc .+2" insn, it is also useless enough and enough
2674 of a nuiscance that we will just output "bcc .+2" for it
2675 and signal it as a noninsn. */
2676 (*info
->fprintf_func
) (info
->stream
,
2677 disdata
->distype
== cris_dis_v32
2678 ? "bcc ." : "bcc .+2");
2679 info
->insn_type
= dis_noninsn
;
2684 const struct cris_opcode
*prefix_opcodep
= NULL
;
2685 unsigned char *prefix_buffer
= bufp
;
2686 unsigned int prefix_insn
= insn
;
2687 int prefix_size
= 0;
2689 matchedp
= get_opcode_entry (insn
, NO_CRIS_PREFIX
, disdata
);
2691 /* Check if we're supposed to write out prefixes as address
2692 modes and if this was a prefix. */
2693 if (matchedp
!= NULL
&& PARSE_PREFIX
&& matchedp
->args
[0] == 'p')
2695 /* If it's a prefix, put it into the prefix vars and get the
2697 prefix_size
= bytes_to_skip (prefix_insn
, matchedp
,
2698 disdata
->distype
, NULL
);
2699 prefix_opcodep
= matchedp
;
2701 insn
= bufp
[prefix_size
] + bufp
[prefix_size
+ 1] * 256;
2702 matchedp
= get_opcode_entry (insn
, prefix_insn
, disdata
);
2704 if (matchedp
!= NULL
)
2706 addr
+= prefix_size
;
2707 bufp
+= prefix_size
;
2708 advance
+= prefix_size
;
2712 /* The "main" insn wasn't valid, at least not when
2713 prefixed. Put back things enough to output the
2714 prefix insn only, as a normal insn. */
2715 matchedp
= prefix_opcodep
;
2717 prefix_opcodep
= NULL
;
2721 if (matchedp
== NULL
)
2723 (*info
->fprintf_func
) (info
->stream
, "??0x%x", insn
);
2726 info
->insn_type
= dis_noninsn
;
2731 += bytes_to_skip (insn
, matchedp
, disdata
->distype
,
2734 /* The info_type and assorted fields will be set according
2736 print_with_operands (matchedp
, insn
, bufp
, addr
, info
,
2737 prefix_opcodep
, prefix_insn
,
2738 prefix_buffer
, with_reg_prefix
);
2743 info
->insn_type
= dis_noninsn
;
2745 /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
2746 status when reading that much, and the insn decoding indicated a
2747 length exceeding what we read, there is an error. */
2748 if (status
!= 0 && (nbytes
== 0 || advance
> nbytes
))
2750 (*info
->memory_error_func
) (status
, memaddr
, info
);
2754 /* Max supported insn size with one folded prefix insn. */
2755 info
->bytes_per_line
= MAX_BYTES_PER_CRIS_INSN
;
2757 /* I would like to set this to a fixed value larger than the actual
2758 number of bytes to print in order to avoid spaces between bytes,
2759 but objdump.c (2.9.1) does not like that, so we print 16-bit
2760 chunks, which is the next choice. */
2761 info
->bytes_per_chunk
= 2;
2763 /* Printing bytes in order of increasing addresses makes sense,
2764 especially on a little-endian target.
2765 This is completely the opposite of what you think; setting this to
2766 BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
2768 info
->display_endian
= BFD_ENDIAN_BIG
;
2773 /* Disassemble, prefixing register names with `$'. CRIS v0..v10. */
2776 print_insn_cris_with_register_prefix (bfd_vma vma
,
2777 disassemble_info
*info
)
2779 if (info
->private_data
== NULL
2780 && !cris_parse_disassembler_options (info
, cris_dis_v0_v10
))
2782 return print_insn_cris_generic (vma
, info
, TRUE
);
2785 /* Disassemble, prefixing register names with `$'. CRIS v32. */
2788 print_insn_crisv32_with_register_prefix (bfd_vma vma
,
2789 disassemble_info
*info
)
2791 if (info
->private_data
== NULL
2792 && !cris_parse_disassembler_options (info
, cris_dis_v32
))
2794 return print_insn_cris_generic (vma
, info
, TRUE
);
2798 /* Disassemble, prefixing register names with `$'.
2799 Common v10 and v32 subset. */
2802 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma
,
2803 disassemble_info
*info
)
2805 if (info
->private_data
== NULL
2806 && !cris_parse_disassembler_options (info
, cris_dis_common_v10_v32
))
2808 return print_insn_cris_generic (vma
, info
, TRUE
);
2811 /* Disassemble, no prefixes on register names. CRIS v0..v10. */
2814 print_insn_cris_without_register_prefix (bfd_vma vma
,
2815 disassemble_info
*info
)
2817 if (info
->private_data
== NULL
2818 && !cris_parse_disassembler_options (info
, cris_dis_v0_v10
))
2820 return print_insn_cris_generic (vma
, info
, FALSE
);
2823 /* Disassemble, no prefixes on register names. CRIS v32. */
2826 print_insn_crisv32_without_register_prefix (bfd_vma vma
,
2827 disassemble_info
*info
)
2829 if (info
->private_data
== NULL
2830 && !cris_parse_disassembler_options (info
, cris_dis_v32
))
2832 return print_insn_cris_generic (vma
, info
, FALSE
);
2835 /* Disassemble, no prefixes on register names.
2836 Common v10 and v32 subset. */
2839 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma
,
2840 disassemble_info
*info
)
2842 if (info
->private_data
== NULL
2843 && !cris_parse_disassembler_options (info
, cris_dis_common_v10_v32
))
2845 return print_insn_cris_generic (vma
, info
, FALSE
);
2850 print_insn_crisv32 (bfd_vma vma
,
2851 disassemble_info
*info
)
2853 return print_insn_crisv32_with_register_prefix(vma
, info
);
2856 /* Return a disassembler-function that prints registers with a `$' prefix,
2857 or one that prints registers without a prefix.
2858 FIXME: We should improve the solution to avoid the multitude of
2859 functions seen above. */
2862 cris_get_disassembler (bfd
*abfd
)
2864 /* If there's no bfd in sight, we return what is valid as input in all
2865 contexts if fed back to the assembler: disassembly *with* register
2866 prefix. Unfortunately this will be totally wrong for v32. */
2868 return print_insn_cris_with_register_prefix
;
2870 if (bfd_get_symbol_leading_char (abfd
) == 0)
2872 if (bfd_get_mach (abfd
) == bfd_mach_cris_v32
)
2873 return print_insn_crisv32_with_register_prefix
;
2874 if (bfd_get_mach (abfd
) == bfd_mach_cris_v10_v32
)
2875 return print_insn_crisv10_v32_with_register_prefix
;
2877 /* We default to v10. This may be specifically specified in the
2878 bfd mach, but is also the default setting. */
2879 return print_insn_cris_with_register_prefix
;
2882 if (bfd_get_mach (abfd
) == bfd_mach_cris_v32
)
2883 return print_insn_crisv32_without_register_prefix
;
2884 if (bfd_get_mach (abfd
) == bfd_mach_cris_v10_v32
)
2885 return print_insn_crisv10_v32_without_register_prefix
;
2886 return print_insn_cris_without_register_prefix
;
2890 eval: (c-set-style "gnu")