1/* Disassemble ADI Blackfin Instructions.
2   Copyright 2005, 2007 Free Software Foundation, Inc.
3
4   This file is part of libopcodes.
5
6   This library is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3, or (at your option)
9   any later version.
10
11   It is distributed in the hope that it will be useful, but WITHOUT
12   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14   License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with this program; if not, write to the Free Software
18   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19   MA 02110-1301, USA.  */
20
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24
25#include "opcode/bfin.h"
26
27#define M_S2RND 1
28#define M_T     2
29#define M_W32   3
30#define M_FU    4
31#define M_TFU   6
32#define M_IS    8
33#define M_ISS2  9
34#define M_IH    11
35#define M_IU    12
36
37#ifndef PRINTF
38#define PRINTF printf
39#endif
40
41#ifndef EXIT
42#define EXIT exit
43#endif
44
45typedef long TIword;
46
47#define HOST_LONG_WORD_SIZE (sizeof (long) * 8)
48#define XFIELD(w,p,s)       (((w) & ((1 << (s)) - 1) << (p)) >> (p))
49#define SIGNEXTEND(v, n)    ((v << (HOST_LONG_WORD_SIZE - (n))) >> (HOST_LONG_WORD_SIZE - (n)))
50#define MASKBITS(val, bits) (val & ((1 << bits) - 1))
51
52#include "dis-asm.h"
53
54typedef enum
55{
56  c_0, c_1, c_4, c_2, c_uimm2, c_uimm3, c_imm3, c_pcrel4,
57  c_imm4, c_uimm4s4, c_uimm4, c_uimm4s2, c_negimm5s4, c_imm5, c_uimm5, c_imm6,
58  c_imm7, c_imm8, c_uimm8, c_pcrel8, c_uimm8s4, c_pcrel8s4, c_lppcrel10, c_pcrel10,
59  c_pcrel12, c_imm16s4, c_luimm16, c_imm16, c_huimm16, c_rimm16, c_imm16s2, c_uimm16s4,
60  c_uimm16, c_pcrel24,
61} const_forms_t;
62
63static struct
64{
65  char *name;
66  int nbits;
67  char reloc;
68  char issigned;
69  char pcrel;
70  char scale;
71  char offset;
72  char negative;
73  char positive;
74} constant_formats[] =
75{
76  { "0", 0, 0, 1, 0, 0, 0, 0, 0},
77  { "1", 0, 0, 1, 0, 0, 0, 0, 0},
78  { "4", 0, 0, 1, 0, 0, 0, 0, 0},
79  { "2", 0, 0, 1, 0, 0, 0, 0, 0},
80  { "uimm2", 2, 0, 0, 0, 0, 0, 0, 0},
81  { "uimm3", 3, 0, 0, 0, 0, 0, 0, 0},
82  { "imm3", 3, 0, 1, 0, 0, 0, 0, 0},
83  { "pcrel4", 4, 1, 0, 1, 1, 0, 0, 0},
84  { "imm4", 4, 0, 1, 0, 0, 0, 0, 0},
85  { "uimm4s4", 4, 0, 0, 0, 2, 0, 0, 1},
86  { "uimm4", 4, 0, 0, 0, 0, 0, 0, 0},
87  { "uimm4s2", 4, 0, 0, 0, 1, 0, 0, 1},
88  { "negimm5s4", 5, 0, 1, 0, 2, 0, 1, 0},
89  { "imm5", 5, 0, 1, 0, 0, 0, 0, 0},
90  { "uimm5", 5, 0, 0, 0, 0, 0, 0, 0},
91  { "imm6", 6, 0, 1, 0, 0, 0, 0, 0},
92  { "imm7", 7, 0, 1, 0, 0, 0, 0, 0},
93  { "imm8", 8, 0, 1, 0, 0, 0, 0, 0},
94  { "uimm8", 8, 0, 0, 0, 0, 0, 0, 0},
95  { "pcrel8", 8, 1, 0, 1, 1, 0, 0, 0},
96  { "uimm8s4", 8, 0, 0, 0, 2, 0, 0, 0},
97  { "pcrel8s4", 8, 1, 1, 1, 2, 0, 0, 0},
98  { "lppcrel10", 10, 1, 0, 1, 1, 0, 0, 0},
99  { "pcrel10", 10, 1, 1, 1, 1, 0, 0, 0},
100  { "pcrel12", 12, 1, 1, 1, 1, 0, 0, 0},
101  { "imm16s4", 16, 0, 1, 0, 2, 0, 0, 0},
102  { "luimm16", 16, 1, 0, 0, 0, 0, 0, 0},
103  { "imm16", 16, 0, 1, 0, 0, 0, 0, 0},
104  { "huimm16", 16, 1, 0, 0, 0, 0, 0, 0},
105  { "rimm16", 16, 1, 1, 0, 0, 0, 0, 0},
106  { "imm16s2", 16, 0, 1, 0, 1, 0, 0, 0},
107  { "uimm16s4", 16, 0, 0, 0, 2, 0, 0, 0},
108  { "uimm16", 16, 0, 0, 0, 0, 0, 0, 0},
109  { "pcrel24", 24, 1, 1, 1, 1, 0, 0, 0}
110};
111
112int _print_insn_bfin (bfd_vma pc, disassemble_info * outf);
113int print_insn_bfin (bfd_vma pc, disassemble_info * outf);
114
115static char *
116fmtconst (const_forms_t cf, TIword x, bfd_vma pc, disassemble_info * outf)
117{
118  static char buf[60];
119
120  if (constant_formats[cf].reloc)
121    {
122      bfd_vma ea = (((constant_formats[cf].pcrel ? SIGNEXTEND (x, constant_formats[cf].nbits)
123		      : x) + constant_formats[cf].offset) << constant_formats[cf].scale);
124      if (constant_formats[cf].pcrel)
125	ea += pc;
126
127      outf->print_address_func (ea, outf);
128      return "";
129    }
130
131  /* Negative constants have an implied sign bit.  */
132  if (constant_formats[cf].negative)
133    {
134      int nb = constant_formats[cf].nbits + 1;
135
136      x = x | (1 << constant_formats[cf].nbits);
137      x = SIGNEXTEND (x, nb);
138    }
139  else
140    x = constant_formats[cf].issigned ? SIGNEXTEND (x, constant_formats[cf].nbits) : x;
141
142  if (constant_formats[cf].offset)
143    x += constant_formats[cf].offset;
144
145  if (constant_formats[cf].scale)
146    x <<= constant_formats[cf].scale;
147
148  if (constant_formats[cf].issigned && x < 0)
149    sprintf (buf, "%ld", x);
150  else
151    sprintf (buf, "0x%lx", x);
152
153  return buf;
154}
155
156enum machine_registers
157{
158  REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
159  REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
160  REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
161  REG_R1_0, REG_R3_2, REG_R5_4, REG_R7_6, REG_P0, REG_P1, REG_P2, REG_P3,
162  REG_P4, REG_P5, REG_SP, REG_FP, REG_A0x, REG_A1x, REG_A0w, REG_A1w,
163  REG_A0, REG_A1, REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1,
164  REG_M2, REG_M3, REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1,
165  REG_L2, REG_L3,
166  REG_AZ, REG_AN, REG_AC0, REG_AC1, REG_AV0, REG_AV1, REG_AV0S, REG_AV1S,
167  REG_AQ, REG_V, REG_VS,
168  REG_sftreset, REG_omode, REG_excause, REG_emucause, REG_idle_req, REG_hwerrcause, REG_CC, REG_LC0,
169  REG_LC1, REG_GP, REG_ASTAT, REG_RETS, REG_LT0, REG_LB0, REG_LT1, REG_LB1,
170  REG_CYCLES, REG_CYCLES2, REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN,
171  REG_RETE, REG_EMUDAT, REG_BR0, REG_BR1, REG_BR2, REG_BR3, REG_BR4, REG_BR5, REG_BR6,
172  REG_BR7, REG_PL0, REG_PL1, REG_PL2, REG_PL3, REG_PL4, REG_PL5, REG_SLP, REG_FLP,
173  REG_PH0, REG_PH1, REG_PH2, REG_PH3, REG_PH4, REG_PH5, REG_SHP, REG_FHP,
174  REG_IL0, REG_IL1, REG_IL2, REG_IL3, REG_ML0, REG_ML1, REG_ML2, REG_ML3,
175  REG_BL0, REG_BL1, REG_BL2, REG_BL3, REG_LL0, REG_LL1, REG_LL2, REG_LL3,
176  REG_IH0, REG_IH1, REG_IH2, REG_IH3, REG_MH0, REG_MH1, REG_MH2, REG_MH3,
177  REG_BH0, REG_BH1, REG_BH2, REG_BH3, REG_LH0, REG_LH1, REG_LH2, REG_LH3,
178  REG_LASTREG,
179};
180
181enum reg_class
182{
183  rc_dregs_lo, rc_dregs_hi, rc_dregs, rc_dregs_pair, rc_pregs, rc_spfp, rc_dregs_hilo, rc_accum_ext,
184  rc_accum_word, rc_accum, rc_iregs, rc_mregs, rc_bregs, rc_lregs, rc_dpregs, rc_gregs,
185  rc_regs, rc_statbits, rc_ignore_bits, rc_ccstat, rc_counters, rc_dregs2_sysregs1, rc_open, rc_sysregs2,
186  rc_sysregs3, rc_allregs,
187  LIM_REG_CLASSES
188};
189
190static char *reg_names[] =
191{
192  "R0.L", "R1.L", "R2.L", "R3.L", "R4.L", "R5.L", "R6.L", "R7.L",
193  "R0.H", "R1.H", "R2.H", "R3.H", "R4.H", "R5.H", "R6.H", "R7.H",
194  "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
195  "R1:0", "R3:2", "R5:4", "R7:6", "P0", "P1", "P2", "P3",
196  "P4", "P5", "SP", "FP", "A0.x", "A1.x", "A0.w", "A1.w",
197  "A0", "A1", "I0", "I1", "I2", "I3", "M0", "M1",
198  "M2", "M3", "B0", "B1", "B2", "B3", "L0", "L1",
199  "L2", "L3",
200  "AZ", "AN", "AC0", "AC1", "AV0", "AV1", "AV0S", "AV1S",
201  "AQ", "V", "VS",
202  "sftreset", "omode", "excause", "emucause", "idle_req", "hwerrcause", "CC", "LC0",
203  "LC1", "GP", "ASTAT", "RETS", "LT0", "LB0", "LT1", "LB1",
204  "CYCLES", "CYCLES2", "USP", "SEQSTAT", "SYSCFG", "RETI", "RETX", "RETN",
205  "RETE", "EMUDAT",
206  "R0.B", "R1.B", "R2.B", "R3.B", "R4.B", "R5.B", "R6.B", "R7.B",
207  "P0.L", "P1.L", "P2.L", "P3.L", "P4.L", "P5.L", "SP.L", "FP.L",
208  "P0.H", "P1.H", "P2.H", "P3.H", "P4.H", "P5.H", "SP.H", "FP.H",
209  "I0.L", "I1.L", "I2.L", "I3.L", "M0.L", "M1.L", "M2.L", "M3.L",
210  "B0.L", "B1.L", "B2.L", "B3.L", "L0.L", "L1.L", "L2.L", "L3.L",
211  "I0.H", "I1.H", "I2.H", "I3.H", "M0.H", "M1.H", "M2.H", "M3.H",
212  "B0.H", "B1.H", "B2.H", "B3.H", "L0.H", "L1.H", "L2.H", "L3.H",
213  "LASTREG",
214  0
215};
216
217#define REGNAME(x) ((x) < REG_LASTREG ? (reg_names[x]) : "...... Illegal register .......")
218
219/* RL(0..7).  */
220static enum machine_registers decode_dregs_lo[] =
221{
222  REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
223};
224
225#define dregs_lo(x) REGNAME (decode_dregs_lo[(x) & 7])
226
227/* RH(0..7).  */
228static enum machine_registers decode_dregs_hi[] =
229{
230  REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
231};
232
233#define dregs_hi(x) REGNAME (decode_dregs_hi[(x) & 7])
234
235/* R(0..7).  */
236static enum machine_registers decode_dregs[] =
237{
238  REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
239};
240
241#define dregs(x) REGNAME (decode_dregs[(x) & 7])
242
243/* R BYTE(0..7).  */
244static enum machine_registers decode_dregs_byte[] =
245{
246  REG_BR0, REG_BR1, REG_BR2, REG_BR3, REG_BR4, REG_BR5, REG_BR6, REG_BR7,
247};
248
249#define dregs_byte(x) REGNAME (decode_dregs_byte[(x) & 7])
250#define dregs_pair(x) REGNAME (decode_dregs_pair[(x) & 7])
251
252/* P(0..5) SP FP.  */
253static enum machine_registers decode_pregs[] =
254{
255  REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
256};
257
258#define pregs(x)	REGNAME (decode_pregs[(x) & 7])
259#define spfp(x)		REGNAME (decode_spfp[(x) & 1])
260#define dregs_hilo(x,i)	REGNAME (decode_dregs_hilo[((i) << 3)|x])
261#define accum_ext(x)	REGNAME (decode_accum_ext[(x) & 1])
262#define accum_word(x)	REGNAME (decode_accum_word[(x) & 1])
263#define accum(x)	REGNAME (decode_accum[(x) & 1])
264
265/* I(0..3).  */
266static enum machine_registers decode_iregs[] =
267{
268  REG_I0, REG_I1, REG_I2, REG_I3,
269};
270
271#define iregs(x) REGNAME (decode_iregs[(x) & 3])
272
273/* M(0..3).  */
274static enum machine_registers decode_mregs[] =
275{
276  REG_M0, REG_M1, REG_M2, REG_M3,
277};
278
279#define mregs(x) REGNAME (decode_mregs[(x) & 3])
280#define bregs(x) REGNAME (decode_bregs[(x) & 3])
281#define lregs(x) REGNAME (decode_lregs[(x) & 3])
282
283/* dregs pregs.  */
284static enum machine_registers decode_dpregs[] =
285{
286  REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
287  REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
288};
289
290#define dpregs(x) REGNAME (decode_dpregs[(x) & 15])
291
292/* [dregs pregs].  */
293static enum machine_registers decode_gregs[] =
294{
295  REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
296  REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
297};
298
299#define gregs(x,i) REGNAME (decode_gregs[((i) << 3)|x])
300
301/* [dregs pregs (iregs mregs) (bregs lregs)].  */
302static enum machine_registers decode_regs[] =
303{
304  REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
305  REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
306  REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
307  REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
308};
309
310#define regs(x,i) REGNAME (decode_regs[((i) << 3)|x])
311
312/* [dregs pregs (iregs mregs) (bregs lregs) Low Half].  */
313static enum machine_registers decode_regs_lo[] =
314{
315  REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
316  REG_PL0, REG_PL1, REG_PL2, REG_PL3, REG_PL4, REG_PL5, REG_SLP, REG_FLP,
317  REG_IL0, REG_IL1, REG_IL2, REG_IL3, REG_ML0, REG_ML1, REG_ML2, REG_ML3,
318  REG_BL0, REG_BL1, REG_BL2, REG_BL3, REG_LL0, REG_LL1, REG_LL2, REG_LL3,
319};
320
321#define regs_lo(x,i) REGNAME (decode_regs_lo[((i) << 3)|x])
322/* [dregs pregs (iregs mregs) (bregs lregs) High Half].  */
323static enum machine_registers decode_regs_hi[] =
324{
325  REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
326  REG_PH0, REG_PH1, REG_PH2, REG_PH3, REG_PH4, REG_PH5, REG_SHP, REG_FHP,
327  REG_IH0, REG_IH1, REG_IH2, REG_IH3, REG_MH0, REG_MH1, REG_LH2, REG_MH3,
328  REG_BH0, REG_BH1, REG_BH2, REG_BH3, REG_LH0, REG_LH1, REG_LH2, REG_LH3,
329};
330
331#define regs_hi(x,i) REGNAME (decode_regs_hi[((i) << 3)|x])
332
333static enum machine_registers decode_statbits[] =
334{
335  REG_AZ, REG_AN, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_AQ, REG_LASTREG,
336  REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_AC0, REG_AC1, REG_LASTREG, REG_LASTREG,
337  REG_AV0, REG_AV0S, REG_AV1, REG_AV1S, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG,
338  REG_V, REG_VS, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG,
339};
340
341#define statbits(x)	REGNAME (decode_statbits[(x) & 31])
342#define ignore_bits(x)	REGNAME (decode_ignore_bits[(x) & 7])
343#define ccstat(x)	REGNAME (decode_ccstat[(x) & 0])
344
345/* LC0 LC1.  */
346static enum machine_registers decode_counters[] =
347{
348  REG_LC0, REG_LC1,
349};
350
351#define counters(x)        REGNAME (decode_counters[(x) & 1])
352#define dregs2_sysregs1(x) REGNAME (decode_dregs2_sysregs1[(x) & 7])
353
354/* [dregs pregs (iregs mregs) (bregs lregs)
355   dregs2_sysregs1 open sysregs2 sysregs3].  */
356static enum machine_registers decode_allregs[] =
357{
358  REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
359  REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
360  REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
361  REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
362  REG_A0x, REG_A0w, REG_A1x, REG_A1w, REG_GP, REG_LASTREG, REG_ASTAT, REG_RETS,
363  REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG,
364  REG_LC0, REG_LT0, REG_LB0, REG_LC1, REG_LT1, REG_LB1, REG_CYCLES, REG_CYCLES2,
365  REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN, REG_RETE, REG_EMUDAT, REG_LASTREG,
366};
367
368#define allregs(x,i)	REGNAME (decode_allregs[((i) << 3) | x])
369#define uimm16s4(x)	fmtconst (c_uimm16s4, x, 0, outf)
370#define pcrel4(x)	fmtconst (c_pcrel4, x, pc, outf)
371#define pcrel8(x)	fmtconst (c_pcrel8, x, pc, outf)
372#define pcrel8s4(x)	fmtconst (c_pcrel8s4, x, pc, outf)
373#define pcrel10(x)	fmtconst (c_pcrel10, x, pc, outf)
374#define pcrel12(x)	fmtconst (c_pcrel12, x, pc, outf)
375#define negimm5s4(x)	fmtconst (c_negimm5s4, x, 0, outf)
376#define rimm16(x)	fmtconst (c_rimm16, x, 0, outf)
377#define huimm16(x)	fmtconst (c_huimm16, x, 0, outf)
378#define imm16(x)	fmtconst (c_imm16, x, 0, outf)
379#define uimm2(x)	fmtconst (c_uimm2, x, 0, outf)
380#define uimm3(x)	fmtconst (c_uimm3, x, 0, outf)
381#define luimm16(x)	fmtconst (c_luimm16, x, 0, outf)
382#define uimm4(x)	fmtconst (c_uimm4, x, 0, outf)
383#define uimm5(x)	fmtconst (c_uimm5, x, 0, outf)
384#define imm16s2(x)	fmtconst (c_imm16s2, x, 0, outf)
385#define uimm8(x)	fmtconst (c_uimm8, x, 0, outf)
386#define imm16s4(x)	fmtconst (c_imm16s4, x, 0, outf)
387#define uimm4s2(x)	fmtconst (c_uimm4s2, x, 0, outf)
388#define uimm4s4(x)	fmtconst (c_uimm4s4, x, 0, outf)
389#define lppcrel10(x)	fmtconst (c_lppcrel10, x, pc, outf)
390#define imm3(x)		fmtconst (c_imm3, x, 0, outf)
391#define imm4(x)		fmtconst (c_imm4, x, 0, outf)
392#define uimm8s4(x)	fmtconst (c_uimm8s4, x, 0, outf)
393#define imm5(x)		fmtconst (c_imm5, x, 0, outf)
394#define imm6(x)		fmtconst (c_imm6, x, 0, outf)
395#define imm7(x)		fmtconst (c_imm7, x, 0, outf)
396#define imm8(x)		fmtconst (c_imm8, x, 0, outf)
397#define pcrel24(x)	fmtconst (c_pcrel24, x, pc, outf)
398#define uimm16(x)	fmtconst (c_uimm16, x, 0, outf)
399
400/* (arch.pm)arch_disassembler_functions.  */
401#ifndef OUTS
402#define OUTS(p, txt) ((p) ? (((txt)[0]) ? (p->fprintf_func)(p->stream, txt) :0) :0)
403#endif
404
405static void
406amod0 (int s0, int x0, disassemble_info *outf)
407{
408  if (s0 == 1 && x0 == 0)
409    OUTS (outf, "(S)");
410  else if (s0 == 0 && x0 == 1)
411    OUTS (outf, "(CO)");
412  else if (s0 == 1 && x0 == 1)
413    OUTS (outf, "(SCO)");
414}
415
416static void
417amod1 (int s0, int x0, disassemble_info *outf)
418{
419  if (s0 == 0 && x0 == 0)
420    OUTS (outf, "(NS)");
421  else if (s0 == 1 && x0 == 0)
422    OUTS (outf, "(S)");
423}
424
425static void
426amod0amod2 (int s0, int x0, int aop0, disassemble_info *outf)
427{
428  if (s0 == 1 && x0 == 0 && aop0 == 0)
429    OUTS (outf, "(S)");
430  else if (s0 == 0 && x0 == 1 && aop0 == 0)
431    OUTS (outf, "(CO)");
432  else if (s0 == 1 && x0 == 1 && aop0 == 0)
433    OUTS (outf, "(SCO)");
434  else if (s0 == 0 && x0 == 0 && aop0 == 2)
435    OUTS (outf, "(ASR)");
436  else if (s0 == 1 && x0 == 0 && aop0 == 2)
437    OUTS (outf, "(S,ASR)");
438  else if (s0 == 0 && x0 == 1 && aop0 == 2)
439    OUTS (outf, "(CO,ASR)");
440  else if (s0 == 1 && x0 == 1 && aop0 == 2)
441    OUTS (outf, "(SCO,ASR)");
442  else if (s0 == 0 && x0 == 0 && aop0 == 3)
443    OUTS (outf, "(ASL)");
444  else if (s0 == 1 && x0 == 0 && aop0 == 3)
445    OUTS (outf, "(S,ASL)");
446  else if (s0 == 0 && x0 == 1 && aop0 == 3)
447    OUTS (outf, "(CO,ASL)");
448  else if (s0 == 1 && x0 == 1 && aop0 == 3)
449    OUTS (outf, "(SCO,ASL)");
450}
451
452static void
453searchmod (int r0, disassemble_info *outf)
454{
455  if (r0 == 0)
456    OUTS (outf, "GT");
457  else if (r0 == 1)
458    OUTS (outf, "GE");
459  else if (r0 == 2)
460    OUTS (outf, "LT");
461  else if (r0 == 3)
462    OUTS (outf, "LE");
463}
464
465static void
466aligndir (int r0, disassemble_info *outf)
467{
468  if (r0 == 1)
469    OUTS (outf, "(R)");
470}
471
472static int
473decode_multfunc (int h0, int h1, int src0, int src1, disassemble_info * outf)
474{
475  char *s0, *s1;
476
477  if (h0)
478    s0 = dregs_hi (src0);
479  else
480    s0 = dregs_lo (src0);
481
482  if (h1)
483    s1 = dregs_hi (src1);
484  else
485    s1 = dregs_lo (src1);
486
487  OUTS (outf, s0);
488  OUTS (outf, " * ");
489  OUTS (outf, s1);
490  return 0;
491}
492
493static int
494decode_macfunc (int which, int op, int h0, int h1, int src0, int src1, disassemble_info * outf)
495{
496  char *a;
497  char *sop = "<unknown op>";
498
499  if (which)
500    a = "a1";
501  else
502    a = "a0";
503
504  if (op == 3)
505    {
506      OUTS (outf, a);
507      return 0;
508    }
509
510  switch (op)
511    {
512    case 0: sop = "=";   break;
513    case 1: sop = "+=";  break;
514    case 2: sop = "-=";  break;
515    default: break;
516    }
517
518  OUTS (outf, a);
519  OUTS (outf, " ");
520  OUTS (outf, sop);
521  OUTS (outf, " ");
522  decode_multfunc (h0, h1, src0, src1, outf);
523
524  return 0;
525}
526
527static void
528decode_optmode (int mod, int MM, disassemble_info *outf)
529{
530  if (mod == 0 && MM == 0)
531    return;
532
533  OUTS (outf, " (");
534
535  if (MM && !mod)
536    {
537      OUTS (outf, "M)");
538      return;
539    }
540
541  if (MM)
542    OUTS (outf, "M, ");
543
544  if (mod == M_S2RND)
545    OUTS (outf, "S2RND");
546  else if (mod == M_T)
547    OUTS (outf, "T");
548  else if (mod == M_W32)
549    OUTS (outf, "W32");
550  else if (mod == M_FU)
551    OUTS (outf, "FU");
552  else if (mod == M_TFU)
553    OUTS (outf, "TFU");
554  else if (mod == M_IS)
555    OUTS (outf, "IS");
556  else if (mod == M_ISS2)
557    OUTS (outf, "ISS2");
558  else if (mod == M_IH)
559    OUTS (outf, "IH");
560  else if (mod == M_IU)
561    OUTS (outf, "IU");
562  else
563    abort ();
564
565  OUTS (outf, ")");
566}
567
568static int
569decode_ProgCtrl_0 (TIword iw0, disassemble_info *outf)
570{
571  /* ProgCtrl
572     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
573     | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.prgfunc.......|.poprnd........|
574     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
575  int poprnd  = ((iw0 >> ProgCtrl_poprnd_bits) & ProgCtrl_poprnd_mask);
576  int prgfunc = ((iw0 >> ProgCtrl_prgfunc_bits) & ProgCtrl_prgfunc_mask);
577
578  if (prgfunc == 0 && poprnd == 0)
579    OUTS (outf, "NOP");
580  else if (prgfunc == 1 && poprnd == 0)
581    OUTS (outf, "RTS");
582  else if (prgfunc == 1 && poprnd == 1)
583    OUTS (outf, "RTI");
584  else if (prgfunc == 1 && poprnd == 2)
585    OUTS (outf, "RTX");
586  else if (prgfunc == 1 && poprnd == 3)
587    OUTS (outf, "RTN");
588  else if (prgfunc == 1 && poprnd == 4)
589    OUTS (outf, "RTE");
590  else if (prgfunc == 2 && poprnd == 0)
591    OUTS (outf, "IDLE");
592  else if (prgfunc == 2 && poprnd == 3)
593    OUTS (outf, "CSYNC");
594  else if (prgfunc == 2 && poprnd == 4)
595    OUTS (outf, "SSYNC");
596  else if (prgfunc == 2 && poprnd == 5)
597    OUTS (outf, "EMUEXCPT");
598  else if (prgfunc == 3)
599    {
600      OUTS (outf, "CLI  ");
601      OUTS (outf, dregs (poprnd));
602    }
603  else if (prgfunc == 4)
604    {
605      OUTS (outf, "STI  ");
606      OUTS (outf, dregs (poprnd));
607    }
608  else if (prgfunc == 5)
609    {
610      OUTS (outf, "JUMP  (");
611      OUTS (outf, pregs (poprnd));
612      OUTS (outf, ")");
613    }
614  else if (prgfunc == 6)
615    {
616      OUTS (outf, "CALL  (");
617      OUTS (outf, pregs (poprnd));
618      OUTS (outf, ")");
619    }
620  else if (prgfunc == 7)
621    {
622      OUTS (outf, "CALL  (PC+");
623      OUTS (outf, pregs (poprnd));
624      OUTS (outf, ")");
625    }
626  else if (prgfunc == 8)
627    {
628      OUTS (outf, "JUMP  (PC+");
629      OUTS (outf, pregs (poprnd));
630      OUTS (outf, ")");
631    }
632  else if (prgfunc == 9)
633    {
634      OUTS (outf, "RAISE  ");
635      OUTS (outf, uimm4 (poprnd));
636    }
637  else if (prgfunc == 10)
638    {
639      OUTS (outf, "EXCPT  ");
640      OUTS (outf, uimm4 (poprnd));
641    }
642  else if (prgfunc == 11)
643    {
644      OUTS (outf, "TESTSET  (");
645      OUTS (outf, pregs (poprnd));
646      OUTS (outf, ")");
647    }
648  else
649    return 0;
650  return 2;
651}
652
653static int
654decode_CaCTRL_0 (TIword iw0, disassemble_info *outf)
655{
656  /* CaCTRL
657     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
658     | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |.a.|.op....|.reg.......|
659     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
660  int a   = ((iw0 >> CaCTRL_a_bits) & CaCTRL_a_mask);
661  int op  = ((iw0 >> CaCTRL_op_bits) & CaCTRL_op_mask);
662  int reg = ((iw0 >> CaCTRL_reg_bits) & CaCTRL_reg_mask);
663
664  if (a == 0 && op == 0)
665    {
666      OUTS (outf, "PREFETCH[");
667      OUTS (outf, pregs (reg));
668      OUTS (outf, "]");
669    }
670  else if (a == 0 && op == 1)
671    {
672      OUTS (outf, "FLUSHINV[");
673      OUTS (outf, pregs (reg));
674      OUTS (outf, "]");
675    }
676  else if (a == 0 && op == 2)
677    {
678      OUTS (outf, "FLUSH[");
679      OUTS (outf, pregs (reg));
680      OUTS (outf, "]");
681    }
682  else if (a == 0 && op == 3)
683    {
684      OUTS (outf, "IFLUSH[");
685      OUTS (outf, pregs (reg));
686      OUTS (outf, "]");
687    }
688  else if (a == 1 && op == 0)
689    {
690      OUTS (outf, "PREFETCH[");
691      OUTS (outf, pregs (reg));
692      OUTS (outf, "++]");
693    }
694  else if (a == 1 && op == 1)
695    {
696      OUTS (outf, "FLUSHINV[");
697      OUTS (outf, pregs (reg));
698      OUTS (outf, "++]");
699    }
700  else if (a == 1 && op == 2)
701    {
702      OUTS (outf, "FLUSH[");
703      OUTS (outf, pregs (reg));
704      OUTS (outf, "++]");
705    }
706  else if (a == 1 && op == 3)
707    {
708      OUTS (outf, "IFLUSH[");
709      OUTS (outf, pregs (reg));
710      OUTS (outf, "++]");
711    }
712  else
713    return 0;
714  return 2;
715}
716
717static int
718decode_PushPopReg_0 (TIword iw0, disassemble_info *outf)
719{
720  /* PushPopReg
721     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
722     | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.W.|.grp.......|.reg.......|
723     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
724  int W   = ((iw0 >> PushPopReg_W_bits) & PushPopReg_W_mask);
725  int grp = ((iw0 >> PushPopReg_grp_bits) & PushPopReg_grp_mask);
726  int reg = ((iw0 >> PushPopReg_reg_bits) & PushPopReg_reg_mask);
727
728  if (W == 0)
729    {
730      OUTS (outf, allregs (reg, grp));
731      OUTS (outf, " = [SP++]");
732    }
733  else if (W == 1)
734    {
735      OUTS (outf, "[--SP] = ");
736      OUTS (outf, allregs (reg, grp));
737    }
738  else
739    return 0;
740  return 2;
741}
742
743static int
744decode_PushPopMultiple_0 (TIword iw0, disassemble_info *outf)
745{
746  /* PushPopMultiple
747     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
748     | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.d.|.p.|.W.|.dr........|.pr........|
749     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
750  int p  = ((iw0 >> PushPopMultiple_p_bits) & PushPopMultiple_p_mask);
751  int d  = ((iw0 >> PushPopMultiple_d_bits) & PushPopMultiple_d_mask);
752  int W  = ((iw0 >> PushPopMultiple_W_bits) & PushPopMultiple_W_mask);
753  int dr = ((iw0 >> PushPopMultiple_dr_bits) & PushPopMultiple_dr_mask);
754  int pr = ((iw0 >> PushPopMultiple_pr_bits) & PushPopMultiple_pr_mask);
755  char ps[5], ds[5];
756
757  sprintf (ps, "%d", pr);
758  sprintf (ds, "%d", dr);
759
760  if (W == 1 && d == 1 && p == 1)
761    {
762      OUTS (outf, "[--SP] = (R7:");
763      OUTS (outf, ds);
764      OUTS (outf, ", P5:");
765      OUTS (outf, ps);
766      OUTS (outf, ")");
767    }
768  else if (W == 1 && d == 1 && p == 0)
769    {
770      OUTS (outf, "[--SP] = (R7:");
771      OUTS (outf, ds);
772      OUTS (outf, ")");
773    }
774  else if (W == 1 && d == 0 && p == 1)
775    {
776      OUTS (outf, "[--SP] = (P5:");
777      OUTS (outf, ps);
778      OUTS (outf, ")");
779    }
780  else if (W == 0 && d == 1 && p == 1)
781    {
782      OUTS (outf, "(R7:");
783      OUTS (outf, ds);
784      OUTS (outf, ", P5:");
785      OUTS (outf, ps);
786      OUTS (outf, ") = [SP++]");
787    }
788  else if (W == 0 && d == 1 && p == 0)
789    {
790      OUTS (outf, "(R7:");
791      OUTS (outf, ds);
792      OUTS (outf, ") = [SP++]");
793    }
794  else if (W == 0 && d == 0 && p == 1)
795    {
796      OUTS (outf, "(P5:");
797      OUTS (outf, ps);
798      OUTS (outf, ") = [SP++]");
799    }
800  else
801    return 0;
802  return 2;
803}
804
805static int
806decode_ccMV_0 (TIword iw0, disassemble_info *outf)
807{
808  /* ccMV
809     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
810     | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.T.|.d.|.s.|.dst.......|.src.......|
811     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
812  int s  = ((iw0 >> CCmv_s_bits) & CCmv_s_mask);
813  int d  = ((iw0 >> CCmv_d_bits) & CCmv_d_mask);
814  int T  = ((iw0 >> CCmv_T_bits) & CCmv_T_mask);
815  int src = ((iw0 >> CCmv_src_bits) & CCmv_src_mask);
816  int dst = ((iw0 >> CCmv_dst_bits) & CCmv_dst_mask);
817
818  if (T == 1)
819    {
820      OUTS (outf, "IF CC ");
821      OUTS (outf, gregs (dst, d));
822      OUTS (outf, " = ");
823      OUTS (outf, gregs (src, s));
824    }
825  else if (T == 0)
826    {
827      OUTS (outf, "IF ! CC ");
828      OUTS (outf, gregs (dst, d));
829      OUTS (outf, " = ");
830      OUTS (outf, gregs (src, s));
831    }
832  else
833    return 0;
834  return 2;
835}
836
837static int
838decode_CCflag_0 (TIword iw0, disassemble_info *outf)
839{
840  /* CCflag
841     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
842     | 0 | 0 | 0 | 0 | 1 |.I.|.opc.......|.G.|.y.........|.x.........|
843     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
844  int x = ((iw0 >> CCflag_x_bits) & CCflag_x_mask);
845  int y = ((iw0 >> CCflag_y_bits) & CCflag_y_mask);
846  int I = ((iw0 >> CCflag_I_bits) & CCflag_I_mask);
847  int G = ((iw0 >> CCflag_G_bits) & CCflag_G_mask);
848  int opc = ((iw0 >> CCflag_opc_bits) & CCflag_opc_mask);
849
850  if (opc == 0 && I == 0 && G == 0)
851    {
852      OUTS (outf, "CC=");
853      OUTS (outf, dregs (x));
854      OUTS (outf, "==");
855      OUTS (outf, dregs (y));
856    }
857  else if (opc == 1 && I == 0 && G == 0)
858    {
859      OUTS (outf, "CC=");
860      OUTS (outf, dregs (x));
861      OUTS (outf, "<");
862      OUTS (outf, dregs (y));
863    }
864  else if (opc == 2 && I == 0 && G == 0)
865    {
866      OUTS (outf, "CC=");
867      OUTS (outf, dregs (x));
868      OUTS (outf, "<=");
869      OUTS (outf, dregs (y));
870    }
871  else if (opc == 3 && I == 0 && G == 0)
872    {
873      OUTS (outf, "CC=");
874      OUTS (outf, dregs (x));
875      OUTS (outf, "<");
876      OUTS (outf, dregs (y));
877      OUTS (outf, "(IU)");
878    }
879  else if (opc == 4 && I == 0 && G == 0)
880    {
881      OUTS (outf, "CC=");
882      OUTS (outf, dregs (x));
883      OUTS (outf, "<=");
884      OUTS (outf, dregs (y));
885      OUTS (outf, "(IU)");
886    }
887  else if (opc == 0 && I == 1 && G == 0)
888    {
889      OUTS (outf, "CC=");
890      OUTS (outf, dregs (x));
891      OUTS (outf, "==");
892      OUTS (outf, imm3 (y));
893    }
894  else if (opc == 1 && I == 1 && G == 0)
895    {
896      OUTS (outf, "CC=");
897      OUTS (outf, dregs (x));
898      OUTS (outf, "<");
899      OUTS (outf, imm3 (y));
900    }
901  else if (opc == 2 && I == 1 && G == 0)
902    {
903      OUTS (outf, "CC=");
904      OUTS (outf, dregs (x));
905      OUTS (outf, "<=");
906      OUTS (outf, imm3 (y));
907    }
908  else if (opc == 3 && I == 1 && G == 0)
909    {
910      OUTS (outf, "CC=");
911      OUTS (outf, dregs (x));
912      OUTS (outf, "<");
913      OUTS (outf, uimm3 (y));
914      OUTS (outf, "(IU)");
915    }
916  else if (opc == 4 && I == 1 && G == 0)
917    {
918      OUTS (outf, "CC=");
919      OUTS (outf, dregs (x));
920      OUTS (outf, "<=");
921      OUTS (outf, uimm3 (y));
922      OUTS (outf, "(IU)");
923    }
924  else if (opc == 0 && I == 0 && G == 1)
925    {
926      OUTS (outf, "CC=");
927      OUTS (outf, pregs (x));
928      OUTS (outf, "==");
929      OUTS (outf, pregs (y));
930    }
931  else if (opc == 1 && I == 0 && G == 1)
932    {
933      OUTS (outf, "CC=");
934      OUTS (outf, pregs (x));
935      OUTS (outf, "<");
936      OUTS (outf, pregs (y));
937    }
938  else if (opc == 2 && I == 0 && G == 1)
939    {
940      OUTS (outf, "CC=");
941      OUTS (outf, pregs (x));
942      OUTS (outf, "<=");
943      OUTS (outf, pregs (y));
944    }
945  else if (opc == 3 && I == 0 && G == 1)
946    {
947      OUTS (outf, "CC=");
948      OUTS (outf, pregs (x));
949      OUTS (outf, "<");
950      OUTS (outf, pregs (y));
951      OUTS (outf, "(IU)");
952    }
953  else if (opc == 4 && I == 0 && G == 1)
954    {
955      OUTS (outf, "CC=");
956      OUTS (outf, pregs (x));
957      OUTS (outf, "<=");
958      OUTS (outf, pregs (y));
959      OUTS (outf, "(IU)");
960    }
961  else if (opc == 0 && I == 1 && G == 1)
962    {
963      OUTS (outf, "CC=");
964      OUTS (outf, pregs (x));
965      OUTS (outf, "==");
966      OUTS (outf, imm3 (y));
967    }
968  else if (opc == 1 && I == 1 && G == 1)
969    {
970      OUTS (outf, "CC=");
971      OUTS (outf, pregs (x));
972      OUTS (outf, "<");
973      OUTS (outf, imm3 (y));
974    }
975  else if (opc == 2 && I == 1 && G == 1)
976    {
977      OUTS (outf, "CC=");
978      OUTS (outf, pregs (x));
979      OUTS (outf, "<=");
980      OUTS (outf, imm3 (y));
981    }
982  else if (opc == 3 && I == 1 && G == 1)
983    {
984      OUTS (outf, "CC=");
985      OUTS (outf, pregs (x));
986      OUTS (outf, "<");
987      OUTS (outf, uimm3 (y));
988      OUTS (outf, "(IU)");
989    }
990  else if (opc == 4 && I == 1 && G == 1)
991    {
992      OUTS (outf, "CC=");
993      OUTS (outf, pregs (x));
994      OUTS (outf, "<=");
995      OUTS (outf, uimm3 (y));
996      OUTS (outf, "(IU)");
997    }
998  else if (opc == 5 && I == 0 && G == 0)
999    OUTS (outf, "CC=A0==A1");
1000
1001  else if (opc == 6 && I == 0 && G == 0)
1002    OUTS (outf, "CC=A0<A1");
1003
1004  else if (opc == 7 && I == 0 && G == 0)
1005    OUTS (outf, "CC=A0<=A1");
1006
1007  else
1008    return 0;
1009  return 2;
1010}
1011
1012static int
1013decode_CC2dreg_0 (TIword iw0, disassemble_info *outf)
1014{
1015  /* CC2dreg
1016     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1017     | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |.op....|.reg.......|
1018     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1019  int op  = ((iw0 >> CC2dreg_op_bits) & CC2dreg_op_mask);
1020  int reg = ((iw0 >> CC2dreg_reg_bits) & CC2dreg_reg_mask);
1021
1022  if (op == 0)
1023    {
1024      OUTS (outf, dregs (reg));
1025      OUTS (outf, "=CC");
1026    }
1027  else if (op == 1)
1028    {
1029      OUTS (outf, "CC=");
1030      OUTS (outf, dregs (reg));
1031    }
1032  else if (op == 3)
1033    OUTS (outf, "CC=!CC");
1034  else
1035    return 0;
1036
1037  return 2;
1038}
1039
1040static int
1041decode_CC2stat_0 (TIword iw0, disassemble_info *outf)
1042{
1043  /* CC2stat
1044     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1045     | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.D.|.op....|.cbit..............|
1046     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1047  int D    = ((iw0 >> CC2stat_D_bits) & CC2stat_D_mask);
1048  int op   = ((iw0 >> CC2stat_op_bits) & CC2stat_op_mask);
1049  int cbit = ((iw0 >> CC2stat_cbit_bits) & CC2stat_cbit_mask);
1050
1051  if (op == 0 && D == 0)
1052    {
1053      OUTS (outf, "CC = ");
1054      OUTS (outf, statbits (cbit));
1055    }
1056  else if (op == 1 && D == 0)
1057    {
1058      OUTS (outf, "CC|=");
1059      OUTS (outf, statbits (cbit));
1060    }
1061  else if (op == 2 && D == 0)
1062    {
1063      OUTS (outf, "CC&=");
1064      OUTS (outf, statbits (cbit));
1065    }
1066  else if (op == 3 && D == 0)
1067    {
1068      OUTS (outf, "CC^=");
1069      OUTS (outf, statbits (cbit));
1070    }
1071  else if (op == 0 && D == 1)
1072    {
1073      OUTS (outf, statbits (cbit));
1074      OUTS (outf, "=CC");
1075    }
1076  else if (op == 1 && D == 1)
1077    {
1078      OUTS (outf, statbits (cbit));
1079      OUTS (outf, "|=CC");
1080    }
1081  else if (op == 2 && D == 1)
1082    {
1083      OUTS (outf, statbits (cbit));
1084      OUTS (outf, "&=CC");
1085    }
1086  else if (op == 3 && D == 1)
1087    {
1088      OUTS (outf, statbits (cbit));
1089      OUTS (outf, "^=CC");
1090    }
1091  else
1092    return 0;
1093
1094  return 2;
1095}
1096
1097static int
1098decode_BRCC_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
1099{
1100  /* BRCC
1101     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1102     | 0 | 0 | 0 | 1 |.T.|.B.|.offset................................|
1103     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1104  int B = ((iw0 >> BRCC_B_bits) & BRCC_B_mask);
1105  int T = ((iw0 >> BRCC_T_bits) & BRCC_T_mask);
1106  int offset = ((iw0 >> BRCC_offset_bits) & BRCC_offset_mask);
1107
1108  if (T == 1 && B == 1)
1109    {
1110      OUTS (outf, "IF CC JUMP ");
1111      OUTS (outf, pcrel10 (offset));
1112      OUTS (outf, "(BP)");
1113    }
1114  else if (T == 0 && B == 1)
1115    {
1116      OUTS (outf, "IF ! CC JUMP ");
1117      OUTS (outf, pcrel10 (offset));
1118      OUTS (outf, "(BP)");
1119    }
1120  else if (T == 1)
1121    {
1122      OUTS (outf, "IF CC JUMP ");
1123      OUTS (outf, pcrel10 (offset));
1124    }
1125  else if (T == 0)
1126    {
1127      OUTS (outf, "IF ! CC JUMP ");
1128      OUTS (outf, pcrel10 (offset));
1129    }
1130  else
1131    return 0;
1132
1133  return 2;
1134}
1135
1136static int
1137decode_UJUMP_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
1138{
1139  /* UJUMP
1140     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1141     | 0 | 0 | 1 | 0 |.offset........................................|
1142     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1143  int offset = ((iw0 >> UJump_offset_bits) & UJump_offset_mask);
1144
1145  OUTS (outf, "JUMP.S  ");
1146  OUTS (outf, pcrel12 (offset));
1147  return 2;
1148}
1149
1150static int
1151decode_REGMV_0 (TIword iw0, disassemble_info *outf)
1152{
1153  /* REGMV
1154     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1155     | 0 | 0 | 1 | 1 |.gd........|.gs........|.dst.......|.src.......|
1156     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1157  int gs  = ((iw0 >> RegMv_gs_bits) & RegMv_gs_mask);
1158  int gd  = ((iw0 >> RegMv_gd_bits) & RegMv_gd_mask);
1159  int src = ((iw0 >> RegMv_src_bits) & RegMv_src_mask);
1160  int dst = ((iw0 >> RegMv_dst_bits) & RegMv_dst_mask);
1161
1162  OUTS (outf, allregs (dst, gd));
1163  OUTS (outf, "=");
1164  OUTS (outf, allregs (src, gs));
1165  return 2;
1166}
1167
1168static int
1169decode_ALU2op_0 (TIword iw0, disassemble_info *outf)
1170{
1171  /* ALU2op
1172     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1173     | 0 | 1 | 0 | 0 | 0 | 0 |.opc...........|.src.......|.dst.......|
1174     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1175  int src = ((iw0 >> ALU2op_src_bits) & ALU2op_src_mask);
1176  int opc = ((iw0 >> ALU2op_opc_bits) & ALU2op_opc_mask);
1177  int dst = ((iw0 >> ALU2op_dst_bits) & ALU2op_dst_mask);
1178
1179  if (opc == 0)
1180    {
1181      OUTS (outf, dregs (dst));
1182      OUTS (outf, ">>>=");
1183      OUTS (outf, dregs (src));
1184    }
1185  else if (opc == 1)
1186    {
1187      OUTS (outf, dregs (dst));
1188      OUTS (outf, ">>=");
1189      OUTS (outf, dregs (src));
1190    }
1191  else if (opc == 2)
1192    {
1193      OUTS (outf, dregs (dst));
1194      OUTS (outf, "<<=");
1195      OUTS (outf, dregs (src));
1196    }
1197  else if (opc == 3)
1198    {
1199      OUTS (outf, dregs (dst));
1200      OUTS (outf, "*=");
1201      OUTS (outf, dregs (src));
1202    }
1203  else if (opc == 4)
1204    {
1205      OUTS (outf, dregs (dst));
1206      OUTS (outf, "=(");
1207      OUTS (outf, dregs (dst));
1208      OUTS (outf, "+");
1209      OUTS (outf, dregs (src));
1210      OUTS (outf, ")<<1");
1211    }
1212  else if (opc == 5)
1213    {
1214      OUTS (outf, dregs (dst));
1215      OUTS (outf, "=(");
1216      OUTS (outf, dregs (dst));
1217      OUTS (outf, "+");
1218      OUTS (outf, dregs (src));
1219      OUTS (outf, ")<<2");
1220    }
1221  else if (opc == 8)
1222    {
1223      OUTS (outf, "DIVQ(");
1224      OUTS (outf, dregs (dst));
1225      OUTS (outf, ",");
1226      OUTS (outf, dregs (src));
1227      OUTS (outf, ")");
1228    }
1229  else if (opc == 9)
1230    {
1231      OUTS (outf, "DIVS(");
1232      OUTS (outf, dregs (dst));
1233      OUTS (outf, ",");
1234      OUTS (outf, dregs (src));
1235      OUTS (outf, ")");
1236    }
1237  else if (opc == 10)
1238    {
1239      OUTS (outf, dregs (dst));
1240      OUTS (outf, "=");
1241      OUTS (outf, dregs_lo (src));
1242      OUTS (outf, "(X)");
1243    }
1244  else if (opc == 11)
1245    {
1246      OUTS (outf, dregs (dst));
1247      OUTS (outf, "=");
1248      OUTS (outf, dregs_lo (src));
1249      OUTS (outf, "(Z)");
1250    }
1251  else if (opc == 12)
1252    {
1253      OUTS (outf, dregs (dst));
1254      OUTS (outf, "=");
1255      OUTS (outf, dregs_byte (src));
1256      OUTS (outf, "(X)");
1257    }
1258  else if (opc == 13)
1259    {
1260      OUTS (outf, dregs (dst));
1261      OUTS (outf, "=");
1262      OUTS (outf, dregs_byte (src));
1263      OUTS (outf, "(Z)");
1264    }
1265  else if (opc == 14)
1266    {
1267      OUTS (outf, dregs (dst));
1268      OUTS (outf, "=-");
1269      OUTS (outf, dregs (src));
1270    }
1271  else if (opc == 15)
1272    {
1273      OUTS (outf, dregs (dst));
1274      OUTS (outf, "=~");
1275      OUTS (outf, dregs (src));
1276    }
1277  else
1278    return 0;
1279
1280  return 2;
1281}
1282
1283static int
1284decode_PTR2op_0 (TIword iw0, disassemble_info *outf)
1285{
1286  /* PTR2op
1287     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1288     | 0 | 1 | 0 | 0 | 0 | 1 | 0 |.opc.......|.src.......|.dst.......|
1289     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1290  int src = ((iw0 >> PTR2op_src_bits) & PTR2op_dst_mask);
1291  int opc = ((iw0 >> PTR2op_opc_bits) & PTR2op_opc_mask);
1292  int dst = ((iw0 >> PTR2op_dst_bits) & PTR2op_dst_mask);
1293
1294  if (opc == 0)
1295    {
1296      OUTS (outf, pregs (dst));
1297      OUTS (outf, "-=");
1298      OUTS (outf, pregs (src));
1299    }
1300  else if (opc == 1)
1301    {
1302      OUTS (outf, pregs (dst));
1303      OUTS (outf, "=");
1304      OUTS (outf, pregs (src));
1305      OUTS (outf, "<<2");
1306    }
1307  else if (opc == 3)
1308    {
1309      OUTS (outf, pregs (dst));
1310      OUTS (outf, "=");
1311      OUTS (outf, pregs (src));
1312      OUTS (outf, ">>2");
1313    }
1314  else if (opc == 4)
1315    {
1316      OUTS (outf, pregs (dst));
1317      OUTS (outf, "=");
1318      OUTS (outf, pregs (src));
1319      OUTS (outf, ">>1");
1320    }
1321  else if (opc == 5)
1322    {
1323      OUTS (outf, pregs (dst));
1324      OUTS (outf, "+=");
1325      OUTS (outf, pregs (src));
1326      OUTS (outf, "(BREV)");
1327    }
1328  else if (opc == 6)
1329    {
1330      OUTS (outf, pregs (dst));
1331      OUTS (outf, "=(");
1332      OUTS (outf, pregs (dst));
1333      OUTS (outf, "+");
1334      OUTS (outf, pregs (src));
1335      OUTS (outf, ")<<1");
1336    }
1337  else if (opc == 7)
1338    {
1339      OUTS (outf, pregs (dst));
1340      OUTS (outf, "=(");
1341      OUTS (outf, pregs (dst));
1342      OUTS (outf, "+");
1343      OUTS (outf, pregs (src));
1344      OUTS (outf, ")<<2");
1345    }
1346  else
1347    return 0;
1348
1349  return 2;
1350}
1351
1352static int
1353decode_LOGI2op_0 (TIword iw0, disassemble_info *outf)
1354{
1355  /* LOGI2op
1356     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1357     | 0 | 1 | 0 | 0 | 1 |.opc.......|.src...............|.dst.......|
1358     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1359  int src = ((iw0 >> LOGI2op_src_bits) & LOGI2op_src_mask);
1360  int opc = ((iw0 >> LOGI2op_opc_bits) & LOGI2op_opc_mask);
1361  int dst = ((iw0 >> LOGI2op_dst_bits) & LOGI2op_dst_mask);
1362
1363  if (opc == 0)
1364    {
1365      OUTS (outf, "CC = ! BITTST (");
1366      OUTS (outf, dregs (dst));
1367      OUTS (outf, ",");
1368      OUTS (outf, uimm5 (src));
1369      OUTS (outf, ")");
1370    }
1371  else if (opc == 1)
1372    {
1373      OUTS (outf, "CC = BITTST (");
1374      OUTS (outf, dregs (dst));
1375      OUTS (outf, ",");
1376      OUTS (outf, uimm5 (src));
1377      OUTS (outf, ")");
1378    }
1379  else if (opc == 2)
1380    {
1381      OUTS (outf, "BITSET (");
1382      OUTS (outf, dregs (dst));
1383      OUTS (outf, ",");
1384      OUTS (outf, uimm5 (src));
1385      OUTS (outf, ")");
1386    }
1387  else if (opc == 3)
1388    {
1389      OUTS (outf, "BITTGL (");
1390      OUTS (outf, dregs (dst));
1391      OUTS (outf, ",");
1392      OUTS (outf, uimm5 (src));
1393      OUTS (outf, ")");
1394    }
1395  else if (opc == 4)
1396    {
1397      OUTS (outf, "BITCLR (");
1398      OUTS (outf, dregs (dst));
1399      OUTS (outf, ",");
1400      OUTS (outf, uimm5 (src));
1401      OUTS (outf, ")");
1402    }
1403  else if (opc == 5)
1404    {
1405      OUTS (outf, dregs (dst));
1406      OUTS (outf, ">>>=");
1407      OUTS (outf, uimm5 (src));
1408    }
1409  else if (opc == 6)
1410    {
1411      OUTS (outf, dregs (dst));
1412      OUTS (outf, ">>=");
1413      OUTS (outf, uimm5 (src));
1414    }
1415  else if (opc == 7)
1416    {
1417      OUTS (outf, dregs (dst));
1418      OUTS (outf, "<<=");
1419      OUTS (outf, uimm5 (src));
1420    }
1421  else
1422    return 0;
1423
1424  return 2;
1425}
1426
1427static int
1428decode_COMP3op_0 (TIword iw0, disassemble_info *outf)
1429{
1430  /* COMP3op
1431     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1432     | 0 | 1 | 0 | 1 |.opc.......|.dst.......|.src1......|.src0......|
1433     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1434  int opc  = ((iw0 >> COMP3op_opc_bits) & COMP3op_opc_mask);
1435  int dst  = ((iw0 >> COMP3op_dst_bits) & COMP3op_dst_mask);
1436  int src0 = ((iw0 >> COMP3op_src0_bits) & COMP3op_src0_mask);
1437  int src1 = ((iw0 >> COMP3op_src1_bits) & COMP3op_src1_mask);
1438
1439  if (opc == 5 && src1 == src0)
1440    {
1441      OUTS (outf, pregs (dst));
1442      OUTS (outf, "=");
1443      OUTS (outf, pregs (src0));
1444      OUTS (outf, "<<1");
1445    }
1446  else if (opc == 1)
1447    {
1448      OUTS (outf, dregs (dst));
1449      OUTS (outf, "=");
1450      OUTS (outf, dregs (src0));
1451      OUTS (outf, "-");
1452      OUTS (outf, dregs (src1));
1453    }
1454  else if (opc == 2)
1455    {
1456      OUTS (outf, dregs (dst));
1457      OUTS (outf, "=");
1458      OUTS (outf, dregs (src0));
1459      OUTS (outf, "&");
1460      OUTS (outf, dregs (src1));
1461    }
1462  else if (opc == 3)
1463    {
1464      OUTS (outf, dregs (dst));
1465      OUTS (outf, "=");
1466      OUTS (outf, dregs (src0));
1467      OUTS (outf, "|");
1468      OUTS (outf, dregs (src1));
1469    }
1470  else if (opc == 4)
1471    {
1472      OUTS (outf, dregs (dst));
1473      OUTS (outf, "=");
1474      OUTS (outf, dregs (src0));
1475      OUTS (outf, "^");
1476      OUTS (outf, dregs (src1));
1477    }
1478  else if (opc == 5)
1479    {
1480      OUTS (outf, pregs (dst));
1481      OUTS (outf, "=");
1482      OUTS (outf, pregs (src0));
1483      OUTS (outf, "+");
1484      OUTS (outf, pregs (src1));
1485    }
1486  else if (opc == 6)
1487    {
1488      OUTS (outf, pregs (dst));
1489      OUTS (outf, "=");
1490      OUTS (outf, pregs (src0));
1491      OUTS (outf, "+(");
1492      OUTS (outf, pregs (src1));
1493      OUTS (outf, "<<1)");
1494    }
1495  else if (opc == 7)
1496    {
1497      OUTS (outf, pregs (dst));
1498      OUTS (outf, "=");
1499      OUTS (outf, pregs (src0));
1500      OUTS (outf, "+(");
1501      OUTS (outf, pregs (src1));
1502      OUTS (outf, "<<2)");
1503    }
1504  else if (opc == 0)
1505    {
1506      OUTS (outf, dregs (dst));
1507      OUTS (outf, "=");
1508      OUTS (outf, dregs (src0));
1509      OUTS (outf, "+");
1510      OUTS (outf, dregs (src1));
1511    }
1512  else
1513    return 0;
1514
1515  return 2;
1516}
1517
1518static int
1519decode_COMPI2opD_0 (TIword iw0, disassemble_info *outf)
1520{
1521  /* COMPI2opD
1522     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1523     | 0 | 1 | 1 | 0 | 0 |.op|..src......................|.dst.......|
1524     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1525  int op  = ((iw0 >> COMPI2opD_op_bits) & COMPI2opD_op_mask);
1526  int dst = ((iw0 >> COMPI2opD_dst_bits) & COMPI2opD_dst_mask);
1527  int src = ((iw0 >> COMPI2opD_src_bits) & COMPI2opD_src_mask);
1528
1529  if (op == 0)
1530    {
1531      OUTS (outf, dregs (dst));
1532      OUTS (outf, "=");
1533      OUTS (outf, imm7 (src));
1534      OUTS (outf, "(x)");
1535    }
1536  else if (op == 1)
1537    {
1538      OUTS (outf, dregs (dst));
1539      OUTS (outf, "+=");
1540      OUTS (outf, imm7 (src));
1541    }
1542  else
1543    return 0;
1544
1545  return 2;
1546}
1547
1548static int
1549decode_COMPI2opP_0 (TIword iw0, disassemble_info *outf)
1550{
1551  /* COMPI2opP
1552     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1553     | 0 | 1 | 1 | 0 | 1 |.op|.src.......................|.dst.......|
1554     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1555  int op  = ((iw0 >> COMPI2opP_op_bits) & COMPI2opP_op_mask);
1556  int src = ((iw0 >> COMPI2opP_src_bits) & COMPI2opP_src_mask);
1557  int dst = ((iw0 >> COMPI2opP_dst_bits) & COMPI2opP_dst_mask);
1558
1559  if (op == 0)
1560    {
1561      OUTS (outf, pregs (dst));
1562      OUTS (outf, "=");
1563      OUTS (outf, imm7 (src));
1564    }
1565  else if (op == 1)
1566    {
1567      OUTS (outf, pregs (dst));
1568      OUTS (outf, "+=");
1569      OUTS (outf, imm7 (src));
1570    }
1571  else
1572    return 0;
1573
1574  return 2;
1575}
1576
1577static int
1578decode_LDSTpmod_0 (TIword iw0, disassemble_info *outf)
1579{
1580  /* LDSTpmod
1581     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1582     | 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......|
1583     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1584  int W   = ((iw0 >> LDSTpmod_W_bits) & LDSTpmod_W_mask);
1585  int aop = ((iw0 >> LDSTpmod_aop_bits) & LDSTpmod_aop_mask);
1586  int idx = ((iw0 >> LDSTpmod_idx_bits) & LDSTpmod_idx_mask);
1587  int ptr = ((iw0 >> LDSTpmod_ptr_bits) & LDSTpmod_ptr_mask);
1588  int reg = ((iw0 >> LDSTpmod_reg_bits) & LDSTpmod_reg_mask);
1589
1590  if (aop == 1 && W == 0 && idx == ptr)
1591    {
1592      OUTS (outf, dregs_lo (reg));
1593      OUTS (outf, "=W[");
1594      OUTS (outf, pregs (ptr));
1595      OUTS (outf, "]");
1596    }
1597  else if (aop == 2 && W == 0 && idx == ptr)
1598    {
1599      OUTS (outf, dregs_hi (reg));
1600      OUTS (outf, "=W[");
1601      OUTS (outf, pregs (ptr));
1602      OUTS (outf, "]");
1603    }
1604  else if (aop == 1 && W == 1 && idx == ptr)
1605    {
1606      OUTS (outf, "W[");
1607      OUTS (outf, pregs (ptr));
1608      OUTS (outf, "]=");
1609      OUTS (outf, dregs_lo (reg));
1610    }
1611  else if (aop == 2 && W == 1 && idx == ptr)
1612    {
1613      OUTS (outf, "W[");
1614      OUTS (outf, pregs (ptr));
1615      OUTS (outf, "]=");
1616      OUTS (outf, dregs_hi (reg));
1617    }
1618  else if (aop == 0 && W == 0)
1619    {
1620      OUTS (outf, dregs (reg));
1621      OUTS (outf, "=[");
1622      OUTS (outf, pregs (ptr));
1623      OUTS (outf, "++");
1624      OUTS (outf, pregs (idx));
1625      OUTS (outf, "]");
1626    }
1627  else if (aop == 1 && W == 0)
1628    {
1629      OUTS (outf, dregs_lo (reg));
1630      OUTS (outf, "=W[");
1631      OUTS (outf, pregs (ptr));
1632      OUTS (outf, "++");
1633      OUTS (outf, pregs (idx));
1634      OUTS (outf, "]");
1635    }
1636  else if (aop == 2 && W == 0)
1637    {
1638      OUTS (outf, dregs_hi (reg));
1639      OUTS (outf, "=W[");
1640      OUTS (outf, pregs (ptr));
1641      OUTS (outf, "++");
1642      OUTS (outf, pregs (idx));
1643      OUTS (outf, "]");
1644    }
1645  else if (aop == 3 && W == 0)
1646    {
1647      OUTS (outf, dregs (reg));
1648      OUTS (outf, "=W[");
1649      OUTS (outf, pregs (ptr));
1650      OUTS (outf, "++");
1651      OUTS (outf, pregs (idx));
1652      OUTS (outf, "] (Z)");
1653    }
1654  else if (aop == 3 && W == 1)
1655    {
1656      OUTS (outf, dregs (reg));
1657      OUTS (outf, "=W[");
1658      OUTS (outf, pregs (ptr));
1659      OUTS (outf, "++");
1660      OUTS (outf, pregs (idx));
1661      OUTS (outf, "](X)");
1662    }
1663  else if (aop == 0 && W == 1)
1664    {
1665      OUTS (outf, "[");
1666      OUTS (outf, pregs (ptr));
1667      OUTS (outf, "++");
1668      OUTS (outf, pregs (idx));
1669      OUTS (outf, "]=");
1670      OUTS (outf, dregs (reg));
1671    }
1672  else if (aop == 1 && W == 1)
1673    {
1674      OUTS (outf, "W[");
1675      OUTS (outf, pregs (ptr));
1676      OUTS (outf, "++");
1677      OUTS (outf, pregs (idx));
1678      OUTS (outf, "]=");
1679      OUTS (outf, dregs_lo (reg));
1680    }
1681  else if (aop == 2 && W == 1)
1682    {
1683      OUTS (outf, "W[");
1684      OUTS (outf, pregs (ptr));
1685      OUTS (outf, "++");
1686      OUTS (outf, pregs (idx));
1687      OUTS (outf, "]=");
1688      OUTS (outf, dregs_hi (reg));
1689    }
1690  else
1691    return 0;
1692
1693  return 2;
1694}
1695
1696static int
1697decode_dagMODim_0 (TIword iw0, disassemble_info *outf)
1698{
1699  /* dagMODim
1700     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1701     | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....|
1702     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1703  int i  = ((iw0 >> DagMODim_i_bits) & DagMODim_i_mask);
1704  int m  = ((iw0 >> DagMODim_m_bits) & DagMODim_m_mask);
1705  int br = ((iw0 >> DagMODim_br_bits) & DagMODim_br_mask);
1706  int op = ((iw0 >> DagMODim_op_bits) & DagMODim_op_mask);
1707
1708  if (op == 0 && br == 1)
1709    {
1710      OUTS (outf, iregs (i));
1711      OUTS (outf, "+=");
1712      OUTS (outf, mregs (m));
1713      OUTS (outf, "(BREV)");
1714    }
1715  else if (op == 0)
1716    {
1717      OUTS (outf, iregs (i));
1718      OUTS (outf, "+=");
1719      OUTS (outf, mregs (m));
1720    }
1721  else if (op == 1)
1722    {
1723      OUTS (outf, iregs (i));
1724      OUTS (outf, "-=");
1725      OUTS (outf, mregs (m));
1726    }
1727  else
1728    return 0;
1729
1730  return 2;
1731}
1732
1733static int
1734decode_dagMODik_0 (TIword iw0, disassemble_info *outf)
1735{
1736  /* dagMODik
1737     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1738     | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....|
1739     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1740  int i  = ((iw0 >> DagMODik_i_bits) & DagMODik_i_mask);
1741  int op = ((iw0 >> DagMODik_op_bits) & DagMODik_op_mask);
1742
1743  if (op == 0)
1744    {
1745      OUTS (outf, iregs (i));
1746      OUTS (outf, "+=2");
1747    }
1748  else if (op == 1)
1749    {
1750      OUTS (outf, iregs (i));
1751      OUTS (outf, "-=2");
1752    }
1753  else if (op == 2)
1754    {
1755      OUTS (outf, iregs (i));
1756      OUTS (outf, "+=4");
1757    }
1758  else if (op == 3)
1759    {
1760      OUTS (outf, iregs (i));
1761      OUTS (outf, "-=4");
1762    }
1763  else
1764    return 0;
1765
1766  return 2;
1767}
1768
1769static int
1770decode_dspLDST_0 (TIword iw0, disassemble_info *outf)
1771{
1772  /* dspLDST
1773     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1774     | 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......|
1775     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1776  int i   = ((iw0 >> DspLDST_i_bits) & DspLDST_i_mask);
1777  int m   = ((iw0 >> DspLDST_m_bits) & DspLDST_m_mask);
1778  int W   = ((iw0 >> DspLDST_W_bits) & DspLDST_W_mask);
1779  int aop = ((iw0 >> DspLDST_aop_bits) & DspLDST_aop_mask);
1780  int reg = ((iw0 >> DspLDST_reg_bits) & DspLDST_reg_mask);
1781
1782  if (aop == 0 && W == 0 && m == 0)
1783    {
1784      OUTS (outf, dregs (reg));
1785      OUTS (outf, "=[");
1786      OUTS (outf, iregs (i));
1787      OUTS (outf, "++]");
1788    }
1789  else if (aop == 0 && W == 0 && m == 1)
1790    {
1791      OUTS (outf, dregs_lo (reg));
1792      OUTS (outf, "=W[");
1793      OUTS (outf, iregs (i));
1794      OUTS (outf, "++]");
1795    }
1796  else if (aop == 0 && W == 0 && m == 2)
1797    {
1798      OUTS (outf, dregs_hi (reg));
1799      OUTS (outf, "=W[");
1800      OUTS (outf, iregs (i));
1801      OUTS (outf, "++]");
1802    }
1803  else if (aop == 1 && W == 0 && m == 0)
1804    {
1805      OUTS (outf, dregs (reg));
1806      OUTS (outf, "=[");
1807      OUTS (outf, iregs (i));
1808      OUTS (outf, "--]");
1809    }
1810  else if (aop == 1 && W == 0 && m == 1)
1811    {
1812      OUTS (outf, dregs_lo (reg));
1813      OUTS (outf, "=W[");
1814      OUTS (outf, iregs (i));
1815      OUTS (outf, "--]");
1816    }
1817  else if (aop == 1 && W == 0 && m == 2)
1818    {
1819      OUTS (outf, dregs_hi (reg));
1820      OUTS (outf, "=W[");
1821      OUTS (outf, iregs (i));
1822      OUTS (outf, "--]");
1823    }
1824  else if (aop == 2 && W == 0 && m == 0)
1825    {
1826      OUTS (outf, dregs (reg));
1827      OUTS (outf, "=[");
1828      OUTS (outf, iregs (i));
1829      OUTS (outf, "]");
1830    }
1831  else if (aop == 2 && W == 0 && m == 1)
1832    {
1833      OUTS (outf, dregs_lo (reg));
1834      OUTS (outf, "=W[");
1835      OUTS (outf, iregs (i));
1836      OUTS (outf, "]");
1837    }
1838  else if (aop == 2 && W == 0 && m == 2)
1839    {
1840      OUTS (outf, dregs_hi (reg));
1841      OUTS (outf, "=W[");
1842      OUTS (outf, iregs (i));
1843      OUTS (outf, "]");
1844    }
1845  else if (aop == 0 && W == 1 && m == 0)
1846    {
1847      OUTS (outf, "[");
1848      OUTS (outf, iregs (i));
1849      OUTS (outf, "++]=");
1850      OUTS (outf, dregs (reg));
1851    }
1852  else if (aop == 0 && W == 1 && m == 1)
1853    {
1854      OUTS (outf, "W[");
1855      OUTS (outf, iregs (i));
1856      OUTS (outf, "++]=");
1857      OUTS (outf, dregs_lo (reg));
1858    }
1859  else if (aop == 0 && W == 1 && m == 2)
1860    {
1861      OUTS (outf, "W[");
1862      OUTS (outf, iregs (i));
1863      OUTS (outf, "++]=");
1864      OUTS (outf, dregs_hi (reg));
1865    }
1866  else if (aop == 1 && W == 1 && m == 0)
1867    {
1868      OUTS (outf, "[");
1869      OUTS (outf, iregs (i));
1870      OUTS (outf, "--]=");
1871      OUTS (outf, dregs (reg));
1872    }
1873  else if (aop == 1 && W == 1 && m == 1)
1874    {
1875      OUTS (outf, "W[");
1876      OUTS (outf, iregs (i));
1877      OUTS (outf, "--]=");
1878      OUTS (outf, dregs_lo (reg));
1879    }
1880  else if (aop == 1 && W == 1 && m == 2)
1881    {
1882      OUTS (outf, "W[");
1883      OUTS (outf, iregs (i));
1884      OUTS (outf, "--]=");
1885      OUTS (outf, dregs_hi (reg));
1886    }
1887  else if (aop == 2 && W == 1 && m == 0)
1888    {
1889      OUTS (outf, "[");
1890      OUTS (outf, iregs (i));
1891      OUTS (outf, "]=");
1892      OUTS (outf, dregs (reg));
1893    }
1894  else if (aop == 2 && W == 1 && m == 1)
1895    {
1896      OUTS (outf, "W[");
1897      OUTS (outf, iregs (i));
1898      OUTS (outf, "]=");
1899      OUTS (outf, dregs_lo (reg));
1900    }
1901  else if (aop == 2 && W == 1 && m == 2)
1902    {
1903      OUTS (outf, "W[");
1904      OUTS (outf, iregs (i));
1905      OUTS (outf, "]=");
1906      OUTS (outf, dregs_hi (reg));
1907    }
1908  else if (aop == 3 && W == 0)
1909    {
1910      OUTS (outf, dregs (reg));
1911      OUTS (outf, "=[");
1912      OUTS (outf, iregs (i));
1913      OUTS (outf, "++");
1914      OUTS (outf, mregs (m));
1915      OUTS (outf, "]");
1916    }
1917  else if (aop == 3 && W == 1)
1918    {
1919      OUTS (outf, "[");
1920      OUTS (outf, iregs (i));
1921      OUTS (outf, "++");
1922      OUTS (outf, mregs (m));
1923      OUTS (outf, "]=");
1924      OUTS (outf, dregs (reg));
1925    }
1926  else
1927    return 0;
1928
1929  return 2;
1930}
1931
1932static int
1933decode_LDST_0 (TIword iw0, disassemble_info *outf)
1934{
1935  /* LDST
1936     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1937     | 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......|
1938     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1939  int Z   = ((iw0 >> LDST_Z_bits) & LDST_Z_mask);
1940  int W   = ((iw0 >> LDST_W_bits) & LDST_W_mask);
1941  int sz  = ((iw0 >> LDST_sz_bits) & LDST_sz_mask);
1942  int aop = ((iw0 >> LDST_aop_bits) & LDST_aop_mask);
1943  int reg = ((iw0 >> LDST_reg_bits) & LDST_reg_mask);
1944  int ptr = ((iw0 >> LDST_ptr_bits) & LDST_ptr_mask);
1945
1946  if (aop == 0 && sz == 0 && Z == 0 && W == 0)
1947    {
1948      OUTS (outf, dregs (reg));
1949      OUTS (outf, "=[");
1950      OUTS (outf, pregs (ptr));
1951      OUTS (outf, "++]");
1952    }
1953  else if (aop == 0 && sz == 0 && Z == 1 && W == 0)
1954    {
1955      OUTS (outf, pregs (reg));
1956      OUTS (outf, "=[");
1957      OUTS (outf, pregs (ptr));
1958      OUTS (outf, "++]");
1959    }
1960  else if (aop == 0 && sz == 1 && Z == 0 && W == 0)
1961    {
1962      OUTS (outf, dregs (reg));
1963      OUTS (outf, "=W[");
1964      OUTS (outf, pregs (ptr));
1965      OUTS (outf, "++] (Z)");
1966    }
1967  else if (aop == 0 && sz == 1 && Z == 1 && W == 0)
1968    {
1969      OUTS (outf, dregs (reg));
1970      OUTS (outf, "=W[");
1971      OUTS (outf, pregs (ptr));
1972      OUTS (outf, "++](X)");
1973    }
1974  else if (aop == 0 && sz == 2 && Z == 0 && W == 0)
1975    {
1976      OUTS (outf, dregs (reg));
1977      OUTS (outf, "=B[");
1978      OUTS (outf, pregs (ptr));
1979      OUTS (outf, "++] (Z)");
1980    }
1981  else if (aop == 0 && sz == 2 && Z == 1 && W == 0)
1982    {
1983      OUTS (outf, dregs (reg));
1984      OUTS (outf, "=B[");
1985      OUTS (outf, pregs (ptr));
1986      OUTS (outf, "++](X)");
1987    }
1988  else if (aop == 1 && sz == 0 && Z == 0 && W == 0)
1989    {
1990      OUTS (outf, dregs (reg));
1991      OUTS (outf, "=[");
1992      OUTS (outf, pregs (ptr));
1993      OUTS (outf, "--]");
1994    }
1995  else if (aop == 1 && sz == 0 && Z == 1 && W == 0)
1996    {
1997      OUTS (outf, pregs (reg));
1998      OUTS (outf, "=[");
1999      OUTS (outf, pregs (ptr));
2000      OUTS (outf, "--]");
2001    }
2002  else if (aop == 1 && sz == 1 && Z == 0 && W == 0)
2003    {
2004      OUTS (outf, dregs (reg));
2005      OUTS (outf, "=W[");
2006      OUTS (outf, pregs (ptr));
2007      OUTS (outf, "--] (Z)");
2008    }
2009  else if (aop == 1 && sz == 1 && Z == 1 && W == 0)
2010    {
2011      OUTS (outf, dregs (reg));
2012      OUTS (outf, "=W[");
2013      OUTS (outf, pregs (ptr));
2014      OUTS (outf, "--](X)");
2015    }
2016  else if (aop == 1 && sz == 2 && Z == 0 && W == 0)
2017    {
2018      OUTS (outf, dregs (reg));
2019      OUTS (outf, "=B[");
2020      OUTS (outf, pregs (ptr));
2021      OUTS (outf, "--] (Z)");
2022    }
2023  else if (aop == 1 && sz == 2 && Z == 1 && W == 0)
2024    {
2025      OUTS (outf, dregs (reg));
2026      OUTS (outf, "=B[");
2027      OUTS (outf, pregs (ptr));
2028      OUTS (outf, "--](X)");
2029    }
2030  else if (aop == 2 && sz == 0 && Z == 0 && W == 0)
2031    {
2032      OUTS (outf, dregs (reg));
2033      OUTS (outf, "=[");
2034      OUTS (outf, pregs (ptr));
2035      OUTS (outf, "]");
2036    }
2037  else if (aop == 2 && sz == 0 && Z == 1 && W == 0)
2038    {
2039      OUTS (outf, pregs (reg));
2040      OUTS (outf, "=[");
2041      OUTS (outf, pregs (ptr));
2042      OUTS (outf, "]");
2043    }
2044  else if (aop == 2 && sz == 1 && Z == 0 && W == 0)
2045    {
2046      OUTS (outf, dregs (reg));
2047      OUTS (outf, "=W[");
2048      OUTS (outf, pregs (ptr));
2049      OUTS (outf, "] (Z)");
2050    }
2051  else if (aop == 2 && sz == 1 && Z == 1 && W == 0)
2052    {
2053      OUTS (outf, dregs (reg));
2054      OUTS (outf, "=W[");
2055      OUTS (outf, pregs (ptr));
2056      OUTS (outf, "](X)");
2057    }
2058  else if (aop == 2 && sz == 2 && Z == 0 && W == 0)
2059    {
2060      OUTS (outf, dregs (reg));
2061      OUTS (outf, "=B[");
2062      OUTS (outf, pregs (ptr));
2063      OUTS (outf, "] (Z)");
2064    }
2065  else if (aop == 2 && sz == 2 && Z == 1 && W == 0)
2066    {
2067      OUTS (outf, dregs (reg));
2068      OUTS (outf, "=B[");
2069      OUTS (outf, pregs (ptr));
2070      OUTS (outf, "](X)");
2071    }
2072  else if (aop == 0 && sz == 0 && Z == 0 && W == 1)
2073    {
2074      OUTS (outf, "[");
2075      OUTS (outf, pregs (ptr));
2076      OUTS (outf, "++]=");
2077      OUTS (outf, dregs (reg));
2078    }
2079  else if (aop == 0 && sz == 0 && Z == 1 && W == 1)
2080    {
2081      OUTS (outf, "[");
2082      OUTS (outf, pregs (ptr));
2083      OUTS (outf, "++]=");
2084      OUTS (outf, pregs (reg));
2085    }
2086  else if (aop == 0 && sz == 1 && Z == 0 && W == 1)
2087    {
2088      OUTS (outf, "W[");
2089      OUTS (outf, pregs (ptr));
2090      OUTS (outf, "++]=");
2091      OUTS (outf, dregs (reg));
2092    }
2093  else if (aop == 0 && sz == 2 && Z == 0 && W == 1)
2094    {
2095      OUTS (outf, "B[");
2096      OUTS (outf, pregs (ptr));
2097      OUTS (outf, "++]=");
2098      OUTS (outf, dregs (reg));
2099    }
2100  else if (aop == 1 && sz == 0 && Z == 0 && W == 1)
2101    {
2102      OUTS (outf, "[");
2103      OUTS (outf, pregs (ptr));
2104      OUTS (outf, "--]=");
2105      OUTS (outf, dregs (reg));
2106    }
2107  else if (aop == 1 && sz == 0 && Z == 1 && W == 1)
2108    {
2109      OUTS (outf, "[");
2110      OUTS (outf, pregs (ptr));
2111      OUTS (outf, "--]=");
2112      OUTS (outf, pregs (reg));
2113    }
2114  else if (aop == 1 && sz == 1 && Z == 0 && W == 1)
2115    {
2116      OUTS (outf, "W[");
2117      OUTS (outf, pregs (ptr));
2118      OUTS (outf, "--]=");
2119      OUTS (outf, dregs (reg));
2120    }
2121  else if (aop == 1 && sz == 2 && Z == 0 && W == 1)
2122    {
2123      OUTS (outf, "B[");
2124      OUTS (outf, pregs (ptr));
2125      OUTS (outf, "--]=");
2126      OUTS (outf, dregs (reg));
2127    }
2128  else if (aop == 2 && sz == 0 && Z == 0 && W == 1)
2129    {
2130      OUTS (outf, "[");
2131      OUTS (outf, pregs (ptr));
2132      OUTS (outf, "]=");
2133      OUTS (outf, dregs (reg));
2134    }
2135  else if (aop == 2 && sz == 0 && Z == 1 && W == 1)
2136    {
2137      OUTS (outf, "[");
2138      OUTS (outf, pregs (ptr));
2139      OUTS (outf, "]=");
2140      OUTS (outf, pregs (reg));
2141    }
2142  else if (aop == 2 && sz == 1 && Z == 0 && W == 1)
2143    {
2144      OUTS (outf, "W[");
2145      OUTS (outf, pregs (ptr));
2146      OUTS (outf, "]=");
2147      OUTS (outf, dregs (reg));
2148    }
2149  else if (aop == 2 && sz == 2 && Z == 0 && W == 1)
2150    {
2151      OUTS (outf, "B[");
2152      OUTS (outf, pregs (ptr));
2153      OUTS (outf, "]=");
2154      OUTS (outf, dregs (reg));
2155    }
2156  else
2157    return 0;
2158
2159  return 2;
2160}
2161
2162static int
2163decode_LDSTiiFP_0 (TIword iw0, disassemble_info *outf)
2164{
2165  /* LDSTiiFP
2166     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2167     | 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........|
2168     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2169  int reg = ((iw0 >> LDSTiiFP_reg_bits) & LDSTiiFP_reg_mask);
2170  int offset = ((iw0 >> LDSTiiFP_offset_bits) & LDSTiiFP_offset_mask);
2171  int W = ((iw0 >> LDSTiiFP_W_bits) & LDSTiiFP_W_mask);
2172
2173  if (W == 0)
2174    {
2175      OUTS (outf, dpregs (reg));
2176      OUTS (outf, "=[FP");
2177      OUTS (outf, negimm5s4 (offset));
2178      OUTS (outf, "]");
2179    }
2180  else if (W == 1)
2181    {
2182      OUTS (outf, "[FP");
2183      OUTS (outf, negimm5s4 (offset));
2184      OUTS (outf, "]=");
2185      OUTS (outf, dpregs (reg));
2186    }
2187  else
2188    return 0;
2189
2190  return 2;
2191}
2192
2193static int
2194decode_LDSTii_0 (TIword iw0, disassemble_info *outf)
2195{
2196  /* LDSTii
2197     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2198     | 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......|
2199     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2200  int reg = ((iw0 >> LDSTii_reg_bit) & LDSTii_reg_mask);
2201  int ptr = ((iw0 >> LDSTii_ptr_bit) & LDSTii_ptr_mask);
2202  int offset = ((iw0 >> LDSTii_offset_bit) & LDSTii_offset_mask);
2203  int op = ((iw0 >> LDSTii_op_bit) & LDSTii_op_mask);
2204  int W = ((iw0 >> LDSTii_W_bit) & LDSTii_W_mask);
2205
2206  if (W == 0 && op == 0)
2207    {
2208      OUTS (outf, dregs (reg));
2209      OUTS (outf, "=[");
2210      OUTS (outf, pregs (ptr));
2211      OUTS (outf, "+");
2212      OUTS (outf, uimm4s4 (offset));
2213      OUTS (outf, "]");
2214    }
2215  else if (W == 0 && op == 1)
2216    {
2217      OUTS (outf, dregs (reg));
2218      OUTS (outf, "=W[");
2219      OUTS (outf, pregs (ptr));
2220      OUTS (outf, "+");
2221      OUTS (outf, uimm4s2 (offset));
2222      OUTS (outf, "] (Z)");
2223    }
2224  else if (W == 0 && op == 2)
2225    {
2226      OUTS (outf, dregs (reg));
2227      OUTS (outf, "=W[");
2228      OUTS (outf, pregs (ptr));
2229      OUTS (outf, "+");
2230      OUTS (outf, uimm4s2 (offset));
2231      OUTS (outf, "](X)");
2232    }
2233  else if (W == 0 && op == 3)
2234    {
2235      OUTS (outf, pregs (reg));
2236      OUTS (outf, "=[");
2237      OUTS (outf, pregs (ptr));
2238      OUTS (outf, "+");
2239      OUTS (outf, uimm4s4 (offset));
2240      OUTS (outf, "]");
2241    }
2242  else if (W == 1 && op == 0)
2243    {
2244      OUTS (outf, "[");
2245      OUTS (outf, pregs (ptr));
2246      OUTS (outf, "+");
2247      OUTS (outf, uimm4s4 (offset));
2248      OUTS (outf, "]=");
2249      OUTS (outf, dregs (reg));
2250    }
2251  else if (W == 1 && op == 1)
2252    {
2253      OUTS (outf, "W");
2254      OUTS (outf, "[");
2255      OUTS (outf, pregs (ptr));
2256      OUTS (outf, "+");
2257      OUTS (outf, uimm4s2 (offset));
2258      OUTS (outf, "]");
2259      OUTS (outf, "=");
2260      OUTS (outf, dregs (reg));
2261    }
2262  else if (W == 1 && op == 3)
2263    {
2264      OUTS (outf, "[");
2265      OUTS (outf, pregs (ptr));
2266      OUTS (outf, "+");
2267      OUTS (outf, uimm4s4 (offset));
2268      OUTS (outf, "]=");
2269      OUTS (outf, pregs (reg));
2270    }
2271  else
2272    return 0;
2273
2274  return 2;
2275}
2276
2277static int
2278decode_LoopSetup_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
2279{
2280  /* LoopSetup
2281     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2282     | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |.rop...|.c.|.soffset.......|
2283     |.reg...........| - | - |.eoffset...............................|
2284     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2285  int c   = ((iw0 >> (LoopSetup_c_bits - 16)) & LoopSetup_c_mask);
2286  int reg = ((iw1 >> LoopSetup_reg_bits) & LoopSetup_reg_mask);
2287  int rop = ((iw0 >> (LoopSetup_rop_bits - 16)) & LoopSetup_rop_mask);
2288  int soffset = ((iw0 >> (LoopSetup_soffset_bits - 16)) & LoopSetup_soffset_mask);
2289  int eoffset = ((iw1 >> LoopSetup_eoffset_bits) & LoopSetup_eoffset_mask);
2290
2291  if (rop == 0)
2292    {
2293      OUTS (outf, "LSETUP");
2294      OUTS (outf, "(");
2295      OUTS (outf, pcrel4 (soffset));
2296      OUTS (outf, ",");
2297      OUTS (outf, lppcrel10 (eoffset));
2298      OUTS (outf, ")");
2299      OUTS (outf, counters (c));
2300    }
2301  else if (rop == 1)
2302    {
2303      OUTS (outf, "LSETUP");
2304      OUTS (outf, "(");
2305      OUTS (outf, pcrel4 (soffset));
2306      OUTS (outf, ",");
2307      OUTS (outf, lppcrel10 (eoffset));
2308      OUTS (outf, ")");
2309      OUTS (outf, counters (c));
2310      OUTS (outf, "=");
2311      OUTS (outf, pregs (reg));
2312    }
2313  else if (rop == 3)
2314    {
2315      OUTS (outf, "LSETUP");
2316      OUTS (outf, "(");
2317      OUTS (outf, pcrel4 (soffset));
2318      OUTS (outf, ",");
2319      OUTS (outf, lppcrel10 (eoffset));
2320      OUTS (outf, ")");
2321      OUTS (outf, counters (c));
2322      OUTS (outf, "=");
2323      OUTS (outf, pregs (reg));
2324      OUTS (outf, ">>1");
2325    }
2326  else
2327    return 0;
2328
2329  return 4;
2330}
2331
2332static int
2333decode_LDIMMhalf_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2334{
2335  /* LDIMMhalf
2336     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2337     | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |.Z.|.H.|.S.|.grp...|.reg.......|
2338     |.hword.........................................................|
2339     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2340  int H = ((iw0 >> (LDIMMhalf_H_bits - 16)) & LDIMMhalf_H_mask);
2341  int Z = ((iw0 >> (LDIMMhalf_Z_bits - 16)) & LDIMMhalf_Z_mask);
2342  int S = ((iw0 >> (LDIMMhalf_S_bits - 16)) & LDIMMhalf_S_mask);
2343  int reg = ((iw0 >> (LDIMMhalf_reg_bits - 16)) & LDIMMhalf_reg_mask);
2344  int grp = ((iw0 >> (LDIMMhalf_grp_bits - 16)) & LDIMMhalf_grp_mask);
2345  int hword = ((iw1 >> LDIMMhalf_hword_bits) & LDIMMhalf_hword_mask);
2346
2347  if (grp == 0 && H == 0 && S == 0 && Z == 0)
2348    {
2349      OUTS (outf, dregs_lo (reg));
2350      OUTS (outf, "=");
2351      OUTS (outf, imm16 (hword));
2352    }
2353  else if (grp == 0 && H == 1 && S == 0 && Z == 0)
2354    {
2355      OUTS (outf, dregs_hi (reg));
2356      OUTS (outf, "=");
2357      OUTS (outf, imm16 (hword));
2358    }
2359  else if (grp == 0 && H == 0 && S == 1 && Z == 0)
2360    {
2361      OUTS (outf, dregs (reg));
2362      OUTS (outf, "=");
2363      OUTS (outf, imm16 (hword));
2364      OUTS (outf, " (X)");
2365    }
2366  else if (H == 0 && S == 1 && Z == 0)
2367    {
2368      OUTS (outf, regs (reg, grp));
2369      OUTS (outf, "=");
2370      OUTS (outf, imm16 (hword));
2371      OUTS (outf, " (X)");
2372    }
2373  else if (H == 0 && S == 0 && Z == 1)
2374    {
2375      OUTS (outf, regs (reg, grp));
2376      OUTS (outf, "=");
2377      OUTS (outf, luimm16 (hword));
2378      OUTS (outf, "(Z)");
2379    }
2380  else if (H == 0 && S == 0 && Z == 0)
2381    {
2382      OUTS (outf, regs_lo (reg, grp));
2383      OUTS (outf, "=");
2384      OUTS (outf, luimm16 (hword));
2385    }
2386  else if (H == 1 && S == 0 && Z == 0)
2387    {
2388      OUTS (outf, regs_hi (reg, grp));
2389      OUTS (outf, "=");
2390      OUTS (outf, huimm16 (hword));
2391    }
2392  else
2393    return 0;
2394
2395  return 4;
2396}
2397
2398static int
2399decode_CALLa_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
2400{
2401  /* CALLa
2402     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2403     | 1 | 1 | 1 | 0 | 0 | 0 | 1 |.S.|.msw...........................|
2404     |.lsw...........................................................|
2405     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2406  int S   = ((iw0 >> (CALLa_S_bits - 16)) & CALLa_S_mask);
2407  int lsw = ((iw1 >> 0) & 0xffff);
2408  int msw = ((iw0 >> 0) & 0xff);
2409
2410  if (S == 1)
2411    OUTS (outf, "CALL  ");
2412  else if (S == 0)
2413    OUTS (outf, "JUMP.L  ");
2414  else
2415    return 0;
2416
2417  OUTS (outf, pcrel24 (((msw) << 16) | (lsw)));
2418  return 4;
2419}
2420
2421static int
2422decode_LDSTidxI_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2423{
2424  /* LDSTidxI
2425     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2426     | 1 | 1 | 1 | 0 | 0 | 1 |.W.|.Z.|.sz....|.ptr.......|.reg.......|
2427     |.offset........................................................|
2428     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2429  int Z = ((iw0 >> (LDSTidxI_Z_bits - 16)) & LDSTidxI_Z_mask);
2430  int W = ((iw0 >> (LDSTidxI_W_bits - 16)) & LDSTidxI_W_mask);
2431  int sz = ((iw0 >> (LDSTidxI_sz_bits - 16)) & LDSTidxI_sz_mask);
2432  int reg = ((iw0 >> (LDSTidxI_reg_bits - 16)) & LDSTidxI_reg_mask);
2433  int ptr = ((iw0 >> (LDSTidxI_ptr_bits - 16)) & LDSTidxI_ptr_mask);
2434  int offset = ((iw1 >> LDSTidxI_offset_bits) & LDSTidxI_offset_mask);
2435
2436  if (W == 0 && sz == 0 && Z == 0)
2437    {
2438      OUTS (outf, dregs (reg));
2439      OUTS (outf, "=[");
2440      OUTS (outf, pregs (ptr));
2441      OUTS (outf, "+");
2442      OUTS (outf, imm16s4 (offset));
2443      OUTS (outf, "]");
2444    }
2445  else if (W == 0 && sz == 0 && Z == 1)
2446    {
2447      OUTS (outf, pregs (reg));
2448      OUTS (outf, "=[");
2449      OUTS (outf, pregs (ptr));
2450      OUTS (outf, "+");
2451      OUTS (outf, imm16s4 (offset));
2452      OUTS (outf, "]");
2453    }
2454  else if (W == 0 && sz == 1 && Z == 0)
2455    {
2456      OUTS (outf, dregs (reg));
2457      OUTS (outf, "=W[");
2458      OUTS (outf, pregs (ptr));
2459      OUTS (outf, "+");
2460      OUTS (outf, imm16s2 (offset));
2461      OUTS (outf, "] (Z)");
2462    }
2463  else if (W == 0 && sz == 1 && Z == 1)
2464    {
2465      OUTS (outf, dregs (reg));
2466      OUTS (outf, "=W[");
2467      OUTS (outf, pregs (ptr));
2468      OUTS (outf, "+");
2469      OUTS (outf, imm16s2 (offset));
2470      OUTS (outf, "](X)");
2471    }
2472  else if (W == 0 && sz == 2 && Z == 0)
2473    {
2474      OUTS (outf, dregs (reg));
2475      OUTS (outf, "=B[");
2476      OUTS (outf, pregs (ptr));
2477      OUTS (outf, "+");
2478      OUTS (outf, imm16 (offset));
2479      OUTS (outf, "] (Z)");
2480    }
2481  else if (W == 0 && sz == 2 && Z == 1)
2482    {
2483      OUTS (outf, dregs (reg));
2484      OUTS (outf, "=B[");
2485      OUTS (outf, pregs (ptr));
2486      OUTS (outf, "+");
2487      OUTS (outf, imm16 (offset));
2488      OUTS (outf, "](X)");
2489    }
2490  else if (W == 1 && sz == 0 && Z == 0)
2491    {
2492      OUTS (outf, "[");
2493      OUTS (outf, pregs (ptr));
2494      OUTS (outf, "+");
2495      OUTS (outf, imm16s4 (offset));
2496      OUTS (outf, "]=");
2497      OUTS (outf, dregs (reg));
2498    }
2499  else if (W == 1 && sz == 0 && Z == 1)
2500    {
2501      OUTS (outf, "[");
2502      OUTS (outf, pregs (ptr));
2503      OUTS (outf, "+");
2504      OUTS (outf, imm16s4 (offset));
2505      OUTS (outf, "]=");
2506      OUTS (outf, pregs (reg));
2507    }
2508  else if (W == 1 && sz == 1 && Z == 0)
2509    {
2510      OUTS (outf, "W[");
2511      OUTS (outf, pregs (ptr));
2512      OUTS (outf, "+");
2513      OUTS (outf, imm16s2 (offset));
2514      OUTS (outf, "]=");
2515      OUTS (outf, dregs (reg));
2516    }
2517  else if (W == 1 && sz == 2 && Z == 0)
2518    {
2519      OUTS (outf, "B[");
2520      OUTS (outf, pregs (ptr));
2521      OUTS (outf, "+");
2522      OUTS (outf, imm16 (offset));
2523      OUTS (outf, "]=");
2524      OUTS (outf, dregs (reg));
2525    }
2526  else
2527    return 0;
2528
2529  return 4;
2530}
2531
2532static int
2533decode_linkage_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2534{
2535  /* linkage
2536     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2537     | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.R.|
2538     |.framesize.....................................................|
2539     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2540  int R = ((iw0 >> (Linkage_R_bits - 16)) & Linkage_R_mask);
2541  int framesize = ((iw1 >> Linkage_framesize_bits) & Linkage_framesize_mask);
2542
2543  if (R == 0)
2544    {
2545      OUTS (outf, "LINK ");
2546      OUTS (outf, uimm16s4 (framesize));
2547    }
2548  else if (R == 1)
2549    OUTS (outf, "UNLINK");
2550  else
2551    return 0;
2552
2553  return 4;
2554}
2555
2556static int
2557decode_dsp32mac_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2558{
2559  /* dsp32mac
2560     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2561     | 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|
2562     |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
2563     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2564  int op1  = ((iw0 >> (DSP32Mac_op1_bits - 16)) & DSP32Mac_op1_mask);
2565  int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2566  int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2567  int MM   = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
2568  int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2569  int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2570  int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
2571  int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
2572  int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2573  int h10  = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
2574  int h00  = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
2575  int op0  = ((iw1 >> DSP32Mac_op0_bits) & DSP32Mac_op0_mask);
2576  int h11  = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
2577  int h01  = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
2578
2579  if (w0 == 0 && w1 == 0 && op1 == 3 && op0 == 3)
2580    return 0;
2581
2582  if (op1 == 3 && MM)
2583    return 0;
2584
2585  if ((w1 || w0) && mmod == M_W32)
2586    return 0;
2587
2588  if (((1 << mmod) & (P ? 0x31b : 0x1b5f)) == 0)
2589    return 0;
2590
2591  if (w1 == 1 || op1 != 3)
2592    {
2593      if (w1)
2594	OUTS (outf, P ? dregs (dst + 1) : dregs_hi (dst));
2595
2596      if (op1 == 3)
2597	OUTS (outf, " = A1");
2598      else
2599	{
2600	  if (w1)
2601	    OUTS (outf, " = (");
2602	  decode_macfunc (1, op1, h01, h11, src0, src1, outf);
2603	  if (w1)
2604	    OUTS (outf, ")");
2605	}
2606
2607      if (w0 == 1 || op0 != 3)
2608	{
2609	  if (MM)
2610	    OUTS (outf, " (M)");
2611	  MM = 0;
2612	  OUTS (outf, ", ");
2613	}
2614    }
2615
2616  if (w0 == 1 || op0 != 3)
2617    {
2618      if (w0)
2619	OUTS (outf, P ? dregs (dst) : dregs_lo (dst));
2620
2621      if (op0 == 3)
2622	OUTS (outf, " = A0");
2623      else
2624	{
2625	  if (w0)
2626	    OUTS (outf, " = (");
2627	  decode_macfunc (0, op0, h00, h10, src0, src1, outf);
2628	  if (w0)
2629	    OUTS (outf, ")");
2630	}
2631    }
2632
2633  decode_optmode (mmod, MM, outf);
2634
2635  return 4;
2636}
2637
2638static int
2639decode_dsp32mult_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2640{
2641  /* dsp32mult
2642     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2643     | 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...|
2644     |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
2645     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2646  int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2647  int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2648  int MM   = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
2649  int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2650  int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2651  int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
2652  int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
2653  int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2654  int h10  = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
2655  int h00  = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
2656  int h11  = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
2657  int h01  = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
2658
2659  if (w1 == 0 && w0 == 0)
2660    return 0;
2661
2662  if (((1 << mmod) & (P ? 0x313 : 0x1b57)) == 0)
2663    return 0;
2664
2665  if (w1)
2666    {
2667      OUTS (outf, P ? dregs (dst | 1) : dregs_hi (dst));
2668      OUTS (outf, " = ");
2669      decode_multfunc (h01, h11, src0, src1, outf);
2670
2671      if (w0)
2672	{
2673	  if (MM)
2674	    OUTS (outf, " (M)");
2675	  MM = 0;
2676	  OUTS (outf, ", ");
2677	}
2678    }
2679
2680  if (w0)
2681    {
2682      OUTS (outf, dregs (dst));
2683      OUTS (outf, " = ");
2684      decode_multfunc (h00, h10, src0, src1, outf);
2685    }
2686
2687  decode_optmode (mmod, MM, outf);
2688  return 4;
2689}
2690
2691static int
2692decode_dsp32alu_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2693{
2694  /* dsp32alu
2695     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2696     | 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............|
2697     |.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......|
2698     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2699  int s    = ((iw1 >> DSP32Alu_s_bits) & DSP32Alu_s_mask);
2700  int x    = ((iw1 >> DSP32Alu_x_bits) & DSP32Alu_x_mask);
2701  int aop  = ((iw1 >> DSP32Alu_aop_bits) & DSP32Alu_aop_mask);
2702  int src0 = ((iw1 >> DSP32Alu_src0_bits) & DSP32Alu_src0_mask);
2703  int src1 = ((iw1 >> DSP32Alu_src1_bits) & DSP32Alu_src1_mask);
2704  int dst0 = ((iw1 >> DSP32Alu_dst0_bits) & DSP32Alu_dst0_mask);
2705  int dst1 = ((iw1 >> DSP32Alu_dst1_bits) & DSP32Alu_dst1_mask);
2706  int HL   = ((iw0 >> (DSP32Alu_HL_bits - 16)) & DSP32Alu_HL_mask);
2707  int aopcde = ((iw0 >> (DSP32Alu_aopcde_bits - 16)) & DSP32Alu_aopcde_mask);
2708
2709  if (aop == 0 && aopcde == 9 && HL == 0 && s == 0)
2710    {
2711      OUTS (outf, "A0.L=");
2712      OUTS (outf, dregs_lo (src0));
2713    }
2714  else if (aop == 2 && aopcde == 9 && HL == 1 && s == 0)
2715    {
2716      OUTS (outf, "A1.H=");
2717      OUTS (outf, dregs_hi (src0));
2718    }
2719  else if (aop == 2 && aopcde == 9 && HL == 0 && s == 0)
2720    {
2721      OUTS (outf, "A1.L=");
2722      OUTS (outf, dregs_lo (src0));
2723    }
2724  else if (aop == 0 && aopcde == 9 && HL == 1 && s == 0)
2725    {
2726      OUTS (outf, "A0.H=");
2727      OUTS (outf, dregs_hi (src0));
2728    }
2729  else if (x == 1 && HL == 1 && aop == 3 && aopcde == 5)
2730    {
2731      OUTS (outf, dregs_hi (dst0));
2732      OUTS (outf, "=");
2733      OUTS (outf, dregs (src0));
2734      OUTS (outf, "-");
2735      OUTS (outf, dregs (src1));
2736      OUTS (outf, "(RND20)");
2737    }
2738  else if (x == 1 && HL == 1 && aop == 2 && aopcde == 5)
2739    {
2740      OUTS (outf, dregs_hi (dst0));
2741      OUTS (outf, "=");
2742      OUTS (outf, dregs (src0));
2743      OUTS (outf, "+");
2744      OUTS (outf, dregs (src1));
2745      OUTS (outf, "(RND20)");
2746    }
2747  else if (x == 0 && HL == 0 && aop == 1 && aopcde == 5)
2748    {
2749      OUTS (outf, dregs_lo (dst0));
2750      OUTS (outf, "=");
2751      OUTS (outf, dregs (src0));
2752      OUTS (outf, "-");
2753      OUTS (outf, dregs (src1));
2754      OUTS (outf, "(RND12)");
2755    }
2756  else if (x == 0 && HL == 0 && aop == 0 && aopcde == 5)
2757    {
2758      OUTS (outf, dregs_lo (dst0));
2759      OUTS (outf, "=");
2760      OUTS (outf, dregs (src0));
2761      OUTS (outf, "+");
2762      OUTS (outf, dregs (src1));
2763      OUTS (outf, "(RND12)");
2764    }
2765  else if (x == 1 && HL == 0 && aop == 3 && aopcde == 5)
2766    {
2767      OUTS (outf, dregs_lo (dst0));
2768      OUTS (outf, "=");
2769      OUTS (outf, dregs (src0));
2770      OUTS (outf, "-");
2771      OUTS (outf, dregs (src1));
2772      OUTS (outf, "(RND20)");
2773    }
2774  else if (x == 0 && HL == 1 && aop == 0 && aopcde == 5)
2775    {
2776      OUTS (outf, dregs_hi (dst0));
2777      OUTS (outf, "=");
2778      OUTS (outf, dregs (src0));
2779      OUTS (outf, "+");
2780      OUTS (outf, dregs (src1));
2781      OUTS (outf, "(RND12)");
2782    }
2783  else if (x == 1 && HL == 0 && aop == 2 && aopcde == 5)
2784    {
2785      OUTS (outf, dregs_lo (dst0));
2786      OUTS (outf, "=");
2787      OUTS (outf, dregs (src0));
2788      OUTS (outf, "+");
2789      OUTS (outf, dregs (src1));
2790      OUTS (outf, "(RND20)");
2791    }
2792  else if (x == 0 && HL == 1 && aop == 1 && aopcde == 5)
2793    {
2794      OUTS (outf, dregs_hi (dst0));
2795      OUTS (outf, "=");
2796      OUTS (outf, dregs (src0));
2797      OUTS (outf, "-");
2798      OUTS (outf, dregs (src1));
2799      OUTS (outf, "(RND12)");
2800    }
2801  else if (HL == 1 && aop == 0 && aopcde == 2)
2802    {
2803      OUTS (outf, dregs_hi (dst0));
2804      OUTS (outf, "=");
2805      OUTS (outf, dregs_lo (src0));
2806      OUTS (outf, "+");
2807      OUTS (outf, dregs_lo (src1));
2808      OUTS (outf, " ");
2809      amod1 (s, x, outf);
2810    }
2811  else if (HL == 1 && aop == 1 && aopcde == 2)
2812    {
2813      OUTS (outf, dregs_hi (dst0));
2814      OUTS (outf, "=");
2815      OUTS (outf, dregs_lo (src0));
2816      OUTS (outf, "+");
2817      OUTS (outf, dregs_hi (src1));
2818      OUTS (outf, " ");
2819      amod1 (s, x, outf);
2820    }
2821  else if (HL == 1 && aop == 2 && aopcde == 2)
2822    {
2823      OUTS (outf, dregs_hi (dst0));
2824      OUTS (outf, "=");
2825      OUTS (outf, dregs_hi (src0));
2826      OUTS (outf, "+");
2827      OUTS (outf, dregs_lo (src1));
2828      OUTS (outf, " ");
2829      amod1 (s, x, outf);
2830    }
2831  else if (HL == 1 && aop == 3 && aopcde == 2)
2832    {
2833      OUTS (outf, dregs_hi (dst0));
2834      OUTS (outf, "=");
2835      OUTS (outf, dregs_hi (src0));
2836      OUTS (outf, "+");
2837      OUTS (outf, dregs_hi (src1));
2838      OUTS (outf, " ");
2839      amod1 (s, x, outf);
2840    }
2841  else if (HL == 0 && aop == 0 && aopcde == 3)
2842    {
2843      OUTS (outf, dregs_lo (dst0));
2844      OUTS (outf, "=");
2845      OUTS (outf, dregs_lo (src0));
2846      OUTS (outf, "-");
2847      OUTS (outf, dregs_lo (src1));
2848      OUTS (outf, " ");
2849      amod1 (s, x, outf);
2850    }
2851  else if (HL == 0 && aop == 1 && aopcde == 3)
2852    {
2853      OUTS (outf, dregs_lo (dst0));
2854      OUTS (outf, "=");
2855      OUTS (outf, dregs_lo (src0));
2856      OUTS (outf, "-");
2857      OUTS (outf, dregs_hi (src1));
2858      OUTS (outf, " ");
2859      amod1 (s, x, outf);
2860    }
2861  else if (HL == 0 && aop == 3 && aopcde == 2)
2862    {
2863      OUTS (outf, dregs_lo (dst0));
2864      OUTS (outf, "=");
2865      OUTS (outf, dregs_hi (src0));
2866      OUTS (outf, "+");
2867      OUTS (outf, dregs_hi (src1));
2868      OUTS (outf, " ");
2869      amod1 (s, x, outf);
2870    }
2871  else if (HL == 1 && aop == 0 && aopcde == 3)
2872    {
2873      OUTS (outf, dregs_hi (dst0));
2874      OUTS (outf, "=");
2875      OUTS (outf, dregs_lo (src0));
2876      OUTS (outf, "-");
2877      OUTS (outf, dregs_lo (src1));
2878      OUTS (outf, " ");
2879      amod1 (s, x, outf);
2880    }
2881  else if (HL == 1 && aop == 1 && aopcde == 3)
2882    {
2883      OUTS (outf, dregs_hi (dst0));
2884      OUTS (outf, "=");
2885      OUTS (outf, dregs_lo (src0));
2886      OUTS (outf, "-");
2887      OUTS (outf, dregs_hi (src1));
2888      OUTS (outf, " ");
2889      amod1 (s, x, outf);
2890    }
2891  else if (HL == 1 && aop == 2 && aopcde == 3)
2892    {
2893      OUTS (outf, dregs_hi (dst0));
2894      OUTS (outf, "=");
2895      OUTS (outf, dregs_hi (src0));
2896      OUTS (outf, "-");
2897      OUTS (outf, dregs_lo (src1));
2898      OUTS (outf, " ");
2899      amod1 (s, x, outf);
2900    }
2901  else if (HL == 1 && aop == 3 && aopcde == 3)
2902    {
2903      OUTS (outf, dregs_hi (dst0));
2904      OUTS (outf, "=");
2905      OUTS (outf, dregs_hi (src0));
2906      OUTS (outf, "-");
2907      OUTS (outf, dregs_hi (src1));
2908      OUTS (outf, " ");
2909      amod1 (s, x, outf);
2910    }
2911  else if (HL == 0 && aop == 2 && aopcde == 2)
2912    {
2913      OUTS (outf, dregs_lo (dst0));
2914      OUTS (outf, "=");
2915      OUTS (outf, dregs_hi (src0));
2916      OUTS (outf, "+");
2917      OUTS (outf, dregs_lo (src1));
2918      OUTS (outf, " ");
2919      amod1 (s, x, outf);
2920    }
2921  else if (HL == 0 && aop == 1 && aopcde == 2)
2922    {
2923      OUTS (outf, dregs_lo (dst0));
2924      OUTS (outf, "=");
2925      OUTS (outf, dregs_lo (src0));
2926      OUTS (outf, "+");
2927      OUTS (outf, dregs_hi (src1));
2928      OUTS (outf, " ");
2929      amod1 (s, x, outf);
2930    }
2931  else if (HL == 0 && aop == 2 && aopcde == 3)
2932    {
2933      OUTS (outf, dregs_lo (dst0));
2934      OUTS (outf, "=");
2935      OUTS (outf, dregs_hi (src0));
2936      OUTS (outf, "-");
2937      OUTS (outf, dregs_lo (src1));
2938      OUTS (outf, " ");
2939      amod1 (s, x, outf);
2940    }
2941  else if (HL == 0 && aop == 3 && aopcde == 3)
2942    {
2943      OUTS (outf, dregs_lo (dst0));
2944      OUTS (outf, "=");
2945      OUTS (outf, dregs_hi (src0));
2946      OUTS (outf, "-");
2947      OUTS (outf, dregs_hi (src1));
2948      OUTS (outf, " ");
2949      amod1 (s, x, outf);
2950    }
2951  else if (HL == 0 && aop == 0 && aopcde == 2)
2952    {
2953      OUTS (outf, dregs_lo (dst0));
2954      OUTS (outf, "=");
2955      OUTS (outf, dregs_lo (src0));
2956      OUTS (outf, "+");
2957      OUTS (outf, dregs_lo (src1));
2958      OUTS (outf, " ");
2959      amod1 (s, x, outf);
2960    }
2961  else if (aop == 0 && aopcde == 9 && s == 1)
2962    {
2963      OUTS (outf, "A0=");
2964      OUTS (outf, dregs (src0));
2965    }
2966  else if (aop == 3 && aopcde == 11 && s == 0)
2967    OUTS (outf, "A0-=A1");
2968
2969  else if (aop == 3 && aopcde == 11 && s == 1)
2970    OUTS (outf, "A0-=A1(W32)");
2971
2972  else if (aop == 3 && aopcde == 22 && HL == 1)
2973    {
2974      OUTS (outf, dregs (dst0));
2975      OUTS (outf, "=BYTEOP2M(");
2976      OUTS (outf, dregs (src0 + 1));
2977      OUTS (outf, ":");
2978      OUTS (outf, imm5 (src0));
2979      OUTS (outf, ",");
2980      OUTS (outf, dregs (src1 + 1));
2981      OUTS (outf, ":");
2982      OUTS (outf, imm5 (src1));
2983      OUTS (outf, ")(TH");
2984      if (s == 1)
2985	OUTS (outf, ", R)");
2986      else
2987	OUTS (outf, ")");
2988    }
2989  else if (aop == 3 && aopcde == 22 && HL == 0)
2990    {
2991      OUTS (outf, dregs (dst0));
2992      OUTS (outf, "=BYTEOP2M(");
2993      OUTS (outf, dregs (src0 + 1));
2994      OUTS (outf, ":");
2995      OUTS (outf, imm5 (src0));
2996      OUTS (outf, ",");
2997      OUTS (outf, dregs (src1 + 1));
2998      OUTS (outf, ":");
2999      OUTS (outf, imm5 (src1));
3000      OUTS (outf, ")(TL");
3001      if (s == 1)
3002	OUTS (outf, ", R)");
3003      else
3004	OUTS (outf, ")");
3005    }
3006  else if (aop == 2 && aopcde == 22 && HL == 1)
3007    {
3008      OUTS (outf, dregs (dst0));
3009      OUTS (outf, "=BYTEOP2M(");
3010      OUTS (outf, dregs (src0 + 1));
3011      OUTS (outf, ":");
3012      OUTS (outf, imm5 (src0));
3013      OUTS (outf, ",");
3014      OUTS (outf, dregs (src1 + 1));
3015      OUTS (outf, ":");
3016      OUTS (outf, imm5 (src1));
3017      OUTS (outf, ")(RNDH");
3018      if (s == 1)
3019	OUTS (outf, ", R)");
3020      else
3021	OUTS (outf, ")");
3022    }
3023  else if (aop == 2 && aopcde == 22 && HL == 0)
3024    {
3025      OUTS (outf, dregs (dst0));
3026      OUTS (outf, "=BYTEOP2M(");
3027      OUTS (outf, dregs (src0 + 1));
3028      OUTS (outf, ":");
3029      OUTS (outf, imm5 (src0));
3030      OUTS (outf, ",");
3031      OUTS (outf, dregs (src1 + 1));
3032      OUTS (outf, ":");
3033      OUTS (outf, imm5 (src1));
3034      OUTS (outf, ")(RNDL");
3035      if (s == 1)
3036	OUTS (outf, ", R)");
3037      else
3038	OUTS (outf, ")");
3039    }
3040  else if (aop == 1 && aopcde == 22 && HL == 1)
3041    {
3042      OUTS (outf, dregs (dst0));
3043      OUTS (outf, "=BYTEOP2P(");
3044      OUTS (outf, dregs (src0 + 1));
3045      OUTS (outf, ":");
3046      OUTS (outf, imm5 (src0));
3047      OUTS (outf, ",");
3048      OUTS (outf, dregs (src1 + 1));
3049      OUTS (outf, ":");
3050      OUTS (outf, imm5 (src1));
3051      OUTS (outf, ")(TH");
3052      if (s == 1)
3053	OUTS (outf, ", R)");
3054      else
3055	OUTS (outf, ")");
3056    }
3057  else if (aop == 1 && aopcde == 22 && HL == 0)
3058    {
3059      OUTS (outf, dregs (dst0));
3060      OUTS (outf, "=BYTEOP2P(");
3061      OUTS (outf, dregs (src0 + 1));
3062      OUTS (outf, ":");
3063      OUTS (outf, imm5 (src0));
3064      OUTS (outf, ",");
3065      OUTS (outf, dregs (src1 + 1));
3066      OUTS (outf, ":");
3067      OUTS (outf, imm5 (src1));
3068      OUTS (outf, ")(TL");
3069      if (s == 1)
3070	OUTS (outf, ", R)");
3071      else
3072	OUTS (outf, ")");
3073    }
3074  else if (aop == 0 && aopcde == 22 && HL == 1)
3075    {
3076      OUTS (outf, dregs (dst0));
3077      OUTS (outf, "=BYTEOP2P(");
3078      OUTS (outf, dregs (src0 + 1));
3079      OUTS (outf, ":");
3080      OUTS (outf, imm5 (src0));
3081      OUTS (outf, ",");
3082      OUTS (outf, dregs (src1 + 1));
3083      OUTS (outf, ":");
3084      OUTS (outf, imm5 (src1));
3085      OUTS (outf, ")(RNDH");
3086      if (s == 1)
3087	OUTS (outf, ", R)");
3088      else
3089	OUTS (outf, ")");
3090    }
3091  else if (aop == 0 && aopcde == 22 && HL == 0)
3092    {
3093      OUTS (outf, dregs (dst0));
3094      OUTS (outf, "=BYTEOP2P(");
3095      OUTS (outf, dregs (src0 + 1));
3096      OUTS (outf, ":");
3097      OUTS (outf, imm5 (src0));
3098      OUTS (outf, ",");
3099      OUTS (outf, dregs (src1 + 1));
3100      OUTS (outf, ":");
3101      OUTS (outf, imm5 (src1));
3102      OUTS (outf, ")(RNDL");
3103      if (s == 1)
3104	OUTS (outf, ", R)");
3105      else
3106	OUTS (outf, ")");
3107    }
3108  else if (aop == 0 && s == 0 && aopcde == 8)
3109    OUTS (outf, "A0=0");
3110
3111  else if (aop == 0 && s == 1 && aopcde == 8)
3112    OUTS (outf, "A0=A0(S)");
3113
3114  else if (aop == 1 && s == 0 && aopcde == 8)
3115    OUTS (outf, "A1=0");
3116
3117  else if (aop == 1 && s == 1 && aopcde == 8)
3118    OUTS (outf, "A1=A1(S)");
3119
3120  else if (aop == 2 && s == 0 && aopcde == 8)
3121    OUTS (outf, "A1=A0=0");
3122
3123  else if (aop == 2 && s == 1 && aopcde == 8)
3124    OUTS (outf, "A1=A1(S),A0=A0(S)");
3125
3126  else if (aop == 3 && s == 0 && aopcde == 8)
3127    OUTS (outf, "A0=A1");
3128
3129  else if (aop == 3 && s == 1 && aopcde == 8)
3130    OUTS (outf, "A1=A0");
3131
3132  else if (aop == 1 && aopcde == 9 && s == 0)
3133    {
3134      OUTS (outf, "A0.x=");
3135      OUTS (outf, dregs_lo (src0));
3136    }
3137  else if (aop == 1 && HL == 0 && aopcde == 11)
3138    {
3139      OUTS (outf, dregs_lo (dst0));
3140      OUTS (outf, "=(A0+=A1)");
3141    }
3142  else if (aop == 3 && HL == 0 && aopcde == 16)
3143    OUTS (outf, "A1= ABS A0,A0= ABS A0");
3144
3145  else if (aop == 0 && aopcde == 23 && HL == 1)
3146    {
3147      OUTS (outf, dregs (dst0));
3148      OUTS (outf, "=BYTEOP3P(");
3149      OUTS (outf, dregs (src0 + 1));
3150      OUTS (outf, ":");
3151      OUTS (outf, imm5 (src0));
3152      OUTS (outf, ",");
3153      OUTS (outf, dregs (src1 + 1));
3154      OUTS (outf, ":");
3155      OUTS (outf, imm5 (src1));
3156      OUTS (outf, ")(HI");
3157      if (s == 1)
3158	OUTS (outf, ", R)");
3159      else
3160	OUTS (outf, ")");
3161    }
3162  else if (aop == 3 && aopcde == 9 && s == 0)
3163    {
3164      OUTS (outf, "A1.x=");
3165      OUTS (outf, dregs_lo (src0));
3166    }
3167  else if (aop == 1 && HL == 1 && aopcde == 16)
3168    OUTS (outf, "A1= ABS A1");
3169
3170  else if (aop == 0 && HL == 1 && aopcde == 16)
3171    OUTS (outf, "A1= ABS A0");
3172
3173  else if (aop == 2 && aopcde == 9 && s == 1)
3174    {
3175      OUTS (outf, "A1=");
3176      OUTS (outf, dregs (src0));
3177    }
3178  else if (HL == 0 && aop == 3 && aopcde == 12)
3179    {
3180      OUTS (outf, dregs_lo (dst0));
3181      OUTS (outf, "=");
3182      OUTS (outf, dregs (src0));
3183      OUTS (outf, "(RND)");
3184    }
3185  else if (aop == 1 && HL == 0 && aopcde == 16)
3186    OUTS (outf, "A0= ABS A1");
3187
3188  else if (aop == 0 && HL == 0 && aopcde == 16)
3189    OUTS (outf, "A0= ABS A0");
3190
3191  else if (aop == 3 && HL == 0 && aopcde == 15)
3192    {
3193      OUTS (outf, dregs (dst0));
3194      OUTS (outf, "=-");
3195      OUTS (outf, dregs (src0));
3196      OUTS (outf, "(V)");
3197    }
3198  else if (aop == 3 && s == 1 && HL == 0 && aopcde == 7)
3199    {
3200      OUTS (outf, dregs (dst0));
3201      OUTS (outf, "=-");
3202      OUTS (outf, dregs (src0));
3203      OUTS (outf, "(S)");
3204    }
3205  else if (aop == 3 && s == 0 && HL == 0 && aopcde == 7)
3206    {
3207      OUTS (outf, dregs (dst0));
3208      OUTS (outf, "=-");
3209      OUTS (outf, dregs (src0));
3210      OUTS (outf, "(NS)");
3211    }
3212  else if (aop == 1 && HL == 1 && aopcde == 11)
3213    {
3214      OUTS (outf, dregs_hi (dst0));
3215      OUTS (outf, "=(A0+=A1)");
3216    }
3217  else if (aop == 2 && aopcde == 11 && s == 0)
3218    OUTS (outf, "A0+=A1");
3219
3220  else if (aop == 2 && aopcde == 11 && s == 1)
3221    OUTS (outf, "A0+=A1(W32)");
3222
3223  else if (aop == 3 && HL == 0 && aopcde == 14)
3224    OUTS (outf, "A1=-A1,A0=-A0");
3225
3226  else if (HL == 1 && aop == 3 && aopcde == 12)
3227    {
3228      OUTS (outf, dregs_hi (dst0));
3229      OUTS (outf, "=");
3230      OUTS (outf, dregs (src0));
3231      OUTS (outf, "(RND)");
3232    }
3233  else if (aop == 0 && aopcde == 23 && HL == 0)
3234    {
3235      OUTS (outf, dregs (dst0));
3236      OUTS (outf, "=BYTEOP3P(");
3237      OUTS (outf, dregs (src0 + 1));
3238      OUTS (outf, ":");
3239      OUTS (outf, imm5 (src0));
3240      OUTS (outf, ",");
3241      OUTS (outf, dregs (src1 + 1));
3242      OUTS (outf, ":");
3243      OUTS (outf, imm5 (src1));
3244      OUTS (outf, ")(LO");
3245      if (s == 1)
3246	OUTS (outf, ", R)");
3247      else
3248	OUTS (outf, ")");
3249    }
3250  else if (aop == 0 && HL == 0 && aopcde == 14)
3251    OUTS (outf, "A0=-A0");
3252
3253  else if (aop == 1 && HL == 0 && aopcde == 14)
3254    OUTS (outf, "A0=-A1");
3255
3256  else if (aop == 0 && HL == 1 && aopcde == 14)
3257    OUTS (outf, "A1=-A0");
3258
3259  else if (aop == 1 && HL == 1 && aopcde == 14)
3260    OUTS (outf, "A1=-A1");
3261
3262  else if (aop == 0 && aopcde == 12)
3263    {
3264      OUTS (outf, dregs_hi (dst0));
3265      OUTS (outf, "=");
3266      OUTS (outf, dregs_lo (dst0));
3267      OUTS (outf, "=SIGN(");
3268      OUTS (outf, dregs_hi (src0));
3269      OUTS (outf, ")*");
3270      OUTS (outf, dregs_hi (src1));
3271      OUTS (outf, "+SIGN(");
3272      OUTS (outf, dregs_lo (src0));
3273      OUTS (outf, ")*");
3274      OUTS (outf, dregs_lo (src1));
3275      OUTS (outf, ")");
3276    }
3277  else if (aop == 2 && aopcde == 0)
3278    {
3279      OUTS (outf, dregs (dst0));
3280      OUTS (outf, "=");
3281      OUTS (outf, dregs (src0));
3282      OUTS (outf, "-|+");
3283      OUTS (outf, dregs (src1));
3284      OUTS (outf, " ");
3285      amod0 (s, x, outf);
3286    }
3287  else if (aop == 1 && aopcde == 12)
3288    {
3289      OUTS (outf, dregs (dst1));
3290      OUTS (outf, "=A1.L+A1.H,");
3291      OUTS (outf, dregs (dst0));
3292      OUTS (outf, "=A0.L+A0.H");
3293    }
3294  else if (aop == 2 && aopcde == 4)
3295    {
3296      OUTS (outf, dregs (dst1));
3297      OUTS (outf, "=");
3298      OUTS (outf, dregs (src0));
3299      OUTS (outf, "+");
3300      OUTS (outf, dregs (src1));
3301      OUTS (outf, ",");
3302      OUTS (outf, dregs (dst0));
3303      OUTS (outf, "=");
3304      OUTS (outf, dregs (src0));
3305      OUTS (outf, "-");
3306      OUTS (outf, dregs (src1));
3307      OUTS (outf, " ");
3308      amod1 (s, x, outf);
3309    }
3310  else if (HL == 0 && aopcde == 1)
3311    {
3312      OUTS (outf, dregs (dst1));
3313      OUTS (outf, "=");
3314      OUTS (outf, dregs (src0));
3315      OUTS (outf, "+|+");
3316      OUTS (outf, dregs (src1));
3317      OUTS (outf, ",");
3318      OUTS (outf, dregs (dst0));
3319      OUTS (outf, "=");
3320      OUTS (outf, dregs (src0));
3321      OUTS (outf, "-|-");
3322      OUTS (outf, dregs (src1));
3323      amod0amod2 (s, x, aop, outf);
3324    }
3325  else if (aop == 0 && aopcde == 11)
3326    {
3327      OUTS (outf, dregs (dst0));
3328      OUTS (outf, "=(A0+=A1)");
3329    }
3330  else if (aop == 0 && aopcde == 10)
3331    {
3332      OUTS (outf, dregs_lo (dst0));
3333      OUTS (outf, "=A0.x");
3334    }
3335  else if (aop == 1 && aopcde == 10)
3336    {
3337      OUTS (outf, dregs_lo (dst0));
3338      OUTS (outf, "=A1.x");
3339    }
3340  else if (aop == 1 && aopcde == 0)
3341    {
3342      OUTS (outf, dregs (dst0));
3343      OUTS (outf, "=");
3344      OUTS (outf, dregs (src0));
3345      OUTS (outf, "+|-");
3346      OUTS (outf, dregs (src1));
3347      OUTS (outf, " ");
3348      amod0 (s, x, outf);
3349    }
3350  else if (aop == 3 && aopcde == 0)
3351    {
3352      OUTS (outf, dregs (dst0));
3353      OUTS (outf, "=");
3354      OUTS (outf, dregs (src0));
3355      OUTS (outf, "-|-");
3356      OUTS (outf, dregs (src1));
3357      OUTS (outf, " ");
3358      amod0 (s, x, outf);
3359    }
3360  else if (aop == 1 && aopcde == 4)
3361    {
3362      OUTS (outf, dregs (dst0));
3363      OUTS (outf, "=");
3364      OUTS (outf, dregs (src0));
3365      OUTS (outf, "-");
3366      OUTS (outf, dregs (src1));
3367      OUTS (outf, " ");
3368      amod1 (s, x, outf);
3369    }
3370  else if (aop == 0 && aopcde == 17)
3371    {
3372      OUTS (outf, dregs (dst1));
3373      OUTS (outf, "=A1+A0,");
3374      OUTS (outf, dregs (dst0));
3375      OUTS (outf, "=A1-A0 ");
3376      amod1 (s, x, outf);
3377    }
3378  else if (aop == 1 && aopcde == 17)
3379    {
3380      OUTS (outf, dregs (dst1));
3381      OUTS (outf, "=A0+A1,");
3382      OUTS (outf, dregs (dst0));
3383      OUTS (outf, "=A0-A1 ");
3384      amod1 (s, x, outf);
3385    }
3386  else if (aop == 0 && aopcde == 18)
3387    {
3388      OUTS (outf, "SAA(");
3389      OUTS (outf, dregs (src0 + 1));
3390      OUTS (outf, ":");
3391      OUTS (outf, imm5 (src0));
3392      OUTS (outf, ",");
3393      OUTS (outf, dregs (src1 + 1));
3394      OUTS (outf, ":");
3395      OUTS (outf, imm5 (src1));
3396      OUTS (outf, ") ");
3397      aligndir (s, outf);
3398    }
3399  else if (aop == 3 && aopcde == 18)
3400    OUTS (outf, "DISALGNEXCPT");
3401
3402  else if (aop == 0 && aopcde == 20)
3403    {
3404      OUTS (outf, dregs (dst0));
3405      OUTS (outf, "=BYTEOP1P(");
3406      OUTS (outf, dregs (src0 + 1));
3407      OUTS (outf, ":");
3408      OUTS (outf, imm5 (src0));
3409      OUTS (outf, ",");
3410      OUTS (outf, dregs (src1 + 1));
3411      OUTS (outf, ":");
3412      OUTS (outf, imm5 (src1));
3413      OUTS (outf, ")");
3414      aligndir (s, outf);
3415    }
3416  else if (aop == 1 && aopcde == 20)
3417    {
3418      OUTS (outf, dregs (dst0));
3419      OUTS (outf, "=BYTEOP1P(");
3420      OUTS (outf, dregs (src0 + 1));
3421      OUTS (outf, ":");
3422      OUTS (outf, imm5 (src0));
3423      OUTS (outf, ",");
3424      OUTS (outf, dregs (src1 + 1));
3425      OUTS (outf, ":");
3426      OUTS (outf, imm5 (src1));
3427      OUTS (outf, ")(T");
3428      if (s == 1)
3429	OUTS (outf, ", R)");
3430      else
3431	OUTS (outf, ")");
3432    }
3433  else if (aop == 0 && aopcde == 21)
3434    {
3435      OUTS (outf, "(");
3436      OUTS (outf, dregs (dst1));
3437      OUTS (outf, ",");
3438      OUTS (outf, dregs (dst0));
3439      OUTS (outf, ")=BYTEOP16P(");
3440      OUTS (outf, dregs (src0 + 1));
3441      OUTS (outf, ":");
3442      OUTS (outf, imm5 (src0));
3443      OUTS (outf, ",");
3444      OUTS (outf, dregs (src1 + 1));
3445      OUTS (outf, ":");
3446      OUTS (outf, imm5 (src1));
3447      OUTS (outf, ") ");
3448      aligndir (s, outf);
3449    }
3450  else if (aop == 1 && aopcde == 21)
3451    {
3452      OUTS (outf, "(");
3453      OUTS (outf, dregs (dst1));
3454      OUTS (outf, ",");
3455      OUTS (outf, dregs (dst0));
3456      OUTS (outf, ")=BYTEOP16M(");
3457      OUTS (outf, dregs (src0 + 1));
3458      OUTS (outf, ":");
3459      OUTS (outf, imm5 (src0));
3460      OUTS (outf, ",");
3461      OUTS (outf, dregs (src1 + 1));
3462      OUTS (outf, ":");
3463      OUTS (outf, imm5 (src1));
3464      OUTS (outf, ") ");
3465      aligndir (s, outf);
3466    }
3467  else if (aop == 2 && aopcde == 7)
3468    {
3469      OUTS (outf, dregs (dst0));
3470      OUTS (outf, "= ABS ");
3471      OUTS (outf, dregs (src0));
3472    }
3473  else if (aop == 1 && aopcde == 7)
3474    {
3475      OUTS (outf, dregs (dst0));
3476      OUTS (outf, "=MIN(");
3477      OUTS (outf, dregs (src0));
3478      OUTS (outf, ",");
3479      OUTS (outf, dregs (src1));
3480      OUTS (outf, ")");
3481    }
3482  else if (aop == 0 && aopcde == 7)
3483    {
3484      OUTS (outf, dregs (dst0));
3485      OUTS (outf, "=MAX(");
3486      OUTS (outf, dregs (src0));
3487      OUTS (outf, ",");
3488      OUTS (outf, dregs (src1));
3489      OUTS (outf, ")");
3490    }
3491  else if (aop == 2 && aopcde == 6)
3492    {
3493      OUTS (outf, dregs (dst0));
3494      OUTS (outf, "= ABS ");
3495      OUTS (outf, dregs (src0));
3496      OUTS (outf, "(V)");
3497    }
3498  else if (aop == 1 && aopcde == 6)
3499    {
3500      OUTS (outf, dregs (dst0));
3501      OUTS (outf, "=MIN(");
3502      OUTS (outf, dregs (src0));
3503      OUTS (outf, ",");
3504      OUTS (outf, dregs (src1));
3505      OUTS (outf, ")(V)");
3506    }
3507  else if (aop == 0 && aopcde == 6)
3508    {
3509      OUTS (outf, dregs (dst0));
3510      OUTS (outf, "=MAX(");
3511      OUTS (outf, dregs (src0));
3512      OUTS (outf, ",");
3513      OUTS (outf, dregs (src1));
3514      OUTS (outf, ")(V)");
3515    }
3516  else if (HL == 1 && aopcde == 1)
3517    {
3518      OUTS (outf, dregs (dst1));
3519      OUTS (outf, "=");
3520      OUTS (outf, dregs (src0));
3521      OUTS (outf, "+|-");
3522      OUTS (outf, dregs (src1));
3523      OUTS (outf, ",");
3524      OUTS (outf, dregs (dst0));
3525      OUTS (outf, "=");
3526      OUTS (outf, dregs (src0));
3527      OUTS (outf, "-|+");
3528      OUTS (outf, dregs (src1));
3529      amod0amod2 (s, x, aop, outf);
3530    }
3531  else if (aop == 0 && aopcde == 4)
3532    {
3533      OUTS (outf, dregs (dst0));
3534      OUTS (outf, "=");
3535      OUTS (outf, dregs (src0));
3536      OUTS (outf, "+");
3537      OUTS (outf, dregs (src1));
3538      OUTS (outf, " ");
3539      amod1 (s, x, outf);
3540    }
3541  else if (aop == 0 && aopcde == 0)
3542    {
3543      OUTS (outf, dregs (dst0));
3544      OUTS (outf, "=");
3545      OUTS (outf, dregs (src0));
3546      OUTS (outf, "+|+");
3547      OUTS (outf, dregs (src1));
3548      OUTS (outf, " ");
3549      amod0 (s, x, outf);
3550    }
3551  else if (aop == 0 && aopcde == 24)
3552    {
3553      OUTS (outf, dregs (dst0));
3554      OUTS (outf, "=BYTEPACK(");
3555      OUTS (outf, dregs (src0));
3556      OUTS (outf, ",");
3557      OUTS (outf, dregs (src1));
3558      OUTS (outf, ")");
3559    }
3560  else if (aop == 1 && aopcde == 24)
3561    {
3562      OUTS (outf, "(");
3563      OUTS (outf, dregs (dst1));
3564      OUTS (outf, ",");
3565      OUTS (outf, dregs (dst0));
3566      OUTS (outf, ") = BYTEUNPACK ");
3567      OUTS (outf, dregs (src0 + 1));
3568      OUTS (outf, ":");
3569      OUTS (outf, imm5 (src0));
3570      OUTS (outf, " ");
3571      aligndir (s, outf);
3572    }
3573  else if (aopcde == 13)
3574    {
3575      OUTS (outf, "(");
3576      OUTS (outf, dregs (dst1));
3577      OUTS (outf, ",");
3578      OUTS (outf, dregs (dst0));
3579      OUTS (outf, ") = SEARCH ");
3580      OUTS (outf, dregs (src0));
3581      OUTS (outf, "(");
3582      searchmod (aop, outf);
3583      OUTS (outf, ")");
3584    }
3585  else
3586    return 0;
3587
3588  return 4;
3589}
3590
3591static int
3592decode_dsp32shift_0 (TIword iw0, TIword iw1, disassemble_info *outf)
3593{
3594  /* dsp32shift
3595     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
3596     | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............|
3597     |.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......|
3598     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
3599  int HLs  = ((iw1 >> DSP32Shift_HLs_bits) & DSP32Shift_HLs_mask);
3600  int sop  = ((iw1 >> DSP32Shift_sop_bits) & DSP32Shift_sop_mask);
3601  int src0 = ((iw1 >> DSP32Shift_src0_bits) & DSP32Shift_src0_mask);
3602  int src1 = ((iw1 >> DSP32Shift_src1_bits) & DSP32Shift_src1_mask);
3603  int dst0 = ((iw1 >> DSP32Shift_dst0_bits) & DSP32Shift_dst0_mask);
3604  int sopcde = ((iw0 >> (DSP32Shift_sopcde_bits - 16)) & DSP32Shift_sopcde_mask);
3605  const char *acc01 = (HLs & 1) == 0 ? "A0" : "A1";
3606
3607  if (HLs == 0 && sop == 0 && sopcde == 0)
3608    {
3609      OUTS (outf, dregs_lo (dst0));
3610      OUTS (outf, "= ASHIFT ");
3611      OUTS (outf, dregs_lo (src1));
3612      OUTS (outf, " BY ");
3613      OUTS (outf, dregs_lo (src0));
3614    }
3615  else if (HLs == 1 && sop == 0 && sopcde == 0)
3616    {
3617      OUTS (outf, dregs_lo (dst0));
3618      OUTS (outf, "= ASHIFT ");
3619      OUTS (outf, dregs_hi (src1));
3620      OUTS (outf, " BY ");
3621      OUTS (outf, dregs_lo (src0));
3622    }
3623  else if (HLs == 2 && sop == 0 && sopcde == 0)
3624    {
3625      OUTS (outf, dregs_hi (dst0));
3626      OUTS (outf, "= ASHIFT ");
3627      OUTS (outf, dregs_lo (src1));
3628      OUTS (outf, " BY ");
3629      OUTS (outf, dregs_lo (src0));
3630    }
3631  else if (HLs == 3 && sop == 0 && sopcde == 0)
3632    {
3633      OUTS (outf, dregs_hi (dst0));
3634      OUTS (outf, "= ASHIFT ");
3635      OUTS (outf, dregs_hi (src1));
3636      OUTS (outf, " BY ");
3637      OUTS (outf, dregs_lo (src0));
3638    }
3639  else if (HLs == 0 && sop == 1 && sopcde == 0)
3640    {
3641      OUTS (outf, dregs_lo (dst0));
3642      OUTS (outf, "= ASHIFT ");
3643      OUTS (outf, dregs_lo (src1));
3644      OUTS (outf, " BY ");
3645      OUTS (outf, dregs_lo (src0));
3646      OUTS (outf, "(S)");
3647    }
3648  else if (HLs == 1 && sop == 1 && sopcde == 0)
3649    {
3650      OUTS (outf, dregs_lo (dst0));
3651      OUTS (outf, "= ASHIFT ");
3652      OUTS (outf, dregs_hi (src1));
3653      OUTS (outf, " BY ");
3654      OUTS (outf, dregs_lo (src0));
3655      OUTS (outf, "(S)");
3656    }
3657  else if (HLs == 2 && sop == 1 && sopcde == 0)
3658    {
3659      OUTS (outf, dregs_hi (dst0));
3660      OUTS (outf, "= ASHIFT ");
3661      OUTS (outf, dregs_lo (src1));
3662      OUTS (outf, " BY ");
3663      OUTS (outf, dregs_lo (src0));
3664      OUTS (outf, "(S)");
3665    }
3666  else if (HLs == 3 && sop == 1 && sopcde == 0)
3667    {
3668      OUTS (outf, dregs_hi (dst0));
3669      OUTS (outf, "= ASHIFT ");
3670      OUTS (outf, dregs_hi (src1));
3671      OUTS (outf, " BY ");
3672      OUTS (outf, dregs_lo (src0));
3673      OUTS (outf, "(S)");
3674    }
3675  else if (sop == 2 && sopcde == 0)
3676    {
3677      OUTS (outf, (HLs & 2) == 0 ? dregs_lo (dst0) : dregs_hi (dst0));
3678      OUTS (outf, "= LSHIFT ");
3679      OUTS (outf, (HLs & 1) == 0 ? dregs_lo (src1) : dregs_hi (src1));
3680      OUTS (outf, " BY ");
3681      OUTS (outf, dregs_lo (src0));
3682    }
3683  else if (sop == 0 && sopcde == 3)
3684    {
3685      OUTS (outf, acc01);
3686      OUTS (outf, "= ASHIFT ");
3687      OUTS (outf, acc01);
3688      OUTS (outf, " BY ");
3689      OUTS (outf, dregs_lo (src0));
3690    }
3691  else if (sop == 1 && sopcde == 3)
3692    {
3693      OUTS (outf, acc01);
3694      OUTS (outf, "= LSHIFT ");
3695      OUTS (outf, acc01);
3696      OUTS (outf, " BY ");
3697      OUTS (outf, dregs_lo (src0));
3698    }
3699  else if (sop == 2 && sopcde == 3)
3700    {
3701      OUTS (outf, acc01);
3702      OUTS (outf, "= ROT ");
3703      OUTS (outf, acc01);
3704      OUTS (outf, " BY ");
3705      OUTS (outf, dregs_lo (src0));
3706    }
3707  else if (sop == 3 && sopcde == 3)
3708    {
3709      OUTS (outf, dregs (dst0));
3710      OUTS (outf, "= ROT ");
3711      OUTS (outf, dregs (src1));
3712      OUTS (outf, " BY ");
3713      OUTS (outf, dregs_lo (src0));
3714    }
3715  else if (sop == 1 && sopcde == 1)
3716    {
3717      OUTS (outf, dregs (dst0));
3718      OUTS (outf, "= ASHIFT ");
3719      OUTS (outf, dregs (src1));
3720      OUTS (outf, " BY ");
3721      OUTS (outf, dregs_lo (src0));
3722      OUTS (outf, "(V,S)");
3723    }
3724  else if (sop == 0 && sopcde == 1)
3725    {
3726      OUTS (outf, dregs (dst0));
3727      OUTS (outf, "= ASHIFT ");
3728      OUTS (outf, dregs (src1));
3729      OUTS (outf, " BY ");
3730      OUTS (outf, dregs_lo (src0));
3731      OUTS (outf, "(V)");
3732    }
3733  else if (sop == 0 && sopcde == 2)
3734    {
3735      OUTS (outf, dregs (dst0));
3736      OUTS (outf, "= ASHIFT ");
3737      OUTS (outf, dregs (src1));
3738      OUTS (outf, " BY ");
3739      OUTS (outf, dregs_lo (src0));
3740    }
3741  else if (sop == 1 && sopcde == 2)
3742    {
3743      OUTS (outf, dregs (dst0));
3744      OUTS (outf, "= ASHIFT ");
3745      OUTS (outf, dregs (src1));
3746      OUTS (outf, " BY ");
3747      OUTS (outf, dregs_lo (src0));
3748      OUTS (outf, "(S)");
3749    }
3750  else if (sop == 2 && sopcde == 2)
3751    {
3752      OUTS (outf, dregs (dst0));
3753      OUTS (outf, "=SHIFT ");
3754      OUTS (outf, dregs (src1));
3755      OUTS (outf, " BY ");
3756      OUTS (outf, dregs_lo (src0));
3757    }
3758  else if (sop == 3 && sopcde == 2)
3759    {
3760      OUTS (outf, dregs (dst0));
3761      OUTS (outf, "= ROT ");
3762      OUTS (outf, dregs (src1));
3763      OUTS (outf, " BY ");
3764      OUTS (outf, dregs_lo (src0));
3765    }
3766  else if (sop == 2 && sopcde == 1)
3767    {
3768      OUTS (outf, dregs (dst0));
3769      OUTS (outf, "=SHIFT ");
3770      OUTS (outf, dregs (src1));
3771      OUTS (outf, " BY ");
3772      OUTS (outf, dregs_lo (src0));
3773      OUTS (outf, "(V)");
3774    }
3775  else if (sop == 0 && sopcde == 4)
3776    {
3777      OUTS (outf, dregs (dst0));
3778      OUTS (outf, "=PACK");
3779      OUTS (outf, "(");
3780      OUTS (outf, dregs_lo (src1));
3781      OUTS (outf, ",");
3782      OUTS (outf, dregs_lo (src0));
3783      OUTS (outf, ")");
3784    }
3785  else if (sop == 1 && sopcde == 4)
3786    {
3787      OUTS (outf, dregs (dst0));
3788      OUTS (outf, "=PACK(");
3789      OUTS (outf, dregs_lo (src1));
3790      OUTS (outf, ",");
3791      OUTS (outf, dregs_hi (src0));
3792      OUTS (outf, ")");
3793    }
3794  else if (sop == 2 && sopcde == 4)
3795    {
3796      OUTS (outf, dregs (dst0));
3797      OUTS (outf, "=PACK(");
3798      OUTS (outf, dregs_hi (src1));
3799      OUTS (outf, ",");
3800      OUTS (outf, dregs_lo (src0));
3801      OUTS (outf, ")");
3802    }
3803  else if (sop == 3 && sopcde == 4)
3804    {
3805      OUTS (outf, dregs (dst0));
3806      OUTS (outf, "=PACK(");
3807      OUTS (outf, dregs_hi (src1));
3808      OUTS (outf, ",");
3809      OUTS (outf, dregs_hi (src0));
3810      OUTS (outf, ")");
3811    }
3812  else if (sop == 0 && sopcde == 5)
3813    {
3814      OUTS (outf, dregs_lo (dst0));
3815      OUTS (outf, "=SIGNBITS ");
3816      OUTS (outf, dregs (src1));
3817    }
3818  else if (sop == 1 && sopcde == 5)
3819    {
3820      OUTS (outf, dregs_lo (dst0));
3821      OUTS (outf, "=SIGNBITS ");
3822      OUTS (outf, dregs_lo (src1));
3823    }
3824  else if (sop == 2 && sopcde == 5)
3825    {
3826      OUTS (outf, dregs_lo (dst0));
3827      OUTS (outf, "=SIGNBITS ");
3828      OUTS (outf, dregs_hi (src1));
3829    }
3830  else if (sop == 0 && sopcde == 6)
3831    {
3832      OUTS (outf, dregs_lo (dst0));
3833      OUTS (outf, "=SIGNBITS A0");
3834    }
3835  else if (sop == 1 && sopcde == 6)
3836    {
3837      OUTS (outf, dregs_lo (dst0));
3838      OUTS (outf, "=SIGNBITS A1");
3839    }
3840  else if (sop == 3 && sopcde == 6)
3841    {
3842      OUTS (outf, dregs_lo (dst0));
3843      OUTS (outf, "=ONES ");
3844      OUTS (outf, dregs (src1));
3845    }
3846  else if (sop == 0 && sopcde == 7)
3847    {
3848      OUTS (outf, dregs_lo (dst0));
3849      OUTS (outf, "=EXPADJ (");
3850      OUTS (outf, dregs (src1));
3851      OUTS (outf, ",");
3852      OUTS (outf, dregs_lo (src0));
3853      OUTS (outf, ")");
3854    }
3855  else if (sop == 1 && sopcde == 7)
3856    {
3857      OUTS (outf, dregs_lo (dst0));
3858      OUTS (outf, "=EXPADJ (");
3859      OUTS (outf, dregs (src1));
3860      OUTS (outf, ",");
3861      OUTS (outf, dregs_lo (src0));
3862      OUTS (outf, ") (V)");
3863    }
3864  else if (sop == 2 && sopcde == 7)
3865    {
3866      OUTS (outf, dregs_lo (dst0));
3867      OUTS (outf, "=EXPADJ (");
3868      OUTS (outf, dregs_lo (src1));
3869      OUTS (outf, ",");
3870      OUTS (outf, dregs_lo (src0));
3871      OUTS (outf, ")");
3872    }
3873  else if (sop == 3 && sopcde == 7)
3874    {
3875      OUTS (outf, dregs_lo (dst0));
3876      OUTS (outf, "=EXPADJ (");
3877      OUTS (outf, dregs_hi (src1));
3878      OUTS (outf, ",");
3879      OUTS (outf, dregs_lo (src0));
3880      OUTS (outf, ")");
3881    }
3882  else if (sop == 0 && sopcde == 8)
3883    {
3884      OUTS (outf, "BITMUX (");
3885      OUTS (outf, dregs (src0));
3886      OUTS (outf, ",");
3887      OUTS (outf, dregs (src1));
3888      OUTS (outf, ",A0 )(ASR)");
3889    }
3890  else if (sop == 1 && sopcde == 8)
3891    {
3892      OUTS (outf, "BITMUX (");
3893      OUTS (outf, dregs (src0));
3894      OUTS (outf, ",");
3895      OUTS (outf, dregs (src1));
3896      OUTS (outf, ",A0 )(ASL)");
3897    }
3898  else if (sop == 0 && sopcde == 9)
3899    {
3900      OUTS (outf, dregs_lo (dst0));
3901      OUTS (outf, "=VIT_MAX (");
3902      OUTS (outf, dregs (src1));
3903      OUTS (outf, ") (ASL)");
3904    }
3905  else if (sop == 1 && sopcde == 9)
3906    {
3907      OUTS (outf, dregs_lo (dst0));
3908      OUTS (outf, "=VIT_MAX (");
3909      OUTS (outf, dregs (src1));
3910      OUTS (outf, ") (ASR)");
3911    }
3912  else if (sop == 2 && sopcde == 9)
3913    {
3914      OUTS (outf, dregs (dst0));
3915      OUTS (outf, "=VIT_MAX(");
3916      OUTS (outf, dregs (src1));
3917      OUTS (outf, ",");
3918      OUTS (outf, dregs (src0));
3919      OUTS (outf, ")(ASL)");
3920    }
3921  else if (sop == 3 && sopcde == 9)
3922    {
3923      OUTS (outf, dregs (dst0));
3924      OUTS (outf, "=VIT_MAX(");
3925      OUTS (outf, dregs (src1));
3926      OUTS (outf, ",");
3927      OUTS (outf, dregs (src0));
3928      OUTS (outf, ")(ASR)");
3929    }
3930  else if (sop == 0 && sopcde == 10)
3931    {
3932      OUTS (outf, dregs (dst0));
3933      OUTS (outf, "=EXTRACT(");
3934      OUTS (outf, dregs (src1));
3935      OUTS (outf, ",");
3936      OUTS (outf, dregs_lo (src0));
3937      OUTS (outf, ") (Z)");
3938    }
3939  else if (sop == 1 && sopcde == 10)
3940    {
3941      OUTS (outf, dregs (dst0));
3942      OUTS (outf, "=EXTRACT(");
3943      OUTS (outf, dregs (src1));
3944      OUTS (outf, ",");
3945      OUTS (outf, dregs_lo (src0));
3946      OUTS (outf, ")(X)");
3947    }
3948  else if (sop == 2 && sopcde == 10)
3949    {
3950      OUTS (outf, dregs (dst0));
3951      OUTS (outf, "=DEPOSIT(");
3952      OUTS (outf, dregs (src1));
3953      OUTS (outf, ",");
3954      OUTS (outf, dregs (src0));
3955      OUTS (outf, ")");
3956    }
3957  else if (sop == 3 && sopcde == 10)
3958    {
3959      OUTS (outf, dregs (dst0));
3960      OUTS (outf, "=DEPOSIT(");
3961      OUTS (outf, dregs (src1));
3962      OUTS (outf, ",");
3963      OUTS (outf, dregs (src0));
3964      OUTS (outf, ")(X)");
3965    }
3966  else if (sop == 0 && sopcde == 11)
3967    {
3968      OUTS (outf, dregs_lo (dst0));
3969      OUTS (outf, "=CC=BXORSHIFT(A0,");
3970      OUTS (outf, dregs (src0));
3971      OUTS (outf, ")");
3972    }
3973  else if (sop == 1 && sopcde == 11)
3974    {
3975      OUTS (outf, dregs_lo (dst0));
3976      OUTS (outf, "=CC=BXOR(A0,");
3977      OUTS (outf, dregs (src0));
3978      OUTS (outf, ")");
3979    }
3980  else if (sop == 0 && sopcde == 12)
3981    OUTS (outf, "A0=BXORSHIFT(A0,A1 ,CC)");
3982
3983  else if (sop == 1 && sopcde == 12)
3984    {
3985      OUTS (outf, dregs_lo (dst0));
3986      OUTS (outf, "=CC=BXOR( A0,A1 ,CC )");
3987    }
3988  else if (sop == 0 && sopcde == 13)
3989    {
3990      OUTS (outf, dregs (dst0));
3991      OUTS (outf, "=ALIGN8(");
3992      OUTS (outf, dregs (src1));
3993      OUTS (outf, ",");
3994      OUTS (outf, dregs (src0));
3995      OUTS (outf, ")");
3996    }
3997  else if (sop == 1 && sopcde == 13)
3998    {
3999      OUTS (outf, dregs (dst0));
4000      OUTS (outf, "=ALIGN16(");
4001      OUTS (outf, dregs (src1));
4002      OUTS (outf, ",");
4003      OUTS (outf, dregs (src0));
4004      OUTS (outf, ")");
4005    }
4006  else if (sop == 2 && sopcde == 13)
4007    {
4008      OUTS (outf, dregs (dst0));
4009      OUTS (outf, "=ALIGN24(");
4010      OUTS (outf, dregs (src1));
4011      OUTS (outf, ",");
4012      OUTS (outf, dregs (src0));
4013      OUTS (outf, ")");
4014    }
4015  else
4016    return 0;
4017
4018  return 4;
4019}
4020
4021static int
4022decode_dsp32shiftimm_0 (TIword iw0, TIword iw1, disassemble_info *outf)
4023{
4024  /* dsp32shiftimm
4025     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4026     | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............|
4027     |.sop...|.HLs...|.dst0......|.immag.................|.src1......|
4028     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
4029  int src1     = ((iw1 >> DSP32ShiftImm_src1_bits) & DSP32ShiftImm_src1_mask);
4030  int sop      = ((iw1 >> DSP32ShiftImm_sop_bits) & DSP32ShiftImm_sop_mask);
4031  int bit8     = ((iw1 >> 8) & 0x1);
4032  int immag    = ((iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
4033  int newimmag = (-(iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
4034  int dst0     = ((iw1 >> DSP32ShiftImm_dst0_bits) & DSP32ShiftImm_dst0_mask);
4035  int sopcde   = ((iw0 >> (DSP32ShiftImm_sopcde_bits - 16)) & DSP32ShiftImm_sopcde_mask);
4036  int HLs      = ((iw1 >> DSP32ShiftImm_HLs_bits) & DSP32ShiftImm_HLs_mask);
4037
4038
4039  if (sop == 0 && sopcde == 0)
4040    {
4041      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4042      OUTS (outf, " = ");
4043      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4044      OUTS (outf, " >>> ");
4045      OUTS (outf, uimm4 (newimmag));
4046    }
4047  else if (sop == 1 && sopcde == 0 && bit8 == 0)
4048    {
4049      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4050      OUTS (outf, " = ");
4051      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4052      OUTS (outf, " << ");
4053      OUTS (outf, uimm4 (immag));
4054      OUTS (outf, " (S)");
4055    }
4056  else if (sop == 1 && sopcde == 0 && bit8 == 1)
4057    {
4058      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4059      OUTS (outf, " = ");
4060      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4061      OUTS (outf, " >>> ");
4062      OUTS (outf, uimm4 (newimmag));
4063      OUTS (outf, " (S)");
4064    }
4065  else if (sop == 2 && sopcde == 0 && bit8 == 0)
4066    {
4067      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4068      OUTS (outf, " = ");
4069      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4070      OUTS (outf, " << ");
4071      OUTS (outf, uimm4 (immag));
4072    }
4073  else if (sop == 2 && sopcde == 0 && bit8 == 1)
4074    {
4075      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4076      OUTS (outf, " = ");
4077      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4078      OUTS (outf, " >> ");
4079      OUTS (outf, uimm4 (newimmag));
4080    }
4081  else if (sop == 2 && sopcde == 3 && HLs == 1)
4082    {
4083      OUTS (outf, "A1= ROT A1 BY ");
4084      OUTS (outf, imm6 (immag));
4085    }
4086  else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 0)
4087    {
4088      OUTS (outf, "A0=A0<<");
4089      OUTS (outf, uimm5 (immag));
4090    }
4091  else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 1)
4092    {
4093      OUTS (outf, "A0=A0>>>");
4094      OUTS (outf, uimm5 (newimmag));
4095    }
4096  else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 0)
4097    {
4098      OUTS (outf, "A1=A1<<");
4099      OUTS (outf, uimm5 (immag));
4100    }
4101  else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 1)
4102    {
4103      OUTS (outf, "A1=A1>>>");
4104      OUTS (outf, uimm5 (newimmag));
4105    }
4106  else if (sop == 1 && sopcde == 3 && HLs == 0)
4107    {
4108      OUTS (outf, "A0=A0>>");
4109      OUTS (outf, uimm5 (newimmag));
4110    }
4111  else if (sop == 1 && sopcde == 3 && HLs == 1)
4112    {
4113      OUTS (outf, "A1=A1>>");
4114      OUTS (outf, uimm5 (newimmag));
4115    }
4116  else if (sop == 2 && sopcde == 3 && HLs == 0)
4117    {
4118      OUTS (outf, "A0= ROT A0 BY ");
4119      OUTS (outf, imm6 (immag));
4120    }
4121  else if (sop == 1 && sopcde == 1 && bit8 == 0)
4122    {
4123      OUTS (outf, dregs (dst0));
4124      OUTS (outf, "=");
4125      OUTS (outf, dregs (src1));
4126      OUTS (outf, "<<");
4127      OUTS (outf, uimm5 (immag));
4128      OUTS (outf, " (V, S)");
4129    }
4130  else if (sop == 1 && sopcde == 1 && bit8 == 1)
4131    {
4132      OUTS (outf, dregs (dst0));
4133      OUTS (outf, "=");
4134      OUTS (outf, dregs (src1));
4135      OUTS (outf, ">>>");
4136      OUTS (outf, imm5 (-immag));
4137      OUTS (outf, " (V)");
4138    }
4139  else if (sop == 2 && sopcde == 1 && bit8 == 1)
4140    {
4141      OUTS (outf, dregs (dst0));
4142      OUTS (outf, "=");
4143      OUTS (outf, dregs (src1));
4144      OUTS (outf, " >> ");
4145      OUTS (outf, uimm5 (newimmag));
4146      OUTS (outf, " (V)");
4147    }
4148  else if (sop == 2 && sopcde == 1 && bit8 == 0)
4149    {
4150      OUTS (outf, dregs (dst0));
4151      OUTS (outf, "=");
4152      OUTS (outf, dregs (src1));
4153      OUTS (outf, "<<");
4154      OUTS (outf, imm5 (immag));
4155      OUTS (outf, " (V)");
4156    }
4157  else if (sop == 0 && sopcde == 1)
4158    {
4159      OUTS (outf, dregs (dst0));
4160      OUTS (outf, "=");
4161      OUTS (outf, dregs (src1));
4162      OUTS (outf, ">>>");
4163      OUTS (outf, uimm5 (newimmag));
4164      OUTS (outf, " (V)");
4165    }
4166  else if (sop == 1 && sopcde == 2)
4167    {
4168      OUTS (outf, dregs (dst0));
4169      OUTS (outf, "=");
4170      OUTS (outf, dregs (src1));
4171      OUTS (outf, "<<");
4172      OUTS (outf, uimm5 (immag));
4173      OUTS (outf, "(S)");
4174    }
4175  else if (sop == 2 && sopcde == 2 && bit8 == 1)
4176    {
4177      OUTS (outf, dregs (dst0));
4178      OUTS (outf, "=");
4179      OUTS (outf, dregs (src1));
4180      OUTS (outf, ">>");
4181      OUTS (outf, uimm5 (newimmag));
4182    }
4183  else if (sop == 2 && sopcde == 2 && bit8 == 0)
4184    {
4185      OUTS (outf, dregs (dst0));
4186      OUTS (outf, "=");
4187      OUTS (outf, dregs (src1));
4188      OUTS (outf, "<<");
4189      OUTS (outf, uimm5 (immag));
4190    }
4191  else if (sop == 3 && sopcde == 2)
4192    {
4193      OUTS (outf, dregs (dst0));
4194      OUTS (outf, "= ROT ");
4195      OUTS (outf, dregs (src1));
4196      OUTS (outf, " BY ");
4197      OUTS (outf, imm6 (immag));
4198    }
4199  else if (sop == 0 && sopcde == 2)
4200    {
4201      OUTS (outf, dregs (dst0));
4202      OUTS (outf, "=");
4203      OUTS (outf, dregs (src1));
4204      OUTS (outf, ">>>");
4205      OUTS (outf, uimm5 (newimmag));
4206    }
4207  else
4208    return 0;
4209
4210  return 4;
4211}
4212
4213static int
4214decode_pseudoDEBUG_0 (TIword iw0, disassemble_info *outf)
4215{
4216  /* pseudoDEBUG
4217     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4218     | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |.fn....|.grp.......|.reg.......|
4219     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
4220  int fn  = ((iw0 >> PseudoDbg_fn_bits) & PseudoDbg_fn_mask);
4221  int grp = ((iw0 >> PseudoDbg_grp_bits) & PseudoDbg_grp_mask);
4222  int reg = ((iw0 >> PseudoDbg_reg_bits) & PseudoDbg_reg_mask);
4223
4224  if (reg == 0 && fn == 3)
4225    OUTS (outf, "DBG A0");
4226
4227  else if (reg == 1 && fn == 3)
4228    OUTS (outf, "DBG A1");
4229
4230  else if (reg == 3 && fn == 3)
4231    OUTS (outf, "ABORT");
4232
4233  else if (reg == 4 && fn == 3)
4234    OUTS (outf, "HLT");
4235
4236  else if (reg == 5 && fn == 3)
4237    OUTS (outf, "DBGHALT");
4238
4239  else if (reg == 6 && fn == 3)
4240    {
4241      OUTS (outf, "DBGCMPLX(");
4242      OUTS (outf, dregs (grp));
4243      OUTS (outf, ")");
4244    }
4245  else if (reg == 7 && fn == 3)
4246    OUTS (outf, "DBG");
4247
4248  else if (grp == 0 && fn == 2)
4249    {
4250      OUTS (outf, "OUTC");
4251      OUTS (outf, dregs (reg));
4252    }
4253  else if (fn == 0)
4254    {
4255      OUTS (outf, "DBG");
4256      OUTS (outf, allregs (reg, grp));
4257    }
4258  else if (fn == 1)
4259    {
4260      OUTS (outf, "PRNT");
4261      OUTS (outf, allregs (reg, grp));
4262    }
4263  else
4264    return 0;
4265
4266  return 2;
4267}
4268
4269static int
4270decode_pseudodbg_assert_0 (TIword iw0, TIword iw1, disassemble_info *outf)
4271{
4272  /* pseudodbg_assert
4273     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4274     | 1 | 1 | 1 | 1 | 0 | - | - | - | - | - |.dbgop.....|.regtest...|
4275     |.expected......................................................|
4276     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
4277  int expected = ((iw1 >> PseudoDbg_Assert_expected_bits) & PseudoDbg_Assert_expected_mask);
4278  int dbgop    = ((iw0 >> (PseudoDbg_Assert_dbgop_bits - 16)) & PseudoDbg_Assert_dbgop_mask);
4279  int regtest  = ((iw0 >> (PseudoDbg_Assert_regtest_bits - 16)) & PseudoDbg_Assert_regtest_mask);
4280
4281  if (dbgop == 0)
4282    {
4283      OUTS (outf, "DBGA(");
4284      OUTS (outf, dregs_lo (regtest));
4285      OUTS (outf, ",");
4286      OUTS (outf, uimm16 (expected));
4287      OUTS (outf, ")");
4288    }
4289  else if (dbgop == 1)
4290    {
4291      OUTS (outf, "DBGA(");
4292      OUTS (outf, dregs_hi (regtest));
4293      OUTS (outf, ",");
4294      OUTS (outf, uimm16 (expected));
4295      OUTS (outf, ")");
4296    }
4297  else if (dbgop == 2)
4298    {
4299      OUTS (outf, "DBGAL(");
4300      OUTS (outf, dregs (regtest));
4301      OUTS (outf, ",");
4302      OUTS (outf, uimm16 (expected));
4303      OUTS (outf, ")");
4304    }
4305  else if (dbgop == 3)
4306    {
4307      OUTS (outf, "DBGAH(");
4308      OUTS (outf, dregs (regtest));
4309      OUTS (outf, ",");
4310      OUTS (outf, uimm16 (expected));
4311      OUTS (outf, ")");
4312    }
4313  else
4314    return 0;
4315  return 4;
4316}
4317
4318int
4319_print_insn_bfin (bfd_vma pc, disassemble_info *outf)
4320{
4321  bfd_byte buf[4];
4322  TIword iw0;
4323  TIword iw1;
4324  int status;
4325  int rv = 0;
4326
4327  status = (*outf->read_memory_func) (pc & ~0x1, buf, 2, outf);
4328  status = (*outf->read_memory_func) ((pc + 2) & ~0x1, buf + 2, 2, outf);
4329
4330  iw0 = bfd_getl16 (buf);
4331  iw1 = bfd_getl16 (buf + 2);
4332
4333  if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
4334    {
4335      OUTS (outf, "mnop");
4336      return 4;
4337    }
4338  else if ((iw0 & 0xff00) == 0x0000)
4339    rv = decode_ProgCtrl_0 (iw0, outf);
4340  else if ((iw0 & 0xffc0) == 0x0240)
4341    rv = decode_CaCTRL_0 (iw0, outf);
4342  else if ((iw0 & 0xff80) == 0x0100)
4343    rv = decode_PushPopReg_0 (iw0, outf);
4344  else if ((iw0 & 0xfe00) == 0x0400)
4345    rv = decode_PushPopMultiple_0 (iw0, outf);
4346  else if ((iw0 & 0xfe00) == 0x0600)
4347    rv = decode_ccMV_0 (iw0, outf);
4348  else if ((iw0 & 0xf800) == 0x0800)
4349    rv = decode_CCflag_0 (iw0, outf);
4350  else if ((iw0 & 0xffe0) == 0x0200)
4351    rv = decode_CC2dreg_0 (iw0, outf);
4352  else if ((iw0 & 0xff00) == 0x0300)
4353    rv = decode_CC2stat_0 (iw0, outf);
4354  else if ((iw0 & 0xf000) == 0x1000)
4355    rv = decode_BRCC_0 (iw0, pc, outf);
4356  else if ((iw0 & 0xf000) == 0x2000)
4357    rv = decode_UJUMP_0 (iw0, pc, outf);
4358  else if ((iw0 & 0xf000) == 0x3000)
4359    rv = decode_REGMV_0 (iw0, outf);
4360  else if ((iw0 & 0xfc00) == 0x4000)
4361    rv = decode_ALU2op_0 (iw0, outf);
4362  else if ((iw0 & 0xfe00) == 0x4400)
4363    rv = decode_PTR2op_0 (iw0, outf);
4364  else if ((iw0 & 0xf800) == 0x4800)
4365    rv = decode_LOGI2op_0 (iw0, outf);
4366  else if ((iw0 & 0xf000) == 0x5000)
4367    rv = decode_COMP3op_0 (iw0, outf);
4368  else if ((iw0 & 0xf800) == 0x6000)
4369    rv = decode_COMPI2opD_0 (iw0, outf);
4370  else if ((iw0 & 0xf800) == 0x6800)
4371    rv = decode_COMPI2opP_0 (iw0, outf);
4372  else if ((iw0 & 0xf000) == 0x8000)
4373    rv = decode_LDSTpmod_0 (iw0, outf);
4374  else if ((iw0 & 0xff60) == 0x9e60)
4375    rv = decode_dagMODim_0 (iw0, outf);
4376  else if ((iw0 & 0xfff0) == 0x9f60)
4377    rv = decode_dagMODik_0 (iw0, outf);
4378  else if ((iw0 & 0xfc00) == 0x9c00)
4379    rv = decode_dspLDST_0 (iw0, outf);
4380  else if ((iw0 & 0xf000) == 0x9000)
4381    rv = decode_LDST_0 (iw0, outf);
4382  else if ((iw0 & 0xfc00) == 0xb800)
4383    rv = decode_LDSTiiFP_0 (iw0, outf);
4384  else if ((iw0 & 0xe000) == 0xA000)
4385    rv = decode_LDSTii_0 (iw0, outf);
4386  else if ((iw0 & 0xff80) == 0xe080 && (iw1 & 0x0C00) == 0x0000)
4387    rv = decode_LoopSetup_0 (iw0, iw1, pc, outf);
4388  else if ((iw0 & 0xff00) == 0xe100 && (iw1 & 0x0000) == 0x0000)
4389    rv = decode_LDIMMhalf_0 (iw0, iw1, outf);
4390  else if ((iw0 & 0xfe00) == 0xe200 && (iw1 & 0x0000) == 0x0000)
4391    rv = decode_CALLa_0 (iw0, iw1, pc, outf);
4392  else if ((iw0 & 0xfc00) == 0xe400 && (iw1 & 0x0000) == 0x0000)
4393    rv = decode_LDSTidxI_0 (iw0, iw1, outf);
4394  else if ((iw0 & 0xfffe) == 0xe800 && (iw1 & 0x0000) == 0x0000)
4395    rv = decode_linkage_0 (iw0, iw1, outf);
4396  else if ((iw0 & 0xf600) == 0xc000 && (iw1 & 0x0000) == 0x0000)
4397    rv = decode_dsp32mac_0 (iw0, iw1, outf);
4398  else if ((iw0 & 0xf600) == 0xc200 && (iw1 & 0x0000) == 0x0000)
4399    rv = decode_dsp32mult_0 (iw0, iw1, outf);
4400  else if ((iw0 & 0xf7c0) == 0xc400 && (iw1 & 0x0000) == 0x0000)
4401    rv = decode_dsp32alu_0 (iw0, iw1, outf);
4402  else if ((iw0 & 0xf780) == 0xc600 && (iw1 & 0x01c0) == 0x0000)
4403    rv = decode_dsp32shift_0 (iw0, iw1, outf);
4404  else if ((iw0 & 0xf780) == 0xc680 && (iw1 & 0x0000) == 0x0000)
4405    rv = decode_dsp32shiftimm_0 (iw0, iw1, outf);
4406  else if ((iw0 & 0xff00) == 0xf800)
4407    rv = decode_pseudoDEBUG_0 (iw0, outf);
4408#if 0
4409  else if ((iw0 & 0xFF00) == 0xF900)
4410    rv = decode_pseudoOChar_0 (iw0, iw1, pc, outf);
4411#endif
4412  else if ((iw0 & 0xFFC0) == 0xf000 && (iw1 & 0x0000) == 0x0000)
4413    rv = decode_pseudodbg_assert_0 (iw0, iw1, outf);
4414
4415  return rv;
4416}
4417
4418
4419int
4420print_insn_bfin (bfd_vma pc, disassemble_info *outf)
4421{
4422  bfd_byte buf[2];
4423  unsigned short iw0;
4424  int status;
4425  int count = 0;
4426
4427  status = (*outf->read_memory_func) (pc & ~0x01, buf, 2, outf);
4428  iw0 = bfd_getl16 (buf);
4429
4430  count += _print_insn_bfin (pc, outf);
4431
4432  /* Proper display of multiple issue instructions.  */
4433
4434  if ((iw0 & 0xc000) == 0xc000 && (iw0 & BIT_MULTI_INS)
4435      && ((iw0 & 0xe800) != 0xe800 /* Not Linkage.  */ ))
4436    {
4437      outf->fprintf_func (outf->stream, " || ");
4438      count += _print_insn_bfin (pc + 4, outf);
4439      outf->fprintf_func (outf->stream, " || ");
4440      count += _print_insn_bfin (pc + 6, outf);
4441    }
4442  if (count == 0)
4443    {
4444      outf->fprintf_func (outf->stream, "ILLEGAL");
4445      return 2;
4446    }
4447  outf->fprintf_func (outf->stream, ";");
4448  return count;
4449}
4450