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