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