]> git.proxmox.com Git - qemu.git/blob - cris-dis.c
CRIS disassembler, originally from binutils, by Edgar E. Iglesias.
[qemu.git] / cris-dis.c
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.
5
6 This file is part of the GNU binutils and GDB, the GNU debugger.
7
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
11 version.
12
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
16 more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
22
23 #include "dis-asm.h"
24 //#include "sysdep.h"
25 #include "target-cris/opcode-cris.h"
26 //#include "libiberty.h"
27 \f
28
29 #define FALSE 0
30 #define TRUE 1
31 #define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
32
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.
38
39 This file is part of GAS, GDB and the GNU binutils.
40
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.
45
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.
50
51 You should have received a copy of the GNU General Public License
52 along with this program; if not, write to the Free Software
53 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
54
55 #ifndef NULL
56 #define NULL (0)
57 #endif
58
59 /* This table isn't used for CRISv32 and the size of immediate operands. */
60 const struct cris_spec_reg
61 cris_spec_regs[] =
62 {
63 {"bz", 0, 1, cris_ver_v32p, NULL},
64 {"p0", 0, 1, 0, NULL},
65 {"vr", 1, 1, 0, NULL},
66 {"p1", 1, 1, 0, NULL},
67 {"pid", 2, 1, cris_ver_v32p, NULL},
68 {"p2", 2, 1, cris_ver_v32p, NULL},
69 {"p2", 2, 1, cris_ver_warning, NULL},
70 {"srs", 3, 1, cris_ver_v32p, NULL},
71 {"p3", 3, 1, cris_ver_v32p, NULL},
72 {"p3", 3, 1, cris_ver_warning, NULL},
73 {"wz", 4, 2, cris_ver_v32p, NULL},
74 {"p4", 4, 2, 0, NULL},
75 {"ccr", 5, 2, cris_ver_v0_10, NULL},
76 {"exs", 5, 4, cris_ver_v32p, NULL},
77 {"p5", 5, 2, cris_ver_v0_10, NULL},
78 {"p5", 5, 4, cris_ver_v32p, NULL},
79 {"dcr0",6, 2, cris_ver_v0_3, NULL},
80 {"eda", 6, 4, cris_ver_v32p, NULL},
81 {"p6", 6, 2, cris_ver_v0_3, NULL},
82 {"p6", 6, 4, cris_ver_v32p, NULL},
83 {"dcr1/mof", 7, 4, cris_ver_v10p,
84 "Register `dcr1/mof' with ambiguous size specified. Guessing 4 bytes"},
85 {"dcr1/mof", 7, 2, cris_ver_v0_3,
86 "Register `dcr1/mof' with ambiguous size specified. Guessing 2 bytes"},
87 {"mof", 7, 4, cris_ver_v10p, NULL},
88 {"dcr1",7, 2, cris_ver_v0_3, NULL},
89 {"p7", 7, 4, cris_ver_v10p, NULL},
90 {"p7", 7, 2, cris_ver_v0_3, NULL},
91 {"dz", 8, 4, cris_ver_v32p, NULL},
92 {"p8", 8, 4, 0, NULL},
93 {"ibr", 9, 4, cris_ver_v0_10, NULL},
94 {"ebp", 9, 4, cris_ver_v32p, NULL},
95 {"p9", 9, 4, 0, NULL},
96 {"irp", 10, 4, cris_ver_v0_10, NULL},
97 {"erp", 10, 4, cris_ver_v32p, NULL},
98 {"p10", 10, 4, 0, NULL},
99 {"srp", 11, 4, 0, NULL},
100 {"p11", 11, 4, 0, NULL},
101 /* For disassembly use only. Accept at assembly with a warning. */
102 {"bar/dtp0", 12, 4, cris_ver_warning,
103 "Ambiguous register `bar/dtp0' specified"},
104 {"nrp", 12, 4, cris_ver_v32p, NULL},
105 {"bar", 12, 4, cris_ver_v8_10, NULL},
106 {"dtp0",12, 4, cris_ver_v0_3, NULL},
107 {"p12", 12, 4, 0, NULL},
108 /* For disassembly use only. Accept at assembly with a warning. */
109 {"dccr/dtp1",13, 4, cris_ver_warning,
110 "Ambiguous register `dccr/dtp1' specified"},
111 {"ccs", 13, 4, cris_ver_v32p, NULL},
112 {"dccr",13, 4, cris_ver_v8_10, NULL},
113 {"dtp1",13, 4, cris_ver_v0_3, NULL},
114 {"p13", 13, 4, 0, NULL},
115 {"brp", 14, 4, cris_ver_v3_10, NULL},
116 {"usp", 14, 4, cris_ver_v32p, NULL},
117 {"p14", 14, 4, cris_ver_v3p, NULL},
118 {"usp", 15, 4, cris_ver_v10, NULL},
119 {"spc", 15, 4, cris_ver_v32p, NULL},
120 {"p15", 15, 4, cris_ver_v10p, NULL},
121 {NULL, 0, 0, cris_ver_version_all, NULL}
122 };
123
124 /* Add version specifiers to this table when necessary.
125 The (now) regular coding of register names suggests a simpler
126 implementation. */
127 const struct cris_support_reg cris_support_regs[] =
128 {
129 {"s0", 0},
130 {"s1", 1},
131 {"s2", 2},
132 {"s3", 3},
133 {"s4", 4},
134 {"s5", 5},
135 {"s6", 6},
136 {"s7", 7},
137 {"s8", 8},
138 {"s9", 9},
139 {"s10", 10},
140 {"s11", 11},
141 {"s12", 12},
142 {"s13", 13},
143 {"s14", 14},
144 {"s15", 15},
145 {NULL, 0}
146 };
147
148 /* All CRIS opcodes are 16 bits.
149
150 - The match component is a mask saying which bits must match a
151 particular opcode in order for an instruction to be an instance
152 of that opcode.
153
154 - The args component is a string containing characters symbolically
155 matching the operands of an instruction. Used for both assembly
156 and disassembly.
157
158 Operand-matching characters:
159 [ ] , space
160 Verbatim.
161 A The string "ACR" (case-insensitive).
162 B Not really an operand. It causes a "BDAP -size,SP" prefix to be
163 output for the PUSH alias-instructions and recognizes a push-
164 prefix at disassembly. This letter isn't recognized for v32.
165 Must be followed by a R or P letter.
166 ! Non-match pattern, will not match if there's a prefix insn.
167 b Non-matching operand, used for branches with 16-bit
168 displacement. Only recognized by the disassembler.
169 c 5-bit unsigned immediate in bits <4:0>.
170 C 4-bit unsigned immediate in bits <3:0>.
171 d At assembly, optionally (as in put other cases before this one)
172 ".d" or ".D" at the start of the operands, followed by one space
173 character. At disassembly, nothing.
174 D General register in bits <15:12> and <3:0>.
175 f List of flags in bits <15:12> and <3:0>.
176 i 6-bit signed immediate in bits <5:0>.
177 I 6-bit unsigned immediate in bits <5:0>.
178 M Size modifier (B, W or D) for CLEAR instructions.
179 m Size modifier (B, W or D) in bits <5:4>
180 N A 32-bit dword, like in the difference between s and y.
181 This has no effect on bits in the opcode. Can also be expressed
182 as "[pc+]" in input.
183 n As N, but PC-relative (to the start of the instruction).
184 o [-128..127] word offset in bits <7:1> and <0>. Used by 8-bit
185 branch instructions.
186 O [-128..127] offset in bits <7:0>. Also matches a comma and a
187 general register after the expression, in bits <15:12>. Used
188 only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
189 P Special register in bits <15:12>.
190 p Indicates that the insn is a prefix insn. Must be first
191 character.
192 Q As O, but don't relax; force an 8-bit offset.
193 R General register in bits <15:12>.
194 r General register in bits <3:0>.
195 S Source operand in bit <10> and a prefix; a 3-operand prefix
196 without side-effect.
197 s Source operand in bits <10> and <3:0>, optionally with a
198 side-effect prefix, except [pc] (the name, not R15 as in ACR)
199 isn't allowed for v32 and higher.
200 T Support register in bits <15:12>.
201 u 4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
202 U Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
203 Not recognized at disassembly.
204 x Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
205 y Like 's' but do not allow an integer at assembly.
206 Y The difference s-y; only an integer is allowed.
207 z Size modifier (B or W) in bit <4>. */
208
209
210 /* Please note the order of the opcodes in this table is significant.
211 The assembler requires that all instances of the same mnemonic must
212 be consecutive. If they aren't, the assembler might not recognize
213 them, or may indicate an internal error.
214
215 The disassembler should not normally care about the order of the
216 opcodes, but will prefer an earlier alternative if the "match-score"
217 (see cris-dis.c) is computed as equal.
218
219 It should not be significant for proper execution that this table is
220 in alphabetical order, but please follow that convention for an easy
221 overview. */
222
223 const struct cris_opcode
224 cris_opcodes[] =
225 {
226 {"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE, 0,
227 cris_abs_op},
228
229 {"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE, 0,
230 cris_reg_mode_add_sub_cmp_and_or_move_op},
231
232 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD, 0,
233 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
234
235 {"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE,
236 cris_ver_v0_10,
237 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
238
239 {"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE,
240 cris_ver_v0_10,
241 cris_three_operand_add_sub_cmp_and_or_op},
242
243 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD,
244 cris_ver_v32p,
245 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
246
247 {"addc", 0x0570, 0x0A80, "r,R", 0, SIZE_FIX_32,
248 cris_ver_v32p,
249 cris_not_implemented_op},
250
251 {"addc", 0x09A0, 0x0250, "s,R", 0, SIZE_FIX_32,
252 cris_ver_v32p,
253 cris_not_implemented_op},
254
255 {"addi", 0x0540, 0x0A80, "x,r,A", 0, SIZE_NONE,
256 cris_ver_v32p,
257 cris_addi_op},
258
259 {"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE, 0,
260 cris_addi_op},
261
262 /* This collates after "addo", but we want to disassemble as "addoq",
263 not "addo". */
264 {"addoq", 0x0100, 0x0E00, "Q,A", 0, SIZE_NONE,
265 cris_ver_v32p,
266 cris_not_implemented_op},
267
268 {"addo", 0x0940, 0x0280, "m s,R,A", 0, SIZE_FIELD_SIGNED,
269 cris_ver_v32p,
270 cris_not_implemented_op},
271
272 /* This must be located after the insn above, lest we misinterpret
273 "addo.b -1,r0,acr" as "addo .b-1,r0,acr". FIXME: Sounds like a
274 parser bug. */
275 {"addo", 0x0100, 0x0E00, "O,A", 0, SIZE_NONE,
276 cris_ver_v32p,
277 cris_not_implemented_op},
278
279 {"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE, 0,
280 cris_quick_mode_add_sub_op},
281
282 {"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE, 0,
283 cris_reg_mode_add_sub_cmp_and_or_move_op},
284
285 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
286 {"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD, 0,
287 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
288
289 {"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE,
290 cris_ver_v0_10,
291 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
292
293 {"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE,
294 cris_ver_v0_10,
295 cris_three_operand_add_sub_cmp_and_or_op},
296
297 {"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE, 0,
298 cris_reg_mode_add_sub_cmp_and_or_move_op},
299
300 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
301 {"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD, 0,
302 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
303
304 {"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE,
305 cris_ver_v0_10,
306 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
307
308 {"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE,
309 cris_ver_v0_10,
310 cris_three_operand_add_sub_cmp_and_or_op},
311
312 {"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE, 0,
313 cris_reg_mode_add_sub_cmp_and_or_move_op},
314
315 {"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD, 0,
316 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
317
318 {"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE,
319 cris_ver_v0_10,
320 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
321
322 {"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE,
323 cris_ver_v0_10,
324 cris_three_operand_add_sub_cmp_and_or_op},
325
326 {"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE, 0,
327 cris_quick_mode_and_cmp_move_or_op},
328
329 {"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE, 0,
330 cris_asr_op},
331
332 {"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE, 0,
333 cris_asrq_op},
334
335 {"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE, 0,
336 cris_ax_ei_setf_op},
337
338 /* FIXME: Should use branch #defines. */
339 {"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE, 0,
340 cris_sixteen_bit_offset_branch_op},
341
342 {"ba",
343 BA_QUICK_OPCODE,
344 0x0F00+(0xF-CC_A)*0x1000, "o", 1, SIZE_NONE, 0,
345 cris_eight_bit_offset_branch_op},
346
347 /* Needs to come after the usual "ba o", which might be relaxed to
348 this one. */
349 {"ba", BA_DWORD_OPCODE,
350 0xffff & (~BA_DWORD_OPCODE), "n", 0, SIZE_FIX_32,
351 cris_ver_v32p,
352 cris_none_reg_mode_jump_op},
353
354 {"bas", 0x0EBF, 0x0140, "n,P", 0, SIZE_FIX_32,
355 cris_ver_v32p,
356 cris_none_reg_mode_jump_op},
357
358 {"basc", 0x0EFF, 0x0100, "n,P", 0, SIZE_FIX_32,
359 cris_ver_v32p,
360 cris_none_reg_mode_jump_op},
361
362 {"bcc",
363 BRANCH_QUICK_OPCODE+CC_CC*0x1000,
364 0x0f00+(0xF-CC_CC)*0x1000, "o", 1, SIZE_NONE, 0,
365 cris_eight_bit_offset_branch_op},
366
367 {"bcs",
368 BRANCH_QUICK_OPCODE+CC_CS*0x1000,
369 0x0f00+(0xF-CC_CS)*0x1000, "o", 1, SIZE_NONE, 0,
370 cris_eight_bit_offset_branch_op},
371
372 {"bdap",
373 BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS, "pm s,R", 0, SIZE_FIELD_SIGNED,
374 cris_ver_v0_10,
375 cris_bdap_prefix},
376
377 {"bdap",
378 BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS, "pO", 0, SIZE_NONE,
379 cris_ver_v0_10,
380 cris_quick_mode_bdap_prefix},
381
382 {"beq",
383 BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
384 0x0f00+(0xF-CC_EQ)*0x1000, "o", 1, SIZE_NONE, 0,
385 cris_eight_bit_offset_branch_op},
386
387 /* This is deliberately put before "bext" to trump it, even though not
388 in alphabetical order, since we don't do excluding version checks
389 for v0..v10. */
390 {"bwf",
391 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
392 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
393 cris_ver_v10,
394 cris_eight_bit_offset_branch_op},
395
396 {"bext",
397 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
398 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
399 cris_ver_v0_3,
400 cris_eight_bit_offset_branch_op},
401
402 {"bge",
403 BRANCH_QUICK_OPCODE+CC_GE*0x1000,
404 0x0f00+(0xF-CC_GE)*0x1000, "o", 1, SIZE_NONE, 0,
405 cris_eight_bit_offset_branch_op},
406
407 {"bgt",
408 BRANCH_QUICK_OPCODE+CC_GT*0x1000,
409 0x0f00+(0xF-CC_GT)*0x1000, "o", 1, SIZE_NONE, 0,
410 cris_eight_bit_offset_branch_op},
411
412 {"bhi",
413 BRANCH_QUICK_OPCODE+CC_HI*0x1000,
414 0x0f00+(0xF-CC_HI)*0x1000, "o", 1, SIZE_NONE, 0,
415 cris_eight_bit_offset_branch_op},
416
417 {"bhs",
418 BRANCH_QUICK_OPCODE+CC_HS*0x1000,
419 0x0f00+(0xF-CC_HS)*0x1000, "o", 1, SIZE_NONE, 0,
420 cris_eight_bit_offset_branch_op},
421
422 {"biap", BIAP_OPCODE, BIAP_Z_BITS, "pm r,R", 0, SIZE_NONE,
423 cris_ver_v0_10,
424 cris_biap_prefix},
425
426 {"ble",
427 BRANCH_QUICK_OPCODE+CC_LE*0x1000,
428 0x0f00+(0xF-CC_LE)*0x1000, "o", 1, SIZE_NONE, 0,
429 cris_eight_bit_offset_branch_op},
430
431 {"blo",
432 BRANCH_QUICK_OPCODE+CC_LO*0x1000,
433 0x0f00+(0xF-CC_LO)*0x1000, "o", 1, SIZE_NONE, 0,
434 cris_eight_bit_offset_branch_op},
435
436 {"bls",
437 BRANCH_QUICK_OPCODE+CC_LS*0x1000,
438 0x0f00+(0xF-CC_LS)*0x1000, "o", 1, SIZE_NONE, 0,
439 cris_eight_bit_offset_branch_op},
440
441 {"blt",
442 BRANCH_QUICK_OPCODE+CC_LT*0x1000,
443 0x0f00+(0xF-CC_LT)*0x1000, "o", 1, SIZE_NONE, 0,
444 cris_eight_bit_offset_branch_op},
445
446 {"bmi",
447 BRANCH_QUICK_OPCODE+CC_MI*0x1000,
448 0x0f00+(0xF-CC_MI)*0x1000, "o", 1, SIZE_NONE, 0,
449 cris_eight_bit_offset_branch_op},
450
451 {"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32,
452 cris_ver_sim_v0_10,
453 cris_not_implemented_op},
454
455 {"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE,
456 cris_ver_sim_v0_10,
457 cris_not_implemented_op},
458
459 {"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE,
460 cris_ver_sim_v0_10,
461 cris_not_implemented_op},
462
463 {"bne",
464 BRANCH_QUICK_OPCODE+CC_NE*0x1000,
465 0x0f00+(0xF-CC_NE)*0x1000, "o", 1, SIZE_NONE, 0,
466 cris_eight_bit_offset_branch_op},
467
468 {"bound", 0x05c0, 0x0A00, "m r,R", 0, SIZE_NONE, 0,
469 cris_two_operand_bound_op},
470 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
471 {"bound", 0x09c0, 0x0200, "m s,R", 0, SIZE_FIELD,
472 cris_ver_v0_10,
473 cris_two_operand_bound_op},
474 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
475 {"bound", 0x0dcf, 0x0200, "m Y,R", 0, SIZE_FIELD, 0,
476 cris_two_operand_bound_op},
477 {"bound", 0x09c0, 0x0200, "m S,D", 0, SIZE_NONE,
478 cris_ver_v0_10,
479 cris_two_operand_bound_op},
480 {"bound", 0x09c0, 0x0600, "m S,R,r", 0, SIZE_NONE,
481 cris_ver_v0_10,
482 cris_three_operand_bound_op},
483
484 {"bpl",
485 BRANCH_QUICK_OPCODE+CC_PL*0x1000,
486 0x0f00+(0xF-CC_PL)*0x1000, "o", 1, SIZE_NONE, 0,
487 cris_eight_bit_offset_branch_op},
488
489 {"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE,
490 cris_ver_v3p,
491 cris_break_op},
492
493 {"bsb",
494 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
495 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
496 cris_ver_v32p,
497 cris_eight_bit_offset_branch_op},
498
499 {"bsr", 0xBEBF, 0x4140, "n", 0, SIZE_FIX_32,
500 cris_ver_v32p,
501 cris_none_reg_mode_jump_op},
502
503 {"bsrc", 0xBEFF, 0x4100, "n", 0, SIZE_FIX_32,
504 cris_ver_v32p,
505 cris_none_reg_mode_jump_op},
506
507 {"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32,
508 cris_ver_warning,
509 cris_not_implemented_op},
510
511 {"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE,
512 cris_ver_warning,
513 cris_not_implemented_op},
514
515 {"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE,
516 cris_ver_warning,
517 cris_not_implemented_op},
518
519 {"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE, 0,
520 cris_btst_nop_op},
521 {"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE, 0,
522 cris_btst_nop_op},
523
524 {"bvc",
525 BRANCH_QUICK_OPCODE+CC_VC*0x1000,
526 0x0f00+(0xF-CC_VC)*0x1000, "o", 1, SIZE_NONE, 0,
527 cris_eight_bit_offset_branch_op},
528
529 {"bvs",
530 BRANCH_QUICK_OPCODE+CC_VS*0x1000,
531 0x0f00+(0xF-CC_VS)*0x1000, "o", 1, SIZE_NONE, 0,
532 cris_eight_bit_offset_branch_op},
533
534 {"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE, 0,
535 cris_reg_mode_clear_op},
536
537 {"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE, 0,
538 cris_none_reg_mode_clear_test_op},
539
540 {"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE,
541 cris_ver_v0_10,
542 cris_none_reg_mode_clear_test_op},
543
544 {"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE, 0,
545 cris_clearf_di_op},
546
547 {"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE, 0,
548 cris_reg_mode_add_sub_cmp_and_or_move_op},
549
550 {"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD, 0,
551 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
552
553 {"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE,
554 cris_ver_v0_10,
555 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
556
557 {"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE, 0,
558 cris_quick_mode_and_cmp_move_or_op},
559
560 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
561 {"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD, 0,
562 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
563
564 {"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE,
565 cris_ver_v0_10,
566 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
567
568 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
569 {"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD, 0,
570 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
571
572 {"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE,
573 cris_ver_v0_10,
574 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
575
576 {"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE, 0,
577 cris_clearf_di_op},
578
579 {"dip", DIP_OPCODE, DIP_Z_BITS, "ps", 0, SIZE_FIX_32,
580 cris_ver_v0_10,
581 cris_dip_prefix},
582
583 {"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD, 0,
584 cris_not_implemented_op},
585
586 {"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE, 0,
587 cris_dstep_logshift_mstep_neg_not_op},
588
589 {"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE, 0,
590 cris_ax_ei_setf_op},
591
592 {"fidxd", 0x0ab0, 0xf540, "[r]", 0, SIZE_NONE,
593 cris_ver_v32p,
594 cris_not_implemented_op},
595
596 {"fidxi", 0x0d30, 0xF2C0, "[r]", 0, SIZE_NONE,
597 cris_ver_v32p,
598 cris_not_implemented_op},
599
600 {"ftagd", 0x1AB0, 0xE540, "[r]", 0, SIZE_NONE,
601 cris_ver_v32p,
602 cris_not_implemented_op},
603
604 {"ftagi", 0x1D30, 0xE2C0, "[r]", 0, SIZE_NONE,
605 cris_ver_v32p,
606 cris_not_implemented_op},
607
608 {"halt", 0xF930, 0x06CF, "", 0, SIZE_NONE,
609 cris_ver_v32p,
610 cris_not_implemented_op},
611
612 {"jas", 0x09B0, 0x0640, "r,P", 0, SIZE_NONE,
613 cris_ver_v32p,
614 cris_reg_mode_jump_op},
615
616 {"jas", 0x0DBF, 0x0240, "N,P", 0, SIZE_FIX_32,
617 cris_ver_v32p,
618 cris_reg_mode_jump_op},
619
620 {"jasc", 0x0B30, 0x04C0, "r,P", 0, SIZE_NONE,
621 cris_ver_v32p,
622 cris_reg_mode_jump_op},
623
624 {"jasc", 0x0F3F, 0x00C0, "N,P", 0, SIZE_FIX_32,
625 cris_ver_v32p,
626 cris_reg_mode_jump_op},
627
628 {"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE,
629 cris_ver_v8_10,
630 cris_reg_mode_jump_op},
631
632 {"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32,
633 cris_ver_v8_10,
634 cris_none_reg_mode_jump_op},
635
636 {"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE,
637 cris_ver_v8_10,
638 cris_none_reg_mode_jump_op},
639
640 {"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE,
641 cris_ver_v8_10,
642 cris_reg_mode_jump_op},
643
644 {"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32,
645 cris_ver_v8_10,
646 cris_none_reg_mode_jump_op},
647
648 {"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE,
649 cris_ver_v8_10,
650 cris_none_reg_mode_jump_op},
651
652 {"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE,
653 cris_ver_v8_10,
654 cris_reg_mode_jump_op},
655
656 {"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32,
657 cris_ver_v8_10,
658 cris_none_reg_mode_jump_op},
659
660 {"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE,
661 cris_ver_v8_10,
662 cris_none_reg_mode_jump_op},
663
664 {"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE, 0,
665 cris_reg_mode_jump_op},
666
667 {"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32,
668 cris_ver_v0_10,
669 cris_none_reg_mode_jump_op},
670
671 {"jsr", 0xBDBF, 0x4240, "N", 0, SIZE_FIX_32,
672 cris_ver_v32p,
673 cris_none_reg_mode_jump_op},
674
675 {"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE,
676 cris_ver_v0_10,
677 cris_none_reg_mode_jump_op},
678
679 {"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE,
680 cris_ver_v8_10,
681 cris_reg_mode_jump_op},
682
683 {"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32,
684 cris_ver_v8_10,
685 cris_none_reg_mode_jump_op},
686
687 {"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE,
688 cris_ver_v8_10,
689 cris_none_reg_mode_jump_op},
690
691 {"jsrc", 0xBB30, 0x44C0, "r", 0, SIZE_NONE,
692 cris_ver_v32p,
693 cris_reg_mode_jump_op},
694
695 {"jsrc", 0xBF3F, 0x40C0, "N", 0, SIZE_FIX_32,
696 cris_ver_v32p,
697 cris_reg_mode_jump_op},
698
699 {"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE, 0,
700 cris_reg_mode_jump_op},
701
702 {"jump",
703 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "s", 0, SIZE_FIX_32,
704 cris_ver_v0_10,
705 cris_none_reg_mode_jump_op},
706
707 {"jump",
708 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "S", 0, SIZE_NONE,
709 cris_ver_v0_10,
710 cris_none_reg_mode_jump_op},
711
712 {"jump", 0x09F0, 0x060F, "P", 0, SIZE_NONE,
713 cris_ver_v32p,
714 cris_none_reg_mode_jump_op},
715
716 {"jump",
717 JUMP_PC_INCR_OPCODE_V32,
718 (0xffff & ~JUMP_PC_INCR_OPCODE_V32), "N", 0, SIZE_FIX_32,
719 cris_ver_v32p,
720 cris_none_reg_mode_jump_op},
721
722 {"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32,
723 cris_ver_v10,
724 cris_none_reg_mode_jump_op},
725
726 {"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE,
727 cris_ver_v10,
728 cris_none_reg_mode_jump_op},
729
730 {"lapc", 0x0970, 0x0680, "U,R", 0, SIZE_NONE,
731 cris_ver_v32p,
732 cris_not_implemented_op},
733
734 {"lapc", 0x0D7F, 0x0280, "dn,R", 0, SIZE_FIX_32,
735 cris_ver_v32p,
736 cris_not_implemented_op},
737
738 {"lapcq", 0x0970, 0x0680, "u,R", 0, SIZE_NONE,
739 cris_ver_v32p,
740 cris_addi_op},
741
742 {"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE, 0,
743 cris_dstep_logshift_mstep_neg_not_op},
744
745 {"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE, 0,
746 cris_dstep_logshift_mstep_neg_not_op},
747
748 {"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE, 0,
749 cris_dstep_logshift_mstep_neg_not_op},
750
751 {"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE, 0,
752 cris_dstep_logshift_mstep_neg_not_op},
753
754 {"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE,
755 cris_ver_v3p,
756 cris_not_implemented_op},
757
758 {"mcp", 0x07f0, 0x0800, "P,r", 0, SIZE_NONE,
759 cris_ver_v32p,
760 cris_not_implemented_op},
761
762 {"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE, 0,
763 cris_reg_mode_add_sub_cmp_and_or_move_op},
764
765 {"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD, 0,
766 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
767
768 {"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE,
769 cris_ver_v0_10,
770 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
771
772 {"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE, 0,
773 cris_move_to_preg_op},
774
775 {"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE, 0,
776 cris_reg_mode_move_from_preg_op},
777
778 {"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD, 0,
779 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
780
781 {"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE,
782 cris_ver_v0_10,
783 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
784
785 {"move",
786 MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
787 "s,P", 0, SIZE_SPEC_REG, 0,
788 cris_move_to_preg_op},
789
790 {"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE,
791 cris_ver_v0_10,
792 cris_move_to_preg_op},
793
794 {"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG, 0,
795 cris_none_reg_mode_move_from_preg_op},
796
797 {"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE,
798 cris_ver_v0_10,
799 cris_none_reg_mode_move_from_preg_op},
800
801 {"move", 0x0B70, 0x0480, "r,T", 0, SIZE_NONE,
802 cris_ver_v32p,
803 cris_not_implemented_op},
804
805 {"move", 0x0F70, 0x0080, "T,r", 0, SIZE_NONE,
806 cris_ver_v32p,
807 cris_not_implemented_op},
808
809 {"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32, 0,
810 cris_move_reg_to_mem_movem_op},
811
812 {"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE,
813 cris_ver_v0_10,
814 cris_move_reg_to_mem_movem_op},
815
816 {"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32, 0,
817 cris_move_mem_to_reg_movem_op},
818
819 {"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE,
820 cris_ver_v0_10,
821 cris_move_mem_to_reg_movem_op},
822
823 {"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE, 0,
824 cris_quick_mode_and_cmp_move_or_op},
825
826 {"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE, 0,
827 cris_reg_mode_add_sub_cmp_and_or_move_op},
828
829 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
830 {"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD, 0,
831 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
832
833 {"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE,
834 cris_ver_v0_10,
835 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
836
837 {"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE, 0,
838 cris_reg_mode_add_sub_cmp_and_or_move_op},
839
840 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
841 {"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD, 0,
842 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
843
844 {"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE,
845 cris_ver_v0_10,
846 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
847
848 {"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE,
849 cris_ver_v0_10,
850 cris_dstep_logshift_mstep_neg_not_op},
851
852 {"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE,
853 cris_ver_v10p,
854 cris_muls_op},
855
856 {"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE,
857 cris_ver_v10p,
858 cris_mulu_op},
859
860 {"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE, 0,
861 cris_dstep_logshift_mstep_neg_not_op},
862
863 {"nop", NOP_OPCODE, NOP_Z_BITS, "", 0, SIZE_NONE,
864 cris_ver_v0_10,
865 cris_btst_nop_op},
866
867 {"nop", NOP_OPCODE_V32, NOP_Z_BITS_V32, "", 0, SIZE_NONE,
868 cris_ver_v32p,
869 cris_btst_nop_op},
870
871 {"not", 0x8770, 0x7880, "r", 0, SIZE_NONE, 0,
872 cris_dstep_logshift_mstep_neg_not_op},
873
874 {"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE, 0,
875 cris_reg_mode_add_sub_cmp_and_or_move_op},
876
877 {"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD, 0,
878 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
879
880 {"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE,
881 cris_ver_v0_10,
882 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
883
884 {"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE,
885 cris_ver_v0_10,
886 cris_three_operand_add_sub_cmp_and_or_op},
887
888 {"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE, 0,
889 cris_quick_mode_and_cmp_move_or_op},
890
891 {"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE,
892 cris_ver_v0_10,
893 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
894
895 {"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE,
896 cris_ver_v0_10,
897 cris_none_reg_mode_move_from_preg_op},
898
899 {"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE,
900 cris_ver_v0_10,
901 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
902
903 {"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE,
904 cris_ver_v0_10,
905 cris_move_to_preg_op},
906
907 {"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE,
908 cris_ver_v10,
909 cris_not_implemented_op},
910
911 {"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE,
912 cris_ver_v10,
913 cris_not_implemented_op},
914
915 {"rfe", 0x2930, 0xD6CF, "", 0, SIZE_NONE,
916 cris_ver_v32p,
917 cris_not_implemented_op},
918
919 {"rfg", 0x4930, 0xB6CF, "", 0, SIZE_NONE,
920 cris_ver_v32p,
921 cris_not_implemented_op},
922
923 {"rfn", 0x5930, 0xA6CF, "", 0, SIZE_NONE,
924 cris_ver_v32p,
925 cris_not_implemented_op},
926
927 {"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE,
928 cris_ver_v0_10,
929 cris_reg_mode_move_from_preg_op},
930
931 {"ret", 0xB9F0, 0x460F, "", 1, SIZE_NONE,
932 cris_ver_v32p,
933 cris_reg_mode_move_from_preg_op},
934
935 {"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE,
936 cris_ver_v0_10,
937 cris_reg_mode_move_from_preg_op},
938
939 {"rete", 0xA9F0, 0x560F, "", 1, SIZE_NONE,
940 cris_ver_v32p,
941 cris_reg_mode_move_from_preg_op},
942
943 {"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE,
944 cris_ver_v0_10,
945 cris_reg_mode_move_from_preg_op},
946
947 {"retn", 0xC9F0, 0x360F, "", 1, SIZE_NONE,
948 cris_ver_v32p,
949 cris_reg_mode_move_from_preg_op},
950
951 {"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE,
952 cris_ver_v10,
953 cris_not_implemented_op},
954
955 {"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE,
956 cris_ver_v10,
957 cris_not_implemented_op},
958
959 {"sa",
960 0x0530+CC_A*0x1000,
961 0x0AC0+(0xf-CC_A)*0x1000, "r", 0, SIZE_NONE, 0,
962 cris_scc_op},
963
964 {"ssb",
965 0x0530+CC_EXT*0x1000,
966 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
967 cris_ver_v32p,
968 cris_scc_op},
969
970 {"scc",
971 0x0530+CC_CC*0x1000,
972 0x0AC0+(0xf-CC_CC)*0x1000, "r", 0, SIZE_NONE, 0,
973 cris_scc_op},
974
975 {"scs",
976 0x0530+CC_CS*0x1000,
977 0x0AC0+(0xf-CC_CS)*0x1000, "r", 0, SIZE_NONE, 0,
978 cris_scc_op},
979
980 {"seq",
981 0x0530+CC_EQ*0x1000,
982 0x0AC0+(0xf-CC_EQ)*0x1000, "r", 0, SIZE_NONE, 0,
983 cris_scc_op},
984
985 {"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE, 0,
986 cris_ax_ei_setf_op},
987
988 {"sfe", 0x3930, 0xC6CF, "", 0, SIZE_NONE,
989 cris_ver_v32p,
990 cris_not_implemented_op},
991
992 /* Need to have "swf" in front of "sext" so it is the one displayed in
993 disassembly. */
994 {"swf",
995 0x0530+CC_EXT*0x1000,
996 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
997 cris_ver_v10,
998 cris_scc_op},
999
1000 {"sext",
1001 0x0530+CC_EXT*0x1000,
1002 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
1003 cris_ver_v0_3,
1004 cris_scc_op},
1005
1006 {"sge",
1007 0x0530+CC_GE*0x1000,
1008 0x0AC0+(0xf-CC_GE)*0x1000, "r", 0, SIZE_NONE, 0,
1009 cris_scc_op},
1010
1011 {"sgt",
1012 0x0530+CC_GT*0x1000,
1013 0x0AC0+(0xf-CC_GT)*0x1000, "r", 0, SIZE_NONE, 0,
1014 cris_scc_op},
1015
1016 {"shi",
1017 0x0530+CC_HI*0x1000,
1018 0x0AC0+(0xf-CC_HI)*0x1000, "r", 0, SIZE_NONE, 0,
1019 cris_scc_op},
1020
1021 {"shs",
1022 0x0530+CC_HS*0x1000,
1023 0x0AC0+(0xf-CC_HS)*0x1000, "r", 0, SIZE_NONE, 0,
1024 cris_scc_op},
1025
1026 {"sle",
1027 0x0530+CC_LE*0x1000,
1028 0x0AC0+(0xf-CC_LE)*0x1000, "r", 0, SIZE_NONE, 0,
1029 cris_scc_op},
1030
1031 {"slo",
1032 0x0530+CC_LO*0x1000,
1033 0x0AC0+(0xf-CC_LO)*0x1000, "r", 0, SIZE_NONE, 0,
1034 cris_scc_op},
1035
1036 {"sls",
1037 0x0530+CC_LS*0x1000,
1038 0x0AC0+(0xf-CC_LS)*0x1000, "r", 0, SIZE_NONE, 0,
1039 cris_scc_op},
1040
1041 {"slt",
1042 0x0530+CC_LT*0x1000,
1043 0x0AC0+(0xf-CC_LT)*0x1000, "r", 0, SIZE_NONE, 0,
1044 cris_scc_op},
1045
1046 {"smi",
1047 0x0530+CC_MI*0x1000,
1048 0x0AC0+(0xf-CC_MI)*0x1000, "r", 0, SIZE_NONE, 0,
1049 cris_scc_op},
1050
1051 {"sne",
1052 0x0530+CC_NE*0x1000,
1053 0x0AC0+(0xf-CC_NE)*0x1000, "r", 0, SIZE_NONE, 0,
1054 cris_scc_op},
1055
1056 {"spl",
1057 0x0530+CC_PL*0x1000,
1058 0x0AC0+(0xf-CC_PL)*0x1000, "r", 0, SIZE_NONE, 0,
1059 cris_scc_op},
1060
1061 {"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE, 0,
1062 cris_reg_mode_add_sub_cmp_and_or_move_op},
1063
1064 {"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD, 0,
1065 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1066
1067 {"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE,
1068 cris_ver_v0_10,
1069 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1070
1071 {"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE,
1072 cris_ver_v0_10,
1073 cris_three_operand_add_sub_cmp_and_or_op},
1074
1075 {"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE, 0,
1076 cris_quick_mode_add_sub_op},
1077
1078 {"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE, 0,
1079 cris_reg_mode_add_sub_cmp_and_or_move_op},
1080
1081 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
1082 {"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD, 0,
1083 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1084
1085 {"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE,
1086 cris_ver_v0_10,
1087 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1088
1089 {"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE,
1090 cris_ver_v0_10,
1091 cris_three_operand_add_sub_cmp_and_or_op},
1092
1093 {"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE, 0,
1094 cris_reg_mode_add_sub_cmp_and_or_move_op},
1095
1096 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
1097 {"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD, 0,
1098 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1099
1100 {"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE,
1101 cris_ver_v0_10,
1102 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1103
1104 {"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE,
1105 cris_ver_v0_10,
1106 cris_three_operand_add_sub_cmp_and_or_op},
1107
1108 {"svc",
1109 0x0530+CC_VC*0x1000,
1110 0x0AC0+(0xf-CC_VC)*0x1000, "r", 0, SIZE_NONE, 0,
1111 cris_scc_op},
1112
1113 {"svs",
1114 0x0530+CC_VS*0x1000,
1115 0x0AC0+(0xf-CC_VS)*0x1000, "r", 0, SIZE_NONE, 0,
1116 cris_scc_op},
1117
1118 /* The insn "swapn" is the same as "not" and will be disassembled as
1119 such, but the swap* family of mnmonics are generally v8-and-higher
1120 only, so count it in. */
1121 {"swapn", 0x8770, 0x7880, "r", 0, SIZE_NONE,
1122 cris_ver_v8p,
1123 cris_not_implemented_op},
1124
1125 {"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE,
1126 cris_ver_v8p,
1127 cris_not_implemented_op},
1128
1129 {"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE,
1130 cris_ver_v8p,
1131 cris_not_implemented_op},
1132
1133 {"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE,
1134 cris_ver_v8p,
1135 cris_not_implemented_op},
1136
1137 {"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE,
1138 cris_ver_v8p,
1139 cris_not_implemented_op},
1140
1141 {"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE,
1142 cris_ver_v8p,
1143 cris_not_implemented_op},
1144
1145 {"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE,
1146 cris_ver_v8p,
1147 cris_not_implemented_op},
1148
1149 {"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE,
1150 cris_ver_v8p,
1151 cris_not_implemented_op},
1152
1153 {"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE,
1154 cris_ver_v8p,
1155 cris_not_implemented_op},
1156
1157 {"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE,
1158 cris_ver_v8p,
1159 cris_not_implemented_op},
1160
1161 {"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE,
1162 cris_ver_v8p,
1163 cris_not_implemented_op},
1164
1165 {"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE,
1166 cris_ver_v8p,
1167 cris_not_implemented_op},
1168
1169 {"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE,
1170 cris_ver_v8p,
1171 cris_not_implemented_op},
1172
1173 {"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE,
1174 cris_ver_v8p,
1175 cris_not_implemented_op},
1176
1177 {"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE,
1178 cris_ver_v8p,
1179 cris_not_implemented_op},
1180
1181 {"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE,
1182 cris_ver_v0_10,
1183 cris_reg_mode_test_op},
1184
1185 {"test", 0x0b80, 0xf040, "m y", 0, SIZE_FIELD, 0,
1186 cris_none_reg_mode_clear_test_op},
1187
1188 {"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE,
1189 cris_ver_v0_10,
1190 cris_none_reg_mode_clear_test_op},
1191
1192 {"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE, 0,
1193 cris_xor_op},
1194
1195 {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
1196 };
1197
1198 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
1199 const char * const
1200 cris_cc_strings[] =
1201 {
1202 "hs",
1203 "lo",
1204 "ne",
1205 "eq",
1206 "vc",
1207 "vs",
1208 "pl",
1209 "mi",
1210 "ls",
1211 "hi",
1212 "ge",
1213 "lt",
1214 "gt",
1215 "le",
1216 "a",
1217 /* This is a placeholder. In v0, this would be "ext". In v32, this
1218 is "sb". See cris_conds15. */
1219 "wf"
1220 };
1221
1222 /* Different names and semantics for condition 1111 (0xf). */
1223 const struct cris_cond15 cris_cond15s[] =
1224 {
1225 /* FIXME: In what version did condition "ext" disappear? */
1226 {"ext", cris_ver_v0_3},
1227 {"wf", cris_ver_v10},
1228 {"sb", cris_ver_v32p},
1229 {NULL, 0}
1230 };
1231
1232
1233 /*
1234 * Local variables:
1235 * eval: (c-set-style "gnu")
1236 * indent-tabs-mode: t
1237 * End:
1238 */
1239
1240
1241 /* No instruction will be disassembled longer than this. In theory, and
1242 in silicon, address prefixes can be cascaded. In practice, cascading
1243 is not used by GCC, and not supported by the assembler. */
1244 #ifndef MAX_BYTES_PER_CRIS_INSN
1245 #define MAX_BYTES_PER_CRIS_INSN 8
1246 #endif
1247
1248 /* Whether or not to decode prefixes, folding it into the following
1249 instruction. FIXME: Make this optional later. */
1250 #ifndef PARSE_PREFIX
1251 #define PARSE_PREFIX 1
1252 #endif
1253
1254 /* Sometimes we prefix all registers with this character. */
1255 #define REGISTER_PREFIX_CHAR '$'
1256
1257 /* Whether or not to trace the following sequence:
1258 sub* X,r%d
1259 bound* Y,r%d
1260 adds.w [pc+r%d.w],pc
1261
1262 This is the assembly form of a switch-statement in C.
1263 The "sub is optional. If there is none, then X will be zero.
1264 X is the value of the first case,
1265 Y is the number of cases (including default).
1266
1267 This results in case offsets printed on the form:
1268 case N: -> case_address
1269 where N is an estimation on the corresponding 'case' operand in C,
1270 and case_address is where execution of that case continues after the
1271 sequence presented above.
1272
1273 The old style of output was to print the offsets as instructions,
1274 which made it hard to follow "case"-constructs in the disassembly,
1275 and caused a lot of annoying warnings about undefined instructions.
1276
1277 FIXME: Make this optional later. */
1278 #ifndef TRACE_CASE
1279 #define TRACE_CASE (disdata->trace_case)
1280 #endif
1281
1282 enum cris_disass_family
1283 { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
1284
1285 /* Stored in the disasm_info->private_data member. */
1286 struct cris_disasm_data
1287 {
1288 /* Whether to print something less confusing if we find something
1289 matching a switch-construct. */
1290 bfd_boolean trace_case;
1291
1292 /* Whether this code is flagged as crisv32. FIXME: Should be an enum
1293 that includes "compatible". */
1294 enum cris_disass_family distype;
1295 };
1296
1297 /* Value of first element in switch. */
1298 static long case_offset = 0;
1299
1300 /* How many more case-offsets to print. */
1301 static long case_offset_counter = 0;
1302
1303 /* Number of case offsets. */
1304 static long no_of_case_offsets = 0;
1305
1306 /* Candidate for next case_offset. */
1307 static long last_immediate = 0;
1308
1309 static int cris_constraint
1310 (const char *, unsigned, unsigned, struct cris_disasm_data *);
1311
1312 /* Parse disassembler options and store state in info. FIXME: For the
1313 time being, we abuse static variables. */
1314
1315 static bfd_boolean
1316 cris_parse_disassembler_options (disassemble_info *info,
1317 enum cris_disass_family distype)
1318 {
1319 struct cris_disasm_data *disdata;
1320
1321 info->private_data = calloc (1, sizeof (struct cris_disasm_data));
1322 disdata = (struct cris_disasm_data *) info->private_data;
1323 if (disdata == NULL)
1324 return FALSE;
1325
1326 /* Default true. */
1327 disdata->trace_case
1328 = (info->disassembler_options == NULL
1329 || (strcmp (info->disassembler_options, "nocase") != 0));
1330
1331 disdata->distype = distype;
1332 return TRUE;
1333 }
1334
1335 static const struct cris_spec_reg *
1336 spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
1337 {
1338 int i;
1339
1340 for (i = 0; cris_spec_regs[i].name != NULL; i++)
1341 {
1342 if (cris_spec_regs[i].number == sreg)
1343 {
1344 if (distype == cris_dis_v32)
1345 switch (cris_spec_regs[i].applicable_version)
1346 {
1347 case cris_ver_warning:
1348 case cris_ver_version_all:
1349 case cris_ver_v3p:
1350 case cris_ver_v8p:
1351 case cris_ver_v10p:
1352 case cris_ver_v32p:
1353 /* No ambiguous sizes or register names with CRISv32. */
1354 if (cris_spec_regs[i].warning == NULL)
1355 return &cris_spec_regs[i];
1356 default:
1357 ;
1358 }
1359 else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
1360 return &cris_spec_regs[i];
1361 }
1362 }
1363
1364 return NULL;
1365 }
1366
1367 /* Return the number of bits in the argument. */
1368
1369 static int
1370 number_of_bits (unsigned int val)
1371 {
1372 int bits;
1373
1374 for (bits = 0; val != 0; val &= val - 1)
1375 bits++;
1376
1377 return bits;
1378 }
1379
1380 /* Get an entry in the opcode-table. */
1381
1382 static const struct cris_opcode *
1383 get_opcode_entry (unsigned int insn,
1384 unsigned int prefix_insn,
1385 struct cris_disasm_data *disdata)
1386 {
1387 /* For non-prefixed insns, we keep a table of pointers, indexed by the
1388 insn code. Each entry is initialized when found to be NULL. */
1389 static const struct cris_opcode **opc_table = NULL;
1390
1391 const struct cris_opcode *max_matchedp = NULL;
1392 const struct cris_opcode **prefix_opc_table = NULL;
1393
1394 /* We hold a table for each prefix that need to be handled differently. */
1395 static const struct cris_opcode **dip_prefixes = NULL;
1396 static const struct cris_opcode **bdapq_m1_prefixes = NULL;
1397 static const struct cris_opcode **bdapq_m2_prefixes = NULL;
1398 static const struct cris_opcode **bdapq_m4_prefixes = NULL;
1399 static const struct cris_opcode **rest_prefixes = NULL;
1400
1401 /* Allocate and clear the opcode-table. */
1402 if (opc_table == NULL)
1403 {
1404 opc_table = malloc (65536 * sizeof (opc_table[0]));
1405 if (opc_table == NULL)
1406 return NULL;
1407
1408 memset (opc_table, 0, 65536 * sizeof (const struct cris_opcode *));
1409
1410 dip_prefixes
1411 = malloc (65536 * sizeof (const struct cris_opcode **));
1412 if (dip_prefixes == NULL)
1413 return NULL;
1414
1415 memset (dip_prefixes, 0, 65536 * sizeof (dip_prefixes[0]));
1416
1417 bdapq_m1_prefixes
1418 = malloc (65536 * sizeof (const struct cris_opcode **));
1419 if (bdapq_m1_prefixes == NULL)
1420 return NULL;
1421
1422 memset (bdapq_m1_prefixes, 0, 65536 * sizeof (bdapq_m1_prefixes[0]));
1423
1424 bdapq_m2_prefixes
1425 = malloc (65536 * sizeof (const struct cris_opcode **));
1426 if (bdapq_m2_prefixes == NULL)
1427 return NULL;
1428
1429 memset (bdapq_m2_prefixes, 0, 65536 * sizeof (bdapq_m2_prefixes[0]));
1430
1431 bdapq_m4_prefixes
1432 = malloc (65536 * sizeof (const struct cris_opcode **));
1433 if (bdapq_m4_prefixes == NULL)
1434 return NULL;
1435
1436 memset (bdapq_m4_prefixes, 0, 65536 * sizeof (bdapq_m4_prefixes[0]));
1437
1438 rest_prefixes
1439 = malloc (65536 * sizeof (const struct cris_opcode **));
1440 if (rest_prefixes == NULL)
1441 return NULL;
1442
1443 memset (rest_prefixes, 0, 65536 * sizeof (rest_prefixes[0]));
1444 }
1445
1446 /* Get the right table if this is a prefix.
1447 This code is connected to cris_constraints in that it knows what
1448 prefixes play a role in recognition of patterns; the necessary
1449 state is reflected by which table is used. If constraints
1450 involving match or non-match of prefix insns are changed, then this
1451 probably needs changing too. */
1452 if (prefix_insn != NO_CRIS_PREFIX)
1453 {
1454 const struct cris_opcode *popcodep
1455 = (opc_table[prefix_insn] != NULL
1456 ? opc_table[prefix_insn]
1457 : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
1458
1459 if (popcodep == NULL)
1460 return NULL;
1461
1462 if (popcodep->match == BDAP_QUICK_OPCODE)
1463 {
1464 /* Since some offsets are recognized with "push" macros, we
1465 have to have different tables for them. */
1466 int offset = (prefix_insn & 255);
1467
1468 if (offset > 127)
1469 offset -= 256;
1470
1471 switch (offset)
1472 {
1473 case -4:
1474 prefix_opc_table = bdapq_m4_prefixes;
1475 break;
1476
1477 case -2:
1478 prefix_opc_table = bdapq_m2_prefixes;
1479 break;
1480
1481 case -1:
1482 prefix_opc_table = bdapq_m1_prefixes;
1483 break;
1484
1485 default:
1486 prefix_opc_table = rest_prefixes;
1487 break;
1488 }
1489 }
1490 else if (popcodep->match == DIP_OPCODE)
1491 /* We don't allow postincrement when the prefix is DIP, so use a
1492 different table for DIP. */
1493 prefix_opc_table = dip_prefixes;
1494 else
1495 prefix_opc_table = rest_prefixes;
1496 }
1497
1498 if (prefix_insn != NO_CRIS_PREFIX
1499 && prefix_opc_table[insn] != NULL)
1500 max_matchedp = prefix_opc_table[insn];
1501 else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
1502 max_matchedp = opc_table[insn];
1503 else
1504 {
1505 const struct cris_opcode *opcodep;
1506 int max_level_of_match = -1;
1507
1508 for (opcodep = cris_opcodes;
1509 opcodep->name != NULL;
1510 opcodep++)
1511 {
1512 int level_of_match;
1513
1514 if (disdata->distype == cris_dis_v32)
1515 {
1516 switch (opcodep->applicable_version)
1517 {
1518 case cris_ver_version_all:
1519 break;
1520
1521 case cris_ver_v0_3:
1522 case cris_ver_v0_10:
1523 case cris_ver_v3_10:
1524 case cris_ver_sim_v0_10:
1525 case cris_ver_v8_10:
1526 case cris_ver_v10:
1527 case cris_ver_warning:
1528 continue;
1529
1530 case cris_ver_v3p:
1531 case cris_ver_v8p:
1532 case cris_ver_v10p:
1533 case cris_ver_v32p:
1534 break;
1535
1536 case cris_ver_v8:
1537 abort ();
1538 default:
1539 abort ();
1540 }
1541 }
1542 else
1543 {
1544 switch (opcodep->applicable_version)
1545 {
1546 case cris_ver_version_all:
1547 case cris_ver_v0_3:
1548 case cris_ver_v3p:
1549 case cris_ver_v0_10:
1550 case cris_ver_v8p:
1551 case cris_ver_v8_10:
1552 case cris_ver_v10:
1553 case cris_ver_sim_v0_10:
1554 case cris_ver_v10p:
1555 case cris_ver_warning:
1556 break;
1557
1558 case cris_ver_v32p:
1559 continue;
1560
1561 case cris_ver_v8:
1562 abort ();
1563 default:
1564 abort ();
1565 }
1566 }
1567
1568 /* We give a double lead for bits matching the template in
1569 cris_opcodes. Not even, because then "move p8,r10" would
1570 be given 2 bits lead over "clear.d r10". When there's a
1571 tie, the first entry in the table wins. This is
1572 deliberate, to avoid a more complicated recognition
1573 formula. */
1574 if ((opcodep->match & insn) == opcodep->match
1575 && (opcodep->lose & insn) == 0
1576 && ((level_of_match
1577 = cris_constraint (opcodep->args,
1578 insn,
1579 prefix_insn,
1580 disdata))
1581 >= 0)
1582 && ((level_of_match
1583 += 2 * number_of_bits (opcodep->match
1584 | opcodep->lose))
1585 > max_level_of_match))
1586 {
1587 max_matchedp = opcodep;
1588 max_level_of_match = level_of_match;
1589
1590 /* If there was a full match, never mind looking
1591 further. */
1592 if (level_of_match >= 2 * 16)
1593 break;
1594 }
1595 }
1596 /* Fill in the new entry.
1597
1598 If there are changes to the opcode-table involving prefixes, and
1599 disassembly then does not work correctly, try removing the
1600 else-clause below that fills in the prefix-table. If that
1601 helps, you need to change the prefix_opc_table setting above, or
1602 something related. */
1603 if (prefix_insn == NO_CRIS_PREFIX)
1604 opc_table[insn] = max_matchedp;
1605 else
1606 prefix_opc_table[insn] = max_matchedp;
1607 }
1608
1609 return max_matchedp;
1610 }
1611
1612 /* Return -1 if the constraints of a bitwise-matched instruction say
1613 that there is no match. Otherwise return a nonnegative number
1614 indicating the confidence in the match (higher is better). */
1615
1616 static int
1617 cris_constraint (const char *cs,
1618 unsigned int insn,
1619 unsigned int prefix_insn,
1620 struct cris_disasm_data *disdata)
1621 {
1622 int retval = 0;
1623 int tmp;
1624 int prefix_ok = 0;
1625 const char *s;
1626
1627 for (s = cs; *s; s++)
1628 switch (*s)
1629 {
1630 case '!':
1631 /* Do not recognize "pop" if there's a prefix and then only for
1632 v0..v10. */
1633 if (prefix_insn != NO_CRIS_PREFIX
1634 || disdata->distype != cris_dis_v0_v10)
1635 return -1;
1636 break;
1637
1638 case 'U':
1639 /* Not recognized at disassembly. */
1640 return -1;
1641
1642 case 'M':
1643 /* Size modifier for "clear", i.e. special register 0, 4 or 8.
1644 Check that it is one of them. Only special register 12 could
1645 be mismatched, but checking for matches is more logical than
1646 checking for mismatches when there are only a few cases. */
1647 tmp = ((insn >> 12) & 0xf);
1648 if (tmp != 0 && tmp != 4 && tmp != 8)
1649 return -1;
1650 break;
1651
1652 case 'm':
1653 if ((insn & 0x30) == 0x30)
1654 return -1;
1655 break;
1656
1657 case 'S':
1658 /* A prefix operand without side-effect. */
1659 if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
1660 {
1661 prefix_ok = 1;
1662 break;
1663 }
1664 else
1665 return -1;
1666
1667 case 's':
1668 case 'y':
1669 case 'Y':
1670 /* If this is a prefixed insn with postincrement (side-effect),
1671 the prefix must not be DIP. */
1672 if (prefix_insn != NO_CRIS_PREFIX)
1673 {
1674 if (insn & 0x400)
1675 {
1676 const struct cris_opcode *prefix_opcodep
1677 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1678
1679 if (prefix_opcodep->match == DIP_OPCODE)
1680 return -1;
1681 }
1682
1683 prefix_ok = 1;
1684 }
1685 break;
1686
1687 case 'B':
1688 /* If we don't fall through, then the prefix is ok. */
1689 prefix_ok = 1;
1690
1691 /* A "push" prefix. Check for valid "push" size.
1692 In case of special register, it may be != 4. */
1693 if (prefix_insn != NO_CRIS_PREFIX)
1694 {
1695 /* Match the prefix insn to BDAPQ. */
1696 const struct cris_opcode *prefix_opcodep
1697 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1698
1699 if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
1700 {
1701 int pushsize = (prefix_insn & 255);
1702
1703 if (pushsize > 127)
1704 pushsize -= 256;
1705
1706 if (s[1] == 'P')
1707 {
1708 unsigned int spec_reg = (insn >> 12) & 15;
1709 const struct cris_spec_reg *sregp
1710 = spec_reg_info (spec_reg, disdata->distype);
1711
1712 /* For a special-register, the "prefix size" must
1713 match the size of the register. */
1714 if (sregp && sregp->reg_size == (unsigned int) -pushsize)
1715 break;
1716 }
1717 else if (s[1] == 'R')
1718 {
1719 if ((insn & 0x30) == 0x20 && pushsize == -4)
1720 break;
1721 }
1722 /* FIXME: Should abort here; next constraint letter
1723 *must* be 'P' or 'R'. */
1724 }
1725 }
1726 return -1;
1727
1728 case 'D':
1729 retval = (((insn >> 12) & 15) == (insn & 15));
1730 if (!retval)
1731 return -1;
1732 else
1733 retval += 4;
1734 break;
1735
1736 case 'P':
1737 {
1738 const struct cris_spec_reg *sregp
1739 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1740
1741 /* Since we match four bits, we will give a value of 4-1 = 3
1742 in a match. If there is a corresponding exact match of a
1743 special register in another pattern, it will get a value of
1744 4, which will be higher. This should be correct in that an
1745 exact pattern would match better than a general pattern.
1746
1747 Note that there is a reason for not returning zero; the
1748 pattern for "clear" is partly matched in the bit-pattern
1749 (the two lower bits must be zero), while the bit-pattern
1750 for a move from a special register is matched in the
1751 register constraint. */
1752
1753 if (sregp != NULL)
1754 {
1755 retval += 3;
1756 break;
1757 }
1758 else
1759 return -1;
1760 }
1761 }
1762
1763 if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
1764 return -1;
1765
1766 return retval;
1767 }
1768
1769 /* Format number as hex with a leading "0x" into outbuffer. */
1770
1771 static char *
1772 format_hex (unsigned long number,
1773 char *outbuffer,
1774 struct cris_disasm_data *disdata)
1775 {
1776 /* Truncate negative numbers on >32-bit hosts. */
1777 number &= 0xffffffff;
1778
1779 sprintf (outbuffer, "0x%lx", number);
1780
1781 /* Save this value for the "case" support. */
1782 if (TRACE_CASE)
1783 last_immediate = number;
1784
1785 return outbuffer + strlen (outbuffer);
1786 }
1787
1788 /* Format number as decimal into outbuffer. Parameter signedp says
1789 whether the number should be formatted as signed (!= 0) or
1790 unsigned (== 0). */
1791
1792 static char *
1793 format_dec (long number, char *outbuffer, int signedp)
1794 {
1795 last_immediate = number;
1796 sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
1797
1798 return outbuffer + strlen (outbuffer);
1799 }
1800
1801 /* Format the name of the general register regno into outbuffer. */
1802
1803 static char *
1804 format_reg (struct cris_disasm_data *disdata,
1805 int regno,
1806 char *outbuffer_start,
1807 bfd_boolean with_reg_prefix)
1808 {
1809 char *outbuffer = outbuffer_start;
1810
1811 if (with_reg_prefix)
1812 *outbuffer++ = REGISTER_PREFIX_CHAR;
1813
1814 switch (regno)
1815 {
1816 case 15:
1817 /* For v32, there is no context in which we output PC. */
1818 if (disdata->distype == cris_dis_v32)
1819 strcpy (outbuffer, "acr");
1820 else
1821 strcpy (outbuffer, "pc");
1822 break;
1823
1824 case 14:
1825 strcpy (outbuffer, "sp");
1826 break;
1827
1828 default:
1829 sprintf (outbuffer, "r%d", regno);
1830 break;
1831 }
1832
1833 return outbuffer_start + strlen (outbuffer_start);
1834 }
1835
1836 /* Format the name of a support register into outbuffer. */
1837
1838 static char *
1839 format_sup_reg (unsigned int regno,
1840 char *outbuffer_start,
1841 bfd_boolean with_reg_prefix)
1842 {
1843 char *outbuffer = outbuffer_start;
1844 int i;
1845
1846 if (with_reg_prefix)
1847 *outbuffer++ = REGISTER_PREFIX_CHAR;
1848
1849 for (i = 0; cris_support_regs[i].name != NULL; i++)
1850 if (cris_support_regs[i].number == regno)
1851 {
1852 sprintf (outbuffer, "%s", cris_support_regs[i].name);
1853 return outbuffer_start + strlen (outbuffer_start);
1854 }
1855
1856 /* There's supposed to be register names covering all numbers, though
1857 some may be generic names. */
1858 sprintf (outbuffer, "format_sup_reg-BUG");
1859 return outbuffer_start + strlen (outbuffer_start);
1860 }
1861
1862 /* Return the length of an instruction. */
1863
1864 static unsigned
1865 bytes_to_skip (unsigned int insn,
1866 const struct cris_opcode *matchedp,
1867 enum cris_disass_family distype,
1868 const struct cris_opcode *prefix_matchedp)
1869 {
1870 /* Each insn is a word plus "immediate" operands. */
1871 unsigned to_skip = 2;
1872 const char *template = matchedp->args;
1873 const char *s;
1874
1875 for (s = template; *s; s++)
1876 if ((*s == 's' || *s == 'N' || *s == 'Y')
1877 && (insn & 0x400) && (insn & 15) == 15
1878 && prefix_matchedp == NULL)
1879 {
1880 /* Immediate via [pc+], so we have to check the size of the
1881 operand. */
1882 int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
1883
1884 if (matchedp->imm_oprnd_size == SIZE_FIX_32)
1885 to_skip += 4;
1886 else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
1887 {
1888 const struct cris_spec_reg *sregp
1889 = spec_reg_info ((insn >> 12) & 15, distype);
1890
1891 /* FIXME: Improve error handling; should have been caught
1892 earlier. */
1893 if (sregp == NULL)
1894 return 2;
1895
1896 /* PC is incremented by two, not one, for a byte. Except on
1897 CRISv32, where constants are always DWORD-size for
1898 special registers. */
1899 to_skip +=
1900 distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
1901 }
1902 else
1903 to_skip += (mode_size + 1) & ~1;
1904 }
1905 else if (*s == 'n')
1906 to_skip += 4;
1907 else if (*s == 'b')
1908 to_skip += 2;
1909
1910 return to_skip;
1911 }
1912
1913 /* Print condition code flags. */
1914
1915 static char *
1916 print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
1917 {
1918 /* Use the v8 (Etrax 100) flag definitions for disassembly.
1919 The differences with v0 (Etrax 1..4) vs. Svinto are:
1920 v0 'd' <=> v8 'm'
1921 v0 'e' <=> v8 'b'.
1922 FIXME: Emit v0..v3 flag names somehow. */
1923 static const char v8_fnames[] = "cvznxibm";
1924 static const char v32_fnames[] = "cvznxiup";
1925 const char *fnames
1926 = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
1927
1928 unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
1929 int i;
1930
1931 for (i = 0; i < 8; i++)
1932 if (flagbits & (1 << i))
1933 *cp++ = fnames[i];
1934
1935 return cp;
1936 }
1937
1938 /* Print out an insn with its operands, and update the info->insn_type
1939 fields. The prefix_opcodep and the rest hold a prefix insn that is
1940 supposed to be output as an address mode. */
1941
1942 static void
1943 print_with_operands (const struct cris_opcode *opcodep,
1944 unsigned int insn,
1945 unsigned char *buffer,
1946 bfd_vma addr,
1947 disassemble_info *info,
1948 /* If a prefix insn was before this insn (and is supposed
1949 to be output as an address), here is a description of
1950 it. */
1951 const struct cris_opcode *prefix_opcodep,
1952 unsigned int prefix_insn,
1953 unsigned char *prefix_buffer,
1954 bfd_boolean with_reg_prefix)
1955 {
1956 /* Get a buffer of somewhat reasonable size where we store
1957 intermediate parts of the insn. */
1958 char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
1959 char *tp = temp;
1960 static const char mode_char[] = "bwd?";
1961 const char *s;
1962 const char *cs;
1963 struct cris_disasm_data *disdata
1964 = (struct cris_disasm_data *) info->private_data;
1965
1966 /* Print out the name first thing we do. */
1967 (*info->fprintf_func) (info->stream, "%s", opcodep->name);
1968
1969 cs = opcodep->args;
1970 s = cs;
1971
1972 /* Ignore any prefix indicator. */
1973 if (*s == 'p')
1974 s++;
1975
1976 if (*s == 'm' || *s == 'M' || *s == 'z')
1977 {
1978 *tp++ = '.';
1979
1980 /* Get the size-letter. */
1981 *tp++ = *s == 'M'
1982 ? (insn & 0x8000 ? 'd'
1983 : insn & 0x4000 ? 'w' : 'b')
1984 : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
1985
1986 /* Ignore the size and the space character that follows. */
1987 s += 2;
1988 }
1989
1990 /* Add a space if this isn't a long-branch, because for those will add
1991 the condition part of the name later. */
1992 if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
1993 *tp++ = ' ';
1994
1995 /* Fill in the insn-type if deducible from the name (and there's no
1996 better way). */
1997 if (opcodep->name[0] == 'j')
1998 {
1999 if (CONST_STRNEQ (opcodep->name, "jsr"))
2000 /* It's "jsr" or "jsrc". */
2001 info->insn_type = dis_jsr;
2002 else
2003 /* Any other jump-type insn is considered a branch. */
2004 info->insn_type = dis_branch;
2005 }
2006
2007 /* We might know some more fields right now. */
2008 info->branch_delay_insns = opcodep->delayed;
2009
2010 /* Handle operands. */
2011 for (; *s; s++)
2012 {
2013 switch (*s)
2014 {
2015 case 'T':
2016 tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
2017 break;
2018
2019 case 'A':
2020 if (with_reg_prefix)
2021 *tp++ = REGISTER_PREFIX_CHAR;
2022 *tp++ = 'a';
2023 *tp++ = 'c';
2024 *tp++ = 'r';
2025 break;
2026
2027 case '[':
2028 case ']':
2029 case ',':
2030 *tp++ = *s;
2031 break;
2032
2033 case '!':
2034 /* Ignore at this point; used at earlier stages to avoid
2035 recognition if there's a prefix at something that in other
2036 ways looks like a "pop". */
2037 break;
2038
2039 case 'd':
2040 /* Ignore. This is an optional ".d " on the large one of
2041 relaxable insns. */
2042 break;
2043
2044 case 'B':
2045 /* This was the prefix that made this a "push". We've already
2046 handled it by recognizing it, so signal that the prefix is
2047 handled by setting it to NULL. */
2048 prefix_opcodep = NULL;
2049 break;
2050
2051 case 'D':
2052 case 'r':
2053 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2054 break;
2055
2056 case 'R':
2057 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2058 break;
2059
2060 case 'n':
2061 {
2062 /* Like N but pc-relative to the start of the insn. */
2063 unsigned long number
2064 = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2065 + buffer[5] * 0x1000000 + addr);
2066
2067 /* Finish off and output previous formatted bytes. */
2068 *tp = 0;
2069 if (temp[0])
2070 (*info->fprintf_func) (info->stream, "%s", temp);
2071 tp = temp;
2072
2073 (*info->print_address_func) ((bfd_vma) number, info);
2074 }
2075 break;
2076
2077 case 'u':
2078 {
2079 /* Like n but the offset is bits <3:0> in the instruction. */
2080 unsigned long number = (buffer[0] & 0xf) * 2 + addr;
2081
2082 /* Finish off and output previous formatted bytes. */
2083 *tp = 0;
2084 if (temp[0])
2085 (*info->fprintf_func) (info->stream, "%s", temp);
2086 tp = temp;
2087
2088 (*info->print_address_func) ((bfd_vma) number, info);
2089 }
2090 break;
2091
2092 case 'N':
2093 case 'y':
2094 case 'Y':
2095 case 'S':
2096 case 's':
2097 /* Any "normal" memory operand. */
2098 if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
2099 {
2100 /* We're looking at [pc+], i.e. we need to output an immediate
2101 number, where the size can depend on different things. */
2102 long number;
2103 int signedp
2104 = ((*cs == 'z' && (insn & 0x20))
2105 || opcodep->match == BDAP_QUICK_OPCODE);
2106 int nbytes;
2107
2108 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2109 nbytes = 4;
2110 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2111 {
2112 const struct cris_spec_reg *sregp
2113 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2114
2115 /* A NULL return should have been as a non-match earlier,
2116 so catch it as an internal error in the error-case
2117 below. */
2118 if (sregp == NULL)
2119 /* Whatever non-valid size. */
2120 nbytes = 42;
2121 else
2122 /* PC is always incremented by a multiple of two.
2123 For CRISv32, immediates are always 4 bytes for
2124 special registers. */
2125 nbytes = disdata->distype == cris_dis_v32
2126 ? 4 : (sregp->reg_size + 1) & ~1;
2127 }
2128 else
2129 {
2130 int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
2131
2132 if (mode_size == 1)
2133 nbytes = 2;
2134 else
2135 nbytes = mode_size;
2136 }
2137
2138 switch (nbytes)
2139 {
2140 case 1:
2141 number = buffer[2];
2142 if (signedp && number > 127)
2143 number -= 256;
2144 break;
2145
2146 case 2:
2147 number = buffer[2] + buffer[3] * 256;
2148 if (signedp && number > 32767)
2149 number -= 65536;
2150 break;
2151
2152 case 4:
2153 number
2154 = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2155 + buffer[5] * 0x1000000;
2156 break;
2157
2158 default:
2159 strcpy (tp, "bug");
2160 tp += 3;
2161 number = 42;
2162 }
2163
2164 if ((*cs == 'z' && (insn & 0x20))
2165 || (opcodep->match == BDAP_QUICK_OPCODE
2166 && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
2167 tp = format_dec (number, tp, signedp);
2168 else
2169 {
2170 unsigned int highbyte = (number >> 24) & 0xff;
2171
2172 /* Either output this as an address or as a number. If it's
2173 a dword with the same high-byte as the address of the
2174 insn, assume it's an address, and also if it's a non-zero
2175 non-0xff high-byte. If this is a jsr or a jump, then
2176 it's definitely an address. */
2177 if (nbytes == 4
2178 && (highbyte == ((addr >> 24) & 0xff)
2179 || (highbyte != 0 && highbyte != 0xff)
2180 || info->insn_type == dis_branch
2181 || info->insn_type == dis_jsr))
2182 {
2183 /* Finish off and output previous formatted bytes. */
2184 *tp = 0;
2185 tp = temp;
2186 if (temp[0])
2187 (*info->fprintf_func) (info->stream, "%s", temp);
2188
2189 (*info->print_address_func) ((bfd_vma) number, info);
2190
2191 info->target = number;
2192 }
2193 else
2194 tp = format_hex (number, tp, disdata);
2195 }
2196 }
2197 else
2198 {
2199 /* Not an immediate number. Then this is a (possibly
2200 prefixed) memory operand. */
2201 if (info->insn_type != dis_nonbranch)
2202 {
2203 int mode_size
2204 = 1 << ((insn >> 4)
2205 & (opcodep->args[0] == 'z' ? 1 : 3));
2206 int size;
2207 info->insn_type = dis_dref;
2208 info->flags |= CRIS_DIS_FLAG_MEMREF;
2209
2210 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2211 size = 4;
2212 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2213 {
2214 const struct cris_spec_reg *sregp
2215 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2216
2217 /* FIXME: Improve error handling; should have been caught
2218 earlier. */
2219 if (sregp == NULL)
2220 size = 4;
2221 else
2222 size = sregp->reg_size;
2223 }
2224 else
2225 size = mode_size;
2226
2227 info->data_size = size;
2228 }
2229
2230 *tp++ = '[';
2231
2232 if (prefix_opcodep
2233 /* We don't match dip with a postincremented field
2234 as a side-effect address mode. */
2235 && ((insn & 0x400) == 0
2236 || prefix_opcodep->match != DIP_OPCODE))
2237 {
2238 if (insn & 0x400)
2239 {
2240 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2241 *tp++ = '=';
2242 }
2243
2244
2245 /* We mainly ignore the prefix format string when the
2246 address-mode syntax is output. */
2247 switch (prefix_opcodep->match)
2248 {
2249 case DIP_OPCODE:
2250 /* It's [r], [r+] or [pc+]. */
2251 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2252 {
2253 /* It's [pc+]. This cannot possibly be anything
2254 but an address. */
2255 unsigned long number
2256 = prefix_buffer[2] + prefix_buffer[3] * 256
2257 + prefix_buffer[4] * 65536
2258 + prefix_buffer[5] * 0x1000000;
2259
2260 info->target = (bfd_vma) number;
2261
2262 /* Finish off and output previous formatted
2263 data. */
2264 *tp = 0;
2265 tp = temp;
2266 if (temp[0])
2267 (*info->fprintf_func) (info->stream, "%s", temp);
2268
2269 (*info->print_address_func) ((bfd_vma) number, info);
2270 }
2271 else
2272 {
2273 /* For a memref in an address, we use target2.
2274 In this case, target is zero. */
2275 info->flags
2276 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2277 | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
2278
2279 info->target2 = prefix_insn & 15;
2280
2281 *tp++ = '[';
2282 tp = format_reg (disdata, prefix_insn & 15, tp,
2283 with_reg_prefix);
2284 if (prefix_insn & 0x400)
2285 *tp++ = '+';
2286 *tp++ = ']';
2287 }
2288 break;
2289
2290 case BDAP_QUICK_OPCODE:
2291 {
2292 int number;
2293
2294 number = prefix_buffer[0];
2295 if (number > 127)
2296 number -= 256;
2297
2298 /* Output "reg+num" or, if num < 0, "reg-num". */
2299 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2300 with_reg_prefix);
2301 if (number >= 0)
2302 *tp++ = '+';
2303 tp = format_dec (number, tp, 1);
2304
2305 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2306 info->target = (prefix_insn >> 12) & 15;
2307 info->target2 = (bfd_vma) number;
2308 break;
2309 }
2310
2311 case BIAP_OPCODE:
2312 /* Output "r+R.m". */
2313 tp = format_reg (disdata, prefix_insn & 15, tp,
2314 with_reg_prefix);
2315 *tp++ = '+';
2316 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2317 with_reg_prefix);
2318 *tp++ = '.';
2319 *tp++ = mode_char[(prefix_insn >> 4) & 3];
2320
2321 info->flags
2322 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2323 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2324
2325 | ((prefix_insn & 0x8000)
2326 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
2327 : ((prefix_insn & 0x8000)
2328 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
2329
2330 /* Is it the casejump? It's a "adds.w [pc+r%d.w],pc". */
2331 if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
2332 /* Then start interpreting data as offsets. */
2333 case_offset_counter = no_of_case_offsets;
2334 break;
2335
2336 case BDAP_INDIR_OPCODE:
2337 /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
2338 "r-s". */
2339 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2340 with_reg_prefix);
2341
2342 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2343 {
2344 long number;
2345 unsigned int nbytes;
2346
2347 /* It's a value. Get its size. */
2348 int mode_size = 1 << ((prefix_insn >> 4) & 3);
2349
2350 if (mode_size == 1)
2351 nbytes = 2;
2352 else
2353 nbytes = mode_size;
2354
2355 switch (nbytes)
2356 {
2357 case 1:
2358 number = prefix_buffer[2];
2359 if (number > 127)
2360 number -= 256;
2361 break;
2362
2363 case 2:
2364 number = prefix_buffer[2] + prefix_buffer[3] * 256;
2365 if (number > 32767)
2366 number -= 65536;
2367 break;
2368
2369 case 4:
2370 number
2371 = prefix_buffer[2] + prefix_buffer[3] * 256
2372 + prefix_buffer[4] * 65536
2373 + prefix_buffer[5] * 0x1000000;
2374 break;
2375
2376 default:
2377 strcpy (tp, "bug");
2378 tp += 3;
2379 number = 42;
2380 }
2381
2382 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2383 info->target2 = (bfd_vma) number;
2384
2385 /* If the size is dword, then assume it's an
2386 address. */
2387 if (nbytes == 4)
2388 {
2389 /* Finish off and output previous formatted
2390 bytes. */
2391 *tp++ = '+';
2392 *tp = 0;
2393 tp = temp;
2394 (*info->fprintf_func) (info->stream, "%s", temp);
2395
2396 (*info->print_address_func) ((bfd_vma) number, info);
2397 }
2398 else
2399 {
2400 if (number >= 0)
2401 *tp++ = '+';
2402 tp = format_dec (number, tp, 1);
2403 }
2404 }
2405 else
2406 {
2407 /* Output "r+[R].m" or "r+[R+].m". */
2408 *tp++ = '+';
2409 *tp++ = '[';
2410 tp = format_reg (disdata, prefix_insn & 15, tp,
2411 with_reg_prefix);
2412 if (prefix_insn & 0x400)
2413 *tp++ = '+';
2414 *tp++ = ']';
2415 *tp++ = '.';
2416 *tp++ = mode_char[(prefix_insn >> 4) & 3];
2417
2418 info->flags
2419 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2420 | CRIS_DIS_FLAG_MEM_TARGET2_MEM
2421 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2422
2423 | (((prefix_insn >> 4) == 2)
2424 ? 0
2425 : (((prefix_insn >> 4) & 3) == 1
2426 ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
2427 : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
2428 }
2429 break;
2430
2431 default:
2432 (*info->fprintf_func) (info->stream, "?prefix-bug");
2433 }
2434
2435 /* To mark that the prefix is used, reset it. */
2436 prefix_opcodep = NULL;
2437 }
2438 else
2439 {
2440 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2441
2442 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2443 info->target = insn & 15;
2444
2445 if (insn & 0x400)
2446 *tp++ = '+';
2447 }
2448 *tp++ = ']';
2449 }
2450 break;
2451
2452 case 'x':
2453 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2454 *tp++ = '.';
2455 *tp++ = mode_char[(insn >> 4) & 3];
2456 break;
2457
2458 case 'I':
2459 tp = format_dec (insn & 63, tp, 0);
2460 break;
2461
2462 case 'b':
2463 {
2464 int where = buffer[2] + buffer[3] * 256;
2465
2466 if (where > 32767)
2467 where -= 65536;
2468
2469 where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
2470
2471 if (insn == BA_PC_INCR_OPCODE)
2472 info->insn_type = dis_branch;
2473 else
2474 info->insn_type = dis_condbranch;
2475
2476 info->target = (bfd_vma) where;
2477
2478 *tp = 0;
2479 tp = temp;
2480 (*info->fprintf_func) (info->stream, "%s%s ",
2481 temp, cris_cc_strings[insn >> 12]);
2482
2483 (*info->print_address_func) ((bfd_vma) where, info);
2484 }
2485 break;
2486
2487 case 'c':
2488 tp = format_dec (insn & 31, tp, 0);
2489 break;
2490
2491 case 'C':
2492 tp = format_dec (insn & 15, tp, 0);
2493 break;
2494
2495 case 'o':
2496 {
2497 long offset = insn & 0xfe;
2498 bfd_vma target;
2499
2500 if (insn & 1)
2501 offset |= ~0xff;
2502
2503 if (opcodep->match == BA_QUICK_OPCODE)
2504 info->insn_type = dis_branch;
2505 else
2506 info->insn_type = dis_condbranch;
2507
2508 target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
2509 info->target = target;
2510 *tp = 0;
2511 tp = temp;
2512 (*info->fprintf_func) (info->stream, "%s", temp);
2513 (*info->print_address_func) (target, info);
2514 }
2515 break;
2516
2517 case 'Q':
2518 case 'O':
2519 {
2520 long number = buffer[0];
2521
2522 if (number > 127)
2523 number = number - 256;
2524
2525 tp = format_dec (number, tp, 1);
2526 *tp++ = ',';
2527 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2528 }
2529 break;
2530
2531 case 'f':
2532 tp = print_flags (disdata, insn, tp);
2533 break;
2534
2535 case 'i':
2536 tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
2537 break;
2538
2539 case 'P':
2540 {
2541 const struct cris_spec_reg *sregp
2542 = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2543
2544 if (sregp->name == NULL)
2545 /* Should have been caught as a non-match eariler. */
2546 *tp++ = '?';
2547 else
2548 {
2549 if (with_reg_prefix)
2550 *tp++ = REGISTER_PREFIX_CHAR;
2551 strcpy (tp, sregp->name);
2552 tp += strlen (tp);
2553 }
2554 }
2555 break;
2556
2557 default:
2558 strcpy (tp, "???");
2559 tp += 3;
2560 }
2561 }
2562
2563 *tp = 0;
2564
2565 if (prefix_opcodep)
2566 (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
2567 prefix_opcodep->name, prefix_opcodep->args);
2568
2569 (*info->fprintf_func) (info->stream, "%s", temp);
2570
2571 /* Get info for matching case-tables, if we don't have any active.
2572 We assume that the last constant seen is used; either in the insn
2573 itself or in a "move.d const,rN, sub.d rN,rM"-like sequence. */
2574 if (TRACE_CASE && case_offset_counter == 0)
2575 {
2576 if (CONST_STRNEQ (opcodep->name, "sub"))
2577 case_offset = last_immediate;
2578
2579 /* It could also be an "add", if there are negative case-values. */
2580 else if (CONST_STRNEQ (opcodep->name, "add"))
2581 /* The first case is the negated operand to the add. */
2582 case_offset = -last_immediate;
2583
2584 /* A bound insn will tell us the number of cases. */
2585 else if (CONST_STRNEQ (opcodep->name, "bound"))
2586 no_of_case_offsets = last_immediate + 1;
2587
2588 /* A jump or jsr or branch breaks the chain of insns for a
2589 case-table, so assume default first-case again. */
2590 else if (info->insn_type == dis_jsr
2591 || info->insn_type == dis_branch
2592 || info->insn_type == dis_condbranch)
2593 case_offset = 0;
2594 }
2595 }
2596
2597
2598 /* Print the CRIS instruction at address memaddr on stream. Returns
2599 length of the instruction, in bytes. Prefix register names with `$' if
2600 WITH_REG_PREFIX. */
2601
2602 static int
2603 print_insn_cris_generic (bfd_vma memaddr,
2604 disassemble_info *info,
2605 bfd_boolean with_reg_prefix)
2606 {
2607 int nbytes;
2608 unsigned int insn;
2609 const struct cris_opcode *matchedp;
2610 int advance = 0;
2611 struct cris_disasm_data *disdata
2612 = (struct cris_disasm_data *) info->private_data;
2613
2614 /* No instruction will be disassembled as longer than this number of
2615 bytes; stacked prefixes will not be expanded. */
2616 unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
2617 unsigned char *bufp;
2618 int status = 0;
2619 bfd_vma addr;
2620
2621 /* There will be an "out of range" error after the last instruction.
2622 Reading pairs of bytes in decreasing number, we hope that we will get
2623 at least the amount that we will consume.
2624
2625 If we can't get any data, or we do not get enough data, we print
2626 the error message. */
2627
2628 for (nbytes = MAX_BYTES_PER_CRIS_INSN; nbytes > 0; nbytes -= 2)
2629 {
2630 status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
2631 if (status == 0)
2632 break;
2633 }
2634
2635 /* If we did not get all we asked for, then clear the rest.
2636 Hopefully this makes a reproducible result in case of errors. */
2637 if (nbytes != MAX_BYTES_PER_CRIS_INSN)
2638 memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
2639
2640 addr = memaddr;
2641 bufp = buffer;
2642
2643 /* Set some defaults for the insn info. */
2644 info->insn_info_valid = 1;
2645 info->branch_delay_insns = 0;
2646 info->data_size = 0;
2647 info->insn_type = dis_nonbranch;
2648 info->flags = 0;
2649 info->target = 0;
2650 info->target2 = 0;
2651
2652 /* If we got any data, disassemble it. */
2653 if (nbytes != 0)
2654 {
2655 matchedp = NULL;
2656
2657 insn = bufp[0] + bufp[1] * 256;
2658
2659 /* If we're in a case-table, don't disassemble the offsets. */
2660 if (TRACE_CASE && case_offset_counter != 0)
2661 {
2662 info->insn_type = dis_noninsn;
2663 advance += 2;
2664
2665 /* If to print data as offsets, then shortcut here. */
2666 (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
2667 case_offset + no_of_case_offsets
2668 - case_offset_counter,
2669 case_offset_counter == 1 ? "/default" :
2670 "");
2671
2672 (*info->print_address_func) ((bfd_vma)
2673 ((short) (insn)
2674 + (long) (addr
2675 - (no_of_case_offsets
2676 - case_offset_counter)
2677 * 2)), info);
2678 case_offset_counter--;
2679
2680 /* The default case start (without a "sub" or "add") must be
2681 zero. */
2682 if (case_offset_counter == 0)
2683 case_offset = 0;
2684 }
2685 else if (insn == 0)
2686 {
2687 /* We're often called to disassemble zeroes. While this is a
2688 valid "bcc .+2" insn, it is also useless enough and enough
2689 of a nuiscance that we will just output "bcc .+2" for it
2690 and signal it as a noninsn. */
2691 (*info->fprintf_func) (info->stream,
2692 disdata->distype == cris_dis_v32
2693 ? "bcc ." : "bcc .+2");
2694 info->insn_type = dis_noninsn;
2695 advance += 2;
2696 }
2697 else
2698 {
2699 const struct cris_opcode *prefix_opcodep = NULL;
2700 unsigned char *prefix_buffer = bufp;
2701 unsigned int prefix_insn = insn;
2702 int prefix_size = 0;
2703
2704 matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
2705
2706 /* Check if we're supposed to write out prefixes as address
2707 modes and if this was a prefix. */
2708 if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
2709 {
2710 /* If it's a prefix, put it into the prefix vars and get the
2711 main insn. */
2712 prefix_size = bytes_to_skip (prefix_insn, matchedp,
2713 disdata->distype, NULL);
2714 prefix_opcodep = matchedp;
2715
2716 insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
2717 matchedp = get_opcode_entry (insn, prefix_insn, disdata);
2718
2719 if (matchedp != NULL)
2720 {
2721 addr += prefix_size;
2722 bufp += prefix_size;
2723 advance += prefix_size;
2724 }
2725 else
2726 {
2727 /* The "main" insn wasn't valid, at least not when
2728 prefixed. Put back things enough to output the
2729 prefix insn only, as a normal insn. */
2730 matchedp = prefix_opcodep;
2731 insn = prefix_insn;
2732 prefix_opcodep = NULL;
2733 }
2734 }
2735
2736 if (matchedp == NULL)
2737 {
2738 (*info->fprintf_func) (info->stream, "??0x%x", insn);
2739 advance += 2;
2740
2741 info->insn_type = dis_noninsn;
2742 }
2743 else
2744 {
2745 advance
2746 += bytes_to_skip (insn, matchedp, disdata->distype,
2747 prefix_opcodep);
2748
2749 /* The info_type and assorted fields will be set according
2750 to the operands. */
2751 print_with_operands (matchedp, insn, bufp, addr, info,
2752 prefix_opcodep, prefix_insn,
2753 prefix_buffer, with_reg_prefix);
2754 }
2755 }
2756 }
2757 else
2758 info->insn_type = dis_noninsn;
2759
2760 /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
2761 status when reading that much, and the insn decoding indicated a
2762 length exceeding what we read, there is an error. */
2763 if (status != 0 && (nbytes == 0 || advance > nbytes))
2764 {
2765 (*info->memory_error_func) (status, memaddr, info);
2766 return -1;
2767 }
2768
2769 /* Max supported insn size with one folded prefix insn. */
2770 info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
2771
2772 /* I would like to set this to a fixed value larger than the actual
2773 number of bytes to print in order to avoid spaces between bytes,
2774 but objdump.c (2.9.1) does not like that, so we print 16-bit
2775 chunks, which is the next choice. */
2776 info->bytes_per_chunk = 2;
2777
2778 /* Printing bytes in order of increasing addresses makes sense,
2779 especially on a little-endian target.
2780 This is completely the opposite of what you think; setting this to
2781 BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
2782 we want. */
2783 info->display_endian = BFD_ENDIAN_BIG;
2784
2785 return advance;
2786 }
2787
2788 /* Disassemble, prefixing register names with `$'. CRIS v0..v10. */
2789 #if 0
2790 static int
2791 print_insn_cris_with_register_prefix (bfd_vma vma,
2792 disassemble_info *info)
2793 {
2794 if (info->private_data == NULL
2795 && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2796 return -1;
2797 return print_insn_cris_generic (vma, info, TRUE);
2798 }
2799 #endif
2800 /* Disassemble, prefixing register names with `$'. CRIS v32. */
2801
2802 static int
2803 print_insn_crisv32_with_register_prefix (bfd_vma vma,
2804 disassemble_info *info)
2805 {
2806 if (info->private_data == NULL
2807 && !cris_parse_disassembler_options (info, cris_dis_v32))
2808 return -1;
2809 return print_insn_cris_generic (vma, info, TRUE);
2810 }
2811
2812 #if 0
2813 /* Disassemble, prefixing register names with `$'.
2814 Common v10 and v32 subset. */
2815
2816 static int
2817 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
2818 disassemble_info *info)
2819 {
2820 if (info->private_data == NULL
2821 && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2822 return -1;
2823 return print_insn_cris_generic (vma, info, TRUE);
2824 }
2825
2826 /* Disassemble, no prefixes on register names. CRIS v0..v10. */
2827
2828 static int
2829 print_insn_cris_without_register_prefix (bfd_vma vma,
2830 disassemble_info *info)
2831 {
2832 if (info->private_data == NULL
2833 && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2834 return -1;
2835 return print_insn_cris_generic (vma, info, FALSE);
2836 }
2837
2838 /* Disassemble, no prefixes on register names. CRIS v32. */
2839
2840 static int
2841 print_insn_crisv32_without_register_prefix (bfd_vma vma,
2842 disassemble_info *info)
2843 {
2844 if (info->private_data == NULL
2845 && !cris_parse_disassembler_options (info, cris_dis_v32))
2846 return -1;
2847 return print_insn_cris_generic (vma, info, FALSE);
2848 }
2849
2850 /* Disassemble, no prefixes on register names.
2851 Common v10 and v32 subset. */
2852
2853 static int
2854 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
2855 disassemble_info *info)
2856 {
2857 if (info->private_data == NULL
2858 && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2859 return -1;
2860 return print_insn_cris_generic (vma, info, FALSE);
2861 }
2862 #endif
2863
2864 int
2865 print_insn_crisv32 (bfd_vma vma,
2866 disassemble_info *info)
2867 {
2868 return print_insn_crisv32_with_register_prefix(vma, info);
2869 }
2870
2871 /* Return a disassembler-function that prints registers with a `$' prefix,
2872 or one that prints registers without a prefix.
2873 FIXME: We should improve the solution to avoid the multitude of
2874 functions seen above. */
2875 #if 0
2876 disassembler_ftype
2877 cris_get_disassembler (bfd *abfd)
2878 {
2879 /* If there's no bfd in sight, we return what is valid as input in all
2880 contexts if fed back to the assembler: disassembly *with* register
2881 prefix. Unfortunately this will be totally wrong for v32. */
2882 if (abfd == NULL)
2883 return print_insn_cris_with_register_prefix;
2884
2885 if (bfd_get_symbol_leading_char (abfd) == 0)
2886 {
2887 if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2888 return print_insn_crisv32_with_register_prefix;
2889 if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2890 return print_insn_crisv10_v32_with_register_prefix;
2891
2892 /* We default to v10. This may be specifically specified in the
2893 bfd mach, but is also the default setting. */
2894 return print_insn_cris_with_register_prefix;
2895 }
2896
2897 if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2898 return print_insn_crisv32_without_register_prefix;
2899 if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2900 return print_insn_crisv10_v32_without_register_prefix;
2901 return print_insn_cris_without_register_prefix;
2902 }
2903 #endif
2904 /* Local variables:
2905 eval: (c-set-style "gnu")
2906 indent-tabs-mode: t
2907 End: */