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