1
/* cris-opc.c -- Table of opcodes for the CRIS processor.
2
Copyright 2000, 2001, 2004, 2005, 2007 Free Software Foundation, Inc.
3
Contributed by Axis Communications AB, Lund, Sweden.
4
Originally written for GAS 1.38.1 by Mikael Asker.
5
Reorganized by Hans-Peter Nilsson.
7
This file is part of the GNU opcodes library.
9
This library is free software; you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation; either version 3, or (at your option)
14
It is distributed in the hope that it will be useful, but WITHOUT
15
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17
License for more details.
19
You should have received a copy of the GNU General Public License
20
along with this program; if not, write to the Free Software
21
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22
MA 02110-1301, USA. */
24
#include "opcode/cris.h"
30
/* This table isn't used for CRISv32 and the size of immediate operands. */
31
const struct cris_spec_reg
34
{"bz", 0, 1, cris_ver_v32p, NULL},
35
{"p0", 0, 1, 0, NULL},
36
{"vr", 1, 1, 0, NULL},
37
{"p1", 1, 1, 0, NULL},
38
{"pid", 2, 1, cris_ver_v32p, NULL},
39
{"p2", 2, 1, cris_ver_v32p, NULL},
40
{"p2", 2, 1, cris_ver_warning, NULL},
41
{"srs", 3, 1, cris_ver_v32p, NULL},
42
{"p3", 3, 1, cris_ver_v32p, NULL},
43
{"p3", 3, 1, cris_ver_warning, NULL},
44
{"wz", 4, 2, cris_ver_v32p, NULL},
45
{"p4", 4, 2, 0, NULL},
46
{"ccr", 5, 2, cris_ver_v0_10, NULL},
47
{"exs", 5, 4, cris_ver_v32p, NULL},
48
{"p5", 5, 2, cris_ver_v0_10, NULL},
49
{"p5", 5, 4, cris_ver_v32p, NULL},
50
{"dcr0",6, 2, cris_ver_v0_3, NULL},
51
{"eda", 6, 4, cris_ver_v32p, NULL},
52
{"p6", 6, 2, cris_ver_v0_3, NULL},
53
{"p6", 6, 4, cris_ver_v32p, NULL},
54
{"dcr1/mof", 7, 4, cris_ver_v10p,
55
"Register `dcr1/mof' with ambiguous size specified. Guessing 4 bytes"},
56
{"dcr1/mof", 7, 2, cris_ver_v0_3,
57
"Register `dcr1/mof' with ambiguous size specified. Guessing 2 bytes"},
58
{"mof", 7, 4, cris_ver_v10p, NULL},
59
{"dcr1",7, 2, cris_ver_v0_3, NULL},
60
{"p7", 7, 4, cris_ver_v10p, NULL},
61
{"p7", 7, 2, cris_ver_v0_3, NULL},
62
{"dz", 8, 4, cris_ver_v32p, NULL},
63
{"p8", 8, 4, 0, NULL},
64
{"ibr", 9, 4, cris_ver_v0_10, NULL},
65
{"ebp", 9, 4, cris_ver_v32p, NULL},
66
{"p9", 9, 4, 0, NULL},
67
{"irp", 10, 4, cris_ver_v0_10, NULL},
68
{"erp", 10, 4, cris_ver_v32p, NULL},
69
{"p10", 10, 4, 0, NULL},
70
{"srp", 11, 4, 0, NULL},
71
{"p11", 11, 4, 0, NULL},
72
/* For disassembly use only. Accept at assembly with a warning. */
73
{"bar/dtp0", 12, 4, cris_ver_warning,
74
"Ambiguous register `bar/dtp0' specified"},
75
{"nrp", 12, 4, cris_ver_v32p, NULL},
76
{"bar", 12, 4, cris_ver_v8_10, NULL},
77
{"dtp0",12, 4, cris_ver_v0_3, NULL},
78
{"p12", 12, 4, 0, NULL},
79
/* For disassembly use only. Accept at assembly with a warning. */
80
{"dccr/dtp1",13, 4, cris_ver_warning,
81
"Ambiguous register `dccr/dtp1' specified"},
82
{"ccs", 13, 4, cris_ver_v32p, NULL},
83
{"dccr",13, 4, cris_ver_v8_10, NULL},
84
{"dtp1",13, 4, cris_ver_v0_3, NULL},
85
{"p13", 13, 4, 0, NULL},
86
{"brp", 14, 4, cris_ver_v3_10, NULL},
87
{"usp", 14, 4, cris_ver_v32p, NULL},
88
{"p14", 14, 4, cris_ver_v3p, NULL},
89
{"usp", 15, 4, cris_ver_v10, NULL},
90
{"spc", 15, 4, cris_ver_v32p, NULL},
91
{"p15", 15, 4, cris_ver_v10p, NULL},
92
{NULL, 0, 0, cris_ver_version_all, NULL}
95
/* Add version specifiers to this table when necessary.
96
The (now) regular coding of register names suggests a simpler
98
const struct cris_support_reg cris_support_regs[] =
119
/* All CRIS opcodes are 16 bits.
121
- The match component is a mask saying which bits must match a
122
particular opcode in order for an instruction to be an instance
125
- The args component is a string containing characters symbolically
126
matching the operands of an instruction. Used for both assembly
129
Operand-matching characters:
132
A The string "ACR" (case-insensitive).
133
B Not really an operand. It causes a "BDAP -size,SP" prefix to be
134
output for the PUSH alias-instructions and recognizes a push-
135
prefix at disassembly. This letter isn't recognized for v32.
136
Must be followed by a R or P letter.
137
! Non-match pattern, will not match if there's a prefix insn.
138
b Non-matching operand, used for branches with 16-bit
139
displacement. Only recognized by the disassembler.
140
c 5-bit unsigned immediate in bits <4:0>.
141
C 4-bit unsigned immediate in bits <3:0>.
142
d At assembly, optionally (as in put other cases before this one)
143
".d" or ".D" at the start of the operands, followed by one space
144
character. At disassembly, nothing.
145
D General register in bits <15:12> and <3:0>.
146
f List of flags in bits <15:12> and <3:0>.
147
i 6-bit signed immediate in bits <5:0>.
148
I 6-bit unsigned immediate in bits <5:0>.
149
M Size modifier (B, W or D) for CLEAR instructions.
150
m Size modifier (B, W or D) in bits <5:4>
151
N A 32-bit dword, like in the difference between s and y.
152
This has no effect on bits in the opcode. Can also be expressed
154
n As N, but PC-relative (to the start of the instruction).
155
o [-128..127] word offset in bits <7:1> and <0>. Used by 8-bit
157
O [-128..127] offset in bits <7:0>. Also matches a comma and a
158
general register after the expression, in bits <15:12>. Used
159
only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
160
P Special register in bits <15:12>.
161
p Indicates that the insn is a prefix insn. Must be first
163
Q As O, but don't relax; force an 8-bit offset.
164
R General register in bits <15:12>.
165
r General register in bits <3:0>.
166
S Source operand in bit <10> and a prefix; a 3-operand prefix
168
s Source operand in bits <10> and <3:0>, optionally with a
169
side-effect prefix, except [pc] (the name, not R15 as in ACR)
170
isn't allowed for v32 and higher.
171
T Support register in bits <15:12>.
172
u 4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
173
U Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
174
Not recognized at disassembly.
175
x Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
176
y Like 's' but do not allow an integer at assembly.
177
Y The difference s-y; only an integer is allowed.
178
z Size modifier (B or W) in bit <4>. */
181
/* Please note the order of the opcodes in this table is significant.
182
The assembler requires that all instances of the same mnemonic must
183
be consecutive. If they aren't, the assembler might not recognize
184
them, or may indicate an internal error.
186
The disassembler should not normally care about the order of the
187
opcodes, but will prefer an earlier alternative if the "match-score"
188
(see cris-dis.c) is computed as equal.
190
It should not be significant for proper execution that this table is
191
in alphabetical order, but please follow that convention for an easy
194
const struct cris_opcode
197
{"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE, 0,
200
{"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE, 0,
201
cris_reg_mode_add_sub_cmp_and_or_move_op},
203
{"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD, 0,
204
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
206
{"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE,
208
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
210
{"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE,
212
cris_three_operand_add_sub_cmp_and_or_op},
214
{"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD,
216
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
218
{"addc", 0x0570, 0x0A80, "r,R", 0, SIZE_FIX_32,
220
cris_not_implemented_op},
222
{"addc", 0x09A0, 0x0250, "s,R", 0, SIZE_FIX_32,
224
cris_not_implemented_op},
226
{"addi", 0x0540, 0x0A80, "x,r,A", 0, SIZE_NONE,
230
{"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE, 0,
233
/* This collates after "addo", but we want to disassemble as "addoq",
235
{"addoq", 0x0100, 0x0E00, "Q,A", 0, SIZE_NONE,
237
cris_not_implemented_op},
239
{"addo", 0x0940, 0x0280, "m s,R,A", 0, SIZE_FIELD_SIGNED,
241
cris_not_implemented_op},
243
/* This must be located after the insn above, lest we misinterpret
244
"addo.b -1,r0,acr" as "addo .b-1,r0,acr". FIXME: Sounds like a
246
{"addo", 0x0100, 0x0E00, "O,A", 0, SIZE_NONE,
248
cris_not_implemented_op},
250
{"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE, 0,
251
cris_quick_mode_add_sub_op},
253
{"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE, 0,
254
cris_reg_mode_add_sub_cmp_and_or_move_op},
256
/* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
257
{"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD, 0,
258
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
260
{"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE,
262
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
264
{"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE,
266
cris_three_operand_add_sub_cmp_and_or_op},
268
{"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE, 0,
269
cris_reg_mode_add_sub_cmp_and_or_move_op},
271
/* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
272
{"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD, 0,
273
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
275
{"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE,
277
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
279
{"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE,
281
cris_three_operand_add_sub_cmp_and_or_op},
283
{"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE, 0,
284
cris_reg_mode_add_sub_cmp_and_or_move_op},
286
{"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD, 0,
287
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
289
{"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE,
291
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
293
{"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE,
295
cris_three_operand_add_sub_cmp_and_or_op},
297
{"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE, 0,
298
cris_quick_mode_and_cmp_move_or_op},
300
{"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE, 0,
303
{"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE, 0,
306
{"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE, 0,
309
/* FIXME: Should use branch #defines. */
310
{"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE, 0,
311
cris_sixteen_bit_offset_branch_op},
315
0x0F00+(0xF-CC_A)*0x1000, "o", 1, SIZE_NONE, 0,
316
cris_eight_bit_offset_branch_op},
318
/* Needs to come after the usual "ba o", which might be relaxed to
320
{"ba", BA_DWORD_OPCODE,
321
0xffff & (~BA_DWORD_OPCODE), "n", 0, SIZE_FIX_32,
323
cris_none_reg_mode_jump_op},
325
{"bas", 0x0EBF, 0x0140, "n,P", 0, SIZE_FIX_32,
327
cris_none_reg_mode_jump_op},
329
{"basc", 0x0EFF, 0x0100, "n,P", 0, SIZE_FIX_32,
331
cris_none_reg_mode_jump_op},
334
BRANCH_QUICK_OPCODE+CC_CC*0x1000,
335
0x0f00+(0xF-CC_CC)*0x1000, "o", 1, SIZE_NONE, 0,
336
cris_eight_bit_offset_branch_op},
339
BRANCH_QUICK_OPCODE+CC_CS*0x1000,
340
0x0f00+(0xF-CC_CS)*0x1000, "o", 1, SIZE_NONE, 0,
341
cris_eight_bit_offset_branch_op},
344
BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS, "pm s,R", 0, SIZE_FIELD_SIGNED,
349
BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS, "pO", 0, SIZE_NONE,
351
cris_quick_mode_bdap_prefix},
354
BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
355
0x0f00+(0xF-CC_EQ)*0x1000, "o", 1, SIZE_NONE, 0,
356
cris_eight_bit_offset_branch_op},
358
/* This is deliberately put before "bext" to trump it, even though not
359
in alphabetical order, since we don't do excluding version checks
362
BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
363
0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
365
cris_eight_bit_offset_branch_op},
368
BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
369
0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
371
cris_eight_bit_offset_branch_op},
374
BRANCH_QUICK_OPCODE+CC_GE*0x1000,
375
0x0f00+(0xF-CC_GE)*0x1000, "o", 1, SIZE_NONE, 0,
376
cris_eight_bit_offset_branch_op},
379
BRANCH_QUICK_OPCODE+CC_GT*0x1000,
380
0x0f00+(0xF-CC_GT)*0x1000, "o", 1, SIZE_NONE, 0,
381
cris_eight_bit_offset_branch_op},
384
BRANCH_QUICK_OPCODE+CC_HI*0x1000,
385
0x0f00+(0xF-CC_HI)*0x1000, "o", 1, SIZE_NONE, 0,
386
cris_eight_bit_offset_branch_op},
389
BRANCH_QUICK_OPCODE+CC_HS*0x1000,
390
0x0f00+(0xF-CC_HS)*0x1000, "o", 1, SIZE_NONE, 0,
391
cris_eight_bit_offset_branch_op},
393
{"biap", BIAP_OPCODE, BIAP_Z_BITS, "pm r,R", 0, SIZE_NONE,
398
BRANCH_QUICK_OPCODE+CC_LE*0x1000,
399
0x0f00+(0xF-CC_LE)*0x1000, "o", 1, SIZE_NONE, 0,
400
cris_eight_bit_offset_branch_op},
403
BRANCH_QUICK_OPCODE+CC_LO*0x1000,
404
0x0f00+(0xF-CC_LO)*0x1000, "o", 1, SIZE_NONE, 0,
405
cris_eight_bit_offset_branch_op},
408
BRANCH_QUICK_OPCODE+CC_LS*0x1000,
409
0x0f00+(0xF-CC_LS)*0x1000, "o", 1, SIZE_NONE, 0,
410
cris_eight_bit_offset_branch_op},
413
BRANCH_QUICK_OPCODE+CC_LT*0x1000,
414
0x0f00+(0xF-CC_LT)*0x1000, "o", 1, SIZE_NONE, 0,
415
cris_eight_bit_offset_branch_op},
418
BRANCH_QUICK_OPCODE+CC_MI*0x1000,
419
0x0f00+(0xF-CC_MI)*0x1000, "o", 1, SIZE_NONE, 0,
420
cris_eight_bit_offset_branch_op},
422
{"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32,
424
cris_not_implemented_op},
426
{"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE,
428
cris_not_implemented_op},
430
{"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE,
432
cris_not_implemented_op},
435
BRANCH_QUICK_OPCODE+CC_NE*0x1000,
436
0x0f00+(0xF-CC_NE)*0x1000, "o", 1, SIZE_NONE, 0,
437
cris_eight_bit_offset_branch_op},
439
{"bound", 0x05c0, 0x0A00, "m r,R", 0, SIZE_NONE, 0,
440
cris_two_operand_bound_op},
441
/* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
442
{"bound", 0x09c0, 0x0200, "m s,R", 0, SIZE_FIELD,
444
cris_two_operand_bound_op},
445
/* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
446
{"bound", 0x0dcf, 0x0200, "m Y,R", 0, SIZE_FIELD, 0,
447
cris_two_operand_bound_op},
448
{"bound", 0x09c0, 0x0200, "m S,D", 0, SIZE_NONE,
450
cris_two_operand_bound_op},
451
{"bound", 0x09c0, 0x0600, "m S,R,r", 0, SIZE_NONE,
453
cris_three_operand_bound_op},
456
BRANCH_QUICK_OPCODE+CC_PL*0x1000,
457
0x0f00+(0xF-CC_PL)*0x1000, "o", 1, SIZE_NONE, 0,
458
cris_eight_bit_offset_branch_op},
460
{"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE,
465
BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
466
0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
468
cris_eight_bit_offset_branch_op},
470
{"bsr", 0xBEBF, 0x4140, "n", 0, SIZE_FIX_32,
472
cris_none_reg_mode_jump_op},
474
{"bsrc", 0xBEFF, 0x4100, "n", 0, SIZE_FIX_32,
476
cris_none_reg_mode_jump_op},
478
{"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32,
480
cris_not_implemented_op},
482
{"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE,
484
cris_not_implemented_op},
486
{"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE,
488
cris_not_implemented_op},
490
{"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE, 0,
492
{"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE, 0,
496
BRANCH_QUICK_OPCODE+CC_VC*0x1000,
497
0x0f00+(0xF-CC_VC)*0x1000, "o", 1, SIZE_NONE, 0,
498
cris_eight_bit_offset_branch_op},
501
BRANCH_QUICK_OPCODE+CC_VS*0x1000,
502
0x0f00+(0xF-CC_VS)*0x1000, "o", 1, SIZE_NONE, 0,
503
cris_eight_bit_offset_branch_op},
505
{"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE, 0,
506
cris_reg_mode_clear_op},
508
{"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE, 0,
509
cris_none_reg_mode_clear_test_op},
511
{"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE,
513
cris_none_reg_mode_clear_test_op},
515
{"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE, 0,
518
{"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE, 0,
519
cris_reg_mode_add_sub_cmp_and_or_move_op},
521
{"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD, 0,
522
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
524
{"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE,
526
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
528
{"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE, 0,
529
cris_quick_mode_and_cmp_move_or_op},
531
/* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
532
{"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD, 0,
533
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
535
{"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE,
537
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
539
/* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
540
{"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD, 0,
541
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
543
{"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE,
545
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
547
{"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE, 0,
550
{"dip", DIP_OPCODE, DIP_Z_BITS, "ps", 0, SIZE_FIX_32,
554
{"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD, 0,
555
cris_not_implemented_op},
557
{"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE, 0,
558
cris_dstep_logshift_mstep_neg_not_op},
560
{"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE, 0,
563
{"fidxd", 0x0ab0, 0xf540, "[r]", 0, SIZE_NONE,
565
cris_not_implemented_op},
567
{"fidxi", 0x0d30, 0xF2C0, "[r]", 0, SIZE_NONE,
569
cris_not_implemented_op},
571
{"ftagd", 0x1AB0, 0xE540, "[r]", 0, SIZE_NONE,
573
cris_not_implemented_op},
575
{"ftagi", 0x1D30, 0xE2C0, "[r]", 0, SIZE_NONE,
577
cris_not_implemented_op},
579
{"halt", 0xF930, 0x06CF, "", 0, SIZE_NONE,
581
cris_not_implemented_op},
583
{"jas", 0x09B0, 0x0640, "r,P", 0, SIZE_NONE,
585
cris_reg_mode_jump_op},
587
{"jas", 0x0DBF, 0x0240, "N,P", 0, SIZE_FIX_32,
589
cris_reg_mode_jump_op},
591
{"jasc", 0x0B30, 0x04C0, "r,P", 0, SIZE_NONE,
593
cris_reg_mode_jump_op},
595
{"jasc", 0x0F3F, 0x00C0, "N,P", 0, SIZE_FIX_32,
597
cris_reg_mode_jump_op},
599
{"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE,
601
cris_reg_mode_jump_op},
603
{"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32,
605
cris_none_reg_mode_jump_op},
607
{"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE,
609
cris_none_reg_mode_jump_op},
611
{"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE,
613
cris_reg_mode_jump_op},
615
{"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32,
617
cris_none_reg_mode_jump_op},
619
{"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE,
621
cris_none_reg_mode_jump_op},
623
{"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE,
625
cris_reg_mode_jump_op},
627
{"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32,
629
cris_none_reg_mode_jump_op},
631
{"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE,
633
cris_none_reg_mode_jump_op},
635
{"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE, 0,
636
cris_reg_mode_jump_op},
638
{"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32,
640
cris_none_reg_mode_jump_op},
642
{"jsr", 0xBDBF, 0x4240, "N", 0, SIZE_FIX_32,
644
cris_none_reg_mode_jump_op},
646
{"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE,
648
cris_none_reg_mode_jump_op},
650
{"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE,
652
cris_reg_mode_jump_op},
654
{"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32,
656
cris_none_reg_mode_jump_op},
658
{"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE,
660
cris_none_reg_mode_jump_op},
662
{"jsrc", 0xBB30, 0x44C0, "r", 0, SIZE_NONE,
664
cris_reg_mode_jump_op},
666
{"jsrc", 0xBF3F, 0x40C0, "N", 0, SIZE_FIX_32,
668
cris_reg_mode_jump_op},
670
{"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE, 0,
671
cris_reg_mode_jump_op},
674
JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "s", 0, SIZE_FIX_32,
676
cris_none_reg_mode_jump_op},
679
JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "S", 0, SIZE_NONE,
681
cris_none_reg_mode_jump_op},
683
{"jump", 0x09F0, 0x060F, "P", 0, SIZE_NONE,
685
cris_none_reg_mode_jump_op},
688
JUMP_PC_INCR_OPCODE_V32,
689
(0xffff & ~JUMP_PC_INCR_OPCODE_V32), "N", 0, SIZE_FIX_32,
691
cris_none_reg_mode_jump_op},
693
{"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32,
695
cris_none_reg_mode_jump_op},
697
{"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE,
699
cris_none_reg_mode_jump_op},
701
{"lapc", 0x0970, 0x0680, "U,R", 0, SIZE_NONE,
703
cris_not_implemented_op},
705
{"lapc", 0x0D7F, 0x0280, "dn,R", 0, SIZE_FIX_32,
707
cris_not_implemented_op},
709
{"lapcq", 0x0970, 0x0680, "u,R", 0, SIZE_NONE,
713
{"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE, 0,
714
cris_dstep_logshift_mstep_neg_not_op},
716
{"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE, 0,
717
cris_dstep_logshift_mstep_neg_not_op},
719
{"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE, 0,
720
cris_dstep_logshift_mstep_neg_not_op},
722
{"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE, 0,
723
cris_dstep_logshift_mstep_neg_not_op},
725
{"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE,
727
cris_not_implemented_op},
729
{"mcp", 0x07f0, 0x0800, "P,r", 0, SIZE_NONE,
731
cris_not_implemented_op},
733
{"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE, 0,
734
cris_reg_mode_add_sub_cmp_and_or_move_op},
736
{"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD, 0,
737
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
739
{"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE,
741
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
743
{"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE, 0,
744
cris_move_to_preg_op},
746
{"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE, 0,
747
cris_reg_mode_move_from_preg_op},
749
{"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD, 0,
750
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
752
{"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE,
754
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
757
MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
758
"s,P", 0, SIZE_SPEC_REG, 0,
759
cris_move_to_preg_op},
761
{"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE,
763
cris_move_to_preg_op},
765
{"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG, 0,
766
cris_none_reg_mode_move_from_preg_op},
768
{"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE,
770
cris_none_reg_mode_move_from_preg_op},
772
{"move", 0x0B70, 0x0480, "r,T", 0, SIZE_NONE,
774
cris_not_implemented_op},
776
{"move", 0x0F70, 0x0080, "T,r", 0, SIZE_NONE,
778
cris_not_implemented_op},
780
{"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32, 0,
781
cris_move_reg_to_mem_movem_op},
783
{"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE,
785
cris_move_reg_to_mem_movem_op},
787
{"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32, 0,
788
cris_move_mem_to_reg_movem_op},
790
{"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE,
792
cris_move_mem_to_reg_movem_op},
794
{"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE, 0,
795
cris_quick_mode_and_cmp_move_or_op},
797
{"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE, 0,
798
cris_reg_mode_add_sub_cmp_and_or_move_op},
800
/* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
801
{"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD, 0,
802
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
804
{"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE,
806
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
808
{"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE, 0,
809
cris_reg_mode_add_sub_cmp_and_or_move_op},
811
/* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
812
{"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD, 0,
813
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
815
{"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE,
817
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
819
{"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE,
821
cris_dstep_logshift_mstep_neg_not_op},
823
{"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE,
827
{"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE,
831
{"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE, 0,
832
cris_dstep_logshift_mstep_neg_not_op},
834
{"nop", NOP_OPCODE, NOP_Z_BITS, "", 0, SIZE_NONE,
838
{"nop", NOP_OPCODE_V32, NOP_Z_BITS_V32, "", 0, SIZE_NONE,
842
{"not", 0x8770, 0x7880, "r", 0, SIZE_NONE, 0,
843
cris_dstep_logshift_mstep_neg_not_op},
845
{"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE, 0,
846
cris_reg_mode_add_sub_cmp_and_or_move_op},
848
{"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD, 0,
849
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
851
{"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE,
853
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
855
{"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE,
857
cris_three_operand_add_sub_cmp_and_or_op},
859
{"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE, 0,
860
cris_quick_mode_and_cmp_move_or_op},
862
{"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE,
864
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
866
{"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE,
868
cris_none_reg_mode_move_from_preg_op},
870
{"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE,
872
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
874
{"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE,
876
cris_move_to_preg_op},
878
{"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE,
880
cris_not_implemented_op},
882
{"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE,
884
cris_not_implemented_op},
886
{"rfe", 0x2930, 0xD6CF, "", 0, SIZE_NONE,
888
cris_not_implemented_op},
890
{"rfg", 0x4930, 0xB6CF, "", 0, SIZE_NONE,
892
cris_not_implemented_op},
894
{"rfn", 0x5930, 0xA6CF, "", 0, SIZE_NONE,
896
cris_not_implemented_op},
898
{"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE,
900
cris_reg_mode_move_from_preg_op},
902
{"ret", 0xB9F0, 0x460F, "", 1, SIZE_NONE,
904
cris_reg_mode_move_from_preg_op},
906
{"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE,
908
cris_reg_mode_move_from_preg_op},
910
{"rete", 0xA9F0, 0x560F, "", 1, SIZE_NONE,
912
cris_reg_mode_move_from_preg_op},
914
{"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE,
916
cris_reg_mode_move_from_preg_op},
918
{"retn", 0xC9F0, 0x360F, "", 1, SIZE_NONE,
920
cris_reg_mode_move_from_preg_op},
922
{"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE,
924
cris_not_implemented_op},
926
{"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE,
928
cris_not_implemented_op},
932
0x0AC0+(0xf-CC_A)*0x1000, "r", 0, SIZE_NONE, 0,
936
0x0530+CC_EXT*0x1000,
937
0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
943
0x0AC0+(0xf-CC_CC)*0x1000, "r", 0, SIZE_NONE, 0,
948
0x0AC0+(0xf-CC_CS)*0x1000, "r", 0, SIZE_NONE, 0,
953
0x0AC0+(0xf-CC_EQ)*0x1000, "r", 0, SIZE_NONE, 0,
956
{"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE, 0,
959
{"sfe", 0x3930, 0xC6CF, "", 0, SIZE_NONE,
961
cris_not_implemented_op},
963
/* Need to have "swf" in front of "sext" so it is the one displayed in
966
0x0530+CC_EXT*0x1000,
967
0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
972
0x0530+CC_EXT*0x1000,
973
0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
979
0x0AC0+(0xf-CC_GE)*0x1000, "r", 0, SIZE_NONE, 0,
984
0x0AC0+(0xf-CC_GT)*0x1000, "r", 0, SIZE_NONE, 0,
989
0x0AC0+(0xf-CC_HI)*0x1000, "r", 0, SIZE_NONE, 0,
994
0x0AC0+(0xf-CC_HS)*0x1000, "r", 0, SIZE_NONE, 0,
999
0x0AC0+(0xf-CC_LE)*0x1000, "r", 0, SIZE_NONE, 0,
1003
0x0530+CC_LO*0x1000,
1004
0x0AC0+(0xf-CC_LO)*0x1000, "r", 0, SIZE_NONE, 0,
1008
0x0530+CC_LS*0x1000,
1009
0x0AC0+(0xf-CC_LS)*0x1000, "r", 0, SIZE_NONE, 0,
1013
0x0530+CC_LT*0x1000,
1014
0x0AC0+(0xf-CC_LT)*0x1000, "r", 0, SIZE_NONE, 0,
1018
0x0530+CC_MI*0x1000,
1019
0x0AC0+(0xf-CC_MI)*0x1000, "r", 0, SIZE_NONE, 0,
1023
0x0530+CC_NE*0x1000,
1024
0x0AC0+(0xf-CC_NE)*0x1000, "r", 0, SIZE_NONE, 0,
1028
0x0530+CC_PL*0x1000,
1029
0x0AC0+(0xf-CC_PL)*0x1000, "r", 0, SIZE_NONE, 0,
1032
{"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE, 0,
1033
cris_reg_mode_add_sub_cmp_and_or_move_op},
1035
{"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD, 0,
1036
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1038
{"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE,
1040
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1042
{"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE,
1044
cris_three_operand_add_sub_cmp_and_or_op},
1046
{"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE, 0,
1047
cris_quick_mode_add_sub_op},
1049
{"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE, 0,
1050
cris_reg_mode_add_sub_cmp_and_or_move_op},
1052
/* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */
1053
{"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD, 0,
1054
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1056
{"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE,
1058
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1060
{"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE,
1062
cris_three_operand_add_sub_cmp_and_or_op},
1064
{"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE, 0,
1065
cris_reg_mode_add_sub_cmp_and_or_move_op},
1067
/* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */
1068
{"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD, 0,
1069
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1071
{"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE,
1073
cris_none_reg_mode_add_sub_cmp_and_or_move_op},
1075
{"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE,
1077
cris_three_operand_add_sub_cmp_and_or_op},
1080
0x0530+CC_VC*0x1000,
1081
0x0AC0+(0xf-CC_VC)*0x1000, "r", 0, SIZE_NONE, 0,
1085
0x0530+CC_VS*0x1000,
1086
0x0AC0+(0xf-CC_VS)*0x1000, "r", 0, SIZE_NONE, 0,
1089
/* The insn "swapn" is the same as "not" and will be disassembled as
1090
such, but the swap* family of mnmonics are generally v8-and-higher
1091
only, so count it in. */
1092
{"swapn", 0x8770, 0x7880, "r", 0, SIZE_NONE,
1094
cris_not_implemented_op},
1096
{"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE,
1098
cris_not_implemented_op},
1100
{"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE,
1102
cris_not_implemented_op},
1104
{"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE,
1106
cris_not_implemented_op},
1108
{"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE,
1110
cris_not_implemented_op},
1112
{"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE,
1114
cris_not_implemented_op},
1116
{"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE,
1118
cris_not_implemented_op},
1120
{"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE,
1122
cris_not_implemented_op},
1124
{"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE,
1126
cris_not_implemented_op},
1128
{"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE,
1130
cris_not_implemented_op},
1132
{"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE,
1134
cris_not_implemented_op},
1136
{"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE,
1138
cris_not_implemented_op},
1140
{"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE,
1142
cris_not_implemented_op},
1144
{"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE,
1146
cris_not_implemented_op},
1148
{"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE,
1150
cris_not_implemented_op},
1152
{"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE,
1154
cris_reg_mode_test_op},
1156
{"test", 0x0b80, 0xf040, "m y", 0, SIZE_FIELD, 0,
1157
cris_none_reg_mode_clear_test_op},
1159
{"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE,
1161
cris_none_reg_mode_clear_test_op},
1163
{"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE, 0,
1166
{NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
1169
/* Condition-names, indexed by the CC_* numbers as found in cris.h. */
1188
/* This is a placeholder. In v0, this would be "ext". In v32, this
1189
is "sb". See cris_conds15. */
1193
/* Different names and semantics for condition 1111 (0xf). */
1194
const struct cris_cond15 cris_cond15s[] =
1196
/* FIXME: In what version did condition "ext" disappear? */
1197
{"ext", cris_ver_v0_3},
1198
{"wf", cris_ver_v10},
1199
{"sb", cris_ver_v32p},
1206
* eval: (c-set-style "gnu")
1207
* indent-tabs-mode: t