Statistics
| Branch: | Revision:

root / cris-dis.c @ 7267c094

History | View | Annotate | Download (80.3 kB)

1
/* Disassembler code for CRIS.
2
   Copyright 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
3
   Contributed by Axis Communications AB, Lund, Sweden.
4
   Written by Hans-Peter Nilsson.
5

6
   This file is part of the GNU binutils and GDB, the GNU debugger.
7

8
   This program is free software; you can redistribute it and/or modify it
9
   under the terms of the GNU General Public License as published by the
10
   Free Software Foundation; either version 2, or (at your option) any later
11
   version.
12

13
   This program is distributed in the hope that it will be useful, but WITHOUT
14
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
16
   more details.
17

18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, see <http://www.gnu.org/licenses/>. */
20

    
21
#include "qemu-common.h"
22
#include "dis-asm.h"
23
//#include "sysdep.h"
24
#include "target-cris/opcode-cris.h"
25
//#include "libiberty.h"
26

    
27
#define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
28

    
29
/* cris-opc.c -- Table of opcodes for the CRIS processor.
30
   Copyright 2000, 2001, 2004 Free Software Foundation, Inc.
31
   Contributed by Axis Communications AB, Lund, Sweden.
32
   Originally written for GAS 1.38.1 by Mikael Asker.
33
   Reorganized by Hans-Peter Nilsson.
34

35
This file is part of GAS, GDB and the GNU binutils.
36

37
GAS, GDB, and GNU binutils is free software; you can redistribute it
38
and/or modify it under the terms of the GNU General Public License as
39
published by the Free Software Foundation; either version 2, or (at your
40
option) any later version.
41

42
GAS, GDB, and GNU binutils are distributed in the hope that they will be
43
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
44
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
45
GNU General Public License for more details.
46

47
You should have received a copy of the GNU General Public License
48
along with this program; if not, see <http://www.gnu.org/licenses/>.  */
49

    
50
#ifndef NULL
51
#define NULL (0)
52
#endif
53

    
54
/* This table isn't used for CRISv32 and the size of immediate operands.  */
55
const struct cris_spec_reg
56
cris_spec_regs[] =
57
{
58
  {"bz",  0,  1, cris_ver_v32p,           NULL},
59
  {"p0",  0,  1, 0,                   NULL},
60
  {"vr",  1,  1, 0,                   NULL},
61
  {"p1",  1,  1, 0,                   NULL},
62
  {"pid", 2,  1, cris_ver_v32p,    NULL},
63
  {"p2",  2,  1, cris_ver_v32p,           NULL},
64
  {"p2",  2,  1, cris_ver_warning, NULL},
65
  {"srs", 3,  1, cris_ver_v32p,    NULL},
66
  {"p3",  3,  1, cris_ver_v32p,           NULL},
67
  {"p3",  3,  1, cris_ver_warning, NULL},
68
  {"wz",  4,  2, cris_ver_v32p,           NULL},
69
  {"p4",  4,  2, 0,                   NULL},
70
  {"ccr", 5,  2, cris_ver_v0_10,   NULL},
71
  {"exs", 5,  4, cris_ver_v32p,           NULL},
72
  {"p5",  5,  2, cris_ver_v0_10,   NULL},
73
  {"p5",  5,  4, cris_ver_v32p,           NULL},
74
  {"dcr0",6,  2, cris_ver_v0_3,           NULL},
75
  {"eda", 6,  4, cris_ver_v32p,           NULL},
76
  {"p6",  6,  2, cris_ver_v0_3,           NULL},
77
  {"p6",  6,  4, cris_ver_v32p,           NULL},
78
  {"dcr1/mof", 7, 4, cris_ver_v10p,
79
   "Register `dcr1/mof' with ambiguous size specified.  Guessing 4 bytes"},
80
  {"dcr1/mof", 7, 2, cris_ver_v0_3,
81
   "Register `dcr1/mof' with ambiguous size specified.  Guessing 2 bytes"},
82
  {"mof", 7,  4, cris_ver_v10p,           NULL},
83
  {"dcr1",7,  2, cris_ver_v0_3,           NULL},
84
  {"p7",  7,  4, cris_ver_v10p,           NULL},
85
  {"p7",  7,  2, cris_ver_v0_3,           NULL},
86
  {"dz",  8,  4, cris_ver_v32p,           NULL},
87
  {"p8",  8,  4, 0,                   NULL},
88
  {"ibr", 9,  4, cris_ver_v0_10,   NULL},
89
  {"ebp", 9,  4, cris_ver_v32p,           NULL},
90
  {"p9",  9,  4, 0,                   NULL},
91
  {"irp", 10, 4, cris_ver_v0_10,   NULL},
92
  {"erp", 10, 4, cris_ver_v32p,           NULL},
93
  {"p10", 10, 4, 0,                   NULL},
94
  {"srp", 11, 4, 0,                   NULL},
95
  {"p11", 11, 4, 0,                   NULL},
96
  /* For disassembly use only.  Accept at assembly with a warning.  */
97
  {"bar/dtp0", 12, 4, cris_ver_warning,
98
   "Ambiguous register `bar/dtp0' specified"},
99
  {"nrp", 12, 4, cris_ver_v32p,           NULL},
100
  {"bar", 12, 4, cris_ver_v8_10,   NULL},
101
  {"dtp0",12, 4, cris_ver_v0_3,           NULL},
102
  {"p12", 12, 4, 0,                   NULL},
103
  /* For disassembly use only.  Accept at assembly with a warning.  */
104
  {"dccr/dtp1",13, 4, cris_ver_warning,
105
   "Ambiguous register `dccr/dtp1' specified"},
106
  {"ccs", 13, 4, cris_ver_v32p,           NULL},
107
  {"dccr",13, 4, cris_ver_v8_10,   NULL},
108
  {"dtp1",13, 4, cris_ver_v0_3,           NULL},
109
  {"p13", 13, 4, 0,                   NULL},
110
  {"brp", 14, 4, cris_ver_v3_10,   NULL},
111
  {"usp", 14, 4, cris_ver_v32p,           NULL},
112
  {"p14", 14, 4, cris_ver_v3p,           NULL},
113
  {"usp", 15, 4, cris_ver_v10,           NULL},
114
  {"spc", 15, 4, cris_ver_v32p,           NULL},
115
  {"p15", 15, 4, cris_ver_v10p,           NULL},
116
  {NULL, 0, 0, cris_ver_version_all, NULL}
117
};
118

    
119
/* Add version specifiers to this table when necessary.
120
   The (now) regular coding of register names suggests a simpler
121
   implementation.  */
122
const struct cris_support_reg cris_support_regs[] =
123
{
124
  {"s0", 0},
125
  {"s1", 1},
126
  {"s2", 2},
127
  {"s3", 3},
128
  {"s4", 4},
129
  {"s5", 5},
130
  {"s6", 6},
131
  {"s7", 7},
132
  {"s8", 8},
133
  {"s9", 9},
134
  {"s10", 10},
135
  {"s11", 11},
136
  {"s12", 12},
137
  {"s13", 13},
138
  {"s14", 14},
139
  {"s15", 15},
140
  {NULL, 0}
141
};
142

    
143
/* All CRIS opcodes are 16 bits.
144

145
   - The match component is a mask saying which bits must match a
146
     particular opcode in order for an instruction to be an instance
147
     of that opcode.
148

149
   - The args component is a string containing characters symbolically
150
     matching the operands of an instruction.  Used for both assembly
151
     and disassembly.
152

153
     Operand-matching characters:
154
     [ ] , space
155
        Verbatim.
156
     A        The string "ACR" (case-insensitive).
157
     B        Not really an operand.  It causes a "BDAP -size,SP" prefix to be
158
        output for the PUSH alias-instructions and recognizes a push-
159
        prefix at disassembly.  This letter isn't recognized for v32.
160
        Must be followed by a R or P letter.
161
     !        Non-match pattern, will not match if there's a prefix insn.
162
     b        Non-matching operand, used for branches with 16-bit
163
        displacement. Only recognized by the disassembler.
164
     c        5-bit unsigned immediate in bits <4:0>.
165
     C        4-bit unsigned immediate in bits <3:0>.
166
     d  At assembly, optionally (as in put other cases before this one)
167
        ".d" or ".D" at the start of the operands, followed by one space
168
        character.  At disassembly, nothing.
169
     D        General register in bits <15:12> and <3:0>.
170
     f        List of flags in bits <15:12> and <3:0>.
171
     i        6-bit signed immediate in bits <5:0>.
172
     I        6-bit unsigned immediate in bits <5:0>.
173
     M        Size modifier (B, W or D) for CLEAR instructions.
174
     m        Size modifier (B, W or D) in bits <5:4>
175
     N  A 32-bit dword, like in the difference between s and y.
176
        This has no effect on bits in the opcode.  Can also be expressed
177
        as "[pc+]" in input.
178
     n  As N, but PC-relative (to the start of the instruction).
179
     o        [-128..127] word offset in bits <7:1> and <0>.  Used by 8-bit
180
        branch instructions.
181
     O        [-128..127] offset in bits <7:0>.  Also matches a comma and a
182
        general register after the expression, in bits <15:12>.  Used
183
        only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
184
     P        Special register in bits <15:12>.
185
     p        Indicates that the insn is a prefix insn.  Must be first
186
        character.
187
     Q  As O, but don't relax; force an 8-bit offset.
188
     R        General register in bits <15:12>.
189
     r        General register in bits <3:0>.
190
     S        Source operand in bit <10> and a prefix; a 3-operand prefix
191
        without side-effect.
192
     s        Source operand in bits <10> and <3:0>, optionally with a
193
        side-effect prefix, except [pc] (the name, not R15 as in ACR)
194
        isn't allowed for v32 and higher.
195
     T  Support register in bits <15:12>.
196
     u  4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
197
     U  Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
198
        Not recognized at disassembly.
199
     x        Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
200
     y        Like 's' but do not allow an integer at assembly.
201
     Y        The difference s-y; only an integer is allowed.
202
     z        Size modifier (B or W) in bit <4>.  */
203

    
204

    
205
/* Please note the order of the opcodes in this table is significant.
206
   The assembler requires that all instances of the same mnemonic must
207
   be consecutive.  If they aren't, the assembler might not recognize
208
   them, or may indicate an internal error.
209

210
   The disassembler should not normally care about the order of the
211
   opcodes, but will prefer an earlier alternative if the "match-score"
212
   (see cris-dis.c) is computed as equal.
213

214
   It should not be significant for proper execution that this table is
215
   in alphabetical order, but please follow that convention for an easy
216
   overview.  */
217

    
218
const struct cris_opcode
219
cris_opcodes[] =
220
{
221
  {"abs",     0x06B0, 0x0940,                  "r,R",     0, SIZE_NONE,     0,
222
   cris_abs_op},
223

    
224
  {"add",     0x0600, 0x09c0,                  "m r,R",   0, SIZE_NONE,     0,
225
   cris_reg_mode_add_sub_cmp_and_or_move_op},
226

    
227
  {"add",     0x0A00, 0x01c0,                  "m s,R",   0, SIZE_FIELD,    0,
228
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
229

    
230
  {"add",     0x0A00, 0x01c0,                  "m S,D",   0, SIZE_NONE,
231
   cris_ver_v0_10,
232
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
233

    
234
  {"add",     0x0a00, 0x05c0,                  "m S,R,r", 0, SIZE_NONE,
235
   cris_ver_v0_10,
236
   cris_three_operand_add_sub_cmp_and_or_op},
237

    
238
  {"add",     0x0A00, 0x01c0,                  "m s,R",   0, SIZE_FIELD,
239
   cris_ver_v32p,
240
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
241

    
242
  {"addc",    0x0570, 0x0A80,                  "r,R",     0, SIZE_FIX_32,
243
   cris_ver_v32p,
244
   cris_not_implemented_op},
245

    
246
  {"addc",    0x09A0, 0x0250,                  "s,R",     0, SIZE_FIX_32,
247
   cris_ver_v32p,
248
   cris_not_implemented_op},
249

    
250
  {"addi",    0x0540, 0x0A80,                  "x,r,A",   0, SIZE_NONE,
251
   cris_ver_v32p,
252
   cris_addi_op},
253

    
254
  {"addi",    0x0500, 0x0Ac0,                  "x,r",     0, SIZE_NONE,     0,
255
   cris_addi_op},
256

    
257
  /* This collates after "addo", but we want to disassemble as "addoq",
258
     not "addo".  */
259
  {"addoq",   0x0100, 0x0E00,                  "Q,A",     0, SIZE_NONE,
260
   cris_ver_v32p,
261
   cris_not_implemented_op},
262

    
263
  {"addo",    0x0940, 0x0280,                  "m s,R,A", 0, SIZE_FIELD_SIGNED,
264
   cris_ver_v32p,
265
   cris_not_implemented_op},
266

    
267
  /* This must be located after the insn above, lest we misinterpret
268
     "addo.b -1,r0,acr" as "addo .b-1,r0,acr".  FIXME: Sounds like a
269
     parser bug.  */
270
  {"addo",   0x0100, 0x0E00,                  "O,A",     0, SIZE_NONE,
271
   cris_ver_v32p,
272
   cris_not_implemented_op},
273

    
274
  {"addq",    0x0200, 0x0Dc0,                  "I,R",     0, SIZE_NONE,     0,
275
   cris_quick_mode_add_sub_op},
276

    
277
  {"adds",    0x0420, 0x0Bc0,                  "z r,R",   0, SIZE_NONE,     0,
278
   cris_reg_mode_add_sub_cmp_and_or_move_op},
279

    
280
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
281
  {"adds",    0x0820, 0x03c0,                  "z s,R",   0, SIZE_FIELD,    0,
282
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
283

    
284
  {"adds",    0x0820, 0x03c0,                  "z S,D",   0, SIZE_NONE,
285
   cris_ver_v0_10,
286
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
287

    
288
  {"adds",    0x0820, 0x07c0,                  "z S,R,r", 0, SIZE_NONE,
289
   cris_ver_v0_10,
290
   cris_three_operand_add_sub_cmp_and_or_op},
291

    
292
  {"addu",    0x0400, 0x0be0,                  "z r,R",   0, SIZE_NONE,     0,
293
   cris_reg_mode_add_sub_cmp_and_or_move_op},
294

    
295
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
296
  {"addu",    0x0800, 0x03e0,                  "z s,R",   0, SIZE_FIELD,    0,
297
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
298

    
299
  {"addu",    0x0800, 0x03e0,                  "z S,D",   0, SIZE_NONE,
300
   cris_ver_v0_10,
301
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
302

    
303
  {"addu",    0x0800, 0x07e0,                  "z S,R,r", 0, SIZE_NONE,
304
   cris_ver_v0_10,
305
   cris_three_operand_add_sub_cmp_and_or_op},
306

    
307
  {"and",     0x0700, 0x08C0,                  "m r,R",   0, SIZE_NONE,     0,
308
   cris_reg_mode_add_sub_cmp_and_or_move_op},
309

    
310
  {"and",     0x0B00, 0x00C0,                  "m s,R",   0, SIZE_FIELD,    0,
311
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
312

    
313
  {"and",     0x0B00, 0x00C0,                  "m S,D",   0, SIZE_NONE,
314
   cris_ver_v0_10,
315
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
316

    
317
  {"and",     0x0B00, 0x04C0,                  "m S,R,r", 0, SIZE_NONE,
318
   cris_ver_v0_10,
319
   cris_three_operand_add_sub_cmp_and_or_op},
320

    
321
  {"andq",    0x0300, 0x0CC0,                  "i,R",     0, SIZE_NONE,     0,
322
   cris_quick_mode_and_cmp_move_or_op},
323

    
324
  {"asr",     0x0780, 0x0840,                  "m r,R",   0, SIZE_NONE,     0,
325
   cris_asr_op},
326

    
327
  {"asrq",    0x03a0, 0x0c40,                  "c,R",     0, SIZE_NONE,     0,
328
   cris_asrq_op},
329

    
330
  {"ax",      0x15B0, 0xEA4F,                  "",             0, SIZE_NONE,     0,
331
   cris_ax_ei_setf_op},
332

    
333
  /* FIXME: Should use branch #defines.  */
334
  {"b",              0x0dff, 0x0200,                  "b",             1, SIZE_NONE,     0,
335
   cris_sixteen_bit_offset_branch_op},
336

    
337
  {"ba",
338
   BA_QUICK_OPCODE,
339
   0x0F00+(0xF-CC_A)*0x1000,                  "o",             1, SIZE_NONE,     0,
340
   cris_eight_bit_offset_branch_op},
341

    
342
  /* Needs to come after the usual "ba o", which might be relaxed to
343
     this one.  */
344
  {"ba",     BA_DWORD_OPCODE,
345
   0xffff & (~BA_DWORD_OPCODE),                  "n",             0, SIZE_FIX_32,
346
   cris_ver_v32p,
347
   cris_none_reg_mode_jump_op},
348

    
349
  {"bas",     0x0EBF, 0x0140,                  "n,P",     0, SIZE_FIX_32,
350
   cris_ver_v32p,
351
   cris_none_reg_mode_jump_op},
352

    
353
  {"basc",     0x0EFF, 0x0100,                  "n,P",     0, SIZE_FIX_32,
354
   cris_ver_v32p,
355
   cris_none_reg_mode_jump_op},
356

    
357
  {"bcc",
358
   BRANCH_QUICK_OPCODE+CC_CC*0x1000,
359
   0x0f00+(0xF-CC_CC)*0x1000,                  "o",             1, SIZE_NONE,     0,
360
   cris_eight_bit_offset_branch_op},
361

    
362
  {"bcs",
363
   BRANCH_QUICK_OPCODE+CC_CS*0x1000,
364
   0x0f00+(0xF-CC_CS)*0x1000,                  "o",             1, SIZE_NONE,     0,
365
   cris_eight_bit_offset_branch_op},
366

    
367
  {"bdap",
368
   BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS,  "pm s,R",  0, SIZE_FIELD_SIGNED,
369
   cris_ver_v0_10,
370
   cris_bdap_prefix},
371

    
372
  {"bdap",
373
   BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS,  "pO",             0, SIZE_NONE,
374
   cris_ver_v0_10,
375
   cris_quick_mode_bdap_prefix},
376

    
377
  {"beq",
378
   BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
379
   0x0f00+(0xF-CC_EQ)*0x1000,                  "o",             1, SIZE_NONE,     0,
380
   cris_eight_bit_offset_branch_op},
381

    
382
  /* This is deliberately put before "bext" to trump it, even though not
383
     in alphabetical order, since we don't do excluding version checks
384
     for v0..v10.  */
385
  {"bwf",
386
   BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
387
   0x0f00+(0xF-CC_EXT)*0x1000,                  "o",             1, SIZE_NONE,
388
   cris_ver_v10,
389
   cris_eight_bit_offset_branch_op},
390

    
391
  {"bext",
392
   BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
393
   0x0f00+(0xF-CC_EXT)*0x1000,                  "o",             1, SIZE_NONE,
394
   cris_ver_v0_3,
395
   cris_eight_bit_offset_branch_op},
396

    
397
  {"bge",
398
   BRANCH_QUICK_OPCODE+CC_GE*0x1000,
399
   0x0f00+(0xF-CC_GE)*0x1000,                  "o",             1, SIZE_NONE,     0,
400
   cris_eight_bit_offset_branch_op},
401

    
402
  {"bgt",
403
   BRANCH_QUICK_OPCODE+CC_GT*0x1000,
404
   0x0f00+(0xF-CC_GT)*0x1000,                  "o",             1, SIZE_NONE,     0,
405
   cris_eight_bit_offset_branch_op},
406

    
407
  {"bhi",
408
   BRANCH_QUICK_OPCODE+CC_HI*0x1000,
409
   0x0f00+(0xF-CC_HI)*0x1000,                  "o",             1, SIZE_NONE,     0,
410
   cris_eight_bit_offset_branch_op},
411

    
412
  {"bhs",
413
   BRANCH_QUICK_OPCODE+CC_HS*0x1000,
414
   0x0f00+(0xF-CC_HS)*0x1000,                  "o",             1, SIZE_NONE,     0,
415
   cris_eight_bit_offset_branch_op},
416

    
417
  {"biap", BIAP_OPCODE, BIAP_Z_BITS,          "pm r,R",  0, SIZE_NONE,
418
   cris_ver_v0_10,
419
   cris_biap_prefix},
420

    
421
  {"ble",
422
   BRANCH_QUICK_OPCODE+CC_LE*0x1000,
423
   0x0f00+(0xF-CC_LE)*0x1000,                  "o",             1, SIZE_NONE,     0,
424
   cris_eight_bit_offset_branch_op},
425

    
426
  {"blo",
427
   BRANCH_QUICK_OPCODE+CC_LO*0x1000,
428
   0x0f00+(0xF-CC_LO)*0x1000,                  "o",             1, SIZE_NONE,     0,
429
   cris_eight_bit_offset_branch_op},
430

    
431
  {"bls",
432
   BRANCH_QUICK_OPCODE+CC_LS*0x1000,
433
   0x0f00+(0xF-CC_LS)*0x1000,                  "o",             1, SIZE_NONE,     0,
434
   cris_eight_bit_offset_branch_op},
435

    
436
  {"blt",
437
   BRANCH_QUICK_OPCODE+CC_LT*0x1000,
438
   0x0f00+(0xF-CC_LT)*0x1000,                  "o",             1, SIZE_NONE,     0,
439
   cris_eight_bit_offset_branch_op},
440

    
441
  {"bmi",
442
   BRANCH_QUICK_OPCODE+CC_MI*0x1000,
443
   0x0f00+(0xF-CC_MI)*0x1000,                  "o",             1, SIZE_NONE,     0,
444
   cris_eight_bit_offset_branch_op},
445

    
446
  {"bmod",    0x0ab0, 0x0140,                  "s,R",     0, SIZE_FIX_32,
447
   cris_ver_sim_v0_10,
448
   cris_not_implemented_op},
449

    
450
  {"bmod",    0x0ab0, 0x0140,                  "S,D",     0, SIZE_NONE,
451
   cris_ver_sim_v0_10,
452
   cris_not_implemented_op},
453

    
454
  {"bmod",    0x0ab0, 0x0540,                  "S,R,r",   0, SIZE_NONE,
455
   cris_ver_sim_v0_10,
456
   cris_not_implemented_op},
457

    
458
  {"bne",
459
   BRANCH_QUICK_OPCODE+CC_NE*0x1000,
460
   0x0f00+(0xF-CC_NE)*0x1000,                  "o",             1, SIZE_NONE,     0,
461
   cris_eight_bit_offset_branch_op},
462

    
463
  {"bound",   0x05c0, 0x0A00,                  "m r,R",   0, SIZE_NONE,     0,
464
   cris_two_operand_bound_op},
465
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
466
  {"bound",   0x09c0, 0x0200,                  "m s,R",   0, SIZE_FIELD,
467
   cris_ver_v0_10,
468
   cris_two_operand_bound_op},
469
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
470
  {"bound",   0x0dcf, 0x0200,                  "m Y,R",   0, SIZE_FIELD,    0,
471
   cris_two_operand_bound_op},
472
  {"bound",   0x09c0, 0x0200,                  "m S,D",   0, SIZE_NONE,
473
   cris_ver_v0_10,
474
   cris_two_operand_bound_op},
475
  {"bound",   0x09c0, 0x0600,                  "m S,R,r", 0, SIZE_NONE,
476
   cris_ver_v0_10,
477
   cris_three_operand_bound_op},
478

    
479
  {"bpl",
480
   BRANCH_QUICK_OPCODE+CC_PL*0x1000,
481
   0x0f00+(0xF-CC_PL)*0x1000,                  "o",             1, SIZE_NONE,     0,
482
   cris_eight_bit_offset_branch_op},
483

    
484
  {"break",   0xe930, 0x16c0,                  "C",             0, SIZE_NONE,
485
   cris_ver_v3p,
486
   cris_break_op},
487

    
488
  {"bsb",
489
   BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
490
   0x0f00+(0xF-CC_EXT)*0x1000,                  "o",             1, SIZE_NONE,
491
   cris_ver_v32p,
492
   cris_eight_bit_offset_branch_op},
493

    
494
  {"bsr",     0xBEBF, 0x4140,                  "n",             0, SIZE_FIX_32,
495
   cris_ver_v32p,
496
   cris_none_reg_mode_jump_op},
497

    
498
  {"bsrc",     0xBEFF, 0x4100,                  "n",             0, SIZE_FIX_32,
499
   cris_ver_v32p,
500
   cris_none_reg_mode_jump_op},
501

    
502
  {"bstore",  0x0af0, 0x0100,                  "s,R",     0, SIZE_FIX_32,
503
   cris_ver_warning,
504
   cris_not_implemented_op},
505

    
506
  {"bstore",  0x0af0, 0x0100,                  "S,D",     0, SIZE_NONE,
507
   cris_ver_warning,
508
   cris_not_implemented_op},
509

    
510
  {"bstore",  0x0af0, 0x0500,                  "S,R,r",   0, SIZE_NONE,
511
   cris_ver_warning,
512
   cris_not_implemented_op},
513

    
514
  {"btst",    0x04F0, 0x0B00,                  "r,R",     0, SIZE_NONE,     0,
515
   cris_btst_nop_op},
516
  {"btstq",   0x0380, 0x0C60,                  "c,R",     0, SIZE_NONE,     0,
517
   cris_btst_nop_op},
518

    
519
  {"bvc",
520
   BRANCH_QUICK_OPCODE+CC_VC*0x1000,
521
   0x0f00+(0xF-CC_VC)*0x1000,                  "o",             1, SIZE_NONE,     0,
522
   cris_eight_bit_offset_branch_op},
523

    
524
  {"bvs",
525
   BRANCH_QUICK_OPCODE+CC_VS*0x1000,
526
   0x0f00+(0xF-CC_VS)*0x1000,                  "o",             1, SIZE_NONE,     0,
527
   cris_eight_bit_offset_branch_op},
528

    
529
  {"clear",   0x0670, 0x3980,                  "M r",     0, SIZE_NONE,     0,
530
   cris_reg_mode_clear_op},
531

    
532
  {"clear",   0x0A70, 0x3180,                  "M y",     0, SIZE_NONE,     0,
533
   cris_none_reg_mode_clear_test_op},
534

    
535
  {"clear",   0x0A70, 0x3180,                  "M S",     0, SIZE_NONE,
536
   cris_ver_v0_10,
537
   cris_none_reg_mode_clear_test_op},
538

    
539
  {"clearf",  0x05F0, 0x0A00,                  "f",             0, SIZE_NONE,     0,
540
   cris_clearf_di_op},
541

    
542
  {"cmp",     0x06C0, 0x0900,                  "m r,R",   0, SIZE_NONE,     0,
543
   cris_reg_mode_add_sub_cmp_and_or_move_op},
544

    
545
  {"cmp",     0x0Ac0, 0x0100,                  "m s,R",   0, SIZE_FIELD,    0,
546
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
547

    
548
  {"cmp",     0x0Ac0, 0x0100,                  "m S,D",   0, SIZE_NONE,
549
   cris_ver_v0_10,
550
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
551

    
552
  {"cmpq",    0x02C0, 0x0D00,                  "i,R",     0, SIZE_NONE,     0,
553
   cris_quick_mode_and_cmp_move_or_op},
554

    
555
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
556
  {"cmps",    0x08e0, 0x0300,                  "z s,R",   0, SIZE_FIELD,    0,
557
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
558

    
559
  {"cmps",    0x08e0, 0x0300,                  "z S,D",   0, SIZE_NONE,
560
   cris_ver_v0_10,
561
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
562

    
563
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
564
  {"cmpu",    0x08c0, 0x0320,                  "z s,R" ,  0, SIZE_FIELD,    0,
565
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
566

    
567
  {"cmpu",    0x08c0, 0x0320,                  "z S,D",   0, SIZE_NONE,
568
   cris_ver_v0_10,
569
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
570

    
571
  {"di",      0x25F0, 0xDA0F,                  "",             0, SIZE_NONE,     0,
572
   cris_clearf_di_op},
573

    
574
  {"dip",     DIP_OPCODE, DIP_Z_BITS,          "ps",             0, SIZE_FIX_32,
575
   cris_ver_v0_10,
576
   cris_dip_prefix},
577

    
578
  {"div",     0x0980, 0x0640,                  "m R,r",   0, SIZE_FIELD,    0,
579
   cris_not_implemented_op},
580

    
581
  {"dstep",   0x06f0, 0x0900,                  "r,R",     0, SIZE_NONE,     0,
582
   cris_dstep_logshift_mstep_neg_not_op},
583

    
584
  {"ei",      0x25B0, 0xDA4F,                  "",             0, SIZE_NONE,     0,
585
   cris_ax_ei_setf_op},
586

    
587
  {"fidxd",    0x0ab0, 0xf540,                  "[r]",     0, SIZE_NONE,
588
   cris_ver_v32p,
589
   cris_not_implemented_op},
590

    
591
  {"fidxi",    0x0d30, 0xF2C0,                  "[r]",     0, SIZE_NONE,
592
   cris_ver_v32p,
593
   cris_not_implemented_op},
594

    
595
  {"ftagd",    0x1AB0, 0xE540,                  "[r]",     0, SIZE_NONE,
596
   cris_ver_v32p,
597
   cris_not_implemented_op},
598

    
599
  {"ftagi",    0x1D30, 0xE2C0,                  "[r]",     0, SIZE_NONE,
600
   cris_ver_v32p,
601
   cris_not_implemented_op},
602

    
603
  {"halt",    0xF930, 0x06CF,                  "",             0, SIZE_NONE,
604
   cris_ver_v32p,
605
   cris_not_implemented_op},
606

    
607
  {"jas",    0x09B0, 0x0640,                  "r,P",     0, SIZE_NONE,
608
   cris_ver_v32p,
609
   cris_reg_mode_jump_op},
610

    
611
  {"jas",    0x0DBF, 0x0240,                  "N,P",     0, SIZE_FIX_32,
612
   cris_ver_v32p,
613
   cris_reg_mode_jump_op},
614

    
615
  {"jasc",    0x0B30, 0x04C0,                  "r,P",     0, SIZE_NONE,
616
   cris_ver_v32p,
617
   cris_reg_mode_jump_op},
618

    
619
  {"jasc",    0x0F3F, 0x00C0,                  "N,P",     0, SIZE_FIX_32,
620
   cris_ver_v32p,
621
   cris_reg_mode_jump_op},
622

    
623
  {"jbrc",    0x69b0, 0x9640,                  "r",             0, SIZE_NONE,
624
   cris_ver_v8_10,
625
   cris_reg_mode_jump_op},
626

    
627
  {"jbrc",    0x6930, 0x92c0,                  "s",             0, SIZE_FIX_32,
628
   cris_ver_v8_10,
629
   cris_none_reg_mode_jump_op},
630

    
631
  {"jbrc",    0x6930, 0x92c0,                  "S",             0, SIZE_NONE,
632
   cris_ver_v8_10,
633
   cris_none_reg_mode_jump_op},
634

    
635
  {"jir",     0xA9b0, 0x5640,                  "r",             0, SIZE_NONE,
636
   cris_ver_v8_10,
637
   cris_reg_mode_jump_op},
638

    
639
  {"jir",     0xA930, 0x52c0,                  "s",             0, SIZE_FIX_32,
640
   cris_ver_v8_10,
641
   cris_none_reg_mode_jump_op},
642

    
643
  {"jir",     0xA930, 0x52c0,                  "S",             0, SIZE_NONE,
644
   cris_ver_v8_10,
645
   cris_none_reg_mode_jump_op},
646

    
647
  {"jirc",    0x29b0, 0xd640,                  "r",             0, SIZE_NONE,
648
   cris_ver_v8_10,
649
   cris_reg_mode_jump_op},
650

    
651
  {"jirc",    0x2930, 0xd2c0,                  "s",             0, SIZE_FIX_32,
652
   cris_ver_v8_10,
653
   cris_none_reg_mode_jump_op},
654

    
655
  {"jirc",    0x2930, 0xd2c0,                  "S",             0, SIZE_NONE,
656
   cris_ver_v8_10,
657
   cris_none_reg_mode_jump_op},
658

    
659
  {"jsr",     0xB9b0, 0x4640,                  "r",             0, SIZE_NONE,     0,
660
   cris_reg_mode_jump_op},
661

    
662
  {"jsr",     0xB930, 0x42c0,                  "s",             0, SIZE_FIX_32,
663
   cris_ver_v0_10,
664
   cris_none_reg_mode_jump_op},
665

    
666
  {"jsr",     0xBDBF, 0x4240,                  "N",             0, SIZE_FIX_32,
667
   cris_ver_v32p,
668
   cris_none_reg_mode_jump_op},
669

    
670
  {"jsr",     0xB930, 0x42c0,                  "S",             0, SIZE_NONE,
671
   cris_ver_v0_10,
672
   cris_none_reg_mode_jump_op},
673

    
674
  {"jsrc",    0x39b0, 0xc640,                  "r",             0, SIZE_NONE,
675
   cris_ver_v8_10,
676
   cris_reg_mode_jump_op},
677

    
678
  {"jsrc",    0x3930, 0xc2c0,                  "s",             0, SIZE_FIX_32,
679
   cris_ver_v8_10,
680
   cris_none_reg_mode_jump_op},
681

    
682
  {"jsrc",    0x3930, 0xc2c0,                  "S",             0, SIZE_NONE,
683
   cris_ver_v8_10,
684
   cris_none_reg_mode_jump_op},
685

    
686
  {"jsrc",    0xBB30, 0x44C0,                  "r",       0, SIZE_NONE,
687
   cris_ver_v32p,
688
   cris_reg_mode_jump_op},
689

    
690
  {"jsrc",    0xBF3F, 0x40C0,                  "N",             0, SIZE_FIX_32,
691
   cris_ver_v32p,
692
   cris_reg_mode_jump_op},
693

    
694
  {"jump",    0x09b0, 0xF640,                  "r",             0, SIZE_NONE,     0,
695
   cris_reg_mode_jump_op},
696

    
697
  {"jump",
698
   JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "s",             0, SIZE_FIX_32,
699
   cris_ver_v0_10,
700
   cris_none_reg_mode_jump_op},
701

    
702
  {"jump",
703
   JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "S",             0, SIZE_NONE,
704
   cris_ver_v0_10,
705
   cris_none_reg_mode_jump_op},
706

    
707
  {"jump",    0x09F0, 0x060F,                  "P",             0, SIZE_NONE,
708
   cris_ver_v32p,
709
   cris_none_reg_mode_jump_op},
710

    
711
  {"jump",
712
   JUMP_PC_INCR_OPCODE_V32,
713
   (0xffff & ~JUMP_PC_INCR_OPCODE_V32),          "N",             0, SIZE_FIX_32,
714
   cris_ver_v32p,
715
   cris_none_reg_mode_jump_op},
716

    
717
  {"jmpu",    0x8930, 0x72c0,                  "s",             0, SIZE_FIX_32,
718
   cris_ver_v10,
719
   cris_none_reg_mode_jump_op},
720

    
721
  {"jmpu",    0x8930, 0x72c0,                   "S",             0, SIZE_NONE,
722
   cris_ver_v10,
723
   cris_none_reg_mode_jump_op},
724

    
725
  {"lapc",    0x0970, 0x0680,                  "U,R",    0, SIZE_NONE,
726
   cris_ver_v32p,
727
   cris_not_implemented_op},
728

    
729
  {"lapc",    0x0D7F, 0x0280,                  "dn,R",    0, SIZE_FIX_32,
730
   cris_ver_v32p,
731
   cris_not_implemented_op},
732

    
733
  {"lapcq",   0x0970, 0x0680,                  "u,R",     0, SIZE_NONE,
734
   cris_ver_v32p,
735
   cris_addi_op},
736

    
737
  {"lsl",     0x04C0, 0x0B00,                  "m r,R",   0, SIZE_NONE,     0,
738
   cris_dstep_logshift_mstep_neg_not_op},
739

    
740
  {"lslq",    0x03c0, 0x0C20,                  "c,R",     0, SIZE_NONE,     0,
741
   cris_dstep_logshift_mstep_neg_not_op},
742

    
743
  {"lsr",     0x07C0, 0x0800,                  "m r,R",   0, SIZE_NONE,     0,
744
   cris_dstep_logshift_mstep_neg_not_op},
745

    
746
  {"lsrq",    0x03e0, 0x0C00,                  "c,R",     0, SIZE_NONE,     0,
747
   cris_dstep_logshift_mstep_neg_not_op},
748

    
749
  {"lz",      0x0730, 0x08C0,                  "r,R",     0, SIZE_NONE,
750
   cris_ver_v3p,
751
   cris_not_implemented_op},
752

    
753
  {"mcp",      0x07f0, 0x0800,                  "P,r",     0, SIZE_NONE,
754
   cris_ver_v32p,
755
   cris_not_implemented_op},
756

    
757
  {"move",    0x0640, 0x0980,                  "m r,R",   0, SIZE_NONE,     0,
758
   cris_reg_mode_add_sub_cmp_and_or_move_op},
759

    
760
  {"move",    0x0A40, 0x0180,                  "m s,R",   0, SIZE_FIELD,    0,
761
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
762

    
763
  {"move",    0x0A40, 0x0180,                  "m S,D",   0, SIZE_NONE,
764
   cris_ver_v0_10,
765
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
766

    
767
  {"move",    0x0630, 0x09c0,                  "r,P",     0, SIZE_NONE,     0,
768
   cris_move_to_preg_op},
769

    
770
  {"move",    0x0670, 0x0980,                  "P,r",     0, SIZE_NONE,     0,
771
   cris_reg_mode_move_from_preg_op},
772

    
773
  {"move",    0x0BC0, 0x0000,                  "m R,y",   0, SIZE_FIELD,    0,
774
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
775

    
776
  {"move",    0x0BC0, 0x0000,                  "m D,S",   0, SIZE_NONE,
777
   cris_ver_v0_10,
778
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
779

    
780
  {"move",
781
   MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
782
   "s,P",   0, SIZE_SPEC_REG, 0,
783
   cris_move_to_preg_op},
784

    
785
  {"move",    0x0A30, 0x01c0,                  "S,P",     0, SIZE_NONE,
786
   cris_ver_v0_10,
787
   cris_move_to_preg_op},
788

    
789
  {"move",    0x0A70, 0x0180,                  "P,y",     0, SIZE_SPEC_REG, 0,
790
   cris_none_reg_mode_move_from_preg_op},
791

    
792
  {"move",    0x0A70, 0x0180,                  "P,S",     0, SIZE_NONE,
793
   cris_ver_v0_10,
794
   cris_none_reg_mode_move_from_preg_op},
795

    
796
  {"move",    0x0B70, 0x0480,                  "r,T",     0, SIZE_NONE,
797
   cris_ver_v32p,
798
   cris_not_implemented_op},
799

    
800
  {"move",    0x0F70, 0x0080,                  "T,r",     0, SIZE_NONE,
801
   cris_ver_v32p,
802
   cris_not_implemented_op},
803

    
804
  {"movem",   0x0BF0, 0x0000,                  "R,y",     0, SIZE_FIX_32,   0,
805
   cris_move_reg_to_mem_movem_op},
806

    
807
  {"movem",   0x0BF0, 0x0000,                  "D,S",     0, SIZE_NONE,
808
   cris_ver_v0_10,
809
   cris_move_reg_to_mem_movem_op},
810

    
811
  {"movem",   0x0BB0, 0x0040,                  "s,R",     0, SIZE_FIX_32,   0,
812
   cris_move_mem_to_reg_movem_op},
813

    
814
  {"movem",   0x0BB0, 0x0040,                  "S,D",     0, SIZE_NONE,
815
   cris_ver_v0_10,
816
   cris_move_mem_to_reg_movem_op},
817

    
818
  {"moveq",   0x0240, 0x0D80,                  "i,R",     0, SIZE_NONE,     0,
819
   cris_quick_mode_and_cmp_move_or_op},
820

    
821
  {"movs",    0x0460, 0x0B80,                  "z r,R",   0, SIZE_NONE,     0,
822
   cris_reg_mode_add_sub_cmp_and_or_move_op},
823

    
824
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
825
  {"movs",    0x0860, 0x0380,                  "z s,R",   0, SIZE_FIELD,    0,
826
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
827

    
828
  {"movs",    0x0860, 0x0380,                  "z S,D",   0, SIZE_NONE,
829
   cris_ver_v0_10,
830
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
831

    
832
  {"movu",    0x0440, 0x0Ba0,                  "z r,R",   0, SIZE_NONE,     0,
833
   cris_reg_mode_add_sub_cmp_and_or_move_op},
834

    
835
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
836
  {"movu",    0x0840, 0x03a0,                  "z s,R",   0, SIZE_FIELD,    0,
837
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
838

    
839
  {"movu",    0x0840, 0x03a0,                  "z S,D",   0, SIZE_NONE,
840
   cris_ver_v0_10,
841
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
842

    
843
  {"mstep",   0x07f0, 0x0800,                  "r,R",     0, SIZE_NONE,
844
   cris_ver_v0_10,
845
   cris_dstep_logshift_mstep_neg_not_op},
846

    
847
  {"muls",    0x0d00, 0x02c0,                  "m r,R",   0, SIZE_NONE,
848
   cris_ver_v10p,
849
   cris_muls_op},
850

    
851
  {"mulu",    0x0900, 0x06c0,                  "m r,R",   0, SIZE_NONE,
852
   cris_ver_v10p,
853
   cris_mulu_op},
854

    
855
  {"neg",     0x0580, 0x0A40,                  "m r,R",   0, SIZE_NONE,     0,
856
   cris_dstep_logshift_mstep_neg_not_op},
857

    
858
  {"nop",     NOP_OPCODE, NOP_Z_BITS,          "",             0, SIZE_NONE,
859
   cris_ver_v0_10,
860
   cris_btst_nop_op},
861

    
862
  {"nop",     NOP_OPCODE_V32, NOP_Z_BITS_V32, "",    0, SIZE_NONE,
863
   cris_ver_v32p,
864
   cris_btst_nop_op},
865

    
866
  {"not",     0x8770, 0x7880,                  "r",             0, SIZE_NONE,     0,
867
   cris_dstep_logshift_mstep_neg_not_op},
868

    
869
  {"or",      0x0740, 0x0880,                  "m r,R",   0, SIZE_NONE,     0,
870
   cris_reg_mode_add_sub_cmp_and_or_move_op},
871

    
872
  {"or",      0x0B40, 0x0080,                  "m s,R",   0, SIZE_FIELD,    0,
873
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
874

    
875
  {"or",      0x0B40, 0x0080,                  "m S,D",   0, SIZE_NONE,
876
   cris_ver_v0_10,
877
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
878

    
879
  {"or",      0x0B40, 0x0480,                  "m S,R,r", 0, SIZE_NONE,
880
   cris_ver_v0_10,
881
   cris_three_operand_add_sub_cmp_and_or_op},
882

    
883
  {"orq",     0x0340, 0x0C80,                  "i,R",     0, SIZE_NONE,     0,
884
   cris_quick_mode_and_cmp_move_or_op},
885

    
886
  {"pop",     0x0E6E, 0x0191,                  "!R",             0, SIZE_NONE,
887
   cris_ver_v0_10,
888
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
889

    
890
  {"pop",     0x0e3e, 0x01c1,                  "!P",             0, SIZE_NONE,
891
   cris_ver_v0_10,
892
   cris_none_reg_mode_move_from_preg_op},
893

    
894
  {"push",    0x0FEE, 0x0011,                  "BR",             0, SIZE_NONE,
895
   cris_ver_v0_10,
896
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
897

    
898
  {"push",    0x0E7E, 0x0181,                  "BP",             0, SIZE_NONE,
899
   cris_ver_v0_10,
900
   cris_move_to_preg_op},
901

    
902
  {"rbf",     0x3b30, 0xc0c0,                  "y",             0, SIZE_NONE,
903
   cris_ver_v10,
904
   cris_not_implemented_op},
905

    
906
  {"rbf",     0x3b30, 0xc0c0,                  "S",             0, SIZE_NONE,
907
   cris_ver_v10,
908
   cris_not_implemented_op},
909

    
910
  {"rfe",     0x2930, 0xD6CF,                  "",             0, SIZE_NONE,
911
   cris_ver_v32p,
912
   cris_not_implemented_op},
913

    
914
  {"rfg",     0x4930, 0xB6CF,                  "",             0, SIZE_NONE,
915
   cris_ver_v32p,
916
   cris_not_implemented_op},
917

    
918
  {"rfn",     0x5930, 0xA6CF,                  "",             0, SIZE_NONE,
919
   cris_ver_v32p,
920
   cris_not_implemented_op},
921

    
922
  {"ret",     0xB67F, 0x4980,                  "",             1, SIZE_NONE,
923
   cris_ver_v0_10,
924
   cris_reg_mode_move_from_preg_op},
925

    
926
  {"ret",     0xB9F0, 0x460F,                  "",             1, SIZE_NONE,
927
   cris_ver_v32p,
928
   cris_reg_mode_move_from_preg_op},
929

    
930
  {"retb",    0xe67f, 0x1980,                  "",             1, SIZE_NONE,
931
   cris_ver_v0_10,
932
   cris_reg_mode_move_from_preg_op},
933

    
934
  {"rete",     0xA9F0, 0x560F,                  "",             1, SIZE_NONE,
935
   cris_ver_v32p,
936
   cris_reg_mode_move_from_preg_op},
937

    
938
  {"reti",    0xA67F, 0x5980,                  "",             1, SIZE_NONE,
939
   cris_ver_v0_10,
940
   cris_reg_mode_move_from_preg_op},
941

    
942
  {"retn",     0xC9F0, 0x360F,                  "",             1, SIZE_NONE,
943
   cris_ver_v32p,
944
   cris_reg_mode_move_from_preg_op},
945

    
946
  {"sbfs",    0x3b70, 0xc080,                  "y",             0, SIZE_NONE,
947
   cris_ver_v10,
948
   cris_not_implemented_op},
949

    
950
  {"sbfs",    0x3b70, 0xc080,                  "S",             0, SIZE_NONE,
951
   cris_ver_v10,
952
   cris_not_implemented_op},
953

    
954
  {"sa",
955
   0x0530+CC_A*0x1000,
956
   0x0AC0+(0xf-CC_A)*0x1000,                  "r",             0, SIZE_NONE,     0,
957
   cris_scc_op},
958

    
959
  {"ssb",
960
   0x0530+CC_EXT*0x1000,
961
   0x0AC0+(0xf-CC_EXT)*0x1000,                  "r",             0, SIZE_NONE,
962
   cris_ver_v32p,
963
   cris_scc_op},
964

    
965
  {"scc",
966
   0x0530+CC_CC*0x1000,
967
   0x0AC0+(0xf-CC_CC)*0x1000,                  "r",             0, SIZE_NONE,     0,
968
   cris_scc_op},
969

    
970
  {"scs",
971
   0x0530+CC_CS*0x1000,
972
   0x0AC0+(0xf-CC_CS)*0x1000,                  "r",             0, SIZE_NONE,     0,
973
   cris_scc_op},
974

    
975
  {"seq",
976
   0x0530+CC_EQ*0x1000,
977
   0x0AC0+(0xf-CC_EQ)*0x1000,                  "r",             0, SIZE_NONE,     0,
978
   cris_scc_op},
979

    
980
  {"setf",    0x05b0, 0x0A40,                  "f",             0, SIZE_NONE,     0,
981
   cris_ax_ei_setf_op},
982

    
983
  {"sfe",    0x3930, 0xC6CF,                  "",             0, SIZE_NONE,
984
   cris_ver_v32p,
985
   cris_not_implemented_op},
986

    
987
  /* Need to have "swf" in front of "sext" so it is the one displayed in
988
     disassembly.  */
989
  {"swf",
990
   0x0530+CC_EXT*0x1000,
991
   0x0AC0+(0xf-CC_EXT)*0x1000,                  "r",             0, SIZE_NONE,
992
   cris_ver_v10,
993
   cris_scc_op},
994

    
995
  {"sext",
996
   0x0530+CC_EXT*0x1000,
997
   0x0AC0+(0xf-CC_EXT)*0x1000,                  "r",             0, SIZE_NONE,
998
   cris_ver_v0_3,
999
   cris_scc_op},
1000

    
1001
  {"sge",
1002
   0x0530+CC_GE*0x1000,
1003
   0x0AC0+(0xf-CC_GE)*0x1000,                  "r",             0, SIZE_NONE,     0,
1004
   cris_scc_op},
1005

    
1006
  {"sgt",
1007
   0x0530+CC_GT*0x1000,
1008
   0x0AC0+(0xf-CC_GT)*0x1000,                  "r",             0, SIZE_NONE,     0,
1009
   cris_scc_op},
1010

    
1011
  {"shi",
1012
   0x0530+CC_HI*0x1000,
1013
   0x0AC0+(0xf-CC_HI)*0x1000,                  "r",             0, SIZE_NONE,     0,
1014
   cris_scc_op},
1015

    
1016
  {"shs",
1017
   0x0530+CC_HS*0x1000,
1018
   0x0AC0+(0xf-CC_HS)*0x1000,                  "r",             0, SIZE_NONE,     0,
1019
   cris_scc_op},
1020

    
1021
  {"sle",
1022
   0x0530+CC_LE*0x1000,
1023
   0x0AC0+(0xf-CC_LE)*0x1000,                  "r",             0, SIZE_NONE,     0,
1024
   cris_scc_op},
1025

    
1026
  {"slo",
1027
   0x0530+CC_LO*0x1000,
1028
   0x0AC0+(0xf-CC_LO)*0x1000,                  "r",             0, SIZE_NONE,     0,
1029
   cris_scc_op},
1030

    
1031
  {"sls",
1032
   0x0530+CC_LS*0x1000,
1033
   0x0AC0+(0xf-CC_LS)*0x1000,                  "r",             0, SIZE_NONE,     0,
1034
   cris_scc_op},
1035

    
1036
  {"slt",
1037
   0x0530+CC_LT*0x1000,
1038
   0x0AC0+(0xf-CC_LT)*0x1000,                  "r",             0, SIZE_NONE,     0,
1039
   cris_scc_op},
1040

    
1041
  {"smi",
1042
   0x0530+CC_MI*0x1000,
1043
   0x0AC0+(0xf-CC_MI)*0x1000,                  "r",             0, SIZE_NONE,     0,
1044
   cris_scc_op},
1045

    
1046
  {"sne",
1047
   0x0530+CC_NE*0x1000,
1048
   0x0AC0+(0xf-CC_NE)*0x1000,                  "r",             0, SIZE_NONE,     0,
1049
   cris_scc_op},
1050

    
1051
  {"spl",
1052
   0x0530+CC_PL*0x1000,
1053
   0x0AC0+(0xf-CC_PL)*0x1000,                  "r",             0, SIZE_NONE,     0,
1054
   cris_scc_op},
1055

    
1056
  {"sub",     0x0680, 0x0940,                  "m r,R",   0, SIZE_NONE,     0,
1057
   cris_reg_mode_add_sub_cmp_and_or_move_op},
1058

    
1059
  {"sub",     0x0a80, 0x0140,                  "m s,R",   0, SIZE_FIELD,    0,
1060
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1061

    
1062
  {"sub",     0x0a80, 0x0140,                  "m S,D",   0, SIZE_NONE,
1063
   cris_ver_v0_10,
1064
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1065

    
1066
  {"sub",     0x0a80, 0x0540,                  "m S,R,r", 0, SIZE_NONE,
1067
   cris_ver_v0_10,
1068
   cris_three_operand_add_sub_cmp_and_or_op},
1069

    
1070
  {"subq",    0x0280, 0x0d40,                  "I,R",     0, SIZE_NONE,     0,
1071
   cris_quick_mode_add_sub_op},
1072

    
1073
  {"subs",    0x04a0, 0x0b40,                  "z r,R",   0, SIZE_NONE,     0,
1074
   cris_reg_mode_add_sub_cmp_and_or_move_op},
1075

    
1076
  /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
1077
  {"subs",    0x08a0, 0x0340,                  "z s,R",   0, SIZE_FIELD,    0,
1078
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1079

    
1080
  {"subs",    0x08a0, 0x0340,                  "z S,D",   0, SIZE_NONE,
1081
   cris_ver_v0_10,
1082
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1083

    
1084
  {"subs",    0x08a0, 0x0740,                  "z S,R,r", 0, SIZE_NONE,
1085
   cris_ver_v0_10,
1086
   cris_three_operand_add_sub_cmp_and_or_op},
1087

    
1088
  {"subu",    0x0480, 0x0b60,                  "z r,R",   0, SIZE_NONE,     0,
1089
   cris_reg_mode_add_sub_cmp_and_or_move_op},
1090

    
1091
  /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
1092
  {"subu",    0x0880, 0x0360,                  "z s,R",   0, SIZE_FIELD,    0,
1093
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1094

    
1095
  {"subu",    0x0880, 0x0360,                  "z S,D",   0, SIZE_NONE,
1096
   cris_ver_v0_10,
1097
   cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1098

    
1099
  {"subu",    0x0880, 0x0760,                  "z S,R,r", 0, SIZE_NONE,
1100
   cris_ver_v0_10,
1101
   cris_three_operand_add_sub_cmp_and_or_op},
1102

    
1103
  {"svc",
1104
   0x0530+CC_VC*0x1000,
1105
   0x0AC0+(0xf-CC_VC)*0x1000,                  "r",             0, SIZE_NONE,     0,
1106
   cris_scc_op},
1107

    
1108
  {"svs",
1109
   0x0530+CC_VS*0x1000,
1110
   0x0AC0+(0xf-CC_VS)*0x1000,                  "r",             0, SIZE_NONE,     0,
1111
   cris_scc_op},
1112

    
1113
  /* The insn "swapn" is the same as "not" and will be disassembled as
1114
     such, but the swap* family of mnmonics are generally v8-and-higher
1115
     only, so count it in.  */
1116
  {"swapn",   0x8770, 0x7880,                  "r",             0, SIZE_NONE,
1117
   cris_ver_v8p,
1118
   cris_not_implemented_op},
1119

    
1120
  {"swapw",   0x4770, 0xb880,                  "r",             0, SIZE_NONE,
1121
   cris_ver_v8p,
1122
   cris_not_implemented_op},
1123

    
1124
  {"swapnw",  0xc770, 0x3880,                  "r",             0, SIZE_NONE,
1125
   cris_ver_v8p,
1126
   cris_not_implemented_op},
1127

    
1128
  {"swapb",   0x2770, 0xd880,                  "r",             0, SIZE_NONE,
1129
   cris_ver_v8p,
1130
   cris_not_implemented_op},
1131

    
1132
  {"swapnb",  0xA770, 0x5880,                  "r",             0, SIZE_NONE,
1133
   cris_ver_v8p,
1134
   cris_not_implemented_op},
1135

    
1136
  {"swapwb",  0x6770, 0x9880,                  "r",             0, SIZE_NONE,
1137
   cris_ver_v8p,
1138
   cris_not_implemented_op},
1139

    
1140
  {"swapnwb", 0xE770, 0x1880,                  "r",             0, SIZE_NONE,
1141
   cris_ver_v8p,
1142
   cris_not_implemented_op},
1143

    
1144
  {"swapr",   0x1770, 0xe880,                  "r",             0, SIZE_NONE,
1145
   cris_ver_v8p,
1146
   cris_not_implemented_op},
1147

    
1148
  {"swapnr",  0x9770, 0x6880,                  "r",             0, SIZE_NONE,
1149
   cris_ver_v8p,
1150
   cris_not_implemented_op},
1151

    
1152
  {"swapwr",  0x5770, 0xa880,                  "r",             0, SIZE_NONE,
1153
   cris_ver_v8p,
1154
   cris_not_implemented_op},
1155

    
1156
  {"swapnwr", 0xd770, 0x2880,                  "r",             0, SIZE_NONE,
1157
   cris_ver_v8p,
1158
   cris_not_implemented_op},
1159

    
1160
  {"swapbr",  0x3770, 0xc880,                  "r",             0, SIZE_NONE,
1161
   cris_ver_v8p,
1162
   cris_not_implemented_op},
1163

    
1164
  {"swapnbr", 0xb770, 0x4880,                  "r",             0, SIZE_NONE,
1165
   cris_ver_v8p,
1166
   cris_not_implemented_op},
1167

    
1168
  {"swapwbr", 0x7770, 0x8880,                  "r",             0, SIZE_NONE,
1169
   cris_ver_v8p,
1170
   cris_not_implemented_op},
1171

    
1172
  {"swapnwbr", 0xf770, 0x0880,                  "r",             0, SIZE_NONE,
1173
   cris_ver_v8p,
1174
   cris_not_implemented_op},
1175

    
1176
  {"test",    0x0640, 0x0980,                  "m D",     0, SIZE_NONE,
1177
   cris_ver_v0_10,
1178
   cris_reg_mode_test_op},
1179

    
1180
  {"test",    0x0b80, 0xf040,                  "m y",     0, SIZE_FIELD,    0,
1181
   cris_none_reg_mode_clear_test_op},
1182

    
1183
  {"test",    0x0b80, 0xf040,                  "m S",     0, SIZE_NONE,
1184
   cris_ver_v0_10,
1185
   cris_none_reg_mode_clear_test_op},
1186

    
1187
  {"xor",     0x07B0, 0x0840,                  "r,R",     0, SIZE_NONE,     0,
1188
   cris_xor_op},
1189

    
1190
  {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
1191
};
1192

    
1193
/* Condition-names, indexed by the CC_* numbers as found in cris.h. */
1194
const char * const
1195
cris_cc_strings[] =
1196
{
1197
  "hs",
1198
  "lo",
1199
  "ne",
1200
  "eq",
1201
  "vc",
1202
  "vs",
1203
  "pl",
1204
  "mi",
1205
  "ls",
1206
  "hi",
1207
  "ge",
1208
  "lt",
1209
  "gt",
1210
  "le",
1211
  "a",
1212
  /* This is a placeholder.  In v0, this would be "ext".  In v32, this
1213
     is "sb".  See cris_conds15.  */
1214
  "wf"
1215
};
1216

    
1217
/* Different names and semantics for condition 1111 (0xf).  */
1218
const struct cris_cond15 cris_cond15s[] =
1219
{
1220
  /* FIXME: In what version did condition "ext" disappear?  */
1221
  {"ext", cris_ver_v0_3},
1222
  {"wf", cris_ver_v10},
1223
  {"sb", cris_ver_v32p},
1224
  {NULL, 0}
1225
};
1226

    
1227

    
1228
/*
1229
 * Local variables:
1230
 * eval: (c-set-style "gnu")
1231
 * indent-tabs-mode: t
1232
 * End:
1233
 */
1234

    
1235

    
1236
/* No instruction will be disassembled longer than this.  In theory, and
1237
   in silicon, address prefixes can be cascaded.  In practice, cascading
1238
   is not used by GCC, and not supported by the assembler.  */
1239
#ifndef MAX_BYTES_PER_CRIS_INSN
1240
#define MAX_BYTES_PER_CRIS_INSN 8
1241
#endif
1242

    
1243
/* Whether or not to decode prefixes, folding it into the following
1244
   instruction.  FIXME: Make this optional later.  */
1245
#ifndef PARSE_PREFIX
1246
#define PARSE_PREFIX 1
1247
#endif
1248

    
1249
/* Sometimes we prefix all registers with this character.  */
1250
#define REGISTER_PREFIX_CHAR '$'
1251

    
1252
/* Whether or not to trace the following sequence:
1253
   sub* X,r%d
1254
   bound* Y,r%d
1255
   adds.w [pc+r%d.w],pc
1256

1257
   This is the assembly form of a switch-statement in C.
1258
   The "sub is optional.  If there is none, then X will be zero.
1259
   X is the value of the first case,
1260
   Y is the number of cases (including default).
1261

1262
   This results in case offsets printed on the form:
1263
    case N: -> case_address
1264
   where N is an estimation on the corresponding 'case' operand in C,
1265
   and case_address is where execution of that case continues after the
1266
   sequence presented above.
1267

1268
   The old style of output was to print the offsets as instructions,
1269
   which made it hard to follow "case"-constructs in the disassembly,
1270
   and caused a lot of annoying warnings about undefined instructions.
1271

1272
   FIXME: Make this optional later.  */
1273
#ifndef TRACE_CASE
1274
#define TRACE_CASE (disdata->trace_case)
1275
#endif
1276

    
1277
enum cris_disass_family
1278
 { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
1279

    
1280
/* Stored in the disasm_info->private_data member.  */
1281
struct cris_disasm_data
1282
{
1283
  /* Whether to print something less confusing if we find something
1284
     matching a switch-construct.  */
1285
  bfd_boolean trace_case;
1286

    
1287
  /* Whether this code is flagged as crisv32.  FIXME: Should be an enum
1288
     that includes "compatible".  */
1289
  enum cris_disass_family distype;
1290
};
1291

    
1292
/* Value of first element in switch.  */
1293
static long case_offset = 0;
1294

    
1295
/* How many more case-offsets to print.  */
1296
static long case_offset_counter = 0;
1297

    
1298
/* Number of case offsets.  */
1299
static long no_of_case_offsets = 0;
1300

    
1301
/* Candidate for next case_offset.  */
1302
static long last_immediate = 0;
1303

    
1304
static int cris_constraint
1305
  (const char *, unsigned, unsigned, struct cris_disasm_data *);
1306

    
1307
/* Parse disassembler options and store state in info.  FIXME: For the
1308
   time being, we abuse static variables.  */
1309

    
1310
static bfd_boolean
1311
cris_parse_disassembler_options (disassemble_info *info,
1312
                                 enum cris_disass_family distype)
1313
{
1314
  struct cris_disasm_data *disdata;
1315

    
1316
  info->private_data = calloc (1, sizeof (struct cris_disasm_data));
1317
  disdata = (struct cris_disasm_data *) info->private_data;
1318
  if (disdata == NULL)
1319
    return false;
1320

    
1321
  /* Default true.  */
1322
  disdata->trace_case
1323
    = (info->disassembler_options == NULL
1324
       || (strcmp (info->disassembler_options, "nocase") != 0));
1325

    
1326
  disdata->distype = distype;
1327
  return true;
1328
}
1329

    
1330
static const struct cris_spec_reg *
1331
spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
1332
{
1333
  int i;
1334

    
1335
  for (i = 0; cris_spec_regs[i].name != NULL; i++)
1336
    {
1337
      if (cris_spec_regs[i].number == sreg)
1338
        {
1339
          if (distype == cris_dis_v32)
1340
            switch (cris_spec_regs[i].applicable_version)
1341
              {
1342
              case cris_ver_warning:
1343
              case cris_ver_version_all:
1344
              case cris_ver_v3p:
1345
              case cris_ver_v8p:
1346
              case cris_ver_v10p:
1347
              case cris_ver_v32p:
1348
                /* No ambiguous sizes or register names with CRISv32.  */
1349
                if (cris_spec_regs[i].warning == NULL)
1350
                  return &cris_spec_regs[i];
1351
              default:
1352
                ;
1353
              }
1354
          else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
1355
            return &cris_spec_regs[i];
1356
        }
1357
    }
1358

    
1359
  return NULL;
1360
}
1361

    
1362
/* Return the number of bits in the argument.  */
1363

    
1364
static int
1365
number_of_bits (unsigned int val)
1366
{
1367
  int bits;
1368

    
1369
  for (bits = 0; val != 0; val &= val - 1)
1370
    bits++;
1371

    
1372
  return bits;
1373
}
1374

    
1375
/* Get an entry in the opcode-table.  */
1376

    
1377
static const struct cris_opcode *
1378
get_opcode_entry (unsigned int insn,
1379
                  unsigned int prefix_insn,
1380
                  struct cris_disasm_data *disdata)
1381
{
1382
  /* For non-prefixed insns, we keep a table of pointers, indexed by the
1383
     insn code.  Each entry is initialized when found to be NULL.  */
1384
  static const struct cris_opcode **opc_table = NULL;
1385

    
1386
  const struct cris_opcode *max_matchedp = NULL;
1387
  const struct cris_opcode **prefix_opc_table = NULL;
1388

    
1389
  /* We hold a table for each prefix that need to be handled differently.  */
1390
  static const struct cris_opcode **dip_prefixes = NULL;
1391
  static const struct cris_opcode **bdapq_m1_prefixes = NULL;
1392
  static const struct cris_opcode **bdapq_m2_prefixes = NULL;
1393
  static const struct cris_opcode **bdapq_m4_prefixes = NULL;
1394
  static const struct cris_opcode **rest_prefixes = NULL;
1395

    
1396
  /* Allocate and clear the opcode-table.  */
1397
  if (opc_table == NULL)
1398
    {
1399
      opc_table = g_malloc (65536 * sizeof (opc_table[0]));
1400

    
1401
      memset (opc_table, 0, 65536 * sizeof (const struct cris_opcode *));
1402

    
1403
      dip_prefixes
1404
        = g_malloc (65536 * sizeof (const struct cris_opcode **));
1405

    
1406
      memset (dip_prefixes, 0, 65536 * sizeof (dip_prefixes[0]));
1407

    
1408
      bdapq_m1_prefixes
1409
        = g_malloc (65536 * sizeof (const struct cris_opcode **));
1410

    
1411
      memset (bdapq_m1_prefixes, 0, 65536 * sizeof (bdapq_m1_prefixes[0]));
1412

    
1413
      bdapq_m2_prefixes
1414
        = g_malloc (65536 * sizeof (const struct cris_opcode **));
1415

    
1416
      memset (bdapq_m2_prefixes, 0, 65536 * sizeof (bdapq_m2_prefixes[0]));
1417

    
1418
      bdapq_m4_prefixes
1419
        = g_malloc (65536 * sizeof (const struct cris_opcode **));
1420

    
1421
      memset (bdapq_m4_prefixes, 0, 65536 * sizeof (bdapq_m4_prefixes[0]));
1422

    
1423
      rest_prefixes
1424
        = g_malloc (65536 * sizeof (const struct cris_opcode **));
1425

    
1426
      memset (rest_prefixes, 0, 65536 * sizeof (rest_prefixes[0]));
1427
    }
1428

    
1429
  /* Get the right table if this is a prefix.
1430
     This code is connected to cris_constraints in that it knows what
1431
     prefixes play a role in recognition of patterns; the necessary
1432
     state is reflected by which table is used.  If constraints
1433
     involving match or non-match of prefix insns are changed, then this
1434
     probably needs changing too.  */
1435
  if (prefix_insn != NO_CRIS_PREFIX)
1436
    {
1437
      const struct cris_opcode *popcodep
1438
        = (opc_table[prefix_insn] != NULL
1439
           ? opc_table[prefix_insn]
1440
           : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
1441

    
1442
      if (popcodep == NULL)
1443
        return NULL;
1444

    
1445
      if (popcodep->match == BDAP_QUICK_OPCODE)
1446
        {
1447
          /* Since some offsets are recognized with "push" macros, we
1448
             have to have different tables for them.  */
1449
          int offset = (prefix_insn & 255);
1450

    
1451
          if (offset > 127)
1452
            offset -= 256;
1453

    
1454
          switch (offset)
1455
            {
1456
            case -4:
1457
              prefix_opc_table = bdapq_m4_prefixes;
1458
              break;
1459

    
1460
            case -2:
1461
              prefix_opc_table = bdapq_m2_prefixes;
1462
              break;
1463

    
1464
            case -1:
1465
              prefix_opc_table = bdapq_m1_prefixes;
1466
              break;
1467

    
1468
            default:
1469
              prefix_opc_table = rest_prefixes;
1470
              break;
1471
            }
1472
        }
1473
      else if (popcodep->match == DIP_OPCODE)
1474
        /* We don't allow postincrement when the prefix is DIP, so use a
1475
           different table for DIP.  */
1476
        prefix_opc_table = dip_prefixes;
1477
      else
1478
        prefix_opc_table = rest_prefixes;
1479
    }
1480

    
1481
  if (prefix_insn != NO_CRIS_PREFIX
1482
      && prefix_opc_table[insn] != NULL)
1483
    max_matchedp = prefix_opc_table[insn];
1484
  else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
1485
    max_matchedp = opc_table[insn];
1486
  else
1487
    {
1488
      const struct cris_opcode *opcodep;
1489
      int max_level_of_match = -1;
1490

    
1491
      for (opcodep = cris_opcodes;
1492
           opcodep->name != NULL;
1493
           opcodep++)
1494
        {
1495
          int level_of_match;
1496

    
1497
          if (disdata->distype == cris_dis_v32)
1498
            {
1499
              switch (opcodep->applicable_version)
1500
                {
1501
                case cris_ver_version_all:
1502
                  break;
1503

    
1504
                case cris_ver_v0_3:
1505
                case cris_ver_v0_10:
1506
                case cris_ver_v3_10:
1507
                case cris_ver_sim_v0_10:
1508
                case cris_ver_v8_10:
1509
                case cris_ver_v10:
1510
                case cris_ver_warning:
1511
                  continue;
1512

    
1513
                case cris_ver_v3p:
1514
                case cris_ver_v8p:
1515
                case cris_ver_v10p:
1516
                case cris_ver_v32p:
1517
                  break;
1518

    
1519
                case cris_ver_v8:
1520
                  abort ();
1521
                default:
1522
                  abort ();
1523
                }
1524
            }
1525
          else
1526
            {
1527
              switch (opcodep->applicable_version)
1528
                {
1529
                case cris_ver_version_all:
1530
                case cris_ver_v0_3:
1531
                case cris_ver_v3p:
1532
                case cris_ver_v0_10:
1533
                case cris_ver_v8p:
1534
                case cris_ver_v8_10:
1535
                case cris_ver_v10:
1536
                case cris_ver_sim_v0_10:
1537
                case cris_ver_v10p:
1538
                case cris_ver_warning:
1539
                  break;
1540

    
1541
                case cris_ver_v32p:
1542
                  continue;
1543

    
1544
                case cris_ver_v8:
1545
                  abort ();
1546
                default:
1547
                  abort ();
1548
                }
1549
            }
1550

    
1551
          /* We give a double lead for bits matching the template in
1552
             cris_opcodes.  Not even, because then "move p8,r10" would
1553
             be given 2 bits lead over "clear.d r10".  When there's a
1554
             tie, the first entry in the table wins.  This is
1555
             deliberate, to avoid a more complicated recognition
1556
             formula.  */
1557
          if ((opcodep->match & insn) == opcodep->match
1558
              && (opcodep->lose & insn) == 0
1559
              && ((level_of_match
1560
                   = cris_constraint (opcodep->args,
1561
                                      insn,
1562
                                      prefix_insn,
1563
                                      disdata))
1564
                  >= 0)
1565
              && ((level_of_match
1566
                   += 2 * number_of_bits (opcodep->match
1567
                                          | opcodep->lose))
1568
                          > max_level_of_match))
1569
                    {
1570
                      max_matchedp = opcodep;
1571
                      max_level_of_match = level_of_match;
1572

    
1573
                      /* If there was a full match, never mind looking
1574
                         further.  */
1575
                      if (level_of_match >= 2 * 16)
1576
                        break;
1577
                    }
1578
                }
1579
      /* Fill in the new entry.
1580

1581
         If there are changes to the opcode-table involving prefixes, and
1582
         disassembly then does not work correctly, try removing the
1583
         else-clause below that fills in the prefix-table.  If that
1584
         helps, you need to change the prefix_opc_table setting above, or
1585
         something related.  */
1586
      if (prefix_insn == NO_CRIS_PREFIX)
1587
        opc_table[insn] = max_matchedp;
1588
      else
1589
        prefix_opc_table[insn] = max_matchedp;
1590
    }
1591

    
1592
  return max_matchedp;
1593
}
1594

    
1595
/* Return -1 if the constraints of a bitwise-matched instruction say
1596
   that there is no match.  Otherwise return a nonnegative number
1597
   indicating the confidence in the match (higher is better).  */
1598

    
1599
static int
1600
cris_constraint (const char *cs,
1601
                 unsigned int insn,
1602
                 unsigned int prefix_insn,
1603
                 struct cris_disasm_data *disdata)
1604
{
1605
  int retval = 0;
1606
  int tmp;
1607
  int prefix_ok = 0;
1608
  const char *s;
1609

    
1610
  for (s = cs; *s; s++)
1611
    switch (*s)
1612
      {
1613
      case '!':
1614
        /* Do not recognize "pop" if there's a prefix and then only for
1615
           v0..v10.  */
1616
        if (prefix_insn != NO_CRIS_PREFIX
1617
            || disdata->distype != cris_dis_v0_v10)
1618
          return -1;
1619
        break;
1620

    
1621
      case 'U':
1622
        /* Not recognized at disassembly.  */
1623
        return -1;
1624

    
1625
      case 'M':
1626
        /* Size modifier for "clear", i.e. special register 0, 4 or 8.
1627
           Check that it is one of them.  Only special register 12 could
1628
           be mismatched, but checking for matches is more logical than
1629
           checking for mismatches when there are only a few cases.  */
1630
        tmp = ((insn >> 12) & 0xf);
1631
        if (tmp != 0 && tmp != 4 && tmp != 8)
1632
          return -1;
1633
        break;
1634

    
1635
      case 'm':
1636
        if ((insn & 0x30) == 0x30)
1637
          return -1;
1638
        break;
1639

    
1640
      case 'S':
1641
        /* A prefix operand without side-effect.  */
1642
        if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
1643
          {
1644
            prefix_ok = 1;
1645
            break;
1646
          }
1647
        else
1648
          return -1;
1649

    
1650
      case 's':
1651
      case 'y':
1652
      case 'Y':
1653
        /* If this is a prefixed insn with postincrement (side-effect),
1654
           the prefix must not be DIP.  */
1655
        if (prefix_insn != NO_CRIS_PREFIX)
1656
          {
1657
            if (insn & 0x400)
1658
              {
1659
                const struct cris_opcode *prefix_opcodep
1660
                  = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1661

    
1662
                if (prefix_opcodep->match == DIP_OPCODE)
1663
                  return -1;
1664
              }
1665

    
1666
            prefix_ok = 1;
1667
          }
1668
        break;
1669

    
1670
      case 'B':
1671
        /* If we don't fall through, then the prefix is ok.  */
1672
        prefix_ok = 1;
1673

    
1674
        /* A "push" prefix.  Check for valid "push" size.
1675
           In case of special register, it may be != 4.  */
1676
        if (prefix_insn != NO_CRIS_PREFIX)
1677
          {
1678
            /* Match the prefix insn to BDAPQ.  */
1679
            const struct cris_opcode *prefix_opcodep
1680
              = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
1681

    
1682
            if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
1683
              {
1684
                int pushsize = (prefix_insn & 255);
1685

    
1686
                if (pushsize > 127)
1687
                  pushsize -= 256;
1688

    
1689
                if (s[1] == 'P')
1690
                  {
1691
                    unsigned int spec_reg = (insn >> 12) & 15;
1692
                    const struct cris_spec_reg *sregp
1693
                      = spec_reg_info (spec_reg, disdata->distype);
1694

    
1695
                    /* For a special-register, the "prefix size" must
1696
                       match the size of the register.  */
1697
                    if (sregp && sregp->reg_size == (unsigned int) -pushsize)
1698
                      break;
1699
                  }
1700
                else if (s[1] == 'R')
1701
                  {
1702
                    if ((insn & 0x30) == 0x20 && pushsize == -4)
1703
                      break;
1704
                  }
1705
                /* FIXME:  Should abort here; next constraint letter
1706
                   *must* be 'P' or 'R'.  */
1707
              }
1708
          }
1709
        return -1;
1710

    
1711
      case 'D':
1712
        retval = (((insn >> 12) & 15) == (insn & 15));
1713
        if (!retval)
1714
          return -1;
1715
        else
1716
          retval += 4;
1717
        break;
1718

    
1719
      case 'P':
1720
        {
1721
          const struct cris_spec_reg *sregp
1722
            = spec_reg_info ((insn >> 12) & 15, disdata->distype);
1723

    
1724
          /* Since we match four bits, we will give a value of 4-1 = 3
1725
             in a match.  If there is a corresponding exact match of a
1726
             special register in another pattern, it will get a value of
1727
             4, which will be higher.  This should be correct in that an
1728
             exact pattern would match better than a general pattern.
1729

1730
             Note that there is a reason for not returning zero; the
1731
             pattern for "clear" is partly  matched in the bit-pattern
1732
             (the two lower bits must be zero), while the bit-pattern
1733
             for a move from a special register is matched in the
1734
             register constraint.  */
1735

    
1736
          if (sregp != NULL)
1737
            {
1738
              retval += 3;
1739
              break;
1740
            }
1741
          else
1742
            return -1;
1743
        }
1744
      }
1745

    
1746
  if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
1747
    return -1;
1748

    
1749
  return retval;
1750
}
1751

    
1752
/* Format number as hex with a leading "0x" into outbuffer.  */
1753

    
1754
static char *
1755
format_hex (unsigned long number,
1756
            char *outbuffer,
1757
            struct cris_disasm_data *disdata)
1758
{
1759
  /* Truncate negative numbers on >32-bit hosts.  */
1760
  number &= 0xffffffff;
1761

    
1762
  sprintf (outbuffer, "0x%lx", number);
1763

    
1764
  /* Save this value for the "case" support.  */
1765
  if (TRACE_CASE)
1766
    last_immediate = number;
1767

    
1768
  return outbuffer + strlen (outbuffer);
1769
}
1770

    
1771
/* Format number as decimal into outbuffer.  Parameter signedp says
1772
   whether the number should be formatted as signed (!= 0) or
1773
   unsigned (== 0).  */
1774

    
1775
static char *
1776
format_dec (long number, char *outbuffer, int signedp)
1777
{
1778
  last_immediate = number;
1779
  sprintf (outbuffer, signedp ? "%ld" : "%lu", number);
1780

    
1781
  return outbuffer + strlen (outbuffer);
1782
}
1783

    
1784
/* Format the name of the general register regno into outbuffer.  */
1785

    
1786
static char *
1787
format_reg (struct cris_disasm_data *disdata,
1788
            int regno,
1789
            char *outbuffer_start,
1790
            bfd_boolean with_reg_prefix)
1791
{
1792
  char *outbuffer = outbuffer_start;
1793

    
1794
  if (with_reg_prefix)
1795
    *outbuffer++ = REGISTER_PREFIX_CHAR;
1796

    
1797
  switch (regno)
1798
    {
1799
    case 15:
1800
      /* For v32, there is no context in which we output PC.  */
1801
      if (disdata->distype == cris_dis_v32)
1802
        strcpy (outbuffer, "acr");
1803
      else
1804
        strcpy (outbuffer, "pc");
1805
      break;
1806

    
1807
    case 14:
1808
      strcpy (outbuffer, "sp");
1809
      break;
1810

    
1811
    default:
1812
      sprintf (outbuffer, "r%d", regno);
1813
      break;
1814
    }
1815

    
1816
  return outbuffer_start + strlen (outbuffer_start);
1817
}
1818

    
1819
/* Format the name of a support register into outbuffer.  */
1820

    
1821
static char *
1822
format_sup_reg (unsigned int regno,
1823
                char *outbuffer_start,
1824
                bfd_boolean with_reg_prefix)
1825
{
1826
  char *outbuffer = outbuffer_start;
1827
  int i;
1828

    
1829
  if (with_reg_prefix)
1830
    *outbuffer++ = REGISTER_PREFIX_CHAR;
1831

    
1832
  for (i = 0; cris_support_regs[i].name != NULL; i++)
1833
    if (cris_support_regs[i].number == regno)
1834
      {
1835
        sprintf (outbuffer, "%s", cris_support_regs[i].name);
1836
        return outbuffer_start + strlen (outbuffer_start);
1837
      }
1838

    
1839
  /* There's supposed to be register names covering all numbers, though
1840
     some may be generic names.  */
1841
  sprintf (outbuffer, "format_sup_reg-BUG");
1842
  return outbuffer_start + strlen (outbuffer_start);
1843
}
1844

    
1845
/* Return the length of an instruction.  */
1846

    
1847
static unsigned
1848
bytes_to_skip (unsigned int insn,
1849
               const struct cris_opcode *matchedp,
1850
               enum cris_disass_family distype,
1851
               const struct cris_opcode *prefix_matchedp)
1852
{
1853
  /* Each insn is a word plus "immediate" operands.  */
1854
  unsigned to_skip = 2;
1855
  const char *template = matchedp->args;
1856
  const char *s;
1857

    
1858
  for (s = template; *s; s++)
1859
    if ((*s == 's' || *s == 'N' || *s == 'Y')
1860
        && (insn & 0x400) && (insn & 15) == 15
1861
        && prefix_matchedp == NULL)
1862
      {
1863
        /* Immediate via [pc+], so we have to check the size of the
1864
           operand.  */
1865
        int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
1866

    
1867
        if (matchedp->imm_oprnd_size == SIZE_FIX_32)
1868
          to_skip += 4;
1869
        else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
1870
          {
1871
            const struct cris_spec_reg *sregp
1872
              = spec_reg_info ((insn >> 12) & 15, distype);
1873

    
1874
            /* FIXME: Improve error handling; should have been caught
1875
               earlier.  */
1876
            if (sregp == NULL)
1877
              return 2;
1878

    
1879
            /* PC is incremented by two, not one, for a byte.  Except on
1880
               CRISv32, where constants are always DWORD-size for
1881
               special registers.  */
1882
            to_skip +=
1883
              distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
1884
          }
1885
        else
1886
          to_skip += (mode_size + 1) & ~1;
1887
      }
1888
    else if (*s == 'n')
1889
      to_skip += 4;
1890
    else if (*s == 'b')
1891
      to_skip += 2;
1892

    
1893
  return to_skip;
1894
}
1895

    
1896
/* Print condition code flags.  */
1897

    
1898
static char *
1899
print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
1900
{
1901
  /* Use the v8 (Etrax 100) flag definitions for disassembly.
1902
     The differences with v0 (Etrax 1..4) vs. Svinto are:
1903
      v0 'd' <=> v8 'm'
1904
      v0 'e' <=> v8 'b'.
1905
     FIXME: Emit v0..v3 flag names somehow.  */
1906
  static const char v8_fnames[] = "cvznxibm";
1907
  static const char v32_fnames[] = "cvznxiup";
1908
  const char *fnames
1909
    = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
1910

    
1911
  unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
1912
  int i;
1913

    
1914
  for (i = 0; i < 8; i++)
1915
    if (flagbits & (1 << i))
1916
      *cp++ = fnames[i];
1917

    
1918
  return cp;
1919
}
1920

    
1921
/* Print out an insn with its operands, and update the info->insn_type
1922
   fields.  The prefix_opcodep and the rest hold a prefix insn that is
1923
   supposed to be output as an address mode.  */
1924

    
1925
static void
1926
print_with_operands (const struct cris_opcode *opcodep,
1927
                     unsigned int insn,
1928
                     unsigned char *buffer,
1929
                     bfd_vma addr,
1930
                     disassemble_info *info,
1931
                     /* If a prefix insn was before this insn (and is supposed
1932
                        to be output as an address), here is a description of
1933
                        it.  */
1934
                     const struct cris_opcode *prefix_opcodep,
1935
                     unsigned int prefix_insn,
1936
                     unsigned char *prefix_buffer,
1937
                     bfd_boolean with_reg_prefix)
1938
{
1939
  /* Get a buffer of somewhat reasonable size where we store
1940
     intermediate parts of the insn.  */
1941
  char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
1942
  char *tp = temp;
1943
  static const char mode_char[] = "bwd?";
1944
  const char *s;
1945
  const char *cs;
1946
  struct cris_disasm_data *disdata
1947
    = (struct cris_disasm_data *) info->private_data;
1948

    
1949
  /* Print out the name first thing we do.  */
1950
  (*info->fprintf_func) (info->stream, "%s", opcodep->name);
1951

    
1952
  cs = opcodep->args;
1953
  s = cs;
1954

    
1955
  /* Ignore any prefix indicator.  */
1956
  if (*s == 'p')
1957
    s++;
1958

    
1959
  if (*s == 'm' || *s == 'M' || *s == 'z')
1960
    {
1961
      *tp++ = '.';
1962

    
1963
      /* Get the size-letter.  */
1964
      *tp++ = *s == 'M'
1965
        ? (insn & 0x8000 ? 'd'
1966
           : insn & 0x4000 ? 'w' : 'b')
1967
        : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
1968

    
1969
      /* Ignore the size and the space character that follows.  */
1970
      s += 2;
1971
    }
1972

    
1973
  /* Add a space if this isn't a long-branch, because for those will add
1974
     the condition part of the name later.  */
1975
  if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
1976
    *tp++ = ' ';
1977

    
1978
  /* Fill in the insn-type if deducible from the name (and there's no
1979
     better way).  */
1980
  if (opcodep->name[0] == 'j')
1981
    {
1982
      if (CONST_STRNEQ (opcodep->name, "jsr"))
1983
        /* It's "jsr" or "jsrc".  */
1984
        info->insn_type = dis_jsr;
1985
      else
1986
        /* Any other jump-type insn is considered a branch.  */
1987
        info->insn_type = dis_branch;
1988
    }
1989

    
1990
  /* We might know some more fields right now.  */
1991
  info->branch_delay_insns = opcodep->delayed;
1992

    
1993
  /* Handle operands.  */
1994
  for (; *s; s++)
1995
    {
1996
    switch (*s)
1997
      {
1998
      case 'T':
1999
        tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
2000
        break;
2001

    
2002
      case 'A':
2003
        if (with_reg_prefix)
2004
          *tp++ = REGISTER_PREFIX_CHAR;
2005
        *tp++ = 'a';
2006
        *tp++ = 'c';
2007
        *tp++ = 'r';
2008
        break;
2009

    
2010
      case '[':
2011
      case ']':
2012
      case ',':
2013
        *tp++ = *s;
2014
        break;
2015

    
2016
      case '!':
2017
        /* Ignore at this point; used at earlier stages to avoid
2018
           recognition if there's a prefix at something that in other
2019
           ways looks like a "pop".  */
2020
        break;
2021

    
2022
      case 'd':
2023
        /* Ignore.  This is an optional ".d " on the large one of
2024
           relaxable insns.  */
2025
        break;
2026

    
2027
      case 'B':
2028
        /* This was the prefix that made this a "push".  We've already
2029
           handled it by recognizing it, so signal that the prefix is
2030
           handled by setting it to NULL.  */
2031
        prefix_opcodep = NULL;
2032
        break;
2033

    
2034
      case 'D':
2035
      case 'r':
2036
        tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2037
        break;
2038

    
2039
      case 'R':
2040
        tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2041
        break;
2042

    
2043
      case 'n':
2044
        {
2045
          /* Like N but pc-relative to the start of the insn.  */
2046
          unsigned long number
2047
            = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2048
               + buffer[5] * 0x1000000 + addr);
2049

    
2050
          /* Finish off and output previous formatted bytes.  */
2051
          *tp = 0;
2052
          if (temp[0])
2053
            (*info->fprintf_func) (info->stream, "%s", temp);
2054
          tp = temp;
2055

    
2056
          (*info->print_address_func) ((bfd_vma) number, info);
2057
        }
2058
        break;
2059

    
2060
      case 'u':
2061
        {
2062
          /* Like n but the offset is bits <3:0> in the instruction.  */
2063
          unsigned long number = (buffer[0] & 0xf) * 2 + addr;
2064

    
2065
          /* Finish off and output previous formatted bytes.  */
2066
          *tp = 0;
2067
          if (temp[0])
2068
            (*info->fprintf_func) (info->stream, "%s", temp);
2069
          tp = temp;
2070

    
2071
          (*info->print_address_func) ((bfd_vma) number, info);
2072
        }
2073
        break;
2074

    
2075
      case 'N':
2076
      case 'y':
2077
      case 'Y':
2078
      case 'S':
2079
      case 's':
2080
        /* Any "normal" memory operand.  */
2081
        if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
2082
          {
2083
            /* We're looking at [pc+], i.e. we need to output an immediate
2084
               number, where the size can depend on different things.  */
2085
            long number;
2086
            int signedp
2087
              = ((*cs == 'z' && (insn & 0x20))
2088
                 || opcodep->match == BDAP_QUICK_OPCODE);
2089
            int nbytes;
2090

    
2091
            if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2092
              nbytes = 4;
2093
            else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2094
              {
2095
                const struct cris_spec_reg *sregp
2096
                  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2097

    
2098
                /* A NULL return should have been as a non-match earlier,
2099
                   so catch it as an internal error in the error-case
2100
                   below.  */
2101
                if (sregp == NULL)
2102
                  /* Whatever non-valid size.  */
2103
                  nbytes = 42;
2104
                else
2105
                  /* PC is always incremented by a multiple of two.
2106
                     For CRISv32, immediates are always 4 bytes for
2107
                     special registers.  */
2108
                  nbytes = disdata->distype == cris_dis_v32
2109
                    ? 4 : (sregp->reg_size + 1) & ~1;
2110
              }
2111
            else
2112
              {
2113
                int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
2114

    
2115
                if (mode_size == 1)
2116
                  nbytes = 2;
2117
                else
2118
                  nbytes = mode_size;
2119
              }
2120

    
2121
            switch (nbytes)
2122
              {
2123
              case 1:
2124
                number = buffer[2];
2125
                if (signedp && number > 127)
2126
                  number -= 256;
2127
                break;
2128

    
2129
              case 2:
2130
                number = buffer[2] + buffer[3] * 256;
2131
                if (signedp && number > 32767)
2132
                  number -= 65536;
2133
                break;
2134

    
2135
              case 4:
2136
                number
2137
                  = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
2138
                  + buffer[5] * 0x1000000;
2139
                break;
2140

    
2141
              default:
2142
                strcpy (tp, "bug");
2143
                tp += 3;
2144
                number = 42;
2145
              }
2146

    
2147
            if ((*cs == 'z' && (insn & 0x20))
2148
                || (opcodep->match == BDAP_QUICK_OPCODE
2149
                    && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
2150
              tp = format_dec (number, tp, signedp);
2151
            else
2152
              {
2153
                unsigned int highbyte = (number >> 24) & 0xff;
2154

    
2155
                /* Either output this as an address or as a number.  If it's
2156
                   a dword with the same high-byte as the address of the
2157
                   insn, assume it's an address, and also if it's a non-zero
2158
                   non-0xff high-byte.  If this is a jsr or a jump, then
2159
                   it's definitely an address.  */
2160
                if (nbytes == 4
2161
                    && (highbyte == ((addr >> 24) & 0xff)
2162
                        || (highbyte != 0 && highbyte != 0xff)
2163
                        || info->insn_type == dis_branch
2164
                        || info->insn_type == dis_jsr))
2165
                  {
2166
                    /* Finish off and output previous formatted bytes.  */
2167
                    *tp = 0;
2168
                    tp = temp;
2169
                    if (temp[0])
2170
                      (*info->fprintf_func) (info->stream, "%s", temp);
2171

    
2172
                    (*info->print_address_func) ((bfd_vma) number, info);
2173

    
2174
                    info->target = number;
2175
                  }
2176
                else
2177
                  tp = format_hex (number, tp, disdata);
2178
              }
2179
          }
2180
        else
2181
          {
2182
            /* Not an immediate number.  Then this is a (possibly
2183
               prefixed) memory operand.  */
2184
            if (info->insn_type != dis_nonbranch)
2185
              {
2186
                int mode_size
2187
                  = 1 << ((insn >> 4)
2188
                          & (opcodep->args[0] == 'z' ? 1 : 3));
2189
                int size;
2190
                info->insn_type = dis_dref;
2191
                info->flags |= CRIS_DIS_FLAG_MEMREF;
2192

    
2193
                if (opcodep->imm_oprnd_size == SIZE_FIX_32)
2194
                  size = 4;
2195
                else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
2196
                  {
2197
                    const struct cris_spec_reg *sregp
2198
                      = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2199

    
2200
                    /* FIXME: Improve error handling; should have been caught
2201
                       earlier.  */
2202
                    if (sregp == NULL)
2203
                      size = 4;
2204
                    else
2205
                      size = sregp->reg_size;
2206
                  }
2207
                else
2208
                  size = mode_size;
2209

    
2210
                info->data_size = size;
2211
              }
2212

    
2213
            *tp++ = '[';
2214

    
2215
            if (prefix_opcodep
2216
                /* We don't match dip with a postincremented field
2217
                   as a side-effect address mode.  */
2218
                && ((insn & 0x400) == 0
2219
                    || prefix_opcodep->match != DIP_OPCODE))
2220
              {
2221
                if (insn & 0x400)
2222
                  {
2223
                    tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2224
                    *tp++ = '=';
2225
                  }
2226

    
2227

    
2228
                /* We mainly ignore the prefix format string when the
2229
                   address-mode syntax is output.  */
2230
                switch (prefix_opcodep->match)
2231
                  {
2232
                  case DIP_OPCODE:
2233
                    /* It's [r], [r+] or [pc+].  */
2234
                    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2235
                      {
2236
                        /* It's [pc+].  This cannot possibly be anything
2237
                           but an address.  */
2238
                        unsigned long number
2239
                          = prefix_buffer[2] + prefix_buffer[3] * 256
2240
                          + prefix_buffer[4] * 65536
2241
                          + prefix_buffer[5] * 0x1000000;
2242

    
2243
                        info->target = (bfd_vma) number;
2244

    
2245
                        /* Finish off and output previous formatted
2246
                           data.  */
2247
                        *tp = 0;
2248
                        tp = temp;
2249
                        if (temp[0])
2250
                          (*info->fprintf_func) (info->stream, "%s", temp);
2251

    
2252
                        (*info->print_address_func) ((bfd_vma) number, info);
2253
                      }
2254
                    else
2255
                      {
2256
                        /* For a memref in an address, we use target2.
2257
                           In this case, target is zero.  */
2258
                        info->flags
2259
                          |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2260
                              | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
2261

    
2262
                        info->target2 = prefix_insn & 15;
2263

    
2264
                        *tp++ = '[';
2265
                        tp = format_reg (disdata, prefix_insn & 15, tp,
2266
                                         with_reg_prefix);
2267
                        if (prefix_insn & 0x400)
2268
                          *tp++ = '+';
2269
                        *tp++ = ']';
2270
                      }
2271
                    break;
2272

    
2273
                  case BDAP_QUICK_OPCODE:
2274
                    {
2275
                      int number;
2276

    
2277
                      number = prefix_buffer[0];
2278
                      if (number > 127)
2279
                        number -= 256;
2280

    
2281
                      /* Output "reg+num" or, if num < 0, "reg-num".  */
2282
                      tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2283
                                       with_reg_prefix);
2284
                      if (number >= 0)
2285
                        *tp++ = '+';
2286
                      tp = format_dec (number, tp, 1);
2287

    
2288
                      info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2289
                      info->target = (prefix_insn >> 12) & 15;
2290
                      info->target2 = (bfd_vma) number;
2291
                      break;
2292
                    }
2293

    
2294
                  case BIAP_OPCODE:
2295
                    /* Output "r+R.m".  */
2296
                    tp = format_reg (disdata, prefix_insn & 15, tp,
2297
                                     with_reg_prefix);
2298
                    *tp++ = '+';
2299
                    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2300
                                     with_reg_prefix);
2301
                    *tp++ = '.';
2302
                    *tp++ = mode_char[(prefix_insn >> 4) & 3];
2303

    
2304
                    info->flags
2305
                      |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2306
                          | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2307

    
2308
                          | ((prefix_insn & 0x8000)
2309
                             ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
2310
                             : ((prefix_insn & 0x8000)
2311
                                ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
2312

    
2313
                    /* Is it the casejump?  It's a "adds.w [pc+r%d.w],pc".  */
2314
                    if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
2315
                      /* Then start interpreting data as offsets.  */
2316
                      case_offset_counter = no_of_case_offsets;
2317
                    break;
2318

    
2319
                  case BDAP_INDIR_OPCODE:
2320
                    /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
2321
                       "r-s".  */
2322
                    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
2323
                                     with_reg_prefix);
2324

    
2325
                    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
2326
                      {
2327
                        long number;
2328
                        unsigned int nbytes;
2329

    
2330
                        /* It's a value.  Get its size.  */
2331
                        int mode_size = 1 << ((prefix_insn >> 4) & 3);
2332

    
2333
                        if (mode_size == 1)
2334
                          nbytes = 2;
2335
                        else
2336
                          nbytes = mode_size;
2337

    
2338
                        switch (nbytes)
2339
                          {
2340
                          case 1:
2341
                            number = prefix_buffer[2];
2342
                            if (number > 127)
2343
                              number -= 256;
2344
                            break;
2345

    
2346
                          case 2:
2347
                            number = prefix_buffer[2] + prefix_buffer[3] * 256;
2348
                            if (number > 32767)
2349
                              number -= 65536;
2350
                            break;
2351

    
2352
                          case 4:
2353
                            number
2354
                              = prefix_buffer[2] + prefix_buffer[3] * 256
2355
                              + prefix_buffer[4] * 65536
2356
                              + prefix_buffer[5] * 0x1000000;
2357
                            break;
2358

    
2359
                          default:
2360
                            strcpy (tp, "bug");
2361
                            tp += 3;
2362
                            number = 42;
2363
                          }
2364

    
2365
                        info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2366
                        info->target2 = (bfd_vma) number;
2367

    
2368
                        /* If the size is dword, then assume it's an
2369
                           address.  */
2370
                        if (nbytes == 4)
2371
                          {
2372
                            /* Finish off and output previous formatted
2373
                               bytes.  */
2374
                            *tp++ = '+';
2375
                            *tp = 0;
2376
                            tp = temp;
2377
                            (*info->fprintf_func) (info->stream, "%s", temp);
2378

    
2379
                            (*info->print_address_func) ((bfd_vma) number, info);
2380
                          }
2381
                        else
2382
                          {
2383
                            if (number >= 0)
2384
                              *tp++ = '+';
2385
                            tp = format_dec (number, tp, 1);
2386
                          }
2387
                      }
2388
                    else
2389
                      {
2390
                        /* Output "r+[R].m" or "r+[R+].m".  */
2391
                        *tp++ = '+';
2392
                        *tp++ = '[';
2393
                        tp = format_reg (disdata, prefix_insn & 15, tp,
2394
                                         with_reg_prefix);
2395
                        if (prefix_insn & 0x400)
2396
                          *tp++ = '+';
2397
                        *tp++ = ']';
2398
                        *tp++ = '.';
2399
                        *tp++ = mode_char[(prefix_insn >> 4) & 3];
2400

    
2401
                        info->flags
2402
                          |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
2403
                              | CRIS_DIS_FLAG_MEM_TARGET2_MEM
2404
                              | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
2405

    
2406
                              | (((prefix_insn >> 4) == 2)
2407
                                 ? 0
2408
                                 : (((prefix_insn >> 4) & 3) == 1
2409
                                    ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
2410
                                    : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
2411
                      }
2412
                    break;
2413

    
2414
                  default:
2415
                    (*info->fprintf_func) (info->stream, "?prefix-bug");
2416
                  }
2417

    
2418
                /* To mark that the prefix is used, reset it.  */
2419
                prefix_opcodep = NULL;
2420
              }
2421
            else
2422
              {
2423
                tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
2424

    
2425
                info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
2426
                info->target = insn & 15;
2427

    
2428
                if (insn & 0x400)
2429
                  *tp++ = '+';
2430
              }
2431
            *tp++ = ']';
2432
          }
2433
        break;
2434

    
2435
      case 'x':
2436
        tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2437
        *tp++ = '.';
2438
        *tp++ = mode_char[(insn >> 4) & 3];
2439
        break;
2440

    
2441
      case 'I':
2442
        tp = format_dec (insn & 63, tp, 0);
2443
        break;
2444

    
2445
      case 'b':
2446
        {
2447
          int where = buffer[2] + buffer[3] * 256;
2448

    
2449
          if (where > 32767)
2450
            where -= 65536;
2451

    
2452
          where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
2453

    
2454
          if (insn == BA_PC_INCR_OPCODE)
2455
            info->insn_type = dis_branch;
2456
          else
2457
            info->insn_type = dis_condbranch;
2458

    
2459
          info->target = (bfd_vma) where;
2460

    
2461
          *tp = 0;
2462
          tp = temp;
2463
          (*info->fprintf_func) (info->stream, "%s%s ",
2464
                                 temp, cris_cc_strings[insn >> 12]);
2465

    
2466
          (*info->print_address_func) ((bfd_vma) where, info);
2467
        }
2468
      break;
2469

    
2470
    case 'c':
2471
      tp = format_dec (insn & 31, tp, 0);
2472
      break;
2473

    
2474
    case 'C':
2475
      tp = format_dec (insn & 15, tp, 0);
2476
      break;
2477

    
2478
    case 'o':
2479
      {
2480
        long offset = insn & 0xfe;
2481
        bfd_vma target;
2482

    
2483
        if (insn & 1)
2484
          offset |= ~0xff;
2485

    
2486
        if (opcodep->match == BA_QUICK_OPCODE)
2487
          info->insn_type = dis_branch;
2488
        else
2489
          info->insn_type = dis_condbranch;
2490

    
2491
        target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
2492
        info->target = target;
2493
        *tp = 0;
2494
        tp = temp;
2495
        (*info->fprintf_func) (info->stream, "%s", temp);
2496
        (*info->print_address_func) (target, info);
2497
      }
2498
      break;
2499

    
2500
    case 'Q':
2501
    case 'O':
2502
      {
2503
        long number = buffer[0];
2504

    
2505
        if (number > 127)
2506
          number = number - 256;
2507

    
2508
        tp = format_dec (number, tp, 1);
2509
        *tp++ = ',';
2510
        tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
2511
      }
2512
      break;
2513

    
2514
    case 'f':
2515
      tp = print_flags (disdata, insn, tp);
2516
      break;
2517

    
2518
    case 'i':
2519
      tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
2520
      break;
2521

    
2522
    case 'P':
2523
      {
2524
        const struct cris_spec_reg *sregp
2525
          = spec_reg_info ((insn >> 12) & 15, disdata->distype);
2526

    
2527
        if (sregp->name == NULL)
2528
          /* Should have been caught as a non-match eariler.  */
2529
          *tp++ = '?';
2530
        else
2531
          {
2532
            if (with_reg_prefix)
2533
              *tp++ = REGISTER_PREFIX_CHAR;
2534
            strcpy (tp, sregp->name);
2535
            tp += strlen (tp);
2536
          }
2537
      }
2538
      break;
2539

    
2540
    default:
2541
      strcpy (tp, "???");
2542
      tp += 3;
2543
    }
2544
  }
2545

    
2546
  *tp = 0;
2547

    
2548
  if (prefix_opcodep)
2549
    (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
2550
                           prefix_opcodep->name, prefix_opcodep->args);
2551

    
2552
  (*info->fprintf_func) (info->stream, "%s", temp);
2553

    
2554
  /* Get info for matching case-tables, if we don't have any active.
2555
     We assume that the last constant seen is used; either in the insn
2556
     itself or in a "move.d const,rN, sub.d rN,rM"-like sequence.  */
2557
  if (TRACE_CASE && case_offset_counter == 0)
2558
    {
2559
      if (CONST_STRNEQ (opcodep->name, "sub"))
2560
        case_offset = last_immediate;
2561

    
2562
      /* It could also be an "add", if there are negative case-values.  */
2563
      else if (CONST_STRNEQ (opcodep->name, "add"))
2564
        /* The first case is the negated operand to the add.  */
2565
        case_offset = -last_immediate;
2566

    
2567
      /* A bound insn will tell us the number of cases.  */
2568
      else if (CONST_STRNEQ (opcodep->name, "bound"))
2569
        no_of_case_offsets = last_immediate + 1;
2570

    
2571
      /* A jump or jsr or branch breaks the chain of insns for a
2572
         case-table, so assume default first-case again.  */
2573
      else if (info->insn_type == dis_jsr
2574
               || info->insn_type == dis_branch
2575
               || info->insn_type == dis_condbranch)
2576
        case_offset = 0;
2577
    }
2578
}
2579

    
2580

    
2581
/* Print the CRIS instruction at address memaddr on stream.  Returns
2582
   length of the instruction, in bytes.  Prefix register names with `$' if
2583
   WITH_REG_PREFIX.  */
2584

    
2585
static int
2586
print_insn_cris_generic (bfd_vma memaddr,
2587
                         disassemble_info *info,
2588
                         bfd_boolean with_reg_prefix)
2589
{
2590
  int nbytes;
2591
  unsigned int insn;
2592
  const struct cris_opcode *matchedp;
2593
  int advance = 0;
2594
  struct cris_disasm_data *disdata
2595
    = (struct cris_disasm_data *) info->private_data;
2596

    
2597
  /* No instruction will be disassembled as longer than this number of
2598
     bytes; stacked prefixes will not be expanded.  */
2599
  unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
2600
  unsigned char *bufp;
2601
  int status = 0;
2602
  bfd_vma addr;
2603

    
2604
  /* There will be an "out of range" error after the last instruction.
2605
     Reading pairs of bytes in decreasing number, we hope that we will get
2606
     at least the amount that we will consume.
2607

2608
     If we can't get any data, or we do not get enough data, we print
2609
     the error message.  */
2610

    
2611
  nbytes = info->buffer_length;
2612
  if (nbytes > MAX_BYTES_PER_CRIS_INSN)
2613
          nbytes = MAX_BYTES_PER_CRIS_INSN;
2614
  status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);  
2615

    
2616
  /* If we did not get all we asked for, then clear the rest.
2617
     Hopefully this makes a reproducible result in case of errors.  */
2618
  if (nbytes != MAX_BYTES_PER_CRIS_INSN)
2619
    memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
2620

    
2621
  addr = memaddr;
2622
  bufp = buffer;
2623

    
2624
  /* Set some defaults for the insn info.  */
2625
  info->insn_info_valid = 1;
2626
  info->branch_delay_insns = 0;
2627
  info->data_size = 0;
2628
  info->insn_type = dis_nonbranch;
2629
  info->flags = 0;
2630
  info->target = 0;
2631
  info->target2 = 0;
2632

    
2633
  /* If we got any data, disassemble it.  */
2634
  if (nbytes != 0)
2635
    {
2636
      matchedp = NULL;
2637

    
2638
      insn = bufp[0] + bufp[1] * 256;
2639

    
2640
      /* If we're in a case-table, don't disassemble the offsets.  */
2641
      if (TRACE_CASE && case_offset_counter != 0)
2642
        {
2643
          info->insn_type = dis_noninsn;
2644
          advance += 2;
2645

    
2646
          /* If to print data as offsets, then shortcut here.  */
2647
          (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
2648
                                 case_offset + no_of_case_offsets
2649
                                 - case_offset_counter,
2650
                                 case_offset_counter == 1 ? "/default" :
2651
                                 "");
2652

    
2653
          (*info->print_address_func) ((bfd_vma)
2654
                                       ((short) (insn)
2655
                                        + (long) (addr
2656
                                                  - (no_of_case_offsets
2657
                                                     - case_offset_counter)
2658
                                                  * 2)), info);
2659
          case_offset_counter--;
2660

    
2661
          /* The default case start (without a "sub" or "add") must be
2662
             zero.  */
2663
          if (case_offset_counter == 0)
2664
            case_offset = 0;
2665
        }
2666
      else if (insn == 0)
2667
        {
2668
          /* We're often called to disassemble zeroes.  While this is a
2669
             valid "bcc .+2" insn, it is also useless enough and enough
2670
             of a nuiscance that we will just output "bcc .+2" for it
2671
             and signal it as a noninsn.  */
2672
          (*info->fprintf_func) (info->stream,
2673
                                 disdata->distype == cris_dis_v32
2674
                                 ? "bcc ." : "bcc .+2");
2675
          info->insn_type = dis_noninsn;
2676
          advance += 2;
2677
        }
2678
      else
2679
        {
2680
          const struct cris_opcode *prefix_opcodep = NULL;
2681
          unsigned char *prefix_buffer = bufp;
2682
          unsigned int prefix_insn = insn;
2683
          int prefix_size = 0;
2684

    
2685
          matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
2686

    
2687
          /* Check if we're supposed to write out prefixes as address
2688
             modes and if this was a prefix.  */
2689
          if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
2690
            {
2691
              /* If it's a prefix, put it into the prefix vars and get the
2692
                 main insn.  */
2693
              prefix_size = bytes_to_skip (prefix_insn, matchedp,
2694
                                           disdata->distype, NULL);
2695
              prefix_opcodep = matchedp;
2696

    
2697
              insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
2698
              matchedp = get_opcode_entry (insn, prefix_insn, disdata);
2699

    
2700
              if (matchedp != NULL)
2701
                {
2702
                  addr += prefix_size;
2703
                  bufp += prefix_size;
2704
                  advance += prefix_size;
2705
                }
2706
              else
2707
                {
2708
                  /* The "main" insn wasn't valid, at least not when
2709
                     prefixed.  Put back things enough to output the
2710
                     prefix insn only, as a normal insn.  */
2711
                  matchedp = prefix_opcodep;
2712
                  insn = prefix_insn;
2713
                  prefix_opcodep = NULL;
2714
                }
2715
            }
2716

    
2717
          if (matchedp == NULL)
2718
            {
2719
              (*info->fprintf_func) (info->stream, "??0x%x", insn);
2720
              advance += 2;
2721

    
2722
              info->insn_type = dis_noninsn;
2723
            }
2724
          else
2725
            {
2726
              advance
2727
                += bytes_to_skip (insn, matchedp, disdata->distype,
2728
                                  prefix_opcodep);
2729

    
2730
              /* The info_type and assorted fields will be set according
2731
                 to the operands.   */
2732
              print_with_operands (matchedp, insn, bufp, addr, info,
2733
                                   prefix_opcodep, prefix_insn,
2734
                                   prefix_buffer, with_reg_prefix);
2735
            }
2736
        }
2737
    }
2738
  else
2739
    info->insn_type = dis_noninsn;
2740

    
2741
  /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
2742
     status when reading that much, and the insn decoding indicated a
2743
     length exceeding what we read, there is an error.  */
2744
  if (status != 0 && (nbytes == 0 || advance > nbytes))
2745
    {
2746
      (*info->memory_error_func) (status, memaddr, info);
2747
      return -1;
2748
    }
2749

    
2750
  /* Max supported insn size with one folded prefix insn.  */
2751
  info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
2752

    
2753
  /* I would like to set this to a fixed value larger than the actual
2754
     number of bytes to print in order to avoid spaces between bytes,
2755
     but objdump.c (2.9.1) does not like that, so we print 16-bit
2756
     chunks, which is the next choice.  */
2757
  info->bytes_per_chunk = 2;
2758

    
2759
  /* Printing bytes in order of increasing addresses makes sense,
2760
     especially on a little-endian target.
2761
     This is completely the opposite of what you think; setting this to
2762
     BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
2763
     we want.  */
2764
  info->display_endian = BFD_ENDIAN_BIG;
2765

    
2766
  return advance;
2767
}
2768

    
2769
/* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
2770
static int
2771
print_insn_cris_with_register_prefix (bfd_vma vma,
2772
                                      disassemble_info *info)
2773
{
2774
  if (info->private_data == NULL
2775
      && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2776
    return -1;
2777
  return print_insn_cris_generic (vma, info, true);
2778
}
2779
/* Disassemble, prefixing register names with `$'.  CRIS v32.  */
2780

    
2781
static int
2782
print_insn_crisv32_with_register_prefix (bfd_vma vma,
2783
                                         disassemble_info *info)
2784
{
2785
  if (info->private_data == NULL
2786
      && !cris_parse_disassembler_options (info, cris_dis_v32))
2787
    return -1;
2788
  return print_insn_cris_generic (vma, info, true);
2789
}
2790

    
2791
#if 0
2792
/* Disassemble, prefixing register names with `$'.
2793
   Common v10 and v32 subset.  */
2794

2795
static int
2796
print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
2797
                                             disassemble_info *info)
2798
{
2799
  if (info->private_data == NULL
2800
      && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2801
    return -1;
2802
  return print_insn_cris_generic (vma, info, true);
2803
}
2804

2805
/* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
2806

2807
static int
2808
print_insn_cris_without_register_prefix (bfd_vma vma,
2809
                                         disassemble_info *info)
2810
{
2811
  if (info->private_data == NULL
2812
      && !cris_parse_disassembler_options (info, cris_dis_v0_v10))
2813
    return -1;
2814
  return print_insn_cris_generic (vma, info, false);
2815
}
2816

2817
/* Disassemble, no prefixes on register names.  CRIS v32.  */
2818

2819
static int
2820
print_insn_crisv32_without_register_prefix (bfd_vma vma,
2821
                                            disassemble_info *info)
2822
{
2823
  if (info->private_data == NULL
2824
      && !cris_parse_disassembler_options (info, cris_dis_v32))
2825
    return -1;
2826
  return print_insn_cris_generic (vma, info, false);
2827
}
2828

2829
/* Disassemble, no prefixes on register names.
2830
   Common v10 and v32 subset.  */
2831

2832
static int
2833
print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
2834
                                                disassemble_info *info)
2835
{
2836
  if (info->private_data == NULL
2837
      && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32))
2838
    return -1;
2839
  return print_insn_cris_generic (vma, info, false);
2840
}
2841
#endif
2842

    
2843
int
2844
print_insn_crisv10 (bfd_vma vma,
2845
                    disassemble_info *info)
2846
{
2847
  return print_insn_cris_with_register_prefix(vma, info);
2848
}
2849

    
2850
int
2851
print_insn_crisv32 (bfd_vma vma,
2852
                    disassemble_info *info)
2853
{
2854
  return print_insn_crisv32_with_register_prefix(vma, info);
2855
}
2856

    
2857
/* Return a disassembler-function that prints registers with a `$' prefix,
2858
   or one that prints registers without a prefix.
2859
   FIXME: We should improve the solution to avoid the multitude of
2860
   functions seen above.  */
2861
#if 0
2862
disassembler_ftype
2863
cris_get_disassembler (bfd *abfd)
2864
{
2865
  /* If there's no bfd in sight, we return what is valid as input in all
2866
     contexts if fed back to the assembler: disassembly *with* register
2867
     prefix.  Unfortunately this will be totally wrong for v32.  */
2868
  if (abfd == NULL)
2869
    return print_insn_cris_with_register_prefix;
2870

2871
  if (bfd_get_symbol_leading_char (abfd) == 0)
2872
    {
2873
      if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2874
        return print_insn_crisv32_with_register_prefix;
2875
      if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2876
        return print_insn_crisv10_v32_with_register_prefix;
2877

2878
      /* We default to v10.  This may be specifically specified in the
2879
         bfd mach, but is also the default setting.  */
2880
      return print_insn_cris_with_register_prefix;
2881
    }
2882

2883
  if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
2884
    return print_insn_crisv32_without_register_prefix;
2885
  if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
2886
    return print_insn_crisv10_v32_without_register_prefix;
2887
  return print_insn_cris_without_register_prefix;
2888
}
2889
#endif
2890
/* Local variables:
2891
   eval: (c-set-style "gnu")
2892
   indent-tabs-mode: t
2893
   End:  */