Coverage Report

Created: 2026-05-11 07:54

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