Coverage Report

Created: 2023-08-28 06:30

/src/binutils-gdb/opcodes/bfin-dis.c
Line
Count
Source (jump to first uncovered line)
1
/* Disassemble ADI Blackfin Instructions.
2
   Copyright (C) 2005-2023 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
0
#define SIGNBIT(bits)       (1ul << ((bits) - 1))
37
0
#define MASKBITS(val, bits) ((val) & ((SIGNBIT (bits) << 1) - 1))
38
0
#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
0
{
123
0
  static char buf[60];
124
125
0
  if (constant_formats[cf].reloc)
126
0
    {
127
0
      bfd_vma ea;
128
129
0
      if (constant_formats[cf].pcrel)
130
0
  x = SIGNEXTEND (x, constant_formats[cf].nbits);
131
0
      ea = x + constant_formats[cf].offset;
132
0
      ea = ea << constant_formats[cf].scale;
133
0
      if (constant_formats[cf].pcrel)
134
0
  ea += pc;
135
136
      /* truncate to 32-bits for proper symbol lookup/matching */
137
0
      ea = (bu32)ea;
138
139
0
      if (outf->symbol_at_address_func (ea, outf) || !constant_formats[cf].exact)
140
0
  {
141
0
    outf->print_address_func (ea, outf);
142
0
    return "";
143
0
  }
144
0
      else
145
0
  {
146
0
    sprintf (buf, "%lx", (unsigned long) x);
147
0
    return buf;
148
0
  }
149
0
    }
150
151
  /* Negative constants have an implied sign bit.  */
152
0
  if (constant_formats[cf].negative)
153
0
    {
154
0
      int nb = constant_formats[cf].nbits + 1;
155
156
0
      x = x | (1ul << constant_formats[cf].nbits);
157
0
      x = SIGNEXTEND (x, nb);
158
0
    }
159
0
  else if (constant_formats[cf].issigned)
160
0
    x = SIGNEXTEND (x, constant_formats[cf].nbits);
161
162
0
  x += constant_formats[cf].offset;
163
0
  x = (unsigned long) x << constant_formats[cf].scale;
164
165
0
  if (constant_formats[cf].decimal)
166
0
    sprintf (buf, "%*li", constant_formats[cf].leading, x);
167
0
  else
168
0
    {
169
0
      if (constant_formats[cf].issigned && x < 0)
170
0
  sprintf (buf, "-0x%lx", (unsigned long)(- x));
171
0
      else
172
0
  sprintf (buf, "0x%lx", (unsigned long) x);
173
0
    }
174
175
0
  return buf;
176
0
}
177
178
static bu32
179
fmtconst_val (const_forms_t cf, unsigned int x, unsigned int pc)
180
0
{
181
0
  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
0
  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
0
  else if (constant_formats[cf].issigned)
203
0
    x = SIGNEXTEND (x, constant_formats[cf].nbits);
204
205
0
  x += constant_formats[cf].offset;
206
0
  x <<= constant_formats[cf].scale;
207
208
0
  return x;
209
0
}
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
0
#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
0
#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
0
#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
0
#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
0
#define IS_DREG(g,r)  ((g) == 0 && (r) < 8)
429
0
#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
0
  (((r) > 7) || ((g) == 4 && ((r) == 4 || (r) == 5)) || (g) == 5)
437
438
0
#define allreg(r,g) (!IS_RESERVEDREG (g, r))
439
0
#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
0
#define imm7_val(x) fmtconst_val (c_imm7, x, 0)
482
0
#define imm16_val(x)  fmtconst_val (c_uimm16, x, 0)
483
0
#define luimm16_val(x)  fmtconst_val (c_luimm16, x, 0)
484
485
/* (arch.pm)arch_disassembler_functions.  */
486
#ifndef OUTS
487
0
#define OUTS(p, txt) (p)->fprintf_func ((p)->stream, "%s", txt)
488
#endif
489
0
#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
0
{
494
0
  if (s0 == 1 && x0 == 0)
495
0
    OUTS (outf, " (S)");
496
0
  else if (s0 == 0 && x0 == 1)
497
0
    OUTS (outf, " (CO)");
498
0
  else if (s0 == 1 && x0 == 1)
499
0
    OUTS (outf, " (SCO)");
500
0
}
501
502
static void
503
amod1 (int s0, int x0, disassemble_info *outf)
504
0
{
505
0
  if (s0 == 0 && x0 == 0)
506
0
    OUTS (outf, " (NS)");
507
0
  else if (s0 == 1 && x0 == 0)
508
0
    OUTS (outf, " (S)");
509
0
}
510
511
static void
512
amod0amod2 (int s0, int x0, int aop0, disassemble_info *outf)
513
0
{
514
0
  if (s0 == 1 && x0 == 0 && aop0 == 0)
515
0
    OUTS (outf, " (S)");
516
0
  else if (s0 == 0 && x0 == 1 && aop0 == 0)
517
0
    OUTS (outf, " (CO)");
518
0
  else if (s0 == 1 && x0 == 1 && aop0 == 0)
519
0
    OUTS (outf, " (SCO)");
520
0
  else if (s0 == 0 && x0 == 0 && aop0 == 2)
521
0
    OUTS (outf, " (ASR)");
522
0
  else if (s0 == 1 && x0 == 0 && aop0 == 2)
523
0
    OUTS (outf, " (S, ASR)");
524
0
  else if (s0 == 0 && x0 == 1 && aop0 == 2)
525
0
    OUTS (outf, " (CO, ASR)");
526
0
  else if (s0 == 1 && x0 == 1 && aop0 == 2)
527
0
    OUTS (outf, " (SCO, ASR)");
528
0
  else if (s0 == 0 && x0 == 0 && aop0 == 3)
529
0
    OUTS (outf, " (ASL)");
530
0
  else if (s0 == 1 && x0 == 0 && aop0 == 3)
531
0
    OUTS (outf, " (S, ASL)");
532
0
  else if (s0 == 0 && x0 == 1 && aop0 == 3)
533
0
    OUTS (outf, " (CO, ASL)");
534
0
  else if (s0 == 1 && x0 == 1 && aop0 == 3)
535
0
    OUTS (outf, " (SCO, ASL)");
536
0
}
537
538
static void
539
searchmod (int r0, disassemble_info *outf)
540
0
{
541
0
  if (r0 == 0)
542
0
    OUTS (outf, "GT");
543
0
  else if (r0 == 1)
544
0
    OUTS (outf, "GE");
545
0
  else if (r0 == 2)
546
0
    OUTS (outf, "LT");
547
0
  else if (r0 == 3)
548
0
    OUTS (outf, "LE");
549
0
}
550
551
static void
552
aligndir (int r0, disassemble_info *outf)
553
0
{
554
0
  if (r0 == 1)
555
0
    OUTS (outf, " (R)");
556
0
}
557
558
static int
559
decode_multfunc (int h0, int h1, int src0, int src1, disassemble_info *outf)
560
0
{
561
0
  const char *s0, *s1;
562
563
0
  if (h0)
564
0
    s0 = dregs_hi (src0);
565
0
  else
566
0
    s0 = dregs_lo (src0);
567
568
0
  if (h1)
569
0
    s1 = dregs_hi (src1);
570
0
  else
571
0
    s1 = dregs_lo (src1);
572
573
0
  OUTS (outf, s0);
574
0
  OUTS (outf, " * ");
575
0
  OUTS (outf, s1);
576
0
  return 0;
577
0
}
578
579
static int
580
decode_macfunc (int which, int op, int h0, int h1, int src0, int src1, disassemble_info *outf)
581
0
{
582
0
  const char *a;
583
0
  const char *sop = "<unknown op>";
584
585
0
  if (which)
586
0
    a = "A1";
587
0
  else
588
0
    a = "A0";
589
590
0
  if (op == 3)
591
0
    {
592
0
      OUTS (outf, a);
593
0
      return 0;
594
0
    }
595
596
0
  switch (op)
597
0
    {
598
0
    case 0: sop = " = ";   break;
599
0
    case 1: sop = " += ";  break;
600
0
    case 2: sop = " -= ";  break;
601
0
    default: break;
602
0
    }
603
604
0
  OUTS (outf, a);
605
0
  OUTS (outf, sop);
606
0
  decode_multfunc (h0, h1, src0, src1, outf);
607
608
0
  return 0;
609
0
}
610
611
static void
612
decode_optmode (int mod, int MM, disassemble_info *outf)
613
0
{
614
0
  if (mod == 0 && MM == 0)
615
0
    return;
616
617
0
  OUTS (outf, " (");
618
619
0
  if (MM && !mod)
620
0
    {
621
0
      OUTS (outf, "M)");
622
0
      return;
623
0
    }
624
625
0
  if (MM)
626
0
    OUTS (outf, "M, ");
627
628
0
  if (mod == M_S2RND)
629
0
    OUTS (outf, "S2RND");
630
0
  else if (mod == M_T)
631
0
    OUTS (outf, "T");
632
0
  else if (mod == M_W32)
633
0
    OUTS (outf, "W32");
634
0
  else if (mod == M_FU)
635
0
    OUTS (outf, "FU");
636
0
  else if (mod == M_TFU)
637
0
    OUTS (outf, "TFU");
638
0
  else if (mod == M_IS)
639
0
    OUTS (outf, "IS");
640
0
  else if (mod == M_ISS2)
641
0
    OUTS (outf, "ISS2");
642
0
  else if (mod == M_IH)
643
0
    OUTS (outf, "IH");
644
0
  else if (mod == M_IU)
645
0
    OUTS (outf, "IU");
646
0
  else
647
0
    abort ();
648
649
0
  OUTS (outf, ")");
650
0
}
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
0
#define DREG(x)         (saved_state.dpregs[x])
664
0
#define PREG(x)         (saved_state.dpregs[(x) + 8])
665
#define SPREG           PREG (6)
666
#define FPREG           PREG (7)
667
0
#define IREG(x)         (saved_state.iregs[x])
668
0
#define MREG(x)         (saved_state.mregs[x])
669
0
#define BREG(x)         (saved_state.bregs[x])
670
0
#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
0
{
681
0
  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
0
  switch (fullreg >> 2)
693
0
    {
694
0
    case 0: case 1: return &DREG (reg);
695
0
    case 2: case 3: return &PREG (reg);
696
0
    case 4: return &IREG (reg & 3);
697
0
    case 5: return &MREG (reg & 3);
698
0
    case 6: return &BREG (reg & 3);
699
0
    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
0
    }
716
0
  abort ();
717
0
}
718
719
static int
720
decode_ProgCtrl_0 (TIword iw0, disassemble_info *outf)
721
0
{
722
0
  struct private *priv = outf->private_data;
723
  /* ProgCtrl
724
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
725
     | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.prgfunc.......|.poprnd........|
726
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
727
0
  int poprnd  = ((iw0 >> ProgCtrl_poprnd_bits) & ProgCtrl_poprnd_mask);
728
0
  int prgfunc = ((iw0 >> ProgCtrl_prgfunc_bits) & ProgCtrl_prgfunc_mask);
729
730
0
  if (prgfunc == 0 && poprnd == 0)
731
0
    OUTS (outf, "NOP");
732
0
  else if (priv->parallel)
733
0
    return 0;
734
0
  else if (prgfunc == 1 && poprnd == 0)
735
0
    OUTS (outf, "RTS");
736
0
  else if (prgfunc == 1 && poprnd == 1)
737
0
    OUTS (outf, "RTI");
738
0
  else if (prgfunc == 1 && poprnd == 2)
739
0
    OUTS (outf, "RTX");
740
0
  else if (prgfunc == 1 && poprnd == 3)
741
0
    OUTS (outf, "RTN");
742
0
  else if (prgfunc == 1 && poprnd == 4)
743
0
    OUTS (outf, "RTE");
744
0
  else if (prgfunc == 2 && poprnd == 0)
745
0
    OUTS (outf, "IDLE");
746
0
  else if (prgfunc == 2 && poprnd == 3)
747
0
    OUTS (outf, "CSYNC");
748
0
  else if (prgfunc == 2 && poprnd == 4)
749
0
    OUTS (outf, "SSYNC");
750
0
  else if (prgfunc == 2 && poprnd == 5)
751
0
    OUTS (outf, "EMUEXCPT");
752
0
  else if (prgfunc == 3 && IS_DREG (0, poprnd))
753
0
    {
754
0
      OUTS (outf, "CLI ");
755
0
      OUTS (outf, dregs (poprnd));
756
0
    }
757
0
  else if (prgfunc == 4 && IS_DREG (0, poprnd))
758
0
    {
759
0
      OUTS (outf, "STI ");
760
0
      OUTS (outf, dregs (poprnd));
761
0
    }
762
0
  else if (prgfunc == 5 && IS_PREG (1, poprnd))
763
0
    {
764
0
      OUTS (outf, "JUMP (");
765
0
      OUTS (outf, pregs (poprnd));
766
0
      OUTS (outf, ")");
767
0
    }
768
0
  else if (prgfunc == 6 && IS_PREG (1, poprnd))
769
0
    {
770
0
      OUTS (outf, "CALL (");
771
0
      OUTS (outf, pregs (poprnd));
772
0
      OUTS (outf, ")");
773
0
    }
774
0
  else if (prgfunc == 7 && IS_PREG (1, poprnd))
775
0
    {
776
0
      OUTS (outf, "CALL (PC + ");
777
0
      OUTS (outf, pregs (poprnd));
778
0
      OUTS (outf, ")");
779
0
    }
780
0
  else if (prgfunc == 8 && IS_PREG (1, poprnd))
781
0
    {
782
0
      OUTS (outf, "JUMP (PC + ");
783
0
      OUTS (outf, pregs (poprnd));
784
0
      OUTS (outf, ")");
785
0
    }
786
0
  else if (prgfunc == 9)
787
0
    {
788
0
      OUTS (outf, "RAISE ");
789
0
      OUTS (outf, uimm4 (poprnd));
790
0
    }
791
0
  else if (prgfunc == 10)
792
0
    {
793
0
      OUTS (outf, "EXCPT ");
794
0
      OUTS (outf, uimm4 (poprnd));
795
0
    }
796
0
  else if (prgfunc == 11 && IS_PREG (1, poprnd) && poprnd <= 5)
797
0
    {
798
0
      OUTS (outf, "TESTSET (");
799
0
      OUTS (outf, pregs (poprnd));
800
0
      OUTS (outf, ")");
801
0
    }
802
0
  else
803
0
    return 0;
804
0
  return 2;
805
0
}
806
807
static int
808
decode_CaCTRL_0 (TIword iw0, disassemble_info *outf)
809
0
{
810
0
  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
0
  int a   = ((iw0 >> CaCTRL_a_bits) & CaCTRL_a_mask);
816
0
  int op  = ((iw0 >> CaCTRL_op_bits) & CaCTRL_op_mask);
817
0
  int reg = ((iw0 >> CaCTRL_reg_bits) & CaCTRL_reg_mask);
818
819
0
  if (priv->parallel)
820
0
    return 0;
821
822
0
  if (a == 0 && op == 0)
823
0
    {
824
0
      OUTS (outf, "PREFETCH[");
825
0
      OUTS (outf, pregs (reg));
826
0
      OUTS (outf, "]");
827
0
    }
828
0
  else if (a == 0 && op == 1)
829
0
    {
830
0
      OUTS (outf, "FLUSHINV[");
831
0
      OUTS (outf, pregs (reg));
832
0
      OUTS (outf, "]");
833
0
    }
834
0
  else if (a == 0 && op == 2)
835
0
    {
836
0
      OUTS (outf, "FLUSH[");
837
0
      OUTS (outf, pregs (reg));
838
0
      OUTS (outf, "]");
839
0
    }
840
0
  else if (a == 0 && op == 3)
841
0
    {
842
0
      OUTS (outf, "IFLUSH[");
843
0
      OUTS (outf, pregs (reg));
844
0
      OUTS (outf, "]");
845
0
    }
846
0
  else if (a == 1 && op == 0)
847
0
    {
848
0
      OUTS (outf, "PREFETCH[");
849
0
      OUTS (outf, pregs (reg));
850
0
      OUTS (outf, "++]");
851
0
    }
852
0
  else if (a == 1 && op == 1)
853
0
    {
854
0
      OUTS (outf, "FLUSHINV[");
855
0
      OUTS (outf, pregs (reg));
856
0
      OUTS (outf, "++]");
857
0
    }
858
0
  else if (a == 1 && op == 2)
859
0
    {
860
0
      OUTS (outf, "FLUSH[");
861
0
      OUTS (outf, pregs (reg));
862
0
      OUTS (outf, "++]");
863
0
    }
864
0
  else if (a == 1 && op == 3)
865
0
    {
866
0
      OUTS (outf, "IFLUSH[");
867
0
      OUTS (outf, pregs (reg));
868
0
      OUTS (outf, "++]");
869
0
    }
870
0
  else
871
0
    return 0;
872
0
  return 2;
873
0
}
874
875
static int
876
decode_PushPopReg_0 (TIword iw0, disassemble_info *outf)
877
0
{
878
0
  struct private *priv = outf->private_data;
879
  /* PushPopReg
880
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
881
     | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.W.|.grp.......|.reg.......|
882
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
883
0
  int W   = ((iw0 >> PushPopReg_W_bits) & PushPopReg_W_mask);
884
0
  int grp = ((iw0 >> PushPopReg_grp_bits) & PushPopReg_grp_mask);
885
0
  int reg = ((iw0 >> PushPopReg_reg_bits) & PushPopReg_reg_mask);
886
887
0
  if (priv->parallel)
888
0
    return 0;
889
890
0
  if (W == 0 && mostreg (reg, grp))
891
0
    {
892
0
      OUTS (outf, allregs (reg, grp));
893
0
      OUTS (outf, " = [SP++]");
894
0
    }
895
0
  else if (W == 1 && allreg (reg, grp) && !(grp == 1 && reg == 6))
896
0
    {
897
0
      OUTS (outf, "[--SP] = ");
898
0
      OUTS (outf, allregs (reg, grp));
899
0
    }
900
0
  else
901
0
    return 0;
902
0
  return 2;
903
0
}
904
905
static int
906
decode_PushPopMultiple_0 (TIword iw0, disassemble_info *outf)
907
0
{
908
0
  struct private *priv = outf->private_data;
909
  /* PushPopMultiple
910
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
911
     | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.d.|.p.|.W.|.dr........|.pr........|
912
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
913
0
  int p  = ((iw0 >> PushPopMultiple_p_bits) & PushPopMultiple_p_mask);
914
0
  int d  = ((iw0 >> PushPopMultiple_d_bits) & PushPopMultiple_d_mask);
915
0
  int W  = ((iw0 >> PushPopMultiple_W_bits) & PushPopMultiple_W_mask);
916
0
  int dr = ((iw0 >> PushPopMultiple_dr_bits) & PushPopMultiple_dr_mask);
917
0
  int pr = ((iw0 >> PushPopMultiple_pr_bits) & PushPopMultiple_pr_mask);
918
919
0
  if (priv->parallel)
920
0
    return 0;
921
922
0
  if (pr > 5)
923
0
    return 0;
924
925
0
  if (W == 1 && d == 1 && p == 1)
926
0
    {
927
0
      OUTS (outf, "[--SP] = (R7:");
928
0
      OUTS (outf, imm5d (dr));
929
0
      OUTS (outf, ", P5:");
930
0
      OUTS (outf, imm5d (pr));
931
0
      OUTS (outf, ")");
932
0
    }
933
0
  else if (W == 1 && d == 1 && p == 0 && pr == 0)
934
0
    {
935
0
      OUTS (outf, "[--SP] = (R7:");
936
0
      OUTS (outf, imm5d (dr));
937
0
      OUTS (outf, ")");
938
0
    }
939
0
  else if (W == 1 && d == 0 && p == 1 && dr == 0)
940
0
    {
941
0
      OUTS (outf, "[--SP] = (P5:");
942
0
      OUTS (outf, imm5d (pr));
943
0
      OUTS (outf, ")");
944
0
    }
945
0
  else if (W == 0 && d == 1 && p == 1)
946
0
    {
947
0
      OUTS (outf, "(R7:");
948
0
      OUTS (outf, imm5d (dr));
949
0
      OUTS (outf, ", P5:");
950
0
      OUTS (outf, imm5d (pr));
951
0
      OUTS (outf, ") = [SP++]");
952
0
    }
953
0
  else if (W == 0 && d == 1 && p == 0 && pr == 0)
954
0
    {
955
0
      OUTS (outf, "(R7:");
956
0
      OUTS (outf, imm5d (dr));
957
0
      OUTS (outf, ") = [SP++]");
958
0
    }
959
0
  else if (W == 0 && d == 0 && p == 1 && dr == 0)
960
0
    {
961
0
      OUTS (outf, "(P5:");
962
0
      OUTS (outf, imm5d (pr));
963
0
      OUTS (outf, ") = [SP++]");
964
0
    }
965
0
  else
966
0
    return 0;
967
0
  return 2;
968
0
}
969
970
static int
971
decode_ccMV_0 (TIword iw0, disassemble_info *outf)
972
0
{
973
0
  struct private *priv = outf->private_data;
974
  /* ccMV
975
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
976
     | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.T.|.d.|.s.|.dst.......|.src.......|
977
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
978
0
  int s  = ((iw0 >> CCmv_s_bits) & CCmv_s_mask);
979
0
  int d  = ((iw0 >> CCmv_d_bits) & CCmv_d_mask);
980
0
  int T  = ((iw0 >> CCmv_T_bits) & CCmv_T_mask);
981
0
  int src = ((iw0 >> CCmv_src_bits) & CCmv_src_mask);
982
0
  int dst = ((iw0 >> CCmv_dst_bits) & CCmv_dst_mask);
983
984
0
  if (priv->parallel)
985
0
    return 0;
986
987
0
  if (T == 1)
988
0
    {
989
0
      OUTS (outf, "IF CC ");
990
0
      OUTS (outf, gregs (dst, d));
991
0
      OUTS (outf, " = ");
992
0
      OUTS (outf, gregs (src, s));
993
0
    }
994
0
  else if (T == 0)
995
0
    {
996
0
      OUTS (outf, "IF !CC ");
997
0
      OUTS (outf, gregs (dst, d));
998
0
      OUTS (outf, " = ");
999
0
      OUTS (outf, gregs (src, s));
1000
0
    }
1001
0
  else
1002
0
    return 0;
1003
0
  return 2;
1004
0
}
1005
1006
static int
1007
decode_CCflag_0 (TIword iw0, disassemble_info *outf)
1008
0
{
1009
0
  struct private *priv = outf->private_data;
1010
  /* CCflag
1011
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1012
     | 0 | 0 | 0 | 0 | 1 |.I.|.opc.......|.G.|.y.........|.x.........|
1013
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1014
0
  int x = ((iw0 >> CCflag_x_bits) & CCflag_x_mask);
1015
0
  int y = ((iw0 >> CCflag_y_bits) & CCflag_y_mask);
1016
0
  int I = ((iw0 >> CCflag_I_bits) & CCflag_I_mask);
1017
0
  int G = ((iw0 >> CCflag_G_bits) & CCflag_G_mask);
1018
0
  int opc = ((iw0 >> CCflag_opc_bits) & CCflag_opc_mask);
1019
1020
0
  if (priv->parallel)
1021
0
    return 0;
1022
1023
0
  if (opc == 0 && I == 0 && G == 0)
1024
0
    {
1025
0
      OUTS (outf, "CC = ");
1026
0
      OUTS (outf, dregs (x));
1027
0
      OUTS (outf, " == ");
1028
0
      OUTS (outf, dregs (y));
1029
0
    }
1030
0
  else if (opc == 1 && I == 0 && G == 0)
1031
0
    {
1032
0
      OUTS (outf, "CC = ");
1033
0
      OUTS (outf, dregs (x));
1034
0
      OUTS (outf, " < ");
1035
0
      OUTS (outf, dregs (y));
1036
0
    }
1037
0
  else if (opc == 2 && I == 0 && G == 0)
1038
0
    {
1039
0
      OUTS (outf, "CC = ");
1040
0
      OUTS (outf, dregs (x));
1041
0
      OUTS (outf, " <= ");
1042
0
      OUTS (outf, dregs (y));
1043
0
    }
1044
0
  else if (opc == 3 && I == 0 && G == 0)
1045
0
    {
1046
0
      OUTS (outf, "CC = ");
1047
0
      OUTS (outf, dregs (x));
1048
0
      OUTS (outf, " < ");
1049
0
      OUTS (outf, dregs (y));
1050
0
      OUTS (outf, " (IU)");
1051
0
    }
1052
0
  else if (opc == 4 && I == 0 && G == 0)
1053
0
    {
1054
0
      OUTS (outf, "CC = ");
1055
0
      OUTS (outf, dregs (x));
1056
0
      OUTS (outf, " <= ");
1057
0
      OUTS (outf, dregs (y));
1058
0
      OUTS (outf, " (IU)");
1059
0
    }
1060
0
  else if (opc == 0 && I == 1 && G == 0)
1061
0
    {
1062
0
      OUTS (outf, "CC = ");
1063
0
      OUTS (outf, dregs (x));
1064
0
      OUTS (outf, " == ");
1065
0
      OUTS (outf, imm3 (y));
1066
0
    }
1067
0
  else if (opc == 1 && I == 1 && G == 0)
1068
0
    {
1069
0
      OUTS (outf, "CC = ");
1070
0
      OUTS (outf, dregs (x));
1071
0
      OUTS (outf, " < ");
1072
0
      OUTS (outf, imm3 (y));
1073
0
    }
1074
0
  else if (opc == 2 && I == 1 && G == 0)
1075
0
    {
1076
0
      OUTS (outf, "CC = ");
1077
0
      OUTS (outf, dregs (x));
1078
0
      OUTS (outf, " <= ");
1079
0
      OUTS (outf, imm3 (y));
1080
0
    }
1081
0
  else if (opc == 3 && I == 1 && G == 0)
1082
0
    {
1083
0
      OUTS (outf, "CC = ");
1084
0
      OUTS (outf, dregs (x));
1085
0
      OUTS (outf, " < ");
1086
0
      OUTS (outf, uimm3 (y));
1087
0
      OUTS (outf, " (IU)");
1088
0
    }
1089
0
  else if (opc == 4 && I == 1 && G == 0)
1090
0
    {
1091
0
      OUTS (outf, "CC = ");
1092
0
      OUTS (outf, dregs (x));
1093
0
      OUTS (outf, " <= ");
1094
0
      OUTS (outf, uimm3 (y));
1095
0
      OUTS (outf, " (IU)");
1096
0
    }
1097
0
  else if (opc == 0 && I == 0 && G == 1)
1098
0
    {
1099
0
      OUTS (outf, "CC = ");
1100
0
      OUTS (outf, pregs (x));
1101
0
      OUTS (outf, " == ");
1102
0
      OUTS (outf, pregs (y));
1103
0
    }
1104
0
  else if (opc == 1 && I == 0 && G == 1)
1105
0
    {
1106
0
      OUTS (outf, "CC = ");
1107
0
      OUTS (outf, pregs (x));
1108
0
      OUTS (outf, " < ");
1109
0
      OUTS (outf, pregs (y));
1110
0
    }
1111
0
  else if (opc == 2 && I == 0 && G == 1)
1112
0
    {
1113
0
      OUTS (outf, "CC = ");
1114
0
      OUTS (outf, pregs (x));
1115
0
      OUTS (outf, " <= ");
1116
0
      OUTS (outf, pregs (y));
1117
0
    }
1118
0
  else if (opc == 3 && I == 0 && G == 1)
1119
0
    {
1120
0
      OUTS (outf, "CC = ");
1121
0
      OUTS (outf, pregs (x));
1122
0
      OUTS (outf, " < ");
1123
0
      OUTS (outf, pregs (y));
1124
0
      OUTS (outf, " (IU)");
1125
0
    }
1126
0
  else if (opc == 4 && I == 0 && G == 1)
1127
0
    {
1128
0
      OUTS (outf, "CC = ");
1129
0
      OUTS (outf, pregs (x));
1130
0
      OUTS (outf, " <= ");
1131
0
      OUTS (outf, pregs (y));
1132
0
      OUTS (outf, " (IU)");
1133
0
    }
1134
0
  else if (opc == 0 && I == 1 && G == 1)
1135
0
    {
1136
0
      OUTS (outf, "CC = ");
1137
0
      OUTS (outf, pregs (x));
1138
0
      OUTS (outf, " == ");
1139
0
      OUTS (outf, imm3 (y));
1140
0
    }
1141
0
  else if (opc == 1 && I == 1 && G == 1)
1142
0
    {
1143
0
      OUTS (outf, "CC = ");
1144
0
      OUTS (outf, pregs (x));
1145
0
      OUTS (outf, " < ");
1146
0
      OUTS (outf, imm3 (y));
1147
0
    }
1148
0
  else if (opc == 2 && I == 1 && G == 1)
1149
0
    {
1150
0
      OUTS (outf, "CC = ");
1151
0
      OUTS (outf, pregs (x));
1152
0
      OUTS (outf, " <= ");
1153
0
      OUTS (outf, imm3 (y));
1154
0
    }
1155
0
  else if (opc == 3 && I == 1 && G == 1)
1156
0
    {
1157
0
      OUTS (outf, "CC = ");
1158
0
      OUTS (outf, pregs (x));
1159
0
      OUTS (outf, " < ");
1160
0
      OUTS (outf, uimm3 (y));
1161
0
      OUTS (outf, " (IU)");
1162
0
    }
1163
0
  else if (opc == 4 && I == 1 && G == 1)
1164
0
    {
1165
0
      OUTS (outf, "CC = ");
1166
0
      OUTS (outf, pregs (x));
1167
0
      OUTS (outf, " <= ");
1168
0
      OUTS (outf, uimm3 (y));
1169
0
      OUTS (outf, " (IU)");
1170
0
    }
1171
0
  else if (opc == 5 && I == 0 && G == 0 && x == 0 && y == 0)
1172
0
    OUTS (outf, "CC = A0 == A1");
1173
1174
0
  else if (opc == 6 && I == 0 && G == 0 && x == 0 && y == 0)
1175
0
    OUTS (outf, "CC = A0 < A1");
1176
1177
0
  else if (opc == 7 && I == 0 && G == 0 && x == 0 && y == 0)
1178
0
    OUTS (outf, "CC = A0 <= A1");
1179
1180
0
  else
1181
0
    return 0;
1182
0
  return 2;
1183
0
}
1184
1185
static int
1186
decode_CC2dreg_0 (TIword iw0, disassemble_info *outf)
1187
0
{
1188
0
  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
0
  int op  = ((iw0 >> CC2dreg_op_bits) & CC2dreg_op_mask);
1194
0
  int reg = ((iw0 >> CC2dreg_reg_bits) & CC2dreg_reg_mask);
1195
1196
0
  if (priv->parallel)
1197
0
    return 0;
1198
1199
0
  if (op == 0)
1200
0
    {
1201
0
      OUTS (outf, dregs (reg));
1202
0
      OUTS (outf, " = CC");
1203
0
    }
1204
0
  else if (op == 1)
1205
0
    {
1206
0
      OUTS (outf, "CC = ");
1207
0
      OUTS (outf, dregs (reg));
1208
0
    }
1209
0
  else if (op == 3 && reg == 0)
1210
0
    OUTS (outf, "CC = !CC");
1211
0
  else
1212
0
    return 0;
1213
1214
0
  return 2;
1215
0
}
1216
1217
static int
1218
decode_CC2stat_0 (TIword iw0, disassemble_info *outf)
1219
0
{
1220
0
  struct private *priv = outf->private_data;
1221
  /* CC2stat
1222
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1223
     | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.D.|.op....|.cbit..............|
1224
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1225
0
  int D    = ((iw0 >> CC2stat_D_bits) & CC2stat_D_mask);
1226
0
  int op   = ((iw0 >> CC2stat_op_bits) & CC2stat_op_mask);
1227
0
  int cbit = ((iw0 >> CC2stat_cbit_bits) & CC2stat_cbit_mask);
1228
1229
0
  const char *bitname = statbits (cbit);
1230
0
  const char * const op_names[] = { "", "|", "&", "^" } ;
1231
1232
0
  if (priv->parallel)
1233
0
    return 0;
1234
1235
0
  if (decode_statbits[cbit] == REG_LASTREG)
1236
0
    {
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
0
      static char bitnames[64];
1240
0
      if (cbit != 5)
1241
0
  sprintf (bitnames, "ASTAT[%i /* unused bit */]", cbit);
1242
0
      else
1243
0
  return 0;
1244
1245
0
      bitname = bitnames;
1246
0
    }
1247
1248
0
  if (D == 0)
1249
0
    OUT (outf, "CC %s= %s", op_names[op], bitname);
1250
0
  else
1251
0
    OUT (outf, "%s %s= CC", bitname, op_names[op]);
1252
1253
0
  return 2;
1254
0
}
1255
1256
static int
1257
decode_BRCC_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
1258
0
{
1259
0
  struct private *priv = outf->private_data;
1260
  /* BRCC
1261
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1262
     | 0 | 0 | 0 | 1 |.T.|.B.|.offset................................|
1263
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1264
0
  int B = ((iw0 >> BRCC_B_bits) & BRCC_B_mask);
1265
0
  int T = ((iw0 >> BRCC_T_bits) & BRCC_T_mask);
1266
0
  int offset = ((iw0 >> BRCC_offset_bits) & BRCC_offset_mask);
1267
1268
0
  if (priv->parallel)
1269
0
    return 0;
1270
1271
0
  if (T == 1 && B == 1)
1272
0
    {
1273
0
      OUTS (outf, "IF CC JUMP 0x");
1274
0
      OUTS (outf, pcrel10 (offset));
1275
0
      OUTS (outf, " (BP)");
1276
0
    }
1277
0
  else if (T == 0 && B == 1)
1278
0
    {
1279
0
      OUTS (outf, "IF !CC JUMP 0x");
1280
0
      OUTS (outf, pcrel10 (offset));
1281
0
      OUTS (outf, " (BP)");
1282
0
    }
1283
0
  else if (T == 1)
1284
0
    {
1285
0
      OUTS (outf, "IF CC JUMP 0x");
1286
0
      OUTS (outf, pcrel10 (offset));
1287
0
    }
1288
0
  else if (T == 0)
1289
0
    {
1290
0
      OUTS (outf, "IF !CC JUMP 0x");
1291
0
      OUTS (outf, pcrel10 (offset));
1292
0
    }
1293
0
  else
1294
0
    return 0;
1295
1296
0
  return 2;
1297
0
}
1298
1299
static int
1300
decode_UJUMP_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
1301
0
{
1302
0
  struct private *priv = outf->private_data;
1303
  /* UJUMP
1304
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1305
     | 0 | 0 | 1 | 0 |.offset........................................|
1306
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1307
0
  int offset = ((iw0 >> UJump_offset_bits) & UJump_offset_mask);
1308
1309
0
  if (priv->parallel)
1310
0
    return 0;
1311
1312
0
  OUTS (outf, "JUMP.S 0x");
1313
0
  OUTS (outf, pcrel12 (offset));
1314
0
  return 2;
1315
0
}
1316
1317
static int
1318
decode_REGMV_0 (TIword iw0, disassemble_info *outf)
1319
0
{
1320
  /* REGMV
1321
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1322
     | 0 | 0 | 1 | 1 |.gd........|.gs........|.dst.......|.src.......|
1323
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1324
0
  int gs  = ((iw0 >> RegMv_gs_bits) & RegMv_gs_mask);
1325
0
  int gd  = ((iw0 >> RegMv_gd_bits) & RegMv_gd_mask);
1326
0
  int src = ((iw0 >> RegMv_src_bits) & RegMv_src_mask);
1327
0
  int dst = ((iw0 >> RegMv_dst_bits) & RegMv_dst_mask);
1328
1329
  /* Reserved slots cannot be a src/dst.  */
1330
0
  if (IS_RESERVEDREG (gs, src) || IS_RESERVEDREG (gd, dst))
1331
0
    goto invalid_move;
1332
1333
  /* Standard register moves  */
1334
0
  if ((gs < 2) ||                               /* Dregs/Pregs as source  */
1335
0
      (gd < 2) ||                               /* Dregs/Pregs as dest    */
1336
0
      (gs == 4 && src < 4) ||                   /* Accumulators as source */
1337
0
      (gd == 4 && dst < 4 && (gs < 4)) ||       /* Accumulators as dest   */
1338
0
      (gs == 7 && src == 7 && !(gd == 4 && dst < 4)) || /* EMUDAT as src  */
1339
0
      (gd == 7 && dst == 7))                    /* EMUDAT as dest         */
1340
0
    goto valid_move;
1341
1342
  /* dareg = dareg (IMBL) */
1343
0
  if (gs < 4 && gd < 4)
1344
0
    goto valid_move;
1345
1346
  /* USP can be src to sysregs, but not dagregs.  */
1347
0
  if ((gs == 7 && src == 0) && (gd >= 4))
1348
0
    goto valid_move;
1349
1350
  /* USP can move between genregs (only check Accumulators).  */
1351
0
  if (((gs == 7 && src == 0) && (gd == 4 && dst < 4)) ||
1352
0
      ((gd == 7 && dst == 0) && (gs == 4 && src < 4)))
1353
0
    goto valid_move;
1354
1355
  /* Still here ?  Invalid reg pair.  */
1356
0
 invalid_move:
1357
0
  return 0;
1358
1359
0
 valid_move:
1360
0
  OUTS (outf, allregs (dst, gd));
1361
0
  OUTS (outf, " = ");
1362
0
  OUTS (outf, allregs (src, gs));
1363
0
  return 2;
1364
0
}
1365
1366
static int
1367
decode_ALU2op_0 (TIword iw0, disassemble_info *outf)
1368
0
{
1369
  /* ALU2op
1370
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1371
     | 0 | 1 | 0 | 0 | 0 | 0 |.opc...........|.src.......|.dst.......|
1372
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1373
0
  int src = ((iw0 >> ALU2op_src_bits) & ALU2op_src_mask);
1374
0
  int opc = ((iw0 >> ALU2op_opc_bits) & ALU2op_opc_mask);
1375
0
  int dst = ((iw0 >> ALU2op_dst_bits) & ALU2op_dst_mask);
1376
1377
0
  if (opc == 0)
1378
0
    {
1379
0
      OUTS (outf, dregs (dst));
1380
0
      OUTS (outf, " >>>= ");
1381
0
      OUTS (outf, dregs (src));
1382
0
    }
1383
0
  else if (opc == 1)
1384
0
    {
1385
0
      OUTS (outf, dregs (dst));
1386
0
      OUTS (outf, " >>= ");
1387
0
      OUTS (outf, dregs (src));
1388
0
    }
1389
0
  else if (opc == 2)
1390
0
    {
1391
0
      OUTS (outf, dregs (dst));
1392
0
      OUTS (outf, " <<= ");
1393
0
      OUTS (outf, dregs (src));
1394
0
    }
1395
0
  else if (opc == 3)
1396
0
    {
1397
0
      OUTS (outf, dregs (dst));
1398
0
      OUTS (outf, " *= ");
1399
0
      OUTS (outf, dregs (src));
1400
0
    }
1401
0
  else if (opc == 4)
1402
0
    {
1403
0
      OUTS (outf, dregs (dst));
1404
0
      OUTS (outf, " = (");
1405
0
      OUTS (outf, dregs (dst));
1406
0
      OUTS (outf, " + ");
1407
0
      OUTS (outf, dregs (src));
1408
0
      OUTS (outf, ") << 0x1");
1409
0
    }
1410
0
  else if (opc == 5)
1411
0
    {
1412
0
      OUTS (outf, dregs (dst));
1413
0
      OUTS (outf, " = (");
1414
0
      OUTS (outf, dregs (dst));
1415
0
      OUTS (outf, " + ");
1416
0
      OUTS (outf, dregs (src));
1417
0
      OUTS (outf, ") << 0x2");
1418
0
    }
1419
0
  else if (opc == 8)
1420
0
    {
1421
0
      OUTS (outf, "DIVQ (");
1422
0
      OUTS (outf, dregs (dst));
1423
0
      OUTS (outf, ", ");
1424
0
      OUTS (outf, dregs (src));
1425
0
      OUTS (outf, ")");
1426
0
    }
1427
0
  else if (opc == 9)
1428
0
    {
1429
0
      OUTS (outf, "DIVS (");
1430
0
      OUTS (outf, dregs (dst));
1431
0
      OUTS (outf, ", ");
1432
0
      OUTS (outf, dregs (src));
1433
0
      OUTS (outf, ")");
1434
0
    }
1435
0
  else if (opc == 10)
1436
0
    {
1437
0
      OUTS (outf, dregs (dst));
1438
0
      OUTS (outf, " = ");
1439
0
      OUTS (outf, dregs_lo (src));
1440
0
      OUTS (outf, " (X)");
1441
0
    }
1442
0
  else if (opc == 11)
1443
0
    {
1444
0
      OUTS (outf, dregs (dst));
1445
0
      OUTS (outf, " = ");
1446
0
      OUTS (outf, dregs_lo (src));
1447
0
      OUTS (outf, " (Z)");
1448
0
    }
1449
0
  else if (opc == 12)
1450
0
    {
1451
0
      OUTS (outf, dregs (dst));
1452
0
      OUTS (outf, " = ");
1453
0
      OUTS (outf, dregs_byte (src));
1454
0
      OUTS (outf, " (X)");
1455
0
    }
1456
0
  else if (opc == 13)
1457
0
    {
1458
0
      OUTS (outf, dregs (dst));
1459
0
      OUTS (outf, " = ");
1460
0
      OUTS (outf, dregs_byte (src));
1461
0
      OUTS (outf, " (Z)");
1462
0
    }
1463
0
  else if (opc == 14)
1464
0
    {
1465
0
      OUTS (outf, dregs (dst));
1466
0
      OUTS (outf, " = -");
1467
0
      OUTS (outf, dregs (src));
1468
0
    }
1469
0
  else if (opc == 15)
1470
0
    {
1471
0
      OUTS (outf, dregs (dst));
1472
0
      OUTS (outf, " =~ ");
1473
0
      OUTS (outf, dregs (src));
1474
0
    }
1475
0
  else
1476
0
    return 0;
1477
1478
0
  return 2;
1479
0
}
1480
1481
static int
1482
decode_PTR2op_0 (TIword iw0, disassemble_info *outf)
1483
0
{
1484
  /* PTR2op
1485
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1486
     | 0 | 1 | 0 | 0 | 0 | 1 | 0 |.opc.......|.src.......|.dst.......|
1487
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1488
0
  int src = ((iw0 >> PTR2op_src_bits) & PTR2op_dst_mask);
1489
0
  int opc = ((iw0 >> PTR2op_opc_bits) & PTR2op_opc_mask);
1490
0
  int dst = ((iw0 >> PTR2op_dst_bits) & PTR2op_dst_mask);
1491
1492
0
  if (opc == 0)
1493
0
    {
1494
0
      OUTS (outf, pregs (dst));
1495
0
      OUTS (outf, " -= ");
1496
0
      OUTS (outf, pregs (src));
1497
0
    }
1498
0
  else if (opc == 1)
1499
0
    {
1500
0
      OUTS (outf, pregs (dst));
1501
0
      OUTS (outf, " = ");
1502
0
      OUTS (outf, pregs (src));
1503
0
      OUTS (outf, " << 0x2");
1504
0
    }
1505
0
  else if (opc == 3)
1506
0
    {
1507
0
      OUTS (outf, pregs (dst));
1508
0
      OUTS (outf, " = ");
1509
0
      OUTS (outf, pregs (src));
1510
0
      OUTS (outf, " >> 0x2");
1511
0
    }
1512
0
  else if (opc == 4)
1513
0
    {
1514
0
      OUTS (outf, pregs (dst));
1515
0
      OUTS (outf, " = ");
1516
0
      OUTS (outf, pregs (src));
1517
0
      OUTS (outf, " >> 0x1");
1518
0
    }
1519
0
  else if (opc == 5)
1520
0
    {
1521
0
      OUTS (outf, pregs (dst));
1522
0
      OUTS (outf, " += ");
1523
0
      OUTS (outf, pregs (src));
1524
0
      OUTS (outf, " (BREV)");
1525
0
    }
1526
0
  else if (opc == 6)
1527
0
    {
1528
0
      OUTS (outf, pregs (dst));
1529
0
      OUTS (outf, " = (");
1530
0
      OUTS (outf, pregs (dst));
1531
0
      OUTS (outf, " + ");
1532
0
      OUTS (outf, pregs (src));
1533
0
      OUTS (outf, ") << 0x1");
1534
0
    }
1535
0
  else if (opc == 7)
1536
0
    {
1537
0
      OUTS (outf, pregs (dst));
1538
0
      OUTS (outf, " = (");
1539
0
      OUTS (outf, pregs (dst));
1540
0
      OUTS (outf, " + ");
1541
0
      OUTS (outf, pregs (src));
1542
0
      OUTS (outf, ") << 0x2");
1543
0
    }
1544
0
  else
1545
0
    return 0;
1546
1547
0
  return 2;
1548
0
}
1549
1550
static int
1551
decode_LOGI2op_0 (TIword iw0, disassemble_info *outf)
1552
0
{
1553
0
  struct private *priv = outf->private_data;
1554
  /* LOGI2op
1555
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1556
     | 0 | 1 | 0 | 0 | 1 |.opc.......|.src...............|.dst.......|
1557
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1558
0
  int src = ((iw0 >> LOGI2op_src_bits) & LOGI2op_src_mask);
1559
0
  int opc = ((iw0 >> LOGI2op_opc_bits) & LOGI2op_opc_mask);
1560
0
  int dst = ((iw0 >> LOGI2op_dst_bits) & LOGI2op_dst_mask);
1561
1562
0
  if (priv->parallel)
1563
0
    return 0;
1564
1565
0
  if (opc == 0)
1566
0
    {
1567
0
      OUTS (outf, "CC = !BITTST (");
1568
0
      OUTS (outf, dregs (dst));
1569
0
      OUTS (outf, ", ");
1570
0
      OUTS (outf, uimm5 (src));
1571
0
      OUTS (outf, ");\t\t/* bit");
1572
0
      OUTS (outf, imm7d (src));
1573
0
      OUTS (outf, " */");
1574
0
      priv->comment = true;
1575
0
    }
1576
0
  else if (opc == 1)
1577
0
    {
1578
0
      OUTS (outf, "CC = BITTST (");
1579
0
      OUTS (outf, dregs (dst));
1580
0
      OUTS (outf, ", ");
1581
0
      OUTS (outf, uimm5 (src));
1582
0
      OUTS (outf, ");\t\t/* bit");
1583
0
      OUTS (outf, imm7d (src));
1584
0
      OUTS (outf, " */");
1585
0
      priv->comment = true;
1586
0
    }
1587
0
  else if (opc == 2)
1588
0
    {
1589
0
      OUTS (outf, "BITSET (");
1590
0
      OUTS (outf, dregs (dst));
1591
0
      OUTS (outf, ", ");
1592
0
      OUTS (outf, uimm5 (src));
1593
0
      OUTS (outf, ");\t\t/* bit");
1594
0
      OUTS (outf, imm7d (src));
1595
0
      OUTS (outf, " */");
1596
0
      priv->comment = true;
1597
0
    }
1598
0
  else if (opc == 3)
1599
0
    {
1600
0
      OUTS (outf, "BITTGL (");
1601
0
      OUTS (outf, dregs (dst));
1602
0
      OUTS (outf, ", ");
1603
0
      OUTS (outf, uimm5 (src));
1604
0
      OUTS (outf, ");\t\t/* bit");
1605
0
      OUTS (outf, imm7d (src));
1606
0
      OUTS (outf, " */");
1607
0
      priv->comment = true;
1608
0
    }
1609
0
  else if (opc == 4)
1610
0
    {
1611
0
      OUTS (outf, "BITCLR (");
1612
0
      OUTS (outf, dregs (dst));
1613
0
      OUTS (outf, ", ");
1614
0
      OUTS (outf, uimm5 (src));
1615
0
      OUTS (outf, ");\t\t/* bit");
1616
0
      OUTS (outf, imm7d (src));
1617
0
      OUTS (outf, " */");
1618
0
      priv->comment = true;
1619
0
    }
1620
0
  else if (opc == 5)
1621
0
    {
1622
0
      OUTS (outf, dregs (dst));
1623
0
      OUTS (outf, " >>>= ");
1624
0
      OUTS (outf, uimm5 (src));
1625
0
    }
1626
0
  else if (opc == 6)
1627
0
    {
1628
0
      OUTS (outf, dregs (dst));
1629
0
      OUTS (outf, " >>= ");
1630
0
      OUTS (outf, uimm5 (src));
1631
0
    }
1632
0
  else if (opc == 7)
1633
0
    {
1634
0
      OUTS (outf, dregs (dst));
1635
0
      OUTS (outf, " <<= ");
1636
0
      OUTS (outf, uimm5 (src));
1637
0
    }
1638
0
  else
1639
0
    return 0;
1640
1641
0
  return 2;
1642
0
}
1643
1644
static int
1645
decode_COMP3op_0 (TIword iw0, disassemble_info *outf)
1646
0
{
1647
  /* COMP3op
1648
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1649
     | 0 | 1 | 0 | 1 |.opc.......|.dst.......|.src1......|.src0......|
1650
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1651
0
  int opc  = ((iw0 >> COMP3op_opc_bits) & COMP3op_opc_mask);
1652
0
  int dst  = ((iw0 >> COMP3op_dst_bits) & COMP3op_dst_mask);
1653
0
  int src0 = ((iw0 >> COMP3op_src0_bits) & COMP3op_src0_mask);
1654
0
  int src1 = ((iw0 >> COMP3op_src1_bits) & COMP3op_src1_mask);
1655
1656
0
  if (opc == 5 && src1 == src0)
1657
0
    {
1658
0
      OUTS (outf, pregs (dst));
1659
0
      OUTS (outf, " = ");
1660
0
      OUTS (outf, pregs (src0));
1661
0
      OUTS (outf, " << 0x1");
1662
0
    }
1663
0
  else if (opc == 1)
1664
0
    {
1665
0
      OUTS (outf, dregs (dst));
1666
0
      OUTS (outf, " = ");
1667
0
      OUTS (outf, dregs (src0));
1668
0
      OUTS (outf, " - ");
1669
0
      OUTS (outf, dregs (src1));
1670
0
    }
1671
0
  else if (opc == 2)
1672
0
    {
1673
0
      OUTS (outf, dregs (dst));
1674
0
      OUTS (outf, " = ");
1675
0
      OUTS (outf, dregs (src0));
1676
0
      OUTS (outf, " & ");
1677
0
      OUTS (outf, dregs (src1));
1678
0
    }
1679
0
  else if (opc == 3)
1680
0
    {
1681
0
      OUTS (outf, dregs (dst));
1682
0
      OUTS (outf, " = ");
1683
0
      OUTS (outf, dregs (src0));
1684
0
      OUTS (outf, " | ");
1685
0
      OUTS (outf, dregs (src1));
1686
0
    }
1687
0
  else if (opc == 4)
1688
0
    {
1689
0
      OUTS (outf, dregs (dst));
1690
0
      OUTS (outf, " = ");
1691
0
      OUTS (outf, dregs (src0));
1692
0
      OUTS (outf, " ^ ");
1693
0
      OUTS (outf, dregs (src1));
1694
0
    }
1695
0
  else if (opc == 5)
1696
0
    {
1697
0
      OUTS (outf, pregs (dst));
1698
0
      OUTS (outf, " = ");
1699
0
      OUTS (outf, pregs (src0));
1700
0
      OUTS (outf, " + ");
1701
0
      OUTS (outf, pregs (src1));
1702
0
    }
1703
0
  else if (opc == 6)
1704
0
    {
1705
0
      OUTS (outf, pregs (dst));
1706
0
      OUTS (outf, " = ");
1707
0
      OUTS (outf, pregs (src0));
1708
0
      OUTS (outf, " + (");
1709
0
      OUTS (outf, pregs (src1));
1710
0
      OUTS (outf, " << 0x1)");
1711
0
    }
1712
0
  else if (opc == 7)
1713
0
    {
1714
0
      OUTS (outf, pregs (dst));
1715
0
      OUTS (outf, " = ");
1716
0
      OUTS (outf, pregs (src0));
1717
0
      OUTS (outf, " + (");
1718
0
      OUTS (outf, pregs (src1));
1719
0
      OUTS (outf, " << 0x2)");
1720
0
    }
1721
0
  else if (opc == 0)
1722
0
    {
1723
0
      OUTS (outf, dregs (dst));
1724
0
      OUTS (outf, " = ");
1725
0
      OUTS (outf, dregs (src0));
1726
0
      OUTS (outf, " + ");
1727
0
      OUTS (outf, dregs (src1));
1728
0
    }
1729
0
  else
1730
0
    return 0;
1731
1732
0
  return 2;
1733
0
}
1734
1735
static int
1736
decode_COMPI2opD_0 (TIword iw0, disassemble_info *outf)
1737
0
{
1738
0
  struct private *priv = outf->private_data;
1739
  /* COMPI2opD
1740
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1741
     | 0 | 1 | 1 | 0 | 0 |.op|..src......................|.dst.......|
1742
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1743
0
  int op  = ((iw0 >> COMPI2opD_op_bits) & COMPI2opD_op_mask);
1744
0
  int dst = ((iw0 >> COMPI2opD_dst_bits) & COMPI2opD_dst_mask);
1745
0
  int src = ((iw0 >> COMPI2opD_src_bits) & COMPI2opD_src_mask);
1746
1747
0
  bu32 *pval = get_allreg (0, dst);
1748
1749
0
  if (priv->parallel)
1750
0
    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
0
  if (op == 0)
1756
0
    {
1757
0
      *pval = imm7_val (src);
1758
0
      if (src & 0x40)
1759
0
  *pval |= 0xFFFFFF80;
1760
0
      else
1761
0
  *pval &= 0x7F;
1762
0
    }
1763
1764
0
  if (op == 0)
1765
0
    {
1766
0
      OUTS (outf, dregs (dst));
1767
0
      OUTS (outf, " = ");
1768
0
      OUTS (outf, imm7 (src));
1769
0
      OUTS (outf, " (X);\t\t/*\t\t");
1770
0
      OUTS (outf, dregs (dst));
1771
0
      OUTS (outf, "=");
1772
0
      OUTS (outf, uimm32 (*pval));
1773
0
      OUTS (outf, "(");
1774
0
      OUTS (outf, imm32 (*pval));
1775
0
      OUTS (outf, ") */");
1776
0
      priv->comment = true;
1777
0
    }
1778
0
  else if (op == 1)
1779
0
    {
1780
0
      OUTS (outf, dregs (dst));
1781
0
      OUTS (outf, " += ");
1782
0
      OUTS (outf, imm7 (src));
1783
0
      OUTS (outf, ";\t\t/* (");
1784
0
      OUTS (outf, imm7d (src));
1785
0
      OUTS (outf, ") */");
1786
0
      priv->comment = true;
1787
0
    }
1788
0
  else
1789
0
    return 0;
1790
1791
0
  return 2;
1792
0
}
1793
1794
static int
1795
decode_COMPI2opP_0 (TIword iw0, disassemble_info *outf)
1796
0
{
1797
0
  struct private *priv = outf->private_data;
1798
  /* COMPI2opP
1799
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1800
     | 0 | 1 | 1 | 0 | 1 |.op|.src.......................|.dst.......|
1801
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1802
0
  int op  = ((iw0 >> COMPI2opP_op_bits) & COMPI2opP_op_mask);
1803
0
  int src = ((iw0 >> COMPI2opP_src_bits) & COMPI2opP_src_mask);
1804
0
  int dst = ((iw0 >> COMPI2opP_dst_bits) & COMPI2opP_dst_mask);
1805
1806
0
  bu32 *pval = get_allreg (1, dst);
1807
1808
0
  if (priv->parallel)
1809
0
    return 0;
1810
1811
0
  if (op == 0)
1812
0
    {
1813
0
      *pval = imm7_val (src);
1814
0
      if (src & 0x40)
1815
0
  *pval |= 0xFFFFFF80;
1816
0
      else
1817
0
  *pval &= 0x7F;
1818
0
    }
1819
1820
0
  if (op == 0)
1821
0
    {
1822
0
      OUTS (outf, pregs (dst));
1823
0
      OUTS (outf, " = ");
1824
0
      OUTS (outf, imm7 (src));
1825
0
      OUTS (outf, " (X);\t\t/*\t\t");
1826
0
      OUTS (outf, pregs (dst));
1827
0
      OUTS (outf, "=");
1828
0
      OUTS (outf, uimm32 (*pval));
1829
0
      OUTS (outf, "(");
1830
0
      OUTS (outf, imm32 (*pval));
1831
0
      OUTS (outf, ") */");
1832
0
      priv->comment = true;
1833
0
    }
1834
0
  else if (op == 1)
1835
0
    {
1836
0
      OUTS (outf, pregs (dst));
1837
0
      OUTS (outf, " += ");
1838
0
      OUTS (outf, imm7 (src));
1839
0
      OUTS (outf, ";\t\t/* (");
1840
0
      OUTS (outf, imm7d (src));
1841
0
      OUTS (outf, ") */");
1842
0
      priv->comment = true;
1843
0
    }
1844
0
  else
1845
0
    return 0;
1846
1847
0
  return 2;
1848
0
}
1849
1850
static int
1851
decode_LDSTpmod_0 (TIword iw0, disassemble_info *outf)
1852
0
{
1853
  /* LDSTpmod
1854
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1855
     | 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......|
1856
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1857
0
  int W   = ((iw0 >> LDSTpmod_W_bits) & LDSTpmod_W_mask);
1858
0
  int aop = ((iw0 >> LDSTpmod_aop_bits) & LDSTpmod_aop_mask);
1859
0
  int idx = ((iw0 >> LDSTpmod_idx_bits) & LDSTpmod_idx_mask);
1860
0
  int ptr = ((iw0 >> LDSTpmod_ptr_bits) & LDSTpmod_ptr_mask);
1861
0
  int reg = ((iw0 >> LDSTpmod_reg_bits) & LDSTpmod_reg_mask);
1862
1863
0
  if (aop == 1 && W == 0 && idx == ptr)
1864
0
    {
1865
0
      OUTS (outf, dregs_lo (reg));
1866
0
      OUTS (outf, " = W[");
1867
0
      OUTS (outf, pregs (ptr));
1868
0
      OUTS (outf, "]");
1869
0
    }
1870
0
  else if (aop == 2 && W == 0 && idx == ptr)
1871
0
    {
1872
0
      OUTS (outf, dregs_hi (reg));
1873
0
      OUTS (outf, " = W[");
1874
0
      OUTS (outf, pregs (ptr));
1875
0
      OUTS (outf, "]");
1876
0
    }
1877
0
  else if (aop == 1 && W == 1 && idx == ptr)
1878
0
    {
1879
0
      OUTS (outf, "W[");
1880
0
      OUTS (outf, pregs (ptr));
1881
0
      OUTS (outf, "] = ");
1882
0
      OUTS (outf, dregs_lo (reg));
1883
0
    }
1884
0
  else if (aop == 2 && W == 1 && idx == ptr)
1885
0
    {
1886
0
      OUTS (outf, "W[");
1887
0
      OUTS (outf, pregs (ptr));
1888
0
      OUTS (outf, "] = ");
1889
0
      OUTS (outf, dregs_hi (reg));
1890
0
    }
1891
0
  else if (aop == 0 && W == 0)
1892
0
    {
1893
0
      OUTS (outf, dregs (reg));
1894
0
      OUTS (outf, " = [");
1895
0
      OUTS (outf, pregs (ptr));
1896
0
      OUTS (outf, " ++ ");
1897
0
      OUTS (outf, pregs (idx));
1898
0
      OUTS (outf, "]");
1899
0
    }
1900
0
  else if (aop == 1 && W == 0)
1901
0
    {
1902
0
      OUTS (outf, dregs_lo (reg));
1903
0
      OUTS (outf, " = W[");
1904
0
      OUTS (outf, pregs (ptr));
1905
0
      OUTS (outf, " ++ ");
1906
0
      OUTS (outf, pregs (idx));
1907
0
      OUTS (outf, "]");
1908
0
    }
1909
0
  else if (aop == 2 && W == 0)
1910
0
    {
1911
0
      OUTS (outf, dregs_hi (reg));
1912
0
      OUTS (outf, " = W[");
1913
0
      OUTS (outf, pregs (ptr));
1914
0
      OUTS (outf, " ++ ");
1915
0
      OUTS (outf, pregs (idx));
1916
0
      OUTS (outf, "]");
1917
0
    }
1918
0
  else if (aop == 3 && W == 0)
1919
0
    {
1920
0
      OUTS (outf, dregs (reg));
1921
0
      OUTS (outf, " = W[");
1922
0
      OUTS (outf, pregs (ptr));
1923
0
      OUTS (outf, " ++ ");
1924
0
      OUTS (outf, pregs (idx));
1925
0
      OUTS (outf, "] (Z)");
1926
0
    }
1927
0
  else if (aop == 3 && W == 1)
1928
0
    {
1929
0
      OUTS (outf, dregs (reg));
1930
0
      OUTS (outf, " = W[");
1931
0
      OUTS (outf, pregs (ptr));
1932
0
      OUTS (outf, " ++ ");
1933
0
      OUTS (outf, pregs (idx));
1934
0
      OUTS (outf, "] (X)");
1935
0
    }
1936
0
  else if (aop == 0 && W == 1)
1937
0
    {
1938
0
      OUTS (outf, "[");
1939
0
      OUTS (outf, pregs (ptr));
1940
0
      OUTS (outf, " ++ ");
1941
0
      OUTS (outf, pregs (idx));
1942
0
      OUTS (outf, "] = ");
1943
0
      OUTS (outf, dregs (reg));
1944
0
    }
1945
0
  else if (aop == 1 && W == 1)
1946
0
    {
1947
0
      OUTS (outf, "W[");
1948
0
      OUTS (outf, pregs (ptr));
1949
0
      OUTS (outf, " ++ ");
1950
0
      OUTS (outf, pregs (idx));
1951
0
      OUTS (outf, "] = ");
1952
0
      OUTS (outf, dregs_lo (reg));
1953
0
    }
1954
0
  else if (aop == 2 && W == 1)
1955
0
    {
1956
0
      OUTS (outf, "W[");
1957
0
      OUTS (outf, pregs (ptr));
1958
0
      OUTS (outf, " ++ ");
1959
0
      OUTS (outf, pregs (idx));
1960
0
      OUTS (outf, "] = ");
1961
0
      OUTS (outf, dregs_hi (reg));
1962
0
    }
1963
0
  else
1964
0
    return 0;
1965
1966
0
  return 2;
1967
0
}
1968
1969
static int
1970
decode_dagMODim_0 (TIword iw0, disassemble_info *outf)
1971
0
{
1972
  /* dagMODim
1973
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1974
     | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....|
1975
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
1976
0
  int i  = ((iw0 >> DagMODim_i_bits) & DagMODim_i_mask);
1977
0
  int m  = ((iw0 >> DagMODim_m_bits) & DagMODim_m_mask);
1978
0
  int br = ((iw0 >> DagMODim_br_bits) & DagMODim_br_mask);
1979
0
  int op = ((iw0 >> DagMODim_op_bits) & DagMODim_op_mask);
1980
1981
0
  if (op == 0 && br == 1)
1982
0
    {
1983
0
      OUTS (outf, iregs (i));
1984
0
      OUTS (outf, " += ");
1985
0
      OUTS (outf, mregs (m));
1986
0
      OUTS (outf, " (BREV)");
1987
0
    }
1988
0
  else if (op == 0)
1989
0
    {
1990
0
      OUTS (outf, iregs (i));
1991
0
      OUTS (outf, " += ");
1992
0
      OUTS (outf, mregs (m));
1993
0
    }
1994
0
  else if (op == 1 && br == 0)
1995
0
    {
1996
0
      OUTS (outf, iregs (i));
1997
0
      OUTS (outf, " -= ");
1998
0
      OUTS (outf, mregs (m));
1999
0
    }
2000
0
  else
2001
0
    return 0;
2002
2003
0
  return 2;
2004
0
}
2005
2006
static int
2007
decode_dagMODik_0 (TIword iw0, disassemble_info *outf)
2008
0
{
2009
0
  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
0
  int i  = ((iw0 >> DagMODik_i_bits) & DagMODik_i_mask);
2015
0
  int op = ((iw0 >> DagMODik_op_bits) & DagMODik_op_mask);
2016
2017
0
  if (op == 0)
2018
0
    {
2019
0
      OUTS (outf, iregs (i));
2020
0
      OUTS (outf, " += 0x2");
2021
0
    }
2022
0
  else if (op == 1)
2023
0
    {
2024
0
      OUTS (outf, iregs (i));
2025
0
      OUTS (outf, " -= 0x2");
2026
0
    }
2027
0
  else if (op == 2)
2028
0
    {
2029
0
      OUTS (outf, iregs (i));
2030
0
      OUTS (outf, " += 0x4");
2031
0
    }
2032
0
  else if (op == 3)
2033
0
    {
2034
0
      OUTS (outf, iregs (i));
2035
0
      OUTS (outf, " -= 0x4");
2036
0
    }
2037
0
  else
2038
0
    return 0;
2039
2040
0
  if (!priv->parallel)
2041
0
    {
2042
0
      OUTS (outf, ";\t\t/* (  ");
2043
0
      if (op == 0 || op == 1)
2044
0
  OUTS (outf, "2");
2045
0
      else if (op == 2 || op == 3)
2046
0
  OUTS (outf, "4");
2047
0
      OUTS (outf, ") */");
2048
0
      priv->comment = true;
2049
0
    }
2050
2051
0
  return 2;
2052
0
}
2053
2054
static int
2055
decode_dspLDST_0 (TIword iw0, disassemble_info *outf)
2056
0
{
2057
  /* dspLDST
2058
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2059
     | 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......|
2060
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2061
0
  int i   = ((iw0 >> DspLDST_i_bits) & DspLDST_i_mask);
2062
0
  int m   = ((iw0 >> DspLDST_m_bits) & DspLDST_m_mask);
2063
0
  int W   = ((iw0 >> DspLDST_W_bits) & DspLDST_W_mask);
2064
0
  int aop = ((iw0 >> DspLDST_aop_bits) & DspLDST_aop_mask);
2065
0
  int reg = ((iw0 >> DspLDST_reg_bits) & DspLDST_reg_mask);
2066
2067
0
  if (aop == 0 && W == 0 && m == 0)
2068
0
    {
2069
0
      OUTS (outf, dregs (reg));
2070
0
      OUTS (outf, " = [");
2071
0
      OUTS (outf, iregs (i));
2072
0
      OUTS (outf, "++]");
2073
0
    }
2074
0
  else if (aop == 0 && W == 0 && m == 1)
2075
0
    {
2076
0
      OUTS (outf, dregs_lo (reg));
2077
0
      OUTS (outf, " = W[");
2078
0
      OUTS (outf, iregs (i));
2079
0
      OUTS (outf, "++]");
2080
0
    }
2081
0
  else if (aop == 0 && W == 0 && m == 2)
2082
0
    {
2083
0
      OUTS (outf, dregs_hi (reg));
2084
0
      OUTS (outf, " = W[");
2085
0
      OUTS (outf, iregs (i));
2086
0
      OUTS (outf, "++]");
2087
0
    }
2088
0
  else if (aop == 1 && W == 0 && m == 0)
2089
0
    {
2090
0
      OUTS (outf, dregs (reg));
2091
0
      OUTS (outf, " = [");
2092
0
      OUTS (outf, iregs (i));
2093
0
      OUTS (outf, "--]");
2094
0
    }
2095
0
  else if (aop == 1 && W == 0 && m == 1)
2096
0
    {
2097
0
      OUTS (outf, dregs_lo (reg));
2098
0
      OUTS (outf, " = W[");
2099
0
      OUTS (outf, iregs (i));
2100
0
      OUTS (outf, "--]");
2101
0
    }
2102
0
  else if (aop == 1 && W == 0 && m == 2)
2103
0
    {
2104
0
      OUTS (outf, dregs_hi (reg));
2105
0
      OUTS (outf, " = W[");
2106
0
      OUTS (outf, iregs (i));
2107
0
      OUTS (outf, "--]");
2108
0
    }
2109
0
  else if (aop == 2 && W == 0 && m == 0)
2110
0
    {
2111
0
      OUTS (outf, dregs (reg));
2112
0
      OUTS (outf, " = [");
2113
0
      OUTS (outf, iregs (i));
2114
0
      OUTS (outf, "]");
2115
0
    }
2116
0
  else if (aop == 2 && W == 0 && m == 1)
2117
0
    {
2118
0
      OUTS (outf, dregs_lo (reg));
2119
0
      OUTS (outf, " = W[");
2120
0
      OUTS (outf, iregs (i));
2121
0
      OUTS (outf, "]");
2122
0
    }
2123
0
  else if (aop == 2 && W == 0 && m == 2)
2124
0
    {
2125
0
      OUTS (outf, dregs_hi (reg));
2126
0
      OUTS (outf, " = W[");
2127
0
      OUTS (outf, iregs (i));
2128
0
      OUTS (outf, "]");
2129
0
    }
2130
0
  else if (aop == 0 && W == 1 && m == 0)
2131
0
    {
2132
0
      OUTS (outf, "[");
2133
0
      OUTS (outf, iregs (i));
2134
0
      OUTS (outf, "++] = ");
2135
0
      OUTS (outf, dregs (reg));
2136
0
    }
2137
0
  else if (aop == 0 && W == 1 && m == 1)
2138
0
    {
2139
0
      OUTS (outf, "W[");
2140
0
      OUTS (outf, iregs (i));
2141
0
      OUTS (outf, "++] = ");
2142
0
      OUTS (outf, dregs_lo (reg));
2143
0
    }
2144
0
  else if (aop == 0 && W == 1 && m == 2)
2145
0
    {
2146
0
      OUTS (outf, "W[");
2147
0
      OUTS (outf, iregs (i));
2148
0
      OUTS (outf, "++] = ");
2149
0
      OUTS (outf, dregs_hi (reg));
2150
0
    }
2151
0
  else if (aop == 1 && W == 1 && m == 0)
2152
0
    {
2153
0
      OUTS (outf, "[");
2154
0
      OUTS (outf, iregs (i));
2155
0
      OUTS (outf, "--] = ");
2156
0
      OUTS (outf, dregs (reg));
2157
0
    }
2158
0
  else if (aop == 1 && W == 1 && m == 1)
2159
0
    {
2160
0
      OUTS (outf, "W[");
2161
0
      OUTS (outf, iregs (i));
2162
0
      OUTS (outf, "--] = ");
2163
0
      OUTS (outf, dregs_lo (reg));
2164
0
    }
2165
0
  else if (aop == 1 && W == 1 && m == 2)
2166
0
    {
2167
0
      OUTS (outf, "W[");
2168
0
      OUTS (outf, iregs (i));
2169
0
      OUTS (outf, "--] = ");
2170
0
      OUTS (outf, dregs_hi (reg));
2171
0
    }
2172
0
  else if (aop == 2 && W == 1 && m == 0)
2173
0
    {
2174
0
      OUTS (outf, "[");
2175
0
      OUTS (outf, iregs (i));
2176
0
      OUTS (outf, "] = ");
2177
0
      OUTS (outf, dregs (reg));
2178
0
    }
2179
0
  else if (aop == 2 && W == 1 && m == 1)
2180
0
    {
2181
0
      OUTS (outf, "W[");
2182
0
      OUTS (outf, iregs (i));
2183
0
      OUTS (outf, "] = ");
2184
0
      OUTS (outf, dregs_lo (reg));
2185
0
    }
2186
0
  else if (aop == 2 && W == 1 && m == 2)
2187
0
    {
2188
0
      OUTS (outf, "W[");
2189
0
      OUTS (outf, iregs (i));
2190
0
      OUTS (outf, "] = ");
2191
0
      OUTS (outf, dregs_hi (reg));
2192
0
    }
2193
0
  else if (aop == 3 && W == 0)
2194
0
    {
2195
0
      OUTS (outf, dregs (reg));
2196
0
      OUTS (outf, " = [");
2197
0
      OUTS (outf, iregs (i));
2198
0
      OUTS (outf, " ++ ");
2199
0
      OUTS (outf, mregs (m));
2200
0
      OUTS (outf, "]");
2201
0
    }
2202
0
  else if (aop == 3 && W == 1)
2203
0
    {
2204
0
      OUTS (outf, "[");
2205
0
      OUTS (outf, iregs (i));
2206
0
      OUTS (outf, " ++ ");
2207
0
      OUTS (outf, mregs (m));
2208
0
      OUTS (outf, "] = ");
2209
0
      OUTS (outf, dregs (reg));
2210
0
    }
2211
0
  else
2212
0
    return 0;
2213
2214
0
  return 2;
2215
0
}
2216
2217
static int
2218
decode_LDST_0 (TIword iw0, disassemble_info *outf)
2219
0
{
2220
  /* LDST
2221
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2222
     | 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......|
2223
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2224
0
  int Z   = ((iw0 >> LDST_Z_bits) & LDST_Z_mask);
2225
0
  int W   = ((iw0 >> LDST_W_bits) & LDST_W_mask);
2226
0
  int sz  = ((iw0 >> LDST_sz_bits) & LDST_sz_mask);
2227
0
  int aop = ((iw0 >> LDST_aop_bits) & LDST_aop_mask);
2228
0
  int reg = ((iw0 >> LDST_reg_bits) & LDST_reg_mask);
2229
0
  int ptr = ((iw0 >> LDST_ptr_bits) & LDST_ptr_mask);
2230
2231
0
  if (aop == 0 && sz == 0 && Z == 0 && W == 0)
2232
0
    {
2233
0
      OUTS (outf, dregs (reg));
2234
0
      OUTS (outf, " = [");
2235
0
      OUTS (outf, pregs (ptr));
2236
0
      OUTS (outf, "++]");
2237
0
    }
2238
0
  else if (aop == 0 && sz == 0 && Z == 1 && W == 0 && reg != ptr)
2239
0
    {
2240
0
      OUTS (outf, pregs (reg));
2241
0
      OUTS (outf, " = [");
2242
0
      OUTS (outf, pregs (ptr));
2243
0
      OUTS (outf, "++]");
2244
0
    }
2245
0
  else if (aop == 0 && sz == 1 && Z == 0 && W == 0)
2246
0
    {
2247
0
      OUTS (outf, dregs (reg));
2248
0
      OUTS (outf, " = W[");
2249
0
      OUTS (outf, pregs (ptr));
2250
0
      OUTS (outf, "++] (Z)");
2251
0
    }
2252
0
  else if (aop == 0 && sz == 1 && Z == 1 && W == 0)
2253
0
    {
2254
0
      OUTS (outf, dregs (reg));
2255
0
      OUTS (outf, " = W[");
2256
0
      OUTS (outf, pregs (ptr));
2257
0
      OUTS (outf, "++] (X)");
2258
0
    }
2259
0
  else if (aop == 0 && sz == 2 && Z == 0 && W == 0)
2260
0
    {
2261
0
      OUTS (outf, dregs (reg));
2262
0
      OUTS (outf, " = B[");
2263
0
      OUTS (outf, pregs (ptr));
2264
0
      OUTS (outf, "++] (Z)");
2265
0
    }
2266
0
  else if (aop == 0 && sz == 2 && Z == 1 && W == 0)
2267
0
    {
2268
0
      OUTS (outf, dregs (reg));
2269
0
      OUTS (outf, " = B[");
2270
0
      OUTS (outf, pregs (ptr));
2271
0
      OUTS (outf, "++] (X)");
2272
0
    }
2273
0
  else if (aop == 1 && sz == 0 && Z == 0 && W == 0)
2274
0
    {
2275
0
      OUTS (outf, dregs (reg));
2276
0
      OUTS (outf, " = [");
2277
0
      OUTS (outf, pregs (ptr));
2278
0
      OUTS (outf, "--]");
2279
0
    }
2280
0
  else if (aop == 1 && sz == 0 && Z == 1 && W == 0 && reg != ptr)
2281
0
    {
2282
0
      OUTS (outf, pregs (reg));
2283
0
      OUTS (outf, " = [");
2284
0
      OUTS (outf, pregs (ptr));
2285
0
      OUTS (outf, "--]");
2286
0
    }
2287
0
  else if (aop == 1 && sz == 1 && Z == 0 && W == 0)
2288
0
    {
2289
0
      OUTS (outf, dregs (reg));
2290
0
      OUTS (outf, " = W[");
2291
0
      OUTS (outf, pregs (ptr));
2292
0
      OUTS (outf, "--] (Z)");
2293
0
    }
2294
0
  else if (aop == 1 && sz == 1 && Z == 1 && W == 0)
2295
0
    {
2296
0
      OUTS (outf, dregs (reg));
2297
0
      OUTS (outf, " = W[");
2298
0
      OUTS (outf, pregs (ptr));
2299
0
      OUTS (outf, "--] (X)");
2300
0
    }
2301
0
  else if (aop == 1 && sz == 2 && Z == 0 && W == 0)
2302
0
    {
2303
0
      OUTS (outf, dregs (reg));
2304
0
      OUTS (outf, " = B[");
2305
0
      OUTS (outf, pregs (ptr));
2306
0
      OUTS (outf, "--] (Z)");
2307
0
    }
2308
0
  else if (aop == 1 && sz == 2 && Z == 1 && W == 0)
2309
0
    {
2310
0
      OUTS (outf, dregs (reg));
2311
0
      OUTS (outf, " = B[");
2312
0
      OUTS (outf, pregs (ptr));
2313
0
      OUTS (outf, "--] (X)");
2314
0
    }
2315
0
  else if (aop == 2 && sz == 0 && Z == 0 && W == 0)
2316
0
    {
2317
0
      OUTS (outf, dregs (reg));
2318
0
      OUTS (outf, " = [");
2319
0
      OUTS (outf, pregs (ptr));
2320
0
      OUTS (outf, "]");
2321
0
    }
2322
0
  else if (aop == 2 && sz == 0 && Z == 1 && W == 0)
2323
0
    {
2324
0
      OUTS (outf, pregs (reg));
2325
0
      OUTS (outf, " = [");
2326
0
      OUTS (outf, pregs (ptr));
2327
0
      OUTS (outf, "]");
2328
0
    }
2329
0
  else if (aop == 2 && sz == 1 && Z == 0 && W == 0)
2330
0
    {
2331
0
      OUTS (outf, dregs (reg));
2332
0
      OUTS (outf, " = W[");
2333
0
      OUTS (outf, pregs (ptr));
2334
0
      OUTS (outf, "] (Z)");
2335
0
    }
2336
0
  else if (aop == 2 && sz == 1 && Z == 1 && W == 0)
2337
0
    {
2338
0
      OUTS (outf, dregs (reg));
2339
0
      OUTS (outf, " = W[");
2340
0
      OUTS (outf, pregs (ptr));
2341
0
      OUTS (outf, "] (X)");
2342
0
    }
2343
0
  else if (aop == 2 && sz == 2 && Z == 0 && W == 0)
2344
0
    {
2345
0
      OUTS (outf, dregs (reg));
2346
0
      OUTS (outf, " = B[");
2347
0
      OUTS (outf, pregs (ptr));
2348
0
      OUTS (outf, "] (Z)");
2349
0
    }
2350
0
  else if (aop == 2 && sz == 2 && Z == 1 && W == 0)
2351
0
    {
2352
0
      OUTS (outf, dregs (reg));
2353
0
      OUTS (outf, " = B[");
2354
0
      OUTS (outf, pregs (ptr));
2355
0
      OUTS (outf, "] (X)");
2356
0
    }
2357
0
  else if (aop == 0 && sz == 0 && Z == 0 && W == 1)
2358
0
    {
2359
0
      OUTS (outf, "[");
2360
0
      OUTS (outf, pregs (ptr));
2361
0
      OUTS (outf, "++] = ");
2362
0
      OUTS (outf, dregs (reg));
2363
0
    }
2364
0
  else if (aop == 0 && sz == 0 && Z == 1 && W == 1)
2365
0
    {
2366
0
      OUTS (outf, "[");
2367
0
      OUTS (outf, pregs (ptr));
2368
0
      OUTS (outf, "++] = ");
2369
0
      OUTS (outf, pregs (reg));
2370
0
    }
2371
0
  else if (aop == 0 && sz == 1 && Z == 0 && W == 1)
2372
0
    {
2373
0
      OUTS (outf, "W[");
2374
0
      OUTS (outf, pregs (ptr));
2375
0
      OUTS (outf, "++] = ");
2376
0
      OUTS (outf, dregs (reg));
2377
0
    }
2378
0
  else if (aop == 0 && sz == 2 && Z == 0 && W == 1)
2379
0
    {
2380
0
      OUTS (outf, "B[");
2381
0
      OUTS (outf, pregs (ptr));
2382
0
      OUTS (outf, "++] = ");
2383
0
      OUTS (outf, dregs (reg));
2384
0
    }
2385
0
  else if (aop == 1 && sz == 0 && Z == 0 && W == 1)
2386
0
    {
2387
0
      OUTS (outf, "[");
2388
0
      OUTS (outf, pregs (ptr));
2389
0
      OUTS (outf, "--] = ");
2390
0
      OUTS (outf, dregs (reg));
2391
0
    }
2392
0
  else if (aop == 1 && sz == 0 && Z == 1 && W == 1)
2393
0
    {
2394
0
      OUTS (outf, "[");
2395
0
      OUTS (outf, pregs (ptr));
2396
0
      OUTS (outf, "--] = ");
2397
0
      OUTS (outf, pregs (reg));
2398
0
    }
2399
0
  else if (aop == 1 && sz == 1 && Z == 0 && W == 1)
2400
0
    {
2401
0
      OUTS (outf, "W[");
2402
0
      OUTS (outf, pregs (ptr));
2403
0
      OUTS (outf, "--] = ");
2404
0
      OUTS (outf, dregs (reg));
2405
0
    }
2406
0
  else if (aop == 1 && sz == 2 && Z == 0 && W == 1)
2407
0
    {
2408
0
      OUTS (outf, "B[");
2409
0
      OUTS (outf, pregs (ptr));
2410
0
      OUTS (outf, "--] = ");
2411
0
      OUTS (outf, dregs (reg));
2412
0
    }
2413
0
  else if (aop == 2 && sz == 0 && Z == 0 && W == 1)
2414
0
    {
2415
0
      OUTS (outf, "[");
2416
0
      OUTS (outf, pregs (ptr));
2417
0
      OUTS (outf, "] = ");
2418
0
      OUTS (outf, dregs (reg));
2419
0
    }
2420
0
  else if (aop == 2 && sz == 0 && Z == 1 && W == 1)
2421
0
    {
2422
0
      OUTS (outf, "[");
2423
0
      OUTS (outf, pregs (ptr));
2424
0
      OUTS (outf, "] = ");
2425
0
      OUTS (outf, pregs (reg));
2426
0
    }
2427
0
  else if (aop == 2 && sz == 1 && Z == 0 && W == 1)
2428
0
    {
2429
0
      OUTS (outf, "W[");
2430
0
      OUTS (outf, pregs (ptr));
2431
0
      OUTS (outf, "] = ");
2432
0
      OUTS (outf, dregs (reg));
2433
0
    }
2434
0
  else if (aop == 2 && sz == 2 && Z == 0 && W == 1)
2435
0
    {
2436
0
      OUTS (outf, "B[");
2437
0
      OUTS (outf, pregs (ptr));
2438
0
      OUTS (outf, "] = ");
2439
0
      OUTS (outf, dregs (reg));
2440
0
    }
2441
0
  else
2442
0
    return 0;
2443
2444
0
  return 2;
2445
0
}
2446
2447
static int
2448
decode_LDSTiiFP_0 (TIword iw0, disassemble_info *outf)
2449
0
{
2450
  /* LDSTiiFP
2451
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2452
     | 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........|
2453
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2454
0
  int reg = ((iw0 >> LDSTiiFP_reg_bits) & LDSTiiFP_reg_mask);
2455
0
  int offset = ((iw0 >> LDSTiiFP_offset_bits) & LDSTiiFP_offset_mask);
2456
0
  int W = ((iw0 >> LDSTiiFP_W_bits) & LDSTiiFP_W_mask);
2457
2458
0
  if (W == 0)
2459
0
    {
2460
0
      OUTS (outf, dpregs (reg));
2461
0
      OUTS (outf, " = [FP ");
2462
0
      OUTS (outf, negimm5s4 (offset));
2463
0
      OUTS (outf, "]");
2464
0
    }
2465
0
  else if (W == 1)
2466
0
    {
2467
0
      OUTS (outf, "[FP ");
2468
0
      OUTS (outf, negimm5s4 (offset));
2469
0
      OUTS (outf, "] = ");
2470
0
      OUTS (outf, dpregs (reg));
2471
0
    }
2472
0
  else
2473
0
    return 0;
2474
2475
0
  return 2;
2476
0
}
2477
2478
static int
2479
decode_LDSTii_0 (TIword iw0, disassemble_info *outf)
2480
0
{
2481
  /* LDSTii
2482
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2483
     | 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......|
2484
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2485
0
  int reg = ((iw0 >> LDSTii_reg_bit) & LDSTii_reg_mask);
2486
0
  int ptr = ((iw0 >> LDSTii_ptr_bit) & LDSTii_ptr_mask);
2487
0
  int offset = ((iw0 >> LDSTii_offset_bit) & LDSTii_offset_mask);
2488
0
  int op = ((iw0 >> LDSTii_op_bit) & LDSTii_op_mask);
2489
0
  int W = ((iw0 >> LDSTii_W_bit) & LDSTii_W_mask);
2490
2491
0
  if (W == 0 && op == 0)
2492
0
    {
2493
0
      OUTS (outf, dregs (reg));
2494
0
      OUTS (outf, " = [");
2495
0
      OUTS (outf, pregs (ptr));
2496
0
      OUTS (outf, " + ");
2497
0
      OUTS (outf, uimm4s4 (offset));
2498
0
      OUTS (outf, "]");
2499
0
    }
2500
0
  else if (W == 0 && op == 1)
2501
0
    {
2502
0
      OUTS (outf, dregs (reg));
2503
0
      OUTS (outf, " = W[");
2504
0
      OUTS (outf, pregs (ptr));
2505
0
      OUTS (outf, " + ");
2506
0
      OUTS (outf, uimm4s2 (offset));
2507
0
      OUTS (outf, "] (Z)");
2508
0
    }
2509
0
  else if (W == 0 && op == 2)
2510
0
    {
2511
0
      OUTS (outf, dregs (reg));
2512
0
      OUTS (outf, " = W[");
2513
0
      OUTS (outf, pregs (ptr));
2514
0
      OUTS (outf, " + ");
2515
0
      OUTS (outf, uimm4s2 (offset));
2516
0
      OUTS (outf, "] (X)");
2517
0
    }
2518
0
  else if (W == 0 && op == 3)
2519
0
    {
2520
0
      OUTS (outf, pregs (reg));
2521
0
      OUTS (outf, " = [");
2522
0
      OUTS (outf, pregs (ptr));
2523
0
      OUTS (outf, " + ");
2524
0
      OUTS (outf, uimm4s4 (offset));
2525
0
      OUTS (outf, "]");
2526
0
    }
2527
0
  else if (W == 1 && op == 0)
2528
0
    {
2529
0
      OUTS (outf, "[");
2530
0
      OUTS (outf, pregs (ptr));
2531
0
      OUTS (outf, " + ");
2532
0
      OUTS (outf, uimm4s4 (offset));
2533
0
      OUTS (outf, "] = ");
2534
0
      OUTS (outf, dregs (reg));
2535
0
    }
2536
0
  else if (W == 1 && op == 1)
2537
0
    {
2538
0
      OUTS (outf, "W[");
2539
0
      OUTS (outf, pregs (ptr));
2540
0
      OUTS (outf, " + ");
2541
0
      OUTS (outf, uimm4s2 (offset));
2542
0
      OUTS (outf, "] = ");
2543
0
      OUTS (outf, dregs (reg));
2544
0
    }
2545
0
  else if (W == 1 && op == 3)
2546
0
    {
2547
0
      OUTS (outf, "[");
2548
0
      OUTS (outf, pregs (ptr));
2549
0
      OUTS (outf, " + ");
2550
0
      OUTS (outf, uimm4s4 (offset));
2551
0
      OUTS (outf, "] = ");
2552
0
      OUTS (outf, pregs (reg));
2553
0
    }
2554
0
  else
2555
0
    return 0;
2556
2557
0
  return 2;
2558
0
}
2559
2560
static int
2561
decode_LoopSetup_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
2562
0
{
2563
0
  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
0
  int c   = ((iw0 >> (LoopSetup_c_bits - 16)) & LoopSetup_c_mask);
2570
0
  int reg = ((iw1 >> LoopSetup_reg_bits) & LoopSetup_reg_mask);
2571
0
  int rop = ((iw0 >> (LoopSetup_rop_bits - 16)) & LoopSetup_rop_mask);
2572
0
  int soffset = ((iw0 >> (LoopSetup_soffset_bits - 16)) & LoopSetup_soffset_mask);
2573
0
  int eoffset = ((iw1 >> LoopSetup_eoffset_bits) & LoopSetup_eoffset_mask);
2574
2575
0
  if (priv->parallel)
2576
0
    return 0;
2577
2578
0
  if (reg > 7)
2579
0
    return 0;
2580
2581
0
  if (rop == 0)
2582
0
    {
2583
0
      OUTS (outf, "LSETUP");
2584
0
      OUTS (outf, "(0x");
2585
0
      OUTS (outf, pcrel4 (soffset));
2586
0
      OUTS (outf, ", 0x");
2587
0
      OUTS (outf, lppcrel10 (eoffset));
2588
0
      OUTS (outf, ") ");
2589
0
      OUTS (outf, counters (c));
2590
0
    }
2591
0
  else if (rop == 1)
2592
0
    {
2593
0
      OUTS (outf, "LSETUP");
2594
0
      OUTS (outf, "(0x");
2595
0
      OUTS (outf, pcrel4 (soffset));
2596
0
      OUTS (outf, ", 0x");
2597
0
      OUTS (outf, lppcrel10 (eoffset));
2598
0
      OUTS (outf, ") ");
2599
0
      OUTS (outf, counters (c));
2600
0
      OUTS (outf, " = ");
2601
0
      OUTS (outf, pregs (reg));
2602
0
    }
2603
0
  else if (rop == 3)
2604
0
    {
2605
0
      OUTS (outf, "LSETUP");
2606
0
      OUTS (outf, "(0x");
2607
0
      OUTS (outf, pcrel4 (soffset));
2608
0
      OUTS (outf, ", 0x");
2609
0
      OUTS (outf, lppcrel10 (eoffset));
2610
0
      OUTS (outf, ") ");
2611
0
      OUTS (outf, counters (c));
2612
0
      OUTS (outf, " = ");
2613
0
      OUTS (outf, pregs (reg));
2614
0
      OUTS (outf, " >> 0x1");
2615
0
    }
2616
0
  else
2617
0
    return 0;
2618
2619
0
  return 4;
2620
0
}
2621
2622
static int
2623
decode_LDIMMhalf_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2624
0
{
2625
0
  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
0
  int H = ((iw0 >> (LDIMMhalf_H_bits - 16)) & LDIMMhalf_H_mask);
2632
0
  int Z = ((iw0 >> (LDIMMhalf_Z_bits - 16)) & LDIMMhalf_Z_mask);
2633
0
  int S = ((iw0 >> (LDIMMhalf_S_bits - 16)) & LDIMMhalf_S_mask);
2634
0
  int reg = ((iw0 >> (LDIMMhalf_reg_bits - 16)) & LDIMMhalf_reg_mask);
2635
0
  int grp = ((iw0 >> (LDIMMhalf_grp_bits - 16)) & LDIMMhalf_grp_mask);
2636
0
  int hword = ((iw1 >> LDIMMhalf_hword_bits) & LDIMMhalf_hword_mask);
2637
2638
0
  bu32 *pval = get_allreg (grp, reg);
2639
2640
0
  if (priv->parallel)
2641
0
    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
0
  if (H == 0 && S == 1 && Z == 0)
2647
0
    {
2648
      /* regs = imm16 (x) */
2649
0
      *pval = imm16_val (hword);
2650
0
      if (hword & 0x8000)
2651
0
  *pval |= 0xFFFF0000;
2652
0
      else
2653
0
  *pval &= 0xFFFF;
2654
0
    }
2655
0
  else if (H == 0 && S == 0 && Z == 1)
2656
0
    {
2657
      /* regs = luimm16 (Z) */
2658
0
      *pval = luimm16_val (hword);
2659
0
      *pval &= 0xFFFF;
2660
0
    }
2661
0
  else if (H == 0 && S == 0 && Z == 0)
2662
0
    {
2663
      /* regs_lo = luimm16 */
2664
0
      *pval &= 0xFFFF0000;
2665
0
      *pval |= luimm16_val (hword);
2666
0
    }
2667
0
  else if (H == 1 && S == 0 && Z == 0)
2668
0
    {
2669
      /* regs_hi = huimm16 */
2670
0
      *pval &= 0xFFFF;
2671
0
      *pval |= luimm16_val (hword) << 16;
2672
0
    }
2673
2674
  /* Here we do the disassembly */
2675
0
  if (grp == 0 && H == 0 && S == 0 && Z == 0)
2676
0
    {
2677
0
      OUTS (outf, dregs_lo (reg));
2678
0
      OUTS (outf, " = ");
2679
0
      OUTS (outf, uimm16 (hword));
2680
0
    }
2681
0
  else if (grp == 0 && H == 1 && S == 0 && Z == 0)
2682
0
    {
2683
0
      OUTS (outf, dregs_hi (reg));
2684
0
      OUTS (outf, " = ");
2685
0
      OUTS (outf, uimm16 (hword));
2686
0
    }
2687
0
  else if (grp == 0 && H == 0 && S == 1 && Z == 0)
2688
0
    {
2689
0
      OUTS (outf, dregs (reg));
2690
0
      OUTS (outf, " = ");
2691
0
      OUTS (outf, imm16 (hword));
2692
0
      OUTS (outf, " (X)");
2693
0
    }
2694
0
  else if (H == 0 && S == 1 && Z == 0)
2695
0
    {
2696
0
      OUTS (outf, regs (reg, grp));
2697
0
      OUTS (outf, " = ");
2698
0
      OUTS (outf, imm16 (hword));
2699
0
      OUTS (outf, " (X)");
2700
0
    }
2701
0
  else if (H == 0 && S == 0 && Z == 1)
2702
0
    {
2703
0
      OUTS (outf, regs (reg, grp));
2704
0
      OUTS (outf, " = ");
2705
0
      OUTS (outf, uimm16 (hword));
2706
0
      OUTS (outf, " (Z)");
2707
0
    }
2708
0
  else if (H == 0 && S == 0 && Z == 0)
2709
0
    {
2710
0
      OUTS (outf, regs_lo (reg, grp));
2711
0
      OUTS (outf, " = ");
2712
0
      OUTS (outf, uimm16 (hword));
2713
0
    }
2714
0
  else if (H == 1 && S == 0 && Z == 0)
2715
0
    {
2716
0
      OUTS (outf, regs_hi (reg, grp));
2717
0
      OUTS (outf, " = ");
2718
0
      OUTS (outf, uimm16 (hword));
2719
0
    }
2720
0
  else
2721
0
    return 0;
2722
2723
  /* And we print out the 32-bit value if it is a pointer.  */
2724
0
  if (S == 0 && Z == 0)
2725
0
    {
2726
0
      OUTS (outf, ";\t\t/* (");
2727
0
      OUTS (outf, imm16d (hword));
2728
0
      OUTS (outf, ")\t");
2729
2730
      /* If it is an MMR, don't print the symbol.  */
2731
0
      if (*pval < 0xFFC00000 && grp == 1)
2732
0
  {
2733
0
    OUTS (outf, regs (reg, grp));
2734
0
    OUTS (outf, "=0x");
2735
0
    OUTS (outf, huimm32e (*pval));
2736
0
  }
2737
0
      else
2738
0
  {
2739
0
    OUTS (outf, regs (reg, grp));
2740
0
    OUTS (outf, "=0x");
2741
0
    OUTS (outf, huimm32e (*pval));
2742
0
    OUTS (outf, "(");
2743
0
    OUTS (outf, imm32 (*pval));
2744
0
    OUTS (outf, ")");
2745
0
  }
2746
2747
0
      OUTS (outf, " */");
2748
0
      priv->comment = true;
2749
0
    }
2750
0
  if (S == 1 || Z == 1)
2751
0
    {
2752
0
      OUTS (outf, ";\t\t/*\t\t");
2753
0
      OUTS (outf, regs (reg, grp));
2754
0
      OUTS (outf, "=0x");
2755
0
      OUTS (outf, huimm32e (*pval));
2756
0
      OUTS (outf, "(");
2757
0
      OUTS (outf, imm32 (*pval));
2758
0
      OUTS (outf, ") */");
2759
0
      priv->comment = true;
2760
0
    }
2761
0
  return 4;
2762
0
}
2763
2764
static int
2765
decode_CALLa_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
2766
0
{
2767
0
  struct private *priv = outf->private_data;
2768
  /* CALLa
2769
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2770
     | 1 | 1 | 1 | 0 | 0 | 0 | 1 |.S.|.msw...........................|
2771
     |.lsw...........................................................|
2772
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2773
0
  int S   = ((iw0 >> (CALLa_S_bits - 16)) & CALLa_S_mask);
2774
0
  int lsw = ((iw1 >> 0) & 0xffff);
2775
0
  int msw = ((iw0 >> 0) & 0xff);
2776
2777
0
  if (priv->parallel)
2778
0
    return 0;
2779
2780
0
  if (S == 1)
2781
0
    OUTS (outf, "CALL 0x");
2782
0
  else if (S == 0)
2783
0
    OUTS (outf, "JUMP.L 0x");
2784
0
  else
2785
0
    return 0;
2786
2787
0
  OUTS (outf, pcrel24 (((msw) << 16) | (lsw)));
2788
0
  return 4;
2789
0
}
2790
2791
static int
2792
decode_LDSTidxI_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2793
0
{
2794
  /* LDSTidxI
2795
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2796
     | 1 | 1 | 1 | 0 | 0 | 1 |.W.|.Z.|.sz....|.ptr.......|.reg.......|
2797
     |.offset........................................................|
2798
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
2799
0
  int Z = ((iw0 >> (LDSTidxI_Z_bits - 16)) & LDSTidxI_Z_mask);
2800
0
  int W = ((iw0 >> (LDSTidxI_W_bits - 16)) & LDSTidxI_W_mask);
2801
0
  int sz = ((iw0 >> (LDSTidxI_sz_bits - 16)) & LDSTidxI_sz_mask);
2802
0
  int reg = ((iw0 >> (LDSTidxI_reg_bits - 16)) & LDSTidxI_reg_mask);
2803
0
  int ptr = ((iw0 >> (LDSTidxI_ptr_bits - 16)) & LDSTidxI_ptr_mask);
2804
0
  int offset = ((iw1 >> LDSTidxI_offset_bits) & LDSTidxI_offset_mask);
2805
2806
0
  if (W == 0 && sz == 0 && Z == 0)
2807
0
    {
2808
0
      OUTS (outf, dregs (reg));
2809
0
      OUTS (outf, " = [");
2810
0
      OUTS (outf, pregs (ptr));
2811
0
      OUTS (outf, " + ");
2812
0
      OUTS (outf, imm16s4 (offset));
2813
0
      OUTS (outf, "]");
2814
0
    }
2815
0
  else if (W == 0 && sz == 0 && Z == 1)
2816
0
    {
2817
0
      OUTS (outf, pregs (reg));
2818
0
      OUTS (outf, " = [");
2819
0
      OUTS (outf, pregs (ptr));
2820
0
      OUTS (outf, " + ");
2821
0
      OUTS (outf, imm16s4 (offset));
2822
0
      OUTS (outf, "]");
2823
0
    }
2824
0
  else if (W == 0 && sz == 1 && Z == 0)
2825
0
    {
2826
0
      OUTS (outf, dregs (reg));
2827
0
      OUTS (outf, " = W[");
2828
0
      OUTS (outf, pregs (ptr));
2829
0
      OUTS (outf, " + ");
2830
0
      OUTS (outf, imm16s2 (offset));
2831
0
      OUTS (outf, "] (Z)");
2832
0
    }
2833
0
  else if (W == 0 && sz == 1 && Z == 1)
2834
0
    {
2835
0
      OUTS (outf, dregs (reg));
2836
0
      OUTS (outf, " = W[");
2837
0
      OUTS (outf, pregs (ptr));
2838
0
      OUTS (outf, " + ");
2839
0
      OUTS (outf, imm16s2 (offset));
2840
0
      OUTS (outf, "] (X)");
2841
0
    }
2842
0
  else if (W == 0 && sz == 2 && Z == 0)
2843
0
    {
2844
0
      OUTS (outf, dregs (reg));
2845
0
      OUTS (outf, " = B[");
2846
0
      OUTS (outf, pregs (ptr));
2847
0
      OUTS (outf, " + ");
2848
0
      OUTS (outf, imm16 (offset));
2849
0
      OUTS (outf, "] (Z)");
2850
0
    }
2851
0
  else if (W == 0 && sz == 2 && Z == 1)
2852
0
    {
2853
0
      OUTS (outf, dregs (reg));
2854
0
      OUTS (outf, " = B[");
2855
0
      OUTS (outf, pregs (ptr));
2856
0
      OUTS (outf, " + ");
2857
0
      OUTS (outf, imm16 (offset));
2858
0
      OUTS (outf, "] (X)");
2859
0
    }
2860
0
  else if (W == 1 && sz == 0 && Z == 0)
2861
0
    {
2862
0
      OUTS (outf, "[");
2863
0
      OUTS (outf, pregs (ptr));
2864
0
      OUTS (outf, " + ");
2865
0
      OUTS (outf, imm16s4 (offset));
2866
0
      OUTS (outf, "] = ");
2867
0
      OUTS (outf, dregs (reg));
2868
0
    }
2869
0
  else if (W == 1 && sz == 0 && Z == 1)
2870
0
    {
2871
0
      OUTS (outf, "[");
2872
0
      OUTS (outf, pregs (ptr));
2873
0
      OUTS (outf, " + ");
2874
0
      OUTS (outf, imm16s4 (offset));
2875
0
      OUTS (outf, "] = ");
2876
0
      OUTS (outf, pregs (reg));
2877
0
    }
2878
0
  else if (W == 1 && sz == 1 && Z == 0)
2879
0
    {
2880
0
      OUTS (outf, "W[");
2881
0
      OUTS (outf, pregs (ptr));
2882
0
      OUTS (outf, " + ");
2883
0
      OUTS (outf, imm16s2 (offset));
2884
0
      OUTS (outf, "] = ");
2885
0
      OUTS (outf, dregs (reg));
2886
0
    }
2887
0
  else if (W == 1 && sz == 2 && Z == 0)
2888
0
    {
2889
0
      OUTS (outf, "B[");
2890
0
      OUTS (outf, pregs (ptr));
2891
0
      OUTS (outf, " + ");
2892
0
      OUTS (outf, imm16 (offset));
2893
0
      OUTS (outf, "] = ");
2894
0
      OUTS (outf, dregs (reg));
2895
0
    }
2896
0
  else
2897
0
    return 0;
2898
2899
0
  return 4;
2900
0
}
2901
2902
static int
2903
decode_linkage_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2904
0
{
2905
0
  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
0
  int R = ((iw0 >> (Linkage_R_bits - 16)) & Linkage_R_mask);
2912
0
  int framesize = ((iw1 >> Linkage_framesize_bits) & Linkage_framesize_mask);
2913
2914
0
  if (priv->parallel)
2915
0
    return 0;
2916
2917
0
  if (R == 0)
2918
0
    {
2919
0
      OUTS (outf, "LINK ");
2920
0
      OUTS (outf, uimm16s4 (framesize));
2921
0
      OUTS (outf, ";\t\t/* (");
2922
0
      OUTS (outf, uimm16s4d (framesize));
2923
0
      OUTS (outf, ") */");
2924
0
      priv->comment = true;
2925
0
    }
2926
0
  else if (R == 1)
2927
0
    OUTS (outf, "UNLINK");
2928
0
  else
2929
0
    return 0;
2930
2931
0
  return 4;
2932
0
}
2933
2934
static int
2935
decode_dsp32mac_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2936
0
{
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
0
  int op1  = ((iw0 >> (DSP32Mac_op1_bits - 16)) & DSP32Mac_op1_mask);
2943
0
  int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2944
0
  int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2945
0
  int MM   = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
2946
0
  int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2947
0
  int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2948
0
  int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
2949
0
  int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
2950
0
  int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2951
0
  int h10  = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
2952
0
  int h00  = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
2953
0
  int op0  = ((iw1 >> DSP32Mac_op0_bits) & DSP32Mac_op0_mask);
2954
0
  int h11  = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
2955
0
  int h01  = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
2956
2957
0
  if (w0 == 0 && w1 == 0 && op1 == 3 && op0 == 3)
2958
0
    return 0;
2959
2960
0
  if (op1 == 3 && MM)
2961
0
    return 0;
2962
2963
0
  if ((w1 || w0) && mmod == M_W32)
2964
0
    return 0;
2965
2966
0
  if (((1 << mmod) & (P ? 0x131b : 0x1b5f)) == 0)
2967
0
    return 0;
2968
2969
0
  if (w1 == 1 || op1 != 3)
2970
0
    {
2971
0
      if (w1)
2972
0
  OUTS (outf, P ? dregs (dst + 1) : dregs_hi (dst));
2973
2974
0
      if (op1 == 3)
2975
0
  OUTS (outf, " = A1");
2976
0
      else
2977
0
  {
2978
0
    if (w1)
2979
0
      OUTS (outf, " = (");
2980
0
    decode_macfunc (1, op1, h01, h11, src0, src1, outf);
2981
0
    if (w1)
2982
0
      OUTS (outf, ")");
2983
0
  }
2984
2985
0
      if (w0 == 1 || op0 != 3)
2986
0
  {
2987
0
    if (MM)
2988
0
      OUTS (outf, " (M)");
2989
0
    OUTS (outf, ", ");
2990
0
  }
2991
0
    }
2992
2993
0
  if (w0 == 1 || op0 != 3)
2994
0
    {
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
0
      MM = 0;
2998
2999
0
      if (w0)
3000
0
  OUTS (outf, P ? dregs (dst) : dregs_lo (dst));
3001
3002
0
      if (op0 == 3)
3003
0
  OUTS (outf, " = A0");
3004
0
      else
3005
0
  {
3006
0
    if (w0)
3007
0
      OUTS (outf, " = (");
3008
0
    decode_macfunc (0, op0, h00, h10, src0, src1, outf);
3009
0
    if (w0)
3010
0
      OUTS (outf, ")");
3011
0
  }
3012
0
    }
3013
3014
0
  decode_optmode (mmod, MM, outf);
3015
3016
0
  return 4;
3017
0
}
3018
3019
static int
3020
decode_dsp32mult_0 (TIword iw0, TIword iw1, disassemble_info *outf)
3021
0
{
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
0
  int w1   = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
3028
0
  int P    = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
3029
0
  int MM   = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
3030
0
  int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
3031
0
  int w0   = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
3032
0
  int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
3033
0
  int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
3034
0
  int dst  = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
3035
0
  int h10  = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
3036
0
  int h00  = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
3037
0
  int h11  = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
3038
0
  int h01  = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
3039
3040
0
  if (w1 == 0 && w0 == 0)
3041
0
    return 0;
3042
3043
0
  if (((1 << mmod) & (P ? 0x313 : 0x1b57)) == 0)
3044
0
    return 0;
3045
3046
0
  if (w1)
3047
0
    {
3048
0
      OUTS (outf, P ? dregs (dst + 1) : dregs_hi (dst));
3049
0
      OUTS (outf, " = ");
3050
0
      decode_multfunc (h01, h11, src0, src1, outf);
3051
3052
0
      if (w0)
3053
0
  {
3054
0
    if (MM)
3055
0
      OUTS (outf, " (M)");
3056
0
    MM = 0;
3057
0
    OUTS (outf, ", ");
3058
0
  }
3059
0
    }
3060
3061
0
  if (w0)
3062
0
    {
3063
0
      OUTS (outf, P ? dregs (dst) : dregs_lo (dst));
3064
0
      OUTS (outf, " = ");
3065
0
      decode_multfunc (h00, h10, src0, src1, outf);
3066
0
    }
3067
3068
0
  decode_optmode (mmod, MM, outf);
3069
0
  return 4;
3070
0
}
3071
3072
static int
3073
decode_dsp32alu_0 (TIword iw0, TIword iw1, disassemble_info *outf)
3074
0
{
3075
  /* dsp32alu
3076
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
3077
     | 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............|
3078
     |.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......|
3079
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
3080
0
  int s    = ((iw1 >> DSP32Alu_s_bits) & DSP32Alu_s_mask);
3081
0
  int x    = ((iw1 >> DSP32Alu_x_bits) & DSP32Alu_x_mask);
3082
0
  int aop  = ((iw1 >> DSP32Alu_aop_bits) & DSP32Alu_aop_mask);
3083
0
  int src0 = ((iw1 >> DSP32Alu_src0_bits) & DSP32Alu_src0_mask);
3084
0
  int src1 = ((iw1 >> DSP32Alu_src1_bits) & DSP32Alu_src1_mask);
3085
0
  int dst0 = ((iw1 >> DSP32Alu_dst0_bits) & DSP32Alu_dst0_mask);
3086
0
  int dst1 = ((iw1 >> DSP32Alu_dst1_bits) & DSP32Alu_dst1_mask);
3087
0
  int HL   = ((iw0 >> (DSP32Alu_HL_bits - 16)) & DSP32Alu_HL_mask);
3088
0
  int aopcde = ((iw0 >> (DSP32Alu_aopcde_bits - 16)) & DSP32Alu_aopcde_mask);
3089
3090
0
  if (aop == 0 && aopcde == 9 && HL == 0 && s == 0)
3091
0
    {
3092
0
      OUTS (outf, "A0.L = ");
3093
0
      OUTS (outf, dregs_lo (src0));
3094
0
    }
3095
0
  else if (aop == 2 && aopcde == 9 && HL == 1 && s == 0)
3096
0
    {
3097
0
      OUTS (outf, "A1.H = ");
3098
0
      OUTS (outf, dregs_hi (src0));
3099
0
    }
3100
0
  else if (aop == 2 && aopcde == 9 && HL == 0 && s == 0)
3101
0
    {
3102
0
      OUTS (outf, "A1.L = ");
3103
0
      OUTS (outf, dregs_lo (src0));
3104
0
    }
3105
0
  else if (aop == 0 && aopcde == 9 && HL == 1 && s == 0)
3106
0
    {
3107
0
      OUTS (outf, "A0.H = ");
3108
0
      OUTS (outf, dregs_hi (src0));
3109
0
    }
3110
0
  else if (x == 1 && HL == 1 && aop == 3 && aopcde == 5)
3111
0
    {
3112
0
      OUTS (outf, dregs_hi (dst0));
3113
0
      OUTS (outf, " = ");
3114
0
      OUTS (outf, dregs (src0));
3115
0
      OUTS (outf, " - ");
3116
0
      OUTS (outf, dregs (src1));
3117
0
      OUTS (outf, " (RND20)");
3118
0
    }
3119
0
  else if (x == 1 && HL == 1 && aop == 2 && aopcde == 5)
3120
0
    {
3121
0
      OUTS (outf, dregs_hi (dst0));
3122
0
      OUTS (outf, " = ");
3123
0
      OUTS (outf, dregs (src0));
3124
0
      OUTS (outf, " + ");
3125
0
      OUTS (outf, dregs (src1));
3126
0
      OUTS (outf, " (RND20)");
3127
0
    }
3128
0
  else if (x == 0 && HL == 0 && aop == 1 && aopcde == 5)
3129
0
    {
3130
0
      OUTS (outf, dregs_lo (dst0));
3131
0
      OUTS (outf, " = ");
3132
0
      OUTS (outf, dregs (src0));
3133
0
      OUTS (outf, " - ");
3134
0
      OUTS (outf, dregs (src1));
3135
0
      OUTS (outf, " (RND12)");
3136
0
    }
3137
0
  else if (x == 0 && HL == 0 && aop == 0 && aopcde == 5)
3138
0
    {
3139
0
      OUTS (outf, dregs_lo (dst0));
3140
0
      OUTS (outf, " = ");
3141
0
      OUTS (outf, dregs (src0));
3142
0
      OUTS (outf, " + ");
3143
0
      OUTS (outf, dregs (src1));
3144
0
      OUTS (outf, " (RND12)");
3145
0
    }
3146
0
  else if (x == 1 && HL == 0 && aop == 3 && aopcde == 5)
3147
0
    {
3148
0
      OUTS (outf, dregs_lo (dst0));
3149
0
      OUTS (outf, " = ");
3150
0
      OUTS (outf, dregs (src0));
3151
0
      OUTS (outf, " - ");
3152
0
      OUTS (outf, dregs (src1));
3153
0
      OUTS (outf, " (RND20)");
3154
0
    }
3155
0
  else if (x == 0 && HL == 1 && aop == 0 && aopcde == 5)
3156
0
    {
3157
0
      OUTS (outf, dregs_hi (dst0));
3158
0
      OUTS (outf, " = ");
3159
0
      OUTS (outf, dregs (src0));
3160
0
      OUTS (outf, " + ");
3161
0
      OUTS (outf, dregs (src1));
3162
0
      OUTS (outf, " (RND12)");
3163
0
    }
3164
0
  else if (x == 1 && HL == 0 && aop == 2 && aopcde == 5)
3165
0
    {
3166
0
      OUTS (outf, dregs_lo (dst0));
3167
0
      OUTS (outf, " = ");
3168
0
      OUTS (outf, dregs (src0));
3169
0
      OUTS (outf, " + ");
3170
0
      OUTS (outf, dregs (src1));
3171
0
      OUTS (outf, " (RND20)");
3172
0
    }
3173
0
  else if (x == 0 && HL == 1 && aop == 1 && aopcde == 5)
3174
0
    {
3175
0
      OUTS (outf, dregs_hi (dst0));
3176
0
      OUTS (outf, " = ");
3177
0
      OUTS (outf, dregs (src0));
3178
0
      OUTS (outf, " - ");
3179
0
      OUTS (outf, dregs (src1));
3180
0
      OUTS (outf, " (RND12)");
3181
0
    }
3182
0
  else if (HL == 1 && aop == 0 && aopcde == 2)
3183
0
    {
3184
0
      OUTS (outf, dregs_hi (dst0));
3185
0
      OUTS (outf, " = ");
3186
0
      OUTS (outf, dregs_lo (src0));
3187
0
      OUTS (outf, " + ");
3188
0
      OUTS (outf, dregs_lo (src1));
3189
0
      amod1 (s, x, outf);
3190
0
    }
3191
0
  else if (HL == 1 && aop == 1 && aopcde == 2)
3192
0
    {
3193
0
      OUTS (outf, dregs_hi (dst0));
3194
0
      OUTS (outf, " = ");
3195
0
      OUTS (outf, dregs_lo (src0));
3196
0
      OUTS (outf, " + ");
3197
0
      OUTS (outf, dregs_hi (src1));
3198
0
      amod1 (s, x, outf);
3199
0
    }
3200
0
  else if (HL == 1 && aop == 2 && aopcde == 2)
3201
0
    {
3202
0
      OUTS (outf, dregs_hi (dst0));
3203
0
      OUTS (outf, " = ");
3204
0
      OUTS (outf, dregs_hi (src0));
3205
0
      OUTS (outf, " + ");
3206
0
      OUTS (outf, dregs_lo (src1));
3207
0
      amod1 (s, x, outf);
3208
0
    }
3209
0
  else if (HL == 1 && aop == 3 && aopcde == 2)
3210
0
    {
3211
0
      OUTS (outf, dregs_hi (dst0));
3212
0
      OUTS (outf, " = ");
3213
0
      OUTS (outf, dregs_hi (src0));
3214
0
      OUTS (outf, " + ");
3215
0
      OUTS (outf, dregs_hi (src1));
3216
0
      amod1 (s, x, outf);
3217
0
    }
3218
0
  else if (HL == 0 && aop == 0 && aopcde == 3)
3219
0
    {
3220
0
      OUTS (outf, dregs_lo (dst0));
3221
0
      OUTS (outf, " = ");
3222
0
      OUTS (outf, dregs_lo (src0));
3223
0
      OUTS (outf, " - ");
3224
0
      OUTS (outf, dregs_lo (src1));
3225
0
      amod1 (s, x, outf);
3226
0
    }
3227
0
  else if (HL == 0 && aop == 1 && aopcde == 3)
3228
0
    {
3229
0
      OUTS (outf, dregs_lo (dst0));
3230
0
      OUTS (outf, " = ");
3231
0
      OUTS (outf, dregs_lo (src0));
3232
0
      OUTS (outf, " - ");
3233
0
      OUTS (outf, dregs_hi (src1));
3234
0
      amod1 (s, x, outf);
3235
0
    }
3236
0
  else if (HL == 0 && aop == 3 && aopcde == 2)
3237
0
    {
3238
0
      OUTS (outf, dregs_lo (dst0));
3239
0
      OUTS (outf, " = ");
3240
0
      OUTS (outf, dregs_hi (src0));
3241
0
      OUTS (outf, " + ");
3242
0
      OUTS (outf, dregs_hi (src1));
3243
0
      amod1 (s, x, outf);
3244
0
    }
3245
0
  else if (HL == 1 && aop == 0 && aopcde == 3)
3246
0
    {
3247
0
      OUTS (outf, dregs_hi (dst0));
3248
0
      OUTS (outf, " = ");
3249
0
      OUTS (outf, dregs_lo (src0));
3250
0
      OUTS (outf, " - ");
3251
0
      OUTS (outf, dregs_lo (src1));
3252
0
      amod1 (s, x, outf);
3253
0
    }
3254
0
  else if (HL == 1 && aop == 1 && aopcde == 3)
3255
0
    {
3256
0
      OUTS (outf, dregs_hi (dst0));
3257
0
      OUTS (outf, " = ");
3258
0
      OUTS (outf, dregs_lo (src0));
3259
0
      OUTS (outf, " - ");
3260
0
      OUTS (outf, dregs_hi (src1));
3261
0
      amod1 (s, x, outf);
3262
0
    }
3263
0
  else if (HL == 1 && aop == 2 && aopcde == 3)
3264
0
    {
3265
0
      OUTS (outf, dregs_hi (dst0));
3266
0
      OUTS (outf, " = ");
3267
0
      OUTS (outf, dregs_hi (src0));
3268
0
      OUTS (outf, " - ");
3269
0
      OUTS (outf, dregs_lo (src1));
3270
0
      amod1 (s, x, outf);
3271
0
    }
3272
0
  else if (HL == 1 && aop == 3 && aopcde == 3)
3273
0
    {
3274
0
      OUTS (outf, dregs_hi (dst0));
3275
0
      OUTS (outf, " = ");
3276
0
      OUTS (outf, dregs_hi (src0));
3277
0
      OUTS (outf, " - ");
3278
0
      OUTS (outf, dregs_hi (src1));
3279
0
      amod1 (s, x, outf);
3280
0
    }
3281
0
  else if (HL == 0 && aop == 2 && aopcde == 2)
3282
0
    {
3283
0
      OUTS (outf, dregs_lo (dst0));
3284
0
      OUTS (outf, " = ");
3285
0
      OUTS (outf, dregs_hi (src0));
3286
0
      OUTS (outf, " + ");
3287
0
      OUTS (outf, dregs_lo (src1));
3288
0
      amod1 (s, x, outf);
3289
0
    }
3290
0
  else if (HL == 0 && aop == 1 && aopcde == 2)
3291
0
    {
3292
0
      OUTS (outf, dregs_lo (dst0));
3293
0
      OUTS (outf, " = ");
3294
0
      OUTS (outf, dregs_lo (src0));
3295
0
      OUTS (outf, " + ");
3296
0
      OUTS (outf, dregs_hi (src1));
3297
0
      amod1 (s, x, outf);
3298
0
    }
3299
0
  else if (HL == 0 && aop == 2 && aopcde == 3)
3300
0
    {
3301
0
      OUTS (outf, dregs_lo (dst0));
3302
0
      OUTS (outf, " = ");
3303
0
      OUTS (outf, dregs_hi (src0));
3304
0
      OUTS (outf, " - ");
3305
0
      OUTS (outf, dregs_lo (src1));
3306
0
      amod1 (s, x, outf);
3307
0
    }
3308
0
  else if (HL == 0 && aop == 3 && aopcde == 3)
3309
0
    {
3310
0
      OUTS (outf, dregs_lo (dst0));
3311
0
      OUTS (outf, " = ");
3312
0
      OUTS (outf, dregs_hi (src0));
3313
0
      OUTS (outf, " - ");
3314
0
      OUTS (outf, dregs_hi (src1));
3315
0
      amod1 (s, x, outf);
3316
0
    }
3317
0
  else if (HL == 0 && aop == 0 && aopcde == 2)
3318
0
    {
3319
0
      OUTS (outf, dregs_lo (dst0));
3320
0
      OUTS (outf, " = ");
3321
0
      OUTS (outf, dregs_lo (src0));
3322
0
      OUTS (outf, " + ");
3323
0
      OUTS (outf, dregs_lo (src1));
3324
0
      amod1 (s, x, outf);
3325
0
    }
3326
0
  else if (aop == 0 && aopcde == 9 && s == 1)
3327
0
    {
3328
0
      OUTS (outf, "A0 = ");
3329
0
      OUTS (outf, dregs (src0));
3330
0
    }
3331
0
  else if (aop == 3 && aopcde == 11 && s == 0)
3332
0
    OUTS (outf, "A0 -= A1");
3333
3334
0
  else if (aop == 3 && aopcde == 11 && s == 1)
3335
0
    OUTS (outf, "A0 -= A1 (W32)");
3336
3337
0
  else if (aop == 1 && aopcde == 22 && HL == 1)
3338
0
    {
3339
0
      OUTS (outf, dregs (dst0));
3340
0
      OUTS (outf, " = BYTEOP2P (");
3341
0
      OUTS (outf, dregs (src0 + 1));
3342
0
      OUTS (outf, ":");
3343
0
      OUTS (outf, imm5d (src0));
3344
0
      OUTS (outf, ", ");
3345
0
      OUTS (outf, dregs (src1 + 1));
3346
0
      OUTS (outf, ":");
3347
0
      OUTS (outf, imm5d (src1));
3348
0
      OUTS (outf, ") (TH");
3349
0
      if (s == 1)
3350
0
  OUTS (outf, ", R)");
3351
0
      else
3352
0
  OUTS (outf, ")");
3353
0
    }
3354
0
  else if (aop == 1 && aopcde == 22 && HL == 0)
3355
0
    {
3356
0
      OUTS (outf, dregs (dst0));
3357
0
      OUTS (outf, " = BYTEOP2P (");
3358
0
      OUTS (outf, dregs (src0 + 1));
3359
0
      OUTS (outf, ":");
3360
0
      OUTS (outf, imm5d (src0));
3361
0
      OUTS (outf, ", ");
3362
0
      OUTS (outf, dregs (src1 + 1));
3363
0
      OUTS (outf, ":");
3364
0
      OUTS (outf, imm5d (src1));
3365
0
      OUTS (outf, ") (TL");
3366
0
      if (s == 1)
3367
0
  OUTS (outf, ", R)");
3368
0
      else
3369
0
  OUTS (outf, ")");
3370
0
    }
3371
0
  else if (aop == 0 && aopcde == 22 && HL == 1)
3372
0
    {
3373
0
      OUTS (outf, dregs (dst0));
3374
0
      OUTS (outf, " = BYTEOP2P (");
3375
0
      OUTS (outf, dregs (src0 + 1));
3376
0
      OUTS (outf, ":");
3377
0
      OUTS (outf, imm5d (src0));
3378
0
      OUTS (outf, ", ");
3379
0
      OUTS (outf, dregs (src1 + 1));
3380
0
      OUTS (outf, ":");
3381
0
      OUTS (outf, imm5d (src1));
3382
0
      OUTS (outf, ") (RNDH");
3383
0
      if (s == 1)
3384
0
  OUTS (outf, ", R)");
3385
0
      else
3386
0
  OUTS (outf, ")");
3387
0
    }
3388
0
  else if (aop == 0 && aopcde == 22 && HL == 0)
3389
0
    {
3390
0
      OUTS (outf, dregs (dst0));
3391
0
      OUTS (outf, " = BYTEOP2P (");
3392
0
      OUTS (outf, dregs (src0 + 1));
3393
0
      OUTS (outf, ":");
3394
0
      OUTS (outf, imm5d (src0));
3395
0
      OUTS (outf, ", ");
3396
0
      OUTS (outf, dregs (src1 + 1));
3397
0
      OUTS (outf, ":");
3398
0
      OUTS (outf, imm5d (src1));
3399
0
      OUTS (outf, ") (RNDL");
3400
0
      if (s == 1)
3401
0
  OUTS (outf, ", R)");
3402
0
      else
3403
0
  OUTS (outf, ")");
3404
0
    }
3405
0
  else if (aop == 0 && s == 0 && aopcde == 8)
3406
0
    OUTS (outf, "A0 = 0");
3407
3408
0
  else if (aop == 0 && s == 1 && aopcde == 8)
3409
0
    OUTS (outf, "A0 = A0 (S)");
3410
3411
0
  else if (aop == 1 && s == 0 && aopcde == 8)
3412
0
    OUTS (outf, "A1 = 0");
3413
3414
0
  else if (aop == 1 && s == 1 && aopcde == 8)
3415
0
    OUTS (outf, "A1 = A1 (S)");
3416
3417
0
  else if (aop == 2 && s == 0 && aopcde == 8)
3418
0
    OUTS (outf, "A1 = A0 = 0");
3419
3420
0
  else if (aop == 2 && s == 1 && aopcde == 8)
3421
0
    OUTS (outf, "A1 = A1 (S), A0 = A0 (S)");
3422
3423
0
  else if (aop == 3 && s == 0 && aopcde == 8)
3424
0
    OUTS (outf, "A0 = A1");
3425
3426
0
  else if (aop == 3 && s == 1 && aopcde == 8)
3427
0
    OUTS (outf, "A1 = A0");
3428
3429
0
  else if (aop == 1 && aopcde == 9 && s == 0)
3430
0
    {
3431
0
      OUTS (outf, "A0.X = ");
3432
0
      OUTS (outf, dregs_lo (src0));
3433
0
    }
3434
0
  else if (aop == 1 && HL == 0 && aopcde == 11)
3435
0
    {
3436
0
      OUTS (outf, dregs_lo (dst0));
3437
0
      OUTS (outf, " = (A0 += A1)");
3438
0
    }
3439
0
  else if (aop == 3 && HL == 0 && aopcde == 16)
3440
0
    OUTS (outf, "A1 = ABS A1, A0 = ABS A0");
3441
3442
0
  else if (aop == 0 && aopcde == 23 && HL == 1)
3443
0
    {
3444
0
      OUTS (outf, dregs (dst0));
3445
0
      OUTS (outf, " = BYTEOP3P (");
3446
0
      OUTS (outf, dregs (src0 + 1));
3447
0
      OUTS (outf, ":");
3448
0
      OUTS (outf, imm5d (src0));
3449
0
      OUTS (outf, ", ");
3450
0
      OUTS (outf, dregs (src1 + 1));
3451
0
      OUTS (outf, ":");
3452
0
      OUTS (outf, imm5d (src1));
3453
0
      OUTS (outf, ") (HI");
3454
0
      if (s == 1)
3455
0
  OUTS (outf, ", R)");
3456
0
      else
3457
0
  OUTS (outf, ")");
3458
0
    }
3459
0
  else if (aop == 3 && aopcde == 9 && s == 0)
3460
0
    {
3461
0
      OUTS (outf, "A1.X = ");
3462
0
      OUTS (outf, dregs_lo (src0));
3463
0
    }
3464
0
  else if (aop == 1 && HL == 1 && aopcde == 16)
3465
0
    OUTS (outf, "A1 = ABS A1");
3466
3467
0
  else if (aop == 0 && HL == 1 && aopcde == 16)
3468
0
    OUTS (outf, "A1 = ABS A0");
3469
3470
0
  else if (aop == 2 && aopcde == 9 && s == 1)
3471
0
    {
3472
0
      OUTS (outf, "A1 = ");
3473
0
      OUTS (outf, dregs (src0));
3474
0
    }
3475
0
  else if (HL == 0 && aop == 3 && aopcde == 12)
3476
0
    {
3477
0
      OUTS (outf, dregs_lo (dst0));
3478
0
      OUTS (outf, " = ");
3479
0
      OUTS (outf, dregs (src0));
3480
0
      OUTS (outf, " (RND)");
3481
0
    }
3482
0
  else if (aop == 1 && HL == 0 && aopcde == 16)
3483
0
    OUTS (outf, "A0 = ABS A1");
3484
3485
0
  else if (aop == 0 && HL == 0 && aopcde == 16)
3486
0
    OUTS (outf, "A0 = ABS A0");
3487
3488
0
  else if (aop == 3 && HL == 0 && aopcde == 15)
3489
0
    {
3490
0
      OUTS (outf, dregs (dst0));
3491
0
      OUTS (outf, " = -");
3492
0
      OUTS (outf, dregs (src0));
3493
0
      OUTS (outf, " (V)");
3494
0
    }
3495
0
  else if (aop == 3 && s == 1 && HL == 0 && aopcde == 7)
3496
0
    {
3497
0
      OUTS (outf, dregs (dst0));
3498
0
      OUTS (outf, " = -");
3499
0
      OUTS (outf, dregs (src0));
3500
0
      OUTS (outf, " (S)");
3501
0
    }
3502
0
  else if (aop == 3 && s == 0 && HL == 0 && aopcde == 7)
3503
0
    {
3504
0
      OUTS (outf, dregs (dst0));
3505
0
      OUTS (outf, " = -");
3506
0
      OUTS (outf, dregs (src0));
3507
0
      OUTS (outf, " (NS)");
3508
0
    }
3509
0
  else if (aop == 1 && HL == 1 && aopcde == 11)
3510
0
    {
3511
0
      OUTS (outf, dregs_hi (dst0));
3512
0
      OUTS (outf, " = (A0 += A1)");
3513
0
    }
3514
0
  else if (aop == 2 && aopcde == 11 && s == 0)
3515
0
    OUTS (outf, "A0 += A1");
3516
3517
0
  else if (aop == 2 && aopcde == 11 && s == 1)
3518
0
    OUTS (outf, "A0 += A1 (W32)");
3519
3520
0
  else if (aop == 3 && HL == 0 && aopcde == 14)
3521
0
    OUTS (outf, "A1 = -A1, A0 = -A0");
3522
3523
0
  else if (HL == 1 && aop == 3 && aopcde == 12)
3524
0
    {
3525
0
      OUTS (outf, dregs_hi (dst0));
3526
0
      OUTS (outf, " = ");
3527
0
      OUTS (outf, dregs (src0));
3528
0
      OUTS (outf, " (RND)");
3529
0
    }
3530
0
  else if (aop == 0 && aopcde == 23 && HL == 0)
3531
0
    {
3532
0
      OUTS (outf, dregs (dst0));
3533
0
      OUTS (outf, " = BYTEOP3P (");
3534
0
      OUTS (outf, dregs (src0 + 1));
3535
0
      OUTS (outf, ":");
3536
0
      OUTS (outf, imm5d (src0));
3537
0
      OUTS (outf, ", ");
3538
0
      OUTS (outf, dregs (src1 + 1));
3539
0
      OUTS (outf, ":");
3540
0
      OUTS (outf, imm5d (src1));
3541
0
      OUTS (outf, ") (LO");
3542
0
      if (s == 1)
3543
0
  OUTS (outf, ", R)");
3544
0
      else
3545
0
  OUTS (outf, ")");
3546
0
    }
3547
0
  else if (aop == 0 && HL == 0 && aopcde == 14)
3548
0
    OUTS (outf, "A0 = -A0");
3549
3550
0
  else if (aop == 1 && HL == 0 && aopcde == 14)
3551
0
    OUTS (outf, "A0 = -A1");
3552
3553
0
  else if (aop == 0 && HL == 1 && aopcde == 14)
3554
0
    OUTS (outf, "A1 = -A0");
3555
3556
0
  else if (aop == 1 && HL == 1 && aopcde == 14)
3557
0
    OUTS (outf, "A1 = -A1");
3558
3559
0
  else if (aop == 0 && aopcde == 12)
3560
0
    {
3561
0
      OUTS (outf, dregs_hi (dst0));
3562
0
      OUTS (outf, " = ");
3563
0
      OUTS (outf, dregs_lo (dst0));
3564
0
      OUTS (outf, " = SIGN (");
3565
0
      OUTS (outf, dregs_hi (src0));
3566
0
      OUTS (outf, ") * ");
3567
0
      OUTS (outf, dregs_hi (src1));
3568
0
      OUTS (outf, " + SIGN (");
3569
0
      OUTS (outf, dregs_lo (src0));
3570
0
      OUTS (outf, ") * ");
3571
0
      OUTS (outf, dregs_lo (src1));
3572
0
    }
3573
0
  else if (aop == 2 && aopcde == 0)
3574
0
    {
3575
0
      OUTS (outf, dregs (dst0));
3576
0
      OUTS (outf, " = ");
3577
0
      OUTS (outf, dregs (src0));
3578
0
      OUTS (outf, " -|+ ");
3579
0
      OUTS (outf, dregs (src1));
3580
0
      amod0 (s, x, outf);
3581
0
    }
3582
0
  else if (aop == 1 && aopcde == 12)
3583
0
    {
3584
0
      OUTS (outf, dregs (dst1));
3585
0
      OUTS (outf, " = A1.L + A1.H, ");
3586
0
      OUTS (outf, dregs (dst0));
3587
0
      OUTS (outf, " = A0.L + A0.H");
3588
0
    }
3589
0
  else if (aop == 2 && aopcde == 4)
3590
0
    {
3591
0
      OUTS (outf, dregs (dst1));
3592
0
      OUTS (outf, " = ");
3593
0
      OUTS (outf, dregs (src0));
3594
0
      OUTS (outf, " + ");
3595
0
      OUTS (outf, dregs (src1));
3596
0
      OUTS (outf, ", ");
3597
0
      OUTS (outf, dregs (dst0));
3598
0
      OUTS (outf, " = ");
3599
0
      OUTS (outf, dregs (src0));
3600
0
      OUTS (outf, " - ");
3601
0
      OUTS (outf, dregs (src1));
3602
0
      amod1 (s, x, outf);
3603
0
    }
3604
0
  else if (HL == 0 && aopcde == 1)
3605
0
    {
3606
0
      OUTS (outf, dregs (dst1));
3607
0
      OUTS (outf, " = ");
3608
0
      OUTS (outf, dregs (src0));
3609
0
      OUTS (outf, " +|+ ");
3610
0
      OUTS (outf, dregs (src1));
3611
0
      OUTS (outf, ", ");
3612
0
      OUTS (outf, dregs (dst0));
3613
0
      OUTS (outf, " = ");
3614
0
      OUTS (outf, dregs (src0));
3615
0
      OUTS (outf, " -|- ");
3616
0
      OUTS (outf, dregs (src1));
3617
0
      amod0amod2 (s, x, aop, outf);
3618
0
    }
3619
0
  else if (aop == 0 && aopcde == 11)
3620
0
    {
3621
0
      OUTS (outf, dregs (dst0));
3622
0
      OUTS (outf, " = (A0 += A1)");
3623
0
    }
3624
0
  else if (aop == 0 && aopcde == 10)
3625
0
    {
3626
0
      OUTS (outf, dregs_lo (dst0));
3627
0
      OUTS (outf, " = A0.X");
3628
0
    }
3629
0
  else if (aop == 1 && aopcde == 10)
3630
0
    {
3631
0
      OUTS (outf, dregs_lo (dst0));
3632
0
      OUTS (outf, " = A1.X");
3633
0
    }
3634
0
  else if (aop == 1 && aopcde == 0)
3635
0
    {
3636
0
      OUTS (outf, dregs (dst0));
3637
0
      OUTS (outf, " = ");
3638
0
      OUTS (outf, dregs (src0));
3639
0
      OUTS (outf, " +|- ");
3640
0
      OUTS (outf, dregs (src1));
3641
0
      amod0 (s, x, outf);
3642
0
    }
3643
0
  else if (aop == 3 && aopcde == 0)
3644
0
    {
3645
0
      OUTS (outf, dregs (dst0));
3646
0
      OUTS (outf, " = ");
3647
0
      OUTS (outf, dregs (src0));
3648
0
      OUTS (outf, " -|- ");
3649
0
      OUTS (outf, dregs (src1));
3650
0
      amod0 (s, x, outf);
3651
0
    }
3652
0
  else if (aop == 1 && aopcde == 4)
3653
0
    {
3654
0
      OUTS (outf, dregs (dst0));
3655
0
      OUTS (outf, " = ");
3656
0
      OUTS (outf, dregs (src0));
3657
0
      OUTS (outf, " - ");
3658
0
      OUTS (outf, dregs (src1));
3659
0
      amod1 (s, x, outf);
3660
0
    }
3661
0
  else if (aop == 0 && aopcde == 17)
3662
0
    {
3663
0
      OUTS (outf, dregs (dst1));
3664
0
      OUTS (outf, " = A1 + A0, ");
3665
0
      OUTS (outf, dregs (dst0));
3666
0
      OUTS (outf, " = A1 - A0");
3667
0
      amod1 (s, x, outf);
3668
0
    }
3669
0
  else if (aop == 1 && aopcde == 17)
3670
0
    {
3671
0
      OUTS (outf, dregs (dst1));
3672
0
      OUTS (outf, " = A0 + A1, ");
3673
0
      OUTS (outf, dregs (dst0));
3674
0
      OUTS (outf, " = A0 - A1");
3675
0
      amod1 (s, x, outf);
3676
0
    }
3677
0
  else if (aop == 0 && aopcde == 18)
3678
0
    {
3679
0
      OUTS (outf, "SAA (");
3680
0
      OUTS (outf, dregs (src0 + 1));
3681
0
      OUTS (outf, ":");
3682
0
      OUTS (outf, imm5d (src0));
3683
0
      OUTS (outf, ", ");
3684
0
      OUTS (outf, dregs (src1 + 1));
3685
0
      OUTS (outf, ":");
3686
0
      OUTS (outf, imm5d (src1));
3687
0
      OUTS (outf, ")");
3688
0
      aligndir (s, outf);
3689
0
    }
3690
0
  else if (aop == 3 && aopcde == 18)
3691
0
    OUTS (outf, "DISALGNEXCPT");
3692
3693
0
  else if (aop == 0 && aopcde == 20)
3694
0
    {
3695
0
      OUTS (outf, dregs (dst0));
3696
0
      OUTS (outf, " = BYTEOP1P (");
3697
0
      OUTS (outf, dregs (src0 + 1));
3698
0
      OUTS (outf, ":");
3699
0
      OUTS (outf, imm5d (src0));
3700
0
      OUTS (outf, ", ");
3701
0
      OUTS (outf, dregs (src1 + 1));
3702
0
      OUTS (outf, ":");
3703
0
      OUTS (outf, imm5d (src1));
3704
0
      OUTS (outf, ")");
3705
0
      aligndir (s, outf);
3706
0
    }
3707
0
  else if (aop == 1 && aopcde == 20)
3708
0
    {
3709
0
      OUTS (outf, dregs (dst0));
3710
0
      OUTS (outf, " = BYTEOP1P (");
3711
0
      OUTS (outf, dregs (src0 + 1));
3712
0
      OUTS (outf, ":");
3713
0
      OUTS (outf, imm5d (src0));
3714
0
      OUTS (outf, ", ");
3715
0
      OUTS (outf, dregs (src1 + 1));
3716
0
      OUTS (outf, ":");
3717
0
      OUTS (outf, imm5d (src1));
3718
0
      OUTS (outf, ") (T");
3719
0
      if (s == 1)
3720
0
  OUTS (outf, ", R)");
3721
0
      else
3722
0
  OUTS (outf, ")");
3723
0
    }
3724
0
  else if (aop == 0 && aopcde == 21)
3725
0
    {
3726
0
      OUTS (outf, "(");
3727
0
      OUTS (outf, dregs (dst1));
3728
0
      OUTS (outf, ", ");
3729
0
      OUTS (outf, dregs (dst0));
3730
0
      OUTS (outf, ") = BYTEOP16P (");
3731
0
      OUTS (outf, dregs (src0 + 1));
3732
0
      OUTS (outf, ":");
3733
0
      OUTS (outf, imm5d (src0));
3734
0
      OUTS (outf, ", ");
3735
0
      OUTS (outf, dregs (src1 + 1));
3736
0
      OUTS (outf, ":");
3737
0
      OUTS (outf, imm5d (src1));
3738
0
      OUTS (outf, ")");
3739
0
      aligndir (s, outf);
3740
0
    }
3741
0
  else if (aop == 1 && aopcde == 21)
3742
0
    {
3743
0
      OUTS (outf, "(");
3744
0
      OUTS (outf, dregs (dst1));
3745
0
      OUTS (outf, ", ");
3746
0
      OUTS (outf, dregs (dst0));
3747
0
      OUTS (outf, ") = BYTEOP16M (");
3748
0
      OUTS (outf, dregs (src0 + 1));
3749
0
      OUTS (outf, ":");
3750
0
      OUTS (outf, imm5d (src0));
3751
0
      OUTS (outf, ", ");
3752
0
      OUTS (outf, dregs (src1 + 1));
3753
0
      OUTS (outf, ":");
3754
0
      OUTS (outf, imm5d (src1));
3755
0
      OUTS (outf, ")");
3756
0
      aligndir (s, outf);
3757
0
    }
3758
0
  else if (aop == 2 && aopcde == 7)
3759
0
    {
3760
0
      OUTS (outf, dregs (dst0));
3761
0
      OUTS (outf, " = ABS ");
3762
0
      OUTS (outf, dregs (src0));
3763
0
    }
3764
0
  else if (aop == 1 && aopcde == 7)
3765
0
    {
3766
0
      OUTS (outf, dregs (dst0));
3767
0
      OUTS (outf, " = MIN (");
3768
0
      OUTS (outf, dregs (src0));
3769
0
      OUTS (outf, ", ");
3770
0
      OUTS (outf, dregs (src1));
3771
0
      OUTS (outf, ")");
3772
0
    }
3773
0
  else if (aop == 0 && aopcde == 7)
3774
0
    {
3775
0
      OUTS (outf, dregs (dst0));
3776
0
      OUTS (outf, " = MAX (");
3777
0
      OUTS (outf, dregs (src0));
3778
0
      OUTS (outf, ", ");
3779
0
      OUTS (outf, dregs (src1));
3780
0
      OUTS (outf, ")");
3781
0
    }
3782
0
  else if (aop == 2 && aopcde == 6)
3783
0
    {
3784
0
      OUTS (outf, dregs (dst0));
3785
0
      OUTS (outf, " = ABS ");
3786
0
      OUTS (outf, dregs (src0));
3787
0
      OUTS (outf, " (V)");
3788
0
    }
3789
0
  else if (aop == 1 && aopcde == 6)
3790
0
    {
3791
0
      OUTS (outf, dregs (dst0));
3792
0
      OUTS (outf, " = MIN (");
3793
0
      OUTS (outf, dregs (src0));
3794
0
      OUTS (outf, ", ");
3795
0
      OUTS (outf, dregs (src1));
3796
0
      OUTS (outf, ") (V)");
3797
0
    }
3798
0
  else if (aop == 0 && aopcde == 6)
3799
0
    {
3800
0
      OUTS (outf, dregs (dst0));
3801
0
      OUTS (outf, " = MAX (");
3802
0
      OUTS (outf, dregs (src0));
3803
0
      OUTS (outf, ", ");
3804
0
      OUTS (outf, dregs (src1));
3805
0
      OUTS (outf, ") (V)");
3806
0
    }
3807
0
  else if (HL == 1 && aopcde == 1)
3808
0
    {
3809
0
      OUTS (outf, dregs (dst1));
3810
0
      OUTS (outf, " = ");
3811
0
      OUTS (outf, dregs (src0));
3812
0
      OUTS (outf, " +|- ");
3813
0
      OUTS (outf, dregs (src1));
3814
0
      OUTS (outf, ", ");
3815
0
      OUTS (outf, dregs (dst0));
3816
0
      OUTS (outf, " = ");
3817
0
      OUTS (outf, dregs (src0));
3818
0
      OUTS (outf, " -|+ ");
3819
0
      OUTS (outf, dregs (src1));
3820
0
      amod0amod2 (s, x, aop, outf);
3821
0
    }
3822
0
  else if (aop == 0 && aopcde == 4)
3823
0
    {
3824
0
      OUTS (outf, dregs (dst0));
3825
0
      OUTS (outf, " = ");
3826
0
      OUTS (outf, dregs (src0));
3827
0
      OUTS (outf, " + ");
3828
0
      OUTS (outf, dregs (src1));
3829
0
      amod1 (s, x, outf);
3830
0
    }
3831
0
  else if (aop == 0 && aopcde == 0)
3832
0
    {
3833
0
      OUTS (outf, dregs (dst0));
3834
0
      OUTS (outf, " = ");
3835
0
      OUTS (outf, dregs (src0));
3836
0
      OUTS (outf, " +|+ ");
3837
0
      OUTS (outf, dregs (src1));
3838
0
      amod0 (s, x, outf);
3839
0
    }
3840
0
  else if (aop == 0 && aopcde == 24)
3841
0
    {
3842
0
      OUTS (outf, dregs (dst0));
3843
0
      OUTS (outf, " = BYTEPACK (");
3844
0
      OUTS (outf, dregs (src0));
3845
0
      OUTS (outf, ", ");
3846
0
      OUTS (outf, dregs (src1));
3847
0
      OUTS (outf, ")");
3848
0
    }
3849
0
  else if (aop == 1 && aopcde == 24)
3850
0
    {
3851
0
      OUTS (outf, "(");
3852
0
      OUTS (outf, dregs (dst1));
3853
0
      OUTS (outf, ", ");
3854
0
      OUTS (outf, dregs (dst0));
3855
0
      OUTS (outf, ") = BYTEUNPACK ");
3856
0
      OUTS (outf, dregs (src0 + 1));
3857
0
      OUTS (outf, ":");
3858
0
      OUTS (outf, imm5d (src0));
3859
0
      aligndir (s, outf);
3860
0
    }
3861
0
  else if (aopcde == 13)
3862
0
    {
3863
0
      OUTS (outf, "(");
3864
0
      OUTS (outf, dregs (dst1));
3865
0
      OUTS (outf, ", ");
3866
0
      OUTS (outf, dregs (dst0));
3867
0
      OUTS (outf, ") = SEARCH ");
3868
0
      OUTS (outf, dregs (src0));
3869
0
      OUTS (outf, " (");
3870
0
      searchmod (aop, outf);
3871
0
      OUTS (outf, ")");
3872
0
    }
3873
0
  else
3874
0
    return 0;
3875
3876
0
  return 4;
3877
0
}
3878
3879
static int
3880
decode_dsp32shift_0 (TIword iw0, TIword iw1, disassemble_info *outf)
3881
0
{
3882
  /* dsp32shift
3883
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
3884
     | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............|
3885
     |.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......|
3886
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
3887
0
  int HLs  = ((iw1 >> DSP32Shift_HLs_bits) & DSP32Shift_HLs_mask);
3888
0
  int sop  = ((iw1 >> DSP32Shift_sop_bits) & DSP32Shift_sop_mask);
3889
0
  int src0 = ((iw1 >> DSP32Shift_src0_bits) & DSP32Shift_src0_mask);
3890
0
  int src1 = ((iw1 >> DSP32Shift_src1_bits) & DSP32Shift_src1_mask);
3891
0
  int dst0 = ((iw1 >> DSP32Shift_dst0_bits) & DSP32Shift_dst0_mask);
3892
0
  int sopcde = ((iw0 >> (DSP32Shift_sopcde_bits - 16)) & DSP32Shift_sopcde_mask);
3893
0
  const char *acc01 = (HLs & 1) == 0 ? "A0" : "A1";
3894
3895
0
  if (HLs == 0 && sop == 0 && sopcde == 0)
3896
0
    {
3897
0
      OUTS (outf, dregs_lo (dst0));
3898
0
      OUTS (outf, " = ASHIFT ");
3899
0
      OUTS (outf, dregs_lo (src1));
3900
0
      OUTS (outf, " BY ");
3901
0
      OUTS (outf, dregs_lo (src0));
3902
0
    }
3903
0
  else if (HLs == 1 && sop == 0 && sopcde == 0)
3904
0
    {
3905
0
      OUTS (outf, dregs_lo (dst0));
3906
0
      OUTS (outf, " = ASHIFT ");
3907
0
      OUTS (outf, dregs_hi (src1));
3908
0
      OUTS (outf, " BY ");
3909
0
      OUTS (outf, dregs_lo (src0));
3910
0
    }
3911
0
  else if (HLs == 2 && sop == 0 && sopcde == 0)
3912
0
    {
3913
0
      OUTS (outf, dregs_hi (dst0));
3914
0
      OUTS (outf, " = ASHIFT ");
3915
0
      OUTS (outf, dregs_lo (src1));
3916
0
      OUTS (outf, " BY ");
3917
0
      OUTS (outf, dregs_lo (src0));
3918
0
    }
3919
0
  else if (HLs == 3 && sop == 0 && sopcde == 0)
3920
0
    {
3921
0
      OUTS (outf, dregs_hi (dst0));
3922
0
      OUTS (outf, " = ASHIFT ");
3923
0
      OUTS (outf, dregs_hi (src1));
3924
0
      OUTS (outf, " BY ");
3925
0
      OUTS (outf, dregs_lo (src0));
3926
0
    }
3927
0
  else if (HLs == 0 && sop == 1 && sopcde == 0)
3928
0
    {
3929
0
      OUTS (outf, dregs_lo (dst0));
3930
0
      OUTS (outf, " = ASHIFT ");
3931
0
      OUTS (outf, dregs_lo (src1));
3932
0
      OUTS (outf, " BY ");
3933
0
      OUTS (outf, dregs_lo (src0));
3934
0
      OUTS (outf, " (S)");
3935
0
    }
3936
0
  else if (HLs == 1 && sop == 1 && sopcde == 0)
3937
0
    {
3938
0
      OUTS (outf, dregs_lo (dst0));
3939
0
      OUTS (outf, " = ASHIFT ");
3940
0
      OUTS (outf, dregs_hi (src1));
3941
0
      OUTS (outf, " BY ");
3942
0
      OUTS (outf, dregs_lo (src0));
3943
0
      OUTS (outf, " (S)");
3944
0
    }
3945
0
  else if (HLs == 2 && sop == 1 && sopcde == 0)
3946
0
    {
3947
0
      OUTS (outf, dregs_hi (dst0));
3948
0
      OUTS (outf, " = ASHIFT ");
3949
0
      OUTS (outf, dregs_lo (src1));
3950
0
      OUTS (outf, " BY ");
3951
0
      OUTS (outf, dregs_lo (src0));
3952
0
      OUTS (outf, " (S)");
3953
0
    }
3954
0
  else if (HLs == 3 && sop == 1 && sopcde == 0)
3955
0
    {
3956
0
      OUTS (outf, dregs_hi (dst0));
3957
0
      OUTS (outf, " = ASHIFT ");
3958
0
      OUTS (outf, dregs_hi (src1));
3959
0
      OUTS (outf, " BY ");
3960
0
      OUTS (outf, dregs_lo (src0));
3961
0
      OUTS (outf, " (S)");
3962
0
    }
3963
0
  else if (sop == 2 && sopcde == 0)
3964
0
    {
3965
0
      OUTS (outf, (HLs & 2) == 0 ? dregs_lo (dst0) : dregs_hi (dst0));
3966
0
      OUTS (outf, " = LSHIFT ");
3967
0
      OUTS (outf, (HLs & 1) == 0 ? dregs_lo (src1) : dregs_hi (src1));
3968
0
      OUTS (outf, " BY ");
3969
0
      OUTS (outf, dregs_lo (src0));
3970
0
    }
3971
0
  else if (sop == 0 && sopcde == 3)
3972
0
    {
3973
0
      OUTS (outf, acc01);
3974
0
      OUTS (outf, " = ASHIFT ");
3975
0
      OUTS (outf, acc01);
3976
0
      OUTS (outf, " BY ");
3977
0
      OUTS (outf, dregs_lo (src0));
3978
0
    }
3979
0
  else if (sop == 1 && sopcde == 3)
3980
0
    {
3981
0
      OUTS (outf, acc01);
3982
0
      OUTS (outf, " = LSHIFT ");
3983
0
      OUTS (outf, acc01);
3984
0
      OUTS (outf, " BY ");
3985
0
      OUTS (outf, dregs_lo (src0));
3986
0
    }
3987
0
  else if (sop == 2 && sopcde == 3)
3988
0
    {
3989
0
      OUTS (outf, acc01);
3990
0
      OUTS (outf, " = ROT ");
3991
0
      OUTS (outf, acc01);
3992
0
      OUTS (outf, " BY ");
3993
0
      OUTS (outf, dregs_lo (src0));
3994
0
    }
3995
0
  else if (sop == 3 && sopcde == 3)
3996
0
    {
3997
0
      OUTS (outf, dregs (dst0));
3998
0
      OUTS (outf, " = ROT ");
3999
0
      OUTS (outf, dregs (src1));
4000
0
      OUTS (outf, " BY ");
4001
0
      OUTS (outf, dregs_lo (src0));
4002
0
    }
4003
0
  else if (sop == 1 && sopcde == 1)
4004
0
    {
4005
0
      OUTS (outf, dregs (dst0));
4006
0
      OUTS (outf, " = ASHIFT ");
4007
0
      OUTS (outf, dregs (src1));
4008
0
      OUTS (outf, " BY ");
4009
0
      OUTS (outf, dregs_lo (src0));
4010
0
      OUTS (outf, " (V, S)");
4011
0
    }
4012
0
  else if (sop == 0 && sopcde == 1)
4013
0
    {
4014
0
      OUTS (outf, dregs (dst0));
4015
0
      OUTS (outf, " = ASHIFT ");
4016
0
      OUTS (outf, dregs (src1));
4017
0
      OUTS (outf, " BY ");
4018
0
      OUTS (outf, dregs_lo (src0));
4019
0
      OUTS (outf, " (V)");
4020
0
    }
4021
0
  else if (sop == 0 && sopcde == 2)
4022
0
    {
4023
0
      OUTS (outf, dregs (dst0));
4024
0
      OUTS (outf, " = ASHIFT ");
4025
0
      OUTS (outf, dregs (src1));
4026
0
      OUTS (outf, " BY ");
4027
0
      OUTS (outf, dregs_lo (src0));
4028
0
    }
4029
0
  else if (sop == 1 && sopcde == 2)
4030
0
    {
4031
0
      OUTS (outf, dregs (dst0));
4032
0
      OUTS (outf, " = ASHIFT ");
4033
0
      OUTS (outf, dregs (src1));
4034
0
      OUTS (outf, " BY ");
4035
0
      OUTS (outf, dregs_lo (src0));
4036
0
      OUTS (outf, " (S)");
4037
0
    }
4038
0
  else if (sop == 2 && sopcde == 2)
4039
0
    {
4040
0
      OUTS (outf, dregs (dst0));
4041
0
      OUTS (outf, " = LSHIFT ");
4042
0
      OUTS (outf, dregs (src1));
4043
0
      OUTS (outf, " BY ");
4044
0
      OUTS (outf, dregs_lo (src0));
4045
0
    }
4046
0
  else if (sop == 3 && sopcde == 2)
4047
0
    {
4048
0
      OUTS (outf, dregs (dst0));
4049
0
      OUTS (outf, " = ROT ");
4050
0
      OUTS (outf, dregs (src1));
4051
0
      OUTS (outf, " BY ");
4052
0
      OUTS (outf, dregs_lo (src0));
4053
0
    }
4054
0
  else if (sop == 2 && sopcde == 1)
4055
0
    {
4056
0
      OUTS (outf, dregs (dst0));
4057
0
      OUTS (outf, " = LSHIFT ");
4058
0
      OUTS (outf, dregs (src1));
4059
0
      OUTS (outf, " BY ");
4060
0
      OUTS (outf, dregs_lo (src0));
4061
0
      OUTS (outf, " (V)");
4062
0
    }
4063
0
  else if (sop == 0 && sopcde == 4)
4064
0
    {
4065
0
      OUTS (outf, dregs (dst0));
4066
0
      OUTS (outf, " = PACK (");
4067
0
      OUTS (outf, dregs_lo (src1));
4068
0
      OUTS (outf, ", ");
4069
0
      OUTS (outf, dregs_lo (src0));
4070
0
      OUTS (outf, ")");
4071
0
    }
4072
0
  else if (sop == 1 && sopcde == 4)
4073
0
    {
4074
0
      OUTS (outf, dregs (dst0));
4075
0
      OUTS (outf, " = PACK (");
4076
0
      OUTS (outf, dregs_lo (src1));
4077
0
      OUTS (outf, ", ");
4078
0
      OUTS (outf, dregs_hi (src0));
4079
0
      OUTS (outf, ")");
4080
0
    }
4081
0
  else if (sop == 2 && sopcde == 4)
4082
0
    {
4083
0
      OUTS (outf, dregs (dst0));
4084
0
      OUTS (outf, " = PACK (");
4085
0
      OUTS (outf, dregs_hi (src1));
4086
0
      OUTS (outf, ", ");
4087
0
      OUTS (outf, dregs_lo (src0));
4088
0
      OUTS (outf, ")");
4089
0
    }
4090
0
  else if (sop == 3 && sopcde == 4)
4091
0
    {
4092
0
      OUTS (outf, dregs (dst0));
4093
0
      OUTS (outf, " = PACK (");
4094
0
      OUTS (outf, dregs_hi (src1));
4095
0
      OUTS (outf, ", ");
4096
0
      OUTS (outf, dregs_hi (src0));
4097
0
      OUTS (outf, ")");
4098
0
    }
4099
0
  else if (sop == 0 && sopcde == 5)
4100
0
    {
4101
0
      OUTS (outf, dregs_lo (dst0));
4102
0
      OUTS (outf, " = SIGNBITS ");
4103
0
      OUTS (outf, dregs (src1));
4104
0
    }
4105
0
  else if (sop == 1 && sopcde == 5)
4106
0
    {
4107
0
      OUTS (outf, dregs_lo (dst0));
4108
0
      OUTS (outf, " = SIGNBITS ");
4109
0
      OUTS (outf, dregs_lo (src1));
4110
0
    }
4111
0
  else if (sop == 2 && sopcde == 5)
4112
0
    {
4113
0
      OUTS (outf, dregs_lo (dst0));
4114
0
      OUTS (outf, " = SIGNBITS ");
4115
0
      OUTS (outf, dregs_hi (src1));
4116
0
    }
4117
0
  else if (sop == 0 && sopcde == 6)
4118
0
    {
4119
0
      OUTS (outf, dregs_lo (dst0));
4120
0
      OUTS (outf, " = SIGNBITS A0");
4121
0
    }
4122
0
  else if (sop == 1 && sopcde == 6)
4123
0
    {
4124
0
      OUTS (outf, dregs_lo (dst0));
4125
0
      OUTS (outf, " = SIGNBITS A1");
4126
0
    }
4127
0
  else if (sop == 3 && sopcde == 6)
4128
0
    {
4129
0
      OUTS (outf, dregs_lo (dst0));
4130
0
      OUTS (outf, " = ONES ");
4131
0
      OUTS (outf, dregs (src1));
4132
0
    }
4133
0
  else if (sop == 0 && sopcde == 7)
4134
0
    {
4135
0
      OUTS (outf, dregs_lo (dst0));
4136
0
      OUTS (outf, " = EXPADJ (");
4137
0
      OUTS (outf, dregs (src1));
4138
0
      OUTS (outf, ", ");
4139
0
      OUTS (outf, dregs_lo (src0));
4140
0
      OUTS (outf, ")");
4141
0
    }
4142
0
  else if (sop == 1 && sopcde == 7)
4143
0
    {
4144
0
      OUTS (outf, dregs_lo (dst0));
4145
0
      OUTS (outf, " = EXPADJ (");
4146
0
      OUTS (outf, dregs (src1));
4147
0
      OUTS (outf, ", ");
4148
0
      OUTS (outf, dregs_lo (src0));
4149
0
      OUTS (outf, ") (V)");
4150
0
    }
4151
0
  else if (sop == 2 && sopcde == 7)
4152
0
    {
4153
0
      OUTS (outf, dregs_lo (dst0));
4154
0
      OUTS (outf, " = EXPADJ (");
4155
0
      OUTS (outf, dregs_lo (src1));
4156
0
      OUTS (outf, ", ");
4157
0
      OUTS (outf, dregs_lo (src0));
4158
0
      OUTS (outf, ")");
4159
0
    }
4160
0
  else if (sop == 3 && sopcde == 7)
4161
0
    {
4162
0
      OUTS (outf, dregs_lo (dst0));
4163
0
      OUTS (outf, " = EXPADJ (");
4164
0
      OUTS (outf, dregs_hi (src1));
4165
0
      OUTS (outf, ", ");
4166
0
      OUTS (outf, dregs_lo (src0));
4167
0
      OUTS (outf, ")");
4168
0
    }
4169
0
  else if (sop == 0 && sopcde == 8)
4170
0
    {
4171
0
      OUTS (outf, "BITMUX (");
4172
0
      OUTS (outf, dregs (src0));
4173
0
      OUTS (outf, ", ");
4174
0
      OUTS (outf, dregs (src1));
4175
0
      OUTS (outf, ", A0) (ASR)");
4176
0
    }
4177
0
  else if (sop == 1 && sopcde == 8)
4178
0
    {
4179
0
      OUTS (outf, "BITMUX (");
4180
0
      OUTS (outf, dregs (src0));
4181
0
      OUTS (outf, ", ");
4182
0
      OUTS (outf, dregs (src1));
4183
0
      OUTS (outf, ", A0) (ASL)");
4184
0
    }
4185
0
  else if (sop == 0 && sopcde == 9)
4186
0
    {
4187
0
      OUTS (outf, dregs_lo (dst0));
4188
0
      OUTS (outf, " = VIT_MAX (");
4189
0
      OUTS (outf, dregs (src1));
4190
0
      OUTS (outf, ") (ASL)");
4191
0
    }
4192
0
  else if (sop == 1 && sopcde == 9)
4193
0
    {
4194
0
      OUTS (outf, dregs_lo (dst0));
4195
0
      OUTS (outf, " = VIT_MAX (");
4196
0
      OUTS (outf, dregs (src1));
4197
0
      OUTS (outf, ") (ASR)");
4198
0
    }
4199
0
  else if (sop == 2 && sopcde == 9)
4200
0
    {
4201
0
      OUTS (outf, dregs (dst0));
4202
0
      OUTS (outf, " = VIT_MAX (");
4203
0
      OUTS (outf, dregs (src1));
4204
0
      OUTS (outf, ", ");
4205
0
      OUTS (outf, dregs (src0));
4206
0
      OUTS (outf, ") (ASL)");
4207
0
    }
4208
0
  else if (sop == 3 && sopcde == 9)
4209
0
    {
4210
0
      OUTS (outf, dregs (dst0));
4211
0
      OUTS (outf, " = VIT_MAX (");
4212
0
      OUTS (outf, dregs (src1));
4213
0
      OUTS (outf, ", ");
4214
0
      OUTS (outf, dregs (src0));
4215
0
      OUTS (outf, ") (ASR)");
4216
0
    }
4217
0
  else if (sop == 0 && sopcde == 10)
4218
0
    {
4219
0
      OUTS (outf, dregs (dst0));
4220
0
      OUTS (outf, " = EXTRACT (");
4221
0
      OUTS (outf, dregs (src1));
4222
0
      OUTS (outf, ", ");
4223
0
      OUTS (outf, dregs_lo (src0));
4224
0
      OUTS (outf, ") (Z)");
4225
0
    }
4226
0
  else if (sop == 1 && sopcde == 10)
4227
0
    {
4228
0
      OUTS (outf, dregs (dst0));
4229
0
      OUTS (outf, " = EXTRACT (");
4230
0
      OUTS (outf, dregs (src1));
4231
0
      OUTS (outf, ", ");
4232
0
      OUTS (outf, dregs_lo (src0));
4233
0
      OUTS (outf, ") (X)");
4234
0
    }
4235
0
  else if (sop == 2 && sopcde == 10)
4236
0
    {
4237
0
      OUTS (outf, dregs (dst0));
4238
0
      OUTS (outf, " = DEPOSIT (");
4239
0
      OUTS (outf, dregs (src1));
4240
0
      OUTS (outf, ", ");
4241
0
      OUTS (outf, dregs (src0));
4242
0
      OUTS (outf, ")");
4243
0
    }
4244
0
  else if (sop == 3 && sopcde == 10)
4245
0
    {
4246
0
      OUTS (outf, dregs (dst0));
4247
0
      OUTS (outf, " = DEPOSIT (");
4248
0
      OUTS (outf, dregs (src1));
4249
0
      OUTS (outf, ", ");
4250
0
      OUTS (outf, dregs (src0));
4251
0
      OUTS (outf, ") (X)");
4252
0
    }
4253
0
  else if (sop == 0 && sopcde == 11)
4254
0
    {
4255
0
      OUTS (outf, dregs_lo (dst0));
4256
0
      OUTS (outf, " = CC = BXORSHIFT (A0, ");
4257
0
      OUTS (outf, dregs (src0));
4258
0
      OUTS (outf, ")");
4259
0
    }
4260
0
  else if (sop == 1 && sopcde == 11)
4261
0
    {
4262
0
      OUTS (outf, dregs_lo (dst0));
4263
0
      OUTS (outf, " = CC = BXOR (A0, ");
4264
0
      OUTS (outf, dregs (src0));
4265
0
      OUTS (outf, ")");
4266
0
    }
4267
0
  else if (sop == 0 && sopcde == 12)
4268
0
    OUTS (outf, "A0 = BXORSHIFT (A0, A1, CC)");
4269
4270
0
  else if (sop == 1 && sopcde == 12)
4271
0
    {
4272
0
      OUTS (outf, dregs_lo (dst0));
4273
0
      OUTS (outf, " = CC = BXOR (A0, A1, CC)");
4274
0
    }
4275
0
  else if (sop == 0 && sopcde == 13)
4276
0
    {
4277
0
      OUTS (outf, dregs (dst0));
4278
0
      OUTS (outf, " = ALIGN8 (");
4279
0
      OUTS (outf, dregs (src1));
4280
0
      OUTS (outf, ", ");
4281
0
      OUTS (outf, dregs (src0));
4282
0
      OUTS (outf, ")");
4283
0
    }
4284
0
  else if (sop == 1 && sopcde == 13)
4285
0
    {
4286
0
      OUTS (outf, dregs (dst0));
4287
0
      OUTS (outf, " = ALIGN16 (");
4288
0
      OUTS (outf, dregs (src1));
4289
0
      OUTS (outf, ", ");
4290
0
      OUTS (outf, dregs (src0));
4291
0
      OUTS (outf, ")");
4292
0
    }
4293
0
  else if (sop == 2 && sopcde == 13)
4294
0
    {
4295
0
      OUTS (outf, dregs (dst0));
4296
0
      OUTS (outf, " = ALIGN24 (");
4297
0
      OUTS (outf, dregs (src1));
4298
0
      OUTS (outf, ", ");
4299
0
      OUTS (outf, dregs (src0));
4300
0
      OUTS (outf, ")");
4301
0
    }
4302
0
  else
4303
0
    return 0;
4304
4305
0
  return 4;
4306
0
}
4307
4308
static int
4309
decode_dsp32shiftimm_0 (TIword iw0, TIword iw1, disassemble_info *outf)
4310
0
{
4311
  /* dsp32shiftimm
4312
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4313
     | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............|
4314
     |.sop...|.HLs...|.dst0......|.immag.................|.src1......|
4315
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
4316
0
  int src1     = ((iw1 >> DSP32ShiftImm_src1_bits) & DSP32ShiftImm_src1_mask);
4317
0
  int sop      = ((iw1 >> DSP32ShiftImm_sop_bits) & DSP32ShiftImm_sop_mask);
4318
0
  int bit8     = ((iw1 >> 8) & 0x1);
4319
0
  int immag    = ((iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
4320
0
  int newimmag = (-(iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
4321
0
  int dst0     = ((iw1 >> DSP32ShiftImm_dst0_bits) & DSP32ShiftImm_dst0_mask);
4322
0
  int sopcde   = ((iw0 >> (DSP32ShiftImm_sopcde_bits - 16)) & DSP32ShiftImm_sopcde_mask);
4323
0
  int HLs      = ((iw1 >> DSP32ShiftImm_HLs_bits) & DSP32ShiftImm_HLs_mask);
4324
4325
0
  if (sop == 0 && sopcde == 0)
4326
0
    {
4327
0
      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4328
0
      OUTS (outf, " = ");
4329
0
      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4330
0
      OUTS (outf, " >>> ");
4331
0
      OUTS (outf, uimm4 (newimmag));
4332
0
    }
4333
0
  else if (sop == 1 && sopcde == 0 && bit8 == 0)
4334
0
    {
4335
0
      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4336
0
      OUTS (outf, " = ");
4337
0
      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4338
0
      OUTS (outf, " << ");
4339
0
      OUTS (outf, uimm4 (immag));
4340
0
      OUTS (outf, " (S)");
4341
0
    }
4342
0
  else if (sop == 1 && sopcde == 0 && bit8 == 1)
4343
0
    {
4344
0
      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4345
0
      OUTS (outf, " = ");
4346
0
      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4347
0
      OUTS (outf, " >>> ");
4348
0
      OUTS (outf, uimm4 (newimmag));
4349
0
      OUTS (outf, " (S)");
4350
0
    }
4351
0
  else if (sop == 2 && sopcde == 0 && bit8 == 0)
4352
0
    {
4353
0
      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4354
0
      OUTS (outf, " = ");
4355
0
      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4356
0
      OUTS (outf, " << ");
4357
0
      OUTS (outf, uimm4 (immag));
4358
0
    }
4359
0
  else if (sop == 2 && sopcde == 0 && bit8 == 1)
4360
0
    {
4361
0
      OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4362
0
      OUTS (outf, " = ");
4363
0
      OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4364
0
      OUTS (outf, " >> ");
4365
0
      OUTS (outf, uimm4 (newimmag));
4366
0
    }
4367
0
  else if (sop == 2 && sopcde == 3 && HLs == 1)
4368
0
    {
4369
0
      OUTS (outf, "A1 = ROT A1 BY ");
4370
0
      OUTS (outf, imm6 (immag));
4371
0
    }
4372
0
  else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 0)
4373
0
    {
4374
0
      OUTS (outf, "A0 = A0 << ");
4375
0
      OUTS (outf, uimm5 (immag));
4376
0
    }
4377
0
  else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 1)
4378
0
    {
4379
0
      OUTS (outf, "A0 = A0 >>> ");
4380
0
      OUTS (outf, uimm5 (newimmag));
4381
0
    }
4382
0
  else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 0)
4383
0
    {
4384
0
      OUTS (outf, "A1 = A1 << ");
4385
0
      OUTS (outf, uimm5 (immag));
4386
0
    }
4387
0
  else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 1)
4388
0
    {
4389
0
      OUTS (outf, "A1 = A1 >>> ");
4390
0
      OUTS (outf, uimm5 (newimmag));
4391
0
    }
4392
0
  else if (sop == 1 && sopcde == 3 && HLs == 0)
4393
0
    {
4394
0
      OUTS (outf, "A0 = A0 >> ");
4395
0
      OUTS (outf, uimm5 (newimmag));
4396
0
    }
4397
0
  else if (sop == 1 && sopcde == 3 && HLs == 1)
4398
0
    {
4399
0
      OUTS (outf, "A1 = A1 >> ");
4400
0
      OUTS (outf, uimm5 (newimmag));
4401
0
    }
4402
0
  else if (sop == 2 && sopcde == 3 && HLs == 0)
4403
0
    {
4404
0
      OUTS (outf, "A0 = ROT A0 BY ");
4405
0
      OUTS (outf, imm6 (immag));
4406
0
    }
4407
0
  else if (sop == 1 && sopcde == 1 && bit8 == 0)
4408
0
    {
4409
0
      OUTS (outf, dregs (dst0));
4410
0
      OUTS (outf, " = ");
4411
0
      OUTS (outf, dregs (src1));
4412
0
      OUTS (outf, " << ");
4413
0
      OUTS (outf, uimm5 (immag));
4414
0
      OUTS (outf, " (V, S)");
4415
0
    }
4416
0
  else if (sop == 1 && sopcde == 1 && bit8 == 1)
4417
0
    {
4418
0
      OUTS (outf, dregs (dst0));
4419
0
      OUTS (outf, " = ");
4420
0
      OUTS (outf, dregs (src1));
4421
0
      OUTS (outf, " >>> ");
4422
0
      OUTS (outf, imm5 (-immag));
4423
0
      OUTS (outf, " (V, S)");
4424
0
    }
4425
0
  else if (sop == 2 && sopcde == 1 && bit8 == 1)
4426
0
    {
4427
0
      OUTS (outf, dregs (dst0));
4428
0
      OUTS (outf, " = ");
4429
0
      OUTS (outf, dregs (src1));
4430
0
      OUTS (outf, " >> ");
4431
0
      OUTS (outf, uimm5 (newimmag));
4432
0
      OUTS (outf, " (V)");
4433
0
    }
4434
0
  else if (sop == 2 && sopcde == 1 && bit8 == 0)
4435
0
    {
4436
0
      OUTS (outf, dregs (dst0));
4437
0
      OUTS (outf, " = ");
4438
0
      OUTS (outf, dregs (src1));
4439
0
      OUTS (outf, " << ");
4440
0
      OUTS (outf, imm5 (immag));
4441
0
      OUTS (outf, " (V)");
4442
0
    }
4443
0
  else if (sop == 0 && sopcde == 1)
4444
0
    {
4445
0
      OUTS (outf, dregs (dst0));
4446
0
      OUTS (outf, " = ");
4447
0
      OUTS (outf, dregs (src1));
4448
0
      OUTS (outf, " >>> ");
4449
0
      OUTS (outf, uimm5 (newimmag));
4450
0
      OUTS (outf, " (V)");
4451
0
    }
4452
0
  else if (sop == 1 && sopcde == 2)
4453
0
    {
4454
0
      OUTS (outf, dregs (dst0));
4455
0
      OUTS (outf, " = ");
4456
0
      OUTS (outf, dregs (src1));
4457
0
      OUTS (outf, " << ");
4458
0
      OUTS (outf, uimm5 (immag));
4459
0
      OUTS (outf, " (S)");
4460
0
    }
4461
0
  else if (sop == 2 && sopcde == 2 && bit8 == 1)
4462
0
    {
4463
0
      OUTS (outf, dregs (dst0));
4464
0
      OUTS (outf, " = ");
4465
0
      OUTS (outf, dregs (src1));
4466
0
      OUTS (outf, " >> ");
4467
0
      OUTS (outf, uimm5 (newimmag));
4468
0
    }
4469
0
  else if (sop == 2 && sopcde == 2 && bit8 == 0)
4470
0
    {
4471
0
      OUTS (outf, dregs (dst0));
4472
0
      OUTS (outf, " = ");
4473
0
      OUTS (outf, dregs (src1));
4474
0
      OUTS (outf, " << ");
4475
0
      OUTS (outf, uimm5 (immag));
4476
0
    }
4477
0
  else if (sop == 3 && sopcde == 2)
4478
0
    {
4479
0
      OUTS (outf, dregs (dst0));
4480
0
      OUTS (outf, " = ROT ");
4481
0
      OUTS (outf, dregs (src1));
4482
0
      OUTS (outf, " BY ");
4483
0
      OUTS (outf, imm6 (immag));
4484
0
    }
4485
0
  else if (sop == 0 && sopcde == 2)
4486
0
    {
4487
0
      OUTS (outf, dregs (dst0));
4488
0
      OUTS (outf, " = ");
4489
0
      OUTS (outf, dregs (src1));
4490
0
      OUTS (outf, " >>> ");
4491
0
      OUTS (outf, uimm5 (newimmag));
4492
0
    }
4493
0
  else
4494
0
    return 0;
4495
4496
0
  return 4;
4497
0
}
4498
4499
static int
4500
decode_pseudoDEBUG_0 (TIword iw0, disassemble_info *outf)
4501
0
{
4502
0
  struct private *priv = outf->private_data;
4503
  /* pseudoDEBUG
4504
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4505
     | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |.fn....|.grp.......|.reg.......|
4506
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
4507
0
  int fn  = ((iw0 >> PseudoDbg_fn_bits) & PseudoDbg_fn_mask);
4508
0
  int grp = ((iw0 >> PseudoDbg_grp_bits) & PseudoDbg_grp_mask);
4509
0
  int reg = ((iw0 >> PseudoDbg_reg_bits) & PseudoDbg_reg_mask);
4510
4511
0
  if (priv->parallel)
4512
0
    return 0;
4513
4514
0
  if (reg == 0 && fn == 3)
4515
0
    OUTS (outf, "DBG A0");
4516
4517
0
  else if (reg == 1 && fn == 3)
4518
0
    OUTS (outf, "DBG A1");
4519
4520
0
  else if (reg == 3 && fn == 3)
4521
0
    OUTS (outf, "ABORT");
4522
4523
0
  else if (reg == 4 && fn == 3)
4524
0
    OUTS (outf, "HLT");
4525
4526
0
  else if (reg == 5 && fn == 3)
4527
0
    OUTS (outf, "DBGHALT");
4528
4529
0
  else if (reg == 6 && fn == 3)
4530
0
    {
4531
0
      OUTS (outf, "DBGCMPLX (");
4532
0
      OUTS (outf, dregs (grp));
4533
0
      OUTS (outf, ")");
4534
0
    }
4535
0
  else if (reg == 7 && fn == 3)
4536
0
    OUTS (outf, "DBG");
4537
4538
0
  else if (grp == 0 && fn == 2)
4539
0
    {
4540
0
      OUTS (outf, "OUTC ");
4541
0
      OUTS (outf, dregs (reg));
4542
0
    }
4543
0
  else if (fn == 0)
4544
0
    {
4545
0
      OUTS (outf, "DBG ");
4546
0
      OUTS (outf, allregs (reg, grp));
4547
0
    }
4548
0
  else if (fn == 1)
4549
0
    {
4550
0
      OUTS (outf, "PRNT ");
4551
0
      OUTS (outf, allregs (reg, grp));
4552
0
    }
4553
0
  else
4554
0
    return 0;
4555
4556
0
  return 2;
4557
0
}
4558
4559
static int
4560
decode_pseudoOChar_0 (TIword iw0, disassemble_info *outf)
4561
0
{
4562
0
  struct private *priv = outf->private_data;
4563
  /* psedoOChar
4564
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4565
     | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |.ch............................|
4566
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
4567
0
  int ch = ((iw0 >> PseudoChr_ch_bits) & PseudoChr_ch_mask);
4568
4569
0
  if (priv->parallel)
4570
0
    return 0;
4571
4572
0
  OUTS (outf, "OUTC ");
4573
0
  OUTS (outf, uimm8 (ch));
4574
4575
0
  return 2;
4576
0
}
4577
4578
static int
4579
decode_pseudodbg_assert_0 (TIword iw0, TIword iw1, disassemble_info *outf)
4580
0
{
4581
0
  struct private *priv = outf->private_data;
4582
  /* pseudodbg_assert
4583
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4584
     | 1 | 1 | 1 | 1 | 0 | - | - | - | dbgop |.grp.......|.regtest...|
4585
     |.expected......................................................|
4586
     +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+  */
4587
0
  int expected = ((iw1 >> PseudoDbg_Assert_expected_bits) & PseudoDbg_Assert_expected_mask);
4588
0
  int dbgop    = ((iw0 >> (PseudoDbg_Assert_dbgop_bits - 16)) & PseudoDbg_Assert_dbgop_mask);
4589
0
  int grp      = ((iw0 >> (PseudoDbg_Assert_grp_bits - 16)) & PseudoDbg_Assert_grp_mask);
4590
0
  int regtest  = ((iw0 >> (PseudoDbg_Assert_regtest_bits - 16)) & PseudoDbg_Assert_regtest_mask);
4591
4592
0
  if (priv->parallel)
4593
0
    return 0;
4594
4595
0
  if (dbgop == 0)
4596
0
    {
4597
0
      OUTS (outf, "DBGA (");
4598
0
      OUTS (outf, regs_lo (regtest, grp));
4599
0
      OUTS (outf, ", ");
4600
0
      OUTS (outf, uimm16 (expected));
4601
0
      OUTS (outf, ")");
4602
0
    }
4603
0
  else if (dbgop == 1)
4604
0
    {
4605
0
      OUTS (outf, "DBGA (");
4606
0
      OUTS (outf, regs_hi (regtest, grp));
4607
0
      OUTS (outf, ", ");
4608
0
      OUTS (outf, uimm16 (expected));
4609
0
      OUTS (outf, ")");
4610
0
    }
4611
0
  else if (dbgop == 2)
4612
0
    {
4613
0
      OUTS (outf, "DBGAL (");
4614
0
      OUTS (outf, allregs (regtest, grp));
4615
0
      OUTS (outf, ", ");
4616
0
      OUTS (outf, uimm16 (expected));
4617
0
      OUTS (outf, ")");
4618
0
    }
4619
0
  else if (dbgop == 3)
4620
0
    {
4621
0
      OUTS (outf, "DBGAH (");
4622
0
      OUTS (outf, allregs (regtest, grp));
4623
0
      OUTS (outf, ", ");
4624
0
      OUTS (outf, uimm16 (expected));
4625
0
      OUTS (outf, ")");
4626
0
    }
4627
0
  else
4628
0
    return 0;
4629
0
  return 4;
4630
0
}
4631
4632
static int
4633
ifetch (bfd_vma pc, disassemble_info *outf, TIword *iw)
4634
0
{
4635
0
  bfd_byte buf[2];
4636
0
  int status;
4637
4638
0
  status = (*outf->read_memory_func) (pc, buf, 2, outf);
4639
0
  if (status != 0)
4640
0
    {
4641
0
      (*outf->memory_error_func) (status, pc, outf);
4642
0
      return -1;
4643
0
    }
4644
4645
0
  *iw = bfd_getl16 (buf);
4646
0
  return 0;
4647
0
}
4648
4649
static int
4650
_print_insn_bfin (bfd_vma pc, disassemble_info *outf)
4651
0
{
4652
0
  struct private *priv = outf->private_data;
4653
0
  TIword iw0;
4654
0
  TIword iw1;
4655
0
  int rv = 0;
4656
4657
  /* The PC must be 16-bit aligned.  */
4658
0
  if (pc & 1)
4659
0
    {
4660
0
      OUTS (outf, "ILLEGAL (UNALIGNED)");
4661
      /* For people dumping data, just re-align the return value.  */
4662
0
      return 1;
4663
0
    }
4664
4665
0
  if (ifetch (pc, outf, &iw0))
4666
0
    return -1;
4667
0
  priv->iw0 = iw0;
4668
4669
0
  if (((iw0 & 0xc000) == 0xc000) && ((iw0 & 0xff00) != 0xf800))
4670
0
    {
4671
      /* 32-bit insn.  */
4672
0
      if (ifetch (pc + 2, outf, &iw1))
4673
0
  return -1;
4674
0
    }
4675
0
  else
4676
    /* 16-bit insn.  */
4677
0
    iw1 = 0;
4678
4679
0
  if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
4680
0
    {
4681
0
      if (priv->parallel)
4682
0
  {
4683
0
    OUTS (outf, "ILLEGAL");
4684
0
    return 0;
4685
0
  }
4686
0
      OUTS (outf, "MNOP");
4687
0
      return 4;
4688
0
    }
4689
0
  else if ((iw0 & 0xff00) == 0x0000)
4690
0
    rv = decode_ProgCtrl_0 (iw0, outf);
4691
0
  else if ((iw0 & 0xffc0) == 0x0240)
4692
0
    rv = decode_CaCTRL_0 (iw0, outf);
4693
0
  else if ((iw0 & 0xff80) == 0x0100)
4694
0
    rv = decode_PushPopReg_0 (iw0, outf);
4695
0
  else if ((iw0 & 0xfe00) == 0x0400)
4696
0
    rv = decode_PushPopMultiple_0 (iw0, outf);
4697
0
  else if ((iw0 & 0xfe00) == 0x0600)
4698
0
    rv = decode_ccMV_0 (iw0, outf);
4699
0
  else if ((iw0 & 0xf800) == 0x0800)
4700
0
    rv = decode_CCflag_0 (iw0, outf);
4701
0
  else if ((iw0 & 0xffe0) == 0x0200)
4702
0
    rv = decode_CC2dreg_0 (iw0, outf);
4703
0
  else if ((iw0 & 0xff00) == 0x0300)
4704
0
    rv = decode_CC2stat_0 (iw0, outf);
4705
0
  else if ((iw0 & 0xf000) == 0x1000)
4706
0
    rv = decode_BRCC_0 (iw0, pc, outf);
4707
0
  else if ((iw0 & 0xf000) == 0x2000)
4708
0
    rv = decode_UJUMP_0 (iw0, pc, outf);
4709
0
  else if ((iw0 & 0xf000) == 0x3000)
4710
0
    rv = decode_REGMV_0 (iw0, outf);
4711
0
  else if ((iw0 & 0xfc00) == 0x4000)
4712
0
    rv = decode_ALU2op_0 (iw0, outf);
4713
0
  else if ((iw0 & 0xfe00) == 0x4400)
4714
0
    rv = decode_PTR2op_0 (iw0, outf);
4715
0
  else if ((iw0 & 0xf800) == 0x4800)
4716
0
    rv = decode_LOGI2op_0 (iw0, outf);
4717
0
  else if ((iw0 & 0xf000) == 0x5000)
4718
0
    rv = decode_COMP3op_0 (iw0, outf);
4719
0
  else if ((iw0 & 0xf800) == 0x6000)
4720
0
    rv = decode_COMPI2opD_0 (iw0, outf);
4721
0
  else if ((iw0 & 0xf800) == 0x6800)
4722
0
    rv = decode_COMPI2opP_0 (iw0, outf);
4723
0
  else if ((iw0 & 0xf000) == 0x8000)
4724
0
    rv = decode_LDSTpmod_0 (iw0, outf);
4725
0
  else if ((iw0 & 0xff60) == 0x9e60)
4726
0
    rv = decode_dagMODim_0 (iw0, outf);
4727
0
  else if ((iw0 & 0xfff0) == 0x9f60)
4728
0
    rv = decode_dagMODik_0 (iw0, outf);
4729
0
  else if ((iw0 & 0xfc00) == 0x9c00)
4730
0
    rv = decode_dspLDST_0 (iw0, outf);
4731
0
  else if ((iw0 & 0xf000) == 0x9000)
4732
0
    rv = decode_LDST_0 (iw0, outf);
4733
0
  else if ((iw0 & 0xfc00) == 0xb800)
4734
0
    rv = decode_LDSTiiFP_0 (iw0, outf);
4735
0
  else if ((iw0 & 0xe000) == 0xA000)
4736
0
    rv = decode_LDSTii_0 (iw0, outf);
4737
0
  else if ((iw0 & 0xff80) == 0xe080 && (iw1 & 0x0C00) == 0x0000)
4738
0
    rv = decode_LoopSetup_0 (iw0, iw1, pc, outf);
4739
0
  else if ((iw0 & 0xff00) == 0xe100 && (iw1 & 0x0000) == 0x0000)
4740
0
    rv = decode_LDIMMhalf_0 (iw0, iw1, outf);
4741
0
  else if ((iw0 & 0xfe00) == 0xe200 && (iw1 & 0x0000) == 0x0000)
4742
0
    rv = decode_CALLa_0 (iw0, iw1, pc, outf);
4743
0
  else if ((iw0 & 0xfc00) == 0xe400 && (iw1 & 0x0000) == 0x0000)
4744
0
    rv = decode_LDSTidxI_0 (iw0, iw1, outf);
4745
0
  else if ((iw0 & 0xfffe) == 0xe800 && (iw1 & 0x0000) == 0x0000)
4746
0
    rv = decode_linkage_0 (iw0, iw1, outf);
4747
0
  else if ((iw0 & 0xf600) == 0xc000 && (iw1 & 0x0000) == 0x0000)
4748
0
    rv = decode_dsp32mac_0 (iw0, iw1, outf);
4749
0
  else if ((iw0 & 0xf600) == 0xc200 && (iw1 & 0x0000) == 0x0000)
4750
0
    rv = decode_dsp32mult_0 (iw0, iw1, outf);
4751
0
  else if ((iw0 & 0xf7c0) == 0xc400 && (iw1 & 0x0000) == 0x0000)
4752
0
    rv = decode_dsp32alu_0 (iw0, iw1, outf);
4753
0
  else if ((iw0 & 0xf780) == 0xc600 && (iw1 & 0x01c0) == 0x0000)
4754
0
    rv = decode_dsp32shift_0 (iw0, iw1, outf);
4755
0
  else if ((iw0 & 0xf780) == 0xc680 && (iw1 & 0x0000) == 0x0000)
4756
0
    rv = decode_dsp32shiftimm_0 (iw0, iw1, outf);
4757
0
  else if ((iw0 & 0xff00) == 0xf800)
4758
0
    rv = decode_pseudoDEBUG_0 (iw0, outf);
4759
0
  else if ((iw0 & 0xFF00) == 0xF900)
4760
0
    rv = decode_pseudoOChar_0 (iw0, outf);
4761
0
  else if ((iw0 & 0xFF00) == 0xf000 && (iw1 & 0x0000) == 0x0000)
4762
0
    rv = decode_pseudodbg_assert_0 (iw0, iw1, outf);
4763
4764
0
  if (rv == 0)
4765
0
    OUTS (outf, "ILLEGAL");
4766
4767
0
  return rv;
4768
0
}
4769
4770
int
4771
print_insn_bfin (bfd_vma pc, disassemble_info *outf)
4772
0
{
4773
0
  struct private priv;
4774
0
  int count;
4775
4776
0
  priv.parallel = false;
4777
0
  priv.comment = false;
4778
0
  outf->private_data = &priv;
4779
4780
0
  count = _print_insn_bfin (pc, outf);
4781
0
  if (count == -1)
4782
0
    return -1;
4783
4784
  /* Proper display of multiple issue instructions.  */
4785
4786
0
  if (count == 4 && (priv.iw0 & 0xc000) == 0xc000 && (priv.iw0 & BIT_MULTI_INS)
4787
0
      && ((priv.iw0 & 0xe800) != 0xe800 /* Not Linkage.  */ ))
4788
0
    {
4789
0
      bool legal = true;
4790
0
      int len;
4791
4792
0
      priv.parallel = true;
4793
0
      OUTS (outf, " || ");
4794
0
      len = _print_insn_bfin (pc + 4, outf);
4795
0
      if (len == -1)
4796
0
  return -1;
4797
0
      OUTS (outf, " || ");
4798
0
      if (len != 2)
4799
0
  legal = false;
4800
0
      len = _print_insn_bfin (pc + 6, outf);
4801
0
      if (len == -1)
4802
0
  return -1;
4803
0
      if (len != 2)
4804
0
  legal = false;
4805
4806
0
      if (legal)
4807
0
  count = 8;
4808
0
      else
4809
0
  {
4810
0
    OUTS (outf, ";\t\t/* ILLEGAL PARALLEL INSTRUCTION */");
4811
0
    priv.comment = true;
4812
0
    count = 0;
4813
0
  }
4814
0
    }
4815
4816
0
  if (!priv.comment)
4817
0
    OUTS (outf, ";");
4818
4819
0
  if (count == 0)
4820
0
    return 2;
4821
4822
0
  return count;
4823
0
}