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