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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-stable/] [binutils-2.20.1/] [opcodes/] [bfin-dis.c] - Blame information for rev 816

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

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

powered by: WebSVN 2.1.0

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