Fix xen build after sys-queue renaming
[qemu] / 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, see <http://www.gnu.org/licenses/>. */
20
21 #include "dis-asm.h"
22 //#include "sysdep.h"
23 #include "target-cris/opcode-cris.h"
24 //#include "libiberty.h"
25 \f
26
27 void *qemu_malloc(size_t len); /* can't include qemu-common.h here */
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, see <http://www.gnu.org/licenses/>.  */
53
54 #ifndef NULL
55 #define NULL (0)
56 #endif
57
58 /* This table isn't used for CRISv32 and the size of immediate operands.  */
59 const struct cris_spec_reg
60 cris_spec_regs[] =
61 {
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}
121 };
122
123 /* Add version specifiers to this table when necessary.
124    The (now) regular coding of register names suggests a simpler
125    implementation.  */
126 const struct cris_support_reg cris_support_regs[] =
127 {
128   {"s0", 0},
129   {"s1", 1},
130   {"s2", 2},
131   {"s3", 3},
132   {"s4", 4},
133   {"s5", 5},
134   {"s6", 6},
135   {"s7", 7},
136   {"s8", 8},
137   {"s9", 9},
138   {"s10", 10},
139   {"s11", 11},
140   {"s12", 12},
141   {"s13", 13},
142   {"s14", 14},
143   {"s15", 15},
144   {NULL, 0}
145 };
146
147 /* All CRIS opcodes are 16 bits.
148
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
151      of that opcode.
152
153    - The args component is a string containing characters symbolically
154      matching the operands of an instruction.  Used for both assembly
155      and disassembly.
156
157      Operand-matching characters:
158      [ ] , space
159         Verbatim.
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
181         as "[pc+]" in input.
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
184         branch instructions.
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
190         character.
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
195         without side-effect.
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>.  */
207
208
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.
213
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.
217
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
220    overview.  */
221
222 const struct cris_opcode
223 cris_opcodes[] =
224 {
225   {"abs",     0x06B0, 0x0940,             "r,R",     0, SIZE_NONE,     0,
226    cris_abs_op},
227
228   {"add",     0x0600, 0x09c0,             "m r,R",   0, SIZE_NONE,     0,
229    cris_reg_mode_add_sub_cmp_and_or_move_op},
230
231   {"add",     0x0A00, 0x01c0,             "m s,R",   0, SIZE_FIELD,    0,
232    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
233
234   {"add",     0x0A00, 0x01c0,             "m S,D",   0, SIZE_NONE,
235    cris_ver_v0_10,
236    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
237
238   {"add",     0x0a00, 0x05c0,             "m S,R,r", 0, SIZE_NONE,
239    cris_ver_v0_10,
240    cris_three_operand_add_sub_cmp_and_or_op},
241
242   {"add",     0x0A00, 0x01c0,             "m s,R",   0, SIZE_FIELD,
243    cris_ver_v32p,
244    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
245
246   {"addc",    0x0570, 0x0A80,             "r,R",     0, SIZE_FIX_32,
247    cris_ver_v32p,
248    cris_not_implemented_op},
249
250   {"addc",    0x09A0, 0x0250,             "s,R",     0, SIZE_FIX_32,
251    cris_ver_v32p,
252    cris_not_implemented_op},
253
254   {"addi",    0x0540, 0x0A80,             "x,r,A",   0, SIZE_NONE,
255    cris_ver_v32p,
256    cris_addi_op},
257
258   {"addi",    0x0500, 0x0Ac0,             "x,r",     0, SIZE_NONE,     0,
259    cris_addi_op},
260
261   /* This collates after "addo", but we want to disassemble as "addoq",
262      not "addo".  */
263   {"addoq",   0x0100, 0x0E00,             "Q,A",     0, SIZE_NONE,
264    cris_ver_v32p,
265    cris_not_implemented_op},
266
267   {"addo",    0x0940, 0x0280,             "m s,R,A", 0, SIZE_FIELD_SIGNED,
268    cris_ver_v32p,
269    cris_not_implemented_op},
270
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
273      parser bug.  */
274   {"addo",   0x0100, 0x0E00,              "O,A",     0, SIZE_NONE,
275    cris_ver_v32p,
276    cris_not_implemented_op},
277
278   {"addq",    0x0200, 0x0Dc0,             "I,R",     0, SIZE_NONE,     0,
279    cris_quick_mode_add_sub_op},
280
281   {"adds",    0x0420, 0x0Bc0,             "z r,R",   0, SIZE_NONE,     0,
282    cris_reg_mode_add_sub_cmp_and_or_move_op},
283
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},
287
288   {"adds",    0x0820, 0x03c0,             "z S,D",   0, SIZE_NONE,
289    cris_ver_v0_10,
290    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
291
292   {"adds",    0x0820, 0x07c0,             "z S,R,r", 0, SIZE_NONE,
293    cris_ver_v0_10,
294    cris_three_operand_add_sub_cmp_and_or_op},
295
296   {"addu",    0x0400, 0x0be0,             "z r,R",   0, SIZE_NONE,     0,
297    cris_reg_mode_add_sub_cmp_and_or_move_op},
298
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},
302
303   {"addu",    0x0800, 0x03e0,             "z S,D",   0, SIZE_NONE,
304    cris_ver_v0_10,
305    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
306
307   {"addu",    0x0800, 0x07e0,             "z S,R,r", 0, SIZE_NONE,
308    cris_ver_v0_10,
309    cris_three_operand_add_sub_cmp_and_or_op},
310
311   {"and",     0x0700, 0x08C0,             "m r,R",   0, SIZE_NONE,     0,
312    cris_reg_mode_add_sub_cmp_and_or_move_op},
313
314   {"and",     0x0B00, 0x00C0,             "m s,R",   0, SIZE_FIELD,    0,
315    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
316
317   {"and",     0x0B00, 0x00C0,             "m S,D",   0, SIZE_NONE,
318    cris_ver_v0_10,
319    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
320
321   {"and",     0x0B00, 0x04C0,             "m S,R,r", 0, SIZE_NONE,
322    cris_ver_v0_10,
323    cris_three_operand_add_sub_cmp_and_or_op},
324
325   {"andq",    0x0300, 0x0CC0,             "i,R",     0, SIZE_NONE,     0,
326    cris_quick_mode_and_cmp_move_or_op},
327
328   {"asr",     0x0780, 0x0840,             "m r,R",   0, SIZE_NONE,     0,
329    cris_asr_op},
330
331   {"asrq",    0x03a0, 0x0c40,             "c,R",     0, SIZE_NONE,     0,
332    cris_asrq_op},
333
334   {"ax",      0x15B0, 0xEA4F,             "",        0, SIZE_NONE,     0,
335    cris_ax_ei_setf_op},
336
337   /* FIXME: Should use branch #defines.  */
338   {"b",       0x0dff, 0x0200,             "b",       1, SIZE_NONE,     0,
339    cris_sixteen_bit_offset_branch_op},
340
341   {"ba",
342    BA_QUICK_OPCODE,
343    0x0F00+(0xF-CC_A)*0x1000,              "o",       1, SIZE_NONE,     0,
344    cris_eight_bit_offset_branch_op},
345
346   /* Needs to come after the usual "ba o", which might be relaxed to
347      this one.  */
348   {"ba",     BA_DWORD_OPCODE,
349    0xffff & (~BA_DWORD_OPCODE),           "n",       0, SIZE_FIX_32,
350    cris_ver_v32p,
351    cris_none_reg_mode_jump_op},
352
353   {"bas",     0x0EBF, 0x0140,             "n,P",     0, SIZE_FIX_32,
354    cris_ver_v32p,
355    cris_none_reg_mode_jump_op},
356
357   {"basc",     0x0EFF, 0x0100,            "n,P",     0, SIZE_FIX_32,
358    cris_ver_v32p,
359    cris_none_reg_mode_jump_op},
360
361   {"bcc",
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},
365
366   {"bcs",
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},
370
371   {"bdap",
372    BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS,  "pm s,R",  0, SIZE_FIELD_SIGNED,
373    cris_ver_v0_10,
374    cris_bdap_prefix},
375
376   {"bdap",
377    BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS,  "pO",      0, SIZE_NONE,
378    cris_ver_v0_10,
379    cris_quick_mode_bdap_prefix},
380
381   {"beq",
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},
385
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
388      for v0..v10.  */
389   {"bwf",
390    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
391    0x0f00+(0xF-CC_EXT)*0x1000,            "o",       1, SIZE_NONE,
392    cris_ver_v10,
393    cris_eight_bit_offset_branch_op},
394
395   {"bext",
396    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
397    0x0f00+(0xF-CC_EXT)*0x1000,            "o",       1, SIZE_NONE,
398    cris_ver_v0_3,
399    cris_eight_bit_offset_branch_op},
400
401   {"bge",
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},
405
406   {"bgt",
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},
410
411   {"bhi",
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},
415
416   {"bhs",
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},
420
421   {"biap", BIAP_OPCODE, BIAP_Z_BITS,      "pm r,R",  0, SIZE_NONE,
422    cris_ver_v0_10,
423    cris_biap_prefix},
424
425   {"ble",
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},
429
430   {"blo",
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},
434
435   {"bls",
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},
439
440   {"blt",
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},
444
445   {"bmi",
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},
449
450   {"bmod",    0x0ab0, 0x0140,             "s,R",     0, SIZE_FIX_32,
451    cris_ver_sim_v0_10,
452    cris_not_implemented_op},
453
454   {"bmod",    0x0ab0, 0x0140,             "S,D",     0, SIZE_NONE,
455    cris_ver_sim_v0_10,
456    cris_not_implemented_op},
457
458   {"bmod",    0x0ab0, 0x0540,             "S,R,r",   0, SIZE_NONE,
459    cris_ver_sim_v0_10,
460    cris_not_implemented_op},
461
462   {"bne",
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},
466
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,
471    cris_ver_v0_10,
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,
477    cris_ver_v0_10,
478    cris_two_operand_bound_op},
479   {"bound",   0x09c0, 0x0600,             "m S,R,r", 0, SIZE_NONE,
480    cris_ver_v0_10,
481    cris_three_operand_bound_op},
482
483   {"bpl",
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},
487
488   {"break",   0xe930, 0x16c0,             "C",       0, SIZE_NONE,
489    cris_ver_v3p,
490    cris_break_op},
491
492   {"bsb",
493    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
494    0x0f00+(0xF-CC_EXT)*0x1000,            "o",       1, SIZE_NONE,
495    cris_ver_v32p,
496    cris_eight_bit_offset_branch_op},
497
498   {"bsr",     0xBEBF, 0x4140,             "n",       0, SIZE_FIX_32,
499    cris_ver_v32p,
500    cris_none_reg_mode_jump_op},
501
502   {"bsrc",     0xBEFF, 0x4100,            "n",       0, SIZE_FIX_32,
503    cris_ver_v32p,
504    cris_none_reg_mode_jump_op},
505
506   {"bstore",  0x0af0, 0x0100,             "s,R",     0, SIZE_FIX_32,
507    cris_ver_warning,
508    cris_not_implemented_op},
509
510   {"bstore",  0x0af0, 0x0100,             "S,D",     0, SIZE_NONE,
511    cris_ver_warning,
512    cris_not_implemented_op},
513
514   {"bstore",  0x0af0, 0x0500,             "S,R,r",   0, SIZE_NONE,
515    cris_ver_warning,
516    cris_not_implemented_op},
517
518   {"btst",    0x04F0, 0x0B00,             "r,R",     0, SIZE_NONE,     0,
519    cris_btst_nop_op},
520   {"btstq",   0x0380, 0x0C60,             "c,R",     0, SIZE_NONE,     0,
521    cris_btst_nop_op},
522
523   {"bvc",
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},
527
528   {"bvs",
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},
532
533   {"clear",   0x0670, 0x3980,             "M r",     0, SIZE_NONE,     0,
534    cris_reg_mode_clear_op},
535
536   {"clear",   0x0A70, 0x3180,             "M y",     0, SIZE_NONE,     0,
537    cris_none_reg_mode_clear_test_op},
538
539   {"clear",   0x0A70, 0x3180,             "M S",     0, SIZE_NONE,
540    cris_ver_v0_10,
541    cris_none_reg_mode_clear_test_op},
542
543   {"clearf",  0x05F0, 0x0A00,             "f",       0, SIZE_NONE,     0,
544    cris_clearf_di_op},
545
546   {"cmp",     0x06C0, 0x0900,             "m r,R",   0, SIZE_NONE,     0,
547    cris_reg_mode_add_sub_cmp_and_or_move_op},
548
549   {"cmp",     0x0Ac0, 0x0100,             "m s,R",   0, SIZE_FIELD,    0,
550    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
551
552   {"cmp",     0x0Ac0, 0x0100,             "m S,D",   0, SIZE_NONE,
553    cris_ver_v0_10,
554    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
555
556   {"cmpq",    0x02C0, 0x0D00,             "i,R",     0, SIZE_NONE,     0,
557    cris_quick_mode_and_cmp_move_or_op},
558
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},
562
563   {"cmps",    0x08e0, 0x0300,             "z S,D",   0, SIZE_NONE,
564    cris_ver_v0_10,
565    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
566
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},
570
571   {"cmpu",    0x08c0, 0x0320,             "z S,D",   0, SIZE_NONE,
572    cris_ver_v0_10,
573    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
574
575   {"di",      0x25F0, 0xDA0F,             "",        0, SIZE_NONE,     0,
576    cris_clearf_di_op},
577
578   {"dip",     DIP_OPCODE, DIP_Z_BITS,     "ps",      0, SIZE_FIX_32,
579    cris_ver_v0_10,
580    cris_dip_prefix},
581
582   {"div",     0x0980, 0x0640,             "m R,r",   0, SIZE_FIELD,    0,
583    cris_not_implemented_op},
584
585   {"dstep",   0x06f0, 0x0900,             "r,R",     0, SIZE_NONE,     0,
586    cris_dstep_logshift_mstep_neg_not_op},
587
588   {"ei",      0x25B0, 0xDA4F,             "",        0, SIZE_NONE,     0,
589    cris_ax_ei_setf_op},
590
591   {"fidxd",    0x0ab0, 0xf540,            "[r]",     0, SIZE_NONE,
592    cris_ver_v32p,
593    cris_not_implemented_op},
594
595   {"fidxi",    0x0d30, 0xF2C0,            "[r]",     0, SIZE_NONE,
596    cris_ver_v32p,
597    cris_not_implemented_op},
598
599   {"ftagd",    0x1AB0, 0xE540,            "[r]",     0, SIZE_NONE,
600    cris_ver_v32p,
601    cris_not_implemented_op},
602
603   {"ftagi",    0x1D30, 0xE2C0,            "[r]",     0, SIZE_NONE,
604    cris_ver_v32p,
605    cris_not_implemented_op},
606
607   {"halt",    0xF930, 0x06CF,             "",        0, SIZE_NONE,
608    cris_ver_v32p,
609    cris_not_implemented_op},
610
611   {"jas",    0x09B0, 0x0640,              "r,P",     0, SIZE_NONE,
612    cris_ver_v32p,
613    cris_reg_mode_jump_op},
614
615   {"jas",    0x0DBF, 0x0240,              "N,P",     0, SIZE_FIX_32,
616    cris_ver_v32p,
617    cris_reg_mode_jump_op},
618
619   {"jasc",    0x0B30, 0x04C0,             "r,P",     0, SIZE_NONE,
620    cris_ver_v32p,
621    cris_reg_mode_jump_op},
622
623   {"jasc",    0x0F3F, 0x00C0,             "N,P",     0, SIZE_FIX_32,
624    cris_ver_v32p,
625    cris_reg_mode_jump_op},
626
627   {"jbrc",    0x69b0, 0x9640,             "r",       0, SIZE_NONE,
628    cris_ver_v8_10,
629    cris_reg_mode_jump_op},
630
631   {"jbrc",    0x6930, 0x92c0,             "s",       0, SIZE_FIX_32,
632    cris_ver_v8_10,
633    cris_none_reg_mode_jump_op},
634
635   {"jbrc",    0x6930, 0x92c0,             "S",       0, SIZE_NONE,
636    cris_ver_v8_10,
637    cris_none_reg_mode_jump_op},
638
639   {"jir",     0xA9b0, 0x5640,             "r",       0, SIZE_NONE,
640    cris_ver_v8_10,
641    cris_reg_mode_jump_op},
642
643   {"jir",     0xA930, 0x52c0,             "s",       0, SIZE_FIX_32,
644    cris_ver_v8_10,
645    cris_none_reg_mode_jump_op},
646
647   {"jir",     0xA930, 0x52c0,             "S",       0, SIZE_NONE,
648    cris_ver_v8_10,
649    cris_none_reg_mode_jump_op},
650
651   {"jirc",    0x29b0, 0xd640,             "r",       0, SIZE_NONE,
652    cris_ver_v8_10,
653    cris_reg_mode_jump_op},
654
655   {"jirc",    0x2930, 0xd2c0,             "s",       0, SIZE_FIX_32,
656    cris_ver_v8_10,
657    cris_none_reg_mode_jump_op},
658
659   {"jirc",    0x2930, 0xd2c0,             "S",       0, SIZE_NONE,
660    cris_ver_v8_10,
661    cris_none_reg_mode_jump_op},
662
663   {"jsr",     0xB9b0, 0x4640,             "r",       0, SIZE_NONE,     0,
664    cris_reg_mode_jump_op},
665
666   {"jsr",     0xB930, 0x42c0,             "s",       0, SIZE_FIX_32,
667    cris_ver_v0_10,
668    cris_none_reg_mode_jump_op},
669
670   {"jsr",     0xBDBF, 0x4240,             "N",       0, SIZE_FIX_32,
671    cris_ver_v32p,
672    cris_none_reg_mode_jump_op},
673
674   {"jsr",     0xB930, 0x42c0,             "S",       0, SIZE_NONE,
675    cris_ver_v0_10,
676    cris_none_reg_mode_jump_op},
677
678   {"jsrc",    0x39b0, 0xc640,             "r",       0, SIZE_NONE,
679    cris_ver_v8_10,
680    cris_reg_mode_jump_op},
681
682   {"jsrc",    0x3930, 0xc2c0,             "s",       0, SIZE_FIX_32,
683    cris_ver_v8_10,
684    cris_none_reg_mode_jump_op},
685
686   {"jsrc",    0x3930, 0xc2c0,             "S",       0, SIZE_NONE,
687    cris_ver_v8_10,
688    cris_none_reg_mode_jump_op},
689
690   {"jsrc",    0xBB30, 0x44C0,             "r",       0, SIZE_NONE,
691    cris_ver_v32p,
692    cris_reg_mode_jump_op},
693
694   {"jsrc",    0xBF3F, 0x40C0,             "N",       0, SIZE_FIX_32,
695    cris_ver_v32p,
696    cris_reg_mode_jump_op},
697
698   {"jump",    0x09b0, 0xF640,             "r",       0, SIZE_NONE,     0,
699    cris_reg_mode_jump_op},
700
701   {"jump",
702    JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "s",       0, SIZE_FIX_32,
703    cris_ver_v0_10,
704    cris_none_reg_mode_jump_op},
705
706   {"jump",
707    JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "S",       0, SIZE_NONE,
708    cris_ver_v0_10,
709    cris_none_reg_mode_jump_op},
710
711   {"jump",    0x09F0, 0x060F,             "P",       0, SIZE_NONE,
712    cris_ver_v32p,
713    cris_none_reg_mode_jump_op},
714
715   {"jump",
716    JUMP_PC_INCR_OPCODE_V32,
717    (0xffff & ~JUMP_PC_INCR_OPCODE_V32),   "N",       0, SIZE_FIX_32,
718    cris_ver_v32p,
719    cris_none_reg_mode_jump_op},
720
721   {"jmpu",    0x8930, 0x72c0,             "s",       0, SIZE_FIX_32,
722    cris_ver_v10,
723    cris_none_reg_mode_jump_op},
724
725   {"jmpu",    0x8930, 0x72c0,              "S",      0, SIZE_NONE,
726    cris_ver_v10,
727    cris_none_reg_mode_jump_op},
728
729   {"lapc",    0x0970, 0x0680,             "U,R",    0, SIZE_NONE,
730    cris_ver_v32p,
731    cris_not_implemented_op},
732
733   {"lapc",    0x0D7F, 0x0280,             "dn,R",    0, SIZE_FIX_32,
734    cris_ver_v32p,
735    cris_not_implemented_op},
736
737   {"lapcq",   0x0970, 0x0680,             "u,R",     0, SIZE_NONE,
738    cris_ver_v32p,
739    cris_addi_op},
740
741   {"lsl",     0x04C0, 0x0B00,             "m r,R",   0, SIZE_NONE,     0,
742    cris_dstep_logshift_mstep_neg_not_op},
743
744   {"lslq",    0x03c0, 0x0C20,             "c,R",     0, SIZE_NONE,     0,
745    cris_dstep_logshift_mstep_neg_not_op},
746
747   {"lsr",     0x07C0, 0x0800,             "m r,R",   0, SIZE_NONE,     0,
748    cris_dstep_logshift_mstep_neg_not_op},
749
750   {"lsrq",    0x03e0, 0x0C00,             "c,R",     0, SIZE_NONE,     0,
751    cris_dstep_logshift_mstep_neg_not_op},
752
753   {"lz",      0x0730, 0x08C0,             "r,R",     0, SIZE_NONE,
754    cris_ver_v3p,
755    cris_not_implemented_op},
756
757   {"mcp",      0x07f0, 0x0800,            "P,r",     0, SIZE_NONE,
758    cris_ver_v32p,
759    cris_not_implemented_op},
760
761   {"move",    0x0640, 0x0980,             "m r,R",   0, SIZE_NONE,     0,
762    cris_reg_mode_add_sub_cmp_and_or_move_op},
763
764   {"move",    0x0A40, 0x0180,             "m s,R",   0, SIZE_FIELD,    0,
765    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
766
767   {"move",    0x0A40, 0x0180,             "m S,D",   0, SIZE_NONE,
768    cris_ver_v0_10,
769    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
770
771   {"move",    0x0630, 0x09c0,             "r,P",     0, SIZE_NONE,     0,
772    cris_move_to_preg_op},
773
774   {"move",    0x0670, 0x0980,             "P,r",     0, SIZE_NONE,     0,
775    cris_reg_mode_move_from_preg_op},
776
777   {"move",    0x0BC0, 0x0000,             "m R,y",   0, SIZE_FIELD,    0,
778    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
779
780   {"move",    0x0BC0, 0x0000,             "m D,S",   0, SIZE_NONE,
781    cris_ver_v0_10,
782    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
783
784   {"move",
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},
788
789   {"move",    0x0A30, 0x01c0,             "S,P",     0, SIZE_NONE,
790    cris_ver_v0_10,
791    cris_move_to_preg_op},
792
793   {"move",    0x0A70, 0x0180,             "P,y",     0, SIZE_SPEC_REG, 0,
794    cris_none_reg_mode_move_from_preg_op},
795
796   {"move",    0x0A70, 0x0180,             "P,S",     0, SIZE_NONE,
797    cris_ver_v0_10,
798    cris_none_reg_mode_move_from_preg_op},
799
800   {"move",    0x0B70, 0x0480,             "r,T",     0, SIZE_NONE,
801    cris_ver_v32p,
802    cris_not_implemented_op},
803
804   {"move",    0x0F70, 0x0080,             "T,r",     0, SIZE_NONE,
805    cris_ver_v32p,
806    cris_not_implemented_op},
807
808   {"movem",   0x0BF0, 0x0000,             "R,y",     0, SIZE_FIX_32,   0,
809    cris_move_reg_to_mem_movem_op},
810
811   {"movem",   0x0BF0, 0x0000,             "D,S",     0, SIZE_NONE,
812    cris_ver_v0_10,
813    cris_move_reg_to_mem_movem_op},
814
815   {"movem",   0x0BB0, 0x0040,             "s,R",     0, SIZE_FIX_32,   0,
816    cris_move_mem_to_reg_movem_op},
817
818   {"movem",   0x0BB0, 0x0040,             "S,D",     0, SIZE_NONE,
819    cris_ver_v0_10,
820    cris_move_mem_to_reg_movem_op},
821
822   {"moveq",   0x0240, 0x0D80,             "i,R",     0, SIZE_NONE,     0,
823    cris_quick_mode_and_cmp_move_or_op},
824
825   {"movs",    0x0460, 0x0B80,             "z r,R",   0, SIZE_NONE,     0,
826    cris_reg_mode_add_sub_cmp_and_or_move_op},
827
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},
831
832   {"movs",    0x0860, 0x0380,             "z S,D",   0, SIZE_NONE,
833    cris_ver_v0_10,
834    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
835
836   {"movu",    0x0440, 0x0Ba0,             "z r,R",   0, SIZE_NONE,     0,
837    cris_reg_mode_add_sub_cmp_and_or_move_op},
838
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},
842
843   {"movu",    0x0840, 0x03a0,             "z S,D",   0, SIZE_NONE,
844    cris_ver_v0_10,
845    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
846
847   {"mstep",   0x07f0, 0x0800,             "r,R",     0, SIZE_NONE,
848    cris_ver_v0_10,
849    cris_dstep_logshift_mstep_neg_not_op},
850
851   {"muls",    0x0d00, 0x02c0,             "m r,R",   0, SIZE_NONE,
852    cris_ver_v10p,
853    cris_muls_op},
854
855   {"mulu",    0x0900, 0x06c0,             "m r,R",   0, SIZE_NONE,
856    cris_ver_v10p,
857    cris_mulu_op},
858
859   {"neg",     0x0580, 0x0A40,             "m r,R",   0, SIZE_NONE,     0,
860    cris_dstep_logshift_mstep_neg_not_op},
861
862   {"nop",     NOP_OPCODE, NOP_Z_BITS,     "",        0, SIZE_NONE,
863    cris_ver_v0_10,
864    cris_btst_nop_op},
865
866   {"nop",     NOP_OPCODE_V32, NOP_Z_BITS_V32, "",    0, SIZE_NONE,
867    cris_ver_v32p,
868    cris_btst_nop_op},
869
870   {"not",     0x8770, 0x7880,             "r",       0, SIZE_NONE,     0,
871    cris_dstep_logshift_mstep_neg_not_op},
872
873   {"or",      0x0740, 0x0880,             "m r,R",   0, SIZE_NONE,     0,
874    cris_reg_mode_add_sub_cmp_and_or_move_op},
875
876   {"or",      0x0B40, 0x0080,             "m s,R",   0, SIZE_FIELD,    0,
877    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
878
879   {"or",      0x0B40, 0x0080,             "m S,D",   0, SIZE_NONE,
880    cris_ver_v0_10,
881    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
882
883   {"or",      0x0B40, 0x0480,             "m S,R,r", 0, SIZE_NONE,
884    cris_ver_v0_10,
885    cris_three_operand_add_sub_cmp_and_or_op},
886
887   {"orq",     0x0340, 0x0C80,             "i,R",     0, SIZE_NONE,     0,
888    cris_quick_mode_and_cmp_move_or_op},
889
890   {"pop",     0x0E6E, 0x0191,             "!R",      0, SIZE_NONE,
891    cris_ver_v0_10,
892    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
893
894   {"pop",     0x0e3e, 0x01c1,             "!P",      0, SIZE_NONE,
895    cris_ver_v0_10,
896    cris_none_reg_mode_move_from_preg_op},
897
898   {"push",    0x0FEE, 0x0011,             "BR",      0, SIZE_NONE,
899    cris_ver_v0_10,
900    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
901
902   {"push",    0x0E7E, 0x0181,             "BP",      0, SIZE_NONE,
903    cris_ver_v0_10,
904    cris_move_to_preg_op},
905
906   {"rbf",     0x3b30, 0xc0c0,             "y",       0, SIZE_NONE,
907    cris_ver_v10,
908    cris_not_implemented_op},
909
910   {"rbf",     0x3b30, 0xc0c0,             "S",       0, SIZE_NONE,
911    cris_ver_v10,
912    cris_not_implemented_op},
913
914   {"rfe",     0x2930, 0xD6CF,             "",        0, SIZE_NONE,
915    cris_ver_v32p,
916    cris_not_implemented_op},
917
918   {"rfg",     0x4930, 0xB6CF,             "",        0, SIZE_NONE,
919    cris_ver_v32p,
920    cris_not_implemented_op},
921
922   {"rfn",     0x5930, 0xA6CF,             "",        0, SIZE_NONE,
923    cris_ver_v32p,
924    cris_not_implemented_op},
925
926   {"ret",     0xB67F, 0x4980,             "",        1, SIZE_NONE,
927    cris_ver_v0_10,
928    cris_reg_mode_move_from_preg_op},
929
930   {"ret",     0xB9F0, 0x460F,             "",        1, SIZE_NONE,
931    cris_ver_v32p,
932    cris_reg_mode_move_from_preg_op},
933
934   {"retb",    0xe67f, 0x1980,             "",        1, SIZE_NONE,
935    cris_ver_v0_10,
936    cris_reg_mode_move_from_preg_op},
937
938   {"rete",     0xA9F0, 0x560F,            "",        1, SIZE_NONE,
939    cris_ver_v32p,
940    cris_reg_mode_move_from_preg_op},
941
942   {"reti",    0xA67F, 0x5980,             "",        1, SIZE_NONE,
943    cris_ver_v0_10,
944    cris_reg_mode_move_from_preg_op},
945
946   {"retn",     0xC9F0, 0x360F,            "",        1, SIZE_NONE,
947    cris_ver_v32p,
948    cris_reg_mode_move_from_preg_op},
949
950   {"sbfs",    0x3b70, 0xc080,             "y",       0, SIZE_NONE,
951    cris_ver_v10,
952    cris_not_implemented_op},
953
954   {"sbfs",    0x3b70, 0xc080,             "S",       0, SIZE_NONE,
955    cris_ver_v10,
956    cris_not_implemented_op},
957
958   {"sa",
959    0x0530+CC_A*0x1000,
960    0x0AC0+(0xf-CC_A)*0x1000,              "r",       0, SIZE_NONE,     0,
961    cris_scc_op},
962
963   {"ssb",
964    0x0530+CC_EXT*0x1000,
965    0x0AC0+(0xf-CC_EXT)*0x1000,            "r",       0, SIZE_NONE,
966    cris_ver_v32p,
967    cris_scc_op},
968
969   {"scc",
970    0x0530+CC_CC*0x1000,
971    0x0AC0+(0xf-CC_CC)*0x1000,             "r",       0, SIZE_NONE,     0,
972    cris_scc_op},
973
974   {"scs",
975    0x0530+CC_CS*0x1000,
976    0x0AC0+(0xf-CC_CS)*0x1000,             "r",       0, SIZE_NONE,     0,
977    cris_scc_op},
978
979   {"seq",
980    0x0530+CC_EQ*0x1000,
981    0x0AC0+(0xf-CC_EQ)*0x1000,             "r",       0, SIZE_NONE,     0,
982    cris_scc_op},
983
984   {"setf",    0x05b0, 0x0A40,             "f",       0, SIZE_NONE,     0,
985    cris_ax_ei_setf_op},
986
987   {"sfe",    0x3930, 0xC6CF,              "",        0, SIZE_NONE,
988    cris_ver_v32p,
989    cris_not_implemented_op},
990
991   /* Need to have "swf" in front of "sext" so it is the one displayed in
992      disassembly.  */
993   {"swf",
994    0x0530+CC_EXT*0x1000,
995    0x0AC0+(0xf-CC_EXT)*0x1000,            "r",       0, SIZE_NONE,
996    cris_ver_v10,
997    cris_scc_op},
998
999   {"sext",
1000    0x0530+CC_EXT*0x1000,
1001    0x0AC0+(0xf-CC_EXT)*0x1000,            "r",       0, SIZE_NONE,
1002    cris_ver_v0_3,
1003    cris_scc_op},
1004
1005   {"sge",
1006    0x0530+CC_GE*0x1000,
1007    0x0AC0+(0xf-CC_GE)*0x1000,             "r",       0, SIZE_NONE,     0,
1008    cris_scc_op},
1009
1010   {"sgt",
1011    0x0530+CC_GT*0x1000,
1012    0x0AC0+(0xf-CC_GT)*0x1000,             "r",       0, SIZE_NONE,     0,
1013    cris_scc_op},
1014
1015   {"shi",
1016    0x0530+CC_HI*0x1000,
1017    0x0AC0+(0xf-CC_HI)*0x1000,             "r",       0, SIZE_NONE,     0,
1018    cris_scc_op},
1019
1020   {"shs",
1021    0x0530+CC_HS*0x1000,
1022    0x0AC0+(0xf-CC_HS)*0x1000,             "r",       0, SIZE_NONE,     0,
1023    cris_scc_op},
1024
1025   {"sle",
1026    0x0530+CC_LE*0x1000,
1027    0x0AC0+(0xf-CC_LE)*0x1000,             "r",       0, SIZE_NONE,     0,
1028    cris_scc_op},
1029
1030   {"slo",
1031    0x0530+CC_LO*0x1000,
1032    0x0AC0+(0xf-CC_LO)*0x1000,             "r",       0, SIZE_NONE,     0,
1033    cris_scc_op},
1034
1035   {"sls",
1036    0x0530+CC_LS*0x1000,
1037    0x0AC0+(0xf-CC_LS)*0x1000,             "r",       0, SIZE_NONE,     0,
1038    cris_scc_op},
1039
1040   {"slt",
1041    0x0530+CC_LT*0x1000,
1042    0x0AC0+(0xf-CC_LT)*0x1000,             "r",       0, SIZE_NONE,     0,
1043    cris_scc_op},
1044
1045   {"smi",
1046    0x0530+CC_MI*0x1000,
1047    0x0AC0+(0xf-CC_MI)*0x1000,             "r",       0, SIZE_NONE,     0,
1048    cris_scc_op},
1049
1050   {"sne",
1051    0x0530+CC_NE*0x1000,
1052    0x0AC0+(0xf-CC_NE)*0x1000,             "r",       0, SIZE_NONE,     0,
1053    cris_scc_op},
1054
1055   {"spl",
1056    0x0530+CC_PL*0x1000,
1057    0x0AC0+(0xf-CC_PL)*0x1000,             "r",       0, SIZE_NONE,     0,
1058    cris_scc_op},
1059
1060   {"sub",     0x0680, 0x0940,             "m r,R",   0, SIZE_NONE,     0,
1061    cris_reg_mode_add_sub_cmp_and_or_move_op},
1062
1063   {"sub",     0x0a80, 0x0140,             "m s,R",   0, SIZE_FIELD,    0,
1064    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1065
1066   {"sub",     0x0a80, 0x0140,             "m S,D",   0, SIZE_NONE,
1067    cris_ver_v0_10,
1068    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1069
1070   {"sub",     0x0a80, 0x0540,             "m S,R,r", 0, SIZE_NONE,
1071    cris_ver_v0_10,
1072    cris_three_operand_add_sub_cmp_and_or_op},
1073
1074   {"subq",    0x0280, 0x0d40,             "I,R",     0, SIZE_NONE,     0,
1075    cris_quick_mode_add_sub_op},
1076
1077   {"subs",    0x04a0, 0x0b40,             "z r,R",   0, SIZE_NONE,     0,
1078    cris_reg_mode_add_sub_cmp_and_or_move_op},
1079
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},
1083
1084   {"subs",    0x08a0, 0x0340,             "z S,D",   0, SIZE_NONE,
1085    cris_ver_v0_10,
1086    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1087
1088   {"subs",    0x08a0, 0x0740,             "z S,R,r", 0, SIZE_NONE,
1089    cris_ver_v0_10,
1090    cris_three_operand_add_sub_cmp_and_or_op},
1091
1092   {"subu",    0x0480, 0x0b60,             "z r,R",   0, SIZE_NONE,     0,
1093    cris_reg_mode_add_sub_cmp_and_or_move_op},
1094
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},
1098
1099   {"subu",    0x0880, 0x0360,             "z S,D",   0, SIZE_NONE,
1100    cris_ver_v0_10,
1101    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1102
1103   {"subu",    0x0880, 0x0760,             "z S,R,r", 0, SIZE_NONE,
1104    cris_ver_v0_10,
1105    cris_three_operand_add_sub_cmp_and_or_op},
1106
1107   {"svc",
1108    0x0530+CC_VC*0x1000,
1109    0x0AC0+(0xf-CC_VC)*0x1000,             "r",       0, SIZE_NONE,     0,
1110    cris_scc_op},
1111
1112   {"svs",
1113    0x0530+CC_VS*0x1000,
1114    0x0AC0+(0xf-CC_VS)*0x1000,             "r",       0, SIZE_NONE,     0,
1115    cris_scc_op},
1116
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,
1121    cris_ver_v8p,
1122    cris_not_implemented_op},
1123
1124   {"swapw",   0x4770, 0xb880,             "r",       0, SIZE_NONE,
1125    cris_ver_v8p,
1126    cris_not_implemented_op},
1127
1128   {"swapnw",  0xc770, 0x3880,             "r",       0, SIZE_NONE,
1129    cris_ver_v8p,
1130    cris_not_implemented_op},
1131
1132   {"swapb",   0x2770, 0xd880,             "r",       0, SIZE_NONE,
1133    cris_ver_v8p,
1134    cris_not_implemented_op},
1135
1136   {"swapnb",  0xA770, 0x5880,             "r",       0, SIZE_NONE,
1137    cris_ver_v8p,
1138    cris_not_implemented_op},
1139
1140   {"swapwb",  0x6770, 0x9880,             "r",       0, SIZE_NONE,
1141    cris_ver_v8p,
1142    cris_not_implemented_op},
1143
1144   {"swapnwb", 0xE770, 0x1880,             "r",       0, SIZE_NONE,
1145    cris_ver_v8p,
1146    cris_not_implemented_op},
1147
1148   {"swapr",   0x1770, 0xe880,             "r",       0, SIZE_NONE,
1149    cris_ver_v8p,
1150    cris_not_implemented_op},
1151
1152   {"swapnr",  0x9770, 0x6880,             "r",       0, SIZE_NONE,
1153    cris_ver_v8p,
1154    cris_not_implemented_op},
1155
1156   {"swapwr",  0x5770, 0xa880,             "r",       0, SIZE_NONE,
1157    cris_ver_v8p,
1158    cris_not_implemented_op},
1159
1160   {"swapnwr", 0xd770, 0x2880,             "r",       0, SIZE_NONE,
1161    cris_ver_v8p,
1162    cris_not_implemented_op},
1163
1164   {"swapbr",  0x3770, 0xc880,             "r",       0, SIZE_NONE,
1165    cris_ver_v8p,
1166    cris_not_implemented_op},
1167
1168   {"swapnbr", 0xb770, 0x4880,             "r",       0, SIZE_NONE,
1169    cris_ver_v8p,
1170    cris_not_implemented_op},
1171
1172   {"swapwbr", 0x7770, 0x8880,             "r",       0, SIZE_NONE,
1173    cris_ver_v8p,
1174    cris_not_implemented_op},
1175
1176   {"swapnwbr", 0xf770, 0x0880,            "r",       0, SIZE_NONE,
1177    cris_ver_v8p,
1178    cris_not_implemented_op},
1179
1180   {"test",    0x0640, 0x0980,             "m D",     0, SIZE_NONE,
1181    cris_ver_v0_10,
1182    cris_reg_mode_test_op},
1183
1184   {"test",    0x0b80, 0xf040,             "m y",     0, SIZE_FIELD,    0,
1185    cris_none_reg_mode_clear_test_op},
1186
1187   {"test",    0x0b80, 0xf040,             "m S",     0, SIZE_NONE,
1188    cris_ver_v0_10,
1189    cris_none_reg_mode_clear_test_op},
1190
1191   {"xor",     0x07B0, 0x0840,             "r,R",     0, SIZE_NONE,     0,
1192    cris_xor_op},
1193
1194   {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
1195 };
1196
1197 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
1198 const char * const
1199 cris_cc_strings[] =
1200 {
1201   "hs",
1202   "lo",
1203   "ne",
1204   "eq",
1205   "vc",
1206   "vs",
1207   "pl",
1208   "mi",
1209   "ls",
1210   "hi",
1211   "ge",
1212   "lt",
1213   "gt",
1214   "le",
1215   "a",
1216   /* This is a placeholder.  In v0, this would be "ext".  In v32, this
1217      is "sb".  See cris_conds15.  */
1218   "wf"
1219 };
1220
1221 /* Different names and semantics for condition 1111 (0xf).  */
1222 const struct cris_cond15 cris_cond15s[] =
1223 {
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},
1228   {NULL, 0}
1229 };
1230
1231
1232 /*
1233  * Local variables:
1234  * eval: (c-set-style "gnu")
1235  * indent-tabs-mode: t
1236  * End:
1237  */
1238
1239
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
1245 #endif
1246
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
1251 #endif
1252
1253 /* Sometimes we prefix all registers with this character.  */
1254 #define REGISTER_PREFIX_CHAR '$'
1255
1256 /* Whether or not to trace the following sequence:
1257    sub* X,r%d
1258    bound* Y,r%d
1259    adds.w [pc+r%d.w],pc
1260
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).
1265
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.
1271
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.
1275
1276    FIXME: Make this optional later.  */
1277 #ifndef TRACE_CASE
1278 #define TRACE_CASE (disdata->trace_case)
1279 #endif
1280
1281 enum cris_disass_family
1282  { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
1283
1284 /* Stored in the disasm_info->private_data member.  */
1285 struct cris_disasm_data
1286 {
1287   /* Whether to print something less confusing if we find something
1288      matching a switch-construct.  */
1289   bfd_boolean trace_case;
1290
1291   /* Whether this code is flagged as crisv32.  FIXME: Should be an enum
1292      that includes "compatible".  */
1293   enum cris_disass_family distype;
1294 };
1295
1296 /* Value of first element in switch.  */
1297 static long case_offset = 0;
1298
1299 /* How many more case-offsets to print.  */
1300 static long case_offset_counter = 0;
1301
1302 /* Number of case offsets.  */
1303 static long no_of_case_offsets = 0;
1304
1305 /* Candidate for next case_offset.  */
1306 static long last_immediate = 0;
1307
1308 static int cris_constraint
1309   (const char *, unsigned, unsigned, struct cris_disasm_data *);
1310
1311 /* Parse disassembler options and store state in info.  FIXME: For the
1312    time being, we abuse static variables.  */
1313
1314 static bfd_boolean
1315 cris_parse_disassembler_options (disassemble_info *info,
1316                                  enum cris_disass_family distype)
1317 {
1318   struct cris_disasm_data *disdata;
1319
1320   info->private_data = calloc (1, sizeof (struct cris_disasm_data));
1321   disdata = (struct cris_disasm_data *) info->private_data;
1322   if (disdata == NULL)
1323     return FALSE;
1324
1325   /* Default true.  */
1326   disdata->trace_case
1327     = (info->disassembler_options == NULL
1328        || (strcmp (info->disassembler_options, "nocase") != 0));
1329
1330   disdata->distype = distype;
1331   return TRUE;
1332 }
1333
1334 static const struct cris_spec_reg *
1335 spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
1336 {
1337   int i;
1338
1339   for (i = 0; cris_spec_regs[i].name != NULL; i++)
1340     {
1341       if (cris_spec_regs[i].number == sreg)
1342         {
1343           if (distype == cris_dis_v32)
1344             switch (cris_spec_regs[i].applicable_version)
1345               {
1346               case cris_ver_warning:
1347               case cris_ver_version_all:
1348               case cris_ver_v3p:
1349               case cris_ver_v8p:
1350               case cris_ver_v10p:
1351               case cris_ver_v32p:
1352                 /* No ambiguous sizes or register names with CRISv32.  */
1353                 if (cris_spec_regs[i].warning == NULL)
1354                   return &cris_spec_regs[i];
1355               default:
1356                 ;
1357               }
1358           else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
1359             return &cris_spec_regs[i];
1360         }
1361     }
1362
1363   return NULL;
1364 }
1365
1366 /* Return the number of bits in the argument.  */
1367
1368 static int
1369 number_of_bits (unsigned int val)
1370 {
1371   int bits;
1372
1373   for (bits = 0; val != 0; val &= val - 1)
1374     bits++;
1375
1376   return bits;
1377 }
1378
1379 /* Get an entry in the opcode-table.  */
1380
1381 static const struct cris_opcode *
1382 get_opcode_entry (unsigned int insn,
1383                   unsigned int prefix_insn,
1384                   struct cris_disasm_data *disdata)
1385 {
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;
1389
1390   const struct cris_opcode *max_matchedp = NULL;
1391   const struct cris_opcode **prefix_opc_table = NULL;
1392
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;
1399
1400   /* Allocate and clear the opcode-table.  */
1401   if (opc_table == NULL)
1402     {
1403       opc_table = qemu_malloc (65536 * sizeof (opc_table[0]));
1404
1405       memset (opc_table, 0, 65536 * sizeof (const struct cris_opcode *));
1406
1407       dip_prefixes
1408         = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
1409
1410       memset (dip_prefixes, 0, 65536 * sizeof (dip_prefixes[0]));
1411
1412       bdapq_m1_prefixes
1413         = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
1414
1415       memset (bdapq_m1_prefixes, 0, 65536 * sizeof (bdapq_m1_prefixes[0]));
1416
1417       bdapq_m2_prefixes
1418         = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
1419
1420       memset (bdapq_m2_prefixes, 0, 65536 * sizeof (bdapq_m2_prefixes[0]));
1421
1422       bdapq_m4_prefixes
1423         = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
1424
1425       memset (bdapq_m4_prefixes, 0, 65536 * sizeof (bdapq_m4_prefixes[0]));
1426
1427       rest_prefixes
1428         = qemu_malloc (65536 * sizeof (const struct cris_opcode **));
1429
1430       memset (rest_prefixes, 0, 65536 * sizeof (rest_prefixes[0]));
1431     }
1432
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)
1440     {
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));
1445
1446       if (popcodep == NULL)
1447         return NULL;
1448
1449       if (popcodep->match == BDAP_QUICK_OPCODE)
1450         {
1451           /* Since some offsets are recognized with "push" macros, we
1452              have to have different tables for them.  */
1453           int offset = (prefix_insn & 255);
1454
1455           if (offset > 127)
1456             offset -= 256;
1457
1458           switch (offset)
1459             {
1460             case -4:
1461               prefix_opc_table = bdapq_m4_prefixes;
1462               break;
1463
1464             case -2:
1465               prefix_opc_table = bdapq_m2_prefixes;
1466               break;
1467
1468             case -1:
1469               prefix_opc_table = bdapq_m1_prefixes;
1470               break;
1471
1472             default:
1473               prefix_opc_table = rest_prefixes;
1474               break;
1475             }
1476         }
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;
1481       else
1482         prefix_opc_table = rest_prefixes;
1483     }
1484
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];
1490   else
1491     {
1492       const struct cris_opcode *opcodep;
1493       int max_level_of_match = -1;
1494
1495       for (opcodep = cris_opcodes;
1496            opcodep->name != NULL;
1497            opcodep++)
1498         {
1499           int level_of_match;
1500
1501           if (disdata->distype == cris_dis_v32)
1502             {
1503               switch (opcodep->applicable_version)
1504                 {
1505                 case cris_ver_version_all:
1506                   break;
1507
1508                 case cris_ver_v0_3:
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:
1513                 case cris_ver_v10:
1514                 case cris_ver_warning:
1515                   continue;
1516
1517                 case cris_ver_v3p:
1518                 case cris_ver_v8p:
1519                 case cris_ver_v10p:
1520                 case cris_ver_v32p:
1521                   break;
1522
1523                 case cris_ver_v8:
1524                   abort ();
1525                 default:
1526                   abort ();
1527                 }
1528             }
1529           else
1530             {
1531               switch (opcodep->applicable_version)
1532                 {
1533                 case cris_ver_version_all:
1534                 case cris_ver_v0_3:
1535                 case cris_ver_v3p:
1536                 case cris_ver_v0_10:
1537                 case cris_ver_v8p:
1538                 case cris_ver_v8_10:
1539                 case cris_ver_v10:
1540                 case cris_ver_sim_v0_10:
1541                 case cris_ver_v10p:
1542                 case cris_ver_warning:
1543                   break;
1544
1545                 case cris_ver_v32p:
1546                   continue;
1547
1548                 case cris_ver_v8:
1549                   abort ();
1550                 default:
1551                   abort ();
1552                 }
1553             }
1554
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
1560              formula.  */
1561           if ((opcodep->match & insn) == opcodep->match
1562               && (opcodep->lose & insn) == 0
1563               && ((level_of_match
1564                    = cris_constraint (opcodep->args,
1565                                       insn,
1566                                       prefix_insn,
1567                                       disdata))
1568                   >= 0)
1569               && ((level_of_match
1570                    += 2 * number_of_bits (opcodep->match
1571                                           | opcodep->lose))
1572                           > max_level_of_match))
1573                     {
1574                       max_matchedp = opcodep;
1575                       max_level_of_match = level_of_match;
1576
1577                       /* If there was a full match, never mind looking
1578                          further.  */
1579                       if (level_of_match >= 2 * 16)
1580                         break;
1581                     }
1582                 }
1583       /* Fill in the new entry.
1584
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;
1592       else
1593         prefix_opc_table[insn] = max_matchedp;
1594     }
1595
1596   return max_matchedp;
1597 }
1598
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).  */
1602
1603 static int
1604 cris_constraint (const char *cs,
1605                  unsigned int insn,
1606                  unsigned int prefix_insn,
1607                  struct cris_disasm_data *disdata)
1608 {
1609   int retval = 0;
1610   int tmp;
1611   int prefix_ok = 0;
1612   const char *s;
1613
1614   for (s = cs; *s; s++)
1615     switch (*s)
1616       {
1617       case '!':
1618         /* Do not recognize "pop" if there's a prefix and then only for
1619            v0..v10.  */
1620         if (prefix_insn != NO_CRIS_PREFIX
1621             || disdata->distype != cris_dis_v0_v10)
1622           return -1;
1623         break;
1624
1625       case 'U':
1626         /* Not recognized at disassembly.  */
1627         return -1;
1628
1629       case 'M':
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)
1636           return -1;
1637         break;
1638
1639       case 'm':
1640         if ((insn & 0x30) == 0x30)
1641           return -1;
1642         break;
1643
1644       case 'S':
1645         /* A prefix operand without side-effect.  */
1646         if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
1647           {
1648             prefix_ok = 1;
1649             break;
1650           }
1651         else
1652           return -1;
1653
1654       case 's':
1655       case 'y':
1656       case 'Y':
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)
1660           {
1661             if (insn & 0x400)
1662               {
1663                 const struct cris_opcode *prefix_opcodep
1664                   = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1665
1666                 if (prefix_opcodep->match == DIP_OPCODE)
1667                   return -1;
1668               }
1669
1670             prefix_ok = 1;
1671           }
1672         break;
1673
1674       case 'B':
1675         /* If we don't fall through, then the prefix is ok.  */
1676         prefix_ok = 1;
1677
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)
1681           {
1682             /* Match the prefix insn to BDAPQ.  */
1683             const struct cris_opcode *prefix_opcodep
1684               = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1685
1686             if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
1687               {
1688                 int pushsize = (prefix_insn & 255);
1689
1690                 if (pushsize > 127)
1691                   pushsize -= 256;
1692
1693                 if (s[1] == 'P')
1694                   {
1695                     unsigned int spec_reg = (insn >> 12) & 15;
1696                     const struct cris_spec_reg *sregp
1697                       = spec_reg_info (spec_reg, disdata->distype);
1698
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)
1702                       break;
1703                   }
1704                 else if (s[1] == 'R')
1705                   {
1706                     if ((insn & 0x30) == 0x20 && pushsize == -4)
1707                       break;
1708                   }
1709                 /* FIXME:  Should abort here; next constraint letter
1710                    *must* be 'P' or 'R'.  */
1711               }
1712           }
1713         return -1;
1714
1715       case 'D':
1716         retval = (((insn >> 12) & 15) == (insn & 15));
1717         if (!retval)
1718           return -1;
1719         else
1720           retval += 4;
1721         break;
1722
1723       case 'P':
1724         {
1725           const struct cris_spec_reg *sregp
1726             = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1727
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.
1733
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.  */
1739
1740           if (sregp != NULL)
1741             {
1742               retval += 3;
1743               break;
1744             }
1745           else
1746             return -1;
1747         }
1748       }
1749
1750   if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
1751     return -1;
1752
1753   return retval;
1754 }
1755
1756 /* Format number as hex with a leading "0x" into outbuffer.  */
1757
1758 static char *
1759 format_hex (unsigned long number,
1760             char *outbuffer,
1761             struct cris_disasm_data *disdata)
1762 {
1763   /* Truncate negative numbers on >32-bit hosts.  */
1764   number &= 0xffffffff;
1765
1766   sprintf (outbuffer, "0x%lx", number);
1767
1768   /* Save this value for the "case" support.  */
1769   if (TRACE_CASE)
1770     last_immediate = number;
1771
1772   return outbuffer + strlen (outbuffer);
1773 }
1774
1775 /* Format number as decimal into outbuffer.  Parameter signedp says
1776    whether the number should be formatted as signed (!= 0) or
1777    unsigned (== 0).  */
1778
1779 static char *
1780 format_dec (long number, char *outbuffer, int signedp)
1781 {
1782   last_immediate = number;
1783   sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
1784
1785   return outbuffer + strlen (outbuffer);
1786 }
1787
1788 /* Format the name of the general register regno into outbuffer.  */
1789
1790 static char *
1791 format_reg (struct cris_disasm_data *disdata,
1792             int regno,
1793             char *outbuffer_start,
1794             bfd_boolean with_reg_prefix)
1795 {
1796   char *outbuffer = outbuffer_start;
1797
1798   if (with_reg_prefix)
1799     *outbuffer++ = REGISTER_PREFIX_CHAR;
1800
1801   switch (regno)
1802     {
1803     case 15:
1804       /* For v32, there is no context in which we output PC.  */
1805       if (disdata->distype == cris_dis_v32)
1806         strcpy (outbuffer, "acr");
1807       else
1808         strcpy (outbuffer, "pc");
1809       break;
1810
1811     case 14:
1812       strcpy (outbuffer, "sp");
1813       break;
1814
1815     default:
1816       sprintf (outbuffer, "r%d", regno);
1817       break;
1818     }
1819
1820   return outbuffer_start + strlen (outbuffer_start);
1821 }
1822
1823 /* Format the name of a support register into outbuffer.  */
1824
1825 static char *
1826 format_sup_reg (unsigned int regno,
1827                 char *outbuffer_start,
1828                 bfd_boolean with_reg_prefix)
1829 {
1830   char *outbuffer = outbuffer_start;
1831   int i;
1832
1833   if (with_reg_prefix)
1834     *outbuffer++ = REGISTER_PREFIX_CHAR;
1835
1836   for (i = 0; cris_support_regs[i].name != NULL; i++)
1837     if (cris_support_regs[i].number == regno)
1838       {
1839         sprintf (outbuffer, "%s", cris_support_regs[i].name);
1840         return outbuffer_start + strlen (outbuffer_start);
1841       }
1842
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);
1847 }
1848
1849 /* Return the length of an instruction.  */
1850
1851 static unsigned
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)
1856 {
1857   /* Each insn is a word plus "immediate" operands.  */
1858   unsigned to_skip = 2;
1859   const char *template = matchedp->args;
1860   const char *s;
1861
1862   for (s = template; *s; s++)
1863     if ((*s == 's' || *s == 'N' || *s == 'Y')
1864         && (insn & 0x400) && (insn & 15) == 15
1865         && prefix_matchedp == NULL)
1866       {
1867         /* Immediate via [pc+], so we have to check the size of the
1868            operand.  */
1869         int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
1870
1871         if (matchedp->imm_oprnd_size == SIZE_FIX_32)
1872           to_skip += 4;
1873         else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
1874           {
1875             const struct cris_spec_reg *sregp
1876               = spec_reg_info ((insn >> 12) & 15, distype);
1877
1878             /* FIXME: Improve error handling; should have been caught
1879                earlier.  */
1880             if (sregp == NULL)
1881               return 2;
1882
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.  */
1886             to_skip +=
1887               distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
1888           }
1889         else
1890           to_skip += (mode_size + 1) & ~1;
1891       }
1892     else if (*s == 'n')
1893       to_skip += 4;
1894     else if (*s == 'b')
1895       to_skip += 2;
1896
1897   return to_skip;
1898 }
1899
1900 /* Print condition code flags.  */
1901
1902 static char *
1903 print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
1904 {
1905   /* Use the v8 (Etrax 100) flag definitions for disassembly.
1906      The differences with v0 (Etrax 1..4) vs. Svinto are:
1907       v0 'd' <=> v8 'm'
1908       v0 'e' <=> v8 'b'.
1909      FIXME: Emit v0..v3 flag names somehow.  */
1910   static const char v8_fnames[] = "cvznxibm";
1911   static const char v32_fnames[] = "cvznxiup";
1912   const char *fnames
1913     = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
1914
1915   unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
1916   int i;
1917
1918   for (i = 0; i < 8; i++)
1919     if (flagbits & (1 << i))
1920       *cp++ = fnames[i];
1921
1922   return cp;
1923 }
1924
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.  */
1928
1929 static void
1930 print_with_operands (const struct cris_opcode *opcodep,
1931                      unsigned int insn,
1932                      unsigned char *buffer,
1933                      bfd_vma addr,
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
1937                         it.  */
1938                      const struct cris_opcode *prefix_opcodep,
1939                      unsigned int prefix_insn,
1940                      unsigned char *prefix_buffer,
1941                      bfd_boolean with_reg_prefix)
1942 {
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];
1946   char *tp = temp;
1947   static const char mode_char[] = "bwd?";
1948   const char *s;
1949   const char *cs;
1950   struct cris_disasm_data *disdata
1951     = (struct cris_disasm_data *) info->private_data;
1952
1953   /* Print out the name first thing we do.  */
1954   (*info->fprintf_func) (info->stream, "%s", opcodep->name);
1955
1956   cs = opcodep->args;
1957   s = cs;
1958
1959   /* Ignore any prefix indicator.  */
1960   if (*s == 'p')
1961     s++;
1962
1963   if (*s == 'm' || *s == 'M' || *s == 'z')
1964     {
1965       *tp++ = '.';
1966
1967       /* Get the size-letter.  */
1968       *tp++ = *s == 'M'
1969         ? (insn & 0x8000 ? 'd'
1970            : insn & 0x4000 ? 'w' : 'b')
1971         : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
1972
1973       /* Ignore the size and the space character that follows.  */
1974       s += 2;
1975     }
1976
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))
1980     *tp++ = ' ';
1981
1982   /* Fill in the insn-type if deducible from the name (and there's no
1983      better way).  */
1984   if (opcodep->name[0] == 'j')
1985     {
1986       if (CONST_STRNEQ (opcodep->name, "jsr"))
1987         /* It's "jsr" or "jsrc".  */
1988         info->insn_type = dis_jsr;
1989       else
1990         /* Any other jump-type insn is considered a branch.  */
1991         info->insn_type = dis_branch;
1992     }
1993
1994   /* We might know some more fields right now.  */
1995   info->branch_delay_insns = opcodep->delayed;
1996
1997   /* Handle operands.  */
1998   for (; *s; s++)
1999     {
2000     switch (*s)
2001       {
2002       case 'T':
2003         tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
2004         break;
2005
2006       case 'A':
2007         if (with_reg_prefix)
2008           *tp++ = REGISTER_PREFIX_CHAR;
2009         *tp++ = 'a';
2010         *tp++ = 'c';
2011         *tp++ = 'r';
2012         break;
2013
2014       case '[':
2015       case ']':
2016       case ',':
2017         *tp++ = *s;
2018         break;
2019
2020       case '!':
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".  */
2024         break;
2025
2026       case 'd':
2027         /* Ignore.  This is an optional ".d " on the large one of
2028            relaxable insns.  */
2029         break;
2030
2031       case 'B':
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;
2036         break;
2037
2038       case 'D':
2039       case 'r':
2040         tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2041         break;
2042
2043       case 'R':
2044         tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2045         break;
2046
2047       case 'n':
2048         {
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);
2053
2054           /* Finish off and output previous formatted bytes.  */
2055           *tp = 0;
2056           if (temp[0])
2057             (*info->fprintf_func) (info->stream, "%s", temp);
2058           tp = temp;
2059
2060           (*info->print_address_func) ((bfd_vma) number, info);
2061         }
2062         break;
2063
2064       case 'u':
2065         {
2066           /* Like n but the offset is bits <3:0> in the instruction.  */
2067           unsigned long number = (buffer[0] & 0xf) * 2 + addr;
2068
2069           /* Finish off and output previous formatted bytes.  */
2070           *tp = 0;
2071           if (temp[0])
2072             (*info->fprintf_func) (info->stream, "%s", temp);
2073           tp = temp;
2074
2075           (*info->print_address_func) ((bfd_vma) number, info);
2076         }
2077         break;
2078
2079       case 'N':
2080       case 'y':
2081       case 'Y':
2082       case 'S':
2083       case 's':
2084         /* Any "normal" memory operand.  */
2085         if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
2086           {
2087             /* We're looking at [pc+], i.e. we need to output an immediate
2088                number, where the size can depend on different things.  */
2089             long number;
2090             int signedp
2091               = ((*cs == 'z' && (insn & 0x20))
2092                  || opcodep->match == BDAP_QUICK_OPCODE);
2093             int nbytes;
2094
2095             if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2096               nbytes = 4;
2097             else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2098               {
2099                 const struct cris_spec_reg *sregp
2100                   = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2101
2102                 /* A NULL return should have been as a non-match earlier,
2103                    so catch it as an internal error in the error-case
2104                    below.  */
2105                 if (sregp == NULL)
2106                   /* Whatever non-valid size.  */
2107                   nbytes = 42;
2108                 else
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;
2114               }
2115             else
2116               {
2117                 int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
2118
2119                 if (mode_size == 1)
2120                   nbytes = 2;
2121                 else
2122                   nbytes = mode_size;
2123               }
2124
2125             switch (nbytes)
2126               {
2127               case 1:
2128                 number = buffer[2];
2129                 if (signedp && number > 127)
2130                   number -= 256;
2131                 break;
2132
2133               case 2:
2134                 number = buffer[2] + buffer[3] * 256;
2135                 if (signedp && number > 32767)
2136                   number -= 65536;
2137                 break;
2138
2139               case 4:
2140                 number
2141                   = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2142                   + buffer[5] * 0x1000000;
2143                 break;
2144
2145               default:
2146                 strcpy (tp, "bug");
2147                 tp += 3;
2148                 number = 42;
2149               }
2150
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);
2155             else
2156               {
2157                 unsigned int highbyte = (number >> 24) & 0xff;
2158
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.  */
2164                 if (nbytes == 4
2165                     && (highbyte == ((addr >> 24) & 0xff)
2166                         || (highbyte != 0 && highbyte != 0xff)
2167                         || info->insn_type == dis_branch
2168                         || info->insn_type == dis_jsr))
2169                   {
2170                     /* Finish off and output previous formatted bytes.  */
2171                     *tp = 0;
2172                     tp = temp;
2173                     if (temp[0])
2174                       (*info->fprintf_func) (info->stream, "%s", temp);
2175
2176                     (*info->print_address_func) ((bfd_vma) number, info);
2177
2178                     info->target = number;
2179                   }
2180                 else
2181                   tp = format_hex (number, tp, disdata);
2182               }
2183           }
2184         else
2185           {
2186             /* Not an immediate number.  Then this is a (possibly
2187                prefixed) memory operand.  */
2188             if (info->insn_type != dis_nonbranch)
2189               {
2190                 int mode_size
2191                   = 1 << ((insn >> 4)
2192                           & (opcodep->args[0] == 'z' ? 1 : 3));
2193                 int size;
2194                 info->insn_type = dis_dref;
2195                 info->flags |= CRIS_DIS_FLAG_MEMREF;
2196
2197                 if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2198                   size = 4;
2199                 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2200                   {
2201                     const struct cris_spec_reg *sregp
2202                       = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2203
2204                     /* FIXME: Improve error handling; should have been caught
2205                        earlier.  */
2206                     if (sregp == NULL)
2207                       size = 4;
2208                     else
2209                       size = sregp->reg_size;
2210                   }
2211                 else
2212                   size = mode_size;
2213
2214                 info->data_size = size;
2215               }
2216
2217             *tp++ = '[';
2218
2219             if (prefix_opcodep
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))
2224               {
2225                 if (insn & 0x400)
2226                   {
2227                     tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2228                     *tp++ = '=';
2229                   }
2230
2231
2232                 /* We mainly ignore the prefix format string when the
2233                    address-mode syntax is output.  */
2234                 switch (prefix_opcodep->match)
2235                   {
2236                   case DIP_OPCODE:
2237                     /* It's [r], [r+] or [pc+].  */
2238                     if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2239                       {
2240                         /* It's [pc+].  This cannot possibly be anything
2241                            but an address.  */
2242                         unsigned long number
2243                           = prefix_buffer[2] + prefix_buffer[3] * 256
2244                           + prefix_buffer[4] * 65536
2245                           + prefix_buffer[5] * 0x1000000;
2246
2247                         info->target = (bfd_vma) number;
2248
2249                         /* Finish off and output previous formatted
2250                            data.  */
2251                         *tp = 0;
2252                         tp = temp;
2253                         if (temp[0])
2254                           (*info->fprintf_func) (info->stream, "%s", temp);
2255
2256                         (*info->print_address_func) ((bfd_vma) number, info);
2257                       }
2258                     else
2259                       {
2260                         /* For a memref in an address, we use target2.
2261                            In this case, target is zero.  */
2262                         info->flags
2263                           |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2264                               | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
2265
2266                         info->target2 = prefix_insn & 15;
2267
2268                         *tp++ = '[';
2269                         tp = format_reg (disdata, prefix_insn & 15, tp,
2270                                          with_reg_prefix);
2271                         if (prefix_insn & 0x400)
2272                           *tp++ = '+';
2273                         *tp++ = ']';
2274                       }
2275                     break;
2276
2277                   case BDAP_QUICK_OPCODE:
2278                     {
2279                       int number;
2280
2281                       number = prefix_buffer[0];
2282                       if (number > 127)
2283                         number -= 256;
2284
2285                       /* Output "reg+num" or, if num < 0, "reg-num".  */
2286                       tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2287                                        with_reg_prefix);
2288                       if (number >= 0)
2289                         *tp++ = '+';
2290                       tp = format_dec (number, tp, 1);
2291
2292                       info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2293                       info->target = (prefix_insn >> 12) & 15;
2294                       info->target2 = (bfd_vma) number;
2295                       break;
2296                     }
2297
2298                   case BIAP_OPCODE:
2299                     /* Output "r+R.m".  */
2300                     tp = format_reg (disdata, prefix_insn & 15, tp,
2301                                      with_reg_prefix);
2302                     *tp++ = '+';
2303                     tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2304                                      with_reg_prefix);
2305                     *tp++ = '.';
2306                     *tp++ = mode_char[(prefix_insn >> 4) & 3];
2307
2308                     info->flags
2309                       |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2310                           | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2311
2312                           | ((prefix_insn & 0x8000)
2313                              ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
2314                              : ((prefix_insn & 0x8000)
2315                                 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
2316
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;
2321                     break;
2322
2323                   case BDAP_INDIR_OPCODE:
2324                     /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
2325                        "r-s".  */
2326                     tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2327                                      with_reg_prefix);
2328
2329                     if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2330                       {
2331                         long number;
2332                         unsigned int nbytes;
2333
2334                         /* It's a value.  Get its size.  */
2335                         int mode_size = 1 << ((prefix_insn >> 4) & 3);
2336
2337                         if (mode_size == 1)
2338                           nbytes = 2;
2339                         else
2340                           nbytes = mode_size;
2341
2342                         switch (nbytes)
2343                           {
2344                           case 1:
2345                             number = prefix_buffer[2];
2346                             if (number > 127)
2347                               number -= 256;
2348                             break;
2349
2350                           case 2:
2351                             number = prefix_buffer[2] + prefix_buffer[3] * 256;
2352                             if (number > 32767)
2353                               number -= 65536;
2354                             break;
2355
2356                           case 4:
2357                             number
2358                               = prefix_buffer[2] + prefix_buffer[3] * 256
2359                               + prefix_buffer[4] * 65536
2360                               + prefix_buffer[5] * 0x1000000;
2361                             break;
2362
2363                           default:
2364                             strcpy (tp, "bug");
2365                             tp += 3;
2366                             number = 42;
2367                           }
2368
2369                         info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2370                         info->target2 = (bfd_vma) number;
2371
2372                         /* If the size is dword, then assume it's an
2373                            address.  */
2374                         if (nbytes == 4)
2375                           {
2376                             /* Finish off and output previous formatted
2377                                bytes.  */
2378                             *tp++ = '+';
2379                             *tp = 0;
2380                             tp = temp;
2381                             (*info->fprintf_func) (info->stream, "%s", temp);
2382
2383                             (*info->print_address_func) ((bfd_vma) number, info);
2384                           }
2385                         else
2386                           {
2387                             if (number >= 0)
2388                               *tp++ = '+';
2389                             tp = format_dec (number, tp, 1);
2390                           }
2391                       }
2392                     else
2393                       {
2394                         /* Output "r+[R].m" or "r+[R+].m".  */
2395                         *tp++ = '+';
2396                         *tp++ = '[';
2397                         tp = format_reg (disdata, prefix_insn & 15, tp,
2398                                          with_reg_prefix);
2399                         if (prefix_insn & 0x400)
2400                           *tp++ = '+';
2401                         *tp++ = ']';
2402                         *tp++ = '.';
2403                         *tp++ = mode_char[(prefix_insn >> 4) & 3];
2404
2405                         info->flags
2406                           |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2407                               | CRIS_DIS_FLAG_MEM_TARGET2_MEM
2408                               | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2409
2410                               | (((prefix_insn >> 4) == 2)
2411                                  ? 0
2412                                  : (((prefix_insn >> 4) & 3) == 1
2413                                     ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
2414                                     : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
2415                       }
2416                     break;
2417
2418                   default:
2419                     (*info->fprintf_func) (info->stream, "?prefix-bug");
2420                   }
2421
2422                 /* To mark that the prefix is used, reset it.  */
2423                 prefix_opcodep = NULL;
2424               }
2425             else
2426               {
2427                 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2428
2429                 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2430                 info->target = insn & 15;
2431
2432                 if (insn & 0x400)
2433                   *tp++ = '+';
2434               }
2435             *tp++ = ']';
2436           }
2437         break;
2438
2439       case 'x':
2440         tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2441         *tp++ = '.';
2442         *tp++ = mode_char[(insn >> 4) & 3];
2443         break;
2444
2445       case 'I':
2446         tp = format_dec (insn & 63, tp, 0);
2447         break;
2448
2449       case 'b':
2450         {
2451           int where = buffer[2] + buffer[3] * 256;
2452
2453           if (where > 32767)
2454             where -= 65536;
2455
2456           where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
2457
2458           if (insn == BA_PC_INCR_OPCODE)
2459             info->insn_type = dis_branch;
2460           else
2461             info->insn_type = dis_condbranch;
2462
2463           info->target = (bfd_vma) where;
2464
2465           *tp = 0;
2466           tp = temp;
2467           (*info->fprintf_func) (info->stream, "%s%s ",
2468                                  temp, cris_cc_strings[insn >> 12]);
2469
2470           (*info->print_address_func) ((bfd_vma) where, info);
2471         }
2472       break;
2473
2474     case 'c':
2475       tp = format_dec (insn & 31, tp, 0);
2476       break;
2477
2478     case 'C':
2479       tp = format_dec (insn & 15, tp, 0);
2480       break;
2481
2482     case 'o':
2483       {
2484         long offset = insn & 0xfe;
2485         bfd_vma target;
2486
2487         if (insn & 1)
2488           offset |= ~0xff;
2489
2490         if (opcodep->match == BA_QUICK_OPCODE)
2491           info->insn_type = dis_branch;
2492         else
2493           info->insn_type = dis_condbranch;
2494
2495         target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
2496         info->target = target;
2497         *tp = 0;
2498         tp = temp;
2499         (*info->fprintf_func) (info->stream, "%s", temp);
2500         (*info->print_address_func) (target, info);
2501       }
2502       break;
2503
2504     case 'Q':
2505     case 'O':
2506       {
2507         long number = buffer[0];
2508
2509         if (number > 127)
2510           number = number - 256;
2511
2512         tp = format_dec (number, tp, 1);
2513         *tp++ = ',';
2514         tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2515       }
2516       break;
2517
2518     case 'f':
2519       tp = print_flags (disdata, insn, tp);
2520       break;
2521
2522     case 'i':
2523       tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
2524       break;
2525
2526     case 'P':
2527       {
2528         const struct cris_spec_reg *sregp
2529           = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2530
2531         if (sregp->name == NULL)
2532           /* Should have been caught as a non-match eariler.  */
2533           *tp++ = '?';
2534         else
2535           {
2536             if (with_reg_prefix)
2537               *tp++ = REGISTER_PREFIX_CHAR;
2538             strcpy (tp, sregp->name);
2539             tp += strlen (tp);
2540           }
2541       }
2542       break;
2543
2544     default:
2545       strcpy (tp, "???");
2546       tp += 3;
2547     }
2548   }
2549
2550   *tp = 0;
2551
2552   if (prefix_opcodep)
2553     (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
2554                            prefix_opcodep->name, prefix_opcodep->args);
2555
2556   (*info->fprintf_func) (info->stream, "%s", temp);
2557
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)
2562     {
2563       if (CONST_STRNEQ (opcodep->name, "sub"))
2564         case_offset = last_immediate;
2565
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;
2570
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;
2574
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)
2580         case_offset = 0;
2581     }
2582 }
2583
2584
2585 /* Print the CRIS instruction at address memaddr on stream.  Returns
2586    length of the instruction, in bytes.  Prefix register names with `$' if
2587    WITH_REG_PREFIX.  */
2588
2589 static int
2590 print_insn_cris_generic (bfd_vma memaddr,
2591                          disassemble_info *info,
2592                          bfd_boolean with_reg_prefix)
2593 {
2594   int nbytes;
2595   unsigned int insn;
2596   const struct cris_opcode *matchedp;
2597   int advance = 0;
2598   struct cris_disasm_data *disdata
2599     = (struct cris_disasm_data *) info->private_data;
2600
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;
2605   int status = 0;
2606   bfd_vma addr;
2607
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.
2611
2612      If we can't get any data, or we do not get enough data, we print
2613      the error message.  */
2614
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);  
2619
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);
2624
2625   addr = memaddr;
2626   bufp = buffer;
2627
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;
2633   info->flags = 0;
2634   info->target = 0;
2635   info->target2 = 0;
2636
2637   /* If we got any data, disassemble it.  */
2638   if (nbytes != 0)
2639     {
2640       matchedp = NULL;
2641
2642       insn = bufp[0] + bufp[1] * 256;
2643
2644       /* If we're in a case-table, don't disassemble the offsets.  */
2645       if (TRACE_CASE && case_offset_counter != 0)
2646         {
2647           info->insn_type = dis_noninsn;
2648           advance += 2;
2649
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" :
2655                                  "");
2656
2657           (*info->print_address_func) ((bfd_vma)
2658                                        ((short) (insn)
2659                                         + (long) (addr
2660                                                   - (no_of_case_offsets
2661                                                      - case_offset_counter)
2662                                                   * 2)), info);
2663           case_offset_counter--;
2664
2665           /* The default case start (without a "sub" or "add") must be
2666              zero.  */
2667           if (case_offset_counter == 0)
2668             case_offset = 0;
2669         }
2670       else if (insn == 0)
2671         {
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;
2680           advance += 2;
2681         }
2682       else
2683         {
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;
2688
2689           matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
2690
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')
2694             {
2695               /* If it's a prefix, put it into the prefix vars and get the
2696                  main insn.  */
2697               prefix_size = bytes_to_skip (prefix_insn, matchedp,
2698                                            disdata->distype, NULL);
2699               prefix_opcodep = matchedp;
2700
2701               insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
2702               matchedp = get_opcode_entry (insn, prefix_insn, disdata);
2703
2704               if (matchedp != NULL)
2705                 {
2706                   addr += prefix_size;
2707                   bufp += prefix_size;
2708                   advance += prefix_size;
2709                 }
2710               else
2711                 {
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;
2716                   insn = prefix_insn;
2717                   prefix_opcodep = NULL;
2718                 }
2719             }
2720
2721           if (matchedp == NULL)
2722             {
2723               (*info->fprintf_func) (info->stream, "??0x%x", insn);
2724               advance += 2;
2725
2726               info->insn_type = dis_noninsn;
2727             }
2728           else
2729             {
2730               advance
2731                 += bytes_to_skip (insn, matchedp, disdata->distype,
2732                                   prefix_opcodep);
2733
2734               /* The info_type and assorted fields will be set according
2735                  to the operands.   */
2736               print_with_operands (matchedp, insn, bufp, addr, info,
2737                                    prefix_opcodep, prefix_insn,
2738                                    prefix_buffer, with_reg_prefix);
2739             }
2740         }
2741     }
2742   else
2743     info->insn_type = dis_noninsn;
2744
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))
2749     {
2750       (*info->memory_error_func) (status, memaddr, info);
2751       return -1;
2752     }
2753
2754   /* Max supported insn size with one folded prefix insn.  */
2755   info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
2756
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;
2762
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
2767      we want.  */
2768   info->display_endian = BFD_ENDIAN_BIG;
2769
2770   return advance;
2771 }
2772
2773 /* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
2774 #if 0
2775 static int
2776 print_insn_cris_with_register_prefix (bfd_vma vma,
2777                                       disassemble_info *info)
2778 {
2779   if (info->private_data == NULL
2780       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2781     return -1;
2782   return print_insn_cris_generic (vma, info, TRUE);
2783 }
2784 #endif
2785 /* Disassemble, prefixing register names with `$'.  CRIS v32.  */
2786
2787 static int
2788 print_insn_crisv32_with_register_prefix (bfd_vma vma,
2789                                          disassemble_info *info)
2790 {
2791   if (info->private_data == NULL
2792       && !cris_parse_disassembler_options (info, cris_dis_v32))
2793     return -1;
2794   return print_insn_cris_generic (vma, info, TRUE);
2795 }
2796
2797 #if 0
2798 /* Disassemble, prefixing register names with `$'.
2799    Common v10 and v32 subset.  */
2800
2801 static int
2802 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
2803                                              disassemble_info *info)
2804 {
2805   if (info->private_data == NULL
2806       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2807     return -1;
2808   return print_insn_cris_generic (vma, info, TRUE);
2809 }
2810
2811 /* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
2812
2813 static int
2814 print_insn_cris_without_register_prefix (bfd_vma vma,
2815                                          disassemble_info *info)
2816 {
2817   if (info->private_data == NULL
2818       && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2819     return -1;
2820   return print_insn_cris_generic (vma, info, FALSE);
2821 }
2822
2823 /* Disassemble, no prefixes on register names.  CRIS v32.  */
2824
2825 static int
2826 print_insn_crisv32_without_register_prefix (bfd_vma vma,
2827                                             disassemble_info *info)
2828 {
2829   if (info->private_data == NULL
2830       && !cris_parse_disassembler_options (info, cris_dis_v32))
2831     return -1;
2832   return print_insn_cris_generic (vma, info, FALSE);
2833 }
2834
2835 /* Disassemble, no prefixes on register names.
2836    Common v10 and v32 subset.  */
2837
2838 static int
2839 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
2840                                                 disassemble_info *info)
2841 {
2842   if (info->private_data == NULL
2843       && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2844     return -1;
2845   return print_insn_cris_generic (vma, info, FALSE);
2846 }
2847 #endif
2848
2849 int
2850 print_insn_crisv32 (bfd_vma vma,
2851                     disassemble_info *info)
2852 {
2853   return print_insn_crisv32_with_register_prefix(vma, info);
2854 }
2855
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.  */
2860 #if 0
2861 disassembler_ftype
2862 cris_get_disassembler (bfd *abfd)
2863 {
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.  */
2867   if (abfd == NULL)
2868     return print_insn_cris_with_register_prefix;
2869
2870   if (bfd_get_symbol_leading_char (abfd) == 0)
2871     {
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;
2876
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;
2880     }
2881
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;
2887 }
2888 #endif
2889 /* Local variables:
2890    eval: (c-set-style "gnu")
2891    indent-tabs-mode: t
2892    End:  */