xref: /openbmc/qemu/disas/cris.c (revision 2037a739)
176cad711SPaolo Bonzini /* Disassembler code for CRIS.
276cad711SPaolo Bonzini    Copyright 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc.
376cad711SPaolo Bonzini    Contributed by Axis Communications AB, Lund, Sweden.
476cad711SPaolo Bonzini    Written by Hans-Peter Nilsson.
576cad711SPaolo Bonzini 
676cad711SPaolo Bonzini    This file is part of the GNU binutils and GDB, the GNU debugger.
776cad711SPaolo Bonzini 
876cad711SPaolo Bonzini    This program is free software; you can redistribute it and/or modify it
976cad711SPaolo Bonzini    under the terms of the GNU General Public License as published by the
1076cad711SPaolo Bonzini    Free Software Foundation; either version 2, or (at your option) any later
1176cad711SPaolo Bonzini    version.
1276cad711SPaolo Bonzini 
1376cad711SPaolo Bonzini    This program is distributed in the hope that it will be useful, but WITHOUT
1476cad711SPaolo Bonzini    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1576cad711SPaolo Bonzini    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1676cad711SPaolo Bonzini    more details.
1776cad711SPaolo Bonzini 
1876cad711SPaolo Bonzini    You should have received a copy of the GNU General Public License
1976cad711SPaolo Bonzini    along with this program; if not, see <http://www.gnu.org/licenses/>. */
2076cad711SPaolo Bonzini 
2123b0d7dfSPeter Maydell #include "qemu/osdep.h"
223979fca4SMarkus Armbruster #include "disas/dis-asm.h"
23fcf5ef2aSThomas Huth #include "target/cris/opcode-cris.h"
2476cad711SPaolo Bonzini 
2576cad711SPaolo Bonzini #define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0)
2676cad711SPaolo Bonzini 
2776cad711SPaolo Bonzini /* cris-opc.c -- Table of opcodes for the CRIS processor.
2876cad711SPaolo Bonzini    Copyright 2000, 2001, 2004 Free Software Foundation, Inc.
2976cad711SPaolo Bonzini    Contributed by Axis Communications AB, Lund, Sweden.
3076cad711SPaolo Bonzini    Originally written for GAS 1.38.1 by Mikael Asker.
3176cad711SPaolo Bonzini    Reorganized by Hans-Peter Nilsson.
3276cad711SPaolo Bonzini 
3376cad711SPaolo Bonzini This file is part of GAS, GDB and the GNU binutils.
3476cad711SPaolo Bonzini 
3576cad711SPaolo Bonzini GAS, GDB, and GNU binutils is free software; you can redistribute it
3676cad711SPaolo Bonzini and/or modify it under the terms of the GNU General Public License as
3776cad711SPaolo Bonzini published by the Free Software Foundation; either version 2, or (at your
3876cad711SPaolo Bonzini option) any later version.
3976cad711SPaolo Bonzini 
4076cad711SPaolo Bonzini GAS, GDB, and GNU binutils are distributed in the hope that they will be
4176cad711SPaolo Bonzini useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
4276cad711SPaolo Bonzini MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4376cad711SPaolo Bonzini GNU General Public License for more details.
4476cad711SPaolo Bonzini 
4576cad711SPaolo Bonzini You should have received a copy of the GNU General Public License
4676cad711SPaolo Bonzini along with this program; if not, see <http://www.gnu.org/licenses/>.  */
4776cad711SPaolo Bonzini 
4876cad711SPaolo Bonzini #ifndef NULL
4976cad711SPaolo Bonzini #define NULL (0)
5076cad711SPaolo Bonzini #endif
5176cad711SPaolo Bonzini 
5276cad711SPaolo Bonzini /* This table isn't used for CRISv32 and the size of immediate operands.  */
5376cad711SPaolo Bonzini const struct cris_spec_reg
5476cad711SPaolo Bonzini cris_spec_regs[] =
5576cad711SPaolo Bonzini {
5676cad711SPaolo Bonzini   {"bz",  0,  1, cris_ver_v32p,	   NULL},
5776cad711SPaolo Bonzini   {"p0",  0,  1, 0,		   NULL},
5876cad711SPaolo Bonzini   {"vr",  1,  1, 0,		   NULL},
5976cad711SPaolo Bonzini   {"p1",  1,  1, 0,		   NULL},
6076cad711SPaolo Bonzini   {"pid", 2,  1, cris_ver_v32p,    NULL},
6176cad711SPaolo Bonzini   {"p2",  2,  1, cris_ver_v32p,	   NULL},
6276cad711SPaolo Bonzini   {"p2",  2,  1, cris_ver_warning, NULL},
6376cad711SPaolo Bonzini   {"srs", 3,  1, cris_ver_v32p,    NULL},
6476cad711SPaolo Bonzini   {"p3",  3,  1, cris_ver_v32p,	   NULL},
6576cad711SPaolo Bonzini   {"p3",  3,  1, cris_ver_warning, NULL},
6676cad711SPaolo Bonzini   {"wz",  4,  2, cris_ver_v32p,	   NULL},
6776cad711SPaolo Bonzini   {"p4",  4,  2, 0,		   NULL},
6876cad711SPaolo Bonzini   {"ccr", 5,  2, cris_ver_v0_10,   NULL},
6976cad711SPaolo Bonzini   {"exs", 5,  4, cris_ver_v32p,	   NULL},
7076cad711SPaolo Bonzini   {"p5",  5,  2, cris_ver_v0_10,   NULL},
7176cad711SPaolo Bonzini   {"p5",  5,  4, cris_ver_v32p,	   NULL},
7276cad711SPaolo Bonzini   {"dcr0",6,  2, cris_ver_v0_3,	   NULL},
7376cad711SPaolo Bonzini   {"eda", 6,  4, cris_ver_v32p,	   NULL},
7476cad711SPaolo Bonzini   {"p6",  6,  2, cris_ver_v0_3,	   NULL},
7576cad711SPaolo Bonzini   {"p6",  6,  4, cris_ver_v32p,	   NULL},
7676cad711SPaolo Bonzini   {"dcr1/mof", 7, 4, cris_ver_v10p,
7776cad711SPaolo Bonzini    "Register `dcr1/mof' with ambiguous size specified.  Guessing 4 bytes"},
7876cad711SPaolo Bonzini   {"dcr1/mof", 7, 2, cris_ver_v0_3,
7976cad711SPaolo Bonzini    "Register `dcr1/mof' with ambiguous size specified.  Guessing 2 bytes"},
8076cad711SPaolo Bonzini   {"mof", 7,  4, cris_ver_v10p,	   NULL},
8176cad711SPaolo Bonzini   {"dcr1",7,  2, cris_ver_v0_3,	   NULL},
8276cad711SPaolo Bonzini   {"p7",  7,  4, cris_ver_v10p,	   NULL},
8376cad711SPaolo Bonzini   {"p7",  7,  2, cris_ver_v0_3,	   NULL},
8476cad711SPaolo Bonzini   {"dz",  8,  4, cris_ver_v32p,	   NULL},
8576cad711SPaolo Bonzini   {"p8",  8,  4, 0,		   NULL},
8676cad711SPaolo Bonzini   {"ibr", 9,  4, cris_ver_v0_10,   NULL},
8776cad711SPaolo Bonzini   {"ebp", 9,  4, cris_ver_v32p,	   NULL},
8876cad711SPaolo Bonzini   {"p9",  9,  4, 0,		   NULL},
8976cad711SPaolo Bonzini   {"irp", 10, 4, cris_ver_v0_10,   NULL},
9076cad711SPaolo Bonzini   {"erp", 10, 4, cris_ver_v32p,	   NULL},
9176cad711SPaolo Bonzini   {"p10", 10, 4, 0,		   NULL},
9276cad711SPaolo Bonzini   {"srp", 11, 4, 0,		   NULL},
9376cad711SPaolo Bonzini   {"p11", 11, 4, 0,		   NULL},
9476cad711SPaolo Bonzini   /* For disassembly use only.  Accept at assembly with a warning.  */
9576cad711SPaolo Bonzini   {"bar/dtp0", 12, 4, cris_ver_warning,
9676cad711SPaolo Bonzini    "Ambiguous register `bar/dtp0' specified"},
9776cad711SPaolo Bonzini   {"nrp", 12, 4, cris_ver_v32p,	   NULL},
9876cad711SPaolo Bonzini   {"bar", 12, 4, cris_ver_v8_10,   NULL},
9976cad711SPaolo Bonzini   {"dtp0",12, 4, cris_ver_v0_3,	   NULL},
10076cad711SPaolo Bonzini   {"p12", 12, 4, 0,		   NULL},
10176cad711SPaolo Bonzini   /* For disassembly use only.  Accept at assembly with a warning.  */
10276cad711SPaolo Bonzini   {"dccr/dtp1",13, 4, cris_ver_warning,
10376cad711SPaolo Bonzini    "Ambiguous register `dccr/dtp1' specified"},
10476cad711SPaolo Bonzini   {"ccs", 13, 4, cris_ver_v32p,	   NULL},
10576cad711SPaolo Bonzini   {"dccr",13, 4, cris_ver_v8_10,   NULL},
10676cad711SPaolo Bonzini   {"dtp1",13, 4, cris_ver_v0_3,	   NULL},
10776cad711SPaolo Bonzini   {"p13", 13, 4, 0,		   NULL},
10876cad711SPaolo Bonzini   {"brp", 14, 4, cris_ver_v3_10,   NULL},
10976cad711SPaolo Bonzini   {"usp", 14, 4, cris_ver_v32p,	   NULL},
11076cad711SPaolo Bonzini   {"p14", 14, 4, cris_ver_v3p,	   NULL},
11176cad711SPaolo Bonzini   {"usp", 15, 4, cris_ver_v10,	   NULL},
11276cad711SPaolo Bonzini   {"spc", 15, 4, cris_ver_v32p,	   NULL},
11376cad711SPaolo Bonzini   {"p15", 15, 4, cris_ver_v10p,	   NULL},
11476cad711SPaolo Bonzini   {NULL, 0, 0, cris_ver_version_all, NULL}
11576cad711SPaolo Bonzini };
11676cad711SPaolo Bonzini 
11776cad711SPaolo Bonzini /* Add version specifiers to this table when necessary.
11876cad711SPaolo Bonzini    The (now) regular coding of register names suggests a simpler
11976cad711SPaolo Bonzini    implementation.  */
12076cad711SPaolo Bonzini const struct cris_support_reg cris_support_regs[] =
12176cad711SPaolo Bonzini {
12276cad711SPaolo Bonzini   {"s0", 0},
12376cad711SPaolo Bonzini   {"s1", 1},
12476cad711SPaolo Bonzini   {"s2", 2},
12576cad711SPaolo Bonzini   {"s3", 3},
12676cad711SPaolo Bonzini   {"s4", 4},
12776cad711SPaolo Bonzini   {"s5", 5},
12876cad711SPaolo Bonzini   {"s6", 6},
12976cad711SPaolo Bonzini   {"s7", 7},
13076cad711SPaolo Bonzini   {"s8", 8},
13176cad711SPaolo Bonzini   {"s9", 9},
13276cad711SPaolo Bonzini   {"s10", 10},
13376cad711SPaolo Bonzini   {"s11", 11},
13476cad711SPaolo Bonzini   {"s12", 12},
13576cad711SPaolo Bonzini   {"s13", 13},
13676cad711SPaolo Bonzini   {"s14", 14},
13776cad711SPaolo Bonzini   {"s15", 15},
13876cad711SPaolo Bonzini   {NULL, 0}
13976cad711SPaolo Bonzini };
14076cad711SPaolo Bonzini 
14176cad711SPaolo Bonzini /* All CRIS opcodes are 16 bits.
14276cad711SPaolo Bonzini 
14376cad711SPaolo Bonzini    - The match component is a mask saying which bits must match a
14476cad711SPaolo Bonzini      particular opcode in order for an instruction to be an instance
14576cad711SPaolo Bonzini      of that opcode.
14676cad711SPaolo Bonzini 
14776cad711SPaolo Bonzini    - The args component is a string containing characters symbolically
14876cad711SPaolo Bonzini      matching the operands of an instruction.  Used for both assembly
14976cad711SPaolo Bonzini      and disassembly.
15076cad711SPaolo Bonzini 
15176cad711SPaolo Bonzini      Operand-matching characters:
15276cad711SPaolo Bonzini      [ ] , space
15376cad711SPaolo Bonzini         Verbatim.
15476cad711SPaolo Bonzini      A	The string "ACR" (case-insensitive).
15576cad711SPaolo Bonzini      B	Not really an operand.  It causes a "BDAP -size,SP" prefix to be
15676cad711SPaolo Bonzini 	output for the PUSH alias-instructions and recognizes a push-
15776cad711SPaolo Bonzini 	prefix at disassembly.  This letter isn't recognized for v32.
15876cad711SPaolo Bonzini 	Must be followed by a R or P letter.
15976cad711SPaolo Bonzini      !	Non-match pattern, will not match if there's a prefix insn.
16076cad711SPaolo Bonzini      b	Non-matching operand, used for branches with 16-bit
16176cad711SPaolo Bonzini 	displacement. Only recognized by the disassembler.
16276cad711SPaolo Bonzini      c	5-bit unsigned immediate in bits <4:0>.
16376cad711SPaolo Bonzini      C	4-bit unsigned immediate in bits <3:0>.
16476cad711SPaolo Bonzini      d  At assembly, optionally (as in put other cases before this one)
16576cad711SPaolo Bonzini 	".d" or ".D" at the start of the operands, followed by one space
16676cad711SPaolo Bonzini 	character.  At disassembly, nothing.
16776cad711SPaolo Bonzini      D	General register in bits <15:12> and <3:0>.
16876cad711SPaolo Bonzini      f	List of flags in bits <15:12> and <3:0>.
16976cad711SPaolo Bonzini      i	6-bit signed immediate in bits <5:0>.
17076cad711SPaolo Bonzini      I	6-bit unsigned immediate in bits <5:0>.
17176cad711SPaolo Bonzini      M	Size modifier (B, W or D) for CLEAR instructions.
17276cad711SPaolo Bonzini      m	Size modifier (B, W or D) in bits <5:4>
17376cad711SPaolo Bonzini      N  A 32-bit dword, like in the difference between s and y.
17476cad711SPaolo Bonzini         This has no effect on bits in the opcode.  Can also be expressed
17576cad711SPaolo Bonzini 	as "[pc+]" in input.
17676cad711SPaolo Bonzini      n  As N, but PC-relative (to the start of the instruction).
17776cad711SPaolo Bonzini      o	[-128..127] word offset in bits <7:1> and <0>.  Used by 8-bit
17876cad711SPaolo Bonzini 	branch instructions.
17976cad711SPaolo Bonzini      O	[-128..127] offset in bits <7:0>.  Also matches a comma and a
18076cad711SPaolo Bonzini 	general register after the expression, in bits <15:12>.  Used
18176cad711SPaolo Bonzini 	only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode).
18276cad711SPaolo Bonzini      P	Special register in bits <15:12>.
18376cad711SPaolo Bonzini      p	Indicates that the insn is a prefix insn.  Must be first
18476cad711SPaolo Bonzini 	character.
18576cad711SPaolo Bonzini      Q  As O, but don't relax; force an 8-bit offset.
18676cad711SPaolo Bonzini      R	General register in bits <15:12>.
18776cad711SPaolo Bonzini      r	General register in bits <3:0>.
18876cad711SPaolo Bonzini      S	Source operand in bit <10> and a prefix; a 3-operand prefix
18976cad711SPaolo Bonzini 	without side-effect.
19076cad711SPaolo Bonzini      s	Source operand in bits <10> and <3:0>, optionally with a
19176cad711SPaolo Bonzini 	side-effect prefix, except [pc] (the name, not R15 as in ACR)
19276cad711SPaolo Bonzini 	isn't allowed for v32 and higher.
19376cad711SPaolo Bonzini      T  Support register in bits <15:12>.
19476cad711SPaolo Bonzini      u  4-bit (PC-relative) unsigned immediate word offset in bits <3:0>.
19576cad711SPaolo Bonzini      U  Relaxes to either u or n, instruction is assumed LAPCQ or LAPC.
19676cad711SPaolo Bonzini 	Not recognized at disassembly.
19776cad711SPaolo Bonzini      x	Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>.
19876cad711SPaolo Bonzini      y	Like 's' but do not allow an integer at assembly.
19976cad711SPaolo Bonzini      Y	The difference s-y; only an integer is allowed.
20076cad711SPaolo Bonzini      z	Size modifier (B or W) in bit <4>.  */
20176cad711SPaolo Bonzini 
20276cad711SPaolo Bonzini 
20376cad711SPaolo Bonzini /* Please note the order of the opcodes in this table is significant.
20476cad711SPaolo Bonzini    The assembler requires that all instances of the same mnemonic must
20576cad711SPaolo Bonzini    be consecutive.  If they aren't, the assembler might not recognize
20676cad711SPaolo Bonzini    them, or may indicate an internal error.
20776cad711SPaolo Bonzini 
20876cad711SPaolo Bonzini    The disassembler should not normally care about the order of the
20976cad711SPaolo Bonzini    opcodes, but will prefer an earlier alternative if the "match-score"
21076cad711SPaolo Bonzini    (see cris-dis.c) is computed as equal.
21176cad711SPaolo Bonzini 
21276cad711SPaolo Bonzini    It should not be significant for proper execution that this table is
21376cad711SPaolo Bonzini    in alphabetical order, but please follow that convention for an easy
21476cad711SPaolo Bonzini    overview.  */
21576cad711SPaolo Bonzini 
21676cad711SPaolo Bonzini const struct cris_opcode
21776cad711SPaolo Bonzini cris_opcodes[] =
21876cad711SPaolo Bonzini {
21976cad711SPaolo Bonzini   {"abs",     0x06B0, 0x0940,		  "r,R",     0, SIZE_NONE,     0,
22076cad711SPaolo Bonzini    cris_abs_op},
22176cad711SPaolo Bonzini 
22276cad711SPaolo Bonzini   {"add",     0x0600, 0x09c0,		  "m r,R",   0, SIZE_NONE,     0,
22376cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
22476cad711SPaolo Bonzini 
22576cad711SPaolo Bonzini   {"add",     0x0A00, 0x01c0,		  "m s,R",   0, SIZE_FIELD,    0,
22676cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
22776cad711SPaolo Bonzini 
22876cad711SPaolo Bonzini   {"add",     0x0A00, 0x01c0,		  "m S,D",   0, SIZE_NONE,
22976cad711SPaolo Bonzini    cris_ver_v0_10,
23076cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
23176cad711SPaolo Bonzini 
23276cad711SPaolo Bonzini   {"add",     0x0a00, 0x05c0,		  "m S,R,r", 0, SIZE_NONE,
23376cad711SPaolo Bonzini    cris_ver_v0_10,
23476cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
23576cad711SPaolo Bonzini 
23676cad711SPaolo Bonzini   {"add",     0x0A00, 0x01c0,		  "m s,R",   0, SIZE_FIELD,
23776cad711SPaolo Bonzini    cris_ver_v32p,
23876cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
23976cad711SPaolo Bonzini 
24076cad711SPaolo Bonzini   {"addc",    0x0570, 0x0A80,		  "r,R",     0, SIZE_FIX_32,
24176cad711SPaolo Bonzini    cris_ver_v32p,
24276cad711SPaolo Bonzini    cris_not_implemented_op},
24376cad711SPaolo Bonzini 
24476cad711SPaolo Bonzini   {"addc",    0x09A0, 0x0250,		  "s,R",     0, SIZE_FIX_32,
24576cad711SPaolo Bonzini    cris_ver_v32p,
24676cad711SPaolo Bonzini    cris_not_implemented_op},
24776cad711SPaolo Bonzini 
24876cad711SPaolo Bonzini   {"addi",    0x0540, 0x0A80,		  "x,r,A",   0, SIZE_NONE,
24976cad711SPaolo Bonzini    cris_ver_v32p,
25076cad711SPaolo Bonzini    cris_addi_op},
25176cad711SPaolo Bonzini 
25276cad711SPaolo Bonzini   {"addi",    0x0500, 0x0Ac0,		  "x,r",     0, SIZE_NONE,     0,
25376cad711SPaolo Bonzini    cris_addi_op},
25476cad711SPaolo Bonzini 
25576cad711SPaolo Bonzini   /* This collates after "addo", but we want to disassemble as "addoq",
25676cad711SPaolo Bonzini      not "addo".  */
25776cad711SPaolo Bonzini   {"addoq",   0x0100, 0x0E00,		  "Q,A",     0, SIZE_NONE,
25876cad711SPaolo Bonzini    cris_ver_v32p,
25976cad711SPaolo Bonzini    cris_not_implemented_op},
26076cad711SPaolo Bonzini 
26176cad711SPaolo Bonzini   {"addo",    0x0940, 0x0280,		  "m s,R,A", 0, SIZE_FIELD_SIGNED,
26276cad711SPaolo Bonzini    cris_ver_v32p,
26376cad711SPaolo Bonzini    cris_not_implemented_op},
26476cad711SPaolo Bonzini 
26576cad711SPaolo Bonzini   /* This must be located after the insn above, lest we misinterpret
26676cad711SPaolo Bonzini      "addo.b -1,r0,acr" as "addo .b-1,r0,acr".  FIXME: Sounds like a
26776cad711SPaolo Bonzini      parser bug.  */
26876cad711SPaolo Bonzini   {"addo",   0x0100, 0x0E00,		  "O,A",     0, SIZE_NONE,
26976cad711SPaolo Bonzini    cris_ver_v32p,
27076cad711SPaolo Bonzini    cris_not_implemented_op},
27176cad711SPaolo Bonzini 
27276cad711SPaolo Bonzini   {"addq",    0x0200, 0x0Dc0,		  "I,R",     0, SIZE_NONE,     0,
27376cad711SPaolo Bonzini    cris_quick_mode_add_sub_op},
27476cad711SPaolo Bonzini 
27576cad711SPaolo Bonzini   {"adds",    0x0420, 0x0Bc0,		  "z r,R",   0, SIZE_NONE,     0,
27676cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
27776cad711SPaolo Bonzini 
27876cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
27976cad711SPaolo Bonzini   {"adds",    0x0820, 0x03c0,		  "z s,R",   0, SIZE_FIELD,    0,
28076cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
28176cad711SPaolo Bonzini 
28276cad711SPaolo Bonzini   {"adds",    0x0820, 0x03c0,		  "z S,D",   0, SIZE_NONE,
28376cad711SPaolo Bonzini    cris_ver_v0_10,
28476cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
28576cad711SPaolo Bonzini 
28676cad711SPaolo Bonzini   {"adds",    0x0820, 0x07c0,		  "z S,R,r", 0, SIZE_NONE,
28776cad711SPaolo Bonzini    cris_ver_v0_10,
28876cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
28976cad711SPaolo Bonzini 
29076cad711SPaolo Bonzini   {"addu",    0x0400, 0x0be0,		  "z r,R",   0, SIZE_NONE,     0,
29176cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
29276cad711SPaolo Bonzini 
29376cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
29476cad711SPaolo Bonzini   {"addu",    0x0800, 0x03e0,		  "z s,R",   0, SIZE_FIELD,    0,
29576cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
29676cad711SPaolo Bonzini 
29776cad711SPaolo Bonzini   {"addu",    0x0800, 0x03e0,		  "z S,D",   0, SIZE_NONE,
29876cad711SPaolo Bonzini    cris_ver_v0_10,
29976cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
30076cad711SPaolo Bonzini 
30176cad711SPaolo Bonzini   {"addu",    0x0800, 0x07e0,		  "z S,R,r", 0, SIZE_NONE,
30276cad711SPaolo Bonzini    cris_ver_v0_10,
30376cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
30476cad711SPaolo Bonzini 
30576cad711SPaolo Bonzini   {"and",     0x0700, 0x08C0,		  "m r,R",   0, SIZE_NONE,     0,
30676cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
30776cad711SPaolo Bonzini 
30876cad711SPaolo Bonzini   {"and",     0x0B00, 0x00C0,		  "m s,R",   0, SIZE_FIELD,    0,
30976cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
31076cad711SPaolo Bonzini 
31176cad711SPaolo Bonzini   {"and",     0x0B00, 0x00C0,		  "m S,D",   0, SIZE_NONE,
31276cad711SPaolo Bonzini    cris_ver_v0_10,
31376cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
31476cad711SPaolo Bonzini 
31576cad711SPaolo Bonzini   {"and",     0x0B00, 0x04C0,		  "m S,R,r", 0, SIZE_NONE,
31676cad711SPaolo Bonzini    cris_ver_v0_10,
31776cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
31876cad711SPaolo Bonzini 
31976cad711SPaolo Bonzini   {"andq",    0x0300, 0x0CC0,		  "i,R",     0, SIZE_NONE,     0,
32076cad711SPaolo Bonzini    cris_quick_mode_and_cmp_move_or_op},
32176cad711SPaolo Bonzini 
32276cad711SPaolo Bonzini   {"asr",     0x0780, 0x0840,		  "m r,R",   0, SIZE_NONE,     0,
32376cad711SPaolo Bonzini    cris_asr_op},
32476cad711SPaolo Bonzini 
32576cad711SPaolo Bonzini   {"asrq",    0x03a0, 0x0c40,		  "c,R",     0, SIZE_NONE,     0,
32676cad711SPaolo Bonzini    cris_asrq_op},
32776cad711SPaolo Bonzini 
32876cad711SPaolo Bonzini   {"ax",      0x15B0, 0xEA4F,		  "",	     0, SIZE_NONE,     0,
32976cad711SPaolo Bonzini    cris_ax_ei_setf_op},
33076cad711SPaolo Bonzini 
33176cad711SPaolo Bonzini   /* FIXME: Should use branch #defines.  */
33276cad711SPaolo Bonzini   {"b",	      0x0dff, 0x0200,		  "b",	     1, SIZE_NONE,     0,
33376cad711SPaolo Bonzini    cris_sixteen_bit_offset_branch_op},
33476cad711SPaolo Bonzini 
33576cad711SPaolo Bonzini   {"ba",
33676cad711SPaolo Bonzini    BA_QUICK_OPCODE,
33776cad711SPaolo Bonzini    0x0F00+(0xF-CC_A)*0x1000,		  "o",	     1, SIZE_NONE,     0,
33876cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
33976cad711SPaolo Bonzini 
34076cad711SPaolo Bonzini   /* Needs to come after the usual "ba o", which might be relaxed to
34176cad711SPaolo Bonzini      this one.  */
34276cad711SPaolo Bonzini   {"ba",     BA_DWORD_OPCODE,
34376cad711SPaolo Bonzini    0xffff & (~BA_DWORD_OPCODE),		  "n",	     0, SIZE_FIX_32,
34476cad711SPaolo Bonzini    cris_ver_v32p,
34576cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
34676cad711SPaolo Bonzini 
34776cad711SPaolo Bonzini   {"bas",     0x0EBF, 0x0140,		  "n,P",     0, SIZE_FIX_32,
34876cad711SPaolo Bonzini    cris_ver_v32p,
34976cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
35076cad711SPaolo Bonzini 
35176cad711SPaolo Bonzini   {"basc",     0x0EFF, 0x0100,		  "n,P",     0, SIZE_FIX_32,
35276cad711SPaolo Bonzini    cris_ver_v32p,
35376cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
35476cad711SPaolo Bonzini 
35576cad711SPaolo Bonzini   {"bcc",
35676cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_CC*0x1000,
35776cad711SPaolo Bonzini    0x0f00+(0xF-CC_CC)*0x1000,		  "o",	     1, SIZE_NONE,     0,
35876cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
35976cad711SPaolo Bonzini 
36076cad711SPaolo Bonzini   {"bcs",
36176cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_CS*0x1000,
36276cad711SPaolo Bonzini    0x0f00+(0xF-CC_CS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
36376cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
36476cad711SPaolo Bonzini 
36576cad711SPaolo Bonzini   {"bdap",
36676cad711SPaolo Bonzini    BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS,  "pm s,R",  0, SIZE_FIELD_SIGNED,
36776cad711SPaolo Bonzini    cris_ver_v0_10,
36876cad711SPaolo Bonzini    cris_bdap_prefix},
36976cad711SPaolo Bonzini 
37076cad711SPaolo Bonzini   {"bdap",
37176cad711SPaolo Bonzini    BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS,  "pO",	     0, SIZE_NONE,
37276cad711SPaolo Bonzini    cris_ver_v0_10,
37376cad711SPaolo Bonzini    cris_quick_mode_bdap_prefix},
37476cad711SPaolo Bonzini 
37576cad711SPaolo Bonzini   {"beq",
37676cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_EQ*0x1000,
37776cad711SPaolo Bonzini    0x0f00+(0xF-CC_EQ)*0x1000,		  "o",	     1, SIZE_NONE,     0,
37876cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
37976cad711SPaolo Bonzini 
38076cad711SPaolo Bonzini   /* This is deliberately put before "bext" to trump it, even though not
38176cad711SPaolo Bonzini      in alphabetical order, since we don't do excluding version checks
38276cad711SPaolo Bonzini      for v0..v10.  */
38376cad711SPaolo Bonzini   {"bwf",
38476cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
38576cad711SPaolo Bonzini    0x0f00+(0xF-CC_EXT)*0x1000,		  "o",	     1, SIZE_NONE,
38676cad711SPaolo Bonzini    cris_ver_v10,
38776cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
38876cad711SPaolo Bonzini 
38976cad711SPaolo Bonzini   {"bext",
39076cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
39176cad711SPaolo Bonzini    0x0f00+(0xF-CC_EXT)*0x1000,		  "o",	     1, SIZE_NONE,
39276cad711SPaolo Bonzini    cris_ver_v0_3,
39376cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
39476cad711SPaolo Bonzini 
39576cad711SPaolo Bonzini   {"bge",
39676cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_GE*0x1000,
39776cad711SPaolo Bonzini    0x0f00+(0xF-CC_GE)*0x1000,		  "o",	     1, SIZE_NONE,     0,
39876cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
39976cad711SPaolo Bonzini 
40076cad711SPaolo Bonzini   {"bgt",
40176cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_GT*0x1000,
40276cad711SPaolo Bonzini    0x0f00+(0xF-CC_GT)*0x1000,		  "o",	     1, SIZE_NONE,     0,
40376cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
40476cad711SPaolo Bonzini 
40576cad711SPaolo Bonzini   {"bhi",
40676cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_HI*0x1000,
40776cad711SPaolo Bonzini    0x0f00+(0xF-CC_HI)*0x1000,		  "o",	     1, SIZE_NONE,     0,
40876cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
40976cad711SPaolo Bonzini 
41076cad711SPaolo Bonzini   {"bhs",
41176cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_HS*0x1000,
41276cad711SPaolo Bonzini    0x0f00+(0xF-CC_HS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
41376cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
41476cad711SPaolo Bonzini 
41576cad711SPaolo Bonzini   {"biap", BIAP_OPCODE, BIAP_Z_BITS,	  "pm r,R",  0, SIZE_NONE,
41676cad711SPaolo Bonzini    cris_ver_v0_10,
41776cad711SPaolo Bonzini    cris_biap_prefix},
41876cad711SPaolo Bonzini 
41976cad711SPaolo Bonzini   {"ble",
42076cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_LE*0x1000,
42176cad711SPaolo Bonzini    0x0f00+(0xF-CC_LE)*0x1000,		  "o",	     1, SIZE_NONE,     0,
42276cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
42376cad711SPaolo Bonzini 
42476cad711SPaolo Bonzini   {"blo",
42576cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_LO*0x1000,
42676cad711SPaolo Bonzini    0x0f00+(0xF-CC_LO)*0x1000,		  "o",	     1, SIZE_NONE,     0,
42776cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
42876cad711SPaolo Bonzini 
42976cad711SPaolo Bonzini   {"bls",
43076cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_LS*0x1000,
43176cad711SPaolo Bonzini    0x0f00+(0xF-CC_LS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
43276cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
43376cad711SPaolo Bonzini 
43476cad711SPaolo Bonzini   {"blt",
43576cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_LT*0x1000,
43676cad711SPaolo Bonzini    0x0f00+(0xF-CC_LT)*0x1000,		  "o",	     1, SIZE_NONE,     0,
43776cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
43876cad711SPaolo Bonzini 
43976cad711SPaolo Bonzini   {"bmi",
44076cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_MI*0x1000,
44176cad711SPaolo Bonzini    0x0f00+(0xF-CC_MI)*0x1000,		  "o",	     1, SIZE_NONE,     0,
44276cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
44376cad711SPaolo Bonzini 
44476cad711SPaolo Bonzini   {"bmod",    0x0ab0, 0x0140,		  "s,R",     0, SIZE_FIX_32,
44576cad711SPaolo Bonzini    cris_ver_sim_v0_10,
44676cad711SPaolo Bonzini    cris_not_implemented_op},
44776cad711SPaolo Bonzini 
44876cad711SPaolo Bonzini   {"bmod",    0x0ab0, 0x0140,		  "S,D",     0, SIZE_NONE,
44976cad711SPaolo Bonzini    cris_ver_sim_v0_10,
45076cad711SPaolo Bonzini    cris_not_implemented_op},
45176cad711SPaolo Bonzini 
45276cad711SPaolo Bonzini   {"bmod",    0x0ab0, 0x0540,		  "S,R,r",   0, SIZE_NONE,
45376cad711SPaolo Bonzini    cris_ver_sim_v0_10,
45476cad711SPaolo Bonzini    cris_not_implemented_op},
45576cad711SPaolo Bonzini 
45676cad711SPaolo Bonzini   {"bne",
45776cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_NE*0x1000,
45876cad711SPaolo Bonzini    0x0f00+(0xF-CC_NE)*0x1000,		  "o",	     1, SIZE_NONE,     0,
45976cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
46076cad711SPaolo Bonzini 
46176cad711SPaolo Bonzini   {"bound",   0x05c0, 0x0A00,		  "m r,R",   0, SIZE_NONE,     0,
46276cad711SPaolo Bonzini    cris_two_operand_bound_op},
46376cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
46476cad711SPaolo Bonzini   {"bound",   0x09c0, 0x0200,		  "m s,R",   0, SIZE_FIELD,
46576cad711SPaolo Bonzini    cris_ver_v0_10,
46676cad711SPaolo Bonzini    cris_two_operand_bound_op},
46776cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
46876cad711SPaolo Bonzini   {"bound",   0x0dcf, 0x0200,		  "m Y,R",   0, SIZE_FIELD,    0,
46976cad711SPaolo Bonzini    cris_two_operand_bound_op},
47076cad711SPaolo Bonzini   {"bound",   0x09c0, 0x0200,		  "m S,D",   0, SIZE_NONE,
47176cad711SPaolo Bonzini    cris_ver_v0_10,
47276cad711SPaolo Bonzini    cris_two_operand_bound_op},
47376cad711SPaolo Bonzini   {"bound",   0x09c0, 0x0600,		  "m S,R,r", 0, SIZE_NONE,
47476cad711SPaolo Bonzini    cris_ver_v0_10,
47576cad711SPaolo Bonzini    cris_three_operand_bound_op},
47676cad711SPaolo Bonzini 
47776cad711SPaolo Bonzini   {"bpl",
47876cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_PL*0x1000,
47976cad711SPaolo Bonzini    0x0f00+(0xF-CC_PL)*0x1000,		  "o",	     1, SIZE_NONE,     0,
48076cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
48176cad711SPaolo Bonzini 
48276cad711SPaolo Bonzini   {"break",   0xe930, 0x16c0,		  "C",	     0, SIZE_NONE,
48376cad711SPaolo Bonzini    cris_ver_v3p,
48476cad711SPaolo Bonzini    cris_break_op},
48576cad711SPaolo Bonzini 
48676cad711SPaolo Bonzini   {"bsb",
48776cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_EXT*0x1000,
48876cad711SPaolo Bonzini    0x0f00+(0xF-CC_EXT)*0x1000,		  "o",	     1, SIZE_NONE,
48976cad711SPaolo Bonzini    cris_ver_v32p,
49076cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
49176cad711SPaolo Bonzini 
49276cad711SPaolo Bonzini   {"bsr",     0xBEBF, 0x4140,		  "n",	     0, SIZE_FIX_32,
49376cad711SPaolo Bonzini    cris_ver_v32p,
49476cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
49576cad711SPaolo Bonzini 
49676cad711SPaolo Bonzini   {"bsrc",     0xBEFF, 0x4100,		  "n",	     0, SIZE_FIX_32,
49776cad711SPaolo Bonzini    cris_ver_v32p,
49876cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
49976cad711SPaolo Bonzini 
50076cad711SPaolo Bonzini   {"bstore",  0x0af0, 0x0100,		  "s,R",     0, SIZE_FIX_32,
50176cad711SPaolo Bonzini    cris_ver_warning,
50276cad711SPaolo Bonzini    cris_not_implemented_op},
50376cad711SPaolo Bonzini 
50476cad711SPaolo Bonzini   {"bstore",  0x0af0, 0x0100,		  "S,D",     0, SIZE_NONE,
50576cad711SPaolo Bonzini    cris_ver_warning,
50676cad711SPaolo Bonzini    cris_not_implemented_op},
50776cad711SPaolo Bonzini 
50876cad711SPaolo Bonzini   {"bstore",  0x0af0, 0x0500,		  "S,R,r",   0, SIZE_NONE,
50976cad711SPaolo Bonzini    cris_ver_warning,
51076cad711SPaolo Bonzini    cris_not_implemented_op},
51176cad711SPaolo Bonzini 
51276cad711SPaolo Bonzini   {"btst",    0x04F0, 0x0B00,		  "r,R",     0, SIZE_NONE,     0,
51376cad711SPaolo Bonzini    cris_btst_nop_op},
51476cad711SPaolo Bonzini   {"btstq",   0x0380, 0x0C60,		  "c,R",     0, SIZE_NONE,     0,
51576cad711SPaolo Bonzini    cris_btst_nop_op},
51676cad711SPaolo Bonzini 
51776cad711SPaolo Bonzini   {"bvc",
51876cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_VC*0x1000,
51976cad711SPaolo Bonzini    0x0f00+(0xF-CC_VC)*0x1000,		  "o",	     1, SIZE_NONE,     0,
52076cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
52176cad711SPaolo Bonzini 
52276cad711SPaolo Bonzini   {"bvs",
52376cad711SPaolo Bonzini    BRANCH_QUICK_OPCODE+CC_VS*0x1000,
52476cad711SPaolo Bonzini    0x0f00+(0xF-CC_VS)*0x1000,		  "o",	     1, SIZE_NONE,     0,
52576cad711SPaolo Bonzini    cris_eight_bit_offset_branch_op},
52676cad711SPaolo Bonzini 
52776cad711SPaolo Bonzini   {"clear",   0x0670, 0x3980,		  "M r",     0, SIZE_NONE,     0,
52876cad711SPaolo Bonzini    cris_reg_mode_clear_op},
52976cad711SPaolo Bonzini 
53076cad711SPaolo Bonzini   {"clear",   0x0A70, 0x3180,		  "M y",     0, SIZE_NONE,     0,
53176cad711SPaolo Bonzini    cris_none_reg_mode_clear_test_op},
53276cad711SPaolo Bonzini 
53376cad711SPaolo Bonzini   {"clear",   0x0A70, 0x3180,		  "M S",     0, SIZE_NONE,
53476cad711SPaolo Bonzini    cris_ver_v0_10,
53576cad711SPaolo Bonzini    cris_none_reg_mode_clear_test_op},
53676cad711SPaolo Bonzini 
53776cad711SPaolo Bonzini   {"clearf",  0x05F0, 0x0A00,		  "f",	     0, SIZE_NONE,     0,
53876cad711SPaolo Bonzini    cris_clearf_di_op},
53976cad711SPaolo Bonzini 
54076cad711SPaolo Bonzini   {"cmp",     0x06C0, 0x0900,		  "m r,R",   0, SIZE_NONE,     0,
54176cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
54276cad711SPaolo Bonzini 
54376cad711SPaolo Bonzini   {"cmp",     0x0Ac0, 0x0100,		  "m s,R",   0, SIZE_FIELD,    0,
54476cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
54576cad711SPaolo Bonzini 
54676cad711SPaolo Bonzini   {"cmp",     0x0Ac0, 0x0100,		  "m S,D",   0, SIZE_NONE,
54776cad711SPaolo Bonzini    cris_ver_v0_10,
54876cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
54976cad711SPaolo Bonzini 
55076cad711SPaolo Bonzini   {"cmpq",    0x02C0, 0x0D00,		  "i,R",     0, SIZE_NONE,     0,
55176cad711SPaolo Bonzini    cris_quick_mode_and_cmp_move_or_op},
55276cad711SPaolo Bonzini 
55376cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
55476cad711SPaolo Bonzini   {"cmps",    0x08e0, 0x0300,		  "z s,R",   0, SIZE_FIELD,    0,
55576cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
55676cad711SPaolo Bonzini 
55776cad711SPaolo Bonzini   {"cmps",    0x08e0, 0x0300,		  "z S,D",   0, SIZE_NONE,
55876cad711SPaolo Bonzini    cris_ver_v0_10,
55976cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
56076cad711SPaolo Bonzini 
56176cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
56276cad711SPaolo Bonzini   {"cmpu",    0x08c0, 0x0320,		  "z s,R" ,  0, SIZE_FIELD,    0,
56376cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
56476cad711SPaolo Bonzini 
56576cad711SPaolo Bonzini   {"cmpu",    0x08c0, 0x0320,		  "z S,D",   0, SIZE_NONE,
56676cad711SPaolo Bonzini    cris_ver_v0_10,
56776cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
56876cad711SPaolo Bonzini 
56976cad711SPaolo Bonzini   {"di",      0x25F0, 0xDA0F,		  "",	     0, SIZE_NONE,     0,
57076cad711SPaolo Bonzini    cris_clearf_di_op},
57176cad711SPaolo Bonzini 
57276cad711SPaolo Bonzini   {"dip",     DIP_OPCODE, DIP_Z_BITS,	  "ps",	     0, SIZE_FIX_32,
57376cad711SPaolo Bonzini    cris_ver_v0_10,
57476cad711SPaolo Bonzini    cris_dip_prefix},
57576cad711SPaolo Bonzini 
57676cad711SPaolo Bonzini   {"div",     0x0980, 0x0640,		  "m R,r",   0, SIZE_FIELD,    0,
57776cad711SPaolo Bonzini    cris_not_implemented_op},
57876cad711SPaolo Bonzini 
57976cad711SPaolo Bonzini   {"dstep",   0x06f0, 0x0900,		  "r,R",     0, SIZE_NONE,     0,
58076cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
58176cad711SPaolo Bonzini 
58276cad711SPaolo Bonzini   {"ei",      0x25B0, 0xDA4F,		  "",	     0, SIZE_NONE,     0,
58376cad711SPaolo Bonzini    cris_ax_ei_setf_op},
58476cad711SPaolo Bonzini 
58576cad711SPaolo Bonzini   {"fidxd",    0x0ab0, 0xf540,		  "[r]",     0, SIZE_NONE,
58676cad711SPaolo Bonzini    cris_ver_v32p,
58776cad711SPaolo Bonzini    cris_not_implemented_op},
58876cad711SPaolo Bonzini 
58976cad711SPaolo Bonzini   {"fidxi",    0x0d30, 0xF2C0,		  "[r]",     0, SIZE_NONE,
59076cad711SPaolo Bonzini    cris_ver_v32p,
59176cad711SPaolo Bonzini    cris_not_implemented_op},
59276cad711SPaolo Bonzini 
59376cad711SPaolo Bonzini   {"ftagd",    0x1AB0, 0xE540,		  "[r]",     0, SIZE_NONE,
59476cad711SPaolo Bonzini    cris_ver_v32p,
59576cad711SPaolo Bonzini    cris_not_implemented_op},
59676cad711SPaolo Bonzini 
59776cad711SPaolo Bonzini   {"ftagi",    0x1D30, 0xE2C0,		  "[r]",     0, SIZE_NONE,
59876cad711SPaolo Bonzini    cris_ver_v32p,
59976cad711SPaolo Bonzini    cris_not_implemented_op},
60076cad711SPaolo Bonzini 
60176cad711SPaolo Bonzini   {"halt",    0xF930, 0x06CF,		  "",	     0, SIZE_NONE,
60276cad711SPaolo Bonzini    cris_ver_v32p,
60376cad711SPaolo Bonzini    cris_not_implemented_op},
60476cad711SPaolo Bonzini 
60576cad711SPaolo Bonzini   {"jas",    0x09B0, 0x0640,		  "r,P",     0, SIZE_NONE,
60676cad711SPaolo Bonzini    cris_ver_v32p,
60776cad711SPaolo Bonzini    cris_reg_mode_jump_op},
60876cad711SPaolo Bonzini 
60976cad711SPaolo Bonzini   {"jas",    0x0DBF, 0x0240,		  "N,P",     0, SIZE_FIX_32,
61076cad711SPaolo Bonzini    cris_ver_v32p,
61176cad711SPaolo Bonzini    cris_reg_mode_jump_op},
61276cad711SPaolo Bonzini 
61376cad711SPaolo Bonzini   {"jasc",    0x0B30, 0x04C0,		  "r,P",     0, SIZE_NONE,
61476cad711SPaolo Bonzini    cris_ver_v32p,
61576cad711SPaolo Bonzini    cris_reg_mode_jump_op},
61676cad711SPaolo Bonzini 
61776cad711SPaolo Bonzini   {"jasc",    0x0F3F, 0x00C0,		  "N,P",     0, SIZE_FIX_32,
61876cad711SPaolo Bonzini    cris_ver_v32p,
61976cad711SPaolo Bonzini    cris_reg_mode_jump_op},
62076cad711SPaolo Bonzini 
62176cad711SPaolo Bonzini   {"jbrc",    0x69b0, 0x9640,		  "r",	     0, SIZE_NONE,
62276cad711SPaolo Bonzini    cris_ver_v8_10,
62376cad711SPaolo Bonzini    cris_reg_mode_jump_op},
62476cad711SPaolo Bonzini 
62576cad711SPaolo Bonzini   {"jbrc",    0x6930, 0x92c0,		  "s",	     0, SIZE_FIX_32,
62676cad711SPaolo Bonzini    cris_ver_v8_10,
62776cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
62876cad711SPaolo Bonzini 
62976cad711SPaolo Bonzini   {"jbrc",    0x6930, 0x92c0,		  "S",	     0, SIZE_NONE,
63076cad711SPaolo Bonzini    cris_ver_v8_10,
63176cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
63276cad711SPaolo Bonzini 
63376cad711SPaolo Bonzini   {"jir",     0xA9b0, 0x5640,		  "r",	     0, SIZE_NONE,
63476cad711SPaolo Bonzini    cris_ver_v8_10,
63576cad711SPaolo Bonzini    cris_reg_mode_jump_op},
63676cad711SPaolo Bonzini 
63776cad711SPaolo Bonzini   {"jir",     0xA930, 0x52c0,		  "s",	     0, SIZE_FIX_32,
63876cad711SPaolo Bonzini    cris_ver_v8_10,
63976cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
64076cad711SPaolo Bonzini 
64176cad711SPaolo Bonzini   {"jir",     0xA930, 0x52c0,		  "S",	     0, SIZE_NONE,
64276cad711SPaolo Bonzini    cris_ver_v8_10,
64376cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
64476cad711SPaolo Bonzini 
64576cad711SPaolo Bonzini   {"jirc",    0x29b0, 0xd640,		  "r",	     0, SIZE_NONE,
64676cad711SPaolo Bonzini    cris_ver_v8_10,
64776cad711SPaolo Bonzini    cris_reg_mode_jump_op},
64876cad711SPaolo Bonzini 
64976cad711SPaolo Bonzini   {"jirc",    0x2930, 0xd2c0,		  "s",	     0, SIZE_FIX_32,
65076cad711SPaolo Bonzini    cris_ver_v8_10,
65176cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
65276cad711SPaolo Bonzini 
65376cad711SPaolo Bonzini   {"jirc",    0x2930, 0xd2c0,		  "S",	     0, SIZE_NONE,
65476cad711SPaolo Bonzini    cris_ver_v8_10,
65576cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
65676cad711SPaolo Bonzini 
65776cad711SPaolo Bonzini   {"jsr",     0xB9b0, 0x4640,		  "r",	     0, SIZE_NONE,     0,
65876cad711SPaolo Bonzini    cris_reg_mode_jump_op},
65976cad711SPaolo Bonzini 
66076cad711SPaolo Bonzini   {"jsr",     0xB930, 0x42c0,		  "s",	     0, SIZE_FIX_32,
66176cad711SPaolo Bonzini    cris_ver_v0_10,
66276cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
66376cad711SPaolo Bonzini 
66476cad711SPaolo Bonzini   {"jsr",     0xBDBF, 0x4240,		  "N",	     0, SIZE_FIX_32,
66576cad711SPaolo Bonzini    cris_ver_v32p,
66676cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
66776cad711SPaolo Bonzini 
66876cad711SPaolo Bonzini   {"jsr",     0xB930, 0x42c0,		  "S",	     0, SIZE_NONE,
66976cad711SPaolo Bonzini    cris_ver_v0_10,
67076cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
67176cad711SPaolo Bonzini 
67276cad711SPaolo Bonzini   {"jsrc",    0x39b0, 0xc640,		  "r",	     0, SIZE_NONE,
67376cad711SPaolo Bonzini    cris_ver_v8_10,
67476cad711SPaolo Bonzini    cris_reg_mode_jump_op},
67576cad711SPaolo Bonzini 
67676cad711SPaolo Bonzini   {"jsrc",    0x3930, 0xc2c0,		  "s",	     0, SIZE_FIX_32,
67776cad711SPaolo Bonzini    cris_ver_v8_10,
67876cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
67976cad711SPaolo Bonzini 
68076cad711SPaolo Bonzini   {"jsrc",    0x3930, 0xc2c0,		  "S",	     0, SIZE_NONE,
68176cad711SPaolo Bonzini    cris_ver_v8_10,
68276cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
68376cad711SPaolo Bonzini 
68476cad711SPaolo Bonzini   {"jsrc",    0xBB30, 0x44C0,		  "r",       0, SIZE_NONE,
68576cad711SPaolo Bonzini    cris_ver_v32p,
68676cad711SPaolo Bonzini    cris_reg_mode_jump_op},
68776cad711SPaolo Bonzini 
68876cad711SPaolo Bonzini   {"jsrc",    0xBF3F, 0x40C0,		  "N",	     0, SIZE_FIX_32,
68976cad711SPaolo Bonzini    cris_ver_v32p,
69076cad711SPaolo Bonzini    cris_reg_mode_jump_op},
69176cad711SPaolo Bonzini 
69276cad711SPaolo Bonzini   {"jump",    0x09b0, 0xF640,		  "r",	     0, SIZE_NONE,     0,
69376cad711SPaolo Bonzini    cris_reg_mode_jump_op},
69476cad711SPaolo Bonzini 
69576cad711SPaolo Bonzini   {"jump",
69676cad711SPaolo Bonzini    JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "s",	     0, SIZE_FIX_32,
69776cad711SPaolo Bonzini    cris_ver_v0_10,
69876cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
69976cad711SPaolo Bonzini 
70076cad711SPaolo Bonzini   {"jump",
70176cad711SPaolo Bonzini    JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS,  "S",	     0, SIZE_NONE,
70276cad711SPaolo Bonzini    cris_ver_v0_10,
70376cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
70476cad711SPaolo Bonzini 
70576cad711SPaolo Bonzini   {"jump",    0x09F0, 0x060F,		  "P",	     0, SIZE_NONE,
70676cad711SPaolo Bonzini    cris_ver_v32p,
70776cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
70876cad711SPaolo Bonzini 
70976cad711SPaolo Bonzini   {"jump",
71076cad711SPaolo Bonzini    JUMP_PC_INCR_OPCODE_V32,
71176cad711SPaolo Bonzini    (0xffff & ~JUMP_PC_INCR_OPCODE_V32),	  "N",	     0, SIZE_FIX_32,
71276cad711SPaolo Bonzini    cris_ver_v32p,
71376cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
71476cad711SPaolo Bonzini 
71576cad711SPaolo Bonzini   {"jmpu",    0x8930, 0x72c0,		  "s",	     0, SIZE_FIX_32,
71676cad711SPaolo Bonzini    cris_ver_v10,
71776cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
71876cad711SPaolo Bonzini 
71976cad711SPaolo Bonzini   {"jmpu",    0x8930, 0x72c0,		   "S",	     0, SIZE_NONE,
72076cad711SPaolo Bonzini    cris_ver_v10,
72176cad711SPaolo Bonzini    cris_none_reg_mode_jump_op},
72276cad711SPaolo Bonzini 
72376cad711SPaolo Bonzini   {"lapc",    0x0970, 0x0680,		  "U,R",    0, SIZE_NONE,
72476cad711SPaolo Bonzini    cris_ver_v32p,
72576cad711SPaolo Bonzini    cris_not_implemented_op},
72676cad711SPaolo Bonzini 
72776cad711SPaolo Bonzini   {"lapc",    0x0D7F, 0x0280,		  "dn,R",    0, SIZE_FIX_32,
72876cad711SPaolo Bonzini    cris_ver_v32p,
72976cad711SPaolo Bonzini    cris_not_implemented_op},
73076cad711SPaolo Bonzini 
73176cad711SPaolo Bonzini   {"lapcq",   0x0970, 0x0680,		  "u,R",     0, SIZE_NONE,
73276cad711SPaolo Bonzini    cris_ver_v32p,
73376cad711SPaolo Bonzini    cris_addi_op},
73476cad711SPaolo Bonzini 
73576cad711SPaolo Bonzini   {"lsl",     0x04C0, 0x0B00,		  "m r,R",   0, SIZE_NONE,     0,
73676cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
73776cad711SPaolo Bonzini 
73876cad711SPaolo Bonzini   {"lslq",    0x03c0, 0x0C20,		  "c,R",     0, SIZE_NONE,     0,
73976cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
74076cad711SPaolo Bonzini 
74176cad711SPaolo Bonzini   {"lsr",     0x07C0, 0x0800,		  "m r,R",   0, SIZE_NONE,     0,
74276cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
74376cad711SPaolo Bonzini 
74476cad711SPaolo Bonzini   {"lsrq",    0x03e0, 0x0C00,		  "c,R",     0, SIZE_NONE,     0,
74576cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
74676cad711SPaolo Bonzini 
74776cad711SPaolo Bonzini   {"lz",      0x0730, 0x08C0,		  "r,R",     0, SIZE_NONE,
74876cad711SPaolo Bonzini    cris_ver_v3p,
74976cad711SPaolo Bonzini    cris_not_implemented_op},
75076cad711SPaolo Bonzini 
75176cad711SPaolo Bonzini   {"mcp",      0x07f0, 0x0800,		  "P,r",     0, SIZE_NONE,
75276cad711SPaolo Bonzini    cris_ver_v32p,
75376cad711SPaolo Bonzini    cris_not_implemented_op},
75476cad711SPaolo Bonzini 
75576cad711SPaolo Bonzini   {"move",    0x0640, 0x0980,		  "m r,R",   0, SIZE_NONE,     0,
75676cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
75776cad711SPaolo Bonzini 
75876cad711SPaolo Bonzini   {"move",    0x0A40, 0x0180,		  "m s,R",   0, SIZE_FIELD,    0,
75976cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
76076cad711SPaolo Bonzini 
76176cad711SPaolo Bonzini   {"move",    0x0A40, 0x0180,		  "m S,D",   0, SIZE_NONE,
76276cad711SPaolo Bonzini    cris_ver_v0_10,
76376cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
76476cad711SPaolo Bonzini 
76576cad711SPaolo Bonzini   {"move",    0x0630, 0x09c0,		  "r,P",     0, SIZE_NONE,     0,
76676cad711SPaolo Bonzini    cris_move_to_preg_op},
76776cad711SPaolo Bonzini 
76876cad711SPaolo Bonzini   {"move",    0x0670, 0x0980,		  "P,r",     0, SIZE_NONE,     0,
76976cad711SPaolo Bonzini    cris_reg_mode_move_from_preg_op},
77076cad711SPaolo Bonzini 
77176cad711SPaolo Bonzini   {"move",    0x0BC0, 0x0000,		  "m R,y",   0, SIZE_FIELD,    0,
77276cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
77376cad711SPaolo Bonzini 
77476cad711SPaolo Bonzini   {"move",    0x0BC0, 0x0000,		  "m D,S",   0, SIZE_NONE,
77576cad711SPaolo Bonzini    cris_ver_v0_10,
77676cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
77776cad711SPaolo Bonzini 
77876cad711SPaolo Bonzini   {"move",
77976cad711SPaolo Bonzini    MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS,
78076cad711SPaolo Bonzini    "s,P",   0, SIZE_SPEC_REG, 0,
78176cad711SPaolo Bonzini    cris_move_to_preg_op},
78276cad711SPaolo Bonzini 
78376cad711SPaolo Bonzini   {"move",    0x0A30, 0x01c0,		  "S,P",     0, SIZE_NONE,
78476cad711SPaolo Bonzini    cris_ver_v0_10,
78576cad711SPaolo Bonzini    cris_move_to_preg_op},
78676cad711SPaolo Bonzini 
78776cad711SPaolo Bonzini   {"move",    0x0A70, 0x0180,		  "P,y",     0, SIZE_SPEC_REG, 0,
78876cad711SPaolo Bonzini    cris_none_reg_mode_move_from_preg_op},
78976cad711SPaolo Bonzini 
79076cad711SPaolo Bonzini   {"move",    0x0A70, 0x0180,		  "P,S",     0, SIZE_NONE,
79176cad711SPaolo Bonzini    cris_ver_v0_10,
79276cad711SPaolo Bonzini    cris_none_reg_mode_move_from_preg_op},
79376cad711SPaolo Bonzini 
79476cad711SPaolo Bonzini   {"move",    0x0B70, 0x0480,		  "r,T",     0, SIZE_NONE,
79576cad711SPaolo Bonzini    cris_ver_v32p,
79676cad711SPaolo Bonzini    cris_not_implemented_op},
79776cad711SPaolo Bonzini 
79876cad711SPaolo Bonzini   {"move",    0x0F70, 0x0080,		  "T,r",     0, SIZE_NONE,
79976cad711SPaolo Bonzini    cris_ver_v32p,
80076cad711SPaolo Bonzini    cris_not_implemented_op},
80176cad711SPaolo Bonzini 
80276cad711SPaolo Bonzini   {"movem",   0x0BF0, 0x0000,		  "R,y",     0, SIZE_FIX_32,   0,
80376cad711SPaolo Bonzini    cris_move_reg_to_mem_movem_op},
80476cad711SPaolo Bonzini 
80576cad711SPaolo Bonzini   {"movem",   0x0BF0, 0x0000,		  "D,S",     0, SIZE_NONE,
80676cad711SPaolo Bonzini    cris_ver_v0_10,
80776cad711SPaolo Bonzini    cris_move_reg_to_mem_movem_op},
80876cad711SPaolo Bonzini 
80976cad711SPaolo Bonzini   {"movem",   0x0BB0, 0x0040,		  "s,R",     0, SIZE_FIX_32,   0,
81076cad711SPaolo Bonzini    cris_move_mem_to_reg_movem_op},
81176cad711SPaolo Bonzini 
81276cad711SPaolo Bonzini   {"movem",   0x0BB0, 0x0040,		  "S,D",     0, SIZE_NONE,
81376cad711SPaolo Bonzini    cris_ver_v0_10,
81476cad711SPaolo Bonzini    cris_move_mem_to_reg_movem_op},
81576cad711SPaolo Bonzini 
81676cad711SPaolo Bonzini   {"moveq",   0x0240, 0x0D80,		  "i,R",     0, SIZE_NONE,     0,
81776cad711SPaolo Bonzini    cris_quick_mode_and_cmp_move_or_op},
81876cad711SPaolo Bonzini 
81976cad711SPaolo Bonzini   {"movs",    0x0460, 0x0B80,		  "z r,R",   0, SIZE_NONE,     0,
82076cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
82176cad711SPaolo Bonzini 
82276cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
82376cad711SPaolo Bonzini   {"movs",    0x0860, 0x0380,		  "z s,R",   0, SIZE_FIELD,    0,
82476cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
82576cad711SPaolo Bonzini 
82676cad711SPaolo Bonzini   {"movs",    0x0860, 0x0380,		  "z S,D",   0, SIZE_NONE,
82776cad711SPaolo Bonzini    cris_ver_v0_10,
82876cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
82976cad711SPaolo Bonzini 
83076cad711SPaolo Bonzini   {"movu",    0x0440, 0x0Ba0,		  "z r,R",   0, SIZE_NONE,     0,
83176cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
83276cad711SPaolo Bonzini 
83376cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
83476cad711SPaolo Bonzini   {"movu",    0x0840, 0x03a0,		  "z s,R",   0, SIZE_FIELD,    0,
83576cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
83676cad711SPaolo Bonzini 
83776cad711SPaolo Bonzini   {"movu",    0x0840, 0x03a0,		  "z S,D",   0, SIZE_NONE,
83876cad711SPaolo Bonzini    cris_ver_v0_10,
83976cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
84076cad711SPaolo Bonzini 
84176cad711SPaolo Bonzini   {"mstep",   0x07f0, 0x0800,		  "r,R",     0, SIZE_NONE,
84276cad711SPaolo Bonzini    cris_ver_v0_10,
84376cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
84476cad711SPaolo Bonzini 
84576cad711SPaolo Bonzini   {"muls",    0x0d00, 0x02c0,		  "m r,R",   0, SIZE_NONE,
84676cad711SPaolo Bonzini    cris_ver_v10p,
84776cad711SPaolo Bonzini    cris_muls_op},
84876cad711SPaolo Bonzini 
84976cad711SPaolo Bonzini   {"mulu",    0x0900, 0x06c0,		  "m r,R",   0, SIZE_NONE,
85076cad711SPaolo Bonzini    cris_ver_v10p,
85176cad711SPaolo Bonzini    cris_mulu_op},
85276cad711SPaolo Bonzini 
85376cad711SPaolo Bonzini   {"neg",     0x0580, 0x0A40,		  "m r,R",   0, SIZE_NONE,     0,
85476cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
85576cad711SPaolo Bonzini 
85676cad711SPaolo Bonzini   {"nop",     NOP_OPCODE, NOP_Z_BITS,	  "",	     0, SIZE_NONE,
85776cad711SPaolo Bonzini    cris_ver_v0_10,
85876cad711SPaolo Bonzini    cris_btst_nop_op},
85976cad711SPaolo Bonzini 
86076cad711SPaolo Bonzini   {"nop",     NOP_OPCODE_V32, NOP_Z_BITS_V32, "",    0, SIZE_NONE,
86176cad711SPaolo Bonzini    cris_ver_v32p,
86276cad711SPaolo Bonzini    cris_btst_nop_op},
86376cad711SPaolo Bonzini 
86476cad711SPaolo Bonzini   {"not",     0x8770, 0x7880,		  "r",	     0, SIZE_NONE,     0,
86576cad711SPaolo Bonzini    cris_dstep_logshift_mstep_neg_not_op},
86676cad711SPaolo Bonzini 
86776cad711SPaolo Bonzini   {"or",      0x0740, 0x0880,		  "m r,R",   0, SIZE_NONE,     0,
86876cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
86976cad711SPaolo Bonzini 
87076cad711SPaolo Bonzini   {"or",      0x0B40, 0x0080,		  "m s,R",   0, SIZE_FIELD,    0,
87176cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
87276cad711SPaolo Bonzini 
87376cad711SPaolo Bonzini   {"or",      0x0B40, 0x0080,		  "m S,D",   0, SIZE_NONE,
87476cad711SPaolo Bonzini    cris_ver_v0_10,
87576cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
87676cad711SPaolo Bonzini 
87776cad711SPaolo Bonzini   {"or",      0x0B40, 0x0480,		  "m S,R,r", 0, SIZE_NONE,
87876cad711SPaolo Bonzini    cris_ver_v0_10,
87976cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
88076cad711SPaolo Bonzini 
88176cad711SPaolo Bonzini   {"orq",     0x0340, 0x0C80,		  "i,R",     0, SIZE_NONE,     0,
88276cad711SPaolo Bonzini    cris_quick_mode_and_cmp_move_or_op},
88376cad711SPaolo Bonzini 
88476cad711SPaolo Bonzini   {"pop",     0x0E6E, 0x0191,		  "!R",	     0, SIZE_NONE,
88576cad711SPaolo Bonzini    cris_ver_v0_10,
88676cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
88776cad711SPaolo Bonzini 
88876cad711SPaolo Bonzini   {"pop",     0x0e3e, 0x01c1,		  "!P",	     0, SIZE_NONE,
88976cad711SPaolo Bonzini    cris_ver_v0_10,
89076cad711SPaolo Bonzini    cris_none_reg_mode_move_from_preg_op},
89176cad711SPaolo Bonzini 
89276cad711SPaolo Bonzini   {"push",    0x0FEE, 0x0011,		  "BR",	     0, SIZE_NONE,
89376cad711SPaolo Bonzini    cris_ver_v0_10,
89476cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
89576cad711SPaolo Bonzini 
89676cad711SPaolo Bonzini   {"push",    0x0E7E, 0x0181,		  "BP",	     0, SIZE_NONE,
89776cad711SPaolo Bonzini    cris_ver_v0_10,
89876cad711SPaolo Bonzini    cris_move_to_preg_op},
89976cad711SPaolo Bonzini 
90076cad711SPaolo Bonzini   {"rbf",     0x3b30, 0xc0c0,		  "y",	     0, SIZE_NONE,
90176cad711SPaolo Bonzini    cris_ver_v10,
90276cad711SPaolo Bonzini    cris_not_implemented_op},
90376cad711SPaolo Bonzini 
90476cad711SPaolo Bonzini   {"rbf",     0x3b30, 0xc0c0,		  "S",	     0, SIZE_NONE,
90576cad711SPaolo Bonzini    cris_ver_v10,
90676cad711SPaolo Bonzini    cris_not_implemented_op},
90776cad711SPaolo Bonzini 
90876cad711SPaolo Bonzini   {"rfe",     0x2930, 0xD6CF,		  "",	     0, SIZE_NONE,
90976cad711SPaolo Bonzini    cris_ver_v32p,
91076cad711SPaolo Bonzini    cris_not_implemented_op},
91176cad711SPaolo Bonzini 
91276cad711SPaolo Bonzini   {"rfg",     0x4930, 0xB6CF,		  "",	     0, SIZE_NONE,
91376cad711SPaolo Bonzini    cris_ver_v32p,
91476cad711SPaolo Bonzini    cris_not_implemented_op},
91576cad711SPaolo Bonzini 
91676cad711SPaolo Bonzini   {"rfn",     0x5930, 0xA6CF,		  "",	     0, SIZE_NONE,
91776cad711SPaolo Bonzini    cris_ver_v32p,
91876cad711SPaolo Bonzini    cris_not_implemented_op},
91976cad711SPaolo Bonzini 
92076cad711SPaolo Bonzini   {"ret",     0xB67F, 0x4980,		  "",	     1, SIZE_NONE,
92176cad711SPaolo Bonzini    cris_ver_v0_10,
92276cad711SPaolo Bonzini    cris_reg_mode_move_from_preg_op},
92376cad711SPaolo Bonzini 
92476cad711SPaolo Bonzini   {"ret",     0xB9F0, 0x460F,		  "",	     1, SIZE_NONE,
92576cad711SPaolo Bonzini    cris_ver_v32p,
92676cad711SPaolo Bonzini    cris_reg_mode_move_from_preg_op},
92776cad711SPaolo Bonzini 
92876cad711SPaolo Bonzini   {"retb",    0xe67f, 0x1980,		  "",	     1, SIZE_NONE,
92976cad711SPaolo Bonzini    cris_ver_v0_10,
93076cad711SPaolo Bonzini    cris_reg_mode_move_from_preg_op},
93176cad711SPaolo Bonzini 
93276cad711SPaolo Bonzini   {"rete",     0xA9F0, 0x560F,		  "",	     1, SIZE_NONE,
93376cad711SPaolo Bonzini    cris_ver_v32p,
93476cad711SPaolo Bonzini    cris_reg_mode_move_from_preg_op},
93576cad711SPaolo Bonzini 
93676cad711SPaolo Bonzini   {"reti",    0xA67F, 0x5980,		  "",	     1, SIZE_NONE,
93776cad711SPaolo Bonzini    cris_ver_v0_10,
93876cad711SPaolo Bonzini    cris_reg_mode_move_from_preg_op},
93976cad711SPaolo Bonzini 
94076cad711SPaolo Bonzini   {"retn",     0xC9F0, 0x360F,		  "",	     1, SIZE_NONE,
94176cad711SPaolo Bonzini    cris_ver_v32p,
94276cad711SPaolo Bonzini    cris_reg_mode_move_from_preg_op},
94376cad711SPaolo Bonzini 
94476cad711SPaolo Bonzini   {"sbfs",    0x3b70, 0xc080,		  "y",	     0, SIZE_NONE,
94576cad711SPaolo Bonzini    cris_ver_v10,
94676cad711SPaolo Bonzini    cris_not_implemented_op},
94776cad711SPaolo Bonzini 
94876cad711SPaolo Bonzini   {"sbfs",    0x3b70, 0xc080,		  "S",	     0, SIZE_NONE,
94976cad711SPaolo Bonzini    cris_ver_v10,
95076cad711SPaolo Bonzini    cris_not_implemented_op},
95176cad711SPaolo Bonzini 
95276cad711SPaolo Bonzini   {"sa",
95376cad711SPaolo Bonzini    0x0530+CC_A*0x1000,
95476cad711SPaolo Bonzini    0x0AC0+(0xf-CC_A)*0x1000,		  "r",	     0, SIZE_NONE,     0,
95576cad711SPaolo Bonzini    cris_scc_op},
95676cad711SPaolo Bonzini 
95776cad711SPaolo Bonzini   {"ssb",
95876cad711SPaolo Bonzini    0x0530+CC_EXT*0x1000,
95976cad711SPaolo Bonzini    0x0AC0+(0xf-CC_EXT)*0x1000,		  "r",	     0, SIZE_NONE,
96076cad711SPaolo Bonzini    cris_ver_v32p,
96176cad711SPaolo Bonzini    cris_scc_op},
96276cad711SPaolo Bonzini 
96376cad711SPaolo Bonzini   {"scc",
96476cad711SPaolo Bonzini    0x0530+CC_CC*0x1000,
96576cad711SPaolo Bonzini    0x0AC0+(0xf-CC_CC)*0x1000,		  "r",	     0, SIZE_NONE,     0,
96676cad711SPaolo Bonzini    cris_scc_op},
96776cad711SPaolo Bonzini 
96876cad711SPaolo Bonzini   {"scs",
96976cad711SPaolo Bonzini    0x0530+CC_CS*0x1000,
97076cad711SPaolo Bonzini    0x0AC0+(0xf-CC_CS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
97176cad711SPaolo Bonzini    cris_scc_op},
97276cad711SPaolo Bonzini 
97376cad711SPaolo Bonzini   {"seq",
97476cad711SPaolo Bonzini    0x0530+CC_EQ*0x1000,
97576cad711SPaolo Bonzini    0x0AC0+(0xf-CC_EQ)*0x1000,		  "r",	     0, SIZE_NONE,     0,
97676cad711SPaolo Bonzini    cris_scc_op},
97776cad711SPaolo Bonzini 
97876cad711SPaolo Bonzini   {"setf",    0x05b0, 0x0A40,		  "f",	     0, SIZE_NONE,     0,
97976cad711SPaolo Bonzini    cris_ax_ei_setf_op},
98076cad711SPaolo Bonzini 
98176cad711SPaolo Bonzini   {"sfe",    0x3930, 0xC6CF,		  "",	     0, SIZE_NONE,
98276cad711SPaolo Bonzini    cris_ver_v32p,
98376cad711SPaolo Bonzini    cris_not_implemented_op},
98476cad711SPaolo Bonzini 
98576cad711SPaolo Bonzini   /* Need to have "swf" in front of "sext" so it is the one displayed in
98676cad711SPaolo Bonzini      disassembly.  */
98776cad711SPaolo Bonzini   {"swf",
98876cad711SPaolo Bonzini    0x0530+CC_EXT*0x1000,
98976cad711SPaolo Bonzini    0x0AC0+(0xf-CC_EXT)*0x1000,		  "r",	     0, SIZE_NONE,
99076cad711SPaolo Bonzini    cris_ver_v10,
99176cad711SPaolo Bonzini    cris_scc_op},
99276cad711SPaolo Bonzini 
99376cad711SPaolo Bonzini   {"sext",
99476cad711SPaolo Bonzini    0x0530+CC_EXT*0x1000,
99576cad711SPaolo Bonzini    0x0AC0+(0xf-CC_EXT)*0x1000,		  "r",	     0, SIZE_NONE,
99676cad711SPaolo Bonzini    cris_ver_v0_3,
99776cad711SPaolo Bonzini    cris_scc_op},
99876cad711SPaolo Bonzini 
99976cad711SPaolo Bonzini   {"sge",
100076cad711SPaolo Bonzini    0x0530+CC_GE*0x1000,
100176cad711SPaolo Bonzini    0x0AC0+(0xf-CC_GE)*0x1000,		  "r",	     0, SIZE_NONE,     0,
100276cad711SPaolo Bonzini    cris_scc_op},
100376cad711SPaolo Bonzini 
100476cad711SPaolo Bonzini   {"sgt",
100576cad711SPaolo Bonzini    0x0530+CC_GT*0x1000,
100676cad711SPaolo Bonzini    0x0AC0+(0xf-CC_GT)*0x1000,		  "r",	     0, SIZE_NONE,     0,
100776cad711SPaolo Bonzini    cris_scc_op},
100876cad711SPaolo Bonzini 
100976cad711SPaolo Bonzini   {"shi",
101076cad711SPaolo Bonzini    0x0530+CC_HI*0x1000,
101176cad711SPaolo Bonzini    0x0AC0+(0xf-CC_HI)*0x1000,		  "r",	     0, SIZE_NONE,     0,
101276cad711SPaolo Bonzini    cris_scc_op},
101376cad711SPaolo Bonzini 
101476cad711SPaolo Bonzini   {"shs",
101576cad711SPaolo Bonzini    0x0530+CC_HS*0x1000,
101676cad711SPaolo Bonzini    0x0AC0+(0xf-CC_HS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
101776cad711SPaolo Bonzini    cris_scc_op},
101876cad711SPaolo Bonzini 
101976cad711SPaolo Bonzini   {"sle",
102076cad711SPaolo Bonzini    0x0530+CC_LE*0x1000,
102176cad711SPaolo Bonzini    0x0AC0+(0xf-CC_LE)*0x1000,		  "r",	     0, SIZE_NONE,     0,
102276cad711SPaolo Bonzini    cris_scc_op},
102376cad711SPaolo Bonzini 
102476cad711SPaolo Bonzini   {"slo",
102576cad711SPaolo Bonzini    0x0530+CC_LO*0x1000,
102676cad711SPaolo Bonzini    0x0AC0+(0xf-CC_LO)*0x1000,		  "r",	     0, SIZE_NONE,     0,
102776cad711SPaolo Bonzini    cris_scc_op},
102876cad711SPaolo Bonzini 
102976cad711SPaolo Bonzini   {"sls",
103076cad711SPaolo Bonzini    0x0530+CC_LS*0x1000,
103176cad711SPaolo Bonzini    0x0AC0+(0xf-CC_LS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
103276cad711SPaolo Bonzini    cris_scc_op},
103376cad711SPaolo Bonzini 
103476cad711SPaolo Bonzini   {"slt",
103576cad711SPaolo Bonzini    0x0530+CC_LT*0x1000,
103676cad711SPaolo Bonzini    0x0AC0+(0xf-CC_LT)*0x1000,		  "r",	     0, SIZE_NONE,     0,
103776cad711SPaolo Bonzini    cris_scc_op},
103876cad711SPaolo Bonzini 
103976cad711SPaolo Bonzini   {"smi",
104076cad711SPaolo Bonzini    0x0530+CC_MI*0x1000,
104176cad711SPaolo Bonzini    0x0AC0+(0xf-CC_MI)*0x1000,		  "r",	     0, SIZE_NONE,     0,
104276cad711SPaolo Bonzini    cris_scc_op},
104376cad711SPaolo Bonzini 
104476cad711SPaolo Bonzini   {"sne",
104576cad711SPaolo Bonzini    0x0530+CC_NE*0x1000,
104676cad711SPaolo Bonzini    0x0AC0+(0xf-CC_NE)*0x1000,		  "r",	     0, SIZE_NONE,     0,
104776cad711SPaolo Bonzini    cris_scc_op},
104876cad711SPaolo Bonzini 
104976cad711SPaolo Bonzini   {"spl",
105076cad711SPaolo Bonzini    0x0530+CC_PL*0x1000,
105176cad711SPaolo Bonzini    0x0AC0+(0xf-CC_PL)*0x1000,		  "r",	     0, SIZE_NONE,     0,
105276cad711SPaolo Bonzini    cris_scc_op},
105376cad711SPaolo Bonzini 
105476cad711SPaolo Bonzini   {"sub",     0x0680, 0x0940,		  "m r,R",   0, SIZE_NONE,     0,
105576cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
105676cad711SPaolo Bonzini 
105776cad711SPaolo Bonzini   {"sub",     0x0a80, 0x0140,		  "m s,R",   0, SIZE_FIELD,    0,
105876cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
105976cad711SPaolo Bonzini 
106076cad711SPaolo Bonzini   {"sub",     0x0a80, 0x0140,		  "m S,D",   0, SIZE_NONE,
106176cad711SPaolo Bonzini    cris_ver_v0_10,
106276cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
106376cad711SPaolo Bonzini 
106476cad711SPaolo Bonzini   {"sub",     0x0a80, 0x0540,		  "m S,R,r", 0, SIZE_NONE,
106576cad711SPaolo Bonzini    cris_ver_v0_10,
106676cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
106776cad711SPaolo Bonzini 
106876cad711SPaolo Bonzini   {"subq",    0x0280, 0x0d40,		  "I,R",     0, SIZE_NONE,     0,
106976cad711SPaolo Bonzini    cris_quick_mode_add_sub_op},
107076cad711SPaolo Bonzini 
107176cad711SPaolo Bonzini   {"subs",    0x04a0, 0x0b40,		  "z r,R",   0, SIZE_NONE,     0,
107276cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
107376cad711SPaolo Bonzini 
107476cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_SIGNED and all necessary changes.  */
107576cad711SPaolo Bonzini   {"subs",    0x08a0, 0x0340,		  "z s,R",   0, SIZE_FIELD,    0,
107676cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
107776cad711SPaolo Bonzini 
107876cad711SPaolo Bonzini   {"subs",    0x08a0, 0x0340,		  "z S,D",   0, SIZE_NONE,
107976cad711SPaolo Bonzini    cris_ver_v0_10,
108076cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
108176cad711SPaolo Bonzini 
108276cad711SPaolo Bonzini   {"subs",    0x08a0, 0x0740,		  "z S,R,r", 0, SIZE_NONE,
108376cad711SPaolo Bonzini    cris_ver_v0_10,
108476cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
108576cad711SPaolo Bonzini 
108676cad711SPaolo Bonzini   {"subu",    0x0480, 0x0b60,		  "z r,R",   0, SIZE_NONE,     0,
108776cad711SPaolo Bonzini    cris_reg_mode_add_sub_cmp_and_or_move_op},
108876cad711SPaolo Bonzini 
108976cad711SPaolo Bonzini   /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes.  */
109076cad711SPaolo Bonzini   {"subu",    0x0880, 0x0360,		  "z s,R",   0, SIZE_FIELD,    0,
109176cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
109276cad711SPaolo Bonzini 
109376cad711SPaolo Bonzini   {"subu",    0x0880, 0x0360,		  "z S,D",   0, SIZE_NONE,
109476cad711SPaolo Bonzini    cris_ver_v0_10,
109576cad711SPaolo Bonzini    cris_none_reg_mode_add_sub_cmp_and_or_move_op},
109676cad711SPaolo Bonzini 
109776cad711SPaolo Bonzini   {"subu",    0x0880, 0x0760,		  "z S,R,r", 0, SIZE_NONE,
109876cad711SPaolo Bonzini    cris_ver_v0_10,
109976cad711SPaolo Bonzini    cris_three_operand_add_sub_cmp_and_or_op},
110076cad711SPaolo Bonzini 
110176cad711SPaolo Bonzini   {"svc",
110276cad711SPaolo Bonzini    0x0530+CC_VC*0x1000,
110376cad711SPaolo Bonzini    0x0AC0+(0xf-CC_VC)*0x1000,		  "r",	     0, SIZE_NONE,     0,
110476cad711SPaolo Bonzini    cris_scc_op},
110576cad711SPaolo Bonzini 
110676cad711SPaolo Bonzini   {"svs",
110776cad711SPaolo Bonzini    0x0530+CC_VS*0x1000,
110876cad711SPaolo Bonzini    0x0AC0+(0xf-CC_VS)*0x1000,		  "r",	     0, SIZE_NONE,     0,
110976cad711SPaolo Bonzini    cris_scc_op},
111076cad711SPaolo Bonzini 
111176cad711SPaolo Bonzini   /* The insn "swapn" is the same as "not" and will be disassembled as
111276cad711SPaolo Bonzini      such, but the swap* family of mnmonics are generally v8-and-higher
111376cad711SPaolo Bonzini      only, so count it in.  */
111476cad711SPaolo Bonzini   {"swapn",   0x8770, 0x7880,		  "r",	     0, SIZE_NONE,
111576cad711SPaolo Bonzini    cris_ver_v8p,
111676cad711SPaolo Bonzini    cris_not_implemented_op},
111776cad711SPaolo Bonzini 
111876cad711SPaolo Bonzini   {"swapw",   0x4770, 0xb880,		  "r",	     0, SIZE_NONE,
111976cad711SPaolo Bonzini    cris_ver_v8p,
112076cad711SPaolo Bonzini    cris_not_implemented_op},
112176cad711SPaolo Bonzini 
112276cad711SPaolo Bonzini   {"swapnw",  0xc770, 0x3880,		  "r",	     0, SIZE_NONE,
112376cad711SPaolo Bonzini    cris_ver_v8p,
112476cad711SPaolo Bonzini    cris_not_implemented_op},
112576cad711SPaolo Bonzini 
112676cad711SPaolo Bonzini   {"swapb",   0x2770, 0xd880,		  "r",	     0, SIZE_NONE,
112776cad711SPaolo Bonzini    cris_ver_v8p,
112876cad711SPaolo Bonzini    cris_not_implemented_op},
112976cad711SPaolo Bonzini 
113076cad711SPaolo Bonzini   {"swapnb",  0xA770, 0x5880,		  "r",	     0, SIZE_NONE,
113176cad711SPaolo Bonzini    cris_ver_v8p,
113276cad711SPaolo Bonzini    cris_not_implemented_op},
113376cad711SPaolo Bonzini 
113476cad711SPaolo Bonzini   {"swapwb",  0x6770, 0x9880,		  "r",	     0, SIZE_NONE,
113576cad711SPaolo Bonzini    cris_ver_v8p,
113676cad711SPaolo Bonzini    cris_not_implemented_op},
113776cad711SPaolo Bonzini 
113876cad711SPaolo Bonzini   {"swapnwb", 0xE770, 0x1880,		  "r",	     0, SIZE_NONE,
113976cad711SPaolo Bonzini    cris_ver_v8p,
114076cad711SPaolo Bonzini    cris_not_implemented_op},
114176cad711SPaolo Bonzini 
114276cad711SPaolo Bonzini   {"swapr",   0x1770, 0xe880,		  "r",	     0, SIZE_NONE,
114376cad711SPaolo Bonzini    cris_ver_v8p,
114476cad711SPaolo Bonzini    cris_not_implemented_op},
114576cad711SPaolo Bonzini 
114676cad711SPaolo Bonzini   {"swapnr",  0x9770, 0x6880,		  "r",	     0, SIZE_NONE,
114776cad711SPaolo Bonzini    cris_ver_v8p,
114876cad711SPaolo Bonzini    cris_not_implemented_op},
114976cad711SPaolo Bonzini 
115076cad711SPaolo Bonzini   {"swapwr",  0x5770, 0xa880,		  "r",	     0, SIZE_NONE,
115176cad711SPaolo Bonzini    cris_ver_v8p,
115276cad711SPaolo Bonzini    cris_not_implemented_op},
115376cad711SPaolo Bonzini 
115476cad711SPaolo Bonzini   {"swapnwr", 0xd770, 0x2880,		  "r",	     0, SIZE_NONE,
115576cad711SPaolo Bonzini    cris_ver_v8p,
115676cad711SPaolo Bonzini    cris_not_implemented_op},
115776cad711SPaolo Bonzini 
115876cad711SPaolo Bonzini   {"swapbr",  0x3770, 0xc880,		  "r",	     0, SIZE_NONE,
115976cad711SPaolo Bonzini    cris_ver_v8p,
116076cad711SPaolo Bonzini    cris_not_implemented_op},
116176cad711SPaolo Bonzini 
116276cad711SPaolo Bonzini   {"swapnbr", 0xb770, 0x4880,		  "r",	     0, SIZE_NONE,
116376cad711SPaolo Bonzini    cris_ver_v8p,
116476cad711SPaolo Bonzini    cris_not_implemented_op},
116576cad711SPaolo Bonzini 
116676cad711SPaolo Bonzini   {"swapwbr", 0x7770, 0x8880,		  "r",	     0, SIZE_NONE,
116776cad711SPaolo Bonzini    cris_ver_v8p,
116876cad711SPaolo Bonzini    cris_not_implemented_op},
116976cad711SPaolo Bonzini 
117076cad711SPaolo Bonzini   {"swapnwbr", 0xf770, 0x0880,		  "r",	     0, SIZE_NONE,
117176cad711SPaolo Bonzini    cris_ver_v8p,
117276cad711SPaolo Bonzini    cris_not_implemented_op},
117376cad711SPaolo Bonzini 
117476cad711SPaolo Bonzini   {"test",    0x0640, 0x0980,		  "m D",     0, SIZE_NONE,
117576cad711SPaolo Bonzini    cris_ver_v0_10,
117676cad711SPaolo Bonzini    cris_reg_mode_test_op},
117776cad711SPaolo Bonzini 
117876cad711SPaolo Bonzini   {"test",    0x0b80, 0xf040,		  "m y",     0, SIZE_FIELD,    0,
117976cad711SPaolo Bonzini    cris_none_reg_mode_clear_test_op},
118076cad711SPaolo Bonzini 
118176cad711SPaolo Bonzini   {"test",    0x0b80, 0xf040,		  "m S",     0, SIZE_NONE,
118276cad711SPaolo Bonzini    cris_ver_v0_10,
118376cad711SPaolo Bonzini    cris_none_reg_mode_clear_test_op},
118476cad711SPaolo Bonzini 
118576cad711SPaolo Bonzini   {"xor",     0x07B0, 0x0840,		  "r,R",     0, SIZE_NONE,     0,
118676cad711SPaolo Bonzini    cris_xor_op},
118776cad711SPaolo Bonzini 
118876cad711SPaolo Bonzini   {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op}
118976cad711SPaolo Bonzini };
119076cad711SPaolo Bonzini 
119176cad711SPaolo Bonzini /* Condition-names, indexed by the CC_* numbers as found in cris.h. */
119276cad711SPaolo Bonzini const char * const
119376cad711SPaolo Bonzini cris_cc_strings[] =
119476cad711SPaolo Bonzini {
119576cad711SPaolo Bonzini   "hs",
119676cad711SPaolo Bonzini   "lo",
119776cad711SPaolo Bonzini   "ne",
119876cad711SPaolo Bonzini   "eq",
119976cad711SPaolo Bonzini   "vc",
120076cad711SPaolo Bonzini   "vs",
120176cad711SPaolo Bonzini   "pl",
120276cad711SPaolo Bonzini   "mi",
120376cad711SPaolo Bonzini   "ls",
120476cad711SPaolo Bonzini   "hi",
120576cad711SPaolo Bonzini   "ge",
120676cad711SPaolo Bonzini   "lt",
120776cad711SPaolo Bonzini   "gt",
120876cad711SPaolo Bonzini   "le",
120976cad711SPaolo Bonzini   "a",
121076cad711SPaolo Bonzini   /* This is a placeholder.  In v0, this would be "ext".  In v32, this
1211302cb24aSMichael Tokarev      is "sb". */
121276cad711SPaolo Bonzini   "wf"
121376cad711SPaolo Bonzini };
121476cad711SPaolo Bonzini 
121576cad711SPaolo Bonzini /*
121676cad711SPaolo Bonzini  * Local variables:
121776cad711SPaolo Bonzini  * eval: (c-set-style "gnu")
121876cad711SPaolo Bonzini  * indent-tabs-mode: t
121976cad711SPaolo Bonzini  * End:
122076cad711SPaolo Bonzini  */
122176cad711SPaolo Bonzini 
122276cad711SPaolo Bonzini 
122376cad711SPaolo Bonzini /* No instruction will be disassembled longer than this.  In theory, and
122476cad711SPaolo Bonzini    in silicon, address prefixes can be cascaded.  In practice, cascading
122576cad711SPaolo Bonzini    is not used by GCC, and not supported by the assembler.  */
122676cad711SPaolo Bonzini #ifndef MAX_BYTES_PER_CRIS_INSN
122776cad711SPaolo Bonzini #define MAX_BYTES_PER_CRIS_INSN 8
122876cad711SPaolo Bonzini #endif
122976cad711SPaolo Bonzini 
123076cad711SPaolo Bonzini /* Whether or not to decode prefixes, folding it into the following
123176cad711SPaolo Bonzini    instruction.  FIXME: Make this optional later.  */
123276cad711SPaolo Bonzini #ifndef PARSE_PREFIX
123376cad711SPaolo Bonzini #define PARSE_PREFIX 1
123476cad711SPaolo Bonzini #endif
123576cad711SPaolo Bonzini 
123676cad711SPaolo Bonzini /* Sometimes we prefix all registers with this character.  */
123776cad711SPaolo Bonzini #define REGISTER_PREFIX_CHAR '$'
123876cad711SPaolo Bonzini 
123976cad711SPaolo Bonzini /* Whether or not to trace the following sequence:
124076cad711SPaolo Bonzini    sub* X,r%d
124176cad711SPaolo Bonzini    bound* Y,r%d
124276cad711SPaolo Bonzini    adds.w [pc+r%d.w],pc
124376cad711SPaolo Bonzini 
124476cad711SPaolo Bonzini    This is the assembly form of a switch-statement in C.
124576cad711SPaolo Bonzini    The "sub is optional.  If there is none, then X will be zero.
124676cad711SPaolo Bonzini    X is the value of the first case,
124776cad711SPaolo Bonzini    Y is the number of cases (including default).
124876cad711SPaolo Bonzini 
124976cad711SPaolo Bonzini    This results in case offsets printed on the form:
125076cad711SPaolo Bonzini     case N: -> case_address
125176cad711SPaolo Bonzini    where N is an estimation on the corresponding 'case' operand in C,
125276cad711SPaolo Bonzini    and case_address is where execution of that case continues after the
125376cad711SPaolo Bonzini    sequence presented above.
125476cad711SPaolo Bonzini 
125576cad711SPaolo Bonzini    The old style of output was to print the offsets as instructions,
125676cad711SPaolo Bonzini    which made it hard to follow "case"-constructs in the disassembly,
125776cad711SPaolo Bonzini    and caused a lot of annoying warnings about undefined instructions.
125876cad711SPaolo Bonzini 
125976cad711SPaolo Bonzini    FIXME: Make this optional later.  */
126076cad711SPaolo Bonzini #ifndef TRACE_CASE
126176cad711SPaolo Bonzini #define TRACE_CASE (disdata->trace_case)
126276cad711SPaolo Bonzini #endif
126376cad711SPaolo Bonzini 
126476cad711SPaolo Bonzini enum cris_disass_family
126576cad711SPaolo Bonzini  { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 };
126676cad711SPaolo Bonzini 
126776cad711SPaolo Bonzini /* Stored in the disasm_info->private_data member.  */
126876cad711SPaolo Bonzini struct cris_disasm_data
126976cad711SPaolo Bonzini {
127076cad711SPaolo Bonzini   /* Whether to print something less confusing if we find something
127176cad711SPaolo Bonzini      matching a switch-construct.  */
127276cad711SPaolo Bonzini   bfd_boolean trace_case;
127376cad711SPaolo Bonzini 
127476cad711SPaolo Bonzini   /* Whether this code is flagged as crisv32.  FIXME: Should be an enum
127576cad711SPaolo Bonzini      that includes "compatible".  */
127676cad711SPaolo Bonzini   enum cris_disass_family distype;
127776cad711SPaolo Bonzini };
127876cad711SPaolo Bonzini 
127976cad711SPaolo Bonzini /* Value of first element in switch.  */
128076cad711SPaolo Bonzini static long case_offset = 0;
128176cad711SPaolo Bonzini 
128276cad711SPaolo Bonzini /* How many more case-offsets to print.  */
128376cad711SPaolo Bonzini static long case_offset_counter = 0;
128476cad711SPaolo Bonzini 
128576cad711SPaolo Bonzini /* Number of case offsets.  */
128676cad711SPaolo Bonzini static long no_of_case_offsets = 0;
128776cad711SPaolo Bonzini 
128876cad711SPaolo Bonzini /* Candidate for next case_offset.  */
128976cad711SPaolo Bonzini static long last_immediate = 0;
129076cad711SPaolo Bonzini 
129176cad711SPaolo Bonzini static int cris_constraint
129276cad711SPaolo Bonzini   (const char *, unsigned, unsigned, struct cris_disasm_data *);
129376cad711SPaolo Bonzini 
129476cad711SPaolo Bonzini /* Parse disassembler options and store state in info.  FIXME: For the
129576cad711SPaolo Bonzini    time being, we abuse static variables.  */
129676cad711SPaolo Bonzini 
12979739b11aSPaolo Bonzini static void
cris_parse_disassembler_options(struct cris_disasm_data * disdata,char * disassembler_options,enum cris_disass_family distype)12989739b11aSPaolo Bonzini cris_parse_disassembler_options (struct cris_disasm_data *disdata,
12999739b11aSPaolo Bonzini 				 char *disassembler_options,
130076cad711SPaolo Bonzini 				 enum cris_disass_family distype)
130176cad711SPaolo Bonzini {
130276cad711SPaolo Bonzini   /* Default true.  */
130376cad711SPaolo Bonzini   disdata->trace_case
13049739b11aSPaolo Bonzini     = (disassembler_options == NULL
13059739b11aSPaolo Bonzini        || (strcmp (disassembler_options, "nocase") != 0));
130676cad711SPaolo Bonzini 
130776cad711SPaolo Bonzini   disdata->distype = distype;
130876cad711SPaolo Bonzini }
130976cad711SPaolo Bonzini 
131076cad711SPaolo Bonzini static const struct cris_spec_reg *
spec_reg_info(unsigned int sreg,enum cris_disass_family distype)131176cad711SPaolo Bonzini spec_reg_info (unsigned int sreg, enum cris_disass_family distype)
131276cad711SPaolo Bonzini {
131376cad711SPaolo Bonzini   int i;
131476cad711SPaolo Bonzini 
131576cad711SPaolo Bonzini   for (i = 0; cris_spec_regs[i].name != NULL; i++)
131676cad711SPaolo Bonzini     {
131776cad711SPaolo Bonzini       if (cris_spec_regs[i].number == sreg)
131876cad711SPaolo Bonzini 	{
131976cad711SPaolo Bonzini 	  if (distype == cris_dis_v32)
132076cad711SPaolo Bonzini 	    switch (cris_spec_regs[i].applicable_version)
132176cad711SPaolo Bonzini 	      {
132276cad711SPaolo Bonzini 	      case cris_ver_warning:
132376cad711SPaolo Bonzini 	      case cris_ver_version_all:
132476cad711SPaolo Bonzini 	      case cris_ver_v3p:
132576cad711SPaolo Bonzini 	      case cris_ver_v8p:
132676cad711SPaolo Bonzini 	      case cris_ver_v10p:
132776cad711SPaolo Bonzini 	      case cris_ver_v32p:
132876cad711SPaolo Bonzini 		/* No ambiguous sizes or register names with CRISv32.  */
132976cad711SPaolo Bonzini 		if (cris_spec_regs[i].warning == NULL)
133076cad711SPaolo Bonzini 		  return &cris_spec_regs[i];
133176cad711SPaolo Bonzini 	      default:
133276cad711SPaolo Bonzini 		;
133376cad711SPaolo Bonzini 	      }
133476cad711SPaolo Bonzini 	  else if (cris_spec_regs[i].applicable_version != cris_ver_v32p)
133576cad711SPaolo Bonzini 	    return &cris_spec_regs[i];
133676cad711SPaolo Bonzini 	}
133776cad711SPaolo Bonzini     }
133876cad711SPaolo Bonzini 
133976cad711SPaolo Bonzini   return NULL;
134076cad711SPaolo Bonzini }
134176cad711SPaolo Bonzini 
134276cad711SPaolo Bonzini /* Return the number of bits in the argument.  */
134376cad711SPaolo Bonzini 
134476cad711SPaolo Bonzini static int
number_of_bits(unsigned int val)134576cad711SPaolo Bonzini number_of_bits (unsigned int val)
134676cad711SPaolo Bonzini {
134776cad711SPaolo Bonzini   int bits;
134876cad711SPaolo Bonzini 
134976cad711SPaolo Bonzini   for (bits = 0; val != 0; val &= val - 1)
135076cad711SPaolo Bonzini     bits++;
135176cad711SPaolo Bonzini 
135276cad711SPaolo Bonzini   return bits;
135376cad711SPaolo Bonzini }
135476cad711SPaolo Bonzini 
135576cad711SPaolo Bonzini /* Get an entry in the opcode-table.  */
135676cad711SPaolo Bonzini 
135776cad711SPaolo Bonzini static const struct cris_opcode *
get_opcode_entry(unsigned int insn,unsigned int prefix_insn,struct cris_disasm_data * disdata)135876cad711SPaolo Bonzini get_opcode_entry (unsigned int insn,
135976cad711SPaolo Bonzini 		  unsigned int prefix_insn,
136076cad711SPaolo Bonzini 		  struct cris_disasm_data *disdata)
136176cad711SPaolo Bonzini {
136276cad711SPaolo Bonzini   /* For non-prefixed insns, we keep a table of pointers, indexed by the
136376cad711SPaolo Bonzini      insn code.  Each entry is initialized when found to be NULL.  */
136476cad711SPaolo Bonzini   static const struct cris_opcode **opc_table = NULL;
136576cad711SPaolo Bonzini 
136676cad711SPaolo Bonzini   const struct cris_opcode *max_matchedp = NULL;
136776cad711SPaolo Bonzini   const struct cris_opcode **prefix_opc_table = NULL;
136876cad711SPaolo Bonzini 
136976cad711SPaolo Bonzini   /* We hold a table for each prefix that need to be handled differently.  */
137076cad711SPaolo Bonzini   static const struct cris_opcode **dip_prefixes = NULL;
137176cad711SPaolo Bonzini   static const struct cris_opcode **bdapq_m1_prefixes = NULL;
137276cad711SPaolo Bonzini   static const struct cris_opcode **bdapq_m2_prefixes = NULL;
137376cad711SPaolo Bonzini   static const struct cris_opcode **bdapq_m4_prefixes = NULL;
137476cad711SPaolo Bonzini   static const struct cris_opcode **rest_prefixes = NULL;
137576cad711SPaolo Bonzini 
137676cad711SPaolo Bonzini   /* Allocate and clear the opcode-table.  */
137776cad711SPaolo Bonzini   if (opc_table == NULL)
137876cad711SPaolo Bonzini     {
137976cad711SPaolo Bonzini       opc_table = g_new0(const struct cris_opcode *, 65536);
138076cad711SPaolo Bonzini       dip_prefixes = g_new0(const struct cris_opcode *, 65536);
138176cad711SPaolo Bonzini       bdapq_m1_prefixes = g_new0(const struct cris_opcode *, 65536);
138276cad711SPaolo Bonzini       bdapq_m2_prefixes = g_new0(const struct cris_opcode *, 65536);
138376cad711SPaolo Bonzini       bdapq_m4_prefixes = g_new0(const struct cris_opcode *, 65536);
138476cad711SPaolo Bonzini       rest_prefixes = g_new0(const struct cris_opcode *, 65536);
138576cad711SPaolo Bonzini     }
138676cad711SPaolo Bonzini 
138776cad711SPaolo Bonzini   /* Get the right table if this is a prefix.
138876cad711SPaolo Bonzini      This code is connected to cris_constraints in that it knows what
138976cad711SPaolo Bonzini      prefixes play a role in recognition of patterns; the necessary
139076cad711SPaolo Bonzini      state is reflected by which table is used.  If constraints
139176cad711SPaolo Bonzini      involving match or non-match of prefix insns are changed, then this
139276cad711SPaolo Bonzini      probably needs changing too.  */
139376cad711SPaolo Bonzini   if (prefix_insn != NO_CRIS_PREFIX)
139476cad711SPaolo Bonzini     {
139576cad711SPaolo Bonzini       const struct cris_opcode *popcodep
139676cad711SPaolo Bonzini 	= (opc_table[prefix_insn] != NULL
139776cad711SPaolo Bonzini 	   ? opc_table[prefix_insn]
139876cad711SPaolo Bonzini 	   : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata));
139976cad711SPaolo Bonzini 
140076cad711SPaolo Bonzini       if (popcodep == NULL)
140176cad711SPaolo Bonzini 	return NULL;
140276cad711SPaolo Bonzini 
140376cad711SPaolo Bonzini       if (popcodep->match == BDAP_QUICK_OPCODE)
140476cad711SPaolo Bonzini 	{
140576cad711SPaolo Bonzini 	  /* Since some offsets are recognized with "push" macros, we
140676cad711SPaolo Bonzini 	     have to have different tables for them.  */
140776cad711SPaolo Bonzini 	  int offset = (prefix_insn & 255);
140876cad711SPaolo Bonzini 
140976cad711SPaolo Bonzini 	  if (offset > 127)
141076cad711SPaolo Bonzini 	    offset -= 256;
141176cad711SPaolo Bonzini 
141276cad711SPaolo Bonzini 	  switch (offset)
141376cad711SPaolo Bonzini 	    {
141476cad711SPaolo Bonzini 	    case -4:
141576cad711SPaolo Bonzini 	      prefix_opc_table = bdapq_m4_prefixes;
141676cad711SPaolo Bonzini 	      break;
141776cad711SPaolo Bonzini 
141876cad711SPaolo Bonzini 	    case -2:
141976cad711SPaolo Bonzini 	      prefix_opc_table = bdapq_m2_prefixes;
142076cad711SPaolo Bonzini 	      break;
142176cad711SPaolo Bonzini 
142276cad711SPaolo Bonzini 	    case -1:
142376cad711SPaolo Bonzini 	      prefix_opc_table = bdapq_m1_prefixes;
142476cad711SPaolo Bonzini 	      break;
142576cad711SPaolo Bonzini 
142676cad711SPaolo Bonzini 	    default:
142776cad711SPaolo Bonzini 	      prefix_opc_table = rest_prefixes;
142876cad711SPaolo Bonzini 	      break;
142976cad711SPaolo Bonzini 	    }
143076cad711SPaolo Bonzini 	}
143176cad711SPaolo Bonzini       else if (popcodep->match == DIP_OPCODE)
143276cad711SPaolo Bonzini 	/* We don't allow postincrement when the prefix is DIP, so use a
143376cad711SPaolo Bonzini 	   different table for DIP.  */
143476cad711SPaolo Bonzini 	prefix_opc_table = dip_prefixes;
143576cad711SPaolo Bonzini       else
143676cad711SPaolo Bonzini 	prefix_opc_table = rest_prefixes;
143776cad711SPaolo Bonzini     }
143876cad711SPaolo Bonzini 
143976cad711SPaolo Bonzini   if (prefix_insn != NO_CRIS_PREFIX
144076cad711SPaolo Bonzini       && prefix_opc_table[insn] != NULL)
144176cad711SPaolo Bonzini     max_matchedp = prefix_opc_table[insn];
144276cad711SPaolo Bonzini   else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL)
144376cad711SPaolo Bonzini     max_matchedp = opc_table[insn];
144476cad711SPaolo Bonzini   else
144576cad711SPaolo Bonzini     {
144676cad711SPaolo Bonzini       const struct cris_opcode *opcodep;
144776cad711SPaolo Bonzini       int max_level_of_match = -1;
144876cad711SPaolo Bonzini 
144976cad711SPaolo Bonzini       for (opcodep = cris_opcodes;
145076cad711SPaolo Bonzini 	   opcodep->name != NULL;
145176cad711SPaolo Bonzini 	   opcodep++)
145276cad711SPaolo Bonzini 	{
145376cad711SPaolo Bonzini 	  int level_of_match;
145476cad711SPaolo Bonzini 
145576cad711SPaolo Bonzini 	  if (disdata->distype == cris_dis_v32)
145676cad711SPaolo Bonzini 	    {
145776cad711SPaolo Bonzini 	      switch (opcodep->applicable_version)
145876cad711SPaolo Bonzini 		{
145976cad711SPaolo Bonzini 		case cris_ver_version_all:
146076cad711SPaolo Bonzini 		  break;
146176cad711SPaolo Bonzini 
146276cad711SPaolo Bonzini 		case cris_ver_v0_3:
146376cad711SPaolo Bonzini 		case cris_ver_v0_10:
146476cad711SPaolo Bonzini 		case cris_ver_v3_10:
146576cad711SPaolo Bonzini 		case cris_ver_sim_v0_10:
146676cad711SPaolo Bonzini 		case cris_ver_v8_10:
146776cad711SPaolo Bonzini 		case cris_ver_v10:
146876cad711SPaolo Bonzini 		case cris_ver_warning:
146976cad711SPaolo Bonzini 		  continue;
147076cad711SPaolo Bonzini 
147176cad711SPaolo Bonzini 		case cris_ver_v3p:
147276cad711SPaolo Bonzini 		case cris_ver_v8p:
147376cad711SPaolo Bonzini 		case cris_ver_v10p:
147476cad711SPaolo Bonzini 		case cris_ver_v32p:
147576cad711SPaolo Bonzini 		  break;
147676cad711SPaolo Bonzini 
147776cad711SPaolo Bonzini 		case cris_ver_v8:
147876cad711SPaolo Bonzini 		  abort ();
147976cad711SPaolo Bonzini 		default:
148076cad711SPaolo Bonzini 		  abort ();
148176cad711SPaolo Bonzini 		}
148276cad711SPaolo Bonzini 	    }
148376cad711SPaolo Bonzini 	  else
148476cad711SPaolo Bonzini 	    {
148576cad711SPaolo Bonzini 	      switch (opcodep->applicable_version)
148676cad711SPaolo Bonzini 		{
148776cad711SPaolo Bonzini 		case cris_ver_version_all:
148876cad711SPaolo Bonzini 		case cris_ver_v0_3:
148976cad711SPaolo Bonzini 		case cris_ver_v3p:
149076cad711SPaolo Bonzini 		case cris_ver_v0_10:
149176cad711SPaolo Bonzini 		case cris_ver_v8p:
149276cad711SPaolo Bonzini 		case cris_ver_v8_10:
149376cad711SPaolo Bonzini 		case cris_ver_v10:
149476cad711SPaolo Bonzini 		case cris_ver_sim_v0_10:
149576cad711SPaolo Bonzini 		case cris_ver_v10p:
149676cad711SPaolo Bonzini 		case cris_ver_warning:
149776cad711SPaolo Bonzini 		  break;
149876cad711SPaolo Bonzini 
149976cad711SPaolo Bonzini 		case cris_ver_v32p:
150076cad711SPaolo Bonzini 		  continue;
150176cad711SPaolo Bonzini 
150276cad711SPaolo Bonzini 		case cris_ver_v8:
150376cad711SPaolo Bonzini 		  abort ();
150476cad711SPaolo Bonzini 		default:
150576cad711SPaolo Bonzini 		  abort ();
150676cad711SPaolo Bonzini 		}
150776cad711SPaolo Bonzini 	    }
150876cad711SPaolo Bonzini 
150976cad711SPaolo Bonzini 	  /* We give a double lead for bits matching the template in
151076cad711SPaolo Bonzini 	     cris_opcodes.  Not even, because then "move p8,r10" would
151176cad711SPaolo Bonzini 	     be given 2 bits lead over "clear.d r10".  When there's a
151276cad711SPaolo Bonzini 	     tie, the first entry in the table wins.  This is
151376cad711SPaolo Bonzini 	     deliberate, to avoid a more complicated recognition
151476cad711SPaolo Bonzini 	     formula.  */
151576cad711SPaolo Bonzini 	  if ((opcodep->match & insn) == opcodep->match
151676cad711SPaolo Bonzini 	      && (opcodep->lose & insn) == 0
151776cad711SPaolo Bonzini 	      && ((level_of_match
151876cad711SPaolo Bonzini 		   = cris_constraint (opcodep->args,
151976cad711SPaolo Bonzini 				      insn,
152076cad711SPaolo Bonzini 				      prefix_insn,
152176cad711SPaolo Bonzini 				      disdata))
152276cad711SPaolo Bonzini 		  >= 0)
152376cad711SPaolo Bonzini 	      && ((level_of_match
152476cad711SPaolo Bonzini 		   += 2 * number_of_bits (opcodep->match
152576cad711SPaolo Bonzini 					  | opcodep->lose))
152676cad711SPaolo Bonzini 			  > max_level_of_match))
152776cad711SPaolo Bonzini 		    {
152876cad711SPaolo Bonzini 		      max_matchedp = opcodep;
152976cad711SPaolo Bonzini 		      max_level_of_match = level_of_match;
153076cad711SPaolo Bonzini 
153176cad711SPaolo Bonzini 		      /* If there was a full match, never mind looking
153276cad711SPaolo Bonzini 			 further.  */
153376cad711SPaolo Bonzini 		      if (level_of_match >= 2 * 16)
153476cad711SPaolo Bonzini 			break;
153576cad711SPaolo Bonzini 		    }
153676cad711SPaolo Bonzini 		}
153776cad711SPaolo Bonzini       /* Fill in the new entry.
153876cad711SPaolo Bonzini 
153976cad711SPaolo Bonzini 	 If there are changes to the opcode-table involving prefixes, and
154076cad711SPaolo Bonzini 	 disassembly then does not work correctly, try removing the
154176cad711SPaolo Bonzini 	 else-clause below that fills in the prefix-table.  If that
154276cad711SPaolo Bonzini 	 helps, you need to change the prefix_opc_table setting above, or
154376cad711SPaolo Bonzini 	 something related.  */
154476cad711SPaolo Bonzini       if (prefix_insn == NO_CRIS_PREFIX)
154576cad711SPaolo Bonzini 	opc_table[insn] = max_matchedp;
154676cad711SPaolo Bonzini       else
154776cad711SPaolo Bonzini 	prefix_opc_table[insn] = max_matchedp;
154876cad711SPaolo Bonzini     }
154976cad711SPaolo Bonzini 
155076cad711SPaolo Bonzini   return max_matchedp;
155176cad711SPaolo Bonzini }
155276cad711SPaolo Bonzini 
155376cad711SPaolo Bonzini /* Return -1 if the constraints of a bitwise-matched instruction say
155476cad711SPaolo Bonzini    that there is no match.  Otherwise return a nonnegative number
155576cad711SPaolo Bonzini    indicating the confidence in the match (higher is better).  */
155676cad711SPaolo Bonzini 
155776cad711SPaolo Bonzini static int
cris_constraint(const char * cs,unsigned int insn,unsigned int prefix_insn,struct cris_disasm_data * disdata)155876cad711SPaolo Bonzini cris_constraint (const char *cs,
155976cad711SPaolo Bonzini 		 unsigned int insn,
156076cad711SPaolo Bonzini 		 unsigned int prefix_insn,
156176cad711SPaolo Bonzini 		 struct cris_disasm_data *disdata)
156276cad711SPaolo Bonzini {
156376cad711SPaolo Bonzini   int retval = 0;
156476cad711SPaolo Bonzini   int tmp;
156576cad711SPaolo Bonzini   int prefix_ok = 0;
156676cad711SPaolo Bonzini   const char *s;
156776cad711SPaolo Bonzini 
156876cad711SPaolo Bonzini   for (s = cs; *s; s++)
156976cad711SPaolo Bonzini     switch (*s)
157076cad711SPaolo Bonzini       {
157176cad711SPaolo Bonzini       case '!':
157276cad711SPaolo Bonzini 	/* Do not recognize "pop" if there's a prefix and then only for
157376cad711SPaolo Bonzini            v0..v10.  */
157476cad711SPaolo Bonzini 	if (prefix_insn != NO_CRIS_PREFIX
157576cad711SPaolo Bonzini 	    || disdata->distype != cris_dis_v0_v10)
157676cad711SPaolo Bonzini 	  return -1;
157776cad711SPaolo Bonzini 	break;
157876cad711SPaolo Bonzini 
157976cad711SPaolo Bonzini       case 'U':
158076cad711SPaolo Bonzini 	/* Not recognized at disassembly.  */
158176cad711SPaolo Bonzini 	return -1;
158276cad711SPaolo Bonzini 
158376cad711SPaolo Bonzini       case 'M':
158476cad711SPaolo Bonzini 	/* Size modifier for "clear", i.e. special register 0, 4 or 8.
158576cad711SPaolo Bonzini 	   Check that it is one of them.  Only special register 12 could
158676cad711SPaolo Bonzini 	   be mismatched, but checking for matches is more logical than
158776cad711SPaolo Bonzini 	   checking for mismatches when there are only a few cases.  */
158876cad711SPaolo Bonzini 	tmp = ((insn >> 12) & 0xf);
158976cad711SPaolo Bonzini 	if (tmp != 0 && tmp != 4 && tmp != 8)
159076cad711SPaolo Bonzini 	  return -1;
159176cad711SPaolo Bonzini 	break;
159276cad711SPaolo Bonzini 
159376cad711SPaolo Bonzini       case 'm':
159476cad711SPaolo Bonzini 	if ((insn & 0x30) == 0x30)
159576cad711SPaolo Bonzini 	  return -1;
159676cad711SPaolo Bonzini 	break;
159776cad711SPaolo Bonzini 
159876cad711SPaolo Bonzini       case 'S':
159976cad711SPaolo Bonzini 	/* A prefix operand without side-effect.  */
160076cad711SPaolo Bonzini 	if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0)
160176cad711SPaolo Bonzini 	  {
160276cad711SPaolo Bonzini 	    prefix_ok = 1;
160376cad711SPaolo Bonzini 	    break;
160476cad711SPaolo Bonzini 	  }
160576cad711SPaolo Bonzini 	else
160676cad711SPaolo Bonzini 	  return -1;
160776cad711SPaolo Bonzini 
160876cad711SPaolo Bonzini       case 's':
160976cad711SPaolo Bonzini       case 'y':
161076cad711SPaolo Bonzini       case 'Y':
161176cad711SPaolo Bonzini 	/* If this is a prefixed insn with postincrement (side-effect),
161276cad711SPaolo Bonzini 	   the prefix must not be DIP.  */
161376cad711SPaolo Bonzini 	if (prefix_insn != NO_CRIS_PREFIX)
161476cad711SPaolo Bonzini 	  {
161576cad711SPaolo Bonzini 	    if (insn & 0x400)
161676cad711SPaolo Bonzini 	      {
161776cad711SPaolo Bonzini 		const struct cris_opcode *prefix_opcodep
161876cad711SPaolo Bonzini 		  = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
161976cad711SPaolo Bonzini 
162076cad711SPaolo Bonzini 		if (prefix_opcodep->match == DIP_OPCODE)
162176cad711SPaolo Bonzini 		  return -1;
162276cad711SPaolo Bonzini 	      }
162376cad711SPaolo Bonzini 
162476cad711SPaolo Bonzini 	    prefix_ok = 1;
162576cad711SPaolo Bonzini 	  }
162676cad711SPaolo Bonzini 	break;
162776cad711SPaolo Bonzini 
162876cad711SPaolo Bonzini       case 'B':
162976cad711SPaolo Bonzini 	/* If we don't fall through, then the prefix is ok.  */
163076cad711SPaolo Bonzini 	prefix_ok = 1;
163176cad711SPaolo Bonzini 
163276cad711SPaolo Bonzini 	/* A "push" prefix.  Check for valid "push" size.
163376cad711SPaolo Bonzini 	   In case of special register, it may be != 4.  */
163476cad711SPaolo Bonzini 	if (prefix_insn != NO_CRIS_PREFIX)
163576cad711SPaolo Bonzini 	  {
163676cad711SPaolo Bonzini 	    /* Match the prefix insn to BDAPQ.  */
163776cad711SPaolo Bonzini 	    const struct cris_opcode *prefix_opcodep
163876cad711SPaolo Bonzini 	      = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata);
163976cad711SPaolo Bonzini 
164076cad711SPaolo Bonzini 	    if (prefix_opcodep->match == BDAP_QUICK_OPCODE)
164176cad711SPaolo Bonzini 	      {
164276cad711SPaolo Bonzini 		int pushsize = (prefix_insn & 255);
164376cad711SPaolo Bonzini 
164476cad711SPaolo Bonzini 		if (pushsize > 127)
164576cad711SPaolo Bonzini 		  pushsize -= 256;
164676cad711SPaolo Bonzini 
164776cad711SPaolo Bonzini 		if (s[1] == 'P')
164876cad711SPaolo Bonzini 		  {
164976cad711SPaolo Bonzini 		    unsigned int spec_reg = (insn >> 12) & 15;
165076cad711SPaolo Bonzini 		    const struct cris_spec_reg *sregp
165176cad711SPaolo Bonzini 		      = spec_reg_info (spec_reg, disdata->distype);
165276cad711SPaolo Bonzini 
165376cad711SPaolo Bonzini 		    /* For a special-register, the "prefix size" must
165476cad711SPaolo Bonzini 		       match the size of the register.  */
165576cad711SPaolo Bonzini 		    if (sregp && sregp->reg_size == (unsigned int) -pushsize)
165676cad711SPaolo Bonzini 		      break;
165776cad711SPaolo Bonzini 		  }
165876cad711SPaolo Bonzini 		else if (s[1] == 'R')
165976cad711SPaolo Bonzini 		  {
166076cad711SPaolo Bonzini 		    if ((insn & 0x30) == 0x20 && pushsize == -4)
166176cad711SPaolo Bonzini 		      break;
166276cad711SPaolo Bonzini 		  }
166376cad711SPaolo Bonzini 		/* FIXME:  Should abort here; next constraint letter
166476cad711SPaolo Bonzini 		   *must* be 'P' or 'R'.  */
166576cad711SPaolo Bonzini 	      }
166676cad711SPaolo Bonzini 	  }
166776cad711SPaolo Bonzini 	return -1;
166876cad711SPaolo Bonzini 
166976cad711SPaolo Bonzini       case 'D':
167076cad711SPaolo Bonzini 	retval = (((insn >> 12) & 15) == (insn & 15));
167176cad711SPaolo Bonzini 	if (!retval)
167276cad711SPaolo Bonzini 	  return -1;
167376cad711SPaolo Bonzini 	else
167476cad711SPaolo Bonzini 	  retval += 4;
167576cad711SPaolo Bonzini 	break;
167676cad711SPaolo Bonzini 
167776cad711SPaolo Bonzini       case 'P':
167876cad711SPaolo Bonzini 	{
167976cad711SPaolo Bonzini 	  const struct cris_spec_reg *sregp
168076cad711SPaolo Bonzini 	    = spec_reg_info ((insn >> 12) & 15, disdata->distype);
168176cad711SPaolo Bonzini 
168276cad711SPaolo Bonzini 	  /* Since we match four bits, we will give a value of 4-1 = 3
168376cad711SPaolo Bonzini 	     in a match.  If there is a corresponding exact match of a
168476cad711SPaolo Bonzini 	     special register in another pattern, it will get a value of
168576cad711SPaolo Bonzini 	     4, which will be higher.  This should be correct in that an
168676cad711SPaolo Bonzini 	     exact pattern would match better than a general pattern.
168776cad711SPaolo Bonzini 
168876cad711SPaolo Bonzini 	     Note that there is a reason for not returning zero; the
168976cad711SPaolo Bonzini 	     pattern for "clear" is partly  matched in the bit-pattern
169076cad711SPaolo Bonzini 	     (the two lower bits must be zero), while the bit-pattern
169176cad711SPaolo Bonzini 	     for a move from a special register is matched in the
169276cad711SPaolo Bonzini 	     register constraint.  */
169376cad711SPaolo Bonzini 
169476cad711SPaolo Bonzini 	  if (sregp != NULL)
169576cad711SPaolo Bonzini 	    {
169676cad711SPaolo Bonzini 	      retval += 3;
169776cad711SPaolo Bonzini 	      break;
169876cad711SPaolo Bonzini 	    }
169976cad711SPaolo Bonzini 	  else
170076cad711SPaolo Bonzini 	    return -1;
170176cad711SPaolo Bonzini 	}
170276cad711SPaolo Bonzini       }
170376cad711SPaolo Bonzini 
170476cad711SPaolo Bonzini   if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok)
170576cad711SPaolo Bonzini     return -1;
170676cad711SPaolo Bonzini 
170776cad711SPaolo Bonzini   return retval;
170876cad711SPaolo Bonzini }
170976cad711SPaolo Bonzini 
171076cad711SPaolo Bonzini /* Format number as hex with a leading "0x" into outbuffer.  */
171176cad711SPaolo Bonzini 
171276cad711SPaolo Bonzini static char *
format_hex(unsigned long number,char * outbuffer,struct cris_disasm_data * disdata)171376cad711SPaolo Bonzini format_hex (unsigned long number,
171476cad711SPaolo Bonzini 	    char *outbuffer,
171576cad711SPaolo Bonzini 	    struct cris_disasm_data *disdata)
171676cad711SPaolo Bonzini {
171776cad711SPaolo Bonzini   /* Truncate negative numbers on >32-bit hosts.  */
171876cad711SPaolo Bonzini   number &= 0xffffffff;
171976cad711SPaolo Bonzini 
172076cad711SPaolo Bonzini   sprintf (outbuffer, "0x%lx", number);
172176cad711SPaolo Bonzini 
172276cad711SPaolo Bonzini   /* Save this value for the "case" support.  */
172376cad711SPaolo Bonzini   if (TRACE_CASE)
172476cad711SPaolo Bonzini     last_immediate = number;
172576cad711SPaolo Bonzini 
172676cad711SPaolo Bonzini   return outbuffer + strlen (outbuffer);
172776cad711SPaolo Bonzini }
172876cad711SPaolo Bonzini 
172976cad711SPaolo Bonzini /* Format number as decimal into outbuffer.  Parameter signedp says
173076cad711SPaolo Bonzini    whether the number should be formatted as signed (!= 0) or
173176cad711SPaolo Bonzini    unsigned (== 0).  */
173276cad711SPaolo Bonzini 
173376cad711SPaolo Bonzini static char *
format_dec(long number,char * outbuffer,size_t outsize,int signedp)1734*2037a739SPhilippe Mathieu-Daudé format_dec (long number, char *outbuffer, size_t outsize, int signedp)
173576cad711SPaolo Bonzini {
173676cad711SPaolo Bonzini   last_immediate = number;
1737*2037a739SPhilippe Mathieu-Daudé   snprintf (outbuffer, outsize, signedp ? "%ld" : "%lu", number);
173876cad711SPaolo Bonzini 
173976cad711SPaolo Bonzini   return outbuffer + strlen (outbuffer);
174076cad711SPaolo Bonzini }
174176cad711SPaolo Bonzini 
174276cad711SPaolo Bonzini /* Format the name of the general register regno into outbuffer.  */
174376cad711SPaolo Bonzini 
174476cad711SPaolo Bonzini static char *
format_reg(struct cris_disasm_data * disdata,int regno,char * outbuffer_start,bfd_boolean with_reg_prefix)174576cad711SPaolo Bonzini format_reg (struct cris_disasm_data *disdata,
174676cad711SPaolo Bonzini 	    int regno,
174776cad711SPaolo Bonzini 	    char *outbuffer_start,
174876cad711SPaolo Bonzini 	    bfd_boolean with_reg_prefix)
174976cad711SPaolo Bonzini {
175076cad711SPaolo Bonzini   char *outbuffer = outbuffer_start;
175176cad711SPaolo Bonzini 
175276cad711SPaolo Bonzini   if (with_reg_prefix)
175376cad711SPaolo Bonzini     *outbuffer++ = REGISTER_PREFIX_CHAR;
175476cad711SPaolo Bonzini 
175576cad711SPaolo Bonzini   switch (regno)
175676cad711SPaolo Bonzini     {
175776cad711SPaolo Bonzini     case 15:
175876cad711SPaolo Bonzini       /* For v32, there is no context in which we output PC.  */
175976cad711SPaolo Bonzini       if (disdata->distype == cris_dis_v32)
176076cad711SPaolo Bonzini 	strcpy (outbuffer, "acr");
176176cad711SPaolo Bonzini       else
176276cad711SPaolo Bonzini 	strcpy (outbuffer, "pc");
176376cad711SPaolo Bonzini       break;
176476cad711SPaolo Bonzini 
176576cad711SPaolo Bonzini     case 14:
176676cad711SPaolo Bonzini       strcpy (outbuffer, "sp");
176776cad711SPaolo Bonzini       break;
176876cad711SPaolo Bonzini 
176976cad711SPaolo Bonzini     default:
177076cad711SPaolo Bonzini       sprintf (outbuffer, "r%d", regno);
177176cad711SPaolo Bonzini       break;
177276cad711SPaolo Bonzini     }
177376cad711SPaolo Bonzini 
177476cad711SPaolo Bonzini   return outbuffer_start + strlen (outbuffer_start);
177576cad711SPaolo Bonzini }
177676cad711SPaolo Bonzini 
177776cad711SPaolo Bonzini /* Format the name of a support register into outbuffer.  */
177876cad711SPaolo Bonzini 
177976cad711SPaolo Bonzini static char *
format_sup_reg(unsigned int regno,char * outbuffer_start,bfd_boolean with_reg_prefix)178076cad711SPaolo Bonzini format_sup_reg (unsigned int regno,
178176cad711SPaolo Bonzini 		char *outbuffer_start,
178276cad711SPaolo Bonzini 		bfd_boolean with_reg_prefix)
178376cad711SPaolo Bonzini {
178476cad711SPaolo Bonzini   char *outbuffer = outbuffer_start;
178576cad711SPaolo Bonzini   int i;
178676cad711SPaolo Bonzini 
178776cad711SPaolo Bonzini   if (with_reg_prefix)
178876cad711SPaolo Bonzini     *outbuffer++ = REGISTER_PREFIX_CHAR;
178976cad711SPaolo Bonzini 
179076cad711SPaolo Bonzini   for (i = 0; cris_support_regs[i].name != NULL; i++)
179176cad711SPaolo Bonzini     if (cris_support_regs[i].number == regno)
179276cad711SPaolo Bonzini       {
179376cad711SPaolo Bonzini 	sprintf (outbuffer, "%s", cris_support_regs[i].name);
179476cad711SPaolo Bonzini 	return outbuffer_start + strlen (outbuffer_start);
179576cad711SPaolo Bonzini       }
179676cad711SPaolo Bonzini 
179776cad711SPaolo Bonzini   /* There's supposed to be register names covering all numbers, though
179876cad711SPaolo Bonzini      some may be generic names.  */
179976cad711SPaolo Bonzini   sprintf (outbuffer, "format_sup_reg-BUG");
180076cad711SPaolo Bonzini   return outbuffer_start + strlen (outbuffer_start);
180176cad711SPaolo Bonzini }
180276cad711SPaolo Bonzini 
180376cad711SPaolo Bonzini /* Return the length of an instruction.  */
180476cad711SPaolo Bonzini 
180576cad711SPaolo Bonzini static unsigned
bytes_to_skip(unsigned int insn,const struct cris_opcode * matchedp,enum cris_disass_family distype,const struct cris_opcode * prefix_matchedp)180676cad711SPaolo Bonzini bytes_to_skip (unsigned int insn,
180776cad711SPaolo Bonzini 	       const struct cris_opcode *matchedp,
180876cad711SPaolo Bonzini 	       enum cris_disass_family distype,
180976cad711SPaolo Bonzini 	       const struct cris_opcode *prefix_matchedp)
181076cad711SPaolo Bonzini {
181176cad711SPaolo Bonzini   /* Each insn is a word plus "immediate" operands.  */
181276cad711SPaolo Bonzini   unsigned to_skip = 2;
181376cad711SPaolo Bonzini   const char *template = matchedp->args;
181476cad711SPaolo Bonzini   const char *s;
181576cad711SPaolo Bonzini 
181676cad711SPaolo Bonzini   for (s = template; *s; s++)
181776cad711SPaolo Bonzini     if ((*s == 's' || *s == 'N' || *s == 'Y')
181876cad711SPaolo Bonzini 	&& (insn & 0x400) && (insn & 15) == 15
181976cad711SPaolo Bonzini 	&& prefix_matchedp == NULL)
182076cad711SPaolo Bonzini       {
182176cad711SPaolo Bonzini 	/* Immediate via [pc+], so we have to check the size of the
182276cad711SPaolo Bonzini 	   operand.  */
182376cad711SPaolo Bonzini 	int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3));
182476cad711SPaolo Bonzini 
182576cad711SPaolo Bonzini 	if (matchedp->imm_oprnd_size == SIZE_FIX_32)
182676cad711SPaolo Bonzini 	  to_skip += 4;
182776cad711SPaolo Bonzini 	else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG)
182876cad711SPaolo Bonzini 	  {
182976cad711SPaolo Bonzini 	    const struct cris_spec_reg *sregp
183076cad711SPaolo Bonzini 	      = spec_reg_info ((insn >> 12) & 15, distype);
183176cad711SPaolo Bonzini 
183276cad711SPaolo Bonzini 	    /* FIXME: Improve error handling; should have been caught
183376cad711SPaolo Bonzini 	       earlier.  */
183476cad711SPaolo Bonzini 	    if (sregp == NULL)
183576cad711SPaolo Bonzini 	      return 2;
183676cad711SPaolo Bonzini 
183776cad711SPaolo Bonzini 	    /* PC is incremented by two, not one, for a byte.  Except on
183876cad711SPaolo Bonzini 	       CRISv32, where constants are always DWORD-size for
183976cad711SPaolo Bonzini 	       special registers.  */
184076cad711SPaolo Bonzini 	    to_skip +=
184176cad711SPaolo Bonzini 	      distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1;
184276cad711SPaolo Bonzini 	  }
184376cad711SPaolo Bonzini 	else
184476cad711SPaolo Bonzini 	  to_skip += (mode_size + 1) & ~1;
184576cad711SPaolo Bonzini       }
184676cad711SPaolo Bonzini     else if (*s == 'n')
184776cad711SPaolo Bonzini       to_skip += 4;
184876cad711SPaolo Bonzini     else if (*s == 'b')
184976cad711SPaolo Bonzini       to_skip += 2;
185076cad711SPaolo Bonzini 
185176cad711SPaolo Bonzini   return to_skip;
185276cad711SPaolo Bonzini }
185376cad711SPaolo Bonzini 
185476cad711SPaolo Bonzini /* Print condition code flags.  */
185576cad711SPaolo Bonzini 
185676cad711SPaolo Bonzini static char *
print_flags(struct cris_disasm_data * disdata,unsigned int insn,char * cp)185776cad711SPaolo Bonzini print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp)
185876cad711SPaolo Bonzini {
185976cad711SPaolo Bonzini   /* Use the v8 (Etrax 100) flag definitions for disassembly.
186076cad711SPaolo Bonzini      The differences with v0 (Etrax 1..4) vs. Svinto are:
186176cad711SPaolo Bonzini       v0 'd' <=> v8 'm'
186276cad711SPaolo Bonzini       v0 'e' <=> v8 'b'.
186376cad711SPaolo Bonzini      FIXME: Emit v0..v3 flag names somehow.  */
186476cad711SPaolo Bonzini   static const char v8_fnames[] = "cvznxibm";
186576cad711SPaolo Bonzini   static const char v32_fnames[] = "cvznxiup";
186676cad711SPaolo Bonzini   const char *fnames
186776cad711SPaolo Bonzini     = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames;
186876cad711SPaolo Bonzini 
186976cad711SPaolo Bonzini   unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15));
187076cad711SPaolo Bonzini   int i;
187176cad711SPaolo Bonzini 
187276cad711SPaolo Bonzini   for (i = 0; i < 8; i++)
187376cad711SPaolo Bonzini     if (flagbits & (1 << i))
187476cad711SPaolo Bonzini       *cp++ = fnames[i];
187576cad711SPaolo Bonzini 
187676cad711SPaolo Bonzini   return cp;
187776cad711SPaolo Bonzini }
187876cad711SPaolo Bonzini 
1879*2037a739SPhilippe Mathieu-Daudé #define FORMAT_DEC(number, tp, signedp)                      \
1880*2037a739SPhilippe Mathieu-Daudé     format_dec (number, tp, ({                                \
1881*2037a739SPhilippe Mathieu-Daudé             assert(tp >= temp && tp <= temp + sizeof(temp)); \
1882*2037a739SPhilippe Mathieu-Daudé             temp + sizeof(temp) - tp;                        \
1883*2037a739SPhilippe Mathieu-Daudé         }), signedp)
1884*2037a739SPhilippe Mathieu-Daudé 
188576cad711SPaolo Bonzini /* Print out an insn with its operands, and update the info->insn_type
188676cad711SPaolo Bonzini    fields.  The prefix_opcodep and the rest hold a prefix insn that is
188776cad711SPaolo Bonzini    supposed to be output as an address mode.  */
188876cad711SPaolo Bonzini 
188976cad711SPaolo Bonzini static void
print_with_operands(const struct cris_opcode * opcodep,unsigned int insn,unsigned char * buffer,bfd_vma addr,disassemble_info * info,const struct cris_opcode * prefix_opcodep,unsigned int prefix_insn,unsigned char * prefix_buffer,bfd_boolean with_reg_prefix)189076cad711SPaolo Bonzini print_with_operands (const struct cris_opcode *opcodep,
189176cad711SPaolo Bonzini 		     unsigned int insn,
189276cad711SPaolo Bonzini 		     unsigned char *buffer,
189376cad711SPaolo Bonzini 		     bfd_vma addr,
189476cad711SPaolo Bonzini 		     disassemble_info *info,
189576cad711SPaolo Bonzini 		     /* If a prefix insn was before this insn (and is supposed
189676cad711SPaolo Bonzini 			to be output as an address), here is a description of
189776cad711SPaolo Bonzini 			it.  */
189876cad711SPaolo Bonzini 		     const struct cris_opcode *prefix_opcodep,
189976cad711SPaolo Bonzini 		     unsigned int prefix_insn,
190076cad711SPaolo Bonzini 		     unsigned char *prefix_buffer,
190176cad711SPaolo Bonzini 		     bfd_boolean with_reg_prefix)
190276cad711SPaolo Bonzini {
190376cad711SPaolo Bonzini   /* Get a buffer of somewhat reasonable size where we store
190476cad711SPaolo Bonzini      intermediate parts of the insn.  */
190576cad711SPaolo Bonzini   char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2];
190676cad711SPaolo Bonzini   char *tp = temp;
190776cad711SPaolo Bonzini   static const char mode_char[] = "bwd?";
190876cad711SPaolo Bonzini   const char *s;
190976cad711SPaolo Bonzini   const char *cs;
191076cad711SPaolo Bonzini   struct cris_disasm_data *disdata
191176cad711SPaolo Bonzini     = (struct cris_disasm_data *) info->private_data;
191276cad711SPaolo Bonzini 
191376cad711SPaolo Bonzini   /* Print out the name first thing we do.  */
191476cad711SPaolo Bonzini   (*info->fprintf_func) (info->stream, "%s", opcodep->name);
191576cad711SPaolo Bonzini 
191676cad711SPaolo Bonzini   cs = opcodep->args;
191776cad711SPaolo Bonzini   s = cs;
191876cad711SPaolo Bonzini 
191976cad711SPaolo Bonzini   /* Ignore any prefix indicator.  */
192076cad711SPaolo Bonzini   if (*s == 'p')
192176cad711SPaolo Bonzini     s++;
192276cad711SPaolo Bonzini 
192376cad711SPaolo Bonzini   if (*s == 'm' || *s == 'M' || *s == 'z')
192476cad711SPaolo Bonzini     {
192576cad711SPaolo Bonzini       *tp++ = '.';
192676cad711SPaolo Bonzini 
192776cad711SPaolo Bonzini       /* Get the size-letter.  */
192876cad711SPaolo Bonzini       *tp++ = *s == 'M'
192976cad711SPaolo Bonzini 	? (insn & 0x8000 ? 'd'
193076cad711SPaolo Bonzini 	   : insn & 0x4000 ? 'w' : 'b')
193176cad711SPaolo Bonzini 	: mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)];
193276cad711SPaolo Bonzini 
193376cad711SPaolo Bonzini       /* Ignore the size and the space character that follows.  */
193476cad711SPaolo Bonzini       s += 2;
193576cad711SPaolo Bonzini     }
193676cad711SPaolo Bonzini 
193776cad711SPaolo Bonzini   /* Add a space if this isn't a long-branch, because for those will add
193876cad711SPaolo Bonzini      the condition part of the name later.  */
193976cad711SPaolo Bonzini   if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256))
194076cad711SPaolo Bonzini     *tp++ = ' ';
194176cad711SPaolo Bonzini 
194276cad711SPaolo Bonzini   /* Fill in the insn-type if deducible from the name (and there's no
194376cad711SPaolo Bonzini      better way).  */
194476cad711SPaolo Bonzini   if (opcodep->name[0] == 'j')
194576cad711SPaolo Bonzini     {
194676cad711SPaolo Bonzini       if (CONST_STRNEQ (opcodep->name, "jsr"))
194776cad711SPaolo Bonzini 	/* It's "jsr" or "jsrc".  */
194876cad711SPaolo Bonzini 	info->insn_type = dis_jsr;
194976cad711SPaolo Bonzini       else
195076cad711SPaolo Bonzini 	/* Any other jump-type insn is considered a branch.  */
195176cad711SPaolo Bonzini 	info->insn_type = dis_branch;
195276cad711SPaolo Bonzini     }
195376cad711SPaolo Bonzini 
195476cad711SPaolo Bonzini   /* We might know some more fields right now.  */
195576cad711SPaolo Bonzini   info->branch_delay_insns = opcodep->delayed;
195676cad711SPaolo Bonzini 
195776cad711SPaolo Bonzini   /* Handle operands.  */
195876cad711SPaolo Bonzini   for (; *s; s++)
195976cad711SPaolo Bonzini     {
196076cad711SPaolo Bonzini     switch (*s)
196176cad711SPaolo Bonzini       {
196276cad711SPaolo Bonzini       case 'T':
196376cad711SPaolo Bonzini 	tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix);
196476cad711SPaolo Bonzini 	break;
196576cad711SPaolo Bonzini 
196676cad711SPaolo Bonzini       case 'A':
196776cad711SPaolo Bonzini 	if (with_reg_prefix)
196876cad711SPaolo Bonzini 	  *tp++ = REGISTER_PREFIX_CHAR;
196976cad711SPaolo Bonzini 	*tp++ = 'a';
197076cad711SPaolo Bonzini 	*tp++ = 'c';
197176cad711SPaolo Bonzini 	*tp++ = 'r';
197276cad711SPaolo Bonzini 	break;
197376cad711SPaolo Bonzini 
197476cad711SPaolo Bonzini       case '[':
197576cad711SPaolo Bonzini       case ']':
197676cad711SPaolo Bonzini       case ',':
197776cad711SPaolo Bonzini 	*tp++ = *s;
197876cad711SPaolo Bonzini 	break;
197976cad711SPaolo Bonzini 
198076cad711SPaolo Bonzini       case '!':
198176cad711SPaolo Bonzini 	/* Ignore at this point; used at earlier stages to avoid
198276cad711SPaolo Bonzini 	   recognition if there's a prefix at something that in other
198376cad711SPaolo Bonzini 	   ways looks like a "pop".  */
198476cad711SPaolo Bonzini 	break;
198576cad711SPaolo Bonzini 
198676cad711SPaolo Bonzini       case 'd':
198776cad711SPaolo Bonzini 	/* Ignore.  This is an optional ".d " on the large one of
198876cad711SPaolo Bonzini 	   relaxable insns.  */
198976cad711SPaolo Bonzini 	break;
199076cad711SPaolo Bonzini 
199176cad711SPaolo Bonzini       case 'B':
199276cad711SPaolo Bonzini 	/* This was the prefix that made this a "push".  We've already
199376cad711SPaolo Bonzini 	   handled it by recognizing it, so signal that the prefix is
199476cad711SPaolo Bonzini 	   handled by setting it to NULL.  */
199576cad711SPaolo Bonzini 	prefix_opcodep = NULL;
199676cad711SPaolo Bonzini 	break;
199776cad711SPaolo Bonzini 
199876cad711SPaolo Bonzini       case 'D':
199976cad711SPaolo Bonzini       case 'r':
200076cad711SPaolo Bonzini 	tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
200176cad711SPaolo Bonzini 	break;
200276cad711SPaolo Bonzini 
200376cad711SPaolo Bonzini       case 'R':
200476cad711SPaolo Bonzini 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
200576cad711SPaolo Bonzini 	break;
200676cad711SPaolo Bonzini 
200776cad711SPaolo Bonzini       case 'n':
200876cad711SPaolo Bonzini 	{
200976cad711SPaolo Bonzini 	  /* Like N but pc-relative to the start of the insn.  */
2010001ebacaSPeter Maydell 	  uint32_t number
201176cad711SPaolo Bonzini 	    = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536
201276cad711SPaolo Bonzini 	       + buffer[5] * 0x1000000 + addr);
201376cad711SPaolo Bonzini 
201476cad711SPaolo Bonzini 	  /* Finish off and output previous formatted bytes.  */
201576cad711SPaolo Bonzini 	  *tp = 0;
201676cad711SPaolo Bonzini 	  if (temp[0])
201776cad711SPaolo Bonzini 	    (*info->fprintf_func) (info->stream, "%s", temp);
201876cad711SPaolo Bonzini 	  tp = temp;
201976cad711SPaolo Bonzini 
202076cad711SPaolo Bonzini 	  (*info->print_address_func) ((bfd_vma) number, info);
202176cad711SPaolo Bonzini 	}
202276cad711SPaolo Bonzini 	break;
202376cad711SPaolo Bonzini 
202476cad711SPaolo Bonzini       case 'u':
202576cad711SPaolo Bonzini 	{
202676cad711SPaolo Bonzini 	  /* Like n but the offset is bits <3:0> in the instruction.  */
202776cad711SPaolo Bonzini 	  unsigned long number = (buffer[0] & 0xf) * 2 + addr;
202876cad711SPaolo Bonzini 
202976cad711SPaolo Bonzini 	  /* Finish off and output previous formatted bytes.  */
203076cad711SPaolo Bonzini 	  *tp = 0;
203176cad711SPaolo Bonzini 	  if (temp[0])
203276cad711SPaolo Bonzini 	    (*info->fprintf_func) (info->stream, "%s", temp);
203376cad711SPaolo Bonzini 	  tp = temp;
203476cad711SPaolo Bonzini 
203576cad711SPaolo Bonzini 	  (*info->print_address_func) ((bfd_vma) number, info);
203676cad711SPaolo Bonzini 	}
203776cad711SPaolo Bonzini 	break;
203876cad711SPaolo Bonzini 
203976cad711SPaolo Bonzini       case 'N':
204076cad711SPaolo Bonzini       case 'y':
204176cad711SPaolo Bonzini       case 'Y':
204276cad711SPaolo Bonzini       case 'S':
204376cad711SPaolo Bonzini       case 's':
204476cad711SPaolo Bonzini 	/* Any "normal" memory operand.  */
204576cad711SPaolo Bonzini 	if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL)
204676cad711SPaolo Bonzini 	  {
204776cad711SPaolo Bonzini 	    /* We're looking at [pc+], i.e. we need to output an immediate
204876cad711SPaolo Bonzini 	       number, where the size can depend on different things.  */
2049230f4c6bSPeter Maydell 	    int32_t number;
205076cad711SPaolo Bonzini 	    int signedp
205176cad711SPaolo Bonzini 	      = ((*cs == 'z' && (insn & 0x20))
205276cad711SPaolo Bonzini 		 || opcodep->match == BDAP_QUICK_OPCODE);
205376cad711SPaolo Bonzini 	    int nbytes;
205476cad711SPaolo Bonzini 
205576cad711SPaolo Bonzini 	    if (opcodep->imm_oprnd_size == SIZE_FIX_32)
205676cad711SPaolo Bonzini 	      nbytes = 4;
205776cad711SPaolo Bonzini 	    else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
205876cad711SPaolo Bonzini 	      {
205976cad711SPaolo Bonzini 		const struct cris_spec_reg *sregp
206076cad711SPaolo Bonzini 		  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
206176cad711SPaolo Bonzini 
206276cad711SPaolo Bonzini 		/* A NULL return should have been as a non-match earlier,
206376cad711SPaolo Bonzini 		   so catch it as an internal error in the error-case
206476cad711SPaolo Bonzini 		   below.  */
206576cad711SPaolo Bonzini 		if (sregp == NULL)
206676cad711SPaolo Bonzini 		  /* Whatever non-valid size.  */
206776cad711SPaolo Bonzini 		  nbytes = 42;
206876cad711SPaolo Bonzini 		else
206976cad711SPaolo Bonzini 		  /* PC is always incremented by a multiple of two.
207076cad711SPaolo Bonzini 		     For CRISv32, immediates are always 4 bytes for
207176cad711SPaolo Bonzini 		     special registers.  */
207276cad711SPaolo Bonzini 		  nbytes = disdata->distype == cris_dis_v32
207376cad711SPaolo Bonzini 		    ? 4 : (sregp->reg_size + 1) & ~1;
207476cad711SPaolo Bonzini 	      }
207576cad711SPaolo Bonzini 	    else
207676cad711SPaolo Bonzini 	      {
207776cad711SPaolo Bonzini 		int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3));
207876cad711SPaolo Bonzini 
207976cad711SPaolo Bonzini 		if (mode_size == 1)
208076cad711SPaolo Bonzini 		  nbytes = 2;
208176cad711SPaolo Bonzini 		else
208276cad711SPaolo Bonzini 		  nbytes = mode_size;
208376cad711SPaolo Bonzini 	      }
208476cad711SPaolo Bonzini 
208576cad711SPaolo Bonzini 	    switch (nbytes)
208676cad711SPaolo Bonzini 	      {
208776cad711SPaolo Bonzini 	      case 1:
208876cad711SPaolo Bonzini 		number = buffer[2];
208976cad711SPaolo Bonzini 		if (signedp && number > 127)
209076cad711SPaolo Bonzini 		  number -= 256;
209176cad711SPaolo Bonzini 		break;
209276cad711SPaolo Bonzini 
209376cad711SPaolo Bonzini 	      case 2:
209476cad711SPaolo Bonzini 		number = buffer[2] + buffer[3] * 256;
209576cad711SPaolo Bonzini 		if (signedp && number > 32767)
209676cad711SPaolo Bonzini 		  number -= 65536;
209776cad711SPaolo Bonzini 		break;
209876cad711SPaolo Bonzini 
209976cad711SPaolo Bonzini 	      case 4:
210076cad711SPaolo Bonzini 		number
210176cad711SPaolo Bonzini 		  = buffer[2] + buffer[3] * 256 + buffer[4] * 65536
210276cad711SPaolo Bonzini 		  + buffer[5] * 0x1000000;
210376cad711SPaolo Bonzini 		break;
210476cad711SPaolo Bonzini 
210576cad711SPaolo Bonzini 	      default:
210676cad711SPaolo Bonzini 		strcpy (tp, "bug");
210776cad711SPaolo Bonzini 		tp += 3;
210876cad711SPaolo Bonzini 		number = 42;
210976cad711SPaolo Bonzini 	      }
211076cad711SPaolo Bonzini 
211176cad711SPaolo Bonzini 	    if ((*cs == 'z' && (insn & 0x20))
211276cad711SPaolo Bonzini 		|| (opcodep->match == BDAP_QUICK_OPCODE
211376cad711SPaolo Bonzini 		    && (nbytes <= 2 || buffer[1 + nbytes] == 0)))
2114*2037a739SPhilippe Mathieu-Daudé 	      tp = FORMAT_DEC (number, tp, signedp);
211576cad711SPaolo Bonzini 	    else
211676cad711SPaolo Bonzini 	      {
211776cad711SPaolo Bonzini 		unsigned int highbyte = (number >> 24) & 0xff;
211876cad711SPaolo Bonzini 
211976cad711SPaolo Bonzini 		/* Either output this as an address or as a number.  If it's
212076cad711SPaolo Bonzini 		   a dword with the same high-byte as the address of the
212176cad711SPaolo Bonzini 		   insn, assume it's an address, and also if it's a non-zero
212276cad711SPaolo Bonzini 		   non-0xff high-byte.  If this is a jsr or a jump, then
212376cad711SPaolo Bonzini 		   it's definitely an address.  */
212476cad711SPaolo Bonzini 		if (nbytes == 4
212576cad711SPaolo Bonzini 		    && (highbyte == ((addr >> 24) & 0xff)
212676cad711SPaolo Bonzini 			|| (highbyte != 0 && highbyte != 0xff)
212776cad711SPaolo Bonzini 			|| info->insn_type == dis_branch
212876cad711SPaolo Bonzini 			|| info->insn_type == dis_jsr))
212976cad711SPaolo Bonzini 		  {
213076cad711SPaolo Bonzini 		    /* Finish off and output previous formatted bytes.  */
213176cad711SPaolo Bonzini 		    *tp = 0;
213276cad711SPaolo Bonzini 		    tp = temp;
213376cad711SPaolo Bonzini 		    if (temp[0])
213476cad711SPaolo Bonzini 		      (*info->fprintf_func) (info->stream, "%s", temp);
213576cad711SPaolo Bonzini 
213676cad711SPaolo Bonzini 		    (*info->print_address_func) ((bfd_vma) number, info);
213776cad711SPaolo Bonzini 
213876cad711SPaolo Bonzini 		    info->target = number;
213976cad711SPaolo Bonzini 		  }
214076cad711SPaolo Bonzini 		else
214176cad711SPaolo Bonzini 		  tp = format_hex (number, tp, disdata);
214276cad711SPaolo Bonzini 	      }
214376cad711SPaolo Bonzini 	  }
214476cad711SPaolo Bonzini 	else
214576cad711SPaolo Bonzini 	  {
214676cad711SPaolo Bonzini 	    /* Not an immediate number.  Then this is a (possibly
214776cad711SPaolo Bonzini 	       prefixed) memory operand.  */
214876cad711SPaolo Bonzini 	    if (info->insn_type != dis_nonbranch)
214976cad711SPaolo Bonzini 	      {
215076cad711SPaolo Bonzini 		int mode_size
215176cad711SPaolo Bonzini 		  = 1 << ((insn >> 4)
215276cad711SPaolo Bonzini 			  & (opcodep->args[0] == 'z' ? 1 : 3));
215376cad711SPaolo Bonzini 		int size;
215476cad711SPaolo Bonzini 		info->insn_type = dis_dref;
215576cad711SPaolo Bonzini 		info->flags |= CRIS_DIS_FLAG_MEMREF;
215676cad711SPaolo Bonzini 
215776cad711SPaolo Bonzini 		if (opcodep->imm_oprnd_size == SIZE_FIX_32)
215876cad711SPaolo Bonzini 		  size = 4;
215976cad711SPaolo Bonzini 		else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG)
216076cad711SPaolo Bonzini 		  {
216176cad711SPaolo Bonzini 		    const struct cris_spec_reg *sregp
216276cad711SPaolo Bonzini 		      = spec_reg_info ((insn >> 12) & 15, disdata->distype);
216376cad711SPaolo Bonzini 
216476cad711SPaolo Bonzini 		    /* FIXME: Improve error handling; should have been caught
216576cad711SPaolo Bonzini 		       earlier.  */
216676cad711SPaolo Bonzini 		    if (sregp == NULL)
216776cad711SPaolo Bonzini 		      size = 4;
216876cad711SPaolo Bonzini 		    else
216976cad711SPaolo Bonzini 		      size = sregp->reg_size;
217076cad711SPaolo Bonzini 		  }
217176cad711SPaolo Bonzini 		else
217276cad711SPaolo Bonzini 		  size = mode_size;
217376cad711SPaolo Bonzini 
217476cad711SPaolo Bonzini 		info->data_size = size;
217576cad711SPaolo Bonzini 	      }
217676cad711SPaolo Bonzini 
217776cad711SPaolo Bonzini 	    *tp++ = '[';
217876cad711SPaolo Bonzini 
217976cad711SPaolo Bonzini 	    if (prefix_opcodep
218076cad711SPaolo Bonzini 		/* We don't match dip with a postincremented field
218176cad711SPaolo Bonzini 		   as a side-effect address mode.  */
218276cad711SPaolo Bonzini 		&& ((insn & 0x400) == 0
218376cad711SPaolo Bonzini 		    || prefix_opcodep->match != DIP_OPCODE))
218476cad711SPaolo Bonzini 	      {
218576cad711SPaolo Bonzini 		if (insn & 0x400)
218676cad711SPaolo Bonzini 		  {
218776cad711SPaolo Bonzini 		    tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
218876cad711SPaolo Bonzini 		    *tp++ = '=';
218976cad711SPaolo Bonzini 		  }
219076cad711SPaolo Bonzini 
219176cad711SPaolo Bonzini 
219276cad711SPaolo Bonzini 		/* We mainly ignore the prefix format string when the
219376cad711SPaolo Bonzini 		   address-mode syntax is output.  */
219476cad711SPaolo Bonzini 		switch (prefix_opcodep->match)
219576cad711SPaolo Bonzini 		  {
219676cad711SPaolo Bonzini 		  case DIP_OPCODE:
219776cad711SPaolo Bonzini 		    /* It's [r], [r+] or [pc+].  */
219876cad711SPaolo Bonzini 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
219976cad711SPaolo Bonzini 		      {
220076cad711SPaolo Bonzini 			/* It's [pc+].  This cannot possibly be anything
220176cad711SPaolo Bonzini 			   but an address.  */
2202001ebacaSPeter Maydell 			uint32_t number
220376cad711SPaolo Bonzini 			  = prefix_buffer[2] + prefix_buffer[3] * 256
220476cad711SPaolo Bonzini 			  + prefix_buffer[4] * 65536
220576cad711SPaolo Bonzini 			  + prefix_buffer[5] * 0x1000000;
220676cad711SPaolo Bonzini 
220776cad711SPaolo Bonzini 			info->target = (bfd_vma) number;
220876cad711SPaolo Bonzini 
220976cad711SPaolo Bonzini 			/* Finish off and output previous formatted
221076cad711SPaolo Bonzini 			   data.  */
221176cad711SPaolo Bonzini 			*tp = 0;
221276cad711SPaolo Bonzini 			tp = temp;
221376cad711SPaolo Bonzini 			if (temp[0])
221476cad711SPaolo Bonzini 			  (*info->fprintf_func) (info->stream, "%s", temp);
221576cad711SPaolo Bonzini 
221676cad711SPaolo Bonzini 			(*info->print_address_func) ((bfd_vma) number, info);
221776cad711SPaolo Bonzini 		      }
221876cad711SPaolo Bonzini 		    else
221976cad711SPaolo Bonzini 		      {
222076cad711SPaolo Bonzini 			/* For a memref in an address, we use target2.
222176cad711SPaolo Bonzini 			   In this case, target is zero.  */
222276cad711SPaolo Bonzini 			info->flags
222376cad711SPaolo Bonzini 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
222476cad711SPaolo Bonzini 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM);
222576cad711SPaolo Bonzini 
222676cad711SPaolo Bonzini 			info->target2 = prefix_insn & 15;
222776cad711SPaolo Bonzini 
222876cad711SPaolo Bonzini 			*tp++ = '[';
222976cad711SPaolo Bonzini 			tp = format_reg (disdata, prefix_insn & 15, tp,
223076cad711SPaolo Bonzini 					 with_reg_prefix);
223176cad711SPaolo Bonzini 			if (prefix_insn & 0x400)
223276cad711SPaolo Bonzini 			  *tp++ = '+';
223376cad711SPaolo Bonzini 			*tp++ = ']';
223476cad711SPaolo Bonzini 		      }
223576cad711SPaolo Bonzini 		    break;
223676cad711SPaolo Bonzini 
223776cad711SPaolo Bonzini 		  case BDAP_QUICK_OPCODE:
223876cad711SPaolo Bonzini 		    {
223976cad711SPaolo Bonzini 		      int number;
224076cad711SPaolo Bonzini 
224176cad711SPaolo Bonzini 		      number = prefix_buffer[0];
224276cad711SPaolo Bonzini 		      if (number > 127)
224376cad711SPaolo Bonzini 			number -= 256;
224476cad711SPaolo Bonzini 
224576cad711SPaolo Bonzini 		      /* Output "reg+num" or, if num < 0, "reg-num".  */
224676cad711SPaolo Bonzini 		      tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
224776cad711SPaolo Bonzini 				       with_reg_prefix);
224876cad711SPaolo Bonzini 		      if (number >= 0)
224976cad711SPaolo Bonzini 			*tp++ = '+';
2250*2037a739SPhilippe Mathieu-Daudé 		      tp = FORMAT_DEC (number, tp, 1);
225176cad711SPaolo Bonzini 
225276cad711SPaolo Bonzini 		      info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
225376cad711SPaolo Bonzini 		      info->target = (prefix_insn >> 12) & 15;
225476cad711SPaolo Bonzini 		      info->target2 = (bfd_vma) number;
225576cad711SPaolo Bonzini 		      break;
225676cad711SPaolo Bonzini 		    }
225776cad711SPaolo Bonzini 
225876cad711SPaolo Bonzini 		  case BIAP_OPCODE:
225976cad711SPaolo Bonzini 		    /* Output "r+R.m".  */
226076cad711SPaolo Bonzini 		    tp = format_reg (disdata, prefix_insn & 15, tp,
226176cad711SPaolo Bonzini 				     with_reg_prefix);
226276cad711SPaolo Bonzini 		    *tp++ = '+';
226376cad711SPaolo Bonzini 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
226476cad711SPaolo Bonzini 				     with_reg_prefix);
226576cad711SPaolo Bonzini 		    *tp++ = '.';
226676cad711SPaolo Bonzini 		    *tp++ = mode_char[(prefix_insn >> 4) & 3];
226776cad711SPaolo Bonzini 
226876cad711SPaolo Bonzini 		    info->flags
226976cad711SPaolo Bonzini 		      |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
227076cad711SPaolo Bonzini 			  | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
227176cad711SPaolo Bonzini 
227276cad711SPaolo Bonzini 			  | ((prefix_insn & 0x8000)
227376cad711SPaolo Bonzini 			     ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4
227476cad711SPaolo Bonzini 			     : ((prefix_insn & 0x8000)
227576cad711SPaolo Bonzini 				? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0)));
227676cad711SPaolo Bonzini 
227776cad711SPaolo Bonzini 		    /* Is it the casejump?  It's a "adds.w [pc+r%d.w],pc".  */
227876cad711SPaolo Bonzini 		    if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f)
227976cad711SPaolo Bonzini 		      /* Then start interpreting data as offsets.  */
228076cad711SPaolo Bonzini 		      case_offset_counter = no_of_case_offsets;
228176cad711SPaolo Bonzini 		    break;
228276cad711SPaolo Bonzini 
228376cad711SPaolo Bonzini 		  case BDAP_INDIR_OPCODE:
228476cad711SPaolo Bonzini 		    /* Output "r+s.m", or, if "s" is [pc+], "r+s" or
228576cad711SPaolo Bonzini 		       "r-s".  */
228676cad711SPaolo Bonzini 		    tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp,
228776cad711SPaolo Bonzini 				     with_reg_prefix);
228876cad711SPaolo Bonzini 
228976cad711SPaolo Bonzini 		    if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15)
229076cad711SPaolo Bonzini 		      {
2291230f4c6bSPeter Maydell 			int32_t number;
229276cad711SPaolo Bonzini 			unsigned int nbytes;
229376cad711SPaolo Bonzini 
229476cad711SPaolo Bonzini 			/* It's a value.  Get its size.  */
229576cad711SPaolo Bonzini 			int mode_size = 1 << ((prefix_insn >> 4) & 3);
229676cad711SPaolo Bonzini 
229776cad711SPaolo Bonzini 			if (mode_size == 1)
229876cad711SPaolo Bonzini 			  nbytes = 2;
229976cad711SPaolo Bonzini 			else
230076cad711SPaolo Bonzini 			  nbytes = mode_size;
230176cad711SPaolo Bonzini 
230276cad711SPaolo Bonzini 			switch (nbytes)
230376cad711SPaolo Bonzini 			  {
230476cad711SPaolo Bonzini 			  case 1:
230576cad711SPaolo Bonzini 			    number = prefix_buffer[2];
230676cad711SPaolo Bonzini 			    if (number > 127)
230776cad711SPaolo Bonzini 			      number -= 256;
230876cad711SPaolo Bonzini 			    break;
230976cad711SPaolo Bonzini 
231076cad711SPaolo Bonzini 			  case 2:
231176cad711SPaolo Bonzini 			    number = prefix_buffer[2] + prefix_buffer[3] * 256;
231276cad711SPaolo Bonzini 			    if (number > 32767)
231376cad711SPaolo Bonzini 			      number -= 65536;
231476cad711SPaolo Bonzini 			    break;
231576cad711SPaolo Bonzini 
231676cad711SPaolo Bonzini 			  case 4:
231776cad711SPaolo Bonzini 			    number
231876cad711SPaolo Bonzini 			      = prefix_buffer[2] + prefix_buffer[3] * 256
231976cad711SPaolo Bonzini 			      + prefix_buffer[4] * 65536
232076cad711SPaolo Bonzini 			      + prefix_buffer[5] * 0x1000000;
232176cad711SPaolo Bonzini 			    break;
232276cad711SPaolo Bonzini 
232376cad711SPaolo Bonzini 			  default:
232476cad711SPaolo Bonzini 			    strcpy (tp, "bug");
232576cad711SPaolo Bonzini 			    tp += 3;
232676cad711SPaolo Bonzini 			    number = 42;
232776cad711SPaolo Bonzini 			  }
232876cad711SPaolo Bonzini 
232976cad711SPaolo Bonzini 			info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
233076cad711SPaolo Bonzini 			info->target2 = (bfd_vma) number;
233176cad711SPaolo Bonzini 
233276cad711SPaolo Bonzini 			/* If the size is dword, then assume it's an
233376cad711SPaolo Bonzini 			   address.  */
233476cad711SPaolo Bonzini 			if (nbytes == 4)
233576cad711SPaolo Bonzini 			  {
233676cad711SPaolo Bonzini 			    /* Finish off and output previous formatted
233776cad711SPaolo Bonzini 			       bytes.  */
233876cad711SPaolo Bonzini 			    *tp++ = '+';
233976cad711SPaolo Bonzini 			    *tp = 0;
234076cad711SPaolo Bonzini 			    tp = temp;
234176cad711SPaolo Bonzini 			    (*info->fprintf_func) (info->stream, "%s", temp);
234276cad711SPaolo Bonzini 
234376cad711SPaolo Bonzini 			    (*info->print_address_func) ((bfd_vma) number, info);
234476cad711SPaolo Bonzini 			  }
234576cad711SPaolo Bonzini 			else
234676cad711SPaolo Bonzini 			  {
234776cad711SPaolo Bonzini 			    if (number >= 0)
234876cad711SPaolo Bonzini 			      *tp++ = '+';
2349*2037a739SPhilippe Mathieu-Daudé 			    tp = FORMAT_DEC (number, tp, 1);
235076cad711SPaolo Bonzini 			  }
235176cad711SPaolo Bonzini 		      }
235276cad711SPaolo Bonzini 		    else
235376cad711SPaolo Bonzini 		      {
235476cad711SPaolo Bonzini 			/* Output "r+[R].m" or "r+[R+].m".  */
235576cad711SPaolo Bonzini 			*tp++ = '+';
235676cad711SPaolo Bonzini 			*tp++ = '[';
235776cad711SPaolo Bonzini 			tp = format_reg (disdata, prefix_insn & 15, tp,
235876cad711SPaolo Bonzini 					 with_reg_prefix);
235976cad711SPaolo Bonzini 			if (prefix_insn & 0x400)
236076cad711SPaolo Bonzini 			  *tp++ = '+';
236176cad711SPaolo Bonzini 			*tp++ = ']';
236276cad711SPaolo Bonzini 			*tp++ = '.';
236376cad711SPaolo Bonzini 			*tp++ = mode_char[(prefix_insn >> 4) & 3];
236476cad711SPaolo Bonzini 
236576cad711SPaolo Bonzini 			info->flags
236676cad711SPaolo Bonzini 			  |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG
236776cad711SPaolo Bonzini 			      | CRIS_DIS_FLAG_MEM_TARGET2_MEM
236876cad711SPaolo Bonzini 			      | CRIS_DIS_FLAG_MEM_TARGET_IS_REG
236976cad711SPaolo Bonzini 
237076cad711SPaolo Bonzini 			      | (((prefix_insn >> 4) == 2)
237176cad711SPaolo Bonzini 				 ? 0
237276cad711SPaolo Bonzini 				 : (((prefix_insn >> 4) & 3) == 1
237376cad711SPaolo Bonzini 				    ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD
237476cad711SPaolo Bonzini 				    : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE)));
237576cad711SPaolo Bonzini 		      }
237676cad711SPaolo Bonzini 		    break;
237776cad711SPaolo Bonzini 
237876cad711SPaolo Bonzini 		  default:
237976cad711SPaolo Bonzini 		    (*info->fprintf_func) (info->stream, "?prefix-bug");
238076cad711SPaolo Bonzini 		  }
238176cad711SPaolo Bonzini 
238276cad711SPaolo Bonzini 		/* To mark that the prefix is used, reset it.  */
238376cad711SPaolo Bonzini 		prefix_opcodep = NULL;
238476cad711SPaolo Bonzini 	      }
238576cad711SPaolo Bonzini 	    else
238676cad711SPaolo Bonzini 	      {
238776cad711SPaolo Bonzini 		tp = format_reg (disdata, insn & 15, tp, with_reg_prefix);
238876cad711SPaolo Bonzini 
238976cad711SPaolo Bonzini 		info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG;
239076cad711SPaolo Bonzini 		info->target = insn & 15;
239176cad711SPaolo Bonzini 
239276cad711SPaolo Bonzini 		if (insn & 0x400)
239376cad711SPaolo Bonzini 		  *tp++ = '+';
239476cad711SPaolo Bonzini 	      }
239576cad711SPaolo Bonzini 	    *tp++ = ']';
239676cad711SPaolo Bonzini 	  }
239776cad711SPaolo Bonzini 	break;
239876cad711SPaolo Bonzini 
239976cad711SPaolo Bonzini       case 'x':
240076cad711SPaolo Bonzini 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
240176cad711SPaolo Bonzini 	*tp++ = '.';
240276cad711SPaolo Bonzini 	*tp++ = mode_char[(insn >> 4) & 3];
240376cad711SPaolo Bonzini 	break;
240476cad711SPaolo Bonzini 
240576cad711SPaolo Bonzini       case 'I':
2406*2037a739SPhilippe Mathieu-Daudé 	tp = FORMAT_DEC (insn & 63, tp, 0);
240776cad711SPaolo Bonzini 	break;
240876cad711SPaolo Bonzini 
240976cad711SPaolo Bonzini       case 'b':
241076cad711SPaolo Bonzini 	{
241176cad711SPaolo Bonzini 	  int where = buffer[2] + buffer[3] * 256;
241276cad711SPaolo Bonzini 
241376cad711SPaolo Bonzini 	  if (where > 32767)
241476cad711SPaolo Bonzini 	    where -= 65536;
241576cad711SPaolo Bonzini 
241676cad711SPaolo Bonzini 	  where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4);
241776cad711SPaolo Bonzini 
241876cad711SPaolo Bonzini 	  if (insn == BA_PC_INCR_OPCODE)
241976cad711SPaolo Bonzini 	    info->insn_type = dis_branch;
242076cad711SPaolo Bonzini 	  else
242176cad711SPaolo Bonzini 	    info->insn_type = dis_condbranch;
242276cad711SPaolo Bonzini 
242376cad711SPaolo Bonzini 	  info->target = (bfd_vma) where;
242476cad711SPaolo Bonzini 
242576cad711SPaolo Bonzini 	  *tp = 0;
242676cad711SPaolo Bonzini 	  tp = temp;
242776cad711SPaolo Bonzini 	  (*info->fprintf_func) (info->stream, "%s%s ",
242876cad711SPaolo Bonzini 				 temp, cris_cc_strings[insn >> 12]);
242976cad711SPaolo Bonzini 
243076cad711SPaolo Bonzini 	  (*info->print_address_func) ((bfd_vma) where, info);
243176cad711SPaolo Bonzini 	}
243276cad711SPaolo Bonzini       break;
243376cad711SPaolo Bonzini 
243476cad711SPaolo Bonzini     case 'c':
2435*2037a739SPhilippe Mathieu-Daudé       tp = FORMAT_DEC (insn & 31, tp, 0);
243676cad711SPaolo Bonzini       break;
243776cad711SPaolo Bonzini 
243876cad711SPaolo Bonzini     case 'C':
2439*2037a739SPhilippe Mathieu-Daudé       tp = FORMAT_DEC (insn & 15, tp, 0);
244076cad711SPaolo Bonzini       break;
244176cad711SPaolo Bonzini 
244276cad711SPaolo Bonzini     case 'o':
244376cad711SPaolo Bonzini       {
244476cad711SPaolo Bonzini 	long offset = insn & 0xfe;
244576cad711SPaolo Bonzini 	bfd_vma target;
244676cad711SPaolo Bonzini 
244776cad711SPaolo Bonzini 	if (insn & 1)
244876cad711SPaolo Bonzini 	  offset |= ~0xff;
244976cad711SPaolo Bonzini 
245076cad711SPaolo Bonzini 	if (opcodep->match == BA_QUICK_OPCODE)
245176cad711SPaolo Bonzini 	  info->insn_type = dis_branch;
245276cad711SPaolo Bonzini 	else
245376cad711SPaolo Bonzini 	  info->insn_type = dis_condbranch;
245476cad711SPaolo Bonzini 
245576cad711SPaolo Bonzini 	target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset;
245676cad711SPaolo Bonzini 	info->target = target;
245776cad711SPaolo Bonzini 	*tp = 0;
245876cad711SPaolo Bonzini 	tp = temp;
245976cad711SPaolo Bonzini 	(*info->fprintf_func) (info->stream, "%s", temp);
246076cad711SPaolo Bonzini 	(*info->print_address_func) (target, info);
246176cad711SPaolo Bonzini       }
246276cad711SPaolo Bonzini       break;
246376cad711SPaolo Bonzini 
246476cad711SPaolo Bonzini     case 'Q':
246576cad711SPaolo Bonzini     case 'O':
246676cad711SPaolo Bonzini       {
246776cad711SPaolo Bonzini 	long number = buffer[0];
246876cad711SPaolo Bonzini 
246976cad711SPaolo Bonzini 	if (number > 127)
247076cad711SPaolo Bonzini 	  number = number - 256;
247176cad711SPaolo Bonzini 
2472*2037a739SPhilippe Mathieu-Daudé 	tp = FORMAT_DEC (number, tp, 1);
247376cad711SPaolo Bonzini 	*tp++ = ',';
247476cad711SPaolo Bonzini 	tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix);
247576cad711SPaolo Bonzini       }
247676cad711SPaolo Bonzini       break;
247776cad711SPaolo Bonzini 
247876cad711SPaolo Bonzini     case 'f':
247976cad711SPaolo Bonzini       tp = print_flags (disdata, insn, tp);
248076cad711SPaolo Bonzini       break;
248176cad711SPaolo Bonzini 
248276cad711SPaolo Bonzini     case 'i':
2483*2037a739SPhilippe Mathieu-Daudé       tp = FORMAT_DEC ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1);
248476cad711SPaolo Bonzini       break;
248576cad711SPaolo Bonzini 
248676cad711SPaolo Bonzini     case 'P':
248776cad711SPaolo Bonzini       {
248876cad711SPaolo Bonzini 	const struct cris_spec_reg *sregp
248976cad711SPaolo Bonzini 	  = spec_reg_info ((insn >> 12) & 15, disdata->distype);
249076cad711SPaolo Bonzini 
2491e1107884SPeter Maydell 	if (sregp == NULL || sregp->name == NULL)
2492c8667283SStefan Weil 	  /* Should have been caught as a non-match earlier.  */
249376cad711SPaolo Bonzini 	  *tp++ = '?';
249476cad711SPaolo Bonzini 	else
249576cad711SPaolo Bonzini 	  {
249676cad711SPaolo Bonzini 	    if (with_reg_prefix)
249776cad711SPaolo Bonzini 	      *tp++ = REGISTER_PREFIX_CHAR;
249876cad711SPaolo Bonzini 	    strcpy (tp, sregp->name);
249976cad711SPaolo Bonzini 	    tp += strlen (tp);
250076cad711SPaolo Bonzini 	  }
250176cad711SPaolo Bonzini       }
250276cad711SPaolo Bonzini       break;
250376cad711SPaolo Bonzini 
250476cad711SPaolo Bonzini     default:
250576cad711SPaolo Bonzini       strcpy (tp, "???");
250676cad711SPaolo Bonzini       tp += 3;
250776cad711SPaolo Bonzini     }
250876cad711SPaolo Bonzini   }
250976cad711SPaolo Bonzini 
251076cad711SPaolo Bonzini   *tp = 0;
251176cad711SPaolo Bonzini 
251276cad711SPaolo Bonzini   if (prefix_opcodep)
251376cad711SPaolo Bonzini     (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")",
251476cad711SPaolo Bonzini 			   prefix_opcodep->name, prefix_opcodep->args);
251576cad711SPaolo Bonzini 
251676cad711SPaolo Bonzini   (*info->fprintf_func) (info->stream, "%s", temp);
251776cad711SPaolo Bonzini 
251876cad711SPaolo Bonzini   /* Get info for matching case-tables, if we don't have any active.
251976cad711SPaolo Bonzini      We assume that the last constant seen is used; either in the insn
252076cad711SPaolo Bonzini      itself or in a "move.d const,rN, sub.d rN,rM"-like sequence.  */
252176cad711SPaolo Bonzini   if (TRACE_CASE && case_offset_counter == 0)
252276cad711SPaolo Bonzini     {
252376cad711SPaolo Bonzini       if (CONST_STRNEQ (opcodep->name, "sub"))
252476cad711SPaolo Bonzini 	case_offset = last_immediate;
252576cad711SPaolo Bonzini 
252676cad711SPaolo Bonzini       /* It could also be an "add", if there are negative case-values.  */
252776cad711SPaolo Bonzini       else if (CONST_STRNEQ (opcodep->name, "add"))
252876cad711SPaolo Bonzini 	/* The first case is the negated operand to the add.  */
252976cad711SPaolo Bonzini 	case_offset = -last_immediate;
253076cad711SPaolo Bonzini 
253176cad711SPaolo Bonzini       /* A bound insn will tell us the number of cases.  */
253276cad711SPaolo Bonzini       else if (CONST_STRNEQ (opcodep->name, "bound"))
253376cad711SPaolo Bonzini 	no_of_case_offsets = last_immediate + 1;
253476cad711SPaolo Bonzini 
253576cad711SPaolo Bonzini       /* A jump or jsr or branch breaks the chain of insns for a
253676cad711SPaolo Bonzini 	 case-table, so assume default first-case again.  */
253776cad711SPaolo Bonzini       else if (info->insn_type == dis_jsr
253876cad711SPaolo Bonzini 	       || info->insn_type == dis_branch
253976cad711SPaolo Bonzini 	       || info->insn_type == dis_condbranch)
254076cad711SPaolo Bonzini 	case_offset = 0;
254176cad711SPaolo Bonzini     }
254276cad711SPaolo Bonzini }
254376cad711SPaolo Bonzini 
254476cad711SPaolo Bonzini 
254576cad711SPaolo Bonzini /* Print the CRIS instruction at address memaddr on stream.  Returns
254676cad711SPaolo Bonzini    length of the instruction, in bytes.  Prefix register names with `$' if
254776cad711SPaolo Bonzini    WITH_REG_PREFIX.  */
254876cad711SPaolo Bonzini 
254976cad711SPaolo Bonzini static int
print_insn_cris_generic(bfd_vma memaddr,disassemble_info * info,bfd_boolean with_reg_prefix)255076cad711SPaolo Bonzini print_insn_cris_generic (bfd_vma memaddr,
255176cad711SPaolo Bonzini 			 disassemble_info *info,
255276cad711SPaolo Bonzini 			 bfd_boolean with_reg_prefix)
255376cad711SPaolo Bonzini {
255476cad711SPaolo Bonzini   int nbytes;
255576cad711SPaolo Bonzini   unsigned int insn;
255676cad711SPaolo Bonzini   const struct cris_opcode *matchedp;
255776cad711SPaolo Bonzini   int advance = 0;
255876cad711SPaolo Bonzini   struct cris_disasm_data *disdata
255976cad711SPaolo Bonzini     = (struct cris_disasm_data *) info->private_data;
256076cad711SPaolo Bonzini 
256176cad711SPaolo Bonzini   /* No instruction will be disassembled as longer than this number of
256276cad711SPaolo Bonzini      bytes; stacked prefixes will not be expanded.  */
256376cad711SPaolo Bonzini   unsigned char buffer[MAX_BYTES_PER_CRIS_INSN];
256476cad711SPaolo Bonzini   unsigned char *bufp;
256576cad711SPaolo Bonzini   int status = 0;
256676cad711SPaolo Bonzini   bfd_vma addr;
256776cad711SPaolo Bonzini 
256876cad711SPaolo Bonzini   /* There will be an "out of range" error after the last instruction.
256976cad711SPaolo Bonzini      Reading pairs of bytes in decreasing number, we hope that we will get
257076cad711SPaolo Bonzini      at least the amount that we will consume.
257176cad711SPaolo Bonzini 
257276cad711SPaolo Bonzini      If we can't get any data, or we do not get enough data, we print
257376cad711SPaolo Bonzini      the error message.  */
257476cad711SPaolo Bonzini 
257551d373cfSPeter Crosthwaite   nbytes = info->buffer_length ? info->buffer_length
257651d373cfSPeter Crosthwaite                                : MAX_BYTES_PER_CRIS_INSN;
257751d373cfSPeter Crosthwaite   nbytes = MIN(nbytes, MAX_BYTES_PER_CRIS_INSN);
257876cad711SPaolo Bonzini   status = (*info->read_memory_func) (memaddr, buffer, nbytes, info);
257976cad711SPaolo Bonzini 
258076cad711SPaolo Bonzini   /* If we did not get all we asked for, then clear the rest.
258176cad711SPaolo Bonzini      Hopefully this makes a reproducible result in case of errors.  */
258276cad711SPaolo Bonzini   if (nbytes != MAX_BYTES_PER_CRIS_INSN)
258376cad711SPaolo Bonzini     memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes);
258476cad711SPaolo Bonzini 
258576cad711SPaolo Bonzini   addr = memaddr;
258676cad711SPaolo Bonzini   bufp = buffer;
258776cad711SPaolo Bonzini 
258876cad711SPaolo Bonzini   /* Set some defaults for the insn info.  */
258976cad711SPaolo Bonzini   info->insn_info_valid = 1;
259076cad711SPaolo Bonzini   info->branch_delay_insns = 0;
259176cad711SPaolo Bonzini   info->data_size = 0;
259276cad711SPaolo Bonzini   info->insn_type = dis_nonbranch;
259376cad711SPaolo Bonzini   info->flags = 0;
259476cad711SPaolo Bonzini   info->target = 0;
259576cad711SPaolo Bonzini   info->target2 = 0;
259676cad711SPaolo Bonzini 
259776cad711SPaolo Bonzini   /* If we got any data, disassemble it.  */
259876cad711SPaolo Bonzini   if (nbytes != 0)
259976cad711SPaolo Bonzini     {
260076cad711SPaolo Bonzini       matchedp = NULL;
260176cad711SPaolo Bonzini 
260276cad711SPaolo Bonzini       insn = bufp[0] + bufp[1] * 256;
260376cad711SPaolo Bonzini 
260476cad711SPaolo Bonzini       /* If we're in a case-table, don't disassemble the offsets.  */
260576cad711SPaolo Bonzini       if (TRACE_CASE && case_offset_counter != 0)
260676cad711SPaolo Bonzini 	{
260776cad711SPaolo Bonzini 	  info->insn_type = dis_noninsn;
260876cad711SPaolo Bonzini 	  advance += 2;
260976cad711SPaolo Bonzini 
261076cad711SPaolo Bonzini 	  /* If to print data as offsets, then shortcut here.  */
261176cad711SPaolo Bonzini 	  (*info->fprintf_func) (info->stream, "case %ld%s: -> ",
261276cad711SPaolo Bonzini 				 case_offset + no_of_case_offsets
261376cad711SPaolo Bonzini 				 - case_offset_counter,
261476cad711SPaolo Bonzini 				 case_offset_counter == 1 ? "/default" :
261576cad711SPaolo Bonzini 				 "");
261676cad711SPaolo Bonzini 
261776cad711SPaolo Bonzini 	  (*info->print_address_func) ((bfd_vma)
261876cad711SPaolo Bonzini 				       ((short) (insn)
261976cad711SPaolo Bonzini 					+ (long) (addr
262076cad711SPaolo Bonzini 						  - (no_of_case_offsets
262176cad711SPaolo Bonzini 						     - case_offset_counter)
262276cad711SPaolo Bonzini 						  * 2)), info);
262376cad711SPaolo Bonzini 	  case_offset_counter--;
262476cad711SPaolo Bonzini 
262576cad711SPaolo Bonzini 	  /* The default case start (without a "sub" or "add") must be
262676cad711SPaolo Bonzini 	     zero.  */
262776cad711SPaolo Bonzini 	  if (case_offset_counter == 0)
262876cad711SPaolo Bonzini 	    case_offset = 0;
262976cad711SPaolo Bonzini 	}
263076cad711SPaolo Bonzini       else if (insn == 0)
263176cad711SPaolo Bonzini 	{
263276cad711SPaolo Bonzini 	  /* We're often called to disassemble zeroes.  While this is a
263376cad711SPaolo Bonzini 	     valid "bcc .+2" insn, it is also useless enough and enough
263476cad711SPaolo Bonzini 	     of a nuiscance that we will just output "bcc .+2" for it
263576cad711SPaolo Bonzini 	     and signal it as a noninsn.  */
263676cad711SPaolo Bonzini 	  (*info->fprintf_func) (info->stream,
263776cad711SPaolo Bonzini 				 disdata->distype == cris_dis_v32
263876cad711SPaolo Bonzini 				 ? "bcc ." : "bcc .+2");
263976cad711SPaolo Bonzini 	  info->insn_type = dis_noninsn;
264076cad711SPaolo Bonzini 	  advance += 2;
264176cad711SPaolo Bonzini 	}
264276cad711SPaolo Bonzini       else
264376cad711SPaolo Bonzini 	{
264476cad711SPaolo Bonzini 	  const struct cris_opcode *prefix_opcodep = NULL;
264576cad711SPaolo Bonzini 	  unsigned char *prefix_buffer = bufp;
264676cad711SPaolo Bonzini 	  unsigned int prefix_insn = insn;
264776cad711SPaolo Bonzini 	  int prefix_size = 0;
264876cad711SPaolo Bonzini 
264976cad711SPaolo Bonzini 	  matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata);
265076cad711SPaolo Bonzini 
265176cad711SPaolo Bonzini 	  /* Check if we're supposed to write out prefixes as address
265276cad711SPaolo Bonzini 	     modes and if this was a prefix.  */
265376cad711SPaolo Bonzini 	  if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p')
265476cad711SPaolo Bonzini 	    {
265576cad711SPaolo Bonzini 	      /* If it's a prefix, put it into the prefix vars and get the
265676cad711SPaolo Bonzini 		 main insn.  */
265776cad711SPaolo Bonzini 	      prefix_size = bytes_to_skip (prefix_insn, matchedp,
265876cad711SPaolo Bonzini 					   disdata->distype, NULL);
265976cad711SPaolo Bonzini 	      prefix_opcodep = matchedp;
266076cad711SPaolo Bonzini 
266176cad711SPaolo Bonzini 	      insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256;
266276cad711SPaolo Bonzini 	      matchedp = get_opcode_entry (insn, prefix_insn, disdata);
266376cad711SPaolo Bonzini 
266476cad711SPaolo Bonzini 	      if (matchedp != NULL)
266576cad711SPaolo Bonzini 		{
266676cad711SPaolo Bonzini 		  addr += prefix_size;
266776cad711SPaolo Bonzini 		  bufp += prefix_size;
266876cad711SPaolo Bonzini 		  advance += prefix_size;
266976cad711SPaolo Bonzini 		}
267076cad711SPaolo Bonzini 	      else
267176cad711SPaolo Bonzini 		{
267276cad711SPaolo Bonzini 		  /* The "main" insn wasn't valid, at least not when
267376cad711SPaolo Bonzini 		     prefixed.  Put back things enough to output the
267476cad711SPaolo Bonzini 		     prefix insn only, as a normal insn.  */
267576cad711SPaolo Bonzini 		  matchedp = prefix_opcodep;
267676cad711SPaolo Bonzini 		  insn = prefix_insn;
267776cad711SPaolo Bonzini 		  prefix_opcodep = NULL;
267876cad711SPaolo Bonzini 		}
267976cad711SPaolo Bonzini 	    }
268076cad711SPaolo Bonzini 
268176cad711SPaolo Bonzini 	  if (matchedp == NULL)
268276cad711SPaolo Bonzini 	    {
268376cad711SPaolo Bonzini 	      (*info->fprintf_func) (info->stream, "??0x%x", insn);
268476cad711SPaolo Bonzini 	      advance += 2;
268576cad711SPaolo Bonzini 
268676cad711SPaolo Bonzini 	      info->insn_type = dis_noninsn;
268776cad711SPaolo Bonzini 	    }
268876cad711SPaolo Bonzini 	  else
268976cad711SPaolo Bonzini 	    {
269076cad711SPaolo Bonzini 	      advance
269176cad711SPaolo Bonzini 		+= bytes_to_skip (insn, matchedp, disdata->distype,
269276cad711SPaolo Bonzini 				  prefix_opcodep);
269376cad711SPaolo Bonzini 
269476cad711SPaolo Bonzini 	      /* The info_type and assorted fields will be set according
269576cad711SPaolo Bonzini 		 to the operands.   */
269676cad711SPaolo Bonzini 	      print_with_operands (matchedp, insn, bufp, addr, info,
269776cad711SPaolo Bonzini 				   prefix_opcodep, prefix_insn,
269876cad711SPaolo Bonzini 				   prefix_buffer, with_reg_prefix);
269976cad711SPaolo Bonzini 	    }
270076cad711SPaolo Bonzini 	}
270176cad711SPaolo Bonzini     }
270276cad711SPaolo Bonzini   else
270376cad711SPaolo Bonzini     info->insn_type = dis_noninsn;
270476cad711SPaolo Bonzini 
270576cad711SPaolo Bonzini   /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error
270676cad711SPaolo Bonzini      status when reading that much, and the insn decoding indicated a
270776cad711SPaolo Bonzini      length exceeding what we read, there is an error.  */
270876cad711SPaolo Bonzini   if (status != 0 && (nbytes == 0 || advance > nbytes))
270976cad711SPaolo Bonzini     {
271076cad711SPaolo Bonzini       (*info->memory_error_func) (status, memaddr, info);
271176cad711SPaolo Bonzini       return -1;
271276cad711SPaolo Bonzini     }
271376cad711SPaolo Bonzini 
271476cad711SPaolo Bonzini   /* Max supported insn size with one folded prefix insn.  */
271576cad711SPaolo Bonzini   info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN;
271676cad711SPaolo Bonzini 
271776cad711SPaolo Bonzini   /* I would like to set this to a fixed value larger than the actual
271876cad711SPaolo Bonzini      number of bytes to print in order to avoid spaces between bytes,
271976cad711SPaolo Bonzini      but objdump.c (2.9.1) does not like that, so we print 16-bit
272076cad711SPaolo Bonzini      chunks, which is the next choice.  */
272176cad711SPaolo Bonzini   info->bytes_per_chunk = 2;
272276cad711SPaolo Bonzini 
272376cad711SPaolo Bonzini   /* Printing bytes in order of increasing addresses makes sense,
272476cad711SPaolo Bonzini      especially on a little-endian target.
272576cad711SPaolo Bonzini      This is completely the opposite of what you think; setting this to
272676cad711SPaolo Bonzini      BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N
272776cad711SPaolo Bonzini      we want.  */
272876cad711SPaolo Bonzini   info->display_endian = BFD_ENDIAN_BIG;
272976cad711SPaolo Bonzini 
273076cad711SPaolo Bonzini   return advance;
273176cad711SPaolo Bonzini }
273276cad711SPaolo Bonzini 
273376cad711SPaolo Bonzini /* Disassemble, prefixing register names with `$'.  CRIS v0..v10.  */
273476cad711SPaolo Bonzini static int
print_insn_cris_with_register_prefix(bfd_vma vma,disassemble_info * info)273576cad711SPaolo Bonzini print_insn_cris_with_register_prefix (bfd_vma vma,
273676cad711SPaolo Bonzini 				      disassemble_info *info)
273776cad711SPaolo Bonzini {
27389739b11aSPaolo Bonzini   struct cris_disasm_data disdata;
27399739b11aSPaolo Bonzini   info->private_data = &disdata;
27409739b11aSPaolo Bonzini   cris_parse_disassembler_options (&disdata, info->disassembler_options,
27419739b11aSPaolo Bonzini 				   cris_dis_v0_v10);
274276cad711SPaolo Bonzini   return print_insn_cris_generic (vma, info, true);
274376cad711SPaolo Bonzini }
274476cad711SPaolo Bonzini /* Disassemble, prefixing register names with `$'.  CRIS v32.  */
274576cad711SPaolo Bonzini 
274676cad711SPaolo Bonzini static int
print_insn_crisv32_with_register_prefix(bfd_vma vma,disassemble_info * info)274776cad711SPaolo Bonzini print_insn_crisv32_with_register_prefix (bfd_vma vma,
274876cad711SPaolo Bonzini 					 disassemble_info *info)
274976cad711SPaolo Bonzini {
27509739b11aSPaolo Bonzini   struct cris_disasm_data disdata;
27519739b11aSPaolo Bonzini   info->private_data = &disdata;
27529739b11aSPaolo Bonzini   cris_parse_disassembler_options (&disdata, info->disassembler_options,
27539739b11aSPaolo Bonzini 				   cris_dis_v32);
275476cad711SPaolo Bonzini   return print_insn_cris_generic (vma, info, true);
275576cad711SPaolo Bonzini }
275676cad711SPaolo Bonzini 
275776cad711SPaolo Bonzini #if 0
275876cad711SPaolo Bonzini /* Disassemble, prefixing register names with `$'.
275976cad711SPaolo Bonzini    Common v10 and v32 subset.  */
276076cad711SPaolo Bonzini 
276176cad711SPaolo Bonzini static int
276276cad711SPaolo Bonzini print_insn_crisv10_v32_with_register_prefix (bfd_vma vma,
276376cad711SPaolo Bonzini 					     disassemble_info *info)
276476cad711SPaolo Bonzini {
27659739b11aSPaolo Bonzini   struct cris_disasm_data disdata;
27669739b11aSPaolo Bonzini   info->private_data = &disdata;
27679739b11aSPaolo Bonzini   cris_parse_disassembler_options (&disdata, info->disassembler_options,
27689739b11aSPaolo Bonzini 				   cris_dis_common_v10_v32);
276976cad711SPaolo Bonzini   return print_insn_cris_generic (vma, info, true);
277076cad711SPaolo Bonzini }
277176cad711SPaolo Bonzini 
277276cad711SPaolo Bonzini /* Disassemble, no prefixes on register names.  CRIS v0..v10.  */
277376cad711SPaolo Bonzini 
277476cad711SPaolo Bonzini static int
277576cad711SPaolo Bonzini print_insn_cris_without_register_prefix (bfd_vma vma,
277676cad711SPaolo Bonzini 					 disassemble_info *info)
277776cad711SPaolo Bonzini {
27789739b11aSPaolo Bonzini   struct cris_disasm_data disdata;
27799739b11aSPaolo Bonzini   info->private_data = &disdata;
27809739b11aSPaolo Bonzini   cris_parse_disassembler_options (&disdata, info->disassembler_options,
27819739b11aSPaolo Bonzini 				   cris_dis_v0_v10);
278276cad711SPaolo Bonzini   return print_insn_cris_generic (vma, info, false);
278376cad711SPaolo Bonzini }
278476cad711SPaolo Bonzini 
278576cad711SPaolo Bonzini /* Disassemble, no prefixes on register names.  CRIS v32.  */
278676cad711SPaolo Bonzini 
278776cad711SPaolo Bonzini static int
278876cad711SPaolo Bonzini print_insn_crisv32_without_register_prefix (bfd_vma vma,
278976cad711SPaolo Bonzini 					    disassemble_info *info)
279076cad711SPaolo Bonzini {
27919739b11aSPaolo Bonzini   struct cris_disasm_data disdata;
27929739b11aSPaolo Bonzini   info->private_data = &disdata;
27939739b11aSPaolo Bonzini   cris_parse_disassembler_options (&disdata, info->disassembler_options,
27949739b11aSPaolo Bonzini 				   cris_dis_v32);
279576cad711SPaolo Bonzini   return print_insn_cris_generic (vma, info, false);
279676cad711SPaolo Bonzini }
279776cad711SPaolo Bonzini 
279876cad711SPaolo Bonzini /* Disassemble, no prefixes on register names.
279976cad711SPaolo Bonzini    Common v10 and v32 subset.  */
280076cad711SPaolo Bonzini 
280176cad711SPaolo Bonzini static int
280276cad711SPaolo Bonzini print_insn_crisv10_v32_without_register_prefix (bfd_vma vma,
280376cad711SPaolo Bonzini 						disassemble_info *info)
280476cad711SPaolo Bonzini {
28059739b11aSPaolo Bonzini   struct cris_disasm_data disdata;
28069739b11aSPaolo Bonzini   info->private_data = &disdata;
28079739b11aSPaolo Bonzini   cris_parse_disassembler_options (&disdata, info->disassembler_options,
28089739b11aSPaolo Bonzini 				   cris_dis_common_v10_v32);
280976cad711SPaolo Bonzini   return print_insn_cris_generic (vma, info, false);
281076cad711SPaolo Bonzini }
281176cad711SPaolo Bonzini #endif
281276cad711SPaolo Bonzini 
281376cad711SPaolo Bonzini int
print_insn_crisv10(bfd_vma vma,disassemble_info * info)281476cad711SPaolo Bonzini print_insn_crisv10 (bfd_vma vma,
281576cad711SPaolo Bonzini 		    disassemble_info *info)
281676cad711SPaolo Bonzini {
281776cad711SPaolo Bonzini   return print_insn_cris_with_register_prefix(vma, info);
281876cad711SPaolo Bonzini }
281976cad711SPaolo Bonzini 
282076cad711SPaolo Bonzini int
print_insn_crisv32(bfd_vma vma,disassemble_info * info)282176cad711SPaolo Bonzini print_insn_crisv32 (bfd_vma vma,
282276cad711SPaolo Bonzini 		    disassemble_info *info)
282376cad711SPaolo Bonzini {
282476cad711SPaolo Bonzini   return print_insn_crisv32_with_register_prefix(vma, info);
282576cad711SPaolo Bonzini }
282676cad711SPaolo Bonzini 
282776cad711SPaolo Bonzini /* Return a disassembler-function that prints registers with a `$' prefix,
282876cad711SPaolo Bonzini    or one that prints registers without a prefix.
282976cad711SPaolo Bonzini    FIXME: We should improve the solution to avoid the multitude of
283076cad711SPaolo Bonzini    functions seen above.  */
283176cad711SPaolo Bonzini #if 0
283276cad711SPaolo Bonzini disassembler_ftype
283376cad711SPaolo Bonzini cris_get_disassembler (bfd *abfd)
283476cad711SPaolo Bonzini {
283576cad711SPaolo Bonzini   /* If there's no bfd in sight, we return what is valid as input in all
283676cad711SPaolo Bonzini      contexts if fed back to the assembler: disassembly *with* register
283776cad711SPaolo Bonzini      prefix.  Unfortunately this will be totally wrong for v32.  */
283876cad711SPaolo Bonzini   if (abfd == NULL)
283976cad711SPaolo Bonzini     return print_insn_cris_with_register_prefix;
284076cad711SPaolo Bonzini 
284176cad711SPaolo Bonzini   if (bfd_get_symbol_leading_char (abfd) == 0)
284276cad711SPaolo Bonzini     {
284376cad711SPaolo Bonzini       if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
284476cad711SPaolo Bonzini 	return print_insn_crisv32_with_register_prefix;
284576cad711SPaolo Bonzini       if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
284676cad711SPaolo Bonzini 	return print_insn_crisv10_v32_with_register_prefix;
284776cad711SPaolo Bonzini 
284876cad711SPaolo Bonzini       /* We default to v10.  This may be specifically specified in the
284976cad711SPaolo Bonzini 	 bfd mach, but is also the default setting.  */
285076cad711SPaolo Bonzini       return print_insn_cris_with_register_prefix;
285176cad711SPaolo Bonzini     }
285276cad711SPaolo Bonzini 
285376cad711SPaolo Bonzini   if (bfd_get_mach (abfd) == bfd_mach_cris_v32)
285476cad711SPaolo Bonzini     return print_insn_crisv32_without_register_prefix;
285576cad711SPaolo Bonzini   if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32)
285676cad711SPaolo Bonzini     return print_insn_crisv10_v32_without_register_prefix;
285776cad711SPaolo Bonzini   return print_insn_cris_without_register_prefix;
285876cad711SPaolo Bonzini }
285976cad711SPaolo Bonzini #endif
286076cad711SPaolo Bonzini /* Local variables:
286176cad711SPaolo Bonzini    eval: (c-set-style "gnu")
286276cad711SPaolo Bonzini    indent-tabs-mode: t
286376cad711SPaolo Bonzini    End:  */
2864