OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [opcodes/] [bfin-dis.c] - Blame information for rev 160

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.