176cad711SPaolo Bonzini /* Disassemble SH instructions.
276cad711SPaolo Bonzini Copyright 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2003, 2004
376cad711SPaolo Bonzini Free Software Foundation, Inc.
476cad711SPaolo Bonzini
576cad711SPaolo Bonzini This program is free software; you can redistribute it and/or modify
676cad711SPaolo Bonzini it under the terms of the GNU General Public License as published by
776cad711SPaolo Bonzini the Free Software Foundation; either version 2 of the License, or
876cad711SPaolo Bonzini (at your option) any later version.
976cad711SPaolo Bonzini
1076cad711SPaolo Bonzini This program is distributed in the hope that it will be useful,
1176cad711SPaolo Bonzini but WITHOUT ANY WARRANTY; without even the implied warranty of
1276cad711SPaolo Bonzini MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1376cad711SPaolo Bonzini GNU General Public License for more details.
1476cad711SPaolo Bonzini
1576cad711SPaolo Bonzini You should have received a copy of the GNU General Public License
1676cad711SPaolo Bonzini along with this program; if not, see <http://www.gnu.org/licenses/>. */
1776cad711SPaolo Bonzini
189d4c9946SPeter Maydell #include "qemu/osdep.h"
193979fca4SMarkus Armbruster #include "disas/dis-asm.h"
2076cad711SPaolo Bonzini
2176cad711SPaolo Bonzini #define DEFINE_TABLE
2276cad711SPaolo Bonzini
2376cad711SPaolo Bonzini typedef enum
2476cad711SPaolo Bonzini {
2576cad711SPaolo Bonzini HEX_0,
2676cad711SPaolo Bonzini HEX_1,
2776cad711SPaolo Bonzini HEX_2,
2876cad711SPaolo Bonzini HEX_3,
2976cad711SPaolo Bonzini HEX_4,
3076cad711SPaolo Bonzini HEX_5,
3176cad711SPaolo Bonzini HEX_6,
3276cad711SPaolo Bonzini HEX_7,
3376cad711SPaolo Bonzini HEX_8,
3476cad711SPaolo Bonzini HEX_9,
3576cad711SPaolo Bonzini HEX_A,
3676cad711SPaolo Bonzini HEX_B,
3776cad711SPaolo Bonzini HEX_C,
3876cad711SPaolo Bonzini HEX_D,
3976cad711SPaolo Bonzini HEX_E,
4076cad711SPaolo Bonzini HEX_F,
4176cad711SPaolo Bonzini HEX_XX00,
4276cad711SPaolo Bonzini HEX_00YY,
4376cad711SPaolo Bonzini REG_N,
4476cad711SPaolo Bonzini REG_N_D, /* nnn0 */
4576cad711SPaolo Bonzini REG_N_B01, /* nn01 */
4676cad711SPaolo Bonzini REG_M,
4776cad711SPaolo Bonzini SDT_REG_N,
4876cad711SPaolo Bonzini REG_NM,
4976cad711SPaolo Bonzini REG_B,
5076cad711SPaolo Bonzini BRANCH_12,
5176cad711SPaolo Bonzini BRANCH_8,
5276cad711SPaolo Bonzini IMM0_4,
5376cad711SPaolo Bonzini IMM0_4BY2,
5476cad711SPaolo Bonzini IMM0_4BY4,
5576cad711SPaolo Bonzini IMM1_4,
5676cad711SPaolo Bonzini IMM1_4BY2,
5776cad711SPaolo Bonzini IMM1_4BY4,
5876cad711SPaolo Bonzini PCRELIMM_8BY2,
5976cad711SPaolo Bonzini PCRELIMM_8BY4,
6076cad711SPaolo Bonzini IMM0_8,
6176cad711SPaolo Bonzini IMM0_8BY2,
6276cad711SPaolo Bonzini IMM0_8BY4,
6376cad711SPaolo Bonzini IMM1_8,
6476cad711SPaolo Bonzini IMM1_8BY2,
6576cad711SPaolo Bonzini IMM1_8BY4,
6676cad711SPaolo Bonzini PPI,
6776cad711SPaolo Bonzini NOPX,
6876cad711SPaolo Bonzini NOPY,
6976cad711SPaolo Bonzini MOVX,
7076cad711SPaolo Bonzini MOVY,
7176cad711SPaolo Bonzini MOVX_NOPY,
7276cad711SPaolo Bonzini MOVY_NOPX,
7376cad711SPaolo Bonzini PSH,
7476cad711SPaolo Bonzini PMUL,
7576cad711SPaolo Bonzini PPI3,
7676cad711SPaolo Bonzini PPI3NC,
7776cad711SPaolo Bonzini PDC,
7876cad711SPaolo Bonzini PPIC,
7976cad711SPaolo Bonzini REPEAT,
8076cad711SPaolo Bonzini IMM0_3c, /* xxxx 0iii */
8176cad711SPaolo Bonzini IMM0_3s, /* xxxx 1iii */
8276cad711SPaolo Bonzini IMM0_3Uc, /* 0iii xxxx */
8376cad711SPaolo Bonzini IMM0_3Us, /* 1iii xxxx */
8476cad711SPaolo Bonzini IMM0_20_4,
8576cad711SPaolo Bonzini IMM0_20, /* follows IMM0_20_4 */
8676cad711SPaolo Bonzini IMM0_20BY8, /* follows IMM0_20_4 */
8776cad711SPaolo Bonzini DISP0_12,
8876cad711SPaolo Bonzini DISP0_12BY2,
8976cad711SPaolo Bonzini DISP0_12BY4,
9076cad711SPaolo Bonzini DISP0_12BY8,
9176cad711SPaolo Bonzini DISP1_12,
9276cad711SPaolo Bonzini DISP1_12BY2,
9376cad711SPaolo Bonzini DISP1_12BY4,
9476cad711SPaolo Bonzini DISP1_12BY8
9576cad711SPaolo Bonzini }
9676cad711SPaolo Bonzini sh_nibble_type;
9776cad711SPaolo Bonzini
9876cad711SPaolo Bonzini typedef enum
9976cad711SPaolo Bonzini {
10076cad711SPaolo Bonzini A_END,
10176cad711SPaolo Bonzini A_BDISP12,
10276cad711SPaolo Bonzini A_BDISP8,
10376cad711SPaolo Bonzini A_DEC_M,
10476cad711SPaolo Bonzini A_DEC_N,
10576cad711SPaolo Bonzini A_DISP_GBR,
10676cad711SPaolo Bonzini A_PC,
10776cad711SPaolo Bonzini A_DISP_PC,
10876cad711SPaolo Bonzini A_DISP_PC_ABS,
10976cad711SPaolo Bonzini A_DISP_REG_M,
11076cad711SPaolo Bonzini A_DISP_REG_N,
11176cad711SPaolo Bonzini A_GBR,
11276cad711SPaolo Bonzini A_IMM,
11376cad711SPaolo Bonzini A_INC_M,
11476cad711SPaolo Bonzini A_INC_N,
11576cad711SPaolo Bonzini A_IND_M,
11676cad711SPaolo Bonzini A_IND_N,
11776cad711SPaolo Bonzini A_IND_R0_REG_M,
11876cad711SPaolo Bonzini A_IND_R0_REG_N,
11976cad711SPaolo Bonzini A_MACH,
12076cad711SPaolo Bonzini A_MACL,
12176cad711SPaolo Bonzini A_PR,
12276cad711SPaolo Bonzini A_R0,
12376cad711SPaolo Bonzini A_R0_GBR,
12476cad711SPaolo Bonzini A_REG_M,
12576cad711SPaolo Bonzini A_REG_N,
12676cad711SPaolo Bonzini A_REG_B,
12776cad711SPaolo Bonzini A_SR,
12876cad711SPaolo Bonzini A_VBR,
12976cad711SPaolo Bonzini A_TBR,
13076cad711SPaolo Bonzini A_DISP_TBR,
13176cad711SPaolo Bonzini A_DISP2_TBR,
13276cad711SPaolo Bonzini A_DEC_R15,
13376cad711SPaolo Bonzini A_INC_R15,
13476cad711SPaolo Bonzini A_MOD,
13576cad711SPaolo Bonzini A_RE,
13676cad711SPaolo Bonzini A_RS,
13776cad711SPaolo Bonzini A_DSR,
13876cad711SPaolo Bonzini DSP_REG_M,
13976cad711SPaolo Bonzini DSP_REG_N,
14076cad711SPaolo Bonzini DSP_REG_X,
14176cad711SPaolo Bonzini DSP_REG_Y,
14276cad711SPaolo Bonzini DSP_REG_E,
14376cad711SPaolo Bonzini DSP_REG_F,
14476cad711SPaolo Bonzini DSP_REG_G,
14576cad711SPaolo Bonzini DSP_REG_A_M,
14676cad711SPaolo Bonzini DSP_REG_AX,
14776cad711SPaolo Bonzini DSP_REG_XY,
14876cad711SPaolo Bonzini DSP_REG_AY,
14976cad711SPaolo Bonzini DSP_REG_YX,
15076cad711SPaolo Bonzini AX_INC_N,
15176cad711SPaolo Bonzini AY_INC_N,
15276cad711SPaolo Bonzini AXY_INC_N,
15376cad711SPaolo Bonzini AYX_INC_N,
15476cad711SPaolo Bonzini AX_IND_N,
15576cad711SPaolo Bonzini AY_IND_N,
15676cad711SPaolo Bonzini AXY_IND_N,
15776cad711SPaolo Bonzini AYX_IND_N,
15876cad711SPaolo Bonzini AX_PMOD_N,
15976cad711SPaolo Bonzini AXY_PMOD_N,
16076cad711SPaolo Bonzini AY_PMOD_N,
16176cad711SPaolo Bonzini AYX_PMOD_N,
16276cad711SPaolo Bonzini AS_DEC_N,
16376cad711SPaolo Bonzini AS_INC_N,
16476cad711SPaolo Bonzini AS_IND_N,
16576cad711SPaolo Bonzini AS_PMOD_N,
16676cad711SPaolo Bonzini A_A0,
16776cad711SPaolo Bonzini A_X0,
16876cad711SPaolo Bonzini A_X1,
16976cad711SPaolo Bonzini A_Y0,
17076cad711SPaolo Bonzini A_Y1,
17176cad711SPaolo Bonzini A_SSR,
17276cad711SPaolo Bonzini A_SPC,
17376cad711SPaolo Bonzini A_SGR,
17476cad711SPaolo Bonzini A_DBR,
17576cad711SPaolo Bonzini F_REG_N,
17676cad711SPaolo Bonzini F_REG_M,
17776cad711SPaolo Bonzini D_REG_N,
17876cad711SPaolo Bonzini D_REG_M,
17976cad711SPaolo Bonzini X_REG_N, /* Only used for argument parsing. */
18076cad711SPaolo Bonzini X_REG_M, /* Only used for argument parsing. */
18176cad711SPaolo Bonzini DX_REG_N,
18276cad711SPaolo Bonzini DX_REG_M,
18376cad711SPaolo Bonzini V_REG_N,
18476cad711SPaolo Bonzini V_REG_M,
18576cad711SPaolo Bonzini XMTRX_M4,
18676cad711SPaolo Bonzini F_FR0,
18776cad711SPaolo Bonzini FPUL_N,
18876cad711SPaolo Bonzini FPUL_M,
18976cad711SPaolo Bonzini FPSCR_N,
19076cad711SPaolo Bonzini FPSCR_M
19176cad711SPaolo Bonzini }
19276cad711SPaolo Bonzini sh_arg_type;
19376cad711SPaolo Bonzini
19476cad711SPaolo Bonzini typedef enum
19576cad711SPaolo Bonzini {
19676cad711SPaolo Bonzini A_A1_NUM = 5,
19776cad711SPaolo Bonzini A_A0_NUM = 7,
19876cad711SPaolo Bonzini A_X0_NUM, A_X1_NUM, A_Y0_NUM, A_Y1_NUM,
19976cad711SPaolo Bonzini A_M0_NUM, A_A1G_NUM, A_M1_NUM, A_A0G_NUM
20076cad711SPaolo Bonzini }
20176cad711SPaolo Bonzini sh_dsp_reg_nums;
20276cad711SPaolo Bonzini
20376cad711SPaolo Bonzini #define arch_sh1_base 0x0001
20476cad711SPaolo Bonzini #define arch_sh2_base 0x0002
20576cad711SPaolo Bonzini #define arch_sh3_base 0x0004
20676cad711SPaolo Bonzini #define arch_sh4_base 0x0008
20776cad711SPaolo Bonzini #define arch_sh4a_base 0x0010
20876cad711SPaolo Bonzini #define arch_sh2a_base 0x0020
20976cad711SPaolo Bonzini
21076cad711SPaolo Bonzini /* This is an annotation on instruction types, but we abuse the arch
21176cad711SPaolo Bonzini field in instructions to denote it. */
21276cad711SPaolo Bonzini #define arch_op32 0x00100000 /* This is a 32-bit opcode. */
21376cad711SPaolo Bonzini
21476cad711SPaolo Bonzini #define arch_sh_no_mmu 0x04000000
21576cad711SPaolo Bonzini #define arch_sh_has_mmu 0x08000000
21676cad711SPaolo Bonzini #define arch_sh_no_co 0x10000000 /* neither FPU nor DSP co-processor */
21776cad711SPaolo Bonzini #define arch_sh_sp_fpu 0x20000000 /* single precision FPU */
21876cad711SPaolo Bonzini #define arch_sh_dp_fpu 0x40000000 /* double precision FPU */
21976cad711SPaolo Bonzini #define arch_sh_has_dsp 0x80000000
22076cad711SPaolo Bonzini
22176cad711SPaolo Bonzini
22276cad711SPaolo Bonzini #define arch_sh_base_mask 0x0000003f
22376cad711SPaolo Bonzini #define arch_opann_mask 0x00100000
22476cad711SPaolo Bonzini #define arch_sh_mmu_mask 0x0c000000
22576cad711SPaolo Bonzini #define arch_sh_co_mask 0xf0000000
22676cad711SPaolo Bonzini
22776cad711SPaolo Bonzini
22876cad711SPaolo Bonzini #define arch_sh1 (arch_sh1_base|arch_sh_no_mmu|arch_sh_no_co)
22976cad711SPaolo Bonzini #define arch_sh2 (arch_sh2_base|arch_sh_no_mmu|arch_sh_no_co)
23076cad711SPaolo Bonzini #define arch_sh2a (arch_sh2a_base|arch_sh_no_mmu|arch_sh_dp_fpu)
23176cad711SPaolo Bonzini #define arch_sh2a_nofpu (arch_sh2a_base|arch_sh_no_mmu|arch_sh_no_co)
23276cad711SPaolo Bonzini #define arch_sh2e (arch_sh2_base|arch_sh2a_base|arch_sh_no_mmu|arch_sh_sp_fpu)
23376cad711SPaolo Bonzini #define arch_sh_dsp (arch_sh2_base|arch_sh_no_mmu|arch_sh_has_dsp)
23476cad711SPaolo Bonzini #define arch_sh3_nommu (arch_sh3_base|arch_sh_no_mmu|arch_sh_no_co)
23576cad711SPaolo Bonzini #define arch_sh3 (arch_sh3_base|arch_sh_has_mmu|arch_sh_no_co)
23676cad711SPaolo Bonzini #define arch_sh3e (arch_sh3_base|arch_sh_has_mmu|arch_sh_sp_fpu)
23776cad711SPaolo Bonzini #define arch_sh3_dsp (arch_sh3_base|arch_sh_has_mmu|arch_sh_has_dsp)
23876cad711SPaolo Bonzini #define arch_sh4 (arch_sh4_base|arch_sh_has_mmu|arch_sh_dp_fpu)
23976cad711SPaolo Bonzini #define arch_sh4a (arch_sh4a_base|arch_sh_has_mmu|arch_sh_dp_fpu)
24076cad711SPaolo Bonzini #define arch_sh4al_dsp (arch_sh4a_base|arch_sh_has_mmu|arch_sh_has_dsp)
24176cad711SPaolo Bonzini #define arch_sh4_nofpu (arch_sh4_base|arch_sh_has_mmu|arch_sh_no_co)
24276cad711SPaolo Bonzini #define arch_sh4a_nofpu (arch_sh4a_base|arch_sh_has_mmu|arch_sh_no_co)
24376cad711SPaolo Bonzini #define arch_sh4_nommu_nofpu (arch_sh4_base|arch_sh_no_mmu|arch_sh_no_co)
24476cad711SPaolo Bonzini
24576cad711SPaolo Bonzini #define SH_MERGE_ARCH_SET(SET1, SET2) ((SET1) & (SET2))
24676cad711SPaolo Bonzini #define SH_VALID_BASE_ARCH_SET(SET) (((SET) & arch_sh_base_mask) != 0)
24776cad711SPaolo Bonzini #define SH_VALID_MMU_ARCH_SET(SET) (((SET) & arch_sh_mmu_mask) != 0)
24876cad711SPaolo Bonzini #define SH_VALID_CO_ARCH_SET(SET) (((SET) & arch_sh_co_mask) != 0)
24976cad711SPaolo Bonzini #define SH_VALID_ARCH_SET(SET) \
25076cad711SPaolo Bonzini (SH_VALID_BASE_ARCH_SET (SET) \
25176cad711SPaolo Bonzini && SH_VALID_MMU_ARCH_SET (SET) \
25276cad711SPaolo Bonzini && SH_VALID_CO_ARCH_SET (SET))
25376cad711SPaolo Bonzini #define SH_MERGE_ARCH_SET_VALID(SET1, SET2) \
25476cad711SPaolo Bonzini SH_VALID_ARCH_SET (SH_MERGE_ARCH_SET (SET1, SET2))
25576cad711SPaolo Bonzini
25676cad711SPaolo Bonzini #define SH_ARCH_SET_HAS_FPU(SET) \
25776cad711SPaolo Bonzini (((SET) & (arch_sh_sp_fpu | arch_sh_dp_fpu)) != 0)
25876cad711SPaolo Bonzini #define SH_ARCH_SET_HAS_DSP(SET) \
25976cad711SPaolo Bonzini (((SET) & arch_sh_has_dsp) != 0)
26076cad711SPaolo Bonzini
26176cad711SPaolo Bonzini /* This is returned from the functions below when an error occurs
26276cad711SPaolo Bonzini (in addition to a call to BFD_FAIL). The value should allow
26376cad711SPaolo Bonzini the tools to continue to function in most cases - there may
26476cad711SPaolo Bonzini be some confusion between DSP and FPU etc. */
26576cad711SPaolo Bonzini #define SH_ARCH_UNKNOWN_ARCH 0xffffffff
26676cad711SPaolo Bonzini
26776cad711SPaolo Bonzini /* Below are the 'architecture sets'.
26876cad711SPaolo Bonzini They describe the following inheritance graph:
26976cad711SPaolo Bonzini
27076cad711SPaolo Bonzini SH1
27176cad711SPaolo Bonzini |
27276cad711SPaolo Bonzini SH2
27376cad711SPaolo Bonzini .------------'|`--------------------.
27476cad711SPaolo Bonzini / | \
27576cad711SPaolo Bonzini SH-DSP SH3-nommu SH2E
27676cad711SPaolo Bonzini | |`--------. |
27776cad711SPaolo Bonzini | | \ |
27876cad711SPaolo Bonzini | SH3 SH4-nommu-nofpu |
27976cad711SPaolo Bonzini | | | |
28076cad711SPaolo Bonzini | .------------'|`----------+---------. |
28176cad711SPaolo Bonzini |/ / \|
28276cad711SPaolo Bonzini | | .-------' |
28376cad711SPaolo Bonzini | |/ |
28476cad711SPaolo Bonzini SH3-dsp SH4-nofpu SH3E
28576cad711SPaolo Bonzini | |`--------------------. |
28676cad711SPaolo Bonzini | | \|
28776cad711SPaolo Bonzini | SH4A-nofpu SH4
28876cad711SPaolo Bonzini | .------------' `--------------------. |
28976cad711SPaolo Bonzini |/ \|
29076cad711SPaolo Bonzini SH4AL-dsp SH4A
29176cad711SPaolo Bonzini
29276cad711SPaolo Bonzini */
29376cad711SPaolo Bonzini
29476cad711SPaolo Bonzini /* Central branches */
29576cad711SPaolo Bonzini #define arch_sh1_up (arch_sh1 | arch_sh2_up)
29676cad711SPaolo Bonzini #define arch_sh2_up (arch_sh2 | arch_sh2e_up | arch_sh2a_nofpu_up | arch_sh3_nommu_up | arch_sh_dsp_up)
29776cad711SPaolo Bonzini #define arch_sh3_nommu_up (arch_sh3_nommu | arch_sh3_up | arch_sh4_nommu_nofpu_up)
29876cad711SPaolo Bonzini #define arch_sh3_up (arch_sh3 | arch_sh3e_up | arch_sh3_dsp_up | arch_sh4_nofp_up)
29976cad711SPaolo Bonzini #define arch_sh4_nommu_nofpu_up (arch_sh4_nommu_nofpu | arch_sh4_nofp_up)
30076cad711SPaolo Bonzini #define arch_sh4_nofp_up (arch_sh4_nofpu | arch_sh4_up | arch_sh4a_nofp_up)
30176cad711SPaolo Bonzini #define arch_sh4a_nofp_up (arch_sh4a_nofpu | arch_sh4a_up | arch_sh4al_dsp_up)
30276cad711SPaolo Bonzini
30376cad711SPaolo Bonzini /* Right branch */
30476cad711SPaolo Bonzini #define arch_sh2e_up (arch_sh2e | arch_sh2a_up | arch_sh3e_up)
30576cad711SPaolo Bonzini #define arch_sh3e_up (arch_sh3e | arch_sh4_up)
30676cad711SPaolo Bonzini #define arch_sh4_up (arch_sh4 | arch_sh4a_up)
30776cad711SPaolo Bonzini #define arch_sh4a_up (arch_sh4a)
30876cad711SPaolo Bonzini
30976cad711SPaolo Bonzini /* Left branch */
31076cad711SPaolo Bonzini #define arch_sh_dsp_up (arch_sh_dsp | arch_sh3_dsp_up)
31176cad711SPaolo Bonzini #define arch_sh3_dsp_up (arch_sh3_dsp | arch_sh4al_dsp_up)
31276cad711SPaolo Bonzini #define arch_sh4al_dsp_up (arch_sh4al_dsp)
31376cad711SPaolo Bonzini
31476cad711SPaolo Bonzini /* SH 2a branched off SH2e, adding a lot but not all of SH4 and SH4a. */
31576cad711SPaolo Bonzini #define arch_sh2a_up (arch_sh2a)
31676cad711SPaolo Bonzini #define arch_sh2a_nofpu_up (arch_sh2a_nofpu | arch_sh2a_up)
31776cad711SPaolo Bonzini
31876cad711SPaolo Bonzini
31976cad711SPaolo Bonzini typedef struct
32076cad711SPaolo Bonzini {
32176cad711SPaolo Bonzini const char *name;
32276cad711SPaolo Bonzini sh_arg_type arg[4];
32376cad711SPaolo Bonzini sh_nibble_type nibbles[9];
32476cad711SPaolo Bonzini unsigned int arch;
32576cad711SPaolo Bonzini } sh_opcode_info;
32676cad711SPaolo Bonzini
32776cad711SPaolo Bonzini #ifdef DEFINE_TABLE
32876cad711SPaolo Bonzini
329084cc839SStefan Weil static const sh_opcode_info sh_table[] =
33076cad711SPaolo Bonzini {
33176cad711SPaolo Bonzini /* 0111nnnni8*1.... add #<imm>,<REG_N> */{"add",{A_IMM,A_REG_N},{HEX_7,REG_N,IMM0_8}, arch_sh1_up},
33276cad711SPaolo Bonzini
33376cad711SPaolo Bonzini /* 0011nnnnmmmm1100 add <REG_M>,<REG_N> */{"add",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_C}, arch_sh1_up},
33476cad711SPaolo Bonzini
33576cad711SPaolo Bonzini /* 0011nnnnmmmm1110 addc <REG_M>,<REG_N>*/{"addc",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_E}, arch_sh1_up},
33676cad711SPaolo Bonzini
33776cad711SPaolo Bonzini /* 0011nnnnmmmm1111 addv <REG_M>,<REG_N>*/{"addv",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_F}, arch_sh1_up},
33876cad711SPaolo Bonzini
33976cad711SPaolo Bonzini /* 11001001i8*1.... and #<imm>,R0 */{"and",{A_IMM,A_R0},{HEX_C,HEX_9,IMM0_8}, arch_sh1_up},
34076cad711SPaolo Bonzini
34176cad711SPaolo Bonzini /* 0010nnnnmmmm1001 and <REG_M>,<REG_N> */{"and",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_9}, arch_sh1_up},
34276cad711SPaolo Bonzini
34376cad711SPaolo Bonzini /* 11001101i8*1.... and.b #<imm>,@(R0,GBR)*/{"and.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_D,IMM0_8}, arch_sh1_up},
34476cad711SPaolo Bonzini
34576cad711SPaolo Bonzini /* 1010i12......... bra <bdisp12> */{"bra",{A_BDISP12},{HEX_A,BRANCH_12}, arch_sh1_up},
34676cad711SPaolo Bonzini
34776cad711SPaolo Bonzini /* 1011i12......... bsr <bdisp12> */{"bsr",{A_BDISP12},{HEX_B,BRANCH_12}, arch_sh1_up},
34876cad711SPaolo Bonzini
34976cad711SPaolo Bonzini /* 10001001i8p1.... bt <bdisp8> */{"bt",{A_BDISP8},{HEX_8,HEX_9,BRANCH_8}, arch_sh1_up},
35076cad711SPaolo Bonzini
35176cad711SPaolo Bonzini /* 10001011i8p1.... bf <bdisp8> */{"bf",{A_BDISP8},{HEX_8,HEX_B,BRANCH_8}, arch_sh1_up},
35276cad711SPaolo Bonzini
35376cad711SPaolo Bonzini /* 10001101i8p1.... bt.s <bdisp8> */{"bt.s",{A_BDISP8},{HEX_8,HEX_D,BRANCH_8}, arch_sh2_up},
35476cad711SPaolo Bonzini
35576cad711SPaolo Bonzini /* 10001101i8p1.... bt/s <bdisp8> */{"bt/s",{A_BDISP8},{HEX_8,HEX_D,BRANCH_8}, arch_sh2_up},
35676cad711SPaolo Bonzini
35776cad711SPaolo Bonzini /* 10001111i8p1.... bf.s <bdisp8> */{"bf.s",{A_BDISP8},{HEX_8,HEX_F,BRANCH_8}, arch_sh2_up},
35876cad711SPaolo Bonzini
35976cad711SPaolo Bonzini /* 10001111i8p1.... bf/s <bdisp8> */{"bf/s",{A_BDISP8},{HEX_8,HEX_F,BRANCH_8}, arch_sh2_up},
36076cad711SPaolo Bonzini
36176cad711SPaolo Bonzini /* 0000000010001000 clrdmxy */{"clrdmxy",{0},{HEX_0,HEX_0,HEX_8,HEX_8}, arch_sh4al_dsp_up},
36276cad711SPaolo Bonzini
36376cad711SPaolo Bonzini /* 0000000000101000 clrmac */{"clrmac",{0},{HEX_0,HEX_0,HEX_2,HEX_8}, arch_sh1_up},
36476cad711SPaolo Bonzini
36576cad711SPaolo Bonzini /* 0000000001001000 clrs */{"clrs",{0},{HEX_0,HEX_0,HEX_4,HEX_8}, arch_sh1_up},
36676cad711SPaolo Bonzini
36776cad711SPaolo Bonzini /* 0000000000001000 clrt */{"clrt",{0},{HEX_0,HEX_0,HEX_0,HEX_8}, arch_sh1_up},
36876cad711SPaolo Bonzini
36976cad711SPaolo Bonzini /* 10001000i8*1.... cmp/eq #<imm>,R0 */{"cmp/eq",{A_IMM,A_R0},{HEX_8,HEX_8,IMM0_8}, arch_sh1_up},
37076cad711SPaolo Bonzini
37176cad711SPaolo Bonzini /* 0011nnnnmmmm0000 cmp/eq <REG_M>,<REG_N>*/{"cmp/eq",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_0}, arch_sh1_up},
37276cad711SPaolo Bonzini
37376cad711SPaolo Bonzini /* 0011nnnnmmmm0011 cmp/ge <REG_M>,<REG_N>*/{"cmp/ge",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_3}, arch_sh1_up},
37476cad711SPaolo Bonzini
37576cad711SPaolo Bonzini /* 0011nnnnmmmm0111 cmp/gt <REG_M>,<REG_N>*/{"cmp/gt",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_7}, arch_sh1_up},
37676cad711SPaolo Bonzini
37776cad711SPaolo Bonzini /* 0011nnnnmmmm0110 cmp/hi <REG_M>,<REG_N>*/{"cmp/hi",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_6}, arch_sh1_up},
37876cad711SPaolo Bonzini
37976cad711SPaolo Bonzini /* 0011nnnnmmmm0010 cmp/hs <REG_M>,<REG_N>*/{"cmp/hs",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_2}, arch_sh1_up},
38076cad711SPaolo Bonzini
38176cad711SPaolo Bonzini /* 0100nnnn00010101 cmp/pl <REG_N> */{"cmp/pl",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_5}, arch_sh1_up},
38276cad711SPaolo Bonzini
38376cad711SPaolo Bonzini /* 0100nnnn00010001 cmp/pz <REG_N> */{"cmp/pz",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_1}, arch_sh1_up},
38476cad711SPaolo Bonzini
38576cad711SPaolo Bonzini /* 0010nnnnmmmm1100 cmp/str <REG_M>,<REG_N>*/{"cmp/str",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_C}, arch_sh1_up},
38676cad711SPaolo Bonzini
38776cad711SPaolo Bonzini /* 0010nnnnmmmm0111 div0s <REG_M>,<REG_N>*/{"div0s",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_7}, arch_sh1_up},
38876cad711SPaolo Bonzini
38976cad711SPaolo Bonzini /* 0000000000011001 div0u */{"div0u",{0},{HEX_0,HEX_0,HEX_1,HEX_9}, arch_sh1_up},
39076cad711SPaolo Bonzini
39176cad711SPaolo Bonzini /* 0011nnnnmmmm0100 div1 <REG_M>,<REG_N>*/{"div1",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_4}, arch_sh1_up},
39276cad711SPaolo Bonzini
39376cad711SPaolo Bonzini /* 0110nnnnmmmm1110 exts.b <REG_M>,<REG_N>*/{"exts.b",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_E}, arch_sh1_up},
39476cad711SPaolo Bonzini
39576cad711SPaolo Bonzini /* 0110nnnnmmmm1111 exts.w <REG_M>,<REG_N>*/{"exts.w",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_F}, arch_sh1_up},
39676cad711SPaolo Bonzini
39776cad711SPaolo Bonzini /* 0110nnnnmmmm1100 extu.b <REG_M>,<REG_N>*/{"extu.b",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_C}, arch_sh1_up},
39876cad711SPaolo Bonzini
39976cad711SPaolo Bonzini /* 0110nnnnmmmm1101 extu.w <REG_M>,<REG_N>*/{"extu.w",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_D}, arch_sh1_up},
40076cad711SPaolo Bonzini
40176cad711SPaolo Bonzini /* 0000nnnn11100011 icbi @<REG_N> */{"icbi",{A_IND_N},{HEX_0,REG_N,HEX_E,HEX_3}, arch_sh4a_nofp_up},
40276cad711SPaolo Bonzini
40376cad711SPaolo Bonzini /* 0100nnnn00101011 jmp @<REG_N> */{"jmp",{A_IND_N},{HEX_4,REG_N,HEX_2,HEX_B}, arch_sh1_up},
40476cad711SPaolo Bonzini
40576cad711SPaolo Bonzini /* 0100nnnn00001011 jsr @<REG_N> */{"jsr",{A_IND_N},{HEX_4,REG_N,HEX_0,HEX_B}, arch_sh1_up},
40676cad711SPaolo Bonzini
40776cad711SPaolo Bonzini /* 0100nnnn00001110 ldc <REG_N>,SR */{"ldc",{A_REG_N,A_SR},{HEX_4,REG_N,HEX_0,HEX_E}, arch_sh1_up},
40876cad711SPaolo Bonzini
40976cad711SPaolo Bonzini /* 0100nnnn00011110 ldc <REG_N>,GBR */{"ldc",{A_REG_N,A_GBR},{HEX_4,REG_N,HEX_1,HEX_E}, arch_sh1_up},
41076cad711SPaolo Bonzini
41176cad711SPaolo Bonzini /* 0100nnnn00111010 ldc <REG_N>,SGR */{"ldc",{A_REG_N,A_SGR},{HEX_4,REG_N,HEX_3,HEX_A}, arch_sh4_nommu_nofpu_up},
41276cad711SPaolo Bonzini
41376cad711SPaolo Bonzini /* 0100mmmm01001010 ldc <REG_M>,TBR */{"ldc",{A_REG_M,A_TBR},{HEX_4,REG_M,HEX_4,HEX_A}, arch_sh2a_nofpu_up},
41476cad711SPaolo Bonzini
41576cad711SPaolo Bonzini /* 0100nnnn00101110 ldc <REG_N>,VBR */{"ldc",{A_REG_N,A_VBR},{HEX_4,REG_N,HEX_2,HEX_E}, arch_sh1_up},
41676cad711SPaolo Bonzini
41776cad711SPaolo Bonzini /* 0100nnnn01011110 ldc <REG_N>,MOD */{"ldc",{A_REG_N,A_MOD},{HEX_4,REG_N,HEX_5,HEX_E}, arch_sh_dsp_up},
41876cad711SPaolo Bonzini
41976cad711SPaolo Bonzini /* 0100nnnn01111110 ldc <REG_N>,RE */{"ldc",{A_REG_N,A_RE},{HEX_4,REG_N,HEX_7,HEX_E}, arch_sh_dsp_up},
42076cad711SPaolo Bonzini
42176cad711SPaolo Bonzini /* 0100nnnn01101110 ldc <REG_N>,RS */{"ldc",{A_REG_N,A_RS},{HEX_4,REG_N,HEX_6,HEX_E}, arch_sh_dsp_up},
42276cad711SPaolo Bonzini
42376cad711SPaolo Bonzini /* 0100nnnn00111110 ldc <REG_N>,SSR */{"ldc",{A_REG_N,A_SSR},{HEX_4,REG_N,HEX_3,HEX_E}, arch_sh3_nommu_up},
42476cad711SPaolo Bonzini
42576cad711SPaolo Bonzini /* 0100nnnn01001110 ldc <REG_N>,SPC */{"ldc",{A_REG_N,A_SPC},{HEX_4,REG_N,HEX_4,HEX_E}, arch_sh3_nommu_up},
42676cad711SPaolo Bonzini
42776cad711SPaolo Bonzini /* 0100nnnn11111010 ldc <REG_N>,DBR */{"ldc",{A_REG_N,A_DBR},{HEX_4,REG_N,HEX_F,HEX_A}, arch_sh4_nommu_nofpu_up},
42876cad711SPaolo Bonzini
42976cad711SPaolo Bonzini /* 0100nnnn1xxx1110 ldc <REG_N>,Rn_BANK */{"ldc",{A_REG_N,A_REG_B},{HEX_4,REG_N,REG_B,HEX_E}, arch_sh3_nommu_up},
43076cad711SPaolo Bonzini
43176cad711SPaolo Bonzini /* 0100nnnn00000111 ldc.l @<REG_N>+,SR */{"ldc.l",{A_INC_N,A_SR},{HEX_4,REG_N,HEX_0,HEX_7}, arch_sh1_up},
43276cad711SPaolo Bonzini
43376cad711SPaolo Bonzini /* 0100nnnn00010111 ldc.l @<REG_N>+,GBR */{"ldc.l",{A_INC_N,A_GBR},{HEX_4,REG_N,HEX_1,HEX_7}, arch_sh1_up},
43476cad711SPaolo Bonzini
43576cad711SPaolo Bonzini /* 0100nnnn00100111 ldc.l @<REG_N>+,VBR */{"ldc.l",{A_INC_N,A_VBR},{HEX_4,REG_N,HEX_2,HEX_7}, arch_sh1_up},
43676cad711SPaolo Bonzini
43776cad711SPaolo Bonzini /* 0100nnnn00110110 ldc.l @<REG_N>+,SGR */{"ldc.l",{A_INC_N,A_SGR},{HEX_4,REG_N,HEX_3,HEX_6}, arch_sh4_nommu_nofpu_up},
43876cad711SPaolo Bonzini
43976cad711SPaolo Bonzini /* 0100nnnn01010111 ldc.l @<REG_N>+,MOD */{"ldc.l",{A_INC_N,A_MOD},{HEX_4,REG_N,HEX_5,HEX_7}, arch_sh_dsp_up},
44076cad711SPaolo Bonzini
44176cad711SPaolo Bonzini /* 0100nnnn01110111 ldc.l @<REG_N>+,RE */{"ldc.l",{A_INC_N,A_RE},{HEX_4,REG_N,HEX_7,HEX_7}, arch_sh_dsp_up},
44276cad711SPaolo Bonzini
44376cad711SPaolo Bonzini /* 0100nnnn01100111 ldc.l @<REG_N>+,RS */{"ldc.l",{A_INC_N,A_RS},{HEX_4,REG_N,HEX_6,HEX_7}, arch_sh_dsp_up},
44476cad711SPaolo Bonzini
44576cad711SPaolo Bonzini /* 0100nnnn00110111 ldc.l @<REG_N>+,SSR */{"ldc.l",{A_INC_N,A_SSR},{HEX_4,REG_N,HEX_3,HEX_7}, arch_sh3_nommu_up},
44676cad711SPaolo Bonzini
44776cad711SPaolo Bonzini /* 0100nnnn01000111 ldc.l @<REG_N>+,SPC */{"ldc.l",{A_INC_N,A_SPC},{HEX_4,REG_N,HEX_4,HEX_7}, arch_sh3_nommu_up},
44876cad711SPaolo Bonzini
44976cad711SPaolo Bonzini /* 0100nnnn11110110 ldc.l @<REG_N>+,DBR */{"ldc.l",{A_INC_N,A_DBR},{HEX_4,REG_N,HEX_F,HEX_6}, arch_sh4_nommu_nofpu_up},
45076cad711SPaolo Bonzini
45176cad711SPaolo Bonzini /* 0100nnnn1xxx0111 ldc.l <REG_N>,Rn_BANK */{"ldc.l",{A_INC_N,A_REG_B},{HEX_4,REG_N,REG_B,HEX_7}, arch_sh3_nommu_up},
45276cad711SPaolo Bonzini
45376cad711SPaolo Bonzini /* 0100mmmm00110100 ldrc <REG_M> */{"ldrc",{A_REG_M},{HEX_4,REG_M,HEX_3,HEX_4}, arch_sh4al_dsp_up},
45476cad711SPaolo Bonzini /* 10001010i8*1.... ldrc #<imm> */{"ldrc",{A_IMM},{HEX_8,HEX_A,IMM0_8}, arch_sh4al_dsp_up},
45576cad711SPaolo Bonzini
45676cad711SPaolo Bonzini /* 10001110i8p2.... ldre @(<disp>,PC) */{"ldre",{A_DISP_PC},{HEX_8,HEX_E,PCRELIMM_8BY2}, arch_sh_dsp_up},
45776cad711SPaolo Bonzini
45876cad711SPaolo Bonzini /* 10001100i8p2.... ldrs @(<disp>,PC) */{"ldrs",{A_DISP_PC},{HEX_8,HEX_C,PCRELIMM_8BY2}, arch_sh_dsp_up},
45976cad711SPaolo Bonzini
46076cad711SPaolo Bonzini /* 0100nnnn00001010 lds <REG_N>,MACH */{"lds",{A_REG_N,A_MACH},{HEX_4,REG_N,HEX_0,HEX_A}, arch_sh1_up},
46176cad711SPaolo Bonzini
46276cad711SPaolo Bonzini /* 0100nnnn00011010 lds <REG_N>,MACL */{"lds",{A_REG_N,A_MACL},{HEX_4,REG_N,HEX_1,HEX_A}, arch_sh1_up},
46376cad711SPaolo Bonzini
46476cad711SPaolo Bonzini /* 0100nnnn00101010 lds <REG_N>,PR */{"lds",{A_REG_N,A_PR},{HEX_4,REG_N,HEX_2,HEX_A}, arch_sh1_up},
46576cad711SPaolo Bonzini
46676cad711SPaolo Bonzini /* 0100nnnn01101010 lds <REG_N>,DSR */{"lds",{A_REG_N,A_DSR},{HEX_4,REG_N,HEX_6,HEX_A}, arch_sh_dsp_up},
46776cad711SPaolo Bonzini
46876cad711SPaolo Bonzini /* 0100nnnn01111010 lds <REG_N>,A0 */{"lds",{A_REG_N,A_A0},{HEX_4,REG_N,HEX_7,HEX_A}, arch_sh_dsp_up},
46976cad711SPaolo Bonzini
47076cad711SPaolo Bonzini /* 0100nnnn10001010 lds <REG_N>,X0 */{"lds",{A_REG_N,A_X0},{HEX_4,REG_N,HEX_8,HEX_A}, arch_sh_dsp_up},
47176cad711SPaolo Bonzini
47276cad711SPaolo Bonzini /* 0100nnnn10011010 lds <REG_N>,X1 */{"lds",{A_REG_N,A_X1},{HEX_4,REG_N,HEX_9,HEX_A}, arch_sh_dsp_up},
47376cad711SPaolo Bonzini
47476cad711SPaolo Bonzini /* 0100nnnn10101010 lds <REG_N>,Y0 */{"lds",{A_REG_N,A_Y0},{HEX_4,REG_N,HEX_A,HEX_A}, arch_sh_dsp_up},
47576cad711SPaolo Bonzini
47676cad711SPaolo Bonzini /* 0100nnnn10111010 lds <REG_N>,Y1 */{"lds",{A_REG_N,A_Y1},{HEX_4,REG_N,HEX_B,HEX_A}, arch_sh_dsp_up},
47776cad711SPaolo Bonzini
47876cad711SPaolo Bonzini /* 0100nnnn01011010 lds <REG_N>,FPUL */{"lds",{A_REG_M,FPUL_N},{HEX_4,REG_M,HEX_5,HEX_A}, arch_sh2e_up},
47976cad711SPaolo Bonzini
48076cad711SPaolo Bonzini /* 0100nnnn01101010 lds <REG_M>,FPSCR */{"lds",{A_REG_M,FPSCR_N},{HEX_4,REG_M,HEX_6,HEX_A}, arch_sh2e_up},
48176cad711SPaolo Bonzini
48276cad711SPaolo Bonzini /* 0100nnnn00000110 lds.l @<REG_N>+,MACH*/{"lds.l",{A_INC_N,A_MACH},{HEX_4,REG_N,HEX_0,HEX_6}, arch_sh1_up},
48376cad711SPaolo Bonzini
48476cad711SPaolo Bonzini /* 0100nnnn00010110 lds.l @<REG_N>+,MACL*/{"lds.l",{A_INC_N,A_MACL},{HEX_4,REG_N,HEX_1,HEX_6}, arch_sh1_up},
48576cad711SPaolo Bonzini
48676cad711SPaolo Bonzini /* 0100nnnn00100110 lds.l @<REG_N>+,PR */{"lds.l",{A_INC_N,A_PR},{HEX_4,REG_N,HEX_2,HEX_6}, arch_sh1_up},
48776cad711SPaolo Bonzini
48876cad711SPaolo Bonzini /* 0100nnnn01100110 lds.l @<REG_N>+,DSR */{"lds.l",{A_INC_N,A_DSR},{HEX_4,REG_N,HEX_6,HEX_6}, arch_sh_dsp_up},
48976cad711SPaolo Bonzini
49076cad711SPaolo Bonzini /* 0100nnnn01110110 lds.l @<REG_N>+,A0 */{"lds.l",{A_INC_N,A_A0},{HEX_4,REG_N,HEX_7,HEX_6}, arch_sh_dsp_up},
49176cad711SPaolo Bonzini
49276cad711SPaolo Bonzini /* 0100nnnn10000110 lds.l @<REG_N>+,X0 */{"lds.l",{A_INC_N,A_X0},{HEX_4,REG_N,HEX_8,HEX_6}, arch_sh_dsp_up},
49376cad711SPaolo Bonzini
49476cad711SPaolo Bonzini /* 0100nnnn10010110 lds.l @<REG_N>+,X1 */{"lds.l",{A_INC_N,A_X1},{HEX_4,REG_N,HEX_9,HEX_6}, arch_sh_dsp_up},
49576cad711SPaolo Bonzini
49676cad711SPaolo Bonzini /* 0100nnnn10100110 lds.l @<REG_N>+,Y0 */{"lds.l",{A_INC_N,A_Y0},{HEX_4,REG_N,HEX_A,HEX_6}, arch_sh_dsp_up},
49776cad711SPaolo Bonzini
49876cad711SPaolo Bonzini /* 0100nnnn10110110 lds.l @<REG_N>+,Y1 */{"lds.l",{A_INC_N,A_Y1},{HEX_4,REG_N,HEX_B,HEX_6}, arch_sh_dsp_up},
49976cad711SPaolo Bonzini
50076cad711SPaolo Bonzini /* 0100nnnn01010110 lds.l @<REG_M>+,FPUL*/{"lds.l",{A_INC_M,FPUL_N},{HEX_4,REG_M,HEX_5,HEX_6}, arch_sh2e_up},
50176cad711SPaolo Bonzini
50276cad711SPaolo Bonzini /* 0100nnnn01100110 lds.l @<REG_M>+,FPSCR*/{"lds.l",{A_INC_M,FPSCR_N},{HEX_4,REG_M,HEX_6,HEX_6}, arch_sh2e_up},
50376cad711SPaolo Bonzini
50476cad711SPaolo Bonzini /* 0000000000111000 ldtlb */{"ldtlb",{0},{HEX_0,HEX_0,HEX_3,HEX_8}, arch_sh3_up},
50576cad711SPaolo Bonzini
50676cad711SPaolo Bonzini /* 0100nnnnmmmm1111 mac.w @<REG_M>+,@<REG_N>+*/{"mac.w",{A_INC_M,A_INC_N},{HEX_4,REG_N,REG_M,HEX_F}, arch_sh1_up},
50776cad711SPaolo Bonzini
50876cad711SPaolo Bonzini /* 1110nnnni8*1.... mov #<imm>,<REG_N> */{"mov",{A_IMM,A_REG_N},{HEX_E,REG_N,IMM0_8}, arch_sh1_up},
50976cad711SPaolo Bonzini
51076cad711SPaolo Bonzini /* 0110nnnnmmmm0011 mov <REG_M>,<REG_N> */{"mov",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_3}, arch_sh1_up},
51176cad711SPaolo Bonzini
51276cad711SPaolo Bonzini /* 0000nnnnmmmm0100 mov.b <REG_M>,@(R0,<REG_N>)*/{"mov.b",{ A_REG_M,A_IND_R0_REG_N},{HEX_0,REG_N,REG_M,HEX_4}, arch_sh1_up},
51376cad711SPaolo Bonzini
51476cad711SPaolo Bonzini /* 0010nnnnmmmm0100 mov.b <REG_M>,@-<REG_N>*/{"mov.b",{ A_REG_M,A_DEC_N},{HEX_2,REG_N,REG_M,HEX_4}, arch_sh1_up},
51576cad711SPaolo Bonzini
51676cad711SPaolo Bonzini /* 0010nnnnmmmm0000 mov.b <REG_M>,@<REG_N>*/{"mov.b",{ A_REG_M,A_IND_N},{HEX_2,REG_N,REG_M,HEX_0}, arch_sh1_up},
51776cad711SPaolo Bonzini
51876cad711SPaolo Bonzini /* 10000100mmmmi4*1 mov.b @(<disp>,<REG_M>),R0*/{"mov.b",{A_DISP_REG_M,A_R0},{HEX_8,HEX_4,REG_M,IMM0_4}, arch_sh1_up},
51976cad711SPaolo Bonzini
52076cad711SPaolo Bonzini /* 11000100i8*1.... mov.b @(<disp>,GBR),R0*/{"mov.b",{A_DISP_GBR,A_R0},{HEX_C,HEX_4,IMM0_8}, arch_sh1_up},
52176cad711SPaolo Bonzini
52276cad711SPaolo Bonzini /* 0000nnnnmmmm1100 mov.b @(R0,<REG_M>),<REG_N>*/{"mov.b",{A_IND_R0_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_C}, arch_sh1_up},
52376cad711SPaolo Bonzini
52476cad711SPaolo Bonzini /* 0110nnnnmmmm0100 mov.b @<REG_M>+,<REG_N>*/{"mov.b",{A_INC_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_4}, arch_sh1_up},
52576cad711SPaolo Bonzini
52676cad711SPaolo Bonzini /* 0110nnnnmmmm0000 mov.b @<REG_M>,<REG_N>*/{"mov.b",{A_IND_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_0}, arch_sh1_up},
52776cad711SPaolo Bonzini
52876cad711SPaolo Bonzini /* 10000000mmmmi4*1 mov.b R0,@(<disp>,<REG_M>)*/{"mov.b",{A_R0,A_DISP_REG_M},{HEX_8,HEX_0,REG_M,IMM1_4}, arch_sh1_up},
52976cad711SPaolo Bonzini
53076cad711SPaolo Bonzini /* 11000000i8*1.... mov.b R0,@(<disp>,GBR)*/{"mov.b",{A_R0,A_DISP_GBR},{HEX_C,HEX_0,IMM1_8}, arch_sh1_up},
53176cad711SPaolo Bonzini
53276cad711SPaolo Bonzini /* 0100nnnn10001011 mov.b R0,@<REG_N>+ */{"mov.b",{A_R0,A_INC_N},{HEX_4,REG_N,HEX_8,HEX_B}, arch_sh2a_nofpu_up},
53376cad711SPaolo Bonzini /* 0100nnnn11001011 mov.b @-<REG_M>,R0 */{"mov.b",{A_DEC_M,A_R0},{HEX_4,REG_M,HEX_C,HEX_B}, arch_sh2a_nofpu_up},
53476cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0000dddddddddddd mov.b <REG_M>,@(<DISP12>,<REG_N>) */
53576cad711SPaolo Bonzini {"mov.b",{A_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_0,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
53676cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0100dddddddddddd mov.b @(<DISP12>,<REG_M>),<REG_N> */
53776cad711SPaolo Bonzini {"mov.b",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_4,DISP0_12}, arch_sh2a_nofpu_up | arch_op32},
53876cad711SPaolo Bonzini /* 0001nnnnmmmmi4*4 mov.l <REG_M>,@(<disp>,<REG_N>)*/{"mov.l",{ A_REG_M,A_DISP_REG_N},{HEX_1,REG_N,REG_M,IMM1_4BY4}, arch_sh1_up},
53976cad711SPaolo Bonzini
54076cad711SPaolo Bonzini /* 0000nnnnmmmm0110 mov.l <REG_M>,@(R0,<REG_N>)*/{"mov.l",{ A_REG_M,A_IND_R0_REG_N},{HEX_0,REG_N,REG_M,HEX_6}, arch_sh1_up},
54176cad711SPaolo Bonzini
54276cad711SPaolo Bonzini /* 0010nnnnmmmm0110 mov.l <REG_M>,@-<REG_N>*/{"mov.l",{ A_REG_M,A_DEC_N},{HEX_2,REG_N,REG_M,HEX_6}, arch_sh1_up},
54376cad711SPaolo Bonzini
54476cad711SPaolo Bonzini /* 0010nnnnmmmm0010 mov.l <REG_M>,@<REG_N>*/{"mov.l",{ A_REG_M,A_IND_N},{HEX_2,REG_N,REG_M,HEX_2}, arch_sh1_up},
54576cad711SPaolo Bonzini
54676cad711SPaolo Bonzini /* 0101nnnnmmmmi4*4 mov.l @(<disp>,<REG_M>),<REG_N>*/{"mov.l",{A_DISP_REG_M,A_REG_N},{HEX_5,REG_N,REG_M,IMM0_4BY4}, arch_sh1_up},
54776cad711SPaolo Bonzini
54876cad711SPaolo Bonzini /* 11000110i8*4.... mov.l @(<disp>,GBR),R0*/{"mov.l",{A_DISP_GBR,A_R0},{HEX_C,HEX_6,IMM0_8BY4}, arch_sh1_up},
54976cad711SPaolo Bonzini
55076cad711SPaolo Bonzini /* 1101nnnni8p4.... mov.l @(<disp>,PC),<REG_N>*/{"mov.l",{A_DISP_PC,A_REG_N},{HEX_D,REG_N,PCRELIMM_8BY4}, arch_sh1_up},
55176cad711SPaolo Bonzini
55276cad711SPaolo Bonzini /* 0000nnnnmmmm1110 mov.l @(R0,<REG_M>),<REG_N>*/{"mov.l",{A_IND_R0_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_E}, arch_sh1_up},
55376cad711SPaolo Bonzini
55476cad711SPaolo Bonzini /* 0110nnnnmmmm0110 mov.l @<REG_M>+,<REG_N>*/{"mov.l",{A_INC_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_6}, arch_sh1_up},
55576cad711SPaolo Bonzini
55676cad711SPaolo Bonzini /* 0110nnnnmmmm0010 mov.l @<REG_M>,<REG_N>*/{"mov.l",{A_IND_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_2}, arch_sh1_up},
55776cad711SPaolo Bonzini
55876cad711SPaolo Bonzini /* 11000010i8*4.... mov.l R0,@(<disp>,GBR)*/{"mov.l",{A_R0,A_DISP_GBR},{HEX_C,HEX_2,IMM1_8BY4}, arch_sh1_up},
55976cad711SPaolo Bonzini
56076cad711SPaolo Bonzini /* 0100nnnn10101011 mov.l R0,@<REG_N>+ */{"mov.l",{A_R0,A_INC_N},{HEX_4,REG_N,HEX_A,HEX_B}, arch_sh2a_nofpu_up},
56176cad711SPaolo Bonzini /* 0100nnnn11001011 mov.l @-<REG_M>,R0 */{"mov.l",{A_DEC_M,A_R0},{HEX_4,REG_M,HEX_E,HEX_B}, arch_sh2a_nofpu_up},
56276cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0010dddddddddddd mov.l <REG_M>,@(<DISP12>,<REG_N>) */
56376cad711SPaolo Bonzini {"mov.l",{A_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_2,DISP1_12BY4}, arch_sh2a_nofpu_up | arch_op32},
56476cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0110dddddddddddd mov.l @(<DISP12>,<REG_M>),<REG_N> */
56576cad711SPaolo Bonzini {"mov.l",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_6,DISP0_12BY4}, arch_sh2a_nofpu_up | arch_op32},
56676cad711SPaolo Bonzini /* 0000nnnnmmmm0101 mov.w <REG_M>,@(R0,<REG_N>)*/{"mov.w",{ A_REG_M,A_IND_R0_REG_N},{HEX_0,REG_N,REG_M,HEX_5}, arch_sh1_up},
56776cad711SPaolo Bonzini
56876cad711SPaolo Bonzini /* 0010nnnnmmmm0101 mov.w <REG_M>,@-<REG_N>*/{"mov.w",{ A_REG_M,A_DEC_N},{HEX_2,REG_N,REG_M,HEX_5}, arch_sh1_up},
56976cad711SPaolo Bonzini
57076cad711SPaolo Bonzini /* 0010nnnnmmmm0001 mov.w <REG_M>,@<REG_N>*/{"mov.w",{ A_REG_M,A_IND_N},{HEX_2,REG_N,REG_M,HEX_1}, arch_sh1_up},
57176cad711SPaolo Bonzini
57276cad711SPaolo Bonzini /* 10000101mmmmi4*2 mov.w @(<disp>,<REG_M>),R0*/{"mov.w",{A_DISP_REG_M,A_R0},{HEX_8,HEX_5,REG_M,IMM0_4BY2}, arch_sh1_up},
57376cad711SPaolo Bonzini
57476cad711SPaolo Bonzini /* 11000101i8*2.... mov.w @(<disp>,GBR),R0*/{"mov.w",{A_DISP_GBR,A_R0},{HEX_C,HEX_5,IMM0_8BY2}, arch_sh1_up},
57576cad711SPaolo Bonzini
57676cad711SPaolo Bonzini /* 1001nnnni8p2.... mov.w @(<disp>,PC),<REG_N>*/{"mov.w",{A_DISP_PC,A_REG_N},{HEX_9,REG_N,PCRELIMM_8BY2}, arch_sh1_up},
57776cad711SPaolo Bonzini
57876cad711SPaolo Bonzini /* 0000nnnnmmmm1101 mov.w @(R0,<REG_M>),<REG_N>*/{"mov.w",{A_IND_R0_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_D}, arch_sh1_up},
57976cad711SPaolo Bonzini
58076cad711SPaolo Bonzini /* 0110nnnnmmmm0101 mov.w @<REG_M>+,<REG_N>*/{"mov.w",{A_INC_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_5}, arch_sh1_up},
58176cad711SPaolo Bonzini
58276cad711SPaolo Bonzini /* 0110nnnnmmmm0001 mov.w @<REG_M>,<REG_N>*/{"mov.w",{A_IND_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_1}, arch_sh1_up},
58376cad711SPaolo Bonzini
58476cad711SPaolo Bonzini /* 10000001mmmmi4*2 mov.w R0,@(<disp>,<REG_M>)*/{"mov.w",{A_R0,A_DISP_REG_M},{HEX_8,HEX_1,REG_M,IMM1_4BY2}, arch_sh1_up},
58576cad711SPaolo Bonzini
58676cad711SPaolo Bonzini /* 11000001i8*2.... mov.w R0,@(<disp>,GBR)*/{"mov.w",{A_R0,A_DISP_GBR},{HEX_C,HEX_1,IMM1_8BY2}, arch_sh1_up},
58776cad711SPaolo Bonzini
58876cad711SPaolo Bonzini /* 0100nnnn10011011 mov.w R0,@<REG_N>+ */{"mov.w",{A_R0,A_INC_N},{HEX_4,REG_N,HEX_9,HEX_B}, arch_sh2a_nofpu_up},
58976cad711SPaolo Bonzini /* 0100nnnn11011011 mov.w @-<REG_M>,R0 */{"mov.w",{A_DEC_M,A_R0},{HEX_4,REG_M,HEX_D,HEX_B}, arch_sh2a_nofpu_up},
59076cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0001dddddddddddd mov.w <REG_M>,@(<DISP12>,<REG_N>) */
59176cad711SPaolo Bonzini {"mov.w",{A_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_1,DISP1_12BY2}, arch_sh2a_nofpu_up | arch_op32},
59276cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0101dddddddddddd mov.w @(<DISP12>,<REG_M>),<REG_N> */
59376cad711SPaolo Bonzini {"mov.w",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_5,DISP0_12BY2}, arch_sh2a_nofpu_up | arch_op32},
59476cad711SPaolo Bonzini /* 11000111i8p4.... mova @(<disp>,PC),R0*/{"mova",{A_DISP_PC,A_R0},{HEX_C,HEX_7,PCRELIMM_8BY4}, arch_sh1_up},
59576cad711SPaolo Bonzini /* 0000nnnn11000011 movca.l R0,@<REG_N> */{"movca.l",{A_R0,A_IND_N},{HEX_0,REG_N,HEX_C,HEX_3}, arch_sh4_nommu_nofpu_up},
59676cad711SPaolo Bonzini
59776cad711SPaolo Bonzini /* 0000nnnn01110011 movco.l r0,@<REG_N> */{"movco.l",{A_R0,A_IND_N},{HEX_0,REG_N,HEX_7,HEX_3}, arch_sh4a_nofp_up},
59876cad711SPaolo Bonzini /* 0000mmmm01100011 movli.l @<REG_M>,r0 */{"movli.l",{A_IND_M,A_R0},{HEX_0,REG_M,HEX_6,HEX_3}, arch_sh4a_nofp_up},
59976cad711SPaolo Bonzini
60076cad711SPaolo Bonzini /* 0000nnnn00101001 movt <REG_N> */{"movt",{A_REG_N},{HEX_0,REG_N,HEX_2,HEX_9}, arch_sh1_up},
60176cad711SPaolo Bonzini
60276cad711SPaolo Bonzini /* 0100mmmm10101001 movua.l @<REG_M>,r0 */{"movua.l",{A_IND_M,A_R0},{HEX_4,REG_M,HEX_A,HEX_9}, arch_sh4a_nofp_up},
60376cad711SPaolo Bonzini /* 0100mmmm11101001 movua.l @<REG_M>+,r0 */{"movua.l",{A_INC_M,A_R0},{HEX_4,REG_M,HEX_E,HEX_9}, arch_sh4a_nofp_up},
60476cad711SPaolo Bonzini
60576cad711SPaolo Bonzini /* 0010nnnnmmmm1111 muls.w <REG_M>,<REG_N>*/{"muls.w",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_F}, arch_sh1_up},
60676cad711SPaolo Bonzini /* 0010nnnnmmmm1111 muls <REG_M>,<REG_N>*/{"muls",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_F}, arch_sh1_up},
60776cad711SPaolo Bonzini
60876cad711SPaolo Bonzini /* 0000nnnnmmmm0111 mul.l <REG_M>,<REG_N>*/{"mul.l",{ A_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_7}, arch_sh2_up},
60976cad711SPaolo Bonzini
61076cad711SPaolo Bonzini /* 0010nnnnmmmm1110 mulu.w <REG_M>,<REG_N>*/{"mulu.w",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_E}, arch_sh1_up},
61176cad711SPaolo Bonzini /* 0010nnnnmmmm1110 mulu <REG_M>,<REG_N>*/{"mulu",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_E}, arch_sh1_up},
61276cad711SPaolo Bonzini
61376cad711SPaolo Bonzini /* 0110nnnnmmmm1011 neg <REG_M>,<REG_N> */{"neg",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_B}, arch_sh1_up},
61476cad711SPaolo Bonzini
61576cad711SPaolo Bonzini /* 0110nnnnmmmm1010 negc <REG_M>,<REG_N>*/{"negc",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_A}, arch_sh1_up},
61676cad711SPaolo Bonzini
61776cad711SPaolo Bonzini /* 0000000000001001 nop */{"nop",{0},{HEX_0,HEX_0,HEX_0,HEX_9}, arch_sh1_up},
61876cad711SPaolo Bonzini
61976cad711SPaolo Bonzini /* 0110nnnnmmmm0111 not <REG_M>,<REG_N> */{"not",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_7}, arch_sh1_up},
62076cad711SPaolo Bonzini /* 0000nnnn10010011 ocbi @<REG_N> */{"ocbi",{A_IND_N},{HEX_0,REG_N,HEX_9,HEX_3}, arch_sh4_nommu_nofpu_up},
62176cad711SPaolo Bonzini
62276cad711SPaolo Bonzini /* 0000nnnn10100011 ocbp @<REG_N> */{"ocbp",{A_IND_N},{HEX_0,REG_N,HEX_A,HEX_3}, arch_sh4_nommu_nofpu_up},
62376cad711SPaolo Bonzini
62476cad711SPaolo Bonzini /* 0000nnnn10110011 ocbwb @<REG_N> */{"ocbwb",{A_IND_N},{HEX_0,REG_N,HEX_B,HEX_3}, arch_sh4_nommu_nofpu_up},
62576cad711SPaolo Bonzini
62676cad711SPaolo Bonzini
62776cad711SPaolo Bonzini /* 11001011i8*1.... or #<imm>,R0 */{"or",{A_IMM,A_R0},{HEX_C,HEX_B,IMM0_8}, arch_sh1_up},
62876cad711SPaolo Bonzini
62976cad711SPaolo Bonzini /* 0010nnnnmmmm1011 or <REG_M>,<REG_N> */{"or",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_B}, arch_sh1_up},
63076cad711SPaolo Bonzini
63176cad711SPaolo Bonzini /* 11001111i8*1.... or.b #<imm>,@(R0,GBR)*/{"or.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_F,IMM0_8}, arch_sh1_up},
63276cad711SPaolo Bonzini
63376cad711SPaolo Bonzini /* 0000nnnn10000011 pref @<REG_N> */{"pref",{A_IND_N},{HEX_0,REG_N,HEX_8,HEX_3}, arch_sh4_nommu_nofpu_up | arch_sh2a_nofpu_up},
63476cad711SPaolo Bonzini
63576cad711SPaolo Bonzini /* 0000nnnn11010011 prefi @<REG_N> */{"prefi",{A_IND_N},{HEX_0,REG_N,HEX_D,HEX_3}, arch_sh4a_nofp_up},
63676cad711SPaolo Bonzini
63776cad711SPaolo Bonzini /* 0100nnnn00100100 rotcl <REG_N> */{"rotcl",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_4}, arch_sh1_up},
63876cad711SPaolo Bonzini
63976cad711SPaolo Bonzini /* 0100nnnn00100101 rotcr <REG_N> */{"rotcr",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_5}, arch_sh1_up},
64076cad711SPaolo Bonzini
64176cad711SPaolo Bonzini /* 0100nnnn00000100 rotl <REG_N> */{"rotl",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_4}, arch_sh1_up},
64276cad711SPaolo Bonzini
64376cad711SPaolo Bonzini /* 0100nnnn00000101 rotr <REG_N> */{"rotr",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_5}, arch_sh1_up},
64476cad711SPaolo Bonzini
64576cad711SPaolo Bonzini /* 0000000000101011 rte */{"rte",{0},{HEX_0,HEX_0,HEX_2,HEX_B}, arch_sh1_up},
64676cad711SPaolo Bonzini
64776cad711SPaolo Bonzini /* 0000000000001011 rts */{"rts",{0},{HEX_0,HEX_0,HEX_0,HEX_B}, arch_sh1_up},
64876cad711SPaolo Bonzini
64976cad711SPaolo Bonzini /* 0000000010011000 setdmx */{"setdmx",{0},{HEX_0,HEX_0,HEX_9,HEX_8}, arch_sh4al_dsp_up},
65076cad711SPaolo Bonzini /* 0000000011001000 setdmy */{"setdmy",{0},{HEX_0,HEX_0,HEX_C,HEX_8}, arch_sh4al_dsp_up},
65176cad711SPaolo Bonzini
65276cad711SPaolo Bonzini /* 0000000001011000 sets */{"sets",{0},{HEX_0,HEX_0,HEX_5,HEX_8}, arch_sh1_up},
65376cad711SPaolo Bonzini /* 0000000000011000 sett */{"sett",{0},{HEX_0,HEX_0,HEX_1,HEX_8}, arch_sh1_up},
65476cad711SPaolo Bonzini
65576cad711SPaolo Bonzini /* 0100nnnn00010100 setrc <REG_N> */{"setrc",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_4}, arch_sh_dsp_up},
65676cad711SPaolo Bonzini
65776cad711SPaolo Bonzini /* 10000010i8*1.... setrc #<imm> */{"setrc",{A_IMM},{HEX_8,HEX_2,IMM0_8}, arch_sh_dsp_up},
65876cad711SPaolo Bonzini
65976cad711SPaolo Bonzini /* repeat start end <REG_N> */{"repeat",{A_DISP_PC,A_DISP_PC,A_REG_N},{REPEAT,REG_N,HEX_1,HEX_4}, arch_sh_dsp_up},
66076cad711SPaolo Bonzini
66176cad711SPaolo Bonzini /* repeat start end #<imm> */{"repeat",{A_DISP_PC,A_DISP_PC,A_IMM},{REPEAT,HEX_2,IMM0_8,HEX_8}, arch_sh_dsp_up},
66276cad711SPaolo Bonzini
66376cad711SPaolo Bonzini /* 0100nnnnmmmm1100 shad <REG_M>,<REG_N>*/{"shad",{ A_REG_M,A_REG_N},{HEX_4,REG_N,REG_M,HEX_C}, arch_sh3_nommu_up | arch_sh2a_nofpu_up},
66476cad711SPaolo Bonzini
66576cad711SPaolo Bonzini /* 0100nnnnmmmm1101 shld <REG_M>,<REG_N>*/{"shld",{ A_REG_M,A_REG_N},{HEX_4,REG_N,REG_M,HEX_D}, arch_sh3_nommu_up | arch_sh2a_nofpu_up},
66676cad711SPaolo Bonzini
66776cad711SPaolo Bonzini /* 0100nnnn00100000 shal <REG_N> */{"shal",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_0}, arch_sh1_up},
66876cad711SPaolo Bonzini
66976cad711SPaolo Bonzini /* 0100nnnn00100001 shar <REG_N> */{"shar",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_1}, arch_sh1_up},
67076cad711SPaolo Bonzini
67176cad711SPaolo Bonzini /* 0100nnnn00000000 shll <REG_N> */{"shll",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_0}, arch_sh1_up},
67276cad711SPaolo Bonzini
67376cad711SPaolo Bonzini /* 0100nnnn00101000 shll16 <REG_N> */{"shll16",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_8}, arch_sh1_up},
67476cad711SPaolo Bonzini
67576cad711SPaolo Bonzini /* 0100nnnn00001000 shll2 <REG_N> */{"shll2",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_8}, arch_sh1_up},
67676cad711SPaolo Bonzini
67776cad711SPaolo Bonzini /* 0100nnnn00011000 shll8 <REG_N> */{"shll8",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_8}, arch_sh1_up},
67876cad711SPaolo Bonzini
67976cad711SPaolo Bonzini /* 0100nnnn00000001 shlr <REG_N> */{"shlr",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_1}, arch_sh1_up},
68076cad711SPaolo Bonzini
68176cad711SPaolo Bonzini /* 0100nnnn00101001 shlr16 <REG_N> */{"shlr16",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_9}, arch_sh1_up},
68276cad711SPaolo Bonzini
68376cad711SPaolo Bonzini /* 0100nnnn00001001 shlr2 <REG_N> */{"shlr2",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_9}, arch_sh1_up},
68476cad711SPaolo Bonzini
68576cad711SPaolo Bonzini /* 0100nnnn00011001 shlr8 <REG_N> */{"shlr8",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_9}, arch_sh1_up},
68676cad711SPaolo Bonzini
68776cad711SPaolo Bonzini /* 0000000000011011 sleep */{"sleep",{0},{HEX_0,HEX_0,HEX_1,HEX_B}, arch_sh1_up},
68876cad711SPaolo Bonzini
68976cad711SPaolo Bonzini /* 0000nnnn00000010 stc SR,<REG_N> */{"stc",{A_SR,A_REG_N},{HEX_0,REG_N,HEX_0,HEX_2}, arch_sh1_up},
69076cad711SPaolo Bonzini
69176cad711SPaolo Bonzini /* 0000nnnn00010010 stc GBR,<REG_N> */{"stc",{A_GBR,A_REG_N},{HEX_0,REG_N,HEX_1,HEX_2}, arch_sh1_up},
69276cad711SPaolo Bonzini
69376cad711SPaolo Bonzini /* 0000nnnn00100010 stc VBR,<REG_N> */{"stc",{A_VBR,A_REG_N},{HEX_0,REG_N,HEX_2,HEX_2}, arch_sh1_up},
69476cad711SPaolo Bonzini
69576cad711SPaolo Bonzini /* 0000nnnn01010010 stc MOD,<REG_N> */{"stc",{A_MOD,A_REG_N},{HEX_0,REG_N,HEX_5,HEX_2}, arch_sh_dsp_up},
69676cad711SPaolo Bonzini
69776cad711SPaolo Bonzini /* 0000nnnn01110010 stc RE,<REG_N> */{"stc",{A_RE,A_REG_N},{HEX_0,REG_N,HEX_7,HEX_2}, arch_sh_dsp_up},
69876cad711SPaolo Bonzini
69976cad711SPaolo Bonzini /* 0000nnnn01100010 stc RS,<REG_N> */{"stc",{A_RS,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_2}, arch_sh_dsp_up},
70076cad711SPaolo Bonzini
70176cad711SPaolo Bonzini /* 0000nnnn00110010 stc SSR,<REG_N> */{"stc",{A_SSR,A_REG_N},{HEX_0,REG_N,HEX_3,HEX_2}, arch_sh3_nommu_up},
70276cad711SPaolo Bonzini
70376cad711SPaolo Bonzini /* 0000nnnn01000010 stc SPC,<REG_N> */{"stc",{A_SPC,A_REG_N},{HEX_0,REG_N,HEX_4,HEX_2}, arch_sh3_nommu_up},
70476cad711SPaolo Bonzini
70576cad711SPaolo Bonzini /* 0000nnnn00111010 stc SGR,<REG_N> */{"stc",{A_SGR,A_REG_N},{HEX_0,REG_N,HEX_3,HEX_A}, arch_sh4_nommu_nofpu_up},
70676cad711SPaolo Bonzini
70776cad711SPaolo Bonzini /* 0000nnnn11111010 stc DBR,<REG_N> */{"stc",{A_DBR,A_REG_N},{HEX_0,REG_N,HEX_F,HEX_A}, arch_sh4_nommu_nofpu_up},
70876cad711SPaolo Bonzini
70976cad711SPaolo Bonzini /* 0000nnnn1xxx0010 stc Rn_BANK,<REG_N> */{"stc",{A_REG_B,A_REG_N},{HEX_0,REG_N,REG_B,HEX_2}, arch_sh3_nommu_up},
71076cad711SPaolo Bonzini
71176cad711SPaolo Bonzini /* 0000nnnn01001010 stc TBR,<REG_N> */ {"stc",{A_TBR,A_REG_N},{HEX_0,REG_N,HEX_4,HEX_A}, arch_sh2a_nofpu_up},
71276cad711SPaolo Bonzini
71376cad711SPaolo Bonzini /* 0100nnnn00000011 stc.l SR,@-<REG_N> */{"stc.l",{A_SR,A_DEC_N},{HEX_4,REG_N,HEX_0,HEX_3}, arch_sh1_up},
71476cad711SPaolo Bonzini
71576cad711SPaolo Bonzini /* 0100nnnn00100011 stc.l VBR,@-<REG_N> */{"stc.l",{A_VBR,A_DEC_N},{HEX_4,REG_N,HEX_2,HEX_3}, arch_sh1_up},
71676cad711SPaolo Bonzini
71776cad711SPaolo Bonzini /* 0100nnnn01010011 stc.l MOD,@-<REG_N> */{"stc.l",{A_MOD,A_DEC_N},{HEX_4,REG_N,HEX_5,HEX_3}, arch_sh_dsp_up},
71876cad711SPaolo Bonzini
71976cad711SPaolo Bonzini /* 0100nnnn01110011 stc.l RE,@-<REG_N> */{"stc.l",{A_RE,A_DEC_N},{HEX_4,REG_N,HEX_7,HEX_3}, arch_sh_dsp_up},
72076cad711SPaolo Bonzini
72176cad711SPaolo Bonzini /* 0100nnnn01100011 stc.l RS,@-<REG_N> */{"stc.l",{A_RS,A_DEC_N},{HEX_4,REG_N,HEX_6,HEX_3}, arch_sh_dsp_up},
72276cad711SPaolo Bonzini
72376cad711SPaolo Bonzini /* 0100nnnn00110011 stc.l SSR,@-<REG_N> */{"stc.l",{A_SSR,A_DEC_N},{HEX_4,REG_N,HEX_3,HEX_3}, arch_sh3_nommu_up},
72476cad711SPaolo Bonzini
72576cad711SPaolo Bonzini /* 0100nnnn01000011 stc.l SPC,@-<REG_N> */{"stc.l",{A_SPC,A_DEC_N},{HEX_4,REG_N,HEX_4,HEX_3}, arch_sh3_nommu_up},
72676cad711SPaolo Bonzini
72776cad711SPaolo Bonzini /* 0100nnnn00010011 stc.l GBR,@-<REG_N> */{"stc.l",{A_GBR,A_DEC_N},{HEX_4,REG_N,HEX_1,HEX_3}, arch_sh1_up},
72876cad711SPaolo Bonzini
72976cad711SPaolo Bonzini /* 0100nnnn00110010 stc.l SGR,@-<REG_N> */{"stc.l",{A_SGR,A_DEC_N},{HEX_4,REG_N,HEX_3,HEX_2}, arch_sh4_nommu_nofpu_up},
73076cad711SPaolo Bonzini
73176cad711SPaolo Bonzini /* 0100nnnn11110010 stc.l DBR,@-<REG_N> */{"stc.l",{A_DBR,A_DEC_N},{HEX_4,REG_N,HEX_F,HEX_2}, arch_sh4_nommu_nofpu_up},
73276cad711SPaolo Bonzini
73376cad711SPaolo Bonzini /* 0100nnnn1xxx0011 stc.l Rn_BANK,@-<REG_N> */{"stc.l",{A_REG_B,A_DEC_N},{HEX_4,REG_N,REG_B,HEX_3}, arch_sh3_nommu_up},
73476cad711SPaolo Bonzini
73576cad711SPaolo Bonzini /* 0000nnnn00001010 sts MACH,<REG_N> */{"sts",{A_MACH,A_REG_N},{HEX_0,REG_N,HEX_0,HEX_A}, arch_sh1_up},
73676cad711SPaolo Bonzini
73776cad711SPaolo Bonzini /* 0000nnnn00011010 sts MACL,<REG_N> */{"sts",{A_MACL,A_REG_N},{HEX_0,REG_N,HEX_1,HEX_A}, arch_sh1_up},
73876cad711SPaolo Bonzini
73976cad711SPaolo Bonzini /* 0000nnnn00101010 sts PR,<REG_N> */{"sts",{A_PR,A_REG_N},{HEX_0,REG_N,HEX_2,HEX_A}, arch_sh1_up},
74076cad711SPaolo Bonzini
74176cad711SPaolo Bonzini /* 0000nnnn01101010 sts DSR,<REG_N> */{"sts",{A_DSR,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_A}, arch_sh_dsp_up},
74276cad711SPaolo Bonzini
74376cad711SPaolo Bonzini /* 0000nnnn01111010 sts A0,<REG_N> */{"sts",{A_A0,A_REG_N},{HEX_0,REG_N,HEX_7,HEX_A}, arch_sh_dsp_up},
74476cad711SPaolo Bonzini
74576cad711SPaolo Bonzini /* 0000nnnn10001010 sts X0,<REG_N> */{"sts",{A_X0,A_REG_N},{HEX_0,REG_N,HEX_8,HEX_A}, arch_sh_dsp_up},
74676cad711SPaolo Bonzini
74776cad711SPaolo Bonzini /* 0000nnnn10011010 sts X1,<REG_N> */{"sts",{A_X1,A_REG_N},{HEX_0,REG_N,HEX_9,HEX_A}, arch_sh_dsp_up},
74876cad711SPaolo Bonzini
74976cad711SPaolo Bonzini /* 0000nnnn10101010 sts Y0,<REG_N> */{"sts",{A_Y0,A_REG_N},{HEX_0,REG_N,HEX_A,HEX_A}, arch_sh_dsp_up},
75076cad711SPaolo Bonzini
75176cad711SPaolo Bonzini /* 0000nnnn10111010 sts Y1,<REG_N> */{"sts",{A_Y1,A_REG_N},{HEX_0,REG_N,HEX_B,HEX_A}, arch_sh_dsp_up},
75276cad711SPaolo Bonzini
75376cad711SPaolo Bonzini /* 0000nnnn01011010 sts FPUL,<REG_N> */{"sts",{FPUL_M,A_REG_N},{HEX_0,REG_N,HEX_5,HEX_A}, arch_sh2e_up},
75476cad711SPaolo Bonzini
75576cad711SPaolo Bonzini /* 0000nnnn01101010 sts FPSCR,<REG_N> */{"sts",{FPSCR_M,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_A}, arch_sh2e_up},
75676cad711SPaolo Bonzini
75776cad711SPaolo Bonzini /* 0100nnnn00000010 sts.l MACH,@-<REG_N>*/{"sts.l",{A_MACH,A_DEC_N},{HEX_4,REG_N,HEX_0,HEX_2}, arch_sh1_up},
75876cad711SPaolo Bonzini
75976cad711SPaolo Bonzini /* 0100nnnn00010010 sts.l MACL,@-<REG_N>*/{"sts.l",{A_MACL,A_DEC_N},{HEX_4,REG_N,HEX_1,HEX_2}, arch_sh1_up},
76076cad711SPaolo Bonzini
76176cad711SPaolo Bonzini /* 0100nnnn00100010 sts.l PR,@-<REG_N> */{"sts.l",{A_PR,A_DEC_N},{HEX_4,REG_N,HEX_2,HEX_2}, arch_sh1_up},
76276cad711SPaolo Bonzini
76376cad711SPaolo Bonzini /* 0100nnnn01100110 sts.l DSR,@-<REG_N> */{"sts.l",{A_DSR,A_DEC_N},{HEX_4,REG_N,HEX_6,HEX_2}, arch_sh_dsp_up},
76476cad711SPaolo Bonzini
76576cad711SPaolo Bonzini /* 0100nnnn01110110 sts.l A0,@-<REG_N> */{"sts.l",{A_A0,A_DEC_N},{HEX_4,REG_N,HEX_7,HEX_2}, arch_sh_dsp_up},
76676cad711SPaolo Bonzini
76776cad711SPaolo Bonzini /* 0100nnnn10000110 sts.l X0,@-<REG_N> */{"sts.l",{A_X0,A_DEC_N},{HEX_4,REG_N,HEX_8,HEX_2}, arch_sh_dsp_up},
76876cad711SPaolo Bonzini
76976cad711SPaolo Bonzini /* 0100nnnn10010110 sts.l X1,@-<REG_N> */{"sts.l",{A_X1,A_DEC_N},{HEX_4,REG_N,HEX_9,HEX_2}, arch_sh_dsp_up},
77076cad711SPaolo Bonzini
77176cad711SPaolo Bonzini /* 0100nnnn10100110 sts.l Y0,@-<REG_N> */{"sts.l",{A_Y0,A_DEC_N},{HEX_4,REG_N,HEX_A,HEX_2}, arch_sh_dsp_up},
77276cad711SPaolo Bonzini
77376cad711SPaolo Bonzini /* 0100nnnn10110110 sts.l Y1,@-<REG_N> */{"sts.l",{A_Y1,A_DEC_N},{HEX_4,REG_N,HEX_B,HEX_2}, arch_sh_dsp_up},
77476cad711SPaolo Bonzini
77576cad711SPaolo Bonzini /* 0100nnnn01010010 sts.l FPUL,@-<REG_N>*/{"sts.l",{FPUL_M,A_DEC_N},{HEX_4,REG_N,HEX_5,HEX_2}, arch_sh2e_up},
77676cad711SPaolo Bonzini
77776cad711SPaolo Bonzini /* 0100nnnn01100010 sts.l FPSCR,@-<REG_N>*/{"sts.l",{FPSCR_M,A_DEC_N},{HEX_4,REG_N,HEX_6,HEX_2}, arch_sh2e_up},
77876cad711SPaolo Bonzini
77976cad711SPaolo Bonzini /* 0011nnnnmmmm1000 sub <REG_M>,<REG_N> */{"sub",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_8}, arch_sh1_up},
78076cad711SPaolo Bonzini
78176cad711SPaolo Bonzini /* 0011nnnnmmmm1010 subc <REG_M>,<REG_N>*/{"subc",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_A}, arch_sh1_up},
78276cad711SPaolo Bonzini
78376cad711SPaolo Bonzini /* 0011nnnnmmmm1011 subv <REG_M>,<REG_N>*/{"subv",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_B}, arch_sh1_up},
78476cad711SPaolo Bonzini
78576cad711SPaolo Bonzini /* 0110nnnnmmmm1000 swap.b <REG_M>,<REG_N>*/{"swap.b",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_8}, arch_sh1_up},
78676cad711SPaolo Bonzini
78776cad711SPaolo Bonzini /* 0110nnnnmmmm1001 swap.w <REG_M>,<REG_N>*/{"swap.w",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_9}, arch_sh1_up},
78876cad711SPaolo Bonzini
78976cad711SPaolo Bonzini /* 0000000010101011 synco */{"synco",{0},{HEX_0,HEX_0,HEX_A,HEX_B}, arch_sh4a_nofp_up},
79076cad711SPaolo Bonzini
79176cad711SPaolo Bonzini /* 0100nnnn00011011 tas.b @<REG_N> */{"tas.b",{A_IND_N},{HEX_4,REG_N,HEX_1,HEX_B}, arch_sh1_up},
79276cad711SPaolo Bonzini
79376cad711SPaolo Bonzini /* 11000011i8*1.... trapa #<imm> */{"trapa",{A_IMM},{HEX_C,HEX_3,IMM0_8}, arch_sh1_up},
79476cad711SPaolo Bonzini
79576cad711SPaolo Bonzini /* 11001000i8*1.... tst #<imm>,R0 */{"tst",{A_IMM,A_R0},{HEX_C,HEX_8,IMM0_8}, arch_sh1_up},
79676cad711SPaolo Bonzini
79776cad711SPaolo Bonzini /* 0010nnnnmmmm1000 tst <REG_M>,<REG_N> */{"tst",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_8}, arch_sh1_up},
79876cad711SPaolo Bonzini
79976cad711SPaolo Bonzini /* 11001100i8*1.... tst.b #<imm>,@(R0,GBR)*/{"tst.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_C,IMM0_8}, arch_sh1_up},
80076cad711SPaolo Bonzini
80176cad711SPaolo Bonzini /* 11001010i8*1.... xor #<imm>,R0 */{"xor",{A_IMM,A_R0},{HEX_C,HEX_A,IMM0_8}, arch_sh1_up},
80276cad711SPaolo Bonzini
80376cad711SPaolo Bonzini /* 0010nnnnmmmm1010 xor <REG_M>,<REG_N> */{"xor",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_A}, arch_sh1_up},
80476cad711SPaolo Bonzini
80576cad711SPaolo Bonzini /* 11001110i8*1.... xor.b #<imm>,@(R0,GBR)*/{"xor.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_E,IMM0_8}, arch_sh1_up},
80676cad711SPaolo Bonzini
80776cad711SPaolo Bonzini /* 0010nnnnmmmm1101 xtrct <REG_M>,<REG_N>*/{"xtrct",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_D}, arch_sh1_up},
80876cad711SPaolo Bonzini
80976cad711SPaolo Bonzini /* 0000nnnnmmmm0111 mul.l <REG_M>,<REG_N>*/{"mul.l",{ A_REG_M,A_REG_N},{HEX_0,REG_N,REG_M,HEX_7}, arch_sh1_up},
81076cad711SPaolo Bonzini
81176cad711SPaolo Bonzini /* 0100nnnn00010000 dt <REG_N> */{"dt",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_0}, arch_sh2_up},
81276cad711SPaolo Bonzini
81376cad711SPaolo Bonzini /* 0011nnnnmmmm1101 dmuls.l <REG_M>,<REG_N>*/{"dmuls.l",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_D}, arch_sh2_up},
81476cad711SPaolo Bonzini
81576cad711SPaolo Bonzini /* 0011nnnnmmmm0101 dmulu.l <REG_M>,<REG_N>*/{"dmulu.l",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_5}, arch_sh2_up},
81676cad711SPaolo Bonzini
81776cad711SPaolo Bonzini /* 0000nnnnmmmm1111 mac.l @<REG_M>+,@<REG_N>+*/{"mac.l",{A_INC_M,A_INC_N},{HEX_0,REG_N,REG_M,HEX_F}, arch_sh2_up},
81876cad711SPaolo Bonzini
81976cad711SPaolo Bonzini /* 0000nnnn00100011 braf <REG_N> */{"braf",{A_REG_N},{HEX_0,REG_N,HEX_2,HEX_3}, arch_sh2_up},
82076cad711SPaolo Bonzini
82176cad711SPaolo Bonzini /* 0000nnnn00000011 bsrf <REG_N> */{"bsrf",{A_REG_N},{HEX_0,REG_N,HEX_0,HEX_3}, arch_sh2_up},
82276cad711SPaolo Bonzini
82376cad711SPaolo Bonzini /* 111101nnmmmm0000 movs.w @-<REG_N>,<DSP_REG_M> */ {"movs.w",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_0}, arch_sh_dsp_up},
82476cad711SPaolo Bonzini
82576cad711SPaolo Bonzini /* 111101nnmmmm0001 movs.w @<REG_N>,<DSP_REG_M> */ {"movs.w",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_4}, arch_sh_dsp_up},
82676cad711SPaolo Bonzini
82776cad711SPaolo Bonzini /* 111101nnmmmm0010 movs.w @<REG_N>+,<DSP_REG_M> */ {"movs.w",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_8}, arch_sh_dsp_up},
82876cad711SPaolo Bonzini
82976cad711SPaolo Bonzini /* 111101nnmmmm0011 movs.w @<REG_N>+r8,<DSP_REG_M> */ {"movs.w",{AS_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_C}, arch_sh_dsp_up},
83076cad711SPaolo Bonzini
83176cad711SPaolo Bonzini /* 111101nnmmmm0100 movs.w <DSP_REG_M>,@-<REG_N> */ {"movs.w",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_1}, arch_sh_dsp_up},
83276cad711SPaolo Bonzini
83376cad711SPaolo Bonzini /* 111101nnmmmm0101 movs.w <DSP_REG_M>,@<REG_N> */ {"movs.w",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_5}, arch_sh_dsp_up},
83476cad711SPaolo Bonzini
83576cad711SPaolo Bonzini /* 111101nnmmmm0110 movs.w <DSP_REG_M>,@<REG_N>+ */ {"movs.w",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_9}, arch_sh_dsp_up},
83676cad711SPaolo Bonzini
83776cad711SPaolo Bonzini /* 111101nnmmmm0111 movs.w <DSP_REG_M>,@<REG_N>+r8 */ {"movs.w",{DSP_REG_M,AS_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_D}, arch_sh_dsp_up},
83876cad711SPaolo Bonzini
83976cad711SPaolo Bonzini /* 111101nnmmmm1000 movs.l @-<REG_N>,<DSP_REG_M> */ {"movs.l",{A_DEC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_2}, arch_sh_dsp_up},
84076cad711SPaolo Bonzini
84176cad711SPaolo Bonzini /* 111101nnmmmm1001 movs.l @<REG_N>,<DSP_REG_M> */ {"movs.l",{A_IND_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_6}, arch_sh_dsp_up},
84276cad711SPaolo Bonzini
84376cad711SPaolo Bonzini /* 111101nnmmmm1010 movs.l @<REG_N>+,<DSP_REG_M> */ {"movs.l",{A_INC_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_A}, arch_sh_dsp_up},
84476cad711SPaolo Bonzini
84576cad711SPaolo Bonzini /* 111101nnmmmm1011 movs.l @<REG_N>+r8,<DSP_REG_M> */ {"movs.l",{AS_PMOD_N,DSP_REG_M},{HEX_F,SDT_REG_N,REG_M,HEX_E}, arch_sh_dsp_up},
84676cad711SPaolo Bonzini
84776cad711SPaolo Bonzini /* 111101nnmmmm1100 movs.l <DSP_REG_M>,@-<REG_N> */ {"movs.l",{DSP_REG_M,A_DEC_N},{HEX_F,SDT_REG_N,REG_M,HEX_3}, arch_sh_dsp_up},
84876cad711SPaolo Bonzini
84976cad711SPaolo Bonzini /* 111101nnmmmm1101 movs.l <DSP_REG_M>,@<REG_N> */ {"movs.l",{DSP_REG_M,A_IND_N},{HEX_F,SDT_REG_N,REG_M,HEX_7}, arch_sh_dsp_up},
85076cad711SPaolo Bonzini
85176cad711SPaolo Bonzini /* 111101nnmmmm1110 movs.l <DSP_REG_M>,@<REG_N>+ */ {"movs.l",{DSP_REG_M,A_INC_N},{HEX_F,SDT_REG_N,REG_M,HEX_B}, arch_sh_dsp_up},
85276cad711SPaolo Bonzini
85376cad711SPaolo Bonzini /* 111101nnmmmm1111 movs.l <DSP_REG_M>,@<REG_N>+r8 */ {"movs.l",{DSP_REG_M,AS_PMOD_N},{HEX_F,SDT_REG_N,REG_M,HEX_F}, arch_sh_dsp_up},
85476cad711SPaolo Bonzini
85576cad711SPaolo Bonzini /* 0*0*0*00** nopx */ {"nopx",{0},{PPI,NOPX}, arch_sh_dsp_up},
85676cad711SPaolo Bonzini /* *0*0*0**00 nopy */ {"nopy",{0},{PPI,NOPY}, arch_sh_dsp_up},
85776cad711SPaolo Bonzini /* n*m*0*01** movx.w @<REG_N>,<DSP_REG_X> */ {"movx.w",{AX_IND_N,DSP_REG_X},{PPI,MOVX,HEX_1}, arch_sh_dsp_up},
85876cad711SPaolo Bonzini /* n*m*0*10** movx.w @<REG_N>+,<DSP_REG_X> */ {"movx.w",{AX_INC_N,DSP_REG_X},{PPI,MOVX,HEX_2}, arch_sh_dsp_up},
85976cad711SPaolo Bonzini /* n*m*0*11** movx.w @<REG_N>+r8,<DSP_REG_X> */ {"movx.w",{AX_PMOD_N,DSP_REG_X},{PPI,MOVX,HEX_3}, arch_sh_dsp_up},
86076cad711SPaolo Bonzini /* n*m*1*01** movx.w <DSP_REG_M>,@<REG_N> */ {"movx.w",{DSP_REG_A_M,AX_IND_N},{PPI,MOVX,HEX_9}, arch_sh_dsp_up},
86176cad711SPaolo Bonzini /* n*m*1*10** movx.w <DSP_REG_M>,@<REG_N>+ */ {"movx.w",{DSP_REG_A_M,AX_INC_N},{PPI,MOVX,HEX_A}, arch_sh_dsp_up},
86276cad711SPaolo Bonzini /* n*m*1*11** movx.w <DSP_REG_M>,@<REG_N>+r8 */ {"movx.w",{DSP_REG_A_M,AX_PMOD_N},{PPI,MOVX,HEX_B}, arch_sh_dsp_up},
86376cad711SPaolo Bonzini
86476cad711SPaolo Bonzini /* nnmm000100 movx.w @<REG_Axy>,<DSP_REG_XY> */ {"movx.w",{AXY_IND_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_0,HEX_4}, arch_sh4al_dsp_up},
86576cad711SPaolo Bonzini /* nnmm001000 movx.w @<REG_Axy>+,<DSP_REG_XY> */{"movx.w",{AXY_INC_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_0,HEX_8}, arch_sh4al_dsp_up},
86676cad711SPaolo Bonzini /* nnmm001100 movx.w @<REG_Axy>+r8,<DSP_REG_XY> */{"movx.w",{AXY_PMOD_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_0,HEX_C}, arch_sh4al_dsp_up},
86776cad711SPaolo Bonzini /* nnmm100100 movx.w <DSP_REG_AX>,@<REG_Axy> */ {"movx.w",{DSP_REG_AX,AXY_IND_N},{PPI,MOVX_NOPY,HEX_2,HEX_4}, arch_sh4al_dsp_up},
86876cad711SPaolo Bonzini /* nnmm101000 movx.w <DSP_REG_AX>,@<REG_Axy>+ */{"movx.w",{DSP_REG_AX,AXY_INC_N},{PPI,MOVX_NOPY,HEX_2,HEX_8}, arch_sh4al_dsp_up},
86976cad711SPaolo Bonzini /* nnmm101100 movx.w <DSP_REG_AX>,@<REG_Axy>+r8 */{"movx.w",{DSP_REG_AX,AXY_PMOD_N},{PPI,MOVX_NOPY,HEX_2,HEX_C}, arch_sh4al_dsp_up},
87076cad711SPaolo Bonzini
87176cad711SPaolo Bonzini /* nnmm010100 movx.l @<REG_Axy>,<DSP_REG_XY> */ {"movx.l",{AXY_IND_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_1,HEX_4}, arch_sh4al_dsp_up},
87276cad711SPaolo Bonzini /* nnmm011000 movx.l @<REG_Axy>+,<DSP_REG_XY> */{"movx.l",{AXY_INC_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_1,HEX_8}, arch_sh4al_dsp_up},
87376cad711SPaolo Bonzini /* nnmm011100 movx.l @<REG_Axy>+r8,<DSP_REG_XY> */{"movx.l",{AXY_PMOD_N,DSP_REG_XY},{PPI,MOVX_NOPY,HEX_1,HEX_C}, arch_sh4al_dsp_up},
87476cad711SPaolo Bonzini /* nnmm110100 movx.l <DSP_REG_AX>,@<REG_Axy> */ {"movx.l",{DSP_REG_AX,AXY_IND_N},{PPI,MOVX_NOPY,HEX_3,HEX_4}, arch_sh4al_dsp_up},
87576cad711SPaolo Bonzini /* nnmm111000 movx.l <DSP_REG_AX>,@<REG_Axy>+ */{"movx.l",{DSP_REG_AX,AXY_INC_N},{PPI,MOVX_NOPY,HEX_3,HEX_8}, arch_sh4al_dsp_up},
87676cad711SPaolo Bonzini /* nnmm111100 movx.l <DSP_REG_AX>,@<REG_Axy>+r8 */{"movx.l",{DSP_REG_AX,AXY_PMOD_N},{PPI,MOVX_NOPY,HEX_3,HEX_C}, arch_sh4al_dsp_up},
87776cad711SPaolo Bonzini
87876cad711SPaolo Bonzini /* *n*m*0**01 movy.w @<REG_N>,<DSP_REG_Y> */ {"movy.w",{AY_IND_N,DSP_REG_Y},{PPI,MOVY,HEX_1}, arch_sh_dsp_up},
87976cad711SPaolo Bonzini /* *n*m*0**10 movy.w @<REG_N>+,<DSP_REG_Y> */ {"movy.w",{AY_INC_N,DSP_REG_Y},{PPI,MOVY,HEX_2}, arch_sh_dsp_up},
88076cad711SPaolo Bonzini /* *n*m*0**11 movy.w @<REG_N>+r9,<DSP_REG_Y> */ {"movy.w",{AY_PMOD_N,DSP_REG_Y},{PPI,MOVY,HEX_3}, arch_sh_dsp_up},
88176cad711SPaolo Bonzini /* *n*m*1**01 movy.w <DSP_REG_M>,@<REG_N> */ {"movy.w",{DSP_REG_A_M,AY_IND_N},{PPI,MOVY,HEX_9}, arch_sh_dsp_up},
88276cad711SPaolo Bonzini /* *n*m*1**10 movy.w <DSP_REG_M>,@<REG_N>+ */ {"movy.w",{DSP_REG_A_M,AY_INC_N},{PPI,MOVY,HEX_A}, arch_sh_dsp_up},
88376cad711SPaolo Bonzini /* *n*m*1**11 movy.w <DSP_REG_M>,@<REG_N>+r9 */ {"movy.w",{DSP_REG_A_M,AY_PMOD_N},{PPI,MOVY,HEX_B}, arch_sh_dsp_up},
88476cad711SPaolo Bonzini
88576cad711SPaolo Bonzini /* nnmm000001 movy.w @<REG_Ayx>,<DSP_REG_YX> */ {"movy.w",{AYX_IND_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_0,HEX_1}, arch_sh4al_dsp_up},
88676cad711SPaolo Bonzini /* nnmm000010 movy.w @<REG_Ayx>+,<DSP_REG_YX> */{"movy.w",{AYX_INC_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_0,HEX_2}, arch_sh4al_dsp_up},
88776cad711SPaolo Bonzini /* nnmm000011 movy.w @<REG_Ayx>+r8,<DSP_REG_YX> */{"movy.w",{AYX_PMOD_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_0,HEX_3}, arch_sh4al_dsp_up},
88876cad711SPaolo Bonzini /* nnmm010001 movy.w <DSP_REG_AY>,@<REG_Ayx> */ {"movy.w",{DSP_REG_AY,AYX_IND_N},{PPI,MOVY_NOPX,HEX_1,HEX_1}, arch_sh4al_dsp_up},
88976cad711SPaolo Bonzini /* nnmm010010 movy.w <DSP_REG_AY>,@<REG_Ayx>+ */{"movy.w",{DSP_REG_AY,AYX_INC_N},{PPI,MOVY_NOPX,HEX_1,HEX_2}, arch_sh4al_dsp_up},
89076cad711SPaolo Bonzini /* nnmm010011 movy.w <DSP_REG_AY>,@<REG_Ayx>+r8 */{"movy.w",{DSP_REG_AY,AYX_PMOD_N},{PPI,MOVY_NOPX,HEX_1,HEX_3}, arch_sh4al_dsp_up},
89176cad711SPaolo Bonzini
89276cad711SPaolo Bonzini /* nnmm100001 movy.l @<REG_Ayx>,<DSP_REG_YX> */ {"movy.l",{AYX_IND_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_2,HEX_1}, arch_sh4al_dsp_up},
89376cad711SPaolo Bonzini /* nnmm100010 movy.l @<REG_Ayx>+,<DSP_REG_YX> */{"movy.l",{AYX_INC_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_2,HEX_2}, arch_sh4al_dsp_up},
89476cad711SPaolo Bonzini /* nnmm100011 movy.l @<REG_Ayx>+r8,<DSP_REG_YX> */{"movy.l",{AYX_PMOD_N,DSP_REG_YX},{PPI,MOVY_NOPX,HEX_2,HEX_3}, arch_sh4al_dsp_up},
89576cad711SPaolo Bonzini /* nnmm110001 movy.l <DSP_REG_AY>,@<REG_Ayx> */ {"movy.l",{DSP_REG_AY,AYX_IND_N},{PPI,MOVY_NOPX,HEX_3,HEX_1}, arch_sh4al_dsp_up},
89676cad711SPaolo Bonzini /* nnmm110010 movy.l <DSP_REG_AY>,@<REG_Ayx>+ */{"movy.l",{DSP_REG_AY,AYX_INC_N},{PPI,MOVY_NOPX,HEX_3,HEX_2}, arch_sh4al_dsp_up},
89776cad711SPaolo Bonzini /* nnmm110011 movy.l <DSP_REG_AY>,@<REG_Ayx>+r8 */{"movy.l",{DSP_REG_AY,AYX_PMOD_N},{PPI,MOVY_NOPX,HEX_3,HEX_3}, arch_sh4al_dsp_up},
89876cad711SPaolo Bonzini
89976cad711SPaolo Bonzini /* 01aaeeffxxyyggnn pmuls Se,Sf,Dg */ {"pmuls",{DSP_REG_E,DSP_REG_F,DSP_REG_G},{PPI,PMUL}, arch_sh_dsp_up},
90076cad711SPaolo Bonzini /* 10100000xxyynnnn psubc <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
90176cad711SPaolo Bonzini {"psubc",{DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_A,HEX_0}, arch_sh_dsp_up},
90276cad711SPaolo Bonzini /* 10110000xxyynnnn paddc <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
90376cad711SPaolo Bonzini {"paddc",{DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_B,HEX_0}, arch_sh_dsp_up},
90476cad711SPaolo Bonzini /* 10000100xxyynnnn pcmp <DSP_REG_X>,<DSP_REG_Y> */
90576cad711SPaolo Bonzini {"pcmp", {DSP_REG_X,DSP_REG_Y},{PPI,PPI3,HEX_8,HEX_4}, arch_sh_dsp_up},
90676cad711SPaolo Bonzini /* 10100100xxyynnnn pwsb <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
90776cad711SPaolo Bonzini {"pwsb", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_A,HEX_4}, arch_sh_dsp_up},
90876cad711SPaolo Bonzini /* 10110100xxyynnnn pwad <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
90976cad711SPaolo Bonzini {"pwad", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_B,HEX_4}, arch_sh_dsp_up},
91076cad711SPaolo Bonzini /* 10001000xxyynnnn pabs <DSP_REG_X>,<DSP_REG_N> */
91176cad711SPaolo Bonzini {"pabs", {DSP_REG_X,DSP_REG_N},{PPI,PPI3NC,HEX_8,HEX_8}, arch_sh_dsp_up},
91276cad711SPaolo Bonzini /* 1000100!xx01nnnn pabs <DSP_REG_X>,<DSP_REG_N> */
91376cad711SPaolo Bonzini {"pabs", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_9,HEX_1}, arch_sh4al_dsp_up},
91476cad711SPaolo Bonzini /* 10101000xxyynnnn pabs <DSP_REG_Y>,<DSP_REG_N> */
91576cad711SPaolo Bonzini {"pabs", {DSP_REG_Y,DSP_REG_N},{PPI,PPI3NC,HEX_A,HEX_8}, arch_sh_dsp_up},
91676cad711SPaolo Bonzini /* 1010100!01yynnnn pabs <DSP_REG_Y>,<DSP_REG_N> */
91776cad711SPaolo Bonzini {"pabs", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_9,HEX_4}, arch_sh4al_dsp_up},
91876cad711SPaolo Bonzini /* 10011000xxyynnnn prnd <DSP_REG_X>,<DSP_REG_N> */
91976cad711SPaolo Bonzini {"prnd", {DSP_REG_X,DSP_REG_N},{PPI,PPI3NC,HEX_9,HEX_8}, arch_sh_dsp_up},
92076cad711SPaolo Bonzini /* 1001100!xx01nnnn prnd <DSP_REG_X>,<DSP_REG_N> */
92176cad711SPaolo Bonzini {"prnd", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_9,HEX_1}, arch_sh4al_dsp_up},
92276cad711SPaolo Bonzini /* 10111000xxyynnnn prnd <DSP_REG_Y>,<DSP_REG_N> */
92376cad711SPaolo Bonzini {"prnd", {DSP_REG_Y,DSP_REG_N},{PPI,PPI3NC,HEX_B,HEX_8}, arch_sh_dsp_up},
92476cad711SPaolo Bonzini /* 1011100!01yynnnn prnd <DSP_REG_Y>,<DSP_REG_N> */
92576cad711SPaolo Bonzini {"prnd", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_9,HEX_4}, arch_sh4al_dsp_up},
92676cad711SPaolo Bonzini
92776cad711SPaolo Bonzini {"dct",{0},{PPI,PDC,HEX_1}, arch_sh_dsp_up},
92876cad711SPaolo Bonzini {"dcf",{0},{PPI,PDC,HEX_2}, arch_sh_dsp_up},
92976cad711SPaolo Bonzini
93076cad711SPaolo Bonzini /* 10000001xxyynnnn pshl <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
93176cad711SPaolo Bonzini {"pshl", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_1}, arch_sh_dsp_up},
93276cad711SPaolo Bonzini /* 00000iiiiiiinnnn pshl #<imm>,<DSP_REG_N> */ {"pshl",{A_IMM,DSP_REG_N},{PPI,PSH,HEX_0}, arch_sh_dsp_up},
93376cad711SPaolo Bonzini /* 10010001xxyynnnn psha <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
93476cad711SPaolo Bonzini {"psha", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_1}, arch_sh_dsp_up},
93576cad711SPaolo Bonzini /* 00010iiiiiiinnnn psha #<imm>,<DSP_REG_N> */ {"psha",{A_IMM,DSP_REG_N},{PPI,PSH,HEX_1}, arch_sh_dsp_up},
93676cad711SPaolo Bonzini /* 10100001xxyynnnn psub <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
93776cad711SPaolo Bonzini {"psub", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_1}, arch_sh_dsp_up},
93876cad711SPaolo Bonzini /* 10000101xxyynnnn psub <DSP_REG_Y>,<DSP_REG_X>,<DSP_REG_N> */
93976cad711SPaolo Bonzini {"psub", {DSP_REG_Y,DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_5}, arch_sh4al_dsp_up},
94076cad711SPaolo Bonzini /* 10110001xxyynnnn padd <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
94176cad711SPaolo Bonzini {"padd", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_1}, arch_sh_dsp_up},
94276cad711SPaolo Bonzini /* 10010101xxyynnnn pand <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
94376cad711SPaolo Bonzini {"pand", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_5}, arch_sh_dsp_up},
94476cad711SPaolo Bonzini /* 10100101xxyynnnn pxor <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
94576cad711SPaolo Bonzini {"pxor", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_5}, arch_sh_dsp_up},
94676cad711SPaolo Bonzini /* 10110101xxyynnnn por <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */
94776cad711SPaolo Bonzini {"por", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_5}, arch_sh_dsp_up},
94876cad711SPaolo Bonzini /* 10001001xxyynnnn pdec <DSP_REG_X>,<DSP_REG_N> */
94976cad711SPaolo Bonzini {"pdec", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_9}, arch_sh_dsp_up},
95076cad711SPaolo Bonzini /* 10101001xxyynnnn pdec <DSP_REG_Y>,<DSP_REG_N> */
95176cad711SPaolo Bonzini {"pdec", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_9}, arch_sh_dsp_up},
95276cad711SPaolo Bonzini /* 10011001xx00nnnn pinc <DSP_REG_X>,<DSP_REG_N> */
95376cad711SPaolo Bonzini {"pinc", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_9,HEX_XX00}, arch_sh_dsp_up},
95476cad711SPaolo Bonzini /* 1011100100yynnnn pinc <DSP_REG_Y>,<DSP_REG_N> */
95576cad711SPaolo Bonzini {"pinc", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_9,HEX_00YY}, arch_sh_dsp_up},
95676cad711SPaolo Bonzini /* 10001101xxyynnnn pclr <DSP_REG_N> */
95776cad711SPaolo Bonzini {"pclr", {DSP_REG_N},{PPI,PPIC,HEX_8,HEX_D}, arch_sh_dsp_up},
95876cad711SPaolo Bonzini /* 10011101xx00nnnn pdmsb <DSP_REG_X>,<DSP_REG_N> */
95976cad711SPaolo Bonzini {"pdmsb", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_D,HEX_XX00}, arch_sh_dsp_up},
96076cad711SPaolo Bonzini /* 1011110100yynnnn pdmsb <DSP_REG_Y>,<DSP_REG_N> */
96176cad711SPaolo Bonzini {"pdmsb", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_D,HEX_00YY}, arch_sh_dsp_up},
96276cad711SPaolo Bonzini /* 11001001xxyynnnn pneg <DSP_REG_X>,<DSP_REG_N> */
96376cad711SPaolo Bonzini {"pneg", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_C,HEX_9}, arch_sh_dsp_up},
96476cad711SPaolo Bonzini /* 11101001xxyynnnn pneg <DSP_REG_Y>,<DSP_REG_N> */
96576cad711SPaolo Bonzini {"pneg", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_E,HEX_9}, arch_sh_dsp_up},
96676cad711SPaolo Bonzini /* 11011001xxyynnnn pcopy <DSP_REG_X>,<DSP_REG_N> */
96776cad711SPaolo Bonzini {"pcopy", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_D,HEX_9}, arch_sh_dsp_up},
96876cad711SPaolo Bonzini /* 11111001xxyynnnn pcopy <DSP_REG_Y>,<DSP_REG_N> */
96976cad711SPaolo Bonzini {"pcopy", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_F,HEX_9}, arch_sh_dsp_up},
97076cad711SPaolo Bonzini /* 11001101xxyynnnn psts MACH,<DSP_REG_N> */
97176cad711SPaolo Bonzini {"psts", {A_MACH,DSP_REG_N},{PPI,PPIC,HEX_C,HEX_D}, arch_sh_dsp_up},
97276cad711SPaolo Bonzini /* 11011101xxyynnnn psts MACL,<DSP_REG_N> */
97376cad711SPaolo Bonzini {"psts", {A_MACL,DSP_REG_N},{PPI,PPIC,HEX_D,HEX_D}, arch_sh_dsp_up},
97476cad711SPaolo Bonzini /* 11101101xxyynnnn plds <DSP_REG_N>,MACH */
97576cad711SPaolo Bonzini {"plds", {DSP_REG_N,A_MACH},{PPI,PPIC,HEX_E,HEX_D}, arch_sh_dsp_up},
97676cad711SPaolo Bonzini /* 11111101xxyynnnn plds <DSP_REG_N>,MACL */
97776cad711SPaolo Bonzini {"plds", {DSP_REG_N,A_MACL},{PPI,PPIC,HEX_F,HEX_D}, arch_sh_dsp_up},
97876cad711SPaolo Bonzini /* 10011101xx01zzzz pswap <DSP_REG_X>,<DSP_REG_N> */
97976cad711SPaolo Bonzini {"pswap", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_D,HEX_1}, arch_sh4al_dsp_up},
98076cad711SPaolo Bonzini /* 1011110101yyzzzz pswap <DSP_REG_Y>,<DSP_REG_N> */
98176cad711SPaolo Bonzini {"pswap", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_D,HEX_4}, arch_sh4al_dsp_up},
98276cad711SPaolo Bonzini
98376cad711SPaolo Bonzini /* 1111nnnn01011101 fabs <F_REG_N> */{"fabs",{F_REG_N},{HEX_F,REG_N,HEX_5,HEX_D}, arch_sh2e_up},
98476cad711SPaolo Bonzini /* 1111nnn001011101 fabs <D_REG_N> */{"fabs",{D_REG_N},{HEX_F,REG_N,HEX_5,HEX_D}, arch_sh4_up | arch_sh2a_up},
98576cad711SPaolo Bonzini
98676cad711SPaolo Bonzini /* 1111nnnnmmmm0000 fadd <F_REG_M>,<F_REG_N>*/{"fadd",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_0}, arch_sh2e_up},
98776cad711SPaolo Bonzini /* 1111nnn0mmm00000 fadd <D_REG_M>,<D_REG_N>*/{"fadd",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_0}, arch_sh4_up | arch_sh2a_up},
98876cad711SPaolo Bonzini
98976cad711SPaolo Bonzini /* 1111nnnnmmmm0100 fcmp/eq <F_REG_M>,<F_REG_N>*/{"fcmp/eq",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_4}, arch_sh2e_up},
99076cad711SPaolo Bonzini /* 1111nnn0mmm00100 fcmp/eq <D_REG_M>,<D_REG_N>*/{"fcmp/eq",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_4}, arch_sh4_up | arch_sh2a_up},
99176cad711SPaolo Bonzini
99276cad711SPaolo Bonzini /* 1111nnnnmmmm0101 fcmp/gt <F_REG_M>,<F_REG_N>*/{"fcmp/gt",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_5}, arch_sh2e_up},
99376cad711SPaolo Bonzini /* 1111nnn0mmm00101 fcmp/gt <D_REG_M>,<D_REG_N>*/{"fcmp/gt",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_5}, arch_sh4_up | arch_sh2a_up},
99476cad711SPaolo Bonzini
99576cad711SPaolo Bonzini /* 1111nnn010111101 fcnvds <D_REG_N>,FPUL*/{"fcnvds",{D_REG_N,FPUL_M},{HEX_F,REG_N_D,HEX_B,HEX_D}, arch_sh4_up | arch_sh2a_up},
99676cad711SPaolo Bonzini
99776cad711SPaolo Bonzini /* 1111nnn010101101 fcnvsd FPUL,<D_REG_N>*/{"fcnvsd",{FPUL_M,D_REG_N},{HEX_F,REG_N_D,HEX_A,HEX_D}, arch_sh4_up | arch_sh2a_up},
99876cad711SPaolo Bonzini
99976cad711SPaolo Bonzini /* 1111nnnnmmmm0011 fdiv <F_REG_M>,<F_REG_N>*/{"fdiv",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_3}, arch_sh2e_up},
100076cad711SPaolo Bonzini /* 1111nnn0mmm00011 fdiv <D_REG_M>,<D_REG_N>*/{"fdiv",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_3}, arch_sh4_up | arch_sh2a_up},
100176cad711SPaolo Bonzini
100276cad711SPaolo Bonzini /* 1111nnmm11101101 fipr <V_REG_M>,<V_REG_N>*/{"fipr",{V_REG_M,V_REG_N},{HEX_F,REG_NM,HEX_E,HEX_D}, arch_sh4_up},
100376cad711SPaolo Bonzini
100476cad711SPaolo Bonzini /* 1111nnnn10001101 fldi0 <F_REG_N> */{"fldi0",{F_REG_N},{HEX_F,REG_N,HEX_8,HEX_D}, arch_sh2e_up},
100576cad711SPaolo Bonzini
100676cad711SPaolo Bonzini /* 1111nnnn10011101 fldi1 <F_REG_N> */{"fldi1",{F_REG_N},{HEX_F,REG_N,HEX_9,HEX_D}, arch_sh2e_up},
100776cad711SPaolo Bonzini
100876cad711SPaolo Bonzini /* 1111nnnn00011101 flds <F_REG_N>,FPUL*/{"flds",{F_REG_N,FPUL_M},{HEX_F,REG_N,HEX_1,HEX_D}, arch_sh2e_up},
100976cad711SPaolo Bonzini
101076cad711SPaolo Bonzini /* 1111nnnn00101101 float FPUL,<F_REG_N>*/{"float",{FPUL_M,F_REG_N},{HEX_F,REG_N,HEX_2,HEX_D}, arch_sh2e_up},
101176cad711SPaolo Bonzini /* 1111nnn000101101 float FPUL,<D_REG_N>*/{"float",{FPUL_M,D_REG_N},{HEX_F,REG_N,HEX_2,HEX_D}, arch_sh4_up | arch_sh2a_up},
101276cad711SPaolo Bonzini
101376cad711SPaolo Bonzini /* 1111nnnnmmmm1110 fmac FR0,<F_REG_M>,<F_REG_N>*/{"fmac",{F_FR0,F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_E}, arch_sh2e_up},
101476cad711SPaolo Bonzini
101576cad711SPaolo Bonzini /* 1111nnnnmmmm1100 fmov <F_REG_M>,<F_REG_N>*/{"fmov",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_C}, arch_sh2e_up},
101676cad711SPaolo Bonzini /* 1111nnn1mmmm1100 fmov <DX_REG_M>,<DX_REG_N>*/{"fmov",{DX_REG_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_C}, arch_sh4_up | arch_sh2a_up},
101776cad711SPaolo Bonzini
101876cad711SPaolo Bonzini /* 1111nnnnmmmm1000 fmov @<REG_M>,<F_REG_N>*/{"fmov",{A_IND_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh2e_up},
101976cad711SPaolo Bonzini /* 1111nnn1mmmm1000 fmov @<REG_M>,<DX_REG_N>*/{"fmov",{A_IND_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh4_up | arch_sh2a_up},
102076cad711SPaolo Bonzini
102176cad711SPaolo Bonzini /* 1111nnnnmmmm1010 fmov <F_REG_M>,@<REG_N>*/{"fmov",{F_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh2e_up},
102276cad711SPaolo Bonzini /* 1111nnnnmmm11010 fmov <DX_REG_M>,@<REG_N>*/{"fmov",{DX_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh4_up | arch_sh2a_up},
102376cad711SPaolo Bonzini
102476cad711SPaolo Bonzini /* 1111nnnnmmmm1001 fmov @<REG_M>+,<F_REG_N>*/{"fmov",{A_INC_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh2e_up},
102576cad711SPaolo Bonzini /* 1111nnn1mmmm1001 fmov @<REG_M>+,<DX_REG_N>*/{"fmov",{A_INC_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh4_up | arch_sh2a_up},
102676cad711SPaolo Bonzini
102776cad711SPaolo Bonzini /* 1111nnnnmmmm1011 fmov <F_REG_M>,@-<REG_N>*/{"fmov",{F_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh2e_up},
102876cad711SPaolo Bonzini /* 1111nnnnmmm11011 fmov <DX_REG_M>,@-<REG_N>*/{"fmov",{DX_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh4_up | arch_sh2a_up},
102976cad711SPaolo Bonzini
103076cad711SPaolo Bonzini /* 1111nnnnmmmm0110 fmov @(R0,<REG_M>),<F_REG_N>*/{"fmov",{A_IND_R0_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh2e_up},
103176cad711SPaolo Bonzini /* 1111nnn1mmmm0110 fmov @(R0,<REG_M>),<DX_REG_N>*/{"fmov",{A_IND_R0_REG_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh4_up | arch_sh2a_up},
103276cad711SPaolo Bonzini
103376cad711SPaolo Bonzini /* 1111nnnnmmmm0111 fmov <F_REG_M>,@(R0,<REG_N>)*/{"fmov",{F_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh2e_up},
103476cad711SPaolo Bonzini /* 1111nnnnmmm10111 fmov <DX_REG_M>,@(R0,<REG_N>)*/{"fmov",{DX_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh4_up | arch_sh2a_up},
103576cad711SPaolo Bonzini
103676cad711SPaolo Bonzini /* 1111nnn1mmmm1000 fmov.d @<REG_M>,<DX_REG_N>*/{"fmov.d",{A_IND_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh4_up | arch_sh2a_up},
103776cad711SPaolo Bonzini
103876cad711SPaolo Bonzini /* 1111nnnnmmm11010 fmov.d <DX_REG_M>,@<REG_N>*/{"fmov.d",{DX_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh4_up | arch_sh2a_up},
103976cad711SPaolo Bonzini
104076cad711SPaolo Bonzini /* 1111nnn1mmmm1001 fmov.d @<REG_M>+,<DX_REG_N>*/{"fmov.d",{A_INC_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh4_up | arch_sh2a_up},
104176cad711SPaolo Bonzini
104276cad711SPaolo Bonzini /* 1111nnnnmmm11011 fmov.d <DX_REG_M>,@-<REG_N>*/{"fmov.d",{DX_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh4_up | arch_sh2a_up},
104376cad711SPaolo Bonzini
104476cad711SPaolo Bonzini /* 1111nnn1mmmm0110 fmov.d @(R0,<REG_M>),<DX_REG_N>*/{"fmov.d",{A_IND_R0_REG_M,DX_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh4_up | arch_sh2a_up},
104576cad711SPaolo Bonzini
104676cad711SPaolo Bonzini /* 1111nnnnmmm10111 fmov.d <DX_REG_M>,@(R0,<REG_N>)*/{"fmov.d",{DX_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh4_up | arch_sh2a_up},
104776cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0011dddddddddddd fmov.d <F_REG_M>,@(<DISP12>,<REG_N>) */
104876cad711SPaolo Bonzini {"fmov.d",{DX_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_3,DISP1_12BY8}, arch_sh2a_up | arch_op32},
104976cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0111dddddddddddd fmov.d @(<DISP12>,<REG_M>),F_REG_N */
105076cad711SPaolo Bonzini {"fmov.d",{A_DISP_REG_M,DX_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_7,DISP0_12BY8}, arch_sh2a_up | arch_op32},
105176cad711SPaolo Bonzini
105276cad711SPaolo Bonzini /* 1111nnnnmmmm1000 fmov.s @<REG_M>,<F_REG_N>*/{"fmov.s",{A_IND_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_8}, arch_sh2e_up},
105376cad711SPaolo Bonzini
105476cad711SPaolo Bonzini /* 1111nnnnmmmm1010 fmov.s <F_REG_M>,@<REG_N>*/{"fmov.s",{F_REG_M,A_IND_N},{HEX_F,REG_N,REG_M,HEX_A}, arch_sh2e_up},
105576cad711SPaolo Bonzini
105676cad711SPaolo Bonzini /* 1111nnnnmmmm1001 fmov.s @<REG_M>+,<F_REG_N>*/{"fmov.s",{A_INC_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_9}, arch_sh2e_up},
105776cad711SPaolo Bonzini
105876cad711SPaolo Bonzini /* 1111nnnnmmmm1011 fmov.s <F_REG_M>,@-<REG_N>*/{"fmov.s",{F_REG_M,A_DEC_N},{HEX_F,REG_N,REG_M,HEX_B}, arch_sh2e_up},
105976cad711SPaolo Bonzini
106076cad711SPaolo Bonzini /* 1111nnnnmmmm0110 fmov.s @(R0,<REG_M>),<F_REG_N>*/{"fmov.s",{A_IND_R0_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_6}, arch_sh2e_up},
106176cad711SPaolo Bonzini
106276cad711SPaolo Bonzini /* 1111nnnnmmmm0111 fmov.s <F_REG_M>,@(R0,<REG_N>)*/{"fmov.s",{F_REG_M,A_IND_R0_REG_N},{HEX_F,REG_N,REG_M,HEX_7}, arch_sh2e_up},
106376cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0011dddddddddddd fmov.s <F_REG_M>,@(<DISP12>,<REG_N>) */
106476cad711SPaolo Bonzini {"fmov.s",{F_REG_M,A_DISP_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_3,DISP1_12BY4}, arch_sh2a_up | arch_op32},
106576cad711SPaolo Bonzini /* 0011nnnnmmmm0001 0111dddddddddddd fmov.s @(<DISP12>,<REG_M>),F_REG_N */
106676cad711SPaolo Bonzini {"fmov.s",{A_DISP_REG_M,F_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_7,DISP0_12BY4}, arch_sh2a_up | arch_op32},
106776cad711SPaolo Bonzini
106876cad711SPaolo Bonzini /* 1111nnnnmmmm0010 fmul <F_REG_M>,<F_REG_N>*/{"fmul",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_2}, arch_sh2e_up},
106976cad711SPaolo Bonzini /* 1111nnn0mmm00010 fmul <D_REG_M>,<D_REG_N>*/{"fmul",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_2}, arch_sh4_up | arch_sh2a_up},
107076cad711SPaolo Bonzini
107176cad711SPaolo Bonzini /* 1111nnnn01001101 fneg <F_REG_N> */{"fneg",{F_REG_N},{HEX_F,REG_N,HEX_4,HEX_D}, arch_sh2e_up},
107276cad711SPaolo Bonzini /* 1111nnn001001101 fneg <D_REG_N> */{"fneg",{D_REG_N},{HEX_F,REG_N,HEX_4,HEX_D}, arch_sh4_up | arch_sh2a_up},
107376cad711SPaolo Bonzini
107476cad711SPaolo Bonzini /* 1111011111111101 fpchg */{"fpchg",{0},{HEX_F,HEX_7,HEX_F,HEX_D}, arch_sh4a_up},
107576cad711SPaolo Bonzini
107676cad711SPaolo Bonzini /* 1111101111111101 frchg */{"frchg",{0},{HEX_F,HEX_B,HEX_F,HEX_D}, arch_sh4_up},
107776cad711SPaolo Bonzini
107876cad711SPaolo Bonzini /* 1111nnn011111101 fsca FPUL,<D_REG_N> */{"fsca",{FPUL_M,D_REG_N},{HEX_F,REG_N_D,HEX_F,HEX_D}, arch_sh4_up},
107976cad711SPaolo Bonzini
108076cad711SPaolo Bonzini /* 1111001111111101 fschg */{"fschg",{0},{HEX_F,HEX_3,HEX_F,HEX_D}, arch_sh4_up | arch_sh2a_up},
108176cad711SPaolo Bonzini
108276cad711SPaolo Bonzini /* 1111nnnn01101101 fsqrt <F_REG_N> */{"fsqrt",{F_REG_N},{HEX_F,REG_N,HEX_6,HEX_D}, arch_sh3e_up | arch_sh2a_up},
108376cad711SPaolo Bonzini /* 1111nnn001101101 fsqrt <D_REG_N> */{"fsqrt",{D_REG_N},{HEX_F,REG_N,HEX_6,HEX_D}, arch_sh4_up | arch_sh2a_up},
108476cad711SPaolo Bonzini
108576cad711SPaolo Bonzini /* 1111nnnn01111101 fsrra <F_REG_N> */{"fsrra",{F_REG_N},{HEX_F,REG_N,HEX_7,HEX_D}, arch_sh4_up},
108676cad711SPaolo Bonzini
108776cad711SPaolo Bonzini /* 1111nnnn00001101 fsts FPUL,<F_REG_N>*/{"fsts",{FPUL_M,F_REG_N},{HEX_F,REG_N,HEX_0,HEX_D}, arch_sh2e_up},
108876cad711SPaolo Bonzini
108976cad711SPaolo Bonzini /* 1111nnnnmmmm0001 fsub <F_REG_M>,<F_REG_N>*/{"fsub",{F_REG_M,F_REG_N},{HEX_F,REG_N,REG_M,HEX_1}, arch_sh2e_up},
109076cad711SPaolo Bonzini /* 1111nnn0mmm00001 fsub <D_REG_M>,<D_REG_N>*/{"fsub",{D_REG_M,D_REG_N},{HEX_F,REG_N,REG_M,HEX_1}, arch_sh4_up | arch_sh2a_up},
109176cad711SPaolo Bonzini
109276cad711SPaolo Bonzini /* 1111nnnn00111101 ftrc <F_REG_N>,FPUL*/{"ftrc",{F_REG_N,FPUL_M},{HEX_F,REG_N,HEX_3,HEX_D}, arch_sh2e_up},
109376cad711SPaolo Bonzini /* 1111nnnn00111101 ftrc <D_REG_N>,FPUL*/{"ftrc",{D_REG_N,FPUL_M},{HEX_F,REG_N,HEX_3,HEX_D}, arch_sh4_up | arch_sh2a_up},
109476cad711SPaolo Bonzini
109576cad711SPaolo Bonzini /* 1111nn0111111101 ftrv XMTRX_M4,<V_REG_n>*/{"ftrv",{XMTRX_M4,V_REG_N},{HEX_F,REG_N_B01,HEX_F,HEX_D}, arch_sh4_up},
109676cad711SPaolo Bonzini
109776cad711SPaolo Bonzini /* 10000110nnnn0iii bclr #<imm>, <REG_N> */ {"bclr",{A_IMM, A_REG_N},{HEX_8,HEX_6,REG_N,IMM0_3c}, arch_sh2a_nofpu_up},
109876cad711SPaolo Bonzini /* 0011nnnn0iii1001 0000dddddddddddd bclr.b #<imm>,@(<DISP12>,<REG_N>) */
109976cad711SPaolo Bonzini {"bclr.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_0,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
110076cad711SPaolo Bonzini /* 10000111nnnn1iii bld #<imm>, <REG_N> */ {"bld",{A_IMM, A_REG_N},{HEX_8,HEX_7,REG_N,IMM0_3s}, arch_sh2a_nofpu_up},
110176cad711SPaolo Bonzini /* 0011nnnn0iii1001 0011dddddddddddd bld.b #<imm>,@(<DISP12>,<REG_N>) */
110276cad711SPaolo Bonzini {"bld.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_3,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
110376cad711SPaolo Bonzini /* 10000110nnnn1iii bset #<imm>, <REG_N> */ {"bset",{A_IMM, A_REG_N},{HEX_8,HEX_6,REG_N,IMM0_3s}, arch_sh2a_nofpu_up},
110476cad711SPaolo Bonzini /* 0011nnnn0iii1001 0001dddddddddddd bset.b #<imm>,@(<DISP12>,<REG_N>) */
110576cad711SPaolo Bonzini {"bset.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_1,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
110676cad711SPaolo Bonzini /* 10000111nnnn0iii bst #<imm>, <REG_N> */ {"bst",{A_IMM, A_REG_N},{HEX_8,HEX_7,REG_N,IMM0_3c}, arch_sh2a_nofpu_up},
110776cad711SPaolo Bonzini /* 0011nnnn0iii1001 0010dddddddddddd bst.b #<imm>,@(<DISP12>,<REG_N>) */
110876cad711SPaolo Bonzini {"bst.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_2,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
110976cad711SPaolo Bonzini /* 0100nnnn10010001 clips.b <REG_N> */ {"clips.b",{A_REG_N},{HEX_4,REG_N,HEX_9,HEX_1}, arch_sh2a_nofpu_up},
111076cad711SPaolo Bonzini /* 0100nnnn10010101 clips.w <REG_N> */ {"clips.w",{A_REG_N},{HEX_4,REG_N,HEX_9,HEX_5}, arch_sh2a_nofpu_up},
111176cad711SPaolo Bonzini /* 0100nnnn10000001 clipu.b <REG_N> */ {"clipu.b",{A_REG_N},{HEX_4,REG_N,HEX_8,HEX_1}, arch_sh2a_nofpu_up},
111276cad711SPaolo Bonzini /* 0100nnnn10000101 clipu.w <REG_N> */ {"clipu.w",{A_REG_N},{HEX_4,REG_N,HEX_8,HEX_5}, arch_sh2a_nofpu_up},
111376cad711SPaolo Bonzini /* 0100nnnn10010100 divs R0,<REG_N> */ {"divs",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_9,HEX_4}, arch_sh2a_nofpu_up},
111476cad711SPaolo Bonzini /* 0100nnnn10000100 divu R0,<REG_N> */ {"divu",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_8,HEX_4}, arch_sh2a_nofpu_up},
111576cad711SPaolo Bonzini /* 0100mmmm01001011 jsr/n @<REG_M> */ {"jsr/n",{A_IND_M},{HEX_4,REG_M,HEX_4,HEX_B}, arch_sh2a_nofpu_up},
111676cad711SPaolo Bonzini /* 10000011dddddddd jsr/n @@(<disp>,TBR) */ {"jsr/n",{A_DISP2_TBR},{HEX_8,HEX_3,IMM0_8BY4}, arch_sh2a_nofpu_up},
111776cad711SPaolo Bonzini /* 0100mmmm11100101 ldbank @<REG_M>,R0 */ {"ldbank",{A_IND_M,A_R0},{HEX_4,REG_M,HEX_E,HEX_5}, arch_sh2a_nofpu_up},
111876cad711SPaolo Bonzini /* 0100mmmm11110001 movml.l <REG_M>,@-R15 */ {"movml.l",{A_REG_M,A_DEC_R15},{HEX_4,REG_M,HEX_F,HEX_1}, arch_sh2a_nofpu_up},
111976cad711SPaolo Bonzini /* 0100mmmm11110101 movml.l @R15+,<REG_M> */ {"movml.l",{A_INC_R15,A_REG_M},{HEX_4,REG_M,HEX_F,HEX_5}, arch_sh2a_nofpu_up},
112076cad711SPaolo Bonzini /* 0100mmmm11110000 movml.l <REG_M>,@-R15 */ {"movmu.l",{A_REG_M,A_DEC_R15},{HEX_4,REG_M,HEX_F,HEX_0}, arch_sh2a_nofpu_up},
112176cad711SPaolo Bonzini /* 0100mmmm11110100 movml.l @R15+,<REG_M> */ {"movmu.l",{A_INC_R15,A_REG_M},{HEX_4,REG_M,HEX_F,HEX_4}, arch_sh2a_nofpu_up},
112276cad711SPaolo Bonzini /* 0000nnnn00111001 movrt <REG_N> */ {"movrt",{A_REG_N},{HEX_0,REG_N,HEX_3,HEX_9}, arch_sh2a_nofpu_up},
112376cad711SPaolo Bonzini /* 0100nnnn10000000 mulr R0,<REG_N> */ {"mulr",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_8,HEX_0}, arch_sh2a_nofpu_up},
112476cad711SPaolo Bonzini /* 0000000001101000 nott */ {"nott",{A_END},{HEX_0,HEX_0,HEX_6,HEX_8}, arch_sh2a_nofpu_up},
112576cad711SPaolo Bonzini /* 0000000001011011 resbank */ {"resbank",{A_END},{HEX_0,HEX_0,HEX_5,HEX_B}, arch_sh2a_nofpu_up},
112676cad711SPaolo Bonzini /* 0000000001101011 rts/n */ {"rts/n",{A_END},{HEX_0,HEX_0,HEX_6,HEX_B}, arch_sh2a_nofpu_up},
112776cad711SPaolo Bonzini /* 0000mmmm01111011 rtv/n <REG_M>*/ {"rtv/n",{A_REG_M},{HEX_0,REG_M,HEX_7,HEX_B}, arch_sh2a_nofpu_up},
112876cad711SPaolo Bonzini /* 0100nnnn11100001 stbank R0,@<REG_N>*/ {"stbank",{A_R0,A_IND_N},{HEX_4,REG_N,HEX_E,HEX_1}, arch_sh2a_nofpu_up},
112976cad711SPaolo Bonzini
113076cad711SPaolo Bonzini /* 0011nnnn0iii1001 0100dddddddddddd band.b #<imm>,@(<DISP12>,<REG_N>) */
113176cad711SPaolo Bonzini {"band.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_4,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
113276cad711SPaolo Bonzini /* 0011nnnn0iii1001 1100dddddddddddd bandnot.b #<imm>,@(<DISP12>,<REG_N>) */
113376cad711SPaolo Bonzini {"bandnot.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_C,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
113476cad711SPaolo Bonzini /* 0011nnnn0iii1001 1011dddddddddddd bldnot.b #<imm>,@(<DISP12>,<REG_N>) */
113576cad711SPaolo Bonzini {"bldnot.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_B,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
113676cad711SPaolo Bonzini /* 0011nnnn0iii1001 0101dddddddddddd bor.b #<imm>,@(<DISP12>,<REG_N>) */
113776cad711SPaolo Bonzini {"bor.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_5,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
113876cad711SPaolo Bonzini /* 0011nnnn0iii1001 1101dddddddddddd bornot.b #<imm>,@(<DISP12>,<REG_N>) */
113976cad711SPaolo Bonzini {"bornot.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_D,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
114076cad711SPaolo Bonzini /* 0011nnnn0iii1001 0110dddddddddddd bxor.b #<imm>,@(<DISP12>,<REG_N>) */
114176cad711SPaolo Bonzini {"bxor.b",{A_IMM,A_DISP_REG_N},{HEX_3,REG_N,IMM0_3Uc,HEX_9,HEX_6,DISP1_12}, arch_sh2a_nofpu_up | arch_op32},
114276cad711SPaolo Bonzini /* 0000nnnniiii0000 iiiiiiiiiiiiiiii movi20 #<imm>,<REG_N> */
114376cad711SPaolo Bonzini {"movi20",{A_IMM,A_REG_N},{HEX_0,REG_N,IMM0_20_4,HEX_0,IMM0_20}, arch_sh2a_nofpu_up | arch_op32},
114476cad711SPaolo Bonzini /* 0000nnnniiii0001 iiiiiiiiiiiiiiii movi20s #<imm>,<REG_N> */
114576cad711SPaolo Bonzini {"movi20s",{A_IMM,A_REG_N},{HEX_0,REG_N,IMM0_20_4,HEX_1,IMM0_20BY8}, arch_sh2a_nofpu_up | arch_op32},
114676cad711SPaolo Bonzini /* 0011nnnnmmmm0001 1000dddddddddddd movu.b @(<DISP12>,<REG_M>),<REG_N> */
114776cad711SPaolo Bonzini {"movu.b",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_8,DISP0_12}, arch_sh2a_nofpu_up | arch_op32},
114876cad711SPaolo Bonzini /* 0011nnnnmmmm0001 1001dddddddddddd movu.w @(<DISP12>,<REG_M>),<REG_N> */
114976cad711SPaolo Bonzini {"movu.w",{A_DISP_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_1,HEX_9,DISP0_12BY2}, arch_sh2a_nofpu_up | arch_op32},
115076cad711SPaolo Bonzini
115176cad711SPaolo Bonzini { 0, {0}, {0}, 0 }
115276cad711SPaolo Bonzini };
115376cad711SPaolo Bonzini
115476cad711SPaolo Bonzini #endif
115576cad711SPaolo Bonzini
115676cad711SPaolo Bonzini #ifdef ARCH_all
115776cad711SPaolo Bonzini #define INCLUDE_SHMEDIA
115876cad711SPaolo Bonzini #endif
115976cad711SPaolo Bonzini
116076cad711SPaolo Bonzini static void
print_movxy(const sh_opcode_info * op,int rn,int rm,fprintf_function fprintf_fn,void * stream)116176cad711SPaolo Bonzini print_movxy (const sh_opcode_info *op, int rn, int rm,
116276cad711SPaolo Bonzini fprintf_function fprintf_fn, void *stream)
116376cad711SPaolo Bonzini {
116476cad711SPaolo Bonzini int n;
116576cad711SPaolo Bonzini
116676cad711SPaolo Bonzini fprintf_fn (stream, "%s\t", op->name);
116776cad711SPaolo Bonzini for (n = 0; n < 2; n++)
116876cad711SPaolo Bonzini {
116976cad711SPaolo Bonzini switch (op->arg[n])
117076cad711SPaolo Bonzini {
117176cad711SPaolo Bonzini case A_IND_N:
117276cad711SPaolo Bonzini case AX_IND_N:
117376cad711SPaolo Bonzini case AXY_IND_N:
117476cad711SPaolo Bonzini case AY_IND_N:
117576cad711SPaolo Bonzini case AYX_IND_N:
117676cad711SPaolo Bonzini fprintf_fn (stream, "@r%d", rn);
117776cad711SPaolo Bonzini break;
117876cad711SPaolo Bonzini case A_INC_N:
117976cad711SPaolo Bonzini case AX_INC_N:
118076cad711SPaolo Bonzini case AXY_INC_N:
118176cad711SPaolo Bonzini case AY_INC_N:
118276cad711SPaolo Bonzini case AYX_INC_N:
118376cad711SPaolo Bonzini fprintf_fn (stream, "@r%d+", rn);
118476cad711SPaolo Bonzini break;
118576cad711SPaolo Bonzini case AX_PMOD_N:
118676cad711SPaolo Bonzini case AXY_PMOD_N:
118776cad711SPaolo Bonzini fprintf_fn (stream, "@r%d+r8", rn);
118876cad711SPaolo Bonzini break;
118976cad711SPaolo Bonzini case AY_PMOD_N:
119076cad711SPaolo Bonzini case AYX_PMOD_N:
119176cad711SPaolo Bonzini fprintf_fn (stream, "@r%d+r9", rn);
119276cad711SPaolo Bonzini break;
119376cad711SPaolo Bonzini case DSP_REG_A_M:
119476cad711SPaolo Bonzini fprintf_fn (stream, "a%c", '0' + rm);
119576cad711SPaolo Bonzini break;
119676cad711SPaolo Bonzini case DSP_REG_X:
119776cad711SPaolo Bonzini fprintf_fn (stream, "x%c", '0' + rm);
119876cad711SPaolo Bonzini break;
119976cad711SPaolo Bonzini case DSP_REG_Y:
120076cad711SPaolo Bonzini fprintf_fn (stream, "y%c", '0' + rm);
120176cad711SPaolo Bonzini break;
120276cad711SPaolo Bonzini case DSP_REG_AX:
120376cad711SPaolo Bonzini fprintf_fn (stream, "%c%c",
120476cad711SPaolo Bonzini (rm & 1) ? 'x' : 'a',
120576cad711SPaolo Bonzini (rm & 2) ? '1' : '0');
120676cad711SPaolo Bonzini break;
120776cad711SPaolo Bonzini case DSP_REG_XY:
120876cad711SPaolo Bonzini fprintf_fn (stream, "%c%c",
120976cad711SPaolo Bonzini (rm & 1) ? 'y' : 'x',
121076cad711SPaolo Bonzini (rm & 2) ? '1' : '0');
121176cad711SPaolo Bonzini break;
121276cad711SPaolo Bonzini case DSP_REG_AY:
121376cad711SPaolo Bonzini fprintf_fn (stream, "%c%c",
121476cad711SPaolo Bonzini (rm & 2) ? 'y' : 'a',
121576cad711SPaolo Bonzini (rm & 1) ? '1' : '0');
121676cad711SPaolo Bonzini break;
121776cad711SPaolo Bonzini case DSP_REG_YX:
121876cad711SPaolo Bonzini fprintf_fn (stream, "%c%c",
121976cad711SPaolo Bonzini (rm & 2) ? 'x' : 'y',
122076cad711SPaolo Bonzini (rm & 1) ? '1' : '0');
122176cad711SPaolo Bonzini break;
122276cad711SPaolo Bonzini default:
122376cad711SPaolo Bonzini abort ();
122476cad711SPaolo Bonzini }
122576cad711SPaolo Bonzini if (n == 0)
122676cad711SPaolo Bonzini fprintf_fn (stream, ",");
122776cad711SPaolo Bonzini }
122876cad711SPaolo Bonzini }
122976cad711SPaolo Bonzini
123076cad711SPaolo Bonzini /* Print a double data transfer insn. INSN is just the lower three
123176cad711SPaolo Bonzini nibbles of the insn, i.e. field a and the bit that indicates if
123276cad711SPaolo Bonzini a parallel processing insn follows.
123376cad711SPaolo Bonzini Return nonzero if a field b of a parallel processing insns follows. */
123476cad711SPaolo Bonzini
123576cad711SPaolo Bonzini static void
print_insn_ddt(int insn,struct disassemble_info * info)123676cad711SPaolo Bonzini print_insn_ddt (int insn, struct disassemble_info *info)
123776cad711SPaolo Bonzini {
123876cad711SPaolo Bonzini fprintf_function fprintf_fn = info->fprintf_func;
123976cad711SPaolo Bonzini void *stream = info->stream;
124076cad711SPaolo Bonzini
124176cad711SPaolo Bonzini /* If this is just a nop, make sure to emit something. */
124276cad711SPaolo Bonzini if (insn == 0x000)
124376cad711SPaolo Bonzini fprintf_fn (stream, "nopx\tnopy");
124476cad711SPaolo Bonzini
124576cad711SPaolo Bonzini /* If a parallel processing insn was printed before,
124676cad711SPaolo Bonzini and we got a non-nop, emit a tab. */
124776cad711SPaolo Bonzini if ((insn & 0x800) && (insn & 0x3ff))
124876cad711SPaolo Bonzini fprintf_fn (stream, "\t");
124976cad711SPaolo Bonzini
125076cad711SPaolo Bonzini /* Check if either the x or y part is invalid. */
125176cad711SPaolo Bonzini if (((insn & 0xc) == 0 && (insn & 0x2a0))
125276cad711SPaolo Bonzini || ((insn & 3) == 0 && (insn & 0x150)))
125376cad711SPaolo Bonzini if (info->mach != bfd_mach_sh_dsp
125476cad711SPaolo Bonzini && info->mach != bfd_mach_sh3_dsp)
125576cad711SPaolo Bonzini {
125676cad711SPaolo Bonzini static const sh_opcode_info *first_movx, *first_movy;
125776cad711SPaolo Bonzini const sh_opcode_info *op;
125876cad711SPaolo Bonzini int is_movy;
125976cad711SPaolo Bonzini
126076cad711SPaolo Bonzini if (! first_movx)
126176cad711SPaolo Bonzini {
126276cad711SPaolo Bonzini for (first_movx = sh_table; first_movx->nibbles[1] != MOVX_NOPY;)
126376cad711SPaolo Bonzini first_movx++;
126476cad711SPaolo Bonzini for (first_movy = first_movx; first_movy->nibbles[1] != MOVY_NOPX;)
126576cad711SPaolo Bonzini first_movy++;
126676cad711SPaolo Bonzini }
126776cad711SPaolo Bonzini
126876cad711SPaolo Bonzini is_movy = ((insn & 3) != 0);
126976cad711SPaolo Bonzini
127076cad711SPaolo Bonzini if (is_movy)
127176cad711SPaolo Bonzini op = first_movy;
127276cad711SPaolo Bonzini else
127376cad711SPaolo Bonzini op = first_movx;
127476cad711SPaolo Bonzini
127576cad711SPaolo Bonzini while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3)
127676cad711SPaolo Bonzini || op->nibbles[3] != (unsigned) (insn & 0xf))
127776cad711SPaolo Bonzini op++;
127876cad711SPaolo Bonzini
127976cad711SPaolo Bonzini print_movxy (op,
128076cad711SPaolo Bonzini (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0)
128176cad711SPaolo Bonzini + 2 * is_movy
128276cad711SPaolo Bonzini + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)),
128376cad711SPaolo Bonzini (insn >> 6) & 3,
128476cad711SPaolo Bonzini fprintf_fn, stream);
128576cad711SPaolo Bonzini }
128676cad711SPaolo Bonzini else
128776cad711SPaolo Bonzini fprintf_fn (stream, ".word 0x%x", insn);
128876cad711SPaolo Bonzini else
128976cad711SPaolo Bonzini {
129076cad711SPaolo Bonzini static const sh_opcode_info *first_movx, *first_movy;
129176cad711SPaolo Bonzini const sh_opcode_info *opx, *opy;
129276cad711SPaolo Bonzini unsigned int insn_x, insn_y;
129376cad711SPaolo Bonzini
129476cad711SPaolo Bonzini if (! first_movx)
129576cad711SPaolo Bonzini {
129676cad711SPaolo Bonzini for (first_movx = sh_table; first_movx->nibbles[1] != MOVX;)
129776cad711SPaolo Bonzini first_movx++;
129876cad711SPaolo Bonzini for (first_movy = first_movx; first_movy->nibbles[1] != MOVY;)
129976cad711SPaolo Bonzini first_movy++;
130076cad711SPaolo Bonzini }
130176cad711SPaolo Bonzini insn_x = (insn >> 2) & 0xb;
130276cad711SPaolo Bonzini if (insn_x)
130376cad711SPaolo Bonzini {
130476cad711SPaolo Bonzini for (opx = first_movx; opx->nibbles[2] != insn_x;)
130576cad711SPaolo Bonzini opx++;
130676cad711SPaolo Bonzini print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1,
130776cad711SPaolo Bonzini fprintf_fn, stream);
130876cad711SPaolo Bonzini }
130976cad711SPaolo Bonzini insn_y = (insn & 3) | ((insn >> 1) & 8);
131076cad711SPaolo Bonzini if (insn_y)
131176cad711SPaolo Bonzini {
131276cad711SPaolo Bonzini if (insn_x)
131376cad711SPaolo Bonzini fprintf_fn (stream, "\t");
131476cad711SPaolo Bonzini for (opy = first_movy; opy->nibbles[2] != insn_y;)
131576cad711SPaolo Bonzini opy++;
131676cad711SPaolo Bonzini print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1,
131776cad711SPaolo Bonzini fprintf_fn, stream);
131876cad711SPaolo Bonzini }
131976cad711SPaolo Bonzini }
132076cad711SPaolo Bonzini }
132176cad711SPaolo Bonzini
132276cad711SPaolo Bonzini static void
print_dsp_reg(int rm,fprintf_function fprintf_fn,void * stream)132376cad711SPaolo Bonzini print_dsp_reg (int rm, fprintf_function fprintf_fn, void *stream)
132476cad711SPaolo Bonzini {
132576cad711SPaolo Bonzini switch (rm)
132676cad711SPaolo Bonzini {
132776cad711SPaolo Bonzini case A_A1_NUM:
132876cad711SPaolo Bonzini fprintf_fn (stream, "a1");
132976cad711SPaolo Bonzini break;
133076cad711SPaolo Bonzini case A_A0_NUM:
133176cad711SPaolo Bonzini fprintf_fn (stream, "a0");
133276cad711SPaolo Bonzini break;
133376cad711SPaolo Bonzini case A_X0_NUM:
133476cad711SPaolo Bonzini fprintf_fn (stream, "x0");
133576cad711SPaolo Bonzini break;
133676cad711SPaolo Bonzini case A_X1_NUM:
133776cad711SPaolo Bonzini fprintf_fn (stream, "x1");
133876cad711SPaolo Bonzini break;
133976cad711SPaolo Bonzini case A_Y0_NUM:
134076cad711SPaolo Bonzini fprintf_fn (stream, "y0");
134176cad711SPaolo Bonzini break;
134276cad711SPaolo Bonzini case A_Y1_NUM:
134376cad711SPaolo Bonzini fprintf_fn (stream, "y1");
134476cad711SPaolo Bonzini break;
134576cad711SPaolo Bonzini case A_M0_NUM:
134676cad711SPaolo Bonzini fprintf_fn (stream, "m0");
134776cad711SPaolo Bonzini break;
134876cad711SPaolo Bonzini case A_A1G_NUM:
134976cad711SPaolo Bonzini fprintf_fn (stream, "a1g");
135076cad711SPaolo Bonzini break;
135176cad711SPaolo Bonzini case A_M1_NUM:
135276cad711SPaolo Bonzini fprintf_fn (stream, "m1");
135376cad711SPaolo Bonzini break;
135476cad711SPaolo Bonzini case A_A0G_NUM:
135576cad711SPaolo Bonzini fprintf_fn (stream, "a0g");
135676cad711SPaolo Bonzini break;
135776cad711SPaolo Bonzini default:
135876cad711SPaolo Bonzini fprintf_fn (stream, "0x%x", rm);
135976cad711SPaolo Bonzini break;
136076cad711SPaolo Bonzini }
136176cad711SPaolo Bonzini }
136276cad711SPaolo Bonzini
136376cad711SPaolo Bonzini static void
print_insn_ppi(int field_b,struct disassemble_info * info)136476cad711SPaolo Bonzini print_insn_ppi (int field_b, struct disassemble_info *info)
136576cad711SPaolo Bonzini {
136676cad711SPaolo Bonzini static const char *sx_tab[] = { "x0", "x1", "a0", "a1" };
136776cad711SPaolo Bonzini static const char *sy_tab[] = { "y0", "y1", "m0", "m1" };
136876cad711SPaolo Bonzini fprintf_function fprintf_fn = info->fprintf_func;
136976cad711SPaolo Bonzini void *stream = info->stream;
137076cad711SPaolo Bonzini unsigned int nib1, nib2, nib3;
137176cad711SPaolo Bonzini unsigned int altnib1, nib4;
137276cad711SPaolo Bonzini const char *dc = NULL;
137376cad711SPaolo Bonzini const sh_opcode_info *op;
137476cad711SPaolo Bonzini
137576cad711SPaolo Bonzini if ((field_b & 0xe800) == 0)
137676cad711SPaolo Bonzini {
137776cad711SPaolo Bonzini fprintf_fn (stream, "psh%c\t#%d,",
137876cad711SPaolo Bonzini field_b & 0x1000 ? 'a' : 'l',
137976cad711SPaolo Bonzini (field_b >> 4) & 127);
138076cad711SPaolo Bonzini print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
138176cad711SPaolo Bonzini return;
138276cad711SPaolo Bonzini }
138376cad711SPaolo Bonzini if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000)
138476cad711SPaolo Bonzini {
138576cad711SPaolo Bonzini static const char *du_tab[] = { "x0", "y0", "a0", "a1" };
138676cad711SPaolo Bonzini static const char *se_tab[] = { "x0", "x1", "y0", "a1" };
138776cad711SPaolo Bonzini static const char *sf_tab[] = { "y0", "y1", "x0", "a1" };
138876cad711SPaolo Bonzini static const char *sg_tab[] = { "m0", "m1", "a0", "a1" };
138976cad711SPaolo Bonzini
139076cad711SPaolo Bonzini if (field_b & 0x2000)
139176cad711SPaolo Bonzini {
139276cad711SPaolo Bonzini fprintf_fn (stream, "p%s %s,%s,%s\t",
139376cad711SPaolo Bonzini (field_b & 0x1000) ? "add" : "sub",
139476cad711SPaolo Bonzini sx_tab[(field_b >> 6) & 3],
139576cad711SPaolo Bonzini sy_tab[(field_b >> 4) & 3],
139676cad711SPaolo Bonzini du_tab[(field_b >> 0) & 3]);
139776cad711SPaolo Bonzini }
139876cad711SPaolo Bonzini else if ((field_b & 0xf0) == 0x10
139976cad711SPaolo Bonzini && info->mach != bfd_mach_sh_dsp
140076cad711SPaolo Bonzini && info->mach != bfd_mach_sh3_dsp)
140176cad711SPaolo Bonzini {
140276cad711SPaolo Bonzini fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]);
140376cad711SPaolo Bonzini }
140476cad711SPaolo Bonzini else if ((field_b & 0xf3) != 0)
140576cad711SPaolo Bonzini {
140676cad711SPaolo Bonzini fprintf_fn (stream, ".word 0x%x\t", field_b);
140776cad711SPaolo Bonzini }
140876cad711SPaolo Bonzini fprintf_fn (stream, "pmuls%c%s,%s,%s",
140976cad711SPaolo Bonzini field_b & 0x2000 ? ' ' : '\t',
141076cad711SPaolo Bonzini se_tab[(field_b >> 10) & 3],
141176cad711SPaolo Bonzini sf_tab[(field_b >> 8) & 3],
141276cad711SPaolo Bonzini sg_tab[(field_b >> 2) & 3]);
141376cad711SPaolo Bonzini return;
141476cad711SPaolo Bonzini }
141576cad711SPaolo Bonzini
141676cad711SPaolo Bonzini nib1 = PPIC;
141776cad711SPaolo Bonzini nib2 = field_b >> 12 & 0xf;
141876cad711SPaolo Bonzini nib3 = field_b >> 8 & 0xf;
141976cad711SPaolo Bonzini nib4 = field_b >> 4 & 0xf;
142076cad711SPaolo Bonzini switch (nib3 & 0x3)
142176cad711SPaolo Bonzini {
142276cad711SPaolo Bonzini case 0:
142376cad711SPaolo Bonzini dc = "";
142476cad711SPaolo Bonzini nib1 = PPI3;
142576cad711SPaolo Bonzini break;
142676cad711SPaolo Bonzini case 1:
142776cad711SPaolo Bonzini dc = "";
142876cad711SPaolo Bonzini break;
142976cad711SPaolo Bonzini case 2:
143076cad711SPaolo Bonzini dc = "dct ";
143176cad711SPaolo Bonzini nib3 -= 1;
143276cad711SPaolo Bonzini break;
143376cad711SPaolo Bonzini case 3:
143476cad711SPaolo Bonzini dc = "dcf ";
143576cad711SPaolo Bonzini nib3 -= 2;
143676cad711SPaolo Bonzini break;
143776cad711SPaolo Bonzini }
143876cad711SPaolo Bonzini if (nib1 == PPI3)
143976cad711SPaolo Bonzini altnib1 = PPI3NC;
144076cad711SPaolo Bonzini else
144176cad711SPaolo Bonzini altnib1 = nib1;
144276cad711SPaolo Bonzini for (op = sh_table; op->name; op++)
144376cad711SPaolo Bonzini {
144476cad711SPaolo Bonzini if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1)
144576cad711SPaolo Bonzini && op->nibbles[2] == nib2
144676cad711SPaolo Bonzini && op->nibbles[3] == nib3)
144776cad711SPaolo Bonzini {
144876cad711SPaolo Bonzini int n;
144976cad711SPaolo Bonzini
145076cad711SPaolo Bonzini switch (op->nibbles[4])
145176cad711SPaolo Bonzini {
145276cad711SPaolo Bonzini case HEX_0:
145376cad711SPaolo Bonzini break;
145476cad711SPaolo Bonzini case HEX_XX00:
145576cad711SPaolo Bonzini if ((nib4 & 3) != 0)
145676cad711SPaolo Bonzini continue;
145776cad711SPaolo Bonzini break;
145876cad711SPaolo Bonzini case HEX_1:
145976cad711SPaolo Bonzini if ((nib4 & 3) != 1)
146076cad711SPaolo Bonzini continue;
146176cad711SPaolo Bonzini break;
146276cad711SPaolo Bonzini case HEX_00YY:
146376cad711SPaolo Bonzini if ((nib4 & 0xc) != 0)
146476cad711SPaolo Bonzini continue;
146576cad711SPaolo Bonzini break;
146676cad711SPaolo Bonzini case HEX_4:
146776cad711SPaolo Bonzini if ((nib4 & 0xc) != 4)
146876cad711SPaolo Bonzini continue;
146976cad711SPaolo Bonzini break;
147076cad711SPaolo Bonzini default:
147176cad711SPaolo Bonzini abort ();
147276cad711SPaolo Bonzini }
147376cad711SPaolo Bonzini fprintf_fn (stream, "%s%s\t", dc, op->name);
147476cad711SPaolo Bonzini for (n = 0; n < 3 && op->arg[n] != A_END; n++)
147576cad711SPaolo Bonzini {
147676cad711SPaolo Bonzini if (n && op->arg[1] != A_END)
147776cad711SPaolo Bonzini fprintf_fn (stream, ",");
147876cad711SPaolo Bonzini switch (op->arg[n])
147976cad711SPaolo Bonzini {
148076cad711SPaolo Bonzini case DSP_REG_N:
148176cad711SPaolo Bonzini print_dsp_reg (field_b & 0xf, fprintf_fn, stream);
148276cad711SPaolo Bonzini break;
148376cad711SPaolo Bonzini case DSP_REG_X:
148476cad711SPaolo Bonzini fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]);
148576cad711SPaolo Bonzini break;
148676cad711SPaolo Bonzini case DSP_REG_Y:
148776cad711SPaolo Bonzini fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]);
148876cad711SPaolo Bonzini break;
148976cad711SPaolo Bonzini case A_MACH:
149076cad711SPaolo Bonzini fprintf_fn (stream, "mach");
149176cad711SPaolo Bonzini break;
149276cad711SPaolo Bonzini case A_MACL:
149376cad711SPaolo Bonzini fprintf_fn (stream, "macl");
149476cad711SPaolo Bonzini break;
149576cad711SPaolo Bonzini default:
149676cad711SPaolo Bonzini abort ();
149776cad711SPaolo Bonzini }
149876cad711SPaolo Bonzini }
149976cad711SPaolo Bonzini return;
150076cad711SPaolo Bonzini }
150176cad711SPaolo Bonzini }
150276cad711SPaolo Bonzini /* Not found. */
150376cad711SPaolo Bonzini fprintf_fn (stream, ".word 0x%x", field_b);
150476cad711SPaolo Bonzini }
150576cad711SPaolo Bonzini
150676cad711SPaolo Bonzini /* FIXME mvs: movx insns print as ".word 0x%03x", insn & 0xfff
150776cad711SPaolo Bonzini (ie. the upper nibble is missing). */
150876cad711SPaolo Bonzini int
print_insn_sh(bfd_vma memaddr,struct disassemble_info * info)150976cad711SPaolo Bonzini print_insn_sh (bfd_vma memaddr, struct disassemble_info *info)
151076cad711SPaolo Bonzini {
151176cad711SPaolo Bonzini fprintf_function fprintf_fn = info->fprintf_func;
151276cad711SPaolo Bonzini void *stream = info->stream;
151376cad711SPaolo Bonzini unsigned char insn[4];
151476cad711SPaolo Bonzini unsigned char nibs[8];
151576cad711SPaolo Bonzini int status;
151676cad711SPaolo Bonzini bfd_vma relmask = ~(bfd_vma) 0;
151776cad711SPaolo Bonzini const sh_opcode_info *op;
151876cad711SPaolo Bonzini unsigned int target_arch;
151976cad711SPaolo Bonzini int allow_op32;
152076cad711SPaolo Bonzini
152176cad711SPaolo Bonzini switch (info->mach)
152276cad711SPaolo Bonzini {
152376cad711SPaolo Bonzini case bfd_mach_sh:
152476cad711SPaolo Bonzini target_arch = arch_sh1;
152576cad711SPaolo Bonzini break;
152676cad711SPaolo Bonzini case bfd_mach_sh4:
152776cad711SPaolo Bonzini target_arch = arch_sh4;
152876cad711SPaolo Bonzini break;
152976cad711SPaolo Bonzini case bfd_mach_sh5:
153076cad711SPaolo Bonzini #ifdef INCLUDE_SHMEDIA
153176cad711SPaolo Bonzini status = print_insn_sh64 (memaddr, info);
153276cad711SPaolo Bonzini if (status != -2)
153376cad711SPaolo Bonzini return status;
153476cad711SPaolo Bonzini #endif
153576cad711SPaolo Bonzini /* When we get here for sh64, it's because we want to disassemble
153676cad711SPaolo Bonzini SHcompact, i.e. arch_sh4. */
153776cad711SPaolo Bonzini target_arch = arch_sh4;
153876cad711SPaolo Bonzini break;
153976cad711SPaolo Bonzini default:
154076cad711SPaolo Bonzini fprintf (stderr, "sh architecture not supported\n");
154176cad711SPaolo Bonzini return -1;
154276cad711SPaolo Bonzini }
154376cad711SPaolo Bonzini
154476cad711SPaolo Bonzini status = info->read_memory_func (memaddr, insn, 2, info);
154576cad711SPaolo Bonzini
154676cad711SPaolo Bonzini if (status != 0)
154776cad711SPaolo Bonzini {
154876cad711SPaolo Bonzini info->memory_error_func (status, memaddr, info);
154976cad711SPaolo Bonzini return -1;
155076cad711SPaolo Bonzini }
155176cad711SPaolo Bonzini
155276cad711SPaolo Bonzini if (info->endian == BFD_ENDIAN_LITTLE)
155376cad711SPaolo Bonzini {
155476cad711SPaolo Bonzini nibs[0] = (insn[1] >> 4) & 0xf;
155576cad711SPaolo Bonzini nibs[1] = insn[1] & 0xf;
155676cad711SPaolo Bonzini
155776cad711SPaolo Bonzini nibs[2] = (insn[0] >> 4) & 0xf;
155876cad711SPaolo Bonzini nibs[3] = insn[0] & 0xf;
155976cad711SPaolo Bonzini }
156076cad711SPaolo Bonzini else
156176cad711SPaolo Bonzini {
156276cad711SPaolo Bonzini nibs[0] = (insn[0] >> 4) & 0xf;
156376cad711SPaolo Bonzini nibs[1] = insn[0] & 0xf;
156476cad711SPaolo Bonzini
156576cad711SPaolo Bonzini nibs[2] = (insn[1] >> 4) & 0xf;
156676cad711SPaolo Bonzini nibs[3] = insn[1] & 0xf;
156776cad711SPaolo Bonzini }
156876cad711SPaolo Bonzini status = info->read_memory_func (memaddr + 2, insn + 2, 2, info);
156976cad711SPaolo Bonzini if (status != 0)
157076cad711SPaolo Bonzini allow_op32 = 0;
157176cad711SPaolo Bonzini else
157276cad711SPaolo Bonzini {
157376cad711SPaolo Bonzini allow_op32 = 1;
157476cad711SPaolo Bonzini
157576cad711SPaolo Bonzini if (info->endian == BFD_ENDIAN_LITTLE)
157676cad711SPaolo Bonzini {
157776cad711SPaolo Bonzini nibs[4] = (insn[3] >> 4) & 0xf;
157876cad711SPaolo Bonzini nibs[5] = insn[3] & 0xf;
157976cad711SPaolo Bonzini
158076cad711SPaolo Bonzini nibs[6] = (insn[2] >> 4) & 0xf;
158176cad711SPaolo Bonzini nibs[7] = insn[2] & 0xf;
158276cad711SPaolo Bonzini }
158376cad711SPaolo Bonzini else
158476cad711SPaolo Bonzini {
158576cad711SPaolo Bonzini nibs[4] = (insn[2] >> 4) & 0xf;
158676cad711SPaolo Bonzini nibs[5] = insn[2] & 0xf;
158776cad711SPaolo Bonzini
158876cad711SPaolo Bonzini nibs[6] = (insn[3] >> 4) & 0xf;
158976cad711SPaolo Bonzini nibs[7] = insn[3] & 0xf;
159076cad711SPaolo Bonzini }
159176cad711SPaolo Bonzini }
159276cad711SPaolo Bonzini
159376cad711SPaolo Bonzini if (nibs[0] == 0xf && (nibs[1] & 4) == 0
159476cad711SPaolo Bonzini && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up))
159576cad711SPaolo Bonzini {
159676cad711SPaolo Bonzini if (nibs[1] & 8)
159776cad711SPaolo Bonzini {
159876cad711SPaolo Bonzini int field_b;
159976cad711SPaolo Bonzini
160076cad711SPaolo Bonzini status = info->read_memory_func (memaddr + 2, insn, 2, info);
160176cad711SPaolo Bonzini
160276cad711SPaolo Bonzini if (status != 0)
160376cad711SPaolo Bonzini {
160476cad711SPaolo Bonzini info->memory_error_func (status, memaddr + 2, info);
160576cad711SPaolo Bonzini return -1;
160676cad711SPaolo Bonzini }
160776cad711SPaolo Bonzini
160876cad711SPaolo Bonzini if (info->endian == BFD_ENDIAN_LITTLE)
160976cad711SPaolo Bonzini field_b = insn[1] << 8 | insn[0];
161076cad711SPaolo Bonzini else
161176cad711SPaolo Bonzini field_b = insn[0] << 8 | insn[1];
161276cad711SPaolo Bonzini
161376cad711SPaolo Bonzini print_insn_ppi (field_b, info);
161476cad711SPaolo Bonzini print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
161576cad711SPaolo Bonzini return 4;
161676cad711SPaolo Bonzini }
161776cad711SPaolo Bonzini print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info);
161876cad711SPaolo Bonzini return 2;
161976cad711SPaolo Bonzini }
162076cad711SPaolo Bonzini for (op = sh_table; op->name; op++)
162176cad711SPaolo Bonzini {
162276cad711SPaolo Bonzini int n;
162376cad711SPaolo Bonzini int imm = 0;
162476cad711SPaolo Bonzini int rn = 0;
162576cad711SPaolo Bonzini int rm = 0;
162676cad711SPaolo Bonzini int rb = 0;
162776cad711SPaolo Bonzini int disp_pc;
162876cad711SPaolo Bonzini bfd_vma disp_pc_addr = 0;
162976cad711SPaolo Bonzini int disp = 0;
163076cad711SPaolo Bonzini int has_disp = 0;
163176cad711SPaolo Bonzini int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4;
163276cad711SPaolo Bonzini
163376cad711SPaolo Bonzini if (!allow_op32
163476cad711SPaolo Bonzini && SH_MERGE_ARCH_SET (op->arch, arch_op32))
163576cad711SPaolo Bonzini goto fail;
163676cad711SPaolo Bonzini
163776cad711SPaolo Bonzini if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch))
163876cad711SPaolo Bonzini goto fail;
163976cad711SPaolo Bonzini for (n = 0; n < max_n; n++)
164076cad711SPaolo Bonzini {
164176cad711SPaolo Bonzini int i = op->nibbles[n];
164276cad711SPaolo Bonzini
164376cad711SPaolo Bonzini if (i < 16)
164476cad711SPaolo Bonzini {
164576cad711SPaolo Bonzini if (nibs[n] == i)
164676cad711SPaolo Bonzini continue;
164776cad711SPaolo Bonzini goto fail;
164876cad711SPaolo Bonzini }
164976cad711SPaolo Bonzini switch (i)
165076cad711SPaolo Bonzini {
165176cad711SPaolo Bonzini case BRANCH_8:
165276cad711SPaolo Bonzini imm = (nibs[2] << 4) | (nibs[3]);
165376cad711SPaolo Bonzini if (imm & 0x80)
165476cad711SPaolo Bonzini imm |= ~0xff;
165576cad711SPaolo Bonzini imm = ((char) imm) * 2 + 4;
165676cad711SPaolo Bonzini goto ok;
165776cad711SPaolo Bonzini case BRANCH_12:
165876cad711SPaolo Bonzini imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]);
165976cad711SPaolo Bonzini if (imm & 0x800)
166076cad711SPaolo Bonzini imm |= ~0xfff;
166176cad711SPaolo Bonzini imm = imm * 2 + 4;
166276cad711SPaolo Bonzini goto ok;
166376cad711SPaolo Bonzini case IMM0_3c:
166476cad711SPaolo Bonzini if (nibs[3] & 0x8)
166576cad711SPaolo Bonzini goto fail;
166676cad711SPaolo Bonzini imm = nibs[3] & 0x7;
166776cad711SPaolo Bonzini break;
166876cad711SPaolo Bonzini case IMM0_3s:
166976cad711SPaolo Bonzini if (!(nibs[3] & 0x8))
167076cad711SPaolo Bonzini goto fail;
167176cad711SPaolo Bonzini imm = nibs[3] & 0x7;
167276cad711SPaolo Bonzini break;
167376cad711SPaolo Bonzini case IMM0_3Uc:
167476cad711SPaolo Bonzini if (nibs[2] & 0x8)
167576cad711SPaolo Bonzini goto fail;
167676cad711SPaolo Bonzini imm = nibs[2] & 0x7;
167776cad711SPaolo Bonzini break;
167876cad711SPaolo Bonzini case IMM0_3Us:
167976cad711SPaolo Bonzini if (!(nibs[2] & 0x8))
168076cad711SPaolo Bonzini goto fail;
168176cad711SPaolo Bonzini imm = nibs[2] & 0x7;
168276cad711SPaolo Bonzini break;
168376cad711SPaolo Bonzini case DISP0_12:
168476cad711SPaolo Bonzini case DISP1_12:
168576cad711SPaolo Bonzini disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7];
168676cad711SPaolo Bonzini has_disp = 1;
168776cad711SPaolo Bonzini goto ok;
168876cad711SPaolo Bonzini case DISP0_12BY2:
168976cad711SPaolo Bonzini case DISP1_12BY2:
169076cad711SPaolo Bonzini disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1;
169176cad711SPaolo Bonzini relmask = ~(bfd_vma) 1;
169276cad711SPaolo Bonzini has_disp = 1;
169376cad711SPaolo Bonzini goto ok;
169476cad711SPaolo Bonzini case DISP0_12BY4:
169576cad711SPaolo Bonzini case DISP1_12BY4:
169676cad711SPaolo Bonzini disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2;
169776cad711SPaolo Bonzini relmask = ~(bfd_vma) 3;
169876cad711SPaolo Bonzini has_disp = 1;
169976cad711SPaolo Bonzini goto ok;
170076cad711SPaolo Bonzini case DISP0_12BY8:
170176cad711SPaolo Bonzini case DISP1_12BY8:
170276cad711SPaolo Bonzini disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3;
170376cad711SPaolo Bonzini relmask = ~(bfd_vma) 7;
170476cad711SPaolo Bonzini has_disp = 1;
170576cad711SPaolo Bonzini goto ok;
170676cad711SPaolo Bonzini case IMM0_20_4:
170776cad711SPaolo Bonzini break;
170876cad711SPaolo Bonzini case IMM0_20:
170976cad711SPaolo Bonzini imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
171076cad711SPaolo Bonzini | (nibs[6] << 4) | nibs[7]);
171176cad711SPaolo Bonzini if (imm & 0x80000)
171276cad711SPaolo Bonzini imm -= 0x100000;
171376cad711SPaolo Bonzini goto ok;
171476cad711SPaolo Bonzini case IMM0_20BY8:
171576cad711SPaolo Bonzini imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8)
171676cad711SPaolo Bonzini | (nibs[6] << 4) | nibs[7]);
171776cad711SPaolo Bonzini imm <<= 8;
171876cad711SPaolo Bonzini if (imm & 0x8000000)
171976cad711SPaolo Bonzini imm -= 0x10000000;
172076cad711SPaolo Bonzini goto ok;
172176cad711SPaolo Bonzini case IMM0_4:
172276cad711SPaolo Bonzini case IMM1_4:
172376cad711SPaolo Bonzini imm = nibs[3];
172476cad711SPaolo Bonzini goto ok;
172576cad711SPaolo Bonzini case IMM0_4BY2:
172676cad711SPaolo Bonzini case IMM1_4BY2:
172776cad711SPaolo Bonzini imm = nibs[3] << 1;
172876cad711SPaolo Bonzini goto ok;
172976cad711SPaolo Bonzini case IMM0_4BY4:
173076cad711SPaolo Bonzini case IMM1_4BY4:
173176cad711SPaolo Bonzini imm = nibs[3] << 2;
173276cad711SPaolo Bonzini goto ok;
173376cad711SPaolo Bonzini case IMM0_8:
173476cad711SPaolo Bonzini case IMM1_8:
173576cad711SPaolo Bonzini imm = (nibs[2] << 4) | nibs[3];
173676cad711SPaolo Bonzini disp = imm;
173776cad711SPaolo Bonzini has_disp = 1;
173876cad711SPaolo Bonzini if (imm & 0x80)
173976cad711SPaolo Bonzini imm -= 0x100;
174076cad711SPaolo Bonzini goto ok;
174176cad711SPaolo Bonzini case PCRELIMM_8BY2:
174276cad711SPaolo Bonzini imm = ((nibs[2] << 4) | nibs[3]) << 1;
174376cad711SPaolo Bonzini relmask = ~(bfd_vma) 1;
174476cad711SPaolo Bonzini goto ok;
174576cad711SPaolo Bonzini case PCRELIMM_8BY4:
174676cad711SPaolo Bonzini imm = ((nibs[2] << 4) | nibs[3]) << 2;
174776cad711SPaolo Bonzini relmask = ~(bfd_vma) 3;
174876cad711SPaolo Bonzini goto ok;
174976cad711SPaolo Bonzini case IMM0_8BY2:
175076cad711SPaolo Bonzini case IMM1_8BY2:
175176cad711SPaolo Bonzini imm = ((nibs[2] << 4) | nibs[3]) << 1;
175276cad711SPaolo Bonzini goto ok;
175376cad711SPaolo Bonzini case IMM0_8BY4:
175476cad711SPaolo Bonzini case IMM1_8BY4:
175576cad711SPaolo Bonzini imm = ((nibs[2] << 4) | nibs[3]) << 2;
175676cad711SPaolo Bonzini goto ok;
175776cad711SPaolo Bonzini case REG_N_D:
175876cad711SPaolo Bonzini if ((nibs[n] & 1) != 0)
175976cad711SPaolo Bonzini goto fail;
176076cad711SPaolo Bonzini /* fall through */
176176cad711SPaolo Bonzini case REG_N:
176276cad711SPaolo Bonzini rn = nibs[n];
176376cad711SPaolo Bonzini break;
176476cad711SPaolo Bonzini case REG_M:
176576cad711SPaolo Bonzini rm = nibs[n];
176676cad711SPaolo Bonzini break;
176776cad711SPaolo Bonzini case REG_N_B01:
176876cad711SPaolo Bonzini if ((nibs[n] & 0x3) != 1 /* binary 01 */)
176976cad711SPaolo Bonzini goto fail;
177076cad711SPaolo Bonzini rn = (nibs[n] & 0xc) >> 2;
177176cad711SPaolo Bonzini break;
177276cad711SPaolo Bonzini case REG_NM:
177376cad711SPaolo Bonzini rn = (nibs[n] & 0xc) >> 2;
177476cad711SPaolo Bonzini rm = (nibs[n] & 0x3);
177576cad711SPaolo Bonzini break;
177676cad711SPaolo Bonzini case REG_B:
177776cad711SPaolo Bonzini rb = nibs[n] & 0x07;
177876cad711SPaolo Bonzini break;
177976cad711SPaolo Bonzini case SDT_REG_N:
178076cad711SPaolo Bonzini /* sh-dsp: single data transfer. */
178176cad711SPaolo Bonzini rn = nibs[n];
178276cad711SPaolo Bonzini if ((rn & 0xc) != 4)
178376cad711SPaolo Bonzini goto fail;
178476cad711SPaolo Bonzini rn = rn & 0x3;
178576cad711SPaolo Bonzini rn |= (!(rn & 2)) << 2;
178676cad711SPaolo Bonzini break;
178776cad711SPaolo Bonzini case PPI:
178876cad711SPaolo Bonzini case REPEAT:
178976cad711SPaolo Bonzini goto fail;
179076cad711SPaolo Bonzini default:
179176cad711SPaolo Bonzini abort ();
179276cad711SPaolo Bonzini }
179376cad711SPaolo Bonzini }
179476cad711SPaolo Bonzini
179576cad711SPaolo Bonzini ok:
179676cad711SPaolo Bonzini /* sh2a has D_REG but not X_REG. We don't know the pattern
179776cad711SPaolo Bonzini doesn't match unless we check the output args to see if they
179876cad711SPaolo Bonzini make sense. */
179976cad711SPaolo Bonzini if (target_arch == arch_sh2a
180076cad711SPaolo Bonzini && ((op->arg[0] == DX_REG_M && (rm & 1) != 0)
180176cad711SPaolo Bonzini || (op->arg[1] == DX_REG_N && (rn & 1) != 0)))
180276cad711SPaolo Bonzini goto fail;
180376cad711SPaolo Bonzini
180476cad711SPaolo Bonzini fprintf_fn (stream, "%s\t", op->name);
180576cad711SPaolo Bonzini disp_pc = 0;
180676cad711SPaolo Bonzini for (n = 0; n < 3 && op->arg[n] != A_END; n++)
180776cad711SPaolo Bonzini {
180876cad711SPaolo Bonzini if (n && op->arg[1] != A_END)
180976cad711SPaolo Bonzini fprintf_fn (stream, ",");
181076cad711SPaolo Bonzini switch (op->arg[n])
181176cad711SPaolo Bonzini {
181276cad711SPaolo Bonzini case A_IMM:
181376cad711SPaolo Bonzini fprintf_fn (stream, "#%d", imm);
181476cad711SPaolo Bonzini break;
181576cad711SPaolo Bonzini case A_R0:
181676cad711SPaolo Bonzini fprintf_fn (stream, "r0");
181776cad711SPaolo Bonzini break;
181876cad711SPaolo Bonzini case A_REG_N:
181976cad711SPaolo Bonzini fprintf_fn (stream, "r%d", rn);
182076cad711SPaolo Bonzini break;
182176cad711SPaolo Bonzini case A_INC_N:
182276cad711SPaolo Bonzini case AS_INC_N:
182376cad711SPaolo Bonzini fprintf_fn (stream, "@r%d+", rn);
182476cad711SPaolo Bonzini break;
182576cad711SPaolo Bonzini case A_DEC_N:
182676cad711SPaolo Bonzini case AS_DEC_N:
182776cad711SPaolo Bonzini fprintf_fn (stream, "@-r%d", rn);
182876cad711SPaolo Bonzini break;
182976cad711SPaolo Bonzini case A_IND_N:
183076cad711SPaolo Bonzini case AS_IND_N:
183176cad711SPaolo Bonzini fprintf_fn (stream, "@r%d", rn);
183276cad711SPaolo Bonzini break;
183376cad711SPaolo Bonzini case A_DISP_REG_N:
183476cad711SPaolo Bonzini fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn);
183576cad711SPaolo Bonzini break;
183676cad711SPaolo Bonzini case AS_PMOD_N:
183776cad711SPaolo Bonzini fprintf_fn (stream, "@r%d+r8", rn);
183876cad711SPaolo Bonzini break;
183976cad711SPaolo Bonzini case A_REG_M:
184076cad711SPaolo Bonzini fprintf_fn (stream, "r%d", rm);
184176cad711SPaolo Bonzini break;
184276cad711SPaolo Bonzini case A_INC_M:
184376cad711SPaolo Bonzini fprintf_fn (stream, "@r%d+", rm);
184476cad711SPaolo Bonzini break;
184576cad711SPaolo Bonzini case A_DEC_M:
184676cad711SPaolo Bonzini fprintf_fn (stream, "@-r%d", rm);
184776cad711SPaolo Bonzini break;
184876cad711SPaolo Bonzini case A_IND_M:
184976cad711SPaolo Bonzini fprintf_fn (stream, "@r%d", rm);
185076cad711SPaolo Bonzini break;
185176cad711SPaolo Bonzini case A_DISP_REG_M:
185276cad711SPaolo Bonzini fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm);
185376cad711SPaolo Bonzini break;
185476cad711SPaolo Bonzini case A_REG_B:
185576cad711SPaolo Bonzini fprintf_fn (stream, "r%d_bank", rb);
185676cad711SPaolo Bonzini break;
185776cad711SPaolo Bonzini case A_DISP_PC:
185876cad711SPaolo Bonzini disp_pc = 1;
185976cad711SPaolo Bonzini disp_pc_addr = imm + 4 + (memaddr & relmask);
186076cad711SPaolo Bonzini (*info->print_address_func) (disp_pc_addr, info);
186176cad711SPaolo Bonzini break;
186276cad711SPaolo Bonzini case A_IND_R0_REG_N:
186376cad711SPaolo Bonzini fprintf_fn (stream, "@(r0,r%d)", rn);
186476cad711SPaolo Bonzini break;
186576cad711SPaolo Bonzini case A_IND_R0_REG_M:
186676cad711SPaolo Bonzini fprintf_fn (stream, "@(r0,r%d)", rm);
186776cad711SPaolo Bonzini break;
186876cad711SPaolo Bonzini case A_DISP_GBR:
186976cad711SPaolo Bonzini fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm);
187076cad711SPaolo Bonzini break;
187176cad711SPaolo Bonzini case A_TBR:
187276cad711SPaolo Bonzini fprintf_fn (stream, "tbr");
187376cad711SPaolo Bonzini break;
187476cad711SPaolo Bonzini case A_DISP2_TBR:
187576cad711SPaolo Bonzini fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm);
187676cad711SPaolo Bonzini break;
187776cad711SPaolo Bonzini case A_INC_R15:
187876cad711SPaolo Bonzini fprintf_fn (stream, "@r15+");
187976cad711SPaolo Bonzini break;
188076cad711SPaolo Bonzini case A_DEC_R15:
188176cad711SPaolo Bonzini fprintf_fn (stream, "@-r15");
188276cad711SPaolo Bonzini break;
188376cad711SPaolo Bonzini case A_R0_GBR:
188476cad711SPaolo Bonzini fprintf_fn (stream, "@(r0,gbr)");
188576cad711SPaolo Bonzini break;
188676cad711SPaolo Bonzini case A_BDISP12:
188776cad711SPaolo Bonzini case A_BDISP8:
188876cad711SPaolo Bonzini {
188976cad711SPaolo Bonzini bfd_vma addr;
189076cad711SPaolo Bonzini addr = imm + memaddr;
189176cad711SPaolo Bonzini (*info->print_address_func) (addr, info);
189276cad711SPaolo Bonzini }
189376cad711SPaolo Bonzini break;
189476cad711SPaolo Bonzini case A_SR:
189576cad711SPaolo Bonzini fprintf_fn (stream, "sr");
189676cad711SPaolo Bonzini break;
189776cad711SPaolo Bonzini case A_GBR:
189876cad711SPaolo Bonzini fprintf_fn (stream, "gbr");
189976cad711SPaolo Bonzini break;
190076cad711SPaolo Bonzini case A_VBR:
190176cad711SPaolo Bonzini fprintf_fn (stream, "vbr");
190276cad711SPaolo Bonzini break;
190376cad711SPaolo Bonzini case A_DSR:
190476cad711SPaolo Bonzini fprintf_fn (stream, "dsr");
190576cad711SPaolo Bonzini break;
190676cad711SPaolo Bonzini case A_MOD:
190776cad711SPaolo Bonzini fprintf_fn (stream, "mod");
190876cad711SPaolo Bonzini break;
190976cad711SPaolo Bonzini case A_RE:
191076cad711SPaolo Bonzini fprintf_fn (stream, "re");
191176cad711SPaolo Bonzini break;
191276cad711SPaolo Bonzini case A_RS:
191376cad711SPaolo Bonzini fprintf_fn (stream, "rs");
191476cad711SPaolo Bonzini break;
191576cad711SPaolo Bonzini case A_A0:
191676cad711SPaolo Bonzini fprintf_fn (stream, "a0");
191776cad711SPaolo Bonzini break;
191876cad711SPaolo Bonzini case A_X0:
191976cad711SPaolo Bonzini fprintf_fn (stream, "x0");
192076cad711SPaolo Bonzini break;
192176cad711SPaolo Bonzini case A_X1:
192276cad711SPaolo Bonzini fprintf_fn (stream, "x1");
192376cad711SPaolo Bonzini break;
192476cad711SPaolo Bonzini case A_Y0:
192576cad711SPaolo Bonzini fprintf_fn (stream, "y0");
192676cad711SPaolo Bonzini break;
192776cad711SPaolo Bonzini case A_Y1:
192876cad711SPaolo Bonzini fprintf_fn (stream, "y1");
192976cad711SPaolo Bonzini break;
193076cad711SPaolo Bonzini case DSP_REG_M:
193176cad711SPaolo Bonzini print_dsp_reg (rm, fprintf_fn, stream);
193276cad711SPaolo Bonzini break;
193376cad711SPaolo Bonzini case A_SSR:
193476cad711SPaolo Bonzini fprintf_fn (stream, "ssr");
193576cad711SPaolo Bonzini break;
193676cad711SPaolo Bonzini case A_SPC:
193776cad711SPaolo Bonzini fprintf_fn (stream, "spc");
193876cad711SPaolo Bonzini break;
193976cad711SPaolo Bonzini case A_MACH:
194076cad711SPaolo Bonzini fprintf_fn (stream, "mach");
194176cad711SPaolo Bonzini break;
194276cad711SPaolo Bonzini case A_MACL:
194376cad711SPaolo Bonzini fprintf_fn (stream, "macl");
194476cad711SPaolo Bonzini break;
194576cad711SPaolo Bonzini case A_PR:
194676cad711SPaolo Bonzini fprintf_fn (stream, "pr");
194776cad711SPaolo Bonzini break;
194876cad711SPaolo Bonzini case A_SGR:
194976cad711SPaolo Bonzini fprintf_fn (stream, "sgr");
195076cad711SPaolo Bonzini break;
195176cad711SPaolo Bonzini case A_DBR:
195276cad711SPaolo Bonzini fprintf_fn (stream, "dbr");
195376cad711SPaolo Bonzini break;
195476cad711SPaolo Bonzini case F_REG_N:
195576cad711SPaolo Bonzini fprintf_fn (stream, "fr%d", rn);
195676cad711SPaolo Bonzini break;
195776cad711SPaolo Bonzini case F_REG_M:
195876cad711SPaolo Bonzini fprintf_fn (stream, "fr%d", rm);
195976cad711SPaolo Bonzini break;
196076cad711SPaolo Bonzini case DX_REG_N:
196176cad711SPaolo Bonzini if (rn & 1)
196276cad711SPaolo Bonzini {
196376cad711SPaolo Bonzini fprintf_fn (stream, "xd%d", rn & ~1);
196476cad711SPaolo Bonzini break;
196576cad711SPaolo Bonzini }
1966*ccb23709SThomas Huth /* fallthrough */
196776cad711SPaolo Bonzini case D_REG_N:
196876cad711SPaolo Bonzini fprintf_fn (stream, "dr%d", rn);
196976cad711SPaolo Bonzini break;
197076cad711SPaolo Bonzini case DX_REG_M:
197176cad711SPaolo Bonzini if (rm & 1)
197276cad711SPaolo Bonzini {
197376cad711SPaolo Bonzini fprintf_fn (stream, "xd%d", rm & ~1);
197476cad711SPaolo Bonzini break;
197576cad711SPaolo Bonzini }
1976*ccb23709SThomas Huth /* fallthrough */
197776cad711SPaolo Bonzini case D_REG_M:
197876cad711SPaolo Bonzini fprintf_fn (stream, "dr%d", rm);
197976cad711SPaolo Bonzini break;
198076cad711SPaolo Bonzini case FPSCR_M:
198176cad711SPaolo Bonzini case FPSCR_N:
198276cad711SPaolo Bonzini fprintf_fn (stream, "fpscr");
198376cad711SPaolo Bonzini break;
198476cad711SPaolo Bonzini case FPUL_M:
198576cad711SPaolo Bonzini case FPUL_N:
198676cad711SPaolo Bonzini fprintf_fn (stream, "fpul");
198776cad711SPaolo Bonzini break;
198876cad711SPaolo Bonzini case F_FR0:
198976cad711SPaolo Bonzini fprintf_fn (stream, "fr0");
199076cad711SPaolo Bonzini break;
199176cad711SPaolo Bonzini case V_REG_N:
199276cad711SPaolo Bonzini fprintf_fn (stream, "fv%d", rn * 4);
199376cad711SPaolo Bonzini break;
199476cad711SPaolo Bonzini case V_REG_M:
199576cad711SPaolo Bonzini fprintf_fn (stream, "fv%d", rm * 4);
199676cad711SPaolo Bonzini break;
199776cad711SPaolo Bonzini case XMTRX_M4:
199876cad711SPaolo Bonzini fprintf_fn (stream, "xmtrx");
199976cad711SPaolo Bonzini break;
200076cad711SPaolo Bonzini default:
200176cad711SPaolo Bonzini abort ();
200276cad711SPaolo Bonzini }
200376cad711SPaolo Bonzini }
200476cad711SPaolo Bonzini
200576cad711SPaolo Bonzini #if 0
200676cad711SPaolo Bonzini /* This code prints instructions in delay slots on the same line
200776cad711SPaolo Bonzini as the instruction which needs the delay slots. This can be
200876cad711SPaolo Bonzini confusing, since other disassembler don't work this way, and
200976cad711SPaolo Bonzini it means that the instructions are not all in a line. So I
201076cad711SPaolo Bonzini disabled it. Ian. */
201176cad711SPaolo Bonzini if (!(info->flags & 1)
201276cad711SPaolo Bonzini && (op->name[0] == 'j'
201376cad711SPaolo Bonzini || (op->name[0] == 'b'
201476cad711SPaolo Bonzini && (op->name[1] == 'r'
201576cad711SPaolo Bonzini || op->name[1] == 's'))
201676cad711SPaolo Bonzini || (op->name[0] == 'r' && op->name[1] == 't')
201776cad711SPaolo Bonzini || (op->name[0] == 'b' && op->name[2] == '.')))
201876cad711SPaolo Bonzini {
201976cad711SPaolo Bonzini info->flags |= 1;
202076cad711SPaolo Bonzini fprintf_fn (stream, "\t(slot ");
202176cad711SPaolo Bonzini print_insn_sh (memaddr + 2, info);
202276cad711SPaolo Bonzini info->flags &= ~1;
202376cad711SPaolo Bonzini fprintf_fn (stream, ")");
202476cad711SPaolo Bonzini return 4;
202576cad711SPaolo Bonzini }
202676cad711SPaolo Bonzini #endif
202776cad711SPaolo Bonzini
202876cad711SPaolo Bonzini if (disp_pc && strcmp (op->name, "mova") != 0)
202976cad711SPaolo Bonzini {
203076cad711SPaolo Bonzini int size;
203176cad711SPaolo Bonzini bfd_byte bytes[4];
203276cad711SPaolo Bonzini
203376cad711SPaolo Bonzini if (relmask == ~(bfd_vma) 1)
203476cad711SPaolo Bonzini size = 2;
203576cad711SPaolo Bonzini else
203676cad711SPaolo Bonzini size = 4;
203776cad711SPaolo Bonzini status = info->read_memory_func (disp_pc_addr, bytes, size, info);
203876cad711SPaolo Bonzini if (status == 0)
203976cad711SPaolo Bonzini {
204076cad711SPaolo Bonzini unsigned int val;
204176cad711SPaolo Bonzini
204276cad711SPaolo Bonzini if (size == 2)
204376cad711SPaolo Bonzini {
204476cad711SPaolo Bonzini if (info->endian == BFD_ENDIAN_LITTLE)
204576cad711SPaolo Bonzini val = bfd_getl16 (bytes);
204676cad711SPaolo Bonzini else
204776cad711SPaolo Bonzini val = bfd_getb16 (bytes);
204876cad711SPaolo Bonzini }
204976cad711SPaolo Bonzini else
205076cad711SPaolo Bonzini {
205176cad711SPaolo Bonzini if (info->endian == BFD_ENDIAN_LITTLE)
205276cad711SPaolo Bonzini val = bfd_getl32 (bytes);
205376cad711SPaolo Bonzini else
205476cad711SPaolo Bonzini val = bfd_getb32 (bytes);
205576cad711SPaolo Bonzini }
205676cad711SPaolo Bonzini if ((*info->symbol_at_address_func) (val, info))
205776cad711SPaolo Bonzini {
205876cad711SPaolo Bonzini fprintf_fn (stream, "\t! ");
205976cad711SPaolo Bonzini (*info->print_address_func) (val, info);
206076cad711SPaolo Bonzini }
206176cad711SPaolo Bonzini else
206276cad711SPaolo Bonzini fprintf_fn (stream, "\t! 0x%x", val);
206376cad711SPaolo Bonzini }
206476cad711SPaolo Bonzini }
206576cad711SPaolo Bonzini
206676cad711SPaolo Bonzini return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2;
206776cad711SPaolo Bonzini fail:
206876cad711SPaolo Bonzini ;
206976cad711SPaolo Bonzini
207076cad711SPaolo Bonzini }
207176cad711SPaolo Bonzini fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]);
207276cad711SPaolo Bonzini return 2;
207376cad711SPaolo Bonzini }
2074