1 /* Disassemble SH instructions. 2 Copyright 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002, 2003, 2004 3 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, see <http://www.gnu.org/licenses/>. */ 17 18 #include "qemu/osdep.h" 19 #include "disas/bfd.h" 20 21 #define DEFINE_TABLE 22 23 typedef enum 24 { 25 HEX_0, 26 HEX_1, 27 HEX_2, 28 HEX_3, 29 HEX_4, 30 HEX_5, 31 HEX_6, 32 HEX_7, 33 HEX_8, 34 HEX_9, 35 HEX_A, 36 HEX_B, 37 HEX_C, 38 HEX_D, 39 HEX_E, 40 HEX_F, 41 HEX_XX00, 42 HEX_00YY, 43 REG_N, 44 REG_N_D, /* nnn0 */ 45 REG_N_B01, /* nn01 */ 46 REG_M, 47 SDT_REG_N, 48 REG_NM, 49 REG_B, 50 BRANCH_12, 51 BRANCH_8, 52 IMM0_4, 53 IMM0_4BY2, 54 IMM0_4BY4, 55 IMM1_4, 56 IMM1_4BY2, 57 IMM1_4BY4, 58 PCRELIMM_8BY2, 59 PCRELIMM_8BY4, 60 IMM0_8, 61 IMM0_8BY2, 62 IMM0_8BY4, 63 IMM1_8, 64 IMM1_8BY2, 65 IMM1_8BY4, 66 PPI, 67 NOPX, 68 NOPY, 69 MOVX, 70 MOVY, 71 MOVX_NOPY, 72 MOVY_NOPX, 73 PSH, 74 PMUL, 75 PPI3, 76 PPI3NC, 77 PDC, 78 PPIC, 79 REPEAT, 80 IMM0_3c, /* xxxx 0iii */ 81 IMM0_3s, /* xxxx 1iii */ 82 IMM0_3Uc, /* 0iii xxxx */ 83 IMM0_3Us, /* 1iii xxxx */ 84 IMM0_20_4, 85 IMM0_20, /* follows IMM0_20_4 */ 86 IMM0_20BY8, /* follows IMM0_20_4 */ 87 DISP0_12, 88 DISP0_12BY2, 89 DISP0_12BY4, 90 DISP0_12BY8, 91 DISP1_12, 92 DISP1_12BY2, 93 DISP1_12BY4, 94 DISP1_12BY8 95 } 96 sh_nibble_type; 97 98 typedef enum 99 { 100 A_END, 101 A_BDISP12, 102 A_BDISP8, 103 A_DEC_M, 104 A_DEC_N, 105 A_DISP_GBR, 106 A_PC, 107 A_DISP_PC, 108 A_DISP_PC_ABS, 109 A_DISP_REG_M, 110 A_DISP_REG_N, 111 A_GBR, 112 A_IMM, 113 A_INC_M, 114 A_INC_N, 115 A_IND_M, 116 A_IND_N, 117 A_IND_R0_REG_M, 118 A_IND_R0_REG_N, 119 A_MACH, 120 A_MACL, 121 A_PR, 122 A_R0, 123 A_R0_GBR, 124 A_REG_M, 125 A_REG_N, 126 A_REG_B, 127 A_SR, 128 A_VBR, 129 A_TBR, 130 A_DISP_TBR, 131 A_DISP2_TBR, 132 A_DEC_R15, 133 A_INC_R15, 134 A_MOD, 135 A_RE, 136 A_RS, 137 A_DSR, 138 DSP_REG_M, 139 DSP_REG_N, 140 DSP_REG_X, 141 DSP_REG_Y, 142 DSP_REG_E, 143 DSP_REG_F, 144 DSP_REG_G, 145 DSP_REG_A_M, 146 DSP_REG_AX, 147 DSP_REG_XY, 148 DSP_REG_AY, 149 DSP_REG_YX, 150 AX_INC_N, 151 AY_INC_N, 152 AXY_INC_N, 153 AYX_INC_N, 154 AX_IND_N, 155 AY_IND_N, 156 AXY_IND_N, 157 AYX_IND_N, 158 AX_PMOD_N, 159 AXY_PMOD_N, 160 AY_PMOD_N, 161 AYX_PMOD_N, 162 AS_DEC_N, 163 AS_INC_N, 164 AS_IND_N, 165 AS_PMOD_N, 166 A_A0, 167 A_X0, 168 A_X1, 169 A_Y0, 170 A_Y1, 171 A_SSR, 172 A_SPC, 173 A_SGR, 174 A_DBR, 175 F_REG_N, 176 F_REG_M, 177 D_REG_N, 178 D_REG_M, 179 X_REG_N, /* Only used for argument parsing. */ 180 X_REG_M, /* Only used for argument parsing. */ 181 DX_REG_N, 182 DX_REG_M, 183 V_REG_N, 184 V_REG_M, 185 XMTRX_M4, 186 F_FR0, 187 FPUL_N, 188 FPUL_M, 189 FPSCR_N, 190 FPSCR_M 191 } 192 sh_arg_type; 193 194 typedef enum 195 { 196 A_A1_NUM = 5, 197 A_A0_NUM = 7, 198 A_X0_NUM, A_X1_NUM, A_Y0_NUM, A_Y1_NUM, 199 A_M0_NUM, A_A1G_NUM, A_M1_NUM, A_A0G_NUM 200 } 201 sh_dsp_reg_nums; 202 203 #define arch_sh1_base 0x0001 204 #define arch_sh2_base 0x0002 205 #define arch_sh3_base 0x0004 206 #define arch_sh4_base 0x0008 207 #define arch_sh4a_base 0x0010 208 #define arch_sh2a_base 0x0020 209 210 /* This is an annotation on instruction types, but we abuse the arch 211 field in instructions to denote it. */ 212 #define arch_op32 0x00100000 /* This is a 32-bit opcode. */ 213 214 #define arch_sh_no_mmu 0x04000000 215 #define arch_sh_has_mmu 0x08000000 216 #define arch_sh_no_co 0x10000000 /* neither FPU nor DSP co-processor */ 217 #define arch_sh_sp_fpu 0x20000000 /* single precision FPU */ 218 #define arch_sh_dp_fpu 0x40000000 /* double precision FPU */ 219 #define arch_sh_has_dsp 0x80000000 220 221 222 #define arch_sh_base_mask 0x0000003f 223 #define arch_opann_mask 0x00100000 224 #define arch_sh_mmu_mask 0x0c000000 225 #define arch_sh_co_mask 0xf0000000 226 227 228 #define arch_sh1 (arch_sh1_base|arch_sh_no_mmu|arch_sh_no_co) 229 #define arch_sh2 (arch_sh2_base|arch_sh_no_mmu|arch_sh_no_co) 230 #define arch_sh2a (arch_sh2a_base|arch_sh_no_mmu|arch_sh_dp_fpu) 231 #define arch_sh2a_nofpu (arch_sh2a_base|arch_sh_no_mmu|arch_sh_no_co) 232 #define arch_sh2e (arch_sh2_base|arch_sh2a_base|arch_sh_no_mmu|arch_sh_sp_fpu) 233 #define arch_sh_dsp (arch_sh2_base|arch_sh_no_mmu|arch_sh_has_dsp) 234 #define arch_sh3_nommu (arch_sh3_base|arch_sh_no_mmu|arch_sh_no_co) 235 #define arch_sh3 (arch_sh3_base|arch_sh_has_mmu|arch_sh_no_co) 236 #define arch_sh3e (arch_sh3_base|arch_sh_has_mmu|arch_sh_sp_fpu) 237 #define arch_sh3_dsp (arch_sh3_base|arch_sh_has_mmu|arch_sh_has_dsp) 238 #define arch_sh4 (arch_sh4_base|arch_sh_has_mmu|arch_sh_dp_fpu) 239 #define arch_sh4a (arch_sh4a_base|arch_sh_has_mmu|arch_sh_dp_fpu) 240 #define arch_sh4al_dsp (arch_sh4a_base|arch_sh_has_mmu|arch_sh_has_dsp) 241 #define arch_sh4_nofpu (arch_sh4_base|arch_sh_has_mmu|arch_sh_no_co) 242 #define arch_sh4a_nofpu (arch_sh4a_base|arch_sh_has_mmu|arch_sh_no_co) 243 #define arch_sh4_nommu_nofpu (arch_sh4_base|arch_sh_no_mmu|arch_sh_no_co) 244 245 #define SH_MERGE_ARCH_SET(SET1, SET2) ((SET1) & (SET2)) 246 #define SH_VALID_BASE_ARCH_SET(SET) (((SET) & arch_sh_base_mask) != 0) 247 #define SH_VALID_MMU_ARCH_SET(SET) (((SET) & arch_sh_mmu_mask) != 0) 248 #define SH_VALID_CO_ARCH_SET(SET) (((SET) & arch_sh_co_mask) != 0) 249 #define SH_VALID_ARCH_SET(SET) \ 250 (SH_VALID_BASE_ARCH_SET (SET) \ 251 && SH_VALID_MMU_ARCH_SET (SET) \ 252 && SH_VALID_CO_ARCH_SET (SET)) 253 #define SH_MERGE_ARCH_SET_VALID(SET1, SET2) \ 254 SH_VALID_ARCH_SET (SH_MERGE_ARCH_SET (SET1, SET2)) 255 256 #define SH_ARCH_SET_HAS_FPU(SET) \ 257 (((SET) & (arch_sh_sp_fpu | arch_sh_dp_fpu)) != 0) 258 #define SH_ARCH_SET_HAS_DSP(SET) \ 259 (((SET) & arch_sh_has_dsp) != 0) 260 261 /* This is returned from the functions below when an error occurs 262 (in addition to a call to BFD_FAIL). The value should allow 263 the tools to continue to function in most cases - there may 264 be some confusion between DSP and FPU etc. */ 265 #define SH_ARCH_UNKNOWN_ARCH 0xffffffff 266 267 /* These are defined in bfd/cpu-sh.c . */ 268 unsigned int sh_get_arch_from_bfd_mach (unsigned long mach); 269 unsigned int sh_get_arch_up_from_bfd_mach (unsigned long mach); 270 unsigned long sh_get_bfd_mach_from_arch_set (unsigned int arch_set); 271 /* bfd_boolean sh_merge_bfd_arch (bfd *ibfd, bfd *obfd); */ 272 273 /* Below are the 'architecture sets'. 274 They describe the following inheritance graph: 275 276 SH1 277 | 278 SH2 279 .------------'|`--------------------. 280 / | \ 281 SH-DSP SH3-nommu SH2E 282 | |`--------. | 283 | | \ | 284 | SH3 SH4-nommu-nofpu | 285 | | | | 286 | .------------'|`----------+---------. | 287 |/ / \| 288 | | .-------' | 289 | |/ | 290 SH3-dsp SH4-nofpu SH3E 291 | |`--------------------. | 292 | | \| 293 | SH4A-nofpu SH4 294 | .------------' `--------------------. | 295 |/ \| 296 SH4AL-dsp SH4A 297 298 */ 299 300 /* Central branches */ 301 #define arch_sh1_up (arch_sh1 | arch_sh2_up) 302 #define arch_sh2_up (arch_sh2 | arch_sh2e_up | arch_sh2a_nofpu_up | arch_sh3_nommu_up | arch_sh_dsp_up) 303 #define arch_sh3_nommu_up (arch_sh3_nommu | arch_sh3_up | arch_sh4_nommu_nofpu_up) 304 #define arch_sh3_up (arch_sh3 | arch_sh3e_up | arch_sh3_dsp_up | arch_sh4_nofp_up) 305 #define arch_sh4_nommu_nofpu_up (arch_sh4_nommu_nofpu | arch_sh4_nofp_up) 306 #define arch_sh4_nofp_up (arch_sh4_nofpu | arch_sh4_up | arch_sh4a_nofp_up) 307 #define arch_sh4a_nofp_up (arch_sh4a_nofpu | arch_sh4a_up | arch_sh4al_dsp_up) 308 309 /* Right branch */ 310 #define arch_sh2e_up (arch_sh2e | arch_sh2a_up | arch_sh3e_up) 311 #define arch_sh3e_up (arch_sh3e | arch_sh4_up) 312 #define arch_sh4_up (arch_sh4 | arch_sh4a_up) 313 #define arch_sh4a_up (arch_sh4a) 314 315 /* Left branch */ 316 #define arch_sh_dsp_up (arch_sh_dsp | arch_sh3_dsp_up) 317 #define arch_sh3_dsp_up (arch_sh3_dsp | arch_sh4al_dsp_up) 318 #define arch_sh4al_dsp_up (arch_sh4al_dsp) 319 320 /* SH 2a branched off SH2e, adding a lot but not all of SH4 and SH4a. */ 321 #define arch_sh2a_up (arch_sh2a) 322 #define arch_sh2a_nofpu_up (arch_sh2a_nofpu | arch_sh2a_up) 323 324 325 typedef struct 326 { 327 const char *name; 328 sh_arg_type arg[4]; 329 sh_nibble_type nibbles[9]; 330 unsigned int arch; 331 } sh_opcode_info; 332 333 #ifdef DEFINE_TABLE 334 335 static const sh_opcode_info sh_table[] = 336 { 337 /* 0111nnnni8*1.... add #<imm>,<REG_N> */{"add",{A_IMM,A_REG_N},{HEX_7,REG_N,IMM0_8}, arch_sh1_up}, 338 339 /* 0011nnnnmmmm1100 add <REG_M>,<REG_N> */{"add",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_C}, arch_sh1_up}, 340 341 /* 0011nnnnmmmm1110 addc <REG_M>,<REG_N>*/{"addc",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_E}, arch_sh1_up}, 342 343 /* 0011nnnnmmmm1111 addv <REG_M>,<REG_N>*/{"addv",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_F}, arch_sh1_up}, 344 345 /* 11001001i8*1.... and #<imm>,R0 */{"and",{A_IMM,A_R0},{HEX_C,HEX_9,IMM0_8}, arch_sh1_up}, 346 347 /* 0010nnnnmmmm1001 and <REG_M>,<REG_N> */{"and",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_9}, arch_sh1_up}, 348 349 /* 11001101i8*1.... and.b #<imm>,@(R0,GBR)*/{"and.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_D,IMM0_8}, arch_sh1_up}, 350 351 /* 1010i12......... bra <bdisp12> */{"bra",{A_BDISP12},{HEX_A,BRANCH_12}, arch_sh1_up}, 352 353 /* 1011i12......... bsr <bdisp12> */{"bsr",{A_BDISP12},{HEX_B,BRANCH_12}, arch_sh1_up}, 354 355 /* 10001001i8p1.... bt <bdisp8> */{"bt",{A_BDISP8},{HEX_8,HEX_9,BRANCH_8}, arch_sh1_up}, 356 357 /* 10001011i8p1.... bf <bdisp8> */{"bf",{A_BDISP8},{HEX_8,HEX_B,BRANCH_8}, arch_sh1_up}, 358 359 /* 10001101i8p1.... bt.s <bdisp8> */{"bt.s",{A_BDISP8},{HEX_8,HEX_D,BRANCH_8}, arch_sh2_up}, 360 361 /* 10001101i8p1.... bt/s <bdisp8> */{"bt/s",{A_BDISP8},{HEX_8,HEX_D,BRANCH_8}, arch_sh2_up}, 362 363 /* 10001111i8p1.... bf.s <bdisp8> */{"bf.s",{A_BDISP8},{HEX_8,HEX_F,BRANCH_8}, arch_sh2_up}, 364 365 /* 10001111i8p1.... bf/s <bdisp8> */{"bf/s",{A_BDISP8},{HEX_8,HEX_F,BRANCH_8}, arch_sh2_up}, 366 367 /* 0000000010001000 clrdmxy */{"clrdmxy",{0},{HEX_0,HEX_0,HEX_8,HEX_8}, arch_sh4al_dsp_up}, 368 369 /* 0000000000101000 clrmac */{"clrmac",{0},{HEX_0,HEX_0,HEX_2,HEX_8}, arch_sh1_up}, 370 371 /* 0000000001001000 clrs */{"clrs",{0},{HEX_0,HEX_0,HEX_4,HEX_8}, arch_sh1_up}, 372 373 /* 0000000000001000 clrt */{"clrt",{0},{HEX_0,HEX_0,HEX_0,HEX_8}, arch_sh1_up}, 374 375 /* 10001000i8*1.... cmp/eq #<imm>,R0 */{"cmp/eq",{A_IMM,A_R0},{HEX_8,HEX_8,IMM0_8}, arch_sh1_up}, 376 377 /* 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}, 378 379 /* 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}, 380 381 /* 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}, 382 383 /* 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}, 384 385 /* 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}, 386 387 /* 0100nnnn00010101 cmp/pl <REG_N> */{"cmp/pl",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_5}, arch_sh1_up}, 388 389 /* 0100nnnn00010001 cmp/pz <REG_N> */{"cmp/pz",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_1}, arch_sh1_up}, 390 391 /* 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}, 392 393 /* 0010nnnnmmmm0111 div0s <REG_M>,<REG_N>*/{"div0s",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_7}, arch_sh1_up}, 394 395 /* 0000000000011001 div0u */{"div0u",{0},{HEX_0,HEX_0,HEX_1,HEX_9}, arch_sh1_up}, 396 397 /* 0011nnnnmmmm0100 div1 <REG_M>,<REG_N>*/{"div1",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_4}, arch_sh1_up}, 398 399 /* 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}, 400 401 /* 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}, 402 403 /* 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}, 404 405 /* 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}, 406 407 /* 0000nnnn11100011 icbi @<REG_N> */{"icbi",{A_IND_N},{HEX_0,REG_N,HEX_E,HEX_3}, arch_sh4a_nofp_up}, 408 409 /* 0100nnnn00101011 jmp @<REG_N> */{"jmp",{A_IND_N},{HEX_4,REG_N,HEX_2,HEX_B}, arch_sh1_up}, 410 411 /* 0100nnnn00001011 jsr @<REG_N> */{"jsr",{A_IND_N},{HEX_4,REG_N,HEX_0,HEX_B}, arch_sh1_up}, 412 413 /* 0100nnnn00001110 ldc <REG_N>,SR */{"ldc",{A_REG_N,A_SR},{HEX_4,REG_N,HEX_0,HEX_E}, arch_sh1_up}, 414 415 /* 0100nnnn00011110 ldc <REG_N>,GBR */{"ldc",{A_REG_N,A_GBR},{HEX_4,REG_N,HEX_1,HEX_E}, arch_sh1_up}, 416 417 /* 0100nnnn00111010 ldc <REG_N>,SGR */{"ldc",{A_REG_N,A_SGR},{HEX_4,REG_N,HEX_3,HEX_A}, arch_sh4_nommu_nofpu_up}, 418 419 /* 0100mmmm01001010 ldc <REG_M>,TBR */{"ldc",{A_REG_M,A_TBR},{HEX_4,REG_M,HEX_4,HEX_A}, arch_sh2a_nofpu_up}, 420 421 /* 0100nnnn00101110 ldc <REG_N>,VBR */{"ldc",{A_REG_N,A_VBR},{HEX_4,REG_N,HEX_2,HEX_E}, arch_sh1_up}, 422 423 /* 0100nnnn01011110 ldc <REG_N>,MOD */{"ldc",{A_REG_N,A_MOD},{HEX_4,REG_N,HEX_5,HEX_E}, arch_sh_dsp_up}, 424 425 /* 0100nnnn01111110 ldc <REG_N>,RE */{"ldc",{A_REG_N,A_RE},{HEX_4,REG_N,HEX_7,HEX_E}, arch_sh_dsp_up}, 426 427 /* 0100nnnn01101110 ldc <REG_N>,RS */{"ldc",{A_REG_N,A_RS},{HEX_4,REG_N,HEX_6,HEX_E}, arch_sh_dsp_up}, 428 429 /* 0100nnnn00111110 ldc <REG_N>,SSR */{"ldc",{A_REG_N,A_SSR},{HEX_4,REG_N,HEX_3,HEX_E}, arch_sh3_nommu_up}, 430 431 /* 0100nnnn01001110 ldc <REG_N>,SPC */{"ldc",{A_REG_N,A_SPC},{HEX_4,REG_N,HEX_4,HEX_E}, arch_sh3_nommu_up}, 432 433 /* 0100nnnn11111010 ldc <REG_N>,DBR */{"ldc",{A_REG_N,A_DBR},{HEX_4,REG_N,HEX_F,HEX_A}, arch_sh4_nommu_nofpu_up}, 434 435 /* 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}, 436 437 /* 0100nnnn00000111 ldc.l @<REG_N>+,SR */{"ldc.l",{A_INC_N,A_SR},{HEX_4,REG_N,HEX_0,HEX_7}, arch_sh1_up}, 438 439 /* 0100nnnn00010111 ldc.l @<REG_N>+,GBR */{"ldc.l",{A_INC_N,A_GBR},{HEX_4,REG_N,HEX_1,HEX_7}, arch_sh1_up}, 440 441 /* 0100nnnn00100111 ldc.l @<REG_N>+,VBR */{"ldc.l",{A_INC_N,A_VBR},{HEX_4,REG_N,HEX_2,HEX_7}, arch_sh1_up}, 442 443 /* 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}, 444 445 /* 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}, 446 447 /* 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}, 448 449 /* 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}, 450 451 /* 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}, 452 453 /* 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}, 454 455 /* 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}, 456 457 /* 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}, 458 459 /* 0100mmmm00110100 ldrc <REG_M> */{"ldrc",{A_REG_M},{HEX_4,REG_M,HEX_3,HEX_4}, arch_sh4al_dsp_up}, 460 /* 10001010i8*1.... ldrc #<imm> */{"ldrc",{A_IMM},{HEX_8,HEX_A,IMM0_8}, arch_sh4al_dsp_up}, 461 462 /* 10001110i8p2.... ldre @(<disp>,PC) */{"ldre",{A_DISP_PC},{HEX_8,HEX_E,PCRELIMM_8BY2}, arch_sh_dsp_up}, 463 464 /* 10001100i8p2.... ldrs @(<disp>,PC) */{"ldrs",{A_DISP_PC},{HEX_8,HEX_C,PCRELIMM_8BY2}, arch_sh_dsp_up}, 465 466 /* 0100nnnn00001010 lds <REG_N>,MACH */{"lds",{A_REG_N,A_MACH},{HEX_4,REG_N,HEX_0,HEX_A}, arch_sh1_up}, 467 468 /* 0100nnnn00011010 lds <REG_N>,MACL */{"lds",{A_REG_N,A_MACL},{HEX_4,REG_N,HEX_1,HEX_A}, arch_sh1_up}, 469 470 /* 0100nnnn00101010 lds <REG_N>,PR */{"lds",{A_REG_N,A_PR},{HEX_4,REG_N,HEX_2,HEX_A}, arch_sh1_up}, 471 472 /* 0100nnnn01101010 lds <REG_N>,DSR */{"lds",{A_REG_N,A_DSR},{HEX_4,REG_N,HEX_6,HEX_A}, arch_sh_dsp_up}, 473 474 /* 0100nnnn01111010 lds <REG_N>,A0 */{"lds",{A_REG_N,A_A0},{HEX_4,REG_N,HEX_7,HEX_A}, arch_sh_dsp_up}, 475 476 /* 0100nnnn10001010 lds <REG_N>,X0 */{"lds",{A_REG_N,A_X0},{HEX_4,REG_N,HEX_8,HEX_A}, arch_sh_dsp_up}, 477 478 /* 0100nnnn10011010 lds <REG_N>,X1 */{"lds",{A_REG_N,A_X1},{HEX_4,REG_N,HEX_9,HEX_A}, arch_sh_dsp_up}, 479 480 /* 0100nnnn10101010 lds <REG_N>,Y0 */{"lds",{A_REG_N,A_Y0},{HEX_4,REG_N,HEX_A,HEX_A}, arch_sh_dsp_up}, 481 482 /* 0100nnnn10111010 lds <REG_N>,Y1 */{"lds",{A_REG_N,A_Y1},{HEX_4,REG_N,HEX_B,HEX_A}, arch_sh_dsp_up}, 483 484 /* 0100nnnn01011010 lds <REG_N>,FPUL */{"lds",{A_REG_M,FPUL_N},{HEX_4,REG_M,HEX_5,HEX_A}, arch_sh2e_up}, 485 486 /* 0100nnnn01101010 lds <REG_M>,FPSCR */{"lds",{A_REG_M,FPSCR_N},{HEX_4,REG_M,HEX_6,HEX_A}, arch_sh2e_up}, 487 488 /* 0100nnnn00000110 lds.l @<REG_N>+,MACH*/{"lds.l",{A_INC_N,A_MACH},{HEX_4,REG_N,HEX_0,HEX_6}, arch_sh1_up}, 489 490 /* 0100nnnn00010110 lds.l @<REG_N>+,MACL*/{"lds.l",{A_INC_N,A_MACL},{HEX_4,REG_N,HEX_1,HEX_6}, arch_sh1_up}, 491 492 /* 0100nnnn00100110 lds.l @<REG_N>+,PR */{"lds.l",{A_INC_N,A_PR},{HEX_4,REG_N,HEX_2,HEX_6}, arch_sh1_up}, 493 494 /* 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}, 495 496 /* 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}, 497 498 /* 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}, 499 500 /* 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}, 501 502 /* 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}, 503 504 /* 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}, 505 506 /* 0100nnnn01010110 lds.l @<REG_M>+,FPUL*/{"lds.l",{A_INC_M,FPUL_N},{HEX_4,REG_M,HEX_5,HEX_6}, arch_sh2e_up}, 507 508 /* 0100nnnn01100110 lds.l @<REG_M>+,FPSCR*/{"lds.l",{A_INC_M,FPSCR_N},{HEX_4,REG_M,HEX_6,HEX_6}, arch_sh2e_up}, 509 510 /* 0000000000111000 ldtlb */{"ldtlb",{0},{HEX_0,HEX_0,HEX_3,HEX_8}, arch_sh3_up}, 511 512 /* 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}, 513 514 /* 1110nnnni8*1.... mov #<imm>,<REG_N> */{"mov",{A_IMM,A_REG_N},{HEX_E,REG_N,IMM0_8}, arch_sh1_up}, 515 516 /* 0110nnnnmmmm0011 mov <REG_M>,<REG_N> */{"mov",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_3}, arch_sh1_up}, 517 518 /* 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}, 519 520 /* 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}, 521 522 /* 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}, 523 524 /* 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}, 525 526 /* 11000100i8*1.... mov.b @(<disp>,GBR),R0*/{"mov.b",{A_DISP_GBR,A_R0},{HEX_C,HEX_4,IMM0_8}, arch_sh1_up}, 527 528 /* 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}, 529 530 /* 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}, 531 532 /* 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}, 533 534 /* 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}, 535 536 /* 11000000i8*1.... mov.b R0,@(<disp>,GBR)*/{"mov.b",{A_R0,A_DISP_GBR},{HEX_C,HEX_0,IMM1_8}, arch_sh1_up}, 537 538 /* 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}, 539 /* 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}, 540 /* 0011nnnnmmmm0001 0000dddddddddddd mov.b <REG_M>,@(<DISP12>,<REG_N>) */ 541 {"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}, 542 /* 0011nnnnmmmm0001 0100dddddddddddd mov.b @(<DISP12>,<REG_M>),<REG_N> */ 543 {"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}, 544 /* 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}, 545 546 /* 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}, 547 548 /* 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}, 549 550 /* 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}, 551 552 /* 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}, 553 554 /* 11000110i8*4.... mov.l @(<disp>,GBR),R0*/{"mov.l",{A_DISP_GBR,A_R0},{HEX_C,HEX_6,IMM0_8BY4}, arch_sh1_up}, 555 556 /* 1101nnnni8p4.... mov.l @(<disp>,PC),<REG_N>*/{"mov.l",{A_DISP_PC,A_REG_N},{HEX_D,REG_N,PCRELIMM_8BY4}, arch_sh1_up}, 557 558 /* 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}, 559 560 /* 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}, 561 562 /* 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}, 563 564 /* 11000010i8*4.... mov.l R0,@(<disp>,GBR)*/{"mov.l",{A_R0,A_DISP_GBR},{HEX_C,HEX_2,IMM1_8BY4}, arch_sh1_up}, 565 566 /* 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}, 567 /* 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}, 568 /* 0011nnnnmmmm0001 0010dddddddddddd mov.l <REG_M>,@(<DISP12>,<REG_N>) */ 569 {"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}, 570 /* 0011nnnnmmmm0001 0110dddddddddddd mov.l @(<DISP12>,<REG_M>),<REG_N> */ 571 {"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}, 572 /* 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}, 573 574 /* 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}, 575 576 /* 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}, 577 578 /* 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}, 579 580 /* 11000101i8*2.... mov.w @(<disp>,GBR),R0*/{"mov.w",{A_DISP_GBR,A_R0},{HEX_C,HEX_5,IMM0_8BY2}, arch_sh1_up}, 581 582 /* 1001nnnni8p2.... mov.w @(<disp>,PC),<REG_N>*/{"mov.w",{A_DISP_PC,A_REG_N},{HEX_9,REG_N,PCRELIMM_8BY2}, arch_sh1_up}, 583 584 /* 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}, 585 586 /* 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}, 587 588 /* 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}, 589 590 /* 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}, 591 592 /* 11000001i8*2.... mov.w R0,@(<disp>,GBR)*/{"mov.w",{A_R0,A_DISP_GBR},{HEX_C,HEX_1,IMM1_8BY2}, arch_sh1_up}, 593 594 /* 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}, 595 /* 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}, 596 /* 0011nnnnmmmm0001 0001dddddddddddd mov.w <REG_M>,@(<DISP12>,<REG_N>) */ 597 {"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}, 598 /* 0011nnnnmmmm0001 0101dddddddddddd mov.w @(<DISP12>,<REG_M>),<REG_N> */ 599 {"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}, 600 /* 11000111i8p4.... mova @(<disp>,PC),R0*/{"mova",{A_DISP_PC,A_R0},{HEX_C,HEX_7,PCRELIMM_8BY4}, arch_sh1_up}, 601 /* 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}, 602 603 /* 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}, 604 /* 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}, 605 606 /* 0000nnnn00101001 movt <REG_N> */{"movt",{A_REG_N},{HEX_0,REG_N,HEX_2,HEX_9}, arch_sh1_up}, 607 608 /* 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}, 609 /* 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}, 610 611 /* 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}, 612 /* 0010nnnnmmmm1111 muls <REG_M>,<REG_N>*/{"muls",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_F}, arch_sh1_up}, 613 614 /* 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}, 615 616 /* 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}, 617 /* 0010nnnnmmmm1110 mulu <REG_M>,<REG_N>*/{"mulu",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_E}, arch_sh1_up}, 618 619 /* 0110nnnnmmmm1011 neg <REG_M>,<REG_N> */{"neg",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_B}, arch_sh1_up}, 620 621 /* 0110nnnnmmmm1010 negc <REG_M>,<REG_N>*/{"negc",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_A}, arch_sh1_up}, 622 623 /* 0000000000001001 nop */{"nop",{0},{HEX_0,HEX_0,HEX_0,HEX_9}, arch_sh1_up}, 624 625 /* 0110nnnnmmmm0111 not <REG_M>,<REG_N> */{"not",{ A_REG_M,A_REG_N},{HEX_6,REG_N,REG_M,HEX_7}, arch_sh1_up}, 626 /* 0000nnnn10010011 ocbi @<REG_N> */{"ocbi",{A_IND_N},{HEX_0,REG_N,HEX_9,HEX_3}, arch_sh4_nommu_nofpu_up}, 627 628 /* 0000nnnn10100011 ocbp @<REG_N> */{"ocbp",{A_IND_N},{HEX_0,REG_N,HEX_A,HEX_3}, arch_sh4_nommu_nofpu_up}, 629 630 /* 0000nnnn10110011 ocbwb @<REG_N> */{"ocbwb",{A_IND_N},{HEX_0,REG_N,HEX_B,HEX_3}, arch_sh4_nommu_nofpu_up}, 631 632 633 /* 11001011i8*1.... or #<imm>,R0 */{"or",{A_IMM,A_R0},{HEX_C,HEX_B,IMM0_8}, arch_sh1_up}, 634 635 /* 0010nnnnmmmm1011 or <REG_M>,<REG_N> */{"or",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_B}, arch_sh1_up}, 636 637 /* 11001111i8*1.... or.b #<imm>,@(R0,GBR)*/{"or.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_F,IMM0_8}, arch_sh1_up}, 638 639 /* 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}, 640 641 /* 0000nnnn11010011 prefi @<REG_N> */{"prefi",{A_IND_N},{HEX_0,REG_N,HEX_D,HEX_3}, arch_sh4a_nofp_up}, 642 643 /* 0100nnnn00100100 rotcl <REG_N> */{"rotcl",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_4}, arch_sh1_up}, 644 645 /* 0100nnnn00100101 rotcr <REG_N> */{"rotcr",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_5}, arch_sh1_up}, 646 647 /* 0100nnnn00000100 rotl <REG_N> */{"rotl",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_4}, arch_sh1_up}, 648 649 /* 0100nnnn00000101 rotr <REG_N> */{"rotr",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_5}, arch_sh1_up}, 650 651 /* 0000000000101011 rte */{"rte",{0},{HEX_0,HEX_0,HEX_2,HEX_B}, arch_sh1_up}, 652 653 /* 0000000000001011 rts */{"rts",{0},{HEX_0,HEX_0,HEX_0,HEX_B}, arch_sh1_up}, 654 655 /* 0000000010011000 setdmx */{"setdmx",{0},{HEX_0,HEX_0,HEX_9,HEX_8}, arch_sh4al_dsp_up}, 656 /* 0000000011001000 setdmy */{"setdmy",{0},{HEX_0,HEX_0,HEX_C,HEX_8}, arch_sh4al_dsp_up}, 657 658 /* 0000000001011000 sets */{"sets",{0},{HEX_0,HEX_0,HEX_5,HEX_8}, arch_sh1_up}, 659 /* 0000000000011000 sett */{"sett",{0},{HEX_0,HEX_0,HEX_1,HEX_8}, arch_sh1_up}, 660 661 /* 0100nnnn00010100 setrc <REG_N> */{"setrc",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_4}, arch_sh_dsp_up}, 662 663 /* 10000010i8*1.... setrc #<imm> */{"setrc",{A_IMM},{HEX_8,HEX_2,IMM0_8}, arch_sh_dsp_up}, 664 665 /* 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}, 666 667 /* repeat start end #<imm> */{"repeat",{A_DISP_PC,A_DISP_PC,A_IMM},{REPEAT,HEX_2,IMM0_8,HEX_8}, arch_sh_dsp_up}, 668 669 /* 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}, 670 671 /* 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}, 672 673 /* 0100nnnn00100000 shal <REG_N> */{"shal",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_0}, arch_sh1_up}, 674 675 /* 0100nnnn00100001 shar <REG_N> */{"shar",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_1}, arch_sh1_up}, 676 677 /* 0100nnnn00000000 shll <REG_N> */{"shll",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_0}, arch_sh1_up}, 678 679 /* 0100nnnn00101000 shll16 <REG_N> */{"shll16",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_8}, arch_sh1_up}, 680 681 /* 0100nnnn00001000 shll2 <REG_N> */{"shll2",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_8}, arch_sh1_up}, 682 683 /* 0100nnnn00011000 shll8 <REG_N> */{"shll8",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_8}, arch_sh1_up}, 684 685 /* 0100nnnn00000001 shlr <REG_N> */{"shlr",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_1}, arch_sh1_up}, 686 687 /* 0100nnnn00101001 shlr16 <REG_N> */{"shlr16",{A_REG_N},{HEX_4,REG_N,HEX_2,HEX_9}, arch_sh1_up}, 688 689 /* 0100nnnn00001001 shlr2 <REG_N> */{"shlr2",{A_REG_N},{HEX_4,REG_N,HEX_0,HEX_9}, arch_sh1_up}, 690 691 /* 0100nnnn00011001 shlr8 <REG_N> */{"shlr8",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_9}, arch_sh1_up}, 692 693 /* 0000000000011011 sleep */{"sleep",{0},{HEX_0,HEX_0,HEX_1,HEX_B}, arch_sh1_up}, 694 695 /* 0000nnnn00000010 stc SR,<REG_N> */{"stc",{A_SR,A_REG_N},{HEX_0,REG_N,HEX_0,HEX_2}, arch_sh1_up}, 696 697 /* 0000nnnn00010010 stc GBR,<REG_N> */{"stc",{A_GBR,A_REG_N},{HEX_0,REG_N,HEX_1,HEX_2}, arch_sh1_up}, 698 699 /* 0000nnnn00100010 stc VBR,<REG_N> */{"stc",{A_VBR,A_REG_N},{HEX_0,REG_N,HEX_2,HEX_2}, arch_sh1_up}, 700 701 /* 0000nnnn01010010 stc MOD,<REG_N> */{"stc",{A_MOD,A_REG_N},{HEX_0,REG_N,HEX_5,HEX_2}, arch_sh_dsp_up}, 702 703 /* 0000nnnn01110010 stc RE,<REG_N> */{"stc",{A_RE,A_REG_N},{HEX_0,REG_N,HEX_7,HEX_2}, arch_sh_dsp_up}, 704 705 /* 0000nnnn01100010 stc RS,<REG_N> */{"stc",{A_RS,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_2}, arch_sh_dsp_up}, 706 707 /* 0000nnnn00110010 stc SSR,<REG_N> */{"stc",{A_SSR,A_REG_N},{HEX_0,REG_N,HEX_3,HEX_2}, arch_sh3_nommu_up}, 708 709 /* 0000nnnn01000010 stc SPC,<REG_N> */{"stc",{A_SPC,A_REG_N},{HEX_0,REG_N,HEX_4,HEX_2}, arch_sh3_nommu_up}, 710 711 /* 0000nnnn00111010 stc SGR,<REG_N> */{"stc",{A_SGR,A_REG_N},{HEX_0,REG_N,HEX_3,HEX_A}, arch_sh4_nommu_nofpu_up}, 712 713 /* 0000nnnn11111010 stc DBR,<REG_N> */{"stc",{A_DBR,A_REG_N},{HEX_0,REG_N,HEX_F,HEX_A}, arch_sh4_nommu_nofpu_up}, 714 715 /* 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}, 716 717 /* 0000nnnn01001010 stc TBR,<REG_N> */ {"stc",{A_TBR,A_REG_N},{HEX_0,REG_N,HEX_4,HEX_A}, arch_sh2a_nofpu_up}, 718 719 /* 0100nnnn00000011 stc.l SR,@-<REG_N> */{"stc.l",{A_SR,A_DEC_N},{HEX_4,REG_N,HEX_0,HEX_3}, arch_sh1_up}, 720 721 /* 0100nnnn00100011 stc.l VBR,@-<REG_N> */{"stc.l",{A_VBR,A_DEC_N},{HEX_4,REG_N,HEX_2,HEX_3}, arch_sh1_up}, 722 723 /* 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}, 724 725 /* 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}, 726 727 /* 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}, 728 729 /* 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}, 730 731 /* 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}, 732 733 /* 0100nnnn00010011 stc.l GBR,@-<REG_N> */{"stc.l",{A_GBR,A_DEC_N},{HEX_4,REG_N,HEX_1,HEX_3}, arch_sh1_up}, 734 735 /* 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}, 736 737 /* 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}, 738 739 /* 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}, 740 741 /* 0000nnnn00001010 sts MACH,<REG_N> */{"sts",{A_MACH,A_REG_N},{HEX_0,REG_N,HEX_0,HEX_A}, arch_sh1_up}, 742 743 /* 0000nnnn00011010 sts MACL,<REG_N> */{"sts",{A_MACL,A_REG_N},{HEX_0,REG_N,HEX_1,HEX_A}, arch_sh1_up}, 744 745 /* 0000nnnn00101010 sts PR,<REG_N> */{"sts",{A_PR,A_REG_N},{HEX_0,REG_N,HEX_2,HEX_A}, arch_sh1_up}, 746 747 /* 0000nnnn01101010 sts DSR,<REG_N> */{"sts",{A_DSR,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_A}, arch_sh_dsp_up}, 748 749 /* 0000nnnn01111010 sts A0,<REG_N> */{"sts",{A_A0,A_REG_N},{HEX_0,REG_N,HEX_7,HEX_A}, arch_sh_dsp_up}, 750 751 /* 0000nnnn10001010 sts X0,<REG_N> */{"sts",{A_X0,A_REG_N},{HEX_0,REG_N,HEX_8,HEX_A}, arch_sh_dsp_up}, 752 753 /* 0000nnnn10011010 sts X1,<REG_N> */{"sts",{A_X1,A_REG_N},{HEX_0,REG_N,HEX_9,HEX_A}, arch_sh_dsp_up}, 754 755 /* 0000nnnn10101010 sts Y0,<REG_N> */{"sts",{A_Y0,A_REG_N},{HEX_0,REG_N,HEX_A,HEX_A}, arch_sh_dsp_up}, 756 757 /* 0000nnnn10111010 sts Y1,<REG_N> */{"sts",{A_Y1,A_REG_N},{HEX_0,REG_N,HEX_B,HEX_A}, arch_sh_dsp_up}, 758 759 /* 0000nnnn01011010 sts FPUL,<REG_N> */{"sts",{FPUL_M,A_REG_N},{HEX_0,REG_N,HEX_5,HEX_A}, arch_sh2e_up}, 760 761 /* 0000nnnn01101010 sts FPSCR,<REG_N> */{"sts",{FPSCR_M,A_REG_N},{HEX_0,REG_N,HEX_6,HEX_A}, arch_sh2e_up}, 762 763 /* 0100nnnn00000010 sts.l MACH,@-<REG_N>*/{"sts.l",{A_MACH,A_DEC_N},{HEX_4,REG_N,HEX_0,HEX_2}, arch_sh1_up}, 764 765 /* 0100nnnn00010010 sts.l MACL,@-<REG_N>*/{"sts.l",{A_MACL,A_DEC_N},{HEX_4,REG_N,HEX_1,HEX_2}, arch_sh1_up}, 766 767 /* 0100nnnn00100010 sts.l PR,@-<REG_N> */{"sts.l",{A_PR,A_DEC_N},{HEX_4,REG_N,HEX_2,HEX_2}, arch_sh1_up}, 768 769 /* 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}, 770 771 /* 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}, 772 773 /* 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}, 774 775 /* 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}, 776 777 /* 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}, 778 779 /* 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}, 780 781 /* 0100nnnn01010010 sts.l FPUL,@-<REG_N>*/{"sts.l",{FPUL_M,A_DEC_N},{HEX_4,REG_N,HEX_5,HEX_2}, arch_sh2e_up}, 782 783 /* 0100nnnn01100010 sts.l FPSCR,@-<REG_N>*/{"sts.l",{FPSCR_M,A_DEC_N},{HEX_4,REG_N,HEX_6,HEX_2}, arch_sh2e_up}, 784 785 /* 0011nnnnmmmm1000 sub <REG_M>,<REG_N> */{"sub",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_8}, arch_sh1_up}, 786 787 /* 0011nnnnmmmm1010 subc <REG_M>,<REG_N>*/{"subc",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_A}, arch_sh1_up}, 788 789 /* 0011nnnnmmmm1011 subv <REG_M>,<REG_N>*/{"subv",{ A_REG_M,A_REG_N},{HEX_3,REG_N,REG_M,HEX_B}, arch_sh1_up}, 790 791 /* 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}, 792 793 /* 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}, 794 795 /* 0000000010101011 synco */{"synco",{0},{HEX_0,HEX_0,HEX_A,HEX_B}, arch_sh4a_nofp_up}, 796 797 /* 0100nnnn00011011 tas.b @<REG_N> */{"tas.b",{A_IND_N},{HEX_4,REG_N,HEX_1,HEX_B}, arch_sh1_up}, 798 799 /* 11000011i8*1.... trapa #<imm> */{"trapa",{A_IMM},{HEX_C,HEX_3,IMM0_8}, arch_sh1_up}, 800 801 /* 11001000i8*1.... tst #<imm>,R0 */{"tst",{A_IMM,A_R0},{HEX_C,HEX_8,IMM0_8}, arch_sh1_up}, 802 803 /* 0010nnnnmmmm1000 tst <REG_M>,<REG_N> */{"tst",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_8}, arch_sh1_up}, 804 805 /* 11001100i8*1.... tst.b #<imm>,@(R0,GBR)*/{"tst.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_C,IMM0_8}, arch_sh1_up}, 806 807 /* 11001010i8*1.... xor #<imm>,R0 */{"xor",{A_IMM,A_R0},{HEX_C,HEX_A,IMM0_8}, arch_sh1_up}, 808 809 /* 0010nnnnmmmm1010 xor <REG_M>,<REG_N> */{"xor",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_A}, arch_sh1_up}, 810 811 /* 11001110i8*1.... xor.b #<imm>,@(R0,GBR)*/{"xor.b",{A_IMM,A_R0_GBR},{HEX_C,HEX_E,IMM0_8}, arch_sh1_up}, 812 813 /* 0010nnnnmmmm1101 xtrct <REG_M>,<REG_N>*/{"xtrct",{ A_REG_M,A_REG_N},{HEX_2,REG_N,REG_M,HEX_D}, arch_sh1_up}, 814 815 /* 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}, 816 817 /* 0100nnnn00010000 dt <REG_N> */{"dt",{A_REG_N},{HEX_4,REG_N,HEX_1,HEX_0}, arch_sh2_up}, 818 819 /* 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}, 820 821 /* 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}, 822 823 /* 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}, 824 825 /* 0000nnnn00100011 braf <REG_N> */{"braf",{A_REG_N},{HEX_0,REG_N,HEX_2,HEX_3}, arch_sh2_up}, 826 827 /* 0000nnnn00000011 bsrf <REG_N> */{"bsrf",{A_REG_N},{HEX_0,REG_N,HEX_0,HEX_3}, arch_sh2_up}, 828 829 /* 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}, 830 831 /* 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}, 832 833 /* 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}, 834 835 /* 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}, 836 837 /* 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}, 838 839 /* 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}, 840 841 /* 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}, 842 843 /* 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}, 844 845 /* 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}, 846 847 /* 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}, 848 849 /* 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}, 850 851 /* 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}, 852 853 /* 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}, 854 855 /* 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}, 856 857 /* 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}, 858 859 /* 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}, 860 861 /* 0*0*0*00** nopx */ {"nopx",{0},{PPI,NOPX}, arch_sh_dsp_up}, 862 /* *0*0*0**00 nopy */ {"nopy",{0},{PPI,NOPY}, arch_sh_dsp_up}, 863 /* 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}, 864 /* 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}, 865 /* 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}, 866 /* 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}, 867 /* 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}, 868 /* 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}, 869 870 /* 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}, 871 /* 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}, 872 /* 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}, 873 /* 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}, 874 /* 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}, 875 /* 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}, 876 877 /* 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}, 878 /* 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}, 879 /* 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}, 880 /* 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}, 881 /* 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}, 882 /* 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}, 883 884 /* *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}, 885 /* *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}, 886 /* *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}, 887 /* *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}, 888 /* *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}, 889 /* *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}, 890 891 /* 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}, 892 /* 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}, 893 /* 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}, 894 /* 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}, 895 /* 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}, 896 /* 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}, 897 898 /* 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}, 899 /* 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}, 900 /* 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}, 901 /* 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}, 902 /* 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}, 903 /* 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}, 904 905 /* 01aaeeffxxyyggnn pmuls Se,Sf,Dg */ {"pmuls",{DSP_REG_E,DSP_REG_F,DSP_REG_G},{PPI,PMUL}, arch_sh_dsp_up}, 906 /* 10100000xxyynnnn psubc <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 907 {"psubc",{DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_A,HEX_0}, arch_sh_dsp_up}, 908 /* 10110000xxyynnnn paddc <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 909 {"paddc",{DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_B,HEX_0}, arch_sh_dsp_up}, 910 /* 10000100xxyynnnn pcmp <DSP_REG_X>,<DSP_REG_Y> */ 911 {"pcmp", {DSP_REG_X,DSP_REG_Y},{PPI,PPI3,HEX_8,HEX_4}, arch_sh_dsp_up}, 912 /* 10100100xxyynnnn pwsb <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 913 {"pwsb", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_A,HEX_4}, arch_sh_dsp_up}, 914 /* 10110100xxyynnnn pwad <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 915 {"pwad", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPI3,HEX_B,HEX_4}, arch_sh_dsp_up}, 916 /* 10001000xxyynnnn pabs <DSP_REG_X>,<DSP_REG_N> */ 917 {"pabs", {DSP_REG_X,DSP_REG_N},{PPI,PPI3NC,HEX_8,HEX_8}, arch_sh_dsp_up}, 918 /* 1000100!xx01nnnn pabs <DSP_REG_X>,<DSP_REG_N> */ 919 {"pabs", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_9,HEX_1}, arch_sh4al_dsp_up}, 920 /* 10101000xxyynnnn pabs <DSP_REG_Y>,<DSP_REG_N> */ 921 {"pabs", {DSP_REG_Y,DSP_REG_N},{PPI,PPI3NC,HEX_A,HEX_8}, arch_sh_dsp_up}, 922 /* 1010100!01yynnnn pabs <DSP_REG_Y>,<DSP_REG_N> */ 923 {"pabs", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_9,HEX_4}, arch_sh4al_dsp_up}, 924 /* 10011000xxyynnnn prnd <DSP_REG_X>,<DSP_REG_N> */ 925 {"prnd", {DSP_REG_X,DSP_REG_N},{PPI,PPI3NC,HEX_9,HEX_8}, arch_sh_dsp_up}, 926 /* 1001100!xx01nnnn prnd <DSP_REG_X>,<DSP_REG_N> */ 927 {"prnd", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_9,HEX_1}, arch_sh4al_dsp_up}, 928 /* 10111000xxyynnnn prnd <DSP_REG_Y>,<DSP_REG_N> */ 929 {"prnd", {DSP_REG_Y,DSP_REG_N},{PPI,PPI3NC,HEX_B,HEX_8}, arch_sh_dsp_up}, 930 /* 1011100!01yynnnn prnd <DSP_REG_Y>,<DSP_REG_N> */ 931 {"prnd", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_9,HEX_4}, arch_sh4al_dsp_up}, 932 933 {"dct",{0},{PPI,PDC,HEX_1}, arch_sh_dsp_up}, 934 {"dcf",{0},{PPI,PDC,HEX_2}, arch_sh_dsp_up}, 935 936 /* 10000001xxyynnnn pshl <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 937 {"pshl", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_1}, arch_sh_dsp_up}, 938 /* 00000iiiiiiinnnn pshl #<imm>,<DSP_REG_N> */ {"pshl",{A_IMM,DSP_REG_N},{PPI,PSH,HEX_0}, arch_sh_dsp_up}, 939 /* 10010001xxyynnnn psha <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 940 {"psha", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_1}, arch_sh_dsp_up}, 941 /* 00010iiiiiiinnnn psha #<imm>,<DSP_REG_N> */ {"psha",{A_IMM,DSP_REG_N},{PPI,PSH,HEX_1}, arch_sh_dsp_up}, 942 /* 10100001xxyynnnn psub <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 943 {"psub", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_1}, arch_sh_dsp_up}, 944 /* 10000101xxyynnnn psub <DSP_REG_Y>,<DSP_REG_X>,<DSP_REG_N> */ 945 {"psub", {DSP_REG_Y,DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_5}, arch_sh4al_dsp_up}, 946 /* 10110001xxyynnnn padd <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 947 {"padd", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_1}, arch_sh_dsp_up}, 948 /* 10010101xxyynnnn pand <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 949 {"pand", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_5}, arch_sh_dsp_up}, 950 /* 10100101xxyynnnn pxor <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 951 {"pxor", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_5}, arch_sh_dsp_up}, 952 /* 10110101xxyynnnn por <DSP_REG_X>,<DSP_REG_Y>,<DSP_REG_N> */ 953 {"por", {DSP_REG_X,DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_5}, arch_sh_dsp_up}, 954 /* 10001001xxyynnnn pdec <DSP_REG_X>,<DSP_REG_N> */ 955 {"pdec", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_8,HEX_9}, arch_sh_dsp_up}, 956 /* 10101001xxyynnnn pdec <DSP_REG_Y>,<DSP_REG_N> */ 957 {"pdec", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_A,HEX_9}, arch_sh_dsp_up}, 958 /* 10011001xx00nnnn pinc <DSP_REG_X>,<DSP_REG_N> */ 959 {"pinc", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_9,HEX_XX00}, arch_sh_dsp_up}, 960 /* 1011100100yynnnn pinc <DSP_REG_Y>,<DSP_REG_N> */ 961 {"pinc", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_9,HEX_00YY}, arch_sh_dsp_up}, 962 /* 10001101xxyynnnn pclr <DSP_REG_N> */ 963 {"pclr", {DSP_REG_N},{PPI,PPIC,HEX_8,HEX_D}, arch_sh_dsp_up}, 964 /* 10011101xx00nnnn pdmsb <DSP_REG_X>,<DSP_REG_N> */ 965 {"pdmsb", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_D,HEX_XX00}, arch_sh_dsp_up}, 966 /* 1011110100yynnnn pdmsb <DSP_REG_Y>,<DSP_REG_N> */ 967 {"pdmsb", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_D,HEX_00YY}, arch_sh_dsp_up}, 968 /* 11001001xxyynnnn pneg <DSP_REG_X>,<DSP_REG_N> */ 969 {"pneg", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_C,HEX_9}, arch_sh_dsp_up}, 970 /* 11101001xxyynnnn pneg <DSP_REG_Y>,<DSP_REG_N> */ 971 {"pneg", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_E,HEX_9}, arch_sh_dsp_up}, 972 /* 11011001xxyynnnn pcopy <DSP_REG_X>,<DSP_REG_N> */ 973 {"pcopy", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_D,HEX_9}, arch_sh_dsp_up}, 974 /* 11111001xxyynnnn pcopy <DSP_REG_Y>,<DSP_REG_N> */ 975 {"pcopy", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_F,HEX_9}, arch_sh_dsp_up}, 976 /* 11001101xxyynnnn psts MACH,<DSP_REG_N> */ 977 {"psts", {A_MACH,DSP_REG_N},{PPI,PPIC,HEX_C,HEX_D}, arch_sh_dsp_up}, 978 /* 11011101xxyynnnn psts MACL,<DSP_REG_N> */ 979 {"psts", {A_MACL,DSP_REG_N},{PPI,PPIC,HEX_D,HEX_D}, arch_sh_dsp_up}, 980 /* 11101101xxyynnnn plds <DSP_REG_N>,MACH */ 981 {"plds", {DSP_REG_N,A_MACH},{PPI,PPIC,HEX_E,HEX_D}, arch_sh_dsp_up}, 982 /* 11111101xxyynnnn plds <DSP_REG_N>,MACL */ 983 {"plds", {DSP_REG_N,A_MACL},{PPI,PPIC,HEX_F,HEX_D}, arch_sh_dsp_up}, 984 /* 10011101xx01zzzz pswap <DSP_REG_X>,<DSP_REG_N> */ 985 {"pswap", {DSP_REG_X,DSP_REG_N},{PPI,PPIC,HEX_9,HEX_D,HEX_1}, arch_sh4al_dsp_up}, 986 /* 1011110101yyzzzz pswap <DSP_REG_Y>,<DSP_REG_N> */ 987 {"pswap", {DSP_REG_Y,DSP_REG_N},{PPI,PPIC,HEX_B,HEX_D,HEX_4}, arch_sh4al_dsp_up}, 988 989 /* 1111nnnn01011101 fabs <F_REG_N> */{"fabs",{F_REG_N},{HEX_F,REG_N,HEX_5,HEX_D}, arch_sh2e_up}, 990 /* 1111nnn001011101 fabs <D_REG_N> */{"fabs",{D_REG_N},{HEX_F,REG_N,HEX_5,HEX_D}, arch_sh4_up | arch_sh2a_up}, 991 992 /* 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}, 993 /* 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}, 994 995 /* 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}, 996 /* 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}, 997 998 /* 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}, 999 /* 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}, 1000 1001 /* 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}, 1002 1003 /* 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}, 1004 1005 /* 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}, 1006 /* 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}, 1007 1008 /* 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}, 1009 1010 /* 1111nnnn10001101 fldi0 <F_REG_N> */{"fldi0",{F_REG_N},{HEX_F,REG_N,HEX_8,HEX_D}, arch_sh2e_up}, 1011 1012 /* 1111nnnn10011101 fldi1 <F_REG_N> */{"fldi1",{F_REG_N},{HEX_F,REG_N,HEX_9,HEX_D}, arch_sh2e_up}, 1013 1014 /* 1111nnnn00011101 flds <F_REG_N>,FPUL*/{"flds",{F_REG_N,FPUL_M},{HEX_F,REG_N,HEX_1,HEX_D}, arch_sh2e_up}, 1015 1016 /* 1111nnnn00101101 float FPUL,<F_REG_N>*/{"float",{FPUL_M,F_REG_N},{HEX_F,REG_N,HEX_2,HEX_D}, arch_sh2e_up}, 1017 /* 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}, 1018 1019 /* 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}, 1020 1021 /* 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}, 1022 /* 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}, 1023 1024 /* 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}, 1025 /* 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}, 1026 1027 /* 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}, 1028 /* 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}, 1029 1030 /* 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}, 1031 /* 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}, 1032 1033 /* 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}, 1034 /* 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}, 1035 1036 /* 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}, 1037 /* 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}, 1038 1039 /* 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}, 1040 /* 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}, 1041 1042 /* 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}, 1043 1044 /* 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}, 1045 1046 /* 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}, 1047 1048 /* 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}, 1049 1050 /* 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}, 1051 1052 /* 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}, 1053 /* 0011nnnnmmmm0001 0011dddddddddddd fmov.d <F_REG_M>,@(<DISP12>,<REG_N>) */ 1054 {"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}, 1055 /* 0011nnnnmmmm0001 0111dddddddddddd fmov.d @(<DISP12>,<REG_M>),F_REG_N */ 1056 {"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}, 1057 1058 /* 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}, 1059 1060 /* 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}, 1061 1062 /* 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}, 1063 1064 /* 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}, 1065 1066 /* 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}, 1067 1068 /* 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}, 1069 /* 0011nnnnmmmm0001 0011dddddddddddd fmov.s <F_REG_M>,@(<DISP12>,<REG_N>) */ 1070 {"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}, 1071 /* 0011nnnnmmmm0001 0111dddddddddddd fmov.s @(<DISP12>,<REG_M>),F_REG_N */ 1072 {"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}, 1073 1074 /* 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}, 1075 /* 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}, 1076 1077 /* 1111nnnn01001101 fneg <F_REG_N> */{"fneg",{F_REG_N},{HEX_F,REG_N,HEX_4,HEX_D}, arch_sh2e_up}, 1078 /* 1111nnn001001101 fneg <D_REG_N> */{"fneg",{D_REG_N},{HEX_F,REG_N,HEX_4,HEX_D}, arch_sh4_up | arch_sh2a_up}, 1079 1080 /* 1111011111111101 fpchg */{"fpchg",{0},{HEX_F,HEX_7,HEX_F,HEX_D}, arch_sh4a_up}, 1081 1082 /* 1111101111111101 frchg */{"frchg",{0},{HEX_F,HEX_B,HEX_F,HEX_D}, arch_sh4_up}, 1083 1084 /* 1111nnn011111101 fsca FPUL,<D_REG_N> */{"fsca",{FPUL_M,D_REG_N},{HEX_F,REG_N_D,HEX_F,HEX_D}, arch_sh4_up}, 1085 1086 /* 1111001111111101 fschg */{"fschg",{0},{HEX_F,HEX_3,HEX_F,HEX_D}, arch_sh4_up | arch_sh2a_up}, 1087 1088 /* 1111nnnn01101101 fsqrt <F_REG_N> */{"fsqrt",{F_REG_N},{HEX_F,REG_N,HEX_6,HEX_D}, arch_sh3e_up | arch_sh2a_up}, 1089 /* 1111nnn001101101 fsqrt <D_REG_N> */{"fsqrt",{D_REG_N},{HEX_F,REG_N,HEX_6,HEX_D}, arch_sh4_up | arch_sh2a_up}, 1090 1091 /* 1111nnnn01111101 fsrra <F_REG_N> */{"fsrra",{F_REG_N},{HEX_F,REG_N,HEX_7,HEX_D}, arch_sh4_up}, 1092 1093 /* 1111nnnn00001101 fsts FPUL,<F_REG_N>*/{"fsts",{FPUL_M,F_REG_N},{HEX_F,REG_N,HEX_0,HEX_D}, arch_sh2e_up}, 1094 1095 /* 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}, 1096 /* 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}, 1097 1098 /* 1111nnnn00111101 ftrc <F_REG_N>,FPUL*/{"ftrc",{F_REG_N,FPUL_M},{HEX_F,REG_N,HEX_3,HEX_D}, arch_sh2e_up}, 1099 /* 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}, 1100 1101 /* 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}, 1102 1103 /* 10000110nnnn0iii bclr #<imm>, <REG_N> */ {"bclr",{A_IMM, A_REG_N},{HEX_8,HEX_6,REG_N,IMM0_3c}, arch_sh2a_nofpu_up}, 1104 /* 0011nnnn0iii1001 0000dddddddddddd bclr.b #<imm>,@(<DISP12>,<REG_N>) */ 1105 {"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}, 1106 /* 10000111nnnn1iii bld #<imm>, <REG_N> */ {"bld",{A_IMM, A_REG_N},{HEX_8,HEX_7,REG_N,IMM0_3s}, arch_sh2a_nofpu_up}, 1107 /* 0011nnnn0iii1001 0011dddddddddddd bld.b #<imm>,@(<DISP12>,<REG_N>) */ 1108 {"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}, 1109 /* 10000110nnnn1iii bset #<imm>, <REG_N> */ {"bset",{A_IMM, A_REG_N},{HEX_8,HEX_6,REG_N,IMM0_3s}, arch_sh2a_nofpu_up}, 1110 /* 0011nnnn0iii1001 0001dddddddddddd bset.b #<imm>,@(<DISP12>,<REG_N>) */ 1111 {"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}, 1112 /* 10000111nnnn0iii bst #<imm>, <REG_N> */ {"bst",{A_IMM, A_REG_N},{HEX_8,HEX_7,REG_N,IMM0_3c}, arch_sh2a_nofpu_up}, 1113 /* 0011nnnn0iii1001 0010dddddddddddd bst.b #<imm>,@(<DISP12>,<REG_N>) */ 1114 {"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}, 1115 /* 0100nnnn10010001 clips.b <REG_N> */ {"clips.b",{A_REG_N},{HEX_4,REG_N,HEX_9,HEX_1}, arch_sh2a_nofpu_up}, 1116 /* 0100nnnn10010101 clips.w <REG_N> */ {"clips.w",{A_REG_N},{HEX_4,REG_N,HEX_9,HEX_5}, arch_sh2a_nofpu_up}, 1117 /* 0100nnnn10000001 clipu.b <REG_N> */ {"clipu.b",{A_REG_N},{HEX_4,REG_N,HEX_8,HEX_1}, arch_sh2a_nofpu_up}, 1118 /* 0100nnnn10000101 clipu.w <REG_N> */ {"clipu.w",{A_REG_N},{HEX_4,REG_N,HEX_8,HEX_5}, arch_sh2a_nofpu_up}, 1119 /* 0100nnnn10010100 divs R0,<REG_N> */ {"divs",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_9,HEX_4}, arch_sh2a_nofpu_up}, 1120 /* 0100nnnn10000100 divu R0,<REG_N> */ {"divu",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_8,HEX_4}, arch_sh2a_nofpu_up}, 1121 /* 0100mmmm01001011 jsr/n @<REG_M> */ {"jsr/n",{A_IND_M},{HEX_4,REG_M,HEX_4,HEX_B}, arch_sh2a_nofpu_up}, 1122 /* 10000011dddddddd jsr/n @@(<disp>,TBR) */ {"jsr/n",{A_DISP2_TBR},{HEX_8,HEX_3,IMM0_8BY4}, arch_sh2a_nofpu_up}, 1123 /* 0100mmmm11100101 ldbank @<REG_M>,R0 */ {"ldbank",{A_IND_M,A_R0},{HEX_4,REG_M,HEX_E,HEX_5}, arch_sh2a_nofpu_up}, 1124 /* 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}, 1125 /* 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}, 1126 /* 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}, 1127 /* 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}, 1128 /* 0000nnnn00111001 movrt <REG_N> */ {"movrt",{A_REG_N},{HEX_0,REG_N,HEX_3,HEX_9}, arch_sh2a_nofpu_up}, 1129 /* 0100nnnn10000000 mulr R0,<REG_N> */ {"mulr",{A_R0,A_REG_N},{HEX_4,REG_N,HEX_8,HEX_0}, arch_sh2a_nofpu_up}, 1130 /* 0000000001101000 nott */ {"nott",{A_END},{HEX_0,HEX_0,HEX_6,HEX_8}, arch_sh2a_nofpu_up}, 1131 /* 0000000001011011 resbank */ {"resbank",{A_END},{HEX_0,HEX_0,HEX_5,HEX_B}, arch_sh2a_nofpu_up}, 1132 /* 0000000001101011 rts/n */ {"rts/n",{A_END},{HEX_0,HEX_0,HEX_6,HEX_B}, arch_sh2a_nofpu_up}, 1133 /* 0000mmmm01111011 rtv/n <REG_M>*/ {"rtv/n",{A_REG_M},{HEX_0,REG_M,HEX_7,HEX_B}, arch_sh2a_nofpu_up}, 1134 /* 0100nnnn11100001 stbank R0,@<REG_N>*/ {"stbank",{A_R0,A_IND_N},{HEX_4,REG_N,HEX_E,HEX_1}, arch_sh2a_nofpu_up}, 1135 1136 /* 0011nnnn0iii1001 0100dddddddddddd band.b #<imm>,@(<DISP12>,<REG_N>) */ 1137 {"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}, 1138 /* 0011nnnn0iii1001 1100dddddddddddd bandnot.b #<imm>,@(<DISP12>,<REG_N>) */ 1139 {"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}, 1140 /* 0011nnnn0iii1001 1011dddddddddddd bldnot.b #<imm>,@(<DISP12>,<REG_N>) */ 1141 {"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}, 1142 /* 0011nnnn0iii1001 0101dddddddddddd bor.b #<imm>,@(<DISP12>,<REG_N>) */ 1143 {"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}, 1144 /* 0011nnnn0iii1001 1101dddddddddddd bornot.b #<imm>,@(<DISP12>,<REG_N>) */ 1145 {"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}, 1146 /* 0011nnnn0iii1001 0110dddddddddddd bxor.b #<imm>,@(<DISP12>,<REG_N>) */ 1147 {"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}, 1148 /* 0000nnnniiii0000 iiiiiiiiiiiiiiii movi20 #<imm>,<REG_N> */ 1149 {"movi20",{A_IMM,A_REG_N},{HEX_0,REG_N,IMM0_20_4,HEX_0,IMM0_20}, arch_sh2a_nofpu_up | arch_op32}, 1150 /* 0000nnnniiii0001 iiiiiiiiiiiiiiii movi20s #<imm>,<REG_N> */ 1151 {"movi20s",{A_IMM,A_REG_N},{HEX_0,REG_N,IMM0_20_4,HEX_1,IMM0_20BY8}, arch_sh2a_nofpu_up | arch_op32}, 1152 /* 0011nnnnmmmm0001 1000dddddddddddd movu.b @(<DISP12>,<REG_M>),<REG_N> */ 1153 {"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}, 1154 /* 0011nnnnmmmm0001 1001dddddddddddd movu.w @(<DISP12>,<REG_M>),<REG_N> */ 1155 {"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}, 1156 1157 { 0, {0}, {0}, 0 } 1158 }; 1159 1160 #endif 1161 1162 #ifdef ARCH_all 1163 #define INCLUDE_SHMEDIA 1164 #endif 1165 1166 static void 1167 print_movxy (const sh_opcode_info *op, int rn, int rm, 1168 fprintf_function fprintf_fn, void *stream) 1169 { 1170 int n; 1171 1172 fprintf_fn (stream, "%s\t", op->name); 1173 for (n = 0; n < 2; n++) 1174 { 1175 switch (op->arg[n]) 1176 { 1177 case A_IND_N: 1178 case AX_IND_N: 1179 case AXY_IND_N: 1180 case AY_IND_N: 1181 case AYX_IND_N: 1182 fprintf_fn (stream, "@r%d", rn); 1183 break; 1184 case A_INC_N: 1185 case AX_INC_N: 1186 case AXY_INC_N: 1187 case AY_INC_N: 1188 case AYX_INC_N: 1189 fprintf_fn (stream, "@r%d+", rn); 1190 break; 1191 case AX_PMOD_N: 1192 case AXY_PMOD_N: 1193 fprintf_fn (stream, "@r%d+r8", rn); 1194 break; 1195 case AY_PMOD_N: 1196 case AYX_PMOD_N: 1197 fprintf_fn (stream, "@r%d+r9", rn); 1198 break; 1199 case DSP_REG_A_M: 1200 fprintf_fn (stream, "a%c", '0' + rm); 1201 break; 1202 case DSP_REG_X: 1203 fprintf_fn (stream, "x%c", '0' + rm); 1204 break; 1205 case DSP_REG_Y: 1206 fprintf_fn (stream, "y%c", '0' + rm); 1207 break; 1208 case DSP_REG_AX: 1209 fprintf_fn (stream, "%c%c", 1210 (rm & 1) ? 'x' : 'a', 1211 (rm & 2) ? '1' : '0'); 1212 break; 1213 case DSP_REG_XY: 1214 fprintf_fn (stream, "%c%c", 1215 (rm & 1) ? 'y' : 'x', 1216 (rm & 2) ? '1' : '0'); 1217 break; 1218 case DSP_REG_AY: 1219 fprintf_fn (stream, "%c%c", 1220 (rm & 2) ? 'y' : 'a', 1221 (rm & 1) ? '1' : '0'); 1222 break; 1223 case DSP_REG_YX: 1224 fprintf_fn (stream, "%c%c", 1225 (rm & 2) ? 'x' : 'y', 1226 (rm & 1) ? '1' : '0'); 1227 break; 1228 default: 1229 abort (); 1230 } 1231 if (n == 0) 1232 fprintf_fn (stream, ","); 1233 } 1234 } 1235 1236 /* Print a double data transfer insn. INSN is just the lower three 1237 nibbles of the insn, i.e. field a and the bit that indicates if 1238 a parallel processing insn follows. 1239 Return nonzero if a field b of a parallel processing insns follows. */ 1240 1241 static void 1242 print_insn_ddt (int insn, struct disassemble_info *info) 1243 { 1244 fprintf_function fprintf_fn = info->fprintf_func; 1245 void *stream = info->stream; 1246 1247 /* If this is just a nop, make sure to emit something. */ 1248 if (insn == 0x000) 1249 fprintf_fn (stream, "nopx\tnopy"); 1250 1251 /* If a parallel processing insn was printed before, 1252 and we got a non-nop, emit a tab. */ 1253 if ((insn & 0x800) && (insn & 0x3ff)) 1254 fprintf_fn (stream, "\t"); 1255 1256 /* Check if either the x or y part is invalid. */ 1257 if (((insn & 0xc) == 0 && (insn & 0x2a0)) 1258 || ((insn & 3) == 0 && (insn & 0x150))) 1259 if (info->mach != bfd_mach_sh_dsp 1260 && info->mach != bfd_mach_sh3_dsp) 1261 { 1262 static const sh_opcode_info *first_movx, *first_movy; 1263 const sh_opcode_info *op; 1264 int is_movy; 1265 1266 if (! first_movx) 1267 { 1268 for (first_movx = sh_table; first_movx->nibbles[1] != MOVX_NOPY;) 1269 first_movx++; 1270 for (first_movy = first_movx; first_movy->nibbles[1] != MOVY_NOPX;) 1271 first_movy++; 1272 } 1273 1274 is_movy = ((insn & 3) != 0); 1275 1276 if (is_movy) 1277 op = first_movy; 1278 else 1279 op = first_movx; 1280 1281 while (op->nibbles[2] != (unsigned) ((insn >> 4) & 3) 1282 || op->nibbles[3] != (unsigned) (insn & 0xf)) 1283 op++; 1284 1285 print_movxy (op, 1286 (4 * ((insn & (is_movy ? 0x200 : 0x100)) == 0) 1287 + 2 * is_movy 1288 + 1 * ((insn & (is_movy ? 0x100 : 0x200)) != 0)), 1289 (insn >> 6) & 3, 1290 fprintf_fn, stream); 1291 } 1292 else 1293 fprintf_fn (stream, ".word 0x%x", insn); 1294 else 1295 { 1296 static const sh_opcode_info *first_movx, *first_movy; 1297 const sh_opcode_info *opx, *opy; 1298 unsigned int insn_x, insn_y; 1299 1300 if (! first_movx) 1301 { 1302 for (first_movx = sh_table; first_movx->nibbles[1] != MOVX;) 1303 first_movx++; 1304 for (first_movy = first_movx; first_movy->nibbles[1] != MOVY;) 1305 first_movy++; 1306 } 1307 insn_x = (insn >> 2) & 0xb; 1308 if (insn_x) 1309 { 1310 for (opx = first_movx; opx->nibbles[2] != insn_x;) 1311 opx++; 1312 print_movxy (opx, ((insn >> 9) & 1) + 4, (insn >> 7) & 1, 1313 fprintf_fn, stream); 1314 } 1315 insn_y = (insn & 3) | ((insn >> 1) & 8); 1316 if (insn_y) 1317 { 1318 if (insn_x) 1319 fprintf_fn (stream, "\t"); 1320 for (opy = first_movy; opy->nibbles[2] != insn_y;) 1321 opy++; 1322 print_movxy (opy, ((insn >> 8) & 1) + 6, (insn >> 6) & 1, 1323 fprintf_fn, stream); 1324 } 1325 } 1326 } 1327 1328 static void 1329 print_dsp_reg (int rm, fprintf_function fprintf_fn, void *stream) 1330 { 1331 switch (rm) 1332 { 1333 case A_A1_NUM: 1334 fprintf_fn (stream, "a1"); 1335 break; 1336 case A_A0_NUM: 1337 fprintf_fn (stream, "a0"); 1338 break; 1339 case A_X0_NUM: 1340 fprintf_fn (stream, "x0"); 1341 break; 1342 case A_X1_NUM: 1343 fprintf_fn (stream, "x1"); 1344 break; 1345 case A_Y0_NUM: 1346 fprintf_fn (stream, "y0"); 1347 break; 1348 case A_Y1_NUM: 1349 fprintf_fn (stream, "y1"); 1350 break; 1351 case A_M0_NUM: 1352 fprintf_fn (stream, "m0"); 1353 break; 1354 case A_A1G_NUM: 1355 fprintf_fn (stream, "a1g"); 1356 break; 1357 case A_M1_NUM: 1358 fprintf_fn (stream, "m1"); 1359 break; 1360 case A_A0G_NUM: 1361 fprintf_fn (stream, "a0g"); 1362 break; 1363 default: 1364 fprintf_fn (stream, "0x%x", rm); 1365 break; 1366 } 1367 } 1368 1369 static void 1370 print_insn_ppi (int field_b, struct disassemble_info *info) 1371 { 1372 static const char *sx_tab[] = { "x0", "x1", "a0", "a1" }; 1373 static const char *sy_tab[] = { "y0", "y1", "m0", "m1" }; 1374 fprintf_function fprintf_fn = info->fprintf_func; 1375 void *stream = info->stream; 1376 unsigned int nib1, nib2, nib3; 1377 unsigned int altnib1, nib4; 1378 const char *dc = NULL; 1379 const sh_opcode_info *op; 1380 1381 if ((field_b & 0xe800) == 0) 1382 { 1383 fprintf_fn (stream, "psh%c\t#%d,", 1384 field_b & 0x1000 ? 'a' : 'l', 1385 (field_b >> 4) & 127); 1386 print_dsp_reg (field_b & 0xf, fprintf_fn, stream); 1387 return; 1388 } 1389 if ((field_b & 0xc000) == 0x4000 && (field_b & 0x3000) != 0x1000) 1390 { 1391 static const char *du_tab[] = { "x0", "y0", "a0", "a1" }; 1392 static const char *se_tab[] = { "x0", "x1", "y0", "a1" }; 1393 static const char *sf_tab[] = { "y0", "y1", "x0", "a1" }; 1394 static const char *sg_tab[] = { "m0", "m1", "a0", "a1" }; 1395 1396 if (field_b & 0x2000) 1397 { 1398 fprintf_fn (stream, "p%s %s,%s,%s\t", 1399 (field_b & 0x1000) ? "add" : "sub", 1400 sx_tab[(field_b >> 6) & 3], 1401 sy_tab[(field_b >> 4) & 3], 1402 du_tab[(field_b >> 0) & 3]); 1403 } 1404 else if ((field_b & 0xf0) == 0x10 1405 && info->mach != bfd_mach_sh_dsp 1406 && info->mach != bfd_mach_sh3_dsp) 1407 { 1408 fprintf_fn (stream, "pclr %s \t", du_tab[(field_b >> 0) & 3]); 1409 } 1410 else if ((field_b & 0xf3) != 0) 1411 { 1412 fprintf_fn (stream, ".word 0x%x\t", field_b); 1413 } 1414 fprintf_fn (stream, "pmuls%c%s,%s,%s", 1415 field_b & 0x2000 ? ' ' : '\t', 1416 se_tab[(field_b >> 10) & 3], 1417 sf_tab[(field_b >> 8) & 3], 1418 sg_tab[(field_b >> 2) & 3]); 1419 return; 1420 } 1421 1422 nib1 = PPIC; 1423 nib2 = field_b >> 12 & 0xf; 1424 nib3 = field_b >> 8 & 0xf; 1425 nib4 = field_b >> 4 & 0xf; 1426 switch (nib3 & 0x3) 1427 { 1428 case 0: 1429 dc = ""; 1430 nib1 = PPI3; 1431 break; 1432 case 1: 1433 dc = ""; 1434 break; 1435 case 2: 1436 dc = "dct "; 1437 nib3 -= 1; 1438 break; 1439 case 3: 1440 dc = "dcf "; 1441 nib3 -= 2; 1442 break; 1443 } 1444 if (nib1 == PPI3) 1445 altnib1 = PPI3NC; 1446 else 1447 altnib1 = nib1; 1448 for (op = sh_table; op->name; op++) 1449 { 1450 if ((op->nibbles[1] == nib1 || op->nibbles[1] == altnib1) 1451 && op->nibbles[2] == nib2 1452 && op->nibbles[3] == nib3) 1453 { 1454 int n; 1455 1456 switch (op->nibbles[4]) 1457 { 1458 case HEX_0: 1459 break; 1460 case HEX_XX00: 1461 if ((nib4 & 3) != 0) 1462 continue; 1463 break; 1464 case HEX_1: 1465 if ((nib4 & 3) != 1) 1466 continue; 1467 break; 1468 case HEX_00YY: 1469 if ((nib4 & 0xc) != 0) 1470 continue; 1471 break; 1472 case HEX_4: 1473 if ((nib4 & 0xc) != 4) 1474 continue; 1475 break; 1476 default: 1477 abort (); 1478 } 1479 fprintf_fn (stream, "%s%s\t", dc, op->name); 1480 for (n = 0; n < 3 && op->arg[n] != A_END; n++) 1481 { 1482 if (n && op->arg[1] != A_END) 1483 fprintf_fn (stream, ","); 1484 switch (op->arg[n]) 1485 { 1486 case DSP_REG_N: 1487 print_dsp_reg (field_b & 0xf, fprintf_fn, stream); 1488 break; 1489 case DSP_REG_X: 1490 fprintf_fn (stream, "%s", sx_tab[(field_b >> 6) & 3]); 1491 break; 1492 case DSP_REG_Y: 1493 fprintf_fn (stream, "%s", sy_tab[(field_b >> 4) & 3]); 1494 break; 1495 case A_MACH: 1496 fprintf_fn (stream, "mach"); 1497 break; 1498 case A_MACL: 1499 fprintf_fn (stream, "macl"); 1500 break; 1501 default: 1502 abort (); 1503 } 1504 } 1505 return; 1506 } 1507 } 1508 /* Not found. */ 1509 fprintf_fn (stream, ".word 0x%x", field_b); 1510 } 1511 1512 /* FIXME mvs: movx insns print as ".word 0x%03x", insn & 0xfff 1513 (ie. the upper nibble is missing). */ 1514 int 1515 print_insn_sh (bfd_vma memaddr, struct disassemble_info *info) 1516 { 1517 fprintf_function fprintf_fn = info->fprintf_func; 1518 void *stream = info->stream; 1519 unsigned char insn[4]; 1520 unsigned char nibs[8]; 1521 int status; 1522 bfd_vma relmask = ~(bfd_vma) 0; 1523 const sh_opcode_info *op; 1524 unsigned int target_arch; 1525 int allow_op32; 1526 1527 switch (info->mach) 1528 { 1529 case bfd_mach_sh: 1530 target_arch = arch_sh1; 1531 break; 1532 case bfd_mach_sh4: 1533 target_arch = arch_sh4; 1534 break; 1535 case bfd_mach_sh5: 1536 #ifdef INCLUDE_SHMEDIA 1537 status = print_insn_sh64 (memaddr, info); 1538 if (status != -2) 1539 return status; 1540 #endif 1541 /* When we get here for sh64, it's because we want to disassemble 1542 SHcompact, i.e. arch_sh4. */ 1543 target_arch = arch_sh4; 1544 break; 1545 default: 1546 fprintf (stderr, "sh architecture not supported\n"); 1547 return -1; 1548 } 1549 1550 status = info->read_memory_func (memaddr, insn, 2, info); 1551 1552 if (status != 0) 1553 { 1554 info->memory_error_func (status, memaddr, info); 1555 return -1; 1556 } 1557 1558 if (info->endian == BFD_ENDIAN_LITTLE) 1559 { 1560 nibs[0] = (insn[1] >> 4) & 0xf; 1561 nibs[1] = insn[1] & 0xf; 1562 1563 nibs[2] = (insn[0] >> 4) & 0xf; 1564 nibs[3] = insn[0] & 0xf; 1565 } 1566 else 1567 { 1568 nibs[0] = (insn[0] >> 4) & 0xf; 1569 nibs[1] = insn[0] & 0xf; 1570 1571 nibs[2] = (insn[1] >> 4) & 0xf; 1572 nibs[3] = insn[1] & 0xf; 1573 } 1574 status = info->read_memory_func (memaddr + 2, insn + 2, 2, info); 1575 if (status != 0) 1576 allow_op32 = 0; 1577 else 1578 { 1579 allow_op32 = 1; 1580 1581 if (info->endian == BFD_ENDIAN_LITTLE) 1582 { 1583 nibs[4] = (insn[3] >> 4) & 0xf; 1584 nibs[5] = insn[3] & 0xf; 1585 1586 nibs[6] = (insn[2] >> 4) & 0xf; 1587 nibs[7] = insn[2] & 0xf; 1588 } 1589 else 1590 { 1591 nibs[4] = (insn[2] >> 4) & 0xf; 1592 nibs[5] = insn[2] & 0xf; 1593 1594 nibs[6] = (insn[3] >> 4) & 0xf; 1595 nibs[7] = insn[3] & 0xf; 1596 } 1597 } 1598 1599 if (nibs[0] == 0xf && (nibs[1] & 4) == 0 1600 && SH_MERGE_ARCH_SET_VALID (target_arch, arch_sh_dsp_up)) 1601 { 1602 if (nibs[1] & 8) 1603 { 1604 int field_b; 1605 1606 status = info->read_memory_func (memaddr + 2, insn, 2, info); 1607 1608 if (status != 0) 1609 { 1610 info->memory_error_func (status, memaddr + 2, info); 1611 return -1; 1612 } 1613 1614 if (info->endian == BFD_ENDIAN_LITTLE) 1615 field_b = insn[1] << 8 | insn[0]; 1616 else 1617 field_b = insn[0] << 8 | insn[1]; 1618 1619 print_insn_ppi (field_b, info); 1620 print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info); 1621 return 4; 1622 } 1623 print_insn_ddt ((nibs[1] << 8) | (nibs[2] << 4) | nibs[3], info); 1624 return 2; 1625 } 1626 for (op = sh_table; op->name; op++) 1627 { 1628 int n; 1629 int imm = 0; 1630 int rn = 0; 1631 int rm = 0; 1632 int rb = 0; 1633 int disp_pc; 1634 bfd_vma disp_pc_addr = 0; 1635 int disp = 0; 1636 int has_disp = 0; 1637 int max_n = SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 8 : 4; 1638 1639 if (!allow_op32 1640 && SH_MERGE_ARCH_SET (op->arch, arch_op32)) 1641 goto fail; 1642 1643 if (!SH_MERGE_ARCH_SET_VALID (op->arch, target_arch)) 1644 goto fail; 1645 for (n = 0; n < max_n; n++) 1646 { 1647 int i = op->nibbles[n]; 1648 1649 if (i < 16) 1650 { 1651 if (nibs[n] == i) 1652 continue; 1653 goto fail; 1654 } 1655 switch (i) 1656 { 1657 case BRANCH_8: 1658 imm = (nibs[2] << 4) | (nibs[3]); 1659 if (imm & 0x80) 1660 imm |= ~0xff; 1661 imm = ((char) imm) * 2 + 4; 1662 goto ok; 1663 case BRANCH_12: 1664 imm = ((nibs[1]) << 8) | (nibs[2] << 4) | (nibs[3]); 1665 if (imm & 0x800) 1666 imm |= ~0xfff; 1667 imm = imm * 2 + 4; 1668 goto ok; 1669 case IMM0_3c: 1670 if (nibs[3] & 0x8) 1671 goto fail; 1672 imm = nibs[3] & 0x7; 1673 break; 1674 case IMM0_3s: 1675 if (!(nibs[3] & 0x8)) 1676 goto fail; 1677 imm = nibs[3] & 0x7; 1678 break; 1679 case IMM0_3Uc: 1680 if (nibs[2] & 0x8) 1681 goto fail; 1682 imm = nibs[2] & 0x7; 1683 break; 1684 case IMM0_3Us: 1685 if (!(nibs[2] & 0x8)) 1686 goto fail; 1687 imm = nibs[2] & 0x7; 1688 break; 1689 case DISP0_12: 1690 case DISP1_12: 1691 disp = (nibs[5] << 8) | (nibs[6] << 4) | nibs[7]; 1692 has_disp = 1; 1693 goto ok; 1694 case DISP0_12BY2: 1695 case DISP1_12BY2: 1696 disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 1; 1697 relmask = ~(bfd_vma) 1; 1698 has_disp = 1; 1699 goto ok; 1700 case DISP0_12BY4: 1701 case DISP1_12BY4: 1702 disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 2; 1703 relmask = ~(bfd_vma) 3; 1704 has_disp = 1; 1705 goto ok; 1706 case DISP0_12BY8: 1707 case DISP1_12BY8: 1708 disp = ((nibs[5] << 8) | (nibs[6] << 4) | nibs[7]) << 3; 1709 relmask = ~(bfd_vma) 7; 1710 has_disp = 1; 1711 goto ok; 1712 case IMM0_20_4: 1713 break; 1714 case IMM0_20: 1715 imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8) 1716 | (nibs[6] << 4) | nibs[7]); 1717 if (imm & 0x80000) 1718 imm -= 0x100000; 1719 goto ok; 1720 case IMM0_20BY8: 1721 imm = ((nibs[2] << 16) | (nibs[4] << 12) | (nibs[5] << 8) 1722 | (nibs[6] << 4) | nibs[7]); 1723 imm <<= 8; 1724 if (imm & 0x8000000) 1725 imm -= 0x10000000; 1726 goto ok; 1727 case IMM0_4: 1728 case IMM1_4: 1729 imm = nibs[3]; 1730 goto ok; 1731 case IMM0_4BY2: 1732 case IMM1_4BY2: 1733 imm = nibs[3] << 1; 1734 goto ok; 1735 case IMM0_4BY4: 1736 case IMM1_4BY4: 1737 imm = nibs[3] << 2; 1738 goto ok; 1739 case IMM0_8: 1740 case IMM1_8: 1741 imm = (nibs[2] << 4) | nibs[3]; 1742 disp = imm; 1743 has_disp = 1; 1744 if (imm & 0x80) 1745 imm -= 0x100; 1746 goto ok; 1747 case PCRELIMM_8BY2: 1748 imm = ((nibs[2] << 4) | nibs[3]) << 1; 1749 relmask = ~(bfd_vma) 1; 1750 goto ok; 1751 case PCRELIMM_8BY4: 1752 imm = ((nibs[2] << 4) | nibs[3]) << 2; 1753 relmask = ~(bfd_vma) 3; 1754 goto ok; 1755 case IMM0_8BY2: 1756 case IMM1_8BY2: 1757 imm = ((nibs[2] << 4) | nibs[3]) << 1; 1758 goto ok; 1759 case IMM0_8BY4: 1760 case IMM1_8BY4: 1761 imm = ((nibs[2] << 4) | nibs[3]) << 2; 1762 goto ok; 1763 case REG_N_D: 1764 if ((nibs[n] & 1) != 0) 1765 goto fail; 1766 /* fall through */ 1767 case REG_N: 1768 rn = nibs[n]; 1769 break; 1770 case REG_M: 1771 rm = nibs[n]; 1772 break; 1773 case REG_N_B01: 1774 if ((nibs[n] & 0x3) != 1 /* binary 01 */) 1775 goto fail; 1776 rn = (nibs[n] & 0xc) >> 2; 1777 break; 1778 case REG_NM: 1779 rn = (nibs[n] & 0xc) >> 2; 1780 rm = (nibs[n] & 0x3); 1781 break; 1782 case REG_B: 1783 rb = nibs[n] & 0x07; 1784 break; 1785 case SDT_REG_N: 1786 /* sh-dsp: single data transfer. */ 1787 rn = nibs[n]; 1788 if ((rn & 0xc) != 4) 1789 goto fail; 1790 rn = rn & 0x3; 1791 rn |= (!(rn & 2)) << 2; 1792 break; 1793 case PPI: 1794 case REPEAT: 1795 goto fail; 1796 default: 1797 abort (); 1798 } 1799 } 1800 1801 ok: 1802 /* sh2a has D_REG but not X_REG. We don't know the pattern 1803 doesn't match unless we check the output args to see if they 1804 make sense. */ 1805 if (target_arch == arch_sh2a 1806 && ((op->arg[0] == DX_REG_M && (rm & 1) != 0) 1807 || (op->arg[1] == DX_REG_N && (rn & 1) != 0))) 1808 goto fail; 1809 1810 fprintf_fn (stream, "%s\t", op->name); 1811 disp_pc = 0; 1812 for (n = 0; n < 3 && op->arg[n] != A_END; n++) 1813 { 1814 if (n && op->arg[1] != A_END) 1815 fprintf_fn (stream, ","); 1816 switch (op->arg[n]) 1817 { 1818 case A_IMM: 1819 fprintf_fn (stream, "#%d", imm); 1820 break; 1821 case A_R0: 1822 fprintf_fn (stream, "r0"); 1823 break; 1824 case A_REG_N: 1825 fprintf_fn (stream, "r%d", rn); 1826 break; 1827 case A_INC_N: 1828 case AS_INC_N: 1829 fprintf_fn (stream, "@r%d+", rn); 1830 break; 1831 case A_DEC_N: 1832 case AS_DEC_N: 1833 fprintf_fn (stream, "@-r%d", rn); 1834 break; 1835 case A_IND_N: 1836 case AS_IND_N: 1837 fprintf_fn (stream, "@r%d", rn); 1838 break; 1839 case A_DISP_REG_N: 1840 fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rn); 1841 break; 1842 case AS_PMOD_N: 1843 fprintf_fn (stream, "@r%d+r8", rn); 1844 break; 1845 case A_REG_M: 1846 fprintf_fn (stream, "r%d", rm); 1847 break; 1848 case A_INC_M: 1849 fprintf_fn (stream, "@r%d+", rm); 1850 break; 1851 case A_DEC_M: 1852 fprintf_fn (stream, "@-r%d", rm); 1853 break; 1854 case A_IND_M: 1855 fprintf_fn (stream, "@r%d", rm); 1856 break; 1857 case A_DISP_REG_M: 1858 fprintf_fn (stream, "@(%d,r%d)", has_disp?disp:imm, rm); 1859 break; 1860 case A_REG_B: 1861 fprintf_fn (stream, "r%d_bank", rb); 1862 break; 1863 case A_DISP_PC: 1864 disp_pc = 1; 1865 disp_pc_addr = imm + 4 + (memaddr & relmask); 1866 (*info->print_address_func) (disp_pc_addr, info); 1867 break; 1868 case A_IND_R0_REG_N: 1869 fprintf_fn (stream, "@(r0,r%d)", rn); 1870 break; 1871 case A_IND_R0_REG_M: 1872 fprintf_fn (stream, "@(r0,r%d)", rm); 1873 break; 1874 case A_DISP_GBR: 1875 fprintf_fn (stream, "@(%d,gbr)", has_disp?disp:imm); 1876 break; 1877 case A_TBR: 1878 fprintf_fn (stream, "tbr"); 1879 break; 1880 case A_DISP2_TBR: 1881 fprintf_fn (stream, "@@(%d,tbr)", has_disp?disp:imm); 1882 break; 1883 case A_INC_R15: 1884 fprintf_fn (stream, "@r15+"); 1885 break; 1886 case A_DEC_R15: 1887 fprintf_fn (stream, "@-r15"); 1888 break; 1889 case A_R0_GBR: 1890 fprintf_fn (stream, "@(r0,gbr)"); 1891 break; 1892 case A_BDISP12: 1893 case A_BDISP8: 1894 { 1895 bfd_vma addr; 1896 addr = imm + memaddr; 1897 (*info->print_address_func) (addr, info); 1898 } 1899 break; 1900 case A_SR: 1901 fprintf_fn (stream, "sr"); 1902 break; 1903 case A_GBR: 1904 fprintf_fn (stream, "gbr"); 1905 break; 1906 case A_VBR: 1907 fprintf_fn (stream, "vbr"); 1908 break; 1909 case A_DSR: 1910 fprintf_fn (stream, "dsr"); 1911 break; 1912 case A_MOD: 1913 fprintf_fn (stream, "mod"); 1914 break; 1915 case A_RE: 1916 fprintf_fn (stream, "re"); 1917 break; 1918 case A_RS: 1919 fprintf_fn (stream, "rs"); 1920 break; 1921 case A_A0: 1922 fprintf_fn (stream, "a0"); 1923 break; 1924 case A_X0: 1925 fprintf_fn (stream, "x0"); 1926 break; 1927 case A_X1: 1928 fprintf_fn (stream, "x1"); 1929 break; 1930 case A_Y0: 1931 fprintf_fn (stream, "y0"); 1932 break; 1933 case A_Y1: 1934 fprintf_fn (stream, "y1"); 1935 break; 1936 case DSP_REG_M: 1937 print_dsp_reg (rm, fprintf_fn, stream); 1938 break; 1939 case A_SSR: 1940 fprintf_fn (stream, "ssr"); 1941 break; 1942 case A_SPC: 1943 fprintf_fn (stream, "spc"); 1944 break; 1945 case A_MACH: 1946 fprintf_fn (stream, "mach"); 1947 break; 1948 case A_MACL: 1949 fprintf_fn (stream, "macl"); 1950 break; 1951 case A_PR: 1952 fprintf_fn (stream, "pr"); 1953 break; 1954 case A_SGR: 1955 fprintf_fn (stream, "sgr"); 1956 break; 1957 case A_DBR: 1958 fprintf_fn (stream, "dbr"); 1959 break; 1960 case F_REG_N: 1961 fprintf_fn (stream, "fr%d", rn); 1962 break; 1963 case F_REG_M: 1964 fprintf_fn (stream, "fr%d", rm); 1965 break; 1966 case DX_REG_N: 1967 if (rn & 1) 1968 { 1969 fprintf_fn (stream, "xd%d", rn & ~1); 1970 break; 1971 } 1972 case D_REG_N: 1973 fprintf_fn (stream, "dr%d", rn); 1974 break; 1975 case DX_REG_M: 1976 if (rm & 1) 1977 { 1978 fprintf_fn (stream, "xd%d", rm & ~1); 1979 break; 1980 } 1981 case D_REG_M: 1982 fprintf_fn (stream, "dr%d", rm); 1983 break; 1984 case FPSCR_M: 1985 case FPSCR_N: 1986 fprintf_fn (stream, "fpscr"); 1987 break; 1988 case FPUL_M: 1989 case FPUL_N: 1990 fprintf_fn (stream, "fpul"); 1991 break; 1992 case F_FR0: 1993 fprintf_fn (stream, "fr0"); 1994 break; 1995 case V_REG_N: 1996 fprintf_fn (stream, "fv%d", rn * 4); 1997 break; 1998 case V_REG_M: 1999 fprintf_fn (stream, "fv%d", rm * 4); 2000 break; 2001 case XMTRX_M4: 2002 fprintf_fn (stream, "xmtrx"); 2003 break; 2004 default: 2005 abort (); 2006 } 2007 } 2008 2009 #if 0 2010 /* This code prints instructions in delay slots on the same line 2011 as the instruction which needs the delay slots. This can be 2012 confusing, since other disassembler don't work this way, and 2013 it means that the instructions are not all in a line. So I 2014 disabled it. Ian. */ 2015 if (!(info->flags & 1) 2016 && (op->name[0] == 'j' 2017 || (op->name[0] == 'b' 2018 && (op->name[1] == 'r' 2019 || op->name[1] == 's')) 2020 || (op->name[0] == 'r' && op->name[1] == 't') 2021 || (op->name[0] == 'b' && op->name[2] == '.'))) 2022 { 2023 info->flags |= 1; 2024 fprintf_fn (stream, "\t(slot "); 2025 print_insn_sh (memaddr + 2, info); 2026 info->flags &= ~1; 2027 fprintf_fn (stream, ")"); 2028 return 4; 2029 } 2030 #endif 2031 2032 if (disp_pc && strcmp (op->name, "mova") != 0) 2033 { 2034 int size; 2035 bfd_byte bytes[4]; 2036 2037 if (relmask == ~(bfd_vma) 1) 2038 size = 2; 2039 else 2040 size = 4; 2041 status = info->read_memory_func (disp_pc_addr, bytes, size, info); 2042 if (status == 0) 2043 { 2044 unsigned int val; 2045 2046 if (size == 2) 2047 { 2048 if (info->endian == BFD_ENDIAN_LITTLE) 2049 val = bfd_getl16 (bytes); 2050 else 2051 val = bfd_getb16 (bytes); 2052 } 2053 else 2054 { 2055 if (info->endian == BFD_ENDIAN_LITTLE) 2056 val = bfd_getl32 (bytes); 2057 else 2058 val = bfd_getb32 (bytes); 2059 } 2060 if ((*info->symbol_at_address_func) (val, info)) 2061 { 2062 fprintf_fn (stream, "\t! "); 2063 (*info->print_address_func) (val, info); 2064 } 2065 else 2066 fprintf_fn (stream, "\t! 0x%x", val); 2067 } 2068 } 2069 2070 return SH_MERGE_ARCH_SET (op->arch, arch_op32) ? 4 : 2; 2071 fail: 2072 ; 2073 2074 } 2075 fprintf_fn (stream, ".word 0x%x%x%x%x", nibs[0], nibs[1], nibs[2], nibs[3]); 2076 return 2; 2077 } 2078