This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / opcodes / cris-opc.c
1 /* cris-opc.c -- Table of opcodes for the CRIS processor.
2 Copyright 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.
6
7 This file is part of GAS, GDB and the GNU binutils.
8
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.
13
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.
18
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. */
22
23 #include "opcode/cris.h"
24
25 #ifndef NULL
26 #define NULL (0)
27 #endif
28
29 const struct cris_spec_reg
30 cris_spec_regs[] =
31 {
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},
73 {NULL, 0, 0, cris_ver_version_all, NULL}
74 };
75
76 /* All CRIS opcodes are 16 bits.
77
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
80 of that opcode.
81
82 - The args component is a string containing characters symbolically
83 matching the operands of an instruction. Used for both assembly
84 and disassembly.
85
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
102 branch instructions.
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
105 prefix insn.
106 P Special register in bits <15:12>.
107 p Indicates that the insn is a prefix insn. Must be first
108 character.
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
112 without side-effect.
113 s Source operand in bits <10> and <3:0>, optionally with a
114 side-effect prefix.
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>. */
118
119
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.
124
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.
128
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
131 overview. */
132
133 const struct cris_opcode
134 cris_opcodes[] =
135 {
136 {"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE, 0,
137 cris_abs_op},
138
139 {"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE, 0,
140 cris_reg_mode_add_sub_cmp_and_or_move_op},
141
142 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD, 0,
143 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
144
145 {"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE, 0,
146 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
147
148 {"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE, 0,
149 cris_three_operand_add_sub_cmp_and_or_op},
150
151 {"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE, 0,
152 cris_addi_op},
153
154 {"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE, 0,
155 cris_quick_mode_add_sub_op},
156
157 {"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE, 0,
158 cris_reg_mode_add_sub_cmp_and_or_move_op},
159
160 {"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD, 0,
161 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
162
163 {"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE, 0,
164 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
165
166 {"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE, 0,
167 cris_three_operand_add_sub_cmp_and_or_op},
168
169 {"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE, 0,
170 cris_reg_mode_add_sub_cmp_and_or_move_op},
171
172 {"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD, 0,
173 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
174
175 {"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE, 0,
176 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
177
178 {"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE, 0,
179 cris_three_operand_add_sub_cmp_and_or_op},
180
181 {"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE, 0,
182 cris_reg_mode_add_sub_cmp_and_or_move_op},
183
184 {"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD, 0,
185 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
186
187 {"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE, 0,
188 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
189
190 {"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE, 0,
191 cris_three_operand_add_sub_cmp_and_or_op},
192
193 {"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE, 0,
194 cris_quick_mode_and_cmp_move_or_op},
195
196 {"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE, 0,
197 cris_asr_op},
198
199 {"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE, 0,
200 cris_asrq_op},
201
202 {"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE, 0,
203 cris_ax_ei_setf_op},
204
205 /* FIXME: Should use branch #defines. */
206 {"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE, 0,
207 cris_sixteen_bit_offset_branch_op},
208
209 {"ba",
210 BA_QUICK_OPCODE,
211 0x0F00+(0xF-CC_A)*0x1000, "o", 1, SIZE_NONE, 0,
212 cris_eight_bit_offset_branch_op},
213
214 {"bcc",
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},
218
219 {"bcs",
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},
223
224 {"bdap",
225 BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS, "pm s,R", 0, SIZE_FIELD, 0,
226 cris_bdap_prefix},
227
228 {"bdap",
229 BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS, "pO", 0, SIZE_NONE, 0,
230 cris_quick_mode_bdap_prefix},
231
232 {"beq",
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},
236
237 /* This is deliberately put before "bext" to trump it, even though not
238 in alphabetical order. */
239 {"bwf",
240 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
241 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
242 cris_ver_v10p,
243 cris_eight_bit_offset_branch_op},
244
245 {"bext",
246 BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
247 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE,
248 cris_ver_v0_3,
249 cris_eight_bit_offset_branch_op},
250
251 {"bge",
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},
255
256 {"bgt",
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},
260
261 {"bhi",
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},
265
266 {"bhs",
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},
270
271 {"biap", BIAP_OPCODE, BIAP_Z_BITS, "pm r,R", 0, SIZE_NONE, 0,
272 cris_biap_prefix},
273
274 {"ble",
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},
278
279 {"blo",
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},
283
284 {"bls",
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},
288
289 {"blt",
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},
293
294 {"bmi",
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},
298
299 {"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32,
300 cris_ver_sim,
301 cris_not_implemented_op},
302
303 {"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE,
304 cris_ver_sim,
305 cris_not_implemented_op},
306
307 {"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE,
308 cris_ver_sim,
309 cris_not_implemented_op},
310
311 {"bne",
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},
315
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},
324 {"bpl",
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},
328
329 {"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE,
330 cris_ver_v3p,
331 cris_break_op},
332
333 {"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32,
334 cris_ver_warning,
335 cris_not_implemented_op},
336
337 {"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE,
338 cris_ver_warning,
339 cris_not_implemented_op},
340
341 {"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE,
342 cris_ver_warning,
343 cris_not_implemented_op},
344
345 {"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE, 0,
346 cris_btst_nop_op},
347 {"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE, 0,
348 cris_btst_nop_op},
349 {"bvc",
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},
353
354 {"bvs",
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},
358
359 {"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE, 0,
360 cris_reg_mode_clear_op},
361
362 {"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE, 0,
363 cris_none_reg_mode_clear_test_op},
364
365 {"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE, 0,
366 cris_none_reg_mode_clear_test_op},
367
368 {"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE, 0,
369 cris_clearf_di_op},
370
371 {"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE, 0,
372 cris_reg_mode_add_sub_cmp_and_or_move_op},
373
374 {"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD, 0,
375 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
376
377 {"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE, 0,
378 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
379
380 {"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE, 0,
381 cris_quick_mode_and_cmp_move_or_op},
382
383 {"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD, 0,
384 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
385
386 {"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE, 0,
387 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
388
389 {"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD, 0,
390 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
391
392 {"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE, 0,
393 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
394
395 {"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE, 0,
396 cris_clearf_di_op},
397
398 {"dip", DIP_OPCODE, DIP_Z_BITS, "ps", 0, SIZE_FIX_32, 0,
399 cris_dip_prefix},
400
401 {"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD, 0,
402 cris_not_implemented_op},
403
404 {"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE, 0,
405 cris_dstep_logshift_mstep_neg_not_op},
406
407 {"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE, 0,
408 cris_ax_ei_setf_op},
409
410 {"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE,
411 cris_ver_v8p,
412 cris_reg_mode_jump_op},
413
414 {"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32,
415 cris_ver_v8p,
416 cris_none_reg_mode_jump_op},
417
418 {"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE,
419 cris_ver_v8p,
420 cris_none_reg_mode_jump_op},
421
422 {"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE, 0,
423 cris_reg_mode_jump_op},
424
425 {"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32, 0,
426 cris_none_reg_mode_jump_op},
427
428 {"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE, 0,
429 cris_none_reg_mode_jump_op},
430
431 {"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE,
432 cris_ver_v8p,
433 cris_reg_mode_jump_op},
434
435 {"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32,
436 cris_ver_v8p,
437 cris_none_reg_mode_jump_op},
438
439 {"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE,
440 cris_ver_v8p,
441 cris_none_reg_mode_jump_op},
442
443 {"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE, 0,
444 cris_reg_mode_jump_op},
445
446 {"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32, 0,
447 cris_none_reg_mode_jump_op},
448
449 {"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE, 0,
450 cris_none_reg_mode_jump_op},
451
452 {"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE,
453 cris_ver_v8p,
454 cris_reg_mode_jump_op},
455
456 {"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32,
457 cris_ver_v8p,
458 cris_none_reg_mode_jump_op},
459
460 {"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE,
461 cris_ver_v8p,
462 cris_none_reg_mode_jump_op},
463
464 {"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE, 0,
465 cris_reg_mode_jump_op},
466
467 {"jump",
468 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "s", 0, SIZE_FIX_32, 0,
469 cris_none_reg_mode_jump_op},
470
471 {"jump",
472 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "S", 0, SIZE_NONE, 0,
473 cris_none_reg_mode_jump_op},
474
475 {"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32,
476 cris_ver_v10p,
477 cris_none_reg_mode_jump_op},
478
479 {"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE,
480 cris_ver_v10p,
481 cris_none_reg_mode_jump_op},
482
483 {"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE, 0,
484 cris_dstep_logshift_mstep_neg_not_op},
485
486 {"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE, 0,
487 cris_dstep_logshift_mstep_neg_not_op},
488
489 {"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE, 0,
490 cris_dstep_logshift_mstep_neg_not_op},
491
492 {"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE, 0,
493 cris_dstep_logshift_mstep_neg_not_op},
494
495 {"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE,
496 cris_ver_v3p,
497 cris_not_implemented_op},
498
499 {"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE, 0,
500 cris_reg_mode_add_sub_cmp_and_or_move_op},
501
502 {"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE, 0,
503 cris_move_to_preg_op},
504
505 {"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE, 0,
506 cris_reg_mode_move_from_preg_op},
507
508 {"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD, 0,
509 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
510
511 {"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE, 0,
512 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
513
514 {"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD, 0,
515 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
516
517 {"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE, 0,
518 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
519
520 {"move", 0x0A30, 0x01c0, "s,P", 0, SIZE_SPEC_REG, 0,
521 cris_move_to_preg_op},
522
523 {"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE, 0,
524 cris_move_to_preg_op},
525
526 {"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG, 0,
527 cris_none_reg_mode_move_from_preg_op},
528
529 {"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE, 0,
530 cris_none_reg_mode_move_from_preg_op},
531
532 {"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32, 0,
533 cris_move_reg_to_mem_movem_op},
534
535 {"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE, 0,
536 cris_move_reg_to_mem_movem_op},
537
538 {"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32, 0,
539 cris_move_mem_to_reg_movem_op},
540
541 {"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE, 0,
542 cris_move_mem_to_reg_movem_op},
543
544 {"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE, 0,
545 cris_quick_mode_and_cmp_move_or_op},
546
547 {"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE, 0,
548 cris_reg_mode_add_sub_cmp_and_or_move_op},
549
550 {"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD, 0,
551 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
552
553 {"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE, 0,
554 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
555
556 {"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE, 0,
557 cris_reg_mode_add_sub_cmp_and_or_move_op},
558
559 {"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD, 0,
560 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
561
562 {"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE, 0,
563 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
564
565 {"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE, 0,
566 cris_dstep_logshift_mstep_neg_not_op},
567
568 {"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE,
569 cris_ver_v10p,
570 cris_muls_op},
571
572 {"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE,
573 cris_ver_v10p,
574 cris_mulu_op},
575
576 {"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE, 0,
577 cris_dstep_logshift_mstep_neg_not_op},
578
579 {"nop", NOP_OPCODE, NOP_Z_BITS, "", 0, SIZE_NONE, 0,
580 cris_btst_nop_op},
581
582 {"not", 0x8770, 0x7880, "r", 0, SIZE_NONE, 0,
583 cris_dstep_logshift_mstep_neg_not_op},
584
585 {"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE, 0,
586 cris_reg_mode_add_sub_cmp_and_or_move_op},
587
588 {"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD, 0,
589 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
590
591 {"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE, 0,
592 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
593
594 {"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE, 0,
595 cris_three_operand_add_sub_cmp_and_or_op},
596
597 {"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE, 0,
598 cris_quick_mode_and_cmp_move_or_op},
599
600 {"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE, 0,
601 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
602
603 {"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE, 0,
604 cris_none_reg_mode_move_from_preg_op},
605
606 {"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE, 0,
607 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
608
609 {"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE, 0,
610 cris_move_to_preg_op},
611
612 {"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE,
613 cris_ver_v10p,
614 cris_not_implemented_op},
615
616 {"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE,
617 cris_ver_v10p,
618 cris_not_implemented_op},
619
620 {"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE, 0,
621 cris_reg_mode_move_from_preg_op},
622
623 {"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE, 0,
624 cris_reg_mode_move_from_preg_op},
625
626 {"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE, 0,
627 cris_reg_mode_move_from_preg_op},
628
629 {"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE,
630 cris_ver_v10p,
631 cris_not_implemented_op},
632
633 {"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE,
634 cris_ver_v10p,
635 cris_not_implemented_op},
636
637 {"sa",
638 0x0530+CC_A*0x1000,
639 0x0AC0+(0xf-CC_A)*0x1000, "r", 0, SIZE_NONE, 0,
640 cris_scc_op},
641
642 {"scc",
643 0x0530+CC_CC*0x1000,
644 0x0AC0+(0xf-CC_CC)*0x1000, "r", 0, SIZE_NONE, 0,
645 cris_scc_op},
646
647 {"scs",
648 0x0530+CC_CS*0x1000,
649 0x0AC0+(0xf-CC_CS)*0x1000, "r", 0, SIZE_NONE, 0,
650 cris_scc_op},
651
652 {"seq",
653 0x0530+CC_EQ*0x1000,
654 0x0AC0+(0xf-CC_EQ)*0x1000, "r", 0, SIZE_NONE, 0,
655 cris_scc_op},
656
657 {"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE, 0,
658 cris_ax_ei_setf_op},
659
660 /* Need to have "swf" in front of "sext" so it is the one displayed in
661 disassembly. */
662 {"swf",
663 0x0530+CC_EXT*0x1000,
664 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
665 cris_ver_v10p,
666 cris_scc_op},
667
668 {"sext",
669 0x0530+CC_EXT*0x1000,
670 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE,
671 cris_ver_v0_3,
672 cris_scc_op},
673
674 {"sge",
675 0x0530+CC_GE*0x1000,
676 0x0AC0+(0xf-CC_GE)*0x1000, "r", 0, SIZE_NONE, 0,
677 cris_scc_op},
678
679 {"sgt",
680 0x0530+CC_GT*0x1000,
681 0x0AC0+(0xf-CC_GT)*0x1000, "r", 0, SIZE_NONE, 0,
682 cris_scc_op},
683
684 {"shi",
685 0x0530+CC_HI*0x1000,
686 0x0AC0+(0xf-CC_HI)*0x1000, "r", 0, SIZE_NONE, 0,
687 cris_scc_op},
688
689 {"shs",
690 0x0530+CC_HS*0x1000,
691 0x0AC0+(0xf-CC_HS)*0x1000, "r", 0, SIZE_NONE, 0,
692 cris_scc_op},
693
694 {"sle",
695 0x0530+CC_LE*0x1000,
696 0x0AC0+(0xf-CC_LE)*0x1000, "r", 0, SIZE_NONE, 0,
697 cris_scc_op},
698
699 {"slo",
700 0x0530+CC_LO*0x1000,
701 0x0AC0+(0xf-CC_LO)*0x1000, "r", 0, SIZE_NONE, 0,
702 cris_scc_op},
703
704 {"sls",
705 0x0530+CC_LS*0x1000,
706 0x0AC0+(0xf-CC_LS)*0x1000, "r", 0, SIZE_NONE, 0,
707 cris_scc_op},
708
709 {"slt",
710 0x0530+CC_LT*0x1000,
711 0x0AC0+(0xf-CC_LT)*0x1000, "r", 0, SIZE_NONE, 0,
712 cris_scc_op},
713
714 {"smi",
715 0x0530+CC_MI*0x1000,
716 0x0AC0+(0xf-CC_MI)*0x1000, "r", 0, SIZE_NONE, 0,
717 cris_scc_op},
718
719 {"sne",
720 0x0530+CC_NE*0x1000,
721 0x0AC0+(0xf-CC_NE)*0x1000, "r", 0, SIZE_NONE, 0,
722 cris_scc_op},
723
724 {"spl",
725 0x0530+CC_PL*0x1000,
726 0x0AC0+(0xf-CC_PL)*0x1000, "r", 0, SIZE_NONE, 0,
727 cris_scc_op},
728
729 {"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE, 0,
730 cris_reg_mode_add_sub_cmp_and_or_move_op},
731
732 {"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD, 0,
733 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
734
735 {"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE, 0,
736 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
737
738 {"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE, 0,
739 cris_three_operand_add_sub_cmp_and_or_op},
740
741 {"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE, 0,
742 cris_quick_mode_add_sub_op},
743
744 {"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE, 0,
745 cris_reg_mode_add_sub_cmp_and_or_move_op},
746
747 {"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD, 0,
748 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
749
750 {"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE, 0,
751 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
752
753 {"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE, 0,
754 cris_three_operand_add_sub_cmp_and_or_op},
755
756 {"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE, 0,
757 cris_reg_mode_add_sub_cmp_and_or_move_op},
758
759 {"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD, 0,
760 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
761
762 {"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE, 0,
763 cris_none_reg_mode_add_sub_cmp_and_or_move_op},
764
765 {"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE, 0,
766 cris_three_operand_add_sub_cmp_and_or_op},
767
768 {"svc",
769 0x0530+CC_VC*0x1000,
770 0x0AC0+(0xf-CC_VC)*0x1000, "r", 0, SIZE_NONE, 0,
771 cris_scc_op},
772
773 {"svs",
774 0x0530+CC_VS*0x1000,
775 0x0AC0+(0xf-CC_VS)*0x1000, "r", 0, SIZE_NONE, 0,
776 cris_scc_op},
777
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,
782 cris_ver_v8p,
783 cris_not_implemented_op},
784
785 {"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE,
786 cris_ver_v8p,
787 cris_not_implemented_op},
788
789 {"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE,
790 cris_ver_v8p,
791 cris_not_implemented_op},
792
793 {"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE,
794 cris_ver_v8p,
795 cris_not_implemented_op},
796
797 {"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE,
798 cris_ver_v8p,
799 cris_not_implemented_op},
800
801 {"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE,
802 cris_ver_v8p,
803 cris_not_implemented_op},
804
805 {"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE,
806 cris_ver_v8p,
807 cris_not_implemented_op},
808
809 {"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE,
810 cris_ver_v8p,
811 cris_not_implemented_op},
812
813 {"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE,
814 cris_ver_v8p,
815 cris_not_implemented_op},
816
817 {"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE,
818 cris_ver_v8p,
819 cris_not_implemented_op},
820
821 {"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE,
822 cris_ver_v8p,
823 cris_not_implemented_op},
824
825 {"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE,
826 cris_ver_v8p,
827 cris_not_implemented_op},
828
829 {"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE,
830 cris_ver_v8p,
831 cris_not_implemented_op},
832
833 {"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE,
834 cris_ver_v8p,
835 cris_not_implemented_op},
836
837 {"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE,
838 cris_ver_v8p,
839 cris_not_implemented_op},
840
841 {"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE, 0,
842 cris_reg_mode_test_op},
843
844 {"test", 0x0b80, 0xf040, "m s", 0, SIZE_FIELD, 0,
845 cris_none_reg_mode_clear_test_op},
846
847 {"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE, 0,
848 cris_none_reg_mode_clear_test_op},
849
850 {"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE, 0,
851 cris_xor_op},
852
853 {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
854 };
855
856 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
857 const char * const
858 cris_cc_strings[] =
859 {
860 "hs",
861 "lo",
862 "ne",
863 "eq",
864 "vc",
865 "vs",
866 "pl",
867 "mi",
868 "ls",
869 "hi",
870 "ge",
871 "lt",
872 "gt",
873 "le",
874 "a",
875 /* In v0, this would be "ext". */
876 "wf",
877 };
878
879
880 /*
881 * Local variables:
882 * eval: (c-set-style "gnu")
883 * indent-tabs-mode: t
884 * End:
885 */
This page took 0.065185 seconds and 5 git commands to generate.