1 /* cris-opc.c -- Table of opcodes for the CRIS processor.
2 Copyright (C) 2000 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 GAS, GDB and the GNU binutils.
9 GAS, GDB, and GNU binutils is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License as
11 published by the Free Software Foundation; either version 2, or (at your
12 option) any later version.
14 GAS, GDB, and GNU binutils are distributed in the hope that they will be
15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 #include "opcode/cris.h"
29 const struct cris_spec_reg
32 {"p0", 0, 1, 0, NULL
},
33 {"vr", 1, 1, 0, NULL
},
34 {"p1", 1, 1, 0, NULL
},
35 {"p2", 2, 1, cris_ver_warning
, NULL
},
36 {"p3", 3, 1, cris_ver_warning
, NULL
},
37 {"p4", 4, 2, 0, NULL
},
38 {"ccr", 5, 2, 0, NULL
},
39 {"p5", 5, 2, 0, NULL
},
40 {"dcr0",6, 2, cris_ver_v0_3
, NULL
},
41 {"p6", 6, 2, cris_ver_v0_3
, NULL
},
42 {"dcr1/mof", 7, 4, cris_ver_v10p
,
43 "Register `dcr1/mof' with ambiguous size specified. Guessing 4 bytes"},
44 {"dcr1/mof", 7, 2, cris_ver_v0_3
,
45 "Register `dcr1/mof' with ambiguous size specified. Guessing 2 bytes"},
46 {"mof", 7, 4, cris_ver_v10p
, NULL
},
47 {"dcr1",7, 2, cris_ver_v0_3
, NULL
},
48 {"p7", 7, 4, cris_ver_v10p
, NULL
},
49 {"p7", 7, 2, cris_ver_v0_3
, NULL
},
50 {"p8", 8, 4, 0, NULL
},
51 {"ibr", 9, 4, 0, NULL
},
52 {"p9", 9, 4, 0, NULL
},
53 {"irp", 10, 4, 0, NULL
},
54 {"p10", 10, 4, 0, NULL
},
55 {"srp", 11, 4, 0, NULL
},
56 {"p11", 11, 4, 0, NULL
},
57 /* For disassembly use only. Accept at assembly with a warning. */
58 {"bar/dtp0", 12, 4, cris_ver_warning
,
59 "Ambiguous register `bar/dtp0' specified"},
60 {"bar", 12, 4, cris_ver_v8p
, NULL
},
61 {"dtp0",12, 4, cris_ver_v0_3
, NULL
},
62 {"p12", 12, 4, 0, NULL
},
63 /* For disassembly use only. Accept at assembly with a warning. */
64 {"dccr/dtp1",13, 4, cris_ver_warning
,
65 "Ambiguous register `dccr/dtp1' specified"},
66 {"dccr",13, 4, cris_ver_v8p
, NULL
},
67 {"dtp1",13, 4, cris_ver_v0_3
, NULL
},
68 {"p13", 13, 4, 0, NULL
},
69 {"brp", 14, 4, cris_ver_v3p
, NULL
},
70 {"p14", 14, 4, cris_ver_v3p
, NULL
},
71 {"usp", 15, 4, cris_ver_v10p
, NULL
},
72 {"p15", 15, 4, cris_ver_v10p
, NULL
},
76 /* All CRIS opcodes are 16 bits.
78 - The match component is a mask saying which bits must match a
79 particular opcode in order for an instruction to be an instance
82 - The args component is a string containing characters symbolically
83 matching the operands of an instruction. Used for both assembly
86 Operand-matching characters:
87 B Not really an operand. It causes a "BDAP -size,SP" prefix to be
88 output for the PUSH alias-instructions and recognizes a
89 push-prefix at disassembly. Must be followed by a R or P letter.
90 ! Non-match pattern, will not match if there's a prefix insn.
91 b Non-matching operand, used for branches with 16-bit
92 displacement. Only recognized by the disassembler.
93 c 5-bit unsigned immediate in bits <4:0>.
94 C 4-bit unsigned immediate in bits <3:0>.
95 D General register in bits <15:12> and <3:0>.
96 f List of flags in bits <15:12> and <3:0>.
97 i 6-bit signed immediate in bits <5:0>.
98 I 6-bit unsigned immediate in bits <5:0>.
99 M Size modifier (B, W or D) for CLEAR instructions.
100 m Size modifier (B, W or D) in bits <5:4>
101 o [-128..127] word offset in bits <7:1> and <0>. Used by 8-bit
103 O [-128..127] offset in bits <7:0>. Also matches a comma and a
104 general register after the expression. Used only for the BDAP
106 P Special register in bits <15:12>.
107 p Indicates that the insn is a prefix insn. Must be first
109 R General register in bits <15:12>.
110 r General register in bits <3:0>.
111 S Source operand in bit <10> and a prefix; a 3-operand prefix
113 s Source operand in bits <10> and <3:0>, optionally with a
115 x Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
116 y Like 's' but do not allow an integer at assembly.
117 z Size modifier (B or W) in bit <4>. */
120 /* Please note the order of the opcodes in this table is significant.
121 The assembler requires that all instances of the same mnemonic must
122 be consecutive. If they aren't, the assembler might not recognize
123 them, or may indicate and internal error.
125 The disassembler should not normally care about the order of the
126 opcodes, but will prefer an earlier alternative if the "match-score"
127 (see cris-dis.c) is computed as equal.
129 It should not be significant for proper execution that this table is
130 in alphabetical order, but please follow that convention for an easy
133 const struct cris_opcode
136 {"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE
, 0,
139 {"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE
, 0,
140 cris_reg_mode_add_sub_cmp_and_or_move_op
},
142 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD
, 0,
143 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
145 {"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE
, 0,
146 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
148 {"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE
, 0,
149 cris_three_operand_add_sub_cmp_and_or_op
},
151 {"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE
, 0,
154 {"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE
, 0,
155 cris_quick_mode_add_sub_op
},
157 {"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE
, 0,
158 cris_reg_mode_add_sub_cmp_and_or_move_op
},
160 {"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD
, 0,
161 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
163 {"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE
, 0,
164 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
166 {"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE
, 0,
167 cris_three_operand_add_sub_cmp_and_or_op
},
169 {"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE
, 0,
170 cris_reg_mode_add_sub_cmp_and_or_move_op
},
172 {"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD
, 0,
173 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
175 {"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE
, 0,
176 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
178 {"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE
, 0,
179 cris_three_operand_add_sub_cmp_and_or_op
},
181 {"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE
, 0,
182 cris_reg_mode_add_sub_cmp_and_or_move_op
},
184 {"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD
, 0,
185 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
187 {"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE
, 0,
188 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
190 {"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE
, 0,
191 cris_three_operand_add_sub_cmp_and_or_op
},
193 {"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE
, 0,
194 cris_quick_mode_and_cmp_move_or_op
},
196 {"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE
, 0,
199 {"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE
, 0,
202 {"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE
, 0,
205 /* FIXME: Should use branch #defines. */
206 {"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE
, 0,
207 cris_sixteen_bit_offset_branch_op
},
211 0x0F00+(0xF-CC_A
)*0x1000, "o", 1, SIZE_NONE
, 0,
212 cris_eight_bit_offset_branch_op
},
215 BRANCH_QUICK_OPCODE
+CC_CC
*0x1000,
216 0x0f00+(0xF-CC_CC
)*0x1000, "o", 1, SIZE_NONE
, 0,
217 cris_eight_bit_offset_branch_op
},
220 BRANCH_QUICK_OPCODE
+CC_CS
*0x1000,
221 0x0f00+(0xF-CC_CS
)*0x1000, "o", 1, SIZE_NONE
, 0,
222 cris_eight_bit_offset_branch_op
},
225 BDAP_INDIR_OPCODE
, BDAP_INDIR_Z_BITS
, "pm s,R", 0, SIZE_FIELD
, 0,
229 BDAP_QUICK_OPCODE
, BDAP_QUICK_Z_BITS
, "pO", 0, SIZE_NONE
, 0,
230 cris_quick_mode_bdap_prefix
},
233 BRANCH_QUICK_OPCODE
+CC_EQ
*0x1000,
234 0x0f00+(0xF-CC_EQ
)*0x1000, "o", 1, SIZE_NONE
, 0,
235 cris_eight_bit_offset_branch_op
},
237 /* This is deliberately put before "bext" to trump it, even though not
238 in alphabetical order. */
240 BRANCH_QUICK_OPCODE
+CC_EXT
*0x1000,
241 0x0f00+(0xF-CC_EXT
)*0x1000, "o", 1, SIZE_NONE
,
243 cris_eight_bit_offset_branch_op
},
246 BRANCH_QUICK_OPCODE
+CC_EXT
*0x1000,
247 0x0f00+(0xF-CC_EXT
)*0x1000, "o", 1, SIZE_NONE
,
249 cris_eight_bit_offset_branch_op
},
252 BRANCH_QUICK_OPCODE
+CC_GE
*0x1000,
253 0x0f00+(0xF-CC_GE
)*0x1000, "o", 1, SIZE_NONE
, 0,
254 cris_eight_bit_offset_branch_op
},
257 BRANCH_QUICK_OPCODE
+CC_GT
*0x1000,
258 0x0f00+(0xF-CC_GT
)*0x1000, "o", 1, SIZE_NONE
, 0,
259 cris_eight_bit_offset_branch_op
},
262 BRANCH_QUICK_OPCODE
+CC_HI
*0x1000,
263 0x0f00+(0xF-CC_HI
)*0x1000, "o", 1, SIZE_NONE
, 0,
264 cris_eight_bit_offset_branch_op
},
267 BRANCH_QUICK_OPCODE
+CC_HS
*0x1000,
268 0x0f00+(0xF-CC_HS
)*0x1000, "o", 1, SIZE_NONE
, 0,
269 cris_eight_bit_offset_branch_op
},
271 {"biap", BIAP_OPCODE
, BIAP_Z_BITS
, "pm r,R", 0, SIZE_NONE
, 0,
275 BRANCH_QUICK_OPCODE
+CC_LE
*0x1000,
276 0x0f00+(0xF-CC_LE
)*0x1000, "o", 1, SIZE_NONE
, 0,
277 cris_eight_bit_offset_branch_op
},
280 BRANCH_QUICK_OPCODE
+CC_LO
*0x1000,
281 0x0f00+(0xF-CC_LO
)*0x1000, "o", 1, SIZE_NONE
, 0,
282 cris_eight_bit_offset_branch_op
},
285 BRANCH_QUICK_OPCODE
+CC_LS
*0x1000,
286 0x0f00+(0xF-CC_LS
)*0x1000, "o", 1, SIZE_NONE
, 0,
287 cris_eight_bit_offset_branch_op
},
290 BRANCH_QUICK_OPCODE
+CC_LT
*0x1000,
291 0x0f00+(0xF-CC_LT
)*0x1000, "o", 1, SIZE_NONE
, 0,
292 cris_eight_bit_offset_branch_op
},
295 BRANCH_QUICK_OPCODE
+CC_MI
*0x1000,
296 0x0f00+(0xF-CC_MI
)*0x1000, "o", 1, SIZE_NONE
, 0,
297 cris_eight_bit_offset_branch_op
},
299 {"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32
,
301 cris_not_implemented_op
},
303 {"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE
,
305 cris_not_implemented_op
},
307 {"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE
,
309 cris_not_implemented_op
},
312 BRANCH_QUICK_OPCODE
+CC_NE
*0x1000,
313 0x0f00+(0xF-CC_NE
)*0x1000, "o", 1, SIZE_NONE
, 0,
314 cris_eight_bit_offset_branch_op
},
316 {"bound", 0x05c0, 0x0A00, "m r,R", 0, SIZE_NONE
, 0,
317 cris_two_operand_bound_op
},
318 {"bound", 0x09c0, 0x0200, "m s,R", 0, SIZE_FIELD
, 0,
319 cris_two_operand_bound_op
},
320 {"bound", 0x09c0, 0x0200, "m S,D", 0, SIZE_NONE
, 0,
321 cris_two_operand_bound_op
},
322 {"bound", 0x09c0, 0x0600, "m S,R,r", 0, SIZE_NONE
, 0,
323 cris_three_operand_bound_op
},
325 BRANCH_QUICK_OPCODE
+CC_PL
*0x1000,
326 0x0f00+(0xF-CC_PL
)*0x1000, "o", 1, SIZE_NONE
, 0,
327 cris_eight_bit_offset_branch_op
},
329 {"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE
,
333 {"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32
,
335 cris_not_implemented_op
},
337 {"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE
,
339 cris_not_implemented_op
},
341 {"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE
,
343 cris_not_implemented_op
},
345 {"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE
, 0,
347 {"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE
, 0,
350 BRANCH_QUICK_OPCODE
+CC_VC
*0x1000,
351 0x0f00+(0xF-CC_VC
)*0x1000, "o", 1, SIZE_NONE
, 0,
352 cris_eight_bit_offset_branch_op
},
355 BRANCH_QUICK_OPCODE
+CC_VS
*0x1000,
356 0x0f00+(0xF-CC_VS
)*0x1000, "o", 1, SIZE_NONE
, 0,
357 cris_eight_bit_offset_branch_op
},
359 {"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE
, 0,
360 cris_reg_mode_clear_op
},
362 {"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE
, 0,
363 cris_none_reg_mode_clear_test_op
},
365 {"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE
, 0,
366 cris_none_reg_mode_clear_test_op
},
368 {"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE
, 0,
371 {"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE
, 0,
372 cris_reg_mode_add_sub_cmp_and_or_move_op
},
374 {"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD
, 0,
375 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
377 {"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE
, 0,
378 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
380 {"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE
, 0,
381 cris_quick_mode_and_cmp_move_or_op
},
383 {"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD
, 0,
384 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
386 {"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE
, 0,
387 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
389 {"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD
, 0,
390 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
392 {"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE
, 0,
393 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
395 {"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE
, 0,
398 {"dip", DIP_OPCODE
, DIP_Z_BITS
, "ps", 0, SIZE_FIX_32
, 0,
401 {"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD
, 0,
402 cris_not_implemented_op
},
404 {"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE
, 0,
405 cris_dstep_logshift_mstep_neg_not_op
},
407 {"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE
, 0,
410 {"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE
,
412 cris_reg_mode_jump_op
},
414 {"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32
,
416 cris_none_reg_mode_jump_op
},
418 {"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE
,
420 cris_none_reg_mode_jump_op
},
422 {"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE
, 0,
423 cris_reg_mode_jump_op
},
425 {"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32
, 0,
426 cris_none_reg_mode_jump_op
},
428 {"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE
, 0,
429 cris_none_reg_mode_jump_op
},
431 {"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE
,
433 cris_reg_mode_jump_op
},
435 {"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32
,
437 cris_none_reg_mode_jump_op
},
439 {"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE
,
441 cris_none_reg_mode_jump_op
},
443 {"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE
, 0,
444 cris_reg_mode_jump_op
},
446 {"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32
, 0,
447 cris_none_reg_mode_jump_op
},
449 {"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE
, 0,
450 cris_none_reg_mode_jump_op
},
452 {"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE
,
454 cris_reg_mode_jump_op
},
456 {"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32
,
458 cris_none_reg_mode_jump_op
},
460 {"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE
,
462 cris_none_reg_mode_jump_op
},
464 {"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE
, 0,
465 cris_reg_mode_jump_op
},
468 JUMP_INDIR_OPCODE
, JUMP_INDIR_Z_BITS
, "s", 0, SIZE_FIX_32
, 0,
469 cris_none_reg_mode_jump_op
},
472 JUMP_INDIR_OPCODE
, JUMP_INDIR_Z_BITS
, "S", 0, SIZE_NONE
, 0,
473 cris_none_reg_mode_jump_op
},
475 {"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32
,
477 cris_none_reg_mode_jump_op
},
479 {"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE
,
481 cris_none_reg_mode_jump_op
},
483 {"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE
, 0,
484 cris_dstep_logshift_mstep_neg_not_op
},
486 {"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE
, 0,
487 cris_dstep_logshift_mstep_neg_not_op
},
489 {"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE
, 0,
490 cris_dstep_logshift_mstep_neg_not_op
},
492 {"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE
, 0,
493 cris_dstep_logshift_mstep_neg_not_op
},
495 {"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE
,
497 cris_not_implemented_op
},
499 {"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE
, 0,
500 cris_reg_mode_add_sub_cmp_and_or_move_op
},
502 {"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE
, 0,
503 cris_move_to_preg_op
},
505 {"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE
, 0,
506 cris_reg_mode_move_from_preg_op
},
508 {"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD
, 0,
509 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
511 {"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE
, 0,
512 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
514 {"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD
, 0,
515 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
517 {"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE
, 0,
518 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
520 {"move", 0x0A30, 0x01c0, "s,P", 0, SIZE_SPEC_REG
, 0,
521 cris_move_to_preg_op
},
523 {"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE
, 0,
524 cris_move_to_preg_op
},
526 {"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG
, 0,
527 cris_none_reg_mode_move_from_preg_op
},
529 {"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE
, 0,
530 cris_none_reg_mode_move_from_preg_op
},
532 {"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32
, 0,
533 cris_move_reg_to_mem_movem_op
},
535 {"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE
, 0,
536 cris_move_reg_to_mem_movem_op
},
538 {"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32
, 0,
539 cris_move_mem_to_reg_movem_op
},
541 {"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE
, 0,
542 cris_move_mem_to_reg_movem_op
},
544 {"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE
, 0,
545 cris_quick_mode_and_cmp_move_or_op
},
547 {"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE
, 0,
548 cris_reg_mode_add_sub_cmp_and_or_move_op
},
550 {"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD
, 0,
551 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
553 {"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE
, 0,
554 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
556 {"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE
, 0,
557 cris_reg_mode_add_sub_cmp_and_or_move_op
},
559 {"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD
, 0,
560 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
562 {"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE
, 0,
563 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
565 {"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE
, 0,
566 cris_dstep_logshift_mstep_neg_not_op
},
568 {"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE
,
572 {"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE
,
576 {"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE
, 0,
577 cris_dstep_logshift_mstep_neg_not_op
},
579 {"nop", NOP_OPCODE
, NOP_Z_BITS
, "", 0, SIZE_NONE
, 0,
582 {"not", 0x8770, 0x7880, "r", 0, SIZE_NONE
, 0,
583 cris_dstep_logshift_mstep_neg_not_op
},
585 {"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE
, 0,
586 cris_reg_mode_add_sub_cmp_and_or_move_op
},
588 {"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD
, 0,
589 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
591 {"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE
, 0,
592 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
594 {"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE
, 0,
595 cris_three_operand_add_sub_cmp_and_or_op
},
597 {"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE
, 0,
598 cris_quick_mode_and_cmp_move_or_op
},
600 {"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE
, 0,
601 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
603 {"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE
, 0,
604 cris_none_reg_mode_move_from_preg_op
},
606 {"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE
, 0,
607 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
609 {"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE
, 0,
610 cris_move_to_preg_op
},
612 {"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE
,
614 cris_not_implemented_op
},
616 {"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE
,
618 cris_not_implemented_op
},
620 {"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE
, 0,
621 cris_reg_mode_move_from_preg_op
},
623 {"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE
, 0,
624 cris_reg_mode_move_from_preg_op
},
626 {"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE
, 0,
627 cris_reg_mode_move_from_preg_op
},
629 {"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE
,
631 cris_not_implemented_op
},
633 {"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE
,
635 cris_not_implemented_op
},
639 0x0AC0+(0xf-CC_A
)*0x1000, "r", 0, SIZE_NONE
, 0,
644 0x0AC0+(0xf-CC_CC
)*0x1000, "r", 0, SIZE_NONE
, 0,
649 0x0AC0+(0xf-CC_CS
)*0x1000, "r", 0, SIZE_NONE
, 0,
654 0x0AC0+(0xf-CC_EQ
)*0x1000, "r", 0, SIZE_NONE
, 0,
657 {"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE
, 0,
660 /* Need to have "swf" in front of "sext" so it is the one displayed in
663 0x0530+CC_EXT
*0x1000,
664 0x0AC0+(0xf-CC_EXT
)*0x1000, "r", 0, SIZE_NONE
,
669 0x0530+CC_EXT
*0x1000,
670 0x0AC0+(0xf-CC_EXT
)*0x1000, "r", 0, SIZE_NONE
,
676 0x0AC0+(0xf-CC_GE
)*0x1000, "r", 0, SIZE_NONE
, 0,
681 0x0AC0+(0xf-CC_GT
)*0x1000, "r", 0, SIZE_NONE
, 0,
686 0x0AC0+(0xf-CC_HI
)*0x1000, "r", 0, SIZE_NONE
, 0,
691 0x0AC0+(0xf-CC_HS
)*0x1000, "r", 0, SIZE_NONE
, 0,
696 0x0AC0+(0xf-CC_LE
)*0x1000, "r", 0, SIZE_NONE
, 0,
701 0x0AC0+(0xf-CC_LO
)*0x1000, "r", 0, SIZE_NONE
, 0,
706 0x0AC0+(0xf-CC_LS
)*0x1000, "r", 0, SIZE_NONE
, 0,
711 0x0AC0+(0xf-CC_LT
)*0x1000, "r", 0, SIZE_NONE
, 0,
716 0x0AC0+(0xf-CC_MI
)*0x1000, "r", 0, SIZE_NONE
, 0,
721 0x0AC0+(0xf-CC_NE
)*0x1000, "r", 0, SIZE_NONE
, 0,
726 0x0AC0+(0xf-CC_PL
)*0x1000, "r", 0, SIZE_NONE
, 0,
729 {"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE
, 0,
730 cris_reg_mode_add_sub_cmp_and_or_move_op
},
732 {"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD
, 0,
733 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
735 {"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE
, 0,
736 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
738 {"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE
, 0,
739 cris_three_operand_add_sub_cmp_and_or_op
},
741 {"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE
, 0,
742 cris_quick_mode_add_sub_op
},
744 {"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE
, 0,
745 cris_reg_mode_add_sub_cmp_and_or_move_op
},
747 {"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD
, 0,
748 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
750 {"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE
, 0,
751 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
753 {"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE
, 0,
754 cris_three_operand_add_sub_cmp_and_or_op
},
756 {"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE
, 0,
757 cris_reg_mode_add_sub_cmp_and_or_move_op
},
759 {"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD
, 0,
760 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
762 {"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE
, 0,
763 cris_none_reg_mode_add_sub_cmp_and_or_move_op
},
765 {"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE
, 0,
766 cris_three_operand_add_sub_cmp_and_or_op
},
770 0x0AC0+(0xf-CC_VC
)*0x1000, "r", 0, SIZE_NONE
, 0,
775 0x0AC0+(0xf-CC_VS
)*0x1000, "r", 0, SIZE_NONE
, 0,
778 /* The insn "swapn" is the same as "not" and will be disassembled as
779 such, but the swap* family of mnmonics are generally v8-and-higher
780 only, so count it in. */
781 {"swapn", 0x8770, 0x7880, "r", 0, SIZE_NONE
,
783 cris_not_implemented_op
},
785 {"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE
,
787 cris_not_implemented_op
},
789 {"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE
,
791 cris_not_implemented_op
},
793 {"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE
,
795 cris_not_implemented_op
},
797 {"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE
,
799 cris_not_implemented_op
},
801 {"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE
,
803 cris_not_implemented_op
},
805 {"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE
,
807 cris_not_implemented_op
},
809 {"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE
,
811 cris_not_implemented_op
},
813 {"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE
,
815 cris_not_implemented_op
},
817 {"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE
,
819 cris_not_implemented_op
},
821 {"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE
,
823 cris_not_implemented_op
},
825 {"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE
,
827 cris_not_implemented_op
},
829 {"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE
,
831 cris_not_implemented_op
},
833 {"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE
,
835 cris_not_implemented_op
},
837 {"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE
,
839 cris_not_implemented_op
},
841 {"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE
, 0,
842 cris_reg_mode_test_op
},
844 {"test", 0x0b80, 0xf040, "m s", 0, SIZE_FIELD
, 0,
845 cris_none_reg_mode_clear_test_op
},
847 {"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE
, 0,
848 cris_none_reg_mode_clear_test_op
},
850 {"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE
, 0,
853 {NULL
, 0, 0, NULL
, 0, 0, 0, cris_not_implemented_op
}
856 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
875 /* In v0, this would be "ext". */
882 * eval: (c-set-style "gnu")
883 * indent-tabs-mode: t