Statistics
| Branch: | Revision:

root / sh4-dis.c @ 7ccfb2eb

History | View | Annotate | Download (83.1 kB)

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
}