1 /* Disassemble ADI Blackfin Instructions.
2 Copyright (C) 2005-2014 Free Software Foundation, Inc.
4 This file is part of libopcodes.
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)
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.
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. */
24 #include "opcode/bfin.h"
36 #define HOST_LONG_WORD_SIZE (sizeof (long) * 8)
37 #define XFIELD(w,p,s) (((w) & ((1 << (s)) - 1) << (p)) >> (p))
38 #define SIGNEXTEND(v, n) ((v << (HOST_LONG_WORD_SIZE - (n))) >> (HOST_LONG_WORD_SIZE - (n)))
39 #define MASKBITS(val, bits) (val & ((1 << bits) - 1))
43 typedef unsigned int bu32;
48 int comment, parallel;
53 c_0, c_1, c_4, c_2, c_uimm2, c_uimm3, c_imm3, c_pcrel4,
54 c_imm4, c_uimm4s4, c_uimm4s4d, c_uimm4, c_uimm4s2, c_negimm5s4, c_imm5, c_imm5d, c_uimm5, c_imm6,
55 c_imm7, c_imm7d, c_imm8, c_uimm8, c_pcrel8, c_uimm8s4, c_pcrel8s4, c_lppcrel10, c_pcrel10,
56 c_pcrel12, c_imm16s4, c_luimm16, c_imm16, c_imm16d, c_huimm16, c_rimm16, c_imm16s2, c_uimm16s4,
57 c_uimm16s4d, c_uimm16, c_pcrel24, c_uimm32, c_imm32, c_huimm32, c_huimm32e,
74 } constant_formats[] =
76 { "0", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
77 { "1", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
78 { "4", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
79 { "2", 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
80 { "uimm2", 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
81 { "uimm3", 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
82 { "imm3", 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
83 { "pcrel4", 4, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0},
84 { "imm4", 4, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
85 { "uimm4s4", 4, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0},
86 { "uimm4s4d", 4, 0, 0, 0, 2, 0, 0, 1, 1, 0, 0},
87 { "uimm4", 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
88 { "uimm4s2", 4, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0},
89 { "negimm5s4", 5, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0},
90 { "imm5", 5, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
91 { "imm5d", 5, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0},
92 { "uimm5", 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
93 { "imm6", 6, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
94 { "imm7", 7, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
95 { "imm7d", 7, 0, 1, 0, 0, 0, 0, 0, 1, 3, 0},
96 { "imm8", 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
97 { "uimm8", 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
98 { "pcrel8", 8, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0},
99 { "uimm8s4", 8, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
100 { "pcrel8s4", 8, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0},
101 { "lppcrel10", 10, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0},
102 { "pcrel10", 10, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
103 { "pcrel12", 12, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
104 { "imm16s4", 16, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0},
105 { "luimm16", 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
106 { "imm16", 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
107 { "imm16d", 16, 0, 1, 0, 0, 0, 0, 0, 1, 3, 0},
108 { "huimm16", 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
109 { "rimm16", 16, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0},
110 { "imm16s2", 16, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0},
111 { "uimm16s4", 16, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
112 { "uimm16s4d", 16, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0},
113 { "uimm16", 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
114 { "pcrel24", 24, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0},
115 { "uimm32", 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
116 { "imm32", 32, 0, 1, 0, 0, 0, 0, 0, 1, 3, 0},
117 { "huimm32", 32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
118 { "huimm32e", 32, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1},
122 fmtconst (const_forms_t cf, TIword x, bfd_vma pc, disassemble_info *outf)
126 if (constant_formats[cf].reloc)
128 bfd_vma ea = (((constant_formats[cf].pcrel ? SIGNEXTEND (x, constant_formats[cf].nbits)
129 : x) + constant_formats[cf].offset) << constant_formats[cf].scale);
130 if (constant_formats[cf].pcrel)
133 /* truncate to 32-bits for proper symbol lookup/matching */
136 if (outf->symbol_at_address_func (ea, outf) || !constant_formats[cf].exact)
138 outf->print_address_func (ea, outf);
143 sprintf (buf, "%lx", (unsigned long) x);
148 /* Negative constants have an implied sign bit. */
149 if (constant_formats[cf].negative)
151 int nb = constant_formats[cf].nbits + 1;
153 x = x | (1 << constant_formats[cf].nbits);
154 x = SIGNEXTEND (x, nb);
157 x = constant_formats[cf].issigned ? SIGNEXTEND (x, constant_formats[cf].nbits) : x;
159 if (constant_formats[cf].offset)
160 x += constant_formats[cf].offset;
162 if (constant_formats[cf].scale)
163 x <<= constant_formats[cf].scale;
165 if (constant_formats[cf].decimal)
166 sprintf (buf, "%*li", constant_formats[cf].leading, x);
169 if (constant_formats[cf].issigned && x < 0)
170 sprintf (buf, "-0x%x", abs (x));
172 sprintf (buf, "0x%lx", (unsigned long) x);
179 fmtconst_val (const_forms_t cf, unsigned int x, unsigned int pc)
181 if (0 && constant_formats[cf].reloc)
183 bu32 ea = (((constant_formats[cf].pcrel
184 ? SIGNEXTEND (x, constant_formats[cf].nbits)
185 : x) + constant_formats[cf].offset)
186 << constant_formats[cf].scale);
187 if (constant_formats[cf].pcrel)
193 /* Negative constants have an implied sign bit. */
194 if (constant_formats[cf].negative)
196 int nb = constant_formats[cf].nbits + 1;
197 x = x | (1 << constant_formats[cf].nbits);
198 x = SIGNEXTEND (x, nb);
200 else if (constant_formats[cf].issigned)
201 x = SIGNEXTEND (x, constant_formats[cf].nbits);
203 x += constant_formats[cf].offset;
204 x <<= constant_formats[cf].scale;
209 enum machine_registers
211 REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
212 REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
213 REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
214 REG_R1_0, REG_R3_2, REG_R5_4, REG_R7_6, REG_P0, REG_P1, REG_P2, REG_P3,
215 REG_P4, REG_P5, REG_SP, REG_FP, REG_A0x, REG_A1x, REG_A0w, REG_A1w,
216 REG_A0, REG_A1, REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1,
217 REG_M2, REG_M3, REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1,
219 REG_AZ, REG_AN, REG_AC0, REG_AC1, REG_AV0, REG_AV1, REG_AV0S, REG_AV1S,
220 REG_AQ, REG_V, REG_VS,
221 REG_sftreset, REG_omode, REG_excause, REG_emucause, REG_idle_req, REG_hwerrcause, REG_CC, REG_LC0,
222 REG_LC1, REG_ASTAT, REG_RETS, REG_LT0, REG_LB0, REG_LT1, REG_LB1,
223 REG_CYCLES, REG_CYCLES2, REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN,
224 REG_RETE, REG_EMUDAT, REG_BR0, REG_BR1, REG_BR2, REG_BR3, REG_BR4, REG_BR5, REG_BR6,
225 REG_BR7, REG_PL0, REG_PL1, REG_PL2, REG_PL3, REG_PL4, REG_PL5, REG_SLP, REG_FLP,
226 REG_PH0, REG_PH1, REG_PH2, REG_PH3, REG_PH4, REG_PH5, REG_SHP, REG_FHP,
227 REG_IL0, REG_IL1, REG_IL2, REG_IL3, REG_ML0, REG_ML1, REG_ML2, REG_ML3,
228 REG_BL0, REG_BL1, REG_BL2, REG_BL3, REG_LL0, REG_LL1, REG_LL2, REG_LL3,
229 REG_IH0, REG_IH1, REG_IH2, REG_IH3, REG_MH0, REG_MH1, REG_MH2, REG_MH3,
230 REG_BH0, REG_BH1, REG_BH2, REG_BH3, REG_LH0, REG_LH1, REG_LH2, REG_LH3,
231 REG_AC0_COPY, REG_V_COPY, REG_RND_MOD,
237 rc_dregs_lo, rc_dregs_hi, rc_dregs, rc_dregs_pair, rc_pregs, rc_spfp, rc_dregs_hilo, rc_accum_ext,
238 rc_accum_word, rc_accum, rc_iregs, rc_mregs, rc_bregs, rc_lregs, rc_dpregs, rc_gregs,
239 rc_regs, rc_statbits, rc_ignore_bits, rc_ccstat, rc_counters, rc_dregs2_sysregs1, rc_open, rc_sysregs2,
240 rc_sysregs3, rc_allregs,
244 static const char * const reg_names[] =
246 "R0.L", "R1.L", "R2.L", "R3.L", "R4.L", "R5.L", "R6.L", "R7.L",
247 "R0.H", "R1.H", "R2.H", "R3.H", "R4.H", "R5.H", "R6.H", "R7.H",
248 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
249 "R1:0", "R3:2", "R5:4", "R7:6", "P0", "P1", "P2", "P3",
250 "P4", "P5", "SP", "FP", "A0.X", "A1.X", "A0.W", "A1.W",
251 "A0", "A1", "I0", "I1", "I2", "I3", "M0", "M1",
252 "M2", "M3", "B0", "B1", "B2", "B3", "L0", "L1",
254 "AZ", "AN", "AC0", "AC1", "AV0", "AV1", "AV0S", "AV1S",
256 "sftreset", "omode", "excause", "emucause", "idle_req", "hwerrcause", "CC", "LC0",
257 "LC1", "ASTAT", "RETS", "LT0", "LB0", "LT1", "LB1",
258 "CYCLES", "CYCLES2", "USP", "SEQSTAT", "SYSCFG", "RETI", "RETX", "RETN",
260 "R0.B", "R1.B", "R2.B", "R3.B", "R4.B", "R5.B", "R6.B", "R7.B",
261 "P0.L", "P1.L", "P2.L", "P3.L", "P4.L", "P5.L", "SP.L", "FP.L",
262 "P0.H", "P1.H", "P2.H", "P3.H", "P4.H", "P5.H", "SP.H", "FP.H",
263 "I0.L", "I1.L", "I2.L", "I3.L", "M0.L", "M1.L", "M2.L", "M3.L",
264 "B0.L", "B1.L", "B2.L", "B3.L", "L0.L", "L1.L", "L2.L", "L3.L",
265 "I0.H", "I1.H", "I2.H", "I3.H", "M0.H", "M1.H", "M2.H", "M3.H",
266 "B0.H", "B1.H", "B2.H", "B3.H", "L0.H", "L1.H", "L2.H", "L3.H",
267 "AC0_COPY", "V_COPY", "RND_MOD",
272 #define REGNAME(x) ((x) < REG_LASTREG ? (reg_names[x]) : "...... Illegal register .......")
275 static const enum machine_registers decode_dregs_lo[] =
277 REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
280 #define dregs_lo(x) REGNAME (decode_dregs_lo[(x) & 7])
283 static const enum machine_registers decode_dregs_hi[] =
285 REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
288 #define dregs_hi(x) REGNAME (decode_dregs_hi[(x) & 7])
291 static const enum machine_registers decode_dregs[] =
293 REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
296 #define dregs(x) REGNAME (decode_dregs[(x) & 7])
299 static const enum machine_registers decode_dregs_byte[] =
301 REG_BR0, REG_BR1, REG_BR2, REG_BR3, REG_BR4, REG_BR5, REG_BR6, REG_BR7,
304 #define dregs_byte(x) REGNAME (decode_dregs_byte[(x) & 7])
307 static const enum machine_registers decode_pregs[] =
309 REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
312 #define pregs(x) REGNAME (decode_pregs[(x) & 7])
313 #define spfp(x) REGNAME (decode_spfp[(x) & 1])
314 #define dregs_hilo(x, i) REGNAME (decode_dregs_hilo[((i) << 3) | (x)])
315 #define accum_ext(x) REGNAME (decode_accum_ext[(x) & 1])
316 #define accum_word(x) REGNAME (decode_accum_word[(x) & 1])
317 #define accum(x) REGNAME (decode_accum[(x) & 1])
320 static const enum machine_registers decode_iregs[] =
322 REG_I0, REG_I1, REG_I2, REG_I3,
325 #define iregs(x) REGNAME (decode_iregs[(x) & 3])
328 static const enum machine_registers decode_mregs[] =
330 REG_M0, REG_M1, REG_M2, REG_M3,
333 #define mregs(x) REGNAME (decode_mregs[(x) & 3])
334 #define bregs(x) REGNAME (decode_bregs[(x) & 3])
335 #define lregs(x) REGNAME (decode_lregs[(x) & 3])
338 static const enum machine_registers decode_dpregs[] =
340 REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
341 REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
344 #define dpregs(x) REGNAME (decode_dpregs[(x) & 15])
347 static const enum machine_registers decode_gregs[] =
349 REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
350 REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
353 #define gregs(x, i) REGNAME (decode_gregs[((i) << 3) | (x)])
355 /* [dregs pregs (iregs mregs) (bregs lregs)]. */
356 static const enum machine_registers decode_regs[] =
358 REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
359 REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
360 REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
361 REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
364 #define regs(x, i) REGNAME (decode_regs[((i) << 3) | (x)])
366 /* [dregs pregs (iregs mregs) (bregs lregs) Low Half]. */
367 static const enum machine_registers decode_regs_lo[] =
369 REG_RL0, REG_RL1, REG_RL2, REG_RL3, REG_RL4, REG_RL5, REG_RL6, REG_RL7,
370 REG_PL0, REG_PL1, REG_PL2, REG_PL3, REG_PL4, REG_PL5, REG_SLP, REG_FLP,
371 REG_IL0, REG_IL1, REG_IL2, REG_IL3, REG_ML0, REG_ML1, REG_ML2, REG_ML3,
372 REG_BL0, REG_BL1, REG_BL2, REG_BL3, REG_LL0, REG_LL1, REG_LL2, REG_LL3,
375 #define regs_lo(x, i) REGNAME (decode_regs_lo[((i) << 3) | (x)])
377 /* [dregs pregs (iregs mregs) (bregs lregs) High Half]. */
378 static const enum machine_registers decode_regs_hi[] =
380 REG_RH0, REG_RH1, REG_RH2, REG_RH3, REG_RH4, REG_RH5, REG_RH6, REG_RH7,
381 REG_PH0, REG_PH1, REG_PH2, REG_PH3, REG_PH4, REG_PH5, REG_SHP, REG_FHP,
382 REG_IH0, REG_IH1, REG_IH2, REG_IH3, REG_MH0, REG_MH1, REG_MH2, REG_MH3,
383 REG_BH0, REG_BH1, REG_BH2, REG_BH3, REG_LH0, REG_LH1, REG_LH2, REG_LH3,
386 #define regs_hi(x, i) REGNAME (decode_regs_hi[((i) << 3) | (x)])
388 static const enum machine_registers decode_statbits[] =
390 REG_AZ, REG_AN, REG_AC0_COPY, REG_V_COPY,
391 REG_LASTREG, REG_LASTREG, REG_AQ, REG_LASTREG,
392 REG_RND_MOD, REG_LASTREG, REG_LASTREG, REG_LASTREG,
393 REG_AC0, REG_AC1, REG_LASTREG, REG_LASTREG,
394 REG_AV0, REG_AV0S, REG_AV1, REG_AV1S,
395 REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG,
396 REG_V, REG_VS, REG_LASTREG, REG_LASTREG,
397 REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG,
400 #define statbits(x) REGNAME (decode_statbits[(x) & 31])
403 static const enum machine_registers decode_counters[] =
408 #define counters(x) REGNAME (decode_counters[(x) & 1])
409 #define dregs2_sysregs1(x) REGNAME (decode_dregs2_sysregs1[(x) & 7])
411 /* [dregs pregs (iregs mregs) (bregs lregs)
412 dregs2_sysregs1 open sysregs2 sysregs3]. */
413 static const enum machine_registers decode_allregs[] =
415 REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
416 REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
417 REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
418 REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
419 REG_A0x, REG_A0w, REG_A1x, REG_A1w, REG_LASTREG, REG_LASTREG, REG_ASTAT, REG_RETS,
420 REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG, REG_LASTREG,
421 REG_LC0, REG_LT0, REG_LB0, REG_LC1, REG_LT1, REG_LB1, REG_CYCLES, REG_CYCLES2,
422 REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN, REG_RETE, REG_EMUDAT,
426 #define IS_DREG(g,r) ((g) == 0 && (r) < 8)
427 #define IS_PREG(g,r) ((g) == 1 && (r) < 8)
428 #define IS_AREG(g,r) ((g) == 4 && (r) >= 0 && (r) < 4)
429 #define IS_GENREG(g,r) ((((g) == 0 || (g) == 1) && (r) < 8) || IS_AREG (g, r))
430 #define IS_DAGREG(g,r) (((g) == 2 || (g) == 3) && (r) < 8)
431 #define IS_SYSREG(g,r) \
432 (((g) == 4 && ((r) == 6 || (r) == 7)) || (g) == 6 || (g) == 7)
433 #define IS_RESERVEDREG(g,r) \
434 (((r) > 7) || ((g) == 4 && ((r) == 4 || (r) == 5)) || (g) == 5)
436 #define allreg(r,g) (!IS_RESERVEDREG (g, r))
437 #define mostreg(r,g) (!(IS_DREG (g, r) || IS_PREG (g, r) || IS_RESERVEDREG (g, r)))
439 #define allregs(x, i) REGNAME (decode_allregs[((i) << 3) | (x)])
440 #define uimm16s4(x) fmtconst (c_uimm16s4, x, 0, outf)
441 #define uimm16s4d(x) fmtconst (c_uimm16s4d, x, 0, outf)
442 #define pcrel4(x) fmtconst (c_pcrel4, x, pc, outf)
443 #define pcrel8(x) fmtconst (c_pcrel8, x, pc, outf)
444 #define pcrel8s4(x) fmtconst (c_pcrel8s4, x, pc, outf)
445 #define pcrel10(x) fmtconst (c_pcrel10, x, pc, outf)
446 #define pcrel12(x) fmtconst (c_pcrel12, x, pc, outf)
447 #define negimm5s4(x) fmtconst (c_negimm5s4, x, 0, outf)
448 #define rimm16(x) fmtconst (c_rimm16, x, 0, outf)
449 #define huimm16(x) fmtconst (c_huimm16, x, 0, outf)
450 #define imm16(x) fmtconst (c_imm16, x, 0, outf)
451 #define imm16d(x) fmtconst (c_imm16d, x, 0, outf)
452 #define uimm2(x) fmtconst (c_uimm2, x, 0, outf)
453 #define uimm3(x) fmtconst (c_uimm3, x, 0, outf)
454 #define luimm16(x) fmtconst (c_luimm16, x, 0, outf)
455 #define uimm4(x) fmtconst (c_uimm4, x, 0, outf)
456 #define uimm5(x) fmtconst (c_uimm5, x, 0, outf)
457 #define imm16s2(x) fmtconst (c_imm16s2, x, 0, outf)
458 #define uimm8(x) fmtconst (c_uimm8, x, 0, outf)
459 #define imm16s4(x) fmtconst (c_imm16s4, x, 0, outf)
460 #define uimm4s2(x) fmtconst (c_uimm4s2, x, 0, outf)
461 #define uimm4s4(x) fmtconst (c_uimm4s4, x, 0, outf)
462 #define uimm4s4d(x) fmtconst (c_uimm4s4d, x, 0, outf)
463 #define lppcrel10(x) fmtconst (c_lppcrel10, x, pc, outf)
464 #define imm3(x) fmtconst (c_imm3, x, 0, outf)
465 #define imm4(x) fmtconst (c_imm4, x, 0, outf)
466 #define uimm8s4(x) fmtconst (c_uimm8s4, x, 0, outf)
467 #define imm5(x) fmtconst (c_imm5, x, 0, outf)
468 #define imm5d(x) fmtconst (c_imm5d, x, 0, outf)
469 #define imm6(x) fmtconst (c_imm6, x, 0, outf)
470 #define imm7(x) fmtconst (c_imm7, x, 0, outf)
471 #define imm7d(x) fmtconst (c_imm7d, x, 0, outf)
472 #define imm8(x) fmtconst (c_imm8, x, 0, outf)
473 #define pcrel24(x) fmtconst (c_pcrel24, x, pc, outf)
474 #define uimm16(x) fmtconst (c_uimm16, x, 0, outf)
475 #define uimm32(x) fmtconst (c_uimm32, x, 0, outf)
476 #define imm32(x) fmtconst (c_imm32, x, 0, outf)
477 #define huimm32(x) fmtconst (c_huimm32, x, 0, outf)
478 #define huimm32e(x) fmtconst (c_huimm32e, x, 0, outf)
479 #define imm7_val(x) fmtconst_val (c_imm7, x, 0)
480 #define imm16_val(x) fmtconst_val (c_uimm16, x, 0)
481 #define luimm16_val(x) fmtconst_val (c_luimm16, x, 0)
483 /* (arch.pm)arch_disassembler_functions. */
485 #define OUTS(p, txt) (p)->fprintf_func ((p)->stream, "%s", txt)
489 amod0 (int s0, int x0, disassemble_info *outf)
491 if (s0 == 1 && x0 == 0)
493 else if (s0 == 0 && x0 == 1)
494 OUTS (outf, " (CO)");
495 else if (s0 == 1 && x0 == 1)
496 OUTS (outf, " (SCO)");
500 amod1 (int s0, int x0, disassemble_info *outf)
502 if (s0 == 0 && x0 == 0)
503 OUTS (outf, " (NS)");
504 else if (s0 == 1 && x0 == 0)
509 amod0amod2 (int s0, int x0, int aop0, disassemble_info *outf)
511 if (s0 == 1 && x0 == 0 && aop0 == 0)
513 else if (s0 == 0 && x0 == 1 && aop0 == 0)
514 OUTS (outf, " (CO)");
515 else if (s0 == 1 && x0 == 1 && aop0 == 0)
516 OUTS (outf, " (SCO)");
517 else if (s0 == 0 && x0 == 0 && aop0 == 2)
518 OUTS (outf, " (ASR)");
519 else if (s0 == 1 && x0 == 0 && aop0 == 2)
520 OUTS (outf, " (S, ASR)");
521 else if (s0 == 0 && x0 == 1 && aop0 == 2)
522 OUTS (outf, " (CO, ASR)");
523 else if (s0 == 1 && x0 == 1 && aop0 == 2)
524 OUTS (outf, " (SCO, ASR)");
525 else if (s0 == 0 && x0 == 0 && aop0 == 3)
526 OUTS (outf, " (ASL)");
527 else if (s0 == 1 && x0 == 0 && aop0 == 3)
528 OUTS (outf, " (S, ASL)");
529 else if (s0 == 0 && x0 == 1 && aop0 == 3)
530 OUTS (outf, " (CO, ASL)");
531 else if (s0 == 1 && x0 == 1 && aop0 == 3)
532 OUTS (outf, " (SCO, ASL)");
536 searchmod (int r0, disassemble_info *outf)
549 aligndir (int r0, disassemble_info *outf)
556 decode_multfunc (int h0, int h1, int src0, int src1, disassemble_info *outf)
561 s0 = dregs_hi (src0);
563 s0 = dregs_lo (src0);
566 s1 = dregs_hi (src1);
568 s1 = dregs_lo (src1);
577 decode_macfunc (int which, int op, int h0, int h1, int src0, int src1, disassemble_info *outf)
580 const char *sop = "<unknown op>";
595 case 0: sop = " = "; break;
596 case 1: sop = " += "; break;
597 case 2: sop = " -= "; break;
603 decode_multfunc (h0, h1, src0, src1, outf);
609 decode_optmode (int mod, int MM, disassemble_info *outf)
611 if (mod == 0 && MM == 0)
626 OUTS (outf, "S2RND");
629 else if (mod == M_W32)
631 else if (mod == M_FU)
633 else if (mod == M_TFU)
635 else if (mod == M_IS)
637 else if (mod == M_ISS2)
639 else if (mod == M_IH)
641 else if (mod == M_IU)
649 static struct saved_state
651 bu32 dpregs[16], iregs[4], mregs[4], bregs[4], lregs[4];
653 bu32 lt[2], lc[2], lb[2];
657 #define DREG(x) (saved_state.dpregs[x])
658 #define GREG(x, i) DPREG ((x) | ((i) << 3))
659 #define DPREG(x) (saved_state.dpregs[x])
660 #define DREG(x) (saved_state.dpregs[x])
661 #define PREG(x) (saved_state.dpregs[(x) + 8])
662 #define SPREG PREG (6)
663 #define FPREG PREG (7)
664 #define IREG(x) (saved_state.iregs[x])
665 #define MREG(x) (saved_state.mregs[x])
666 #define BREG(x) (saved_state.bregs[x])
667 #define LREG(x) (saved_state.lregs[x])
668 #define AXREG(x) (saved_state.ax[x])
669 #define AWREG(x) (saved_state.aw[x])
670 #define LCREG(x) (saved_state.lc[x])
671 #define LTREG(x) (saved_state.lt[x])
672 #define LBREG(x) (saved_state.lb[x])
673 #define RETSREG (saved_state.rets)
676 get_allreg (int grp, int reg)
678 int fullreg = (grp << 3) | reg;
679 /* REG_R0, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
680 REG_P0, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
681 REG_I0, REG_I1, REG_I2, REG_I3, REG_M0, REG_M1, REG_M2, REG_M3,
682 REG_B0, REG_B1, REG_B2, REG_B3, REG_L0, REG_L1, REG_L2, REG_L3,
683 REG_A0x, REG_A0w, REG_A1x, REG_A1w, , , REG_ASTAT, REG_RETS,
685 REG_LC0, REG_LT0, REG_LB0, REG_LC1, REG_LT1, REG_LB1, REG_CYCLES,
687 REG_USP, REG_SEQSTAT, REG_SYSCFG, REG_RETI, REG_RETX, REG_RETN, REG_RETE,
689 switch (fullreg >> 2)
691 case 0: case 1: return &DREG (reg);
692 case 2: case 3: return &PREG (reg);
693 case 4: return &IREG (reg & 3);
694 case 5: return &MREG (reg & 3);
695 case 6: return &BREG (reg & 3);
696 case 7: return &LREG (reg & 3);
700 case 32: return &AXREG (0);
701 case 33: return &AWREG (0);
702 case 34: return &AXREG (1);
703 case 35: return &AWREG (1);
704 case 39: return &RETSREG;
705 case 48: return &LCREG (0);
706 case 49: return <REG (0);
707 case 50: return &LBREG (0);
708 case 51: return &LCREG (1);
709 case 52: return <REG (1);
710 case 53: return &LBREG (1);
717 decode_ProgCtrl_0 (TIword iw0, disassemble_info *outf)
719 struct private *priv = outf->private_data;
721 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
722 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.prgfunc.......|.poprnd........|
723 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
724 int poprnd = ((iw0 >> ProgCtrl_poprnd_bits) & ProgCtrl_poprnd_mask);
725 int prgfunc = ((iw0 >> ProgCtrl_prgfunc_bits) & ProgCtrl_prgfunc_mask);
727 if (prgfunc == 0 && poprnd == 0)
729 else if (priv->parallel)
731 else if (prgfunc == 1 && poprnd == 0)
733 else if (prgfunc == 1 && poprnd == 1)
735 else if (prgfunc == 1 && poprnd == 2)
737 else if (prgfunc == 1 && poprnd == 3)
739 else if (prgfunc == 1 && poprnd == 4)
741 else if (prgfunc == 2 && poprnd == 0)
743 else if (prgfunc == 2 && poprnd == 3)
744 OUTS (outf, "CSYNC");
745 else if (prgfunc == 2 && poprnd == 4)
746 OUTS (outf, "SSYNC");
747 else if (prgfunc == 2 && poprnd == 5)
748 OUTS (outf, "EMUEXCPT");
749 else if (prgfunc == 3 && IS_DREG (0, poprnd))
752 OUTS (outf, dregs (poprnd));
754 else if (prgfunc == 4 && IS_DREG (0, poprnd))
757 OUTS (outf, dregs (poprnd));
759 else if (prgfunc == 5 && IS_PREG (1, poprnd))
761 OUTS (outf, "JUMP (");
762 OUTS (outf, pregs (poprnd));
765 else if (prgfunc == 6 && IS_PREG (1, poprnd))
767 OUTS (outf, "CALL (");
768 OUTS (outf, pregs (poprnd));
771 else if (prgfunc == 7 && IS_PREG (1, poprnd))
773 OUTS (outf, "CALL (PC + ");
774 OUTS (outf, pregs (poprnd));
777 else if (prgfunc == 8 && IS_PREG (1, poprnd))
779 OUTS (outf, "JUMP (PC + ");
780 OUTS (outf, pregs (poprnd));
783 else if (prgfunc == 9)
785 OUTS (outf, "RAISE ");
786 OUTS (outf, uimm4 (poprnd));
788 else if (prgfunc == 10)
790 OUTS (outf, "EXCPT ");
791 OUTS (outf, uimm4 (poprnd));
793 else if (prgfunc == 11 && IS_PREG (1, poprnd) && poprnd <= 5)
795 OUTS (outf, "TESTSET (");
796 OUTS (outf, pregs (poprnd));
805 decode_CaCTRL_0 (TIword iw0, disassemble_info *outf)
807 struct private *priv = outf->private_data;
809 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
810 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |.a.|.op....|.reg.......|
811 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
812 int a = ((iw0 >> CaCTRL_a_bits) & CaCTRL_a_mask);
813 int op = ((iw0 >> CaCTRL_op_bits) & CaCTRL_op_mask);
814 int reg = ((iw0 >> CaCTRL_reg_bits) & CaCTRL_reg_mask);
819 if (a == 0 && op == 0)
821 OUTS (outf, "PREFETCH[");
822 OUTS (outf, pregs (reg));
825 else if (a == 0 && op == 1)
827 OUTS (outf, "FLUSHINV[");
828 OUTS (outf, pregs (reg));
831 else if (a == 0 && op == 2)
833 OUTS (outf, "FLUSH[");
834 OUTS (outf, pregs (reg));
837 else if (a == 0 && op == 3)
839 OUTS (outf, "IFLUSH[");
840 OUTS (outf, pregs (reg));
843 else if (a == 1 && op == 0)
845 OUTS (outf, "PREFETCH[");
846 OUTS (outf, pregs (reg));
849 else if (a == 1 && op == 1)
851 OUTS (outf, "FLUSHINV[");
852 OUTS (outf, pregs (reg));
855 else if (a == 1 && op == 2)
857 OUTS (outf, "FLUSH[");
858 OUTS (outf, pregs (reg));
861 else if (a == 1 && op == 3)
863 OUTS (outf, "IFLUSH[");
864 OUTS (outf, pregs (reg));
873 decode_PushPopReg_0 (TIword iw0, disassemble_info *outf)
875 struct private *priv = outf->private_data;
877 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
878 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.W.|.grp.......|.reg.......|
879 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
880 int W = ((iw0 >> PushPopReg_W_bits) & PushPopReg_W_mask);
881 int grp = ((iw0 >> PushPopReg_grp_bits) & PushPopReg_grp_mask);
882 int reg = ((iw0 >> PushPopReg_reg_bits) & PushPopReg_reg_mask);
887 if (W == 0 && mostreg (reg, grp))
889 OUTS (outf, allregs (reg, grp));
890 OUTS (outf, " = [SP++]");
892 else if (W == 1 && allreg (reg, grp) && !(grp == 1 && reg == 6))
894 OUTS (outf, "[--SP] = ");
895 OUTS (outf, allregs (reg, grp));
903 decode_PushPopMultiple_0 (TIword iw0, disassemble_info *outf)
905 struct private *priv = outf->private_data;
907 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
908 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |.d.|.p.|.W.|.dr........|.pr........|
909 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
910 int p = ((iw0 >> PushPopMultiple_p_bits) & PushPopMultiple_p_mask);
911 int d = ((iw0 >> PushPopMultiple_d_bits) & PushPopMultiple_d_mask);
912 int W = ((iw0 >> PushPopMultiple_W_bits) & PushPopMultiple_W_mask);
913 int dr = ((iw0 >> PushPopMultiple_dr_bits) & PushPopMultiple_dr_mask);
914 int pr = ((iw0 >> PushPopMultiple_pr_bits) & PushPopMultiple_pr_mask);
922 if (W == 1 && d == 1 && p == 1)
924 OUTS (outf, "[--SP] = (R7:");
925 OUTS (outf, imm5d (dr));
926 OUTS (outf, ", P5:");
927 OUTS (outf, imm5d (pr));
930 else if (W == 1 && d == 1 && p == 0 && pr == 0)
932 OUTS (outf, "[--SP] = (R7:");
933 OUTS (outf, imm5d (dr));
936 else if (W == 1 && d == 0 && p == 1 && dr == 0)
938 OUTS (outf, "[--SP] = (P5:");
939 OUTS (outf, imm5d (pr));
942 else if (W == 0 && d == 1 && p == 1)
945 OUTS (outf, imm5d (dr));
946 OUTS (outf, ", P5:");
947 OUTS (outf, imm5d (pr));
948 OUTS (outf, ") = [SP++]");
950 else if (W == 0 && d == 1 && p == 0 && pr == 0)
953 OUTS (outf, imm5d (dr));
954 OUTS (outf, ") = [SP++]");
956 else if (W == 0 && d == 0 && p == 1 && dr == 0)
959 OUTS (outf, imm5d (pr));
960 OUTS (outf, ") = [SP++]");
968 decode_ccMV_0 (TIword iw0, disassemble_info *outf)
970 struct private *priv = outf->private_data;
972 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
973 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.T.|.d.|.s.|.dst.......|.src.......|
974 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
975 int s = ((iw0 >> CCmv_s_bits) & CCmv_s_mask);
976 int d = ((iw0 >> CCmv_d_bits) & CCmv_d_mask);
977 int T = ((iw0 >> CCmv_T_bits) & CCmv_T_mask);
978 int src = ((iw0 >> CCmv_src_bits) & CCmv_src_mask);
979 int dst = ((iw0 >> CCmv_dst_bits) & CCmv_dst_mask);
986 OUTS (outf, "IF CC ");
987 OUTS (outf, gregs (dst, d));
989 OUTS (outf, gregs (src, s));
993 OUTS (outf, "IF !CC ");
994 OUTS (outf, gregs (dst, d));
996 OUTS (outf, gregs (src, s));
1004 decode_CCflag_0 (TIword iw0, disassemble_info *outf)
1006 struct private *priv = outf->private_data;
1008 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1009 | 0 | 0 | 0 | 0 | 1 |.I.|.opc.......|.G.|.y.........|.x.........|
1010 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1011 int x = ((iw0 >> CCflag_x_bits) & CCflag_x_mask);
1012 int y = ((iw0 >> CCflag_y_bits) & CCflag_y_mask);
1013 int I = ((iw0 >> CCflag_I_bits) & CCflag_I_mask);
1014 int G = ((iw0 >> CCflag_G_bits) & CCflag_G_mask);
1015 int opc = ((iw0 >> CCflag_opc_bits) & CCflag_opc_mask);
1020 if (opc == 0 && I == 0 && G == 0)
1022 OUTS (outf, "CC = ");
1023 OUTS (outf, dregs (x));
1024 OUTS (outf, " == ");
1025 OUTS (outf, dregs (y));
1027 else if (opc == 1 && I == 0 && G == 0)
1029 OUTS (outf, "CC = ");
1030 OUTS (outf, dregs (x));
1032 OUTS (outf, dregs (y));
1034 else if (opc == 2 && I == 0 && G == 0)
1036 OUTS (outf, "CC = ");
1037 OUTS (outf, dregs (x));
1038 OUTS (outf, " <= ");
1039 OUTS (outf, dregs (y));
1041 else if (opc == 3 && I == 0 && G == 0)
1043 OUTS (outf, "CC = ");
1044 OUTS (outf, dregs (x));
1046 OUTS (outf, dregs (y));
1047 OUTS (outf, " (IU)");
1049 else if (opc == 4 && I == 0 && G == 0)
1051 OUTS (outf, "CC = ");
1052 OUTS (outf, dregs (x));
1053 OUTS (outf, " <= ");
1054 OUTS (outf, dregs (y));
1055 OUTS (outf, " (IU)");
1057 else if (opc == 0 && I == 1 && G == 0)
1059 OUTS (outf, "CC = ");
1060 OUTS (outf, dregs (x));
1061 OUTS (outf, " == ");
1062 OUTS (outf, imm3 (y));
1064 else if (opc == 1 && I == 1 && G == 0)
1066 OUTS (outf, "CC = ");
1067 OUTS (outf, dregs (x));
1069 OUTS (outf, imm3 (y));
1071 else if (opc == 2 && I == 1 && G == 0)
1073 OUTS (outf, "CC = ");
1074 OUTS (outf, dregs (x));
1075 OUTS (outf, " <= ");
1076 OUTS (outf, imm3 (y));
1078 else if (opc == 3 && I == 1 && G == 0)
1080 OUTS (outf, "CC = ");
1081 OUTS (outf, dregs (x));
1083 OUTS (outf, uimm3 (y));
1084 OUTS (outf, " (IU)");
1086 else if (opc == 4 && I == 1 && G == 0)
1088 OUTS (outf, "CC = ");
1089 OUTS (outf, dregs (x));
1090 OUTS (outf, " <= ");
1091 OUTS (outf, uimm3 (y));
1092 OUTS (outf, " (IU)");
1094 else if (opc == 0 && I == 0 && G == 1)
1096 OUTS (outf, "CC = ");
1097 OUTS (outf, pregs (x));
1098 OUTS (outf, " == ");
1099 OUTS (outf, pregs (y));
1101 else if (opc == 1 && I == 0 && G == 1)
1103 OUTS (outf, "CC = ");
1104 OUTS (outf, pregs (x));
1106 OUTS (outf, pregs (y));
1108 else if (opc == 2 && I == 0 && G == 1)
1110 OUTS (outf, "CC = ");
1111 OUTS (outf, pregs (x));
1112 OUTS (outf, " <= ");
1113 OUTS (outf, pregs (y));
1115 else if (opc == 3 && I == 0 && G == 1)
1117 OUTS (outf, "CC = ");
1118 OUTS (outf, pregs (x));
1120 OUTS (outf, pregs (y));
1121 OUTS (outf, " (IU)");
1123 else if (opc == 4 && I == 0 && G == 1)
1125 OUTS (outf, "CC = ");
1126 OUTS (outf, pregs (x));
1127 OUTS (outf, " <= ");
1128 OUTS (outf, pregs (y));
1129 OUTS (outf, " (IU)");
1131 else if (opc == 0 && I == 1 && G == 1)
1133 OUTS (outf, "CC = ");
1134 OUTS (outf, pregs (x));
1135 OUTS (outf, " == ");
1136 OUTS (outf, imm3 (y));
1138 else if (opc == 1 && I == 1 && G == 1)
1140 OUTS (outf, "CC = ");
1141 OUTS (outf, pregs (x));
1143 OUTS (outf, imm3 (y));
1145 else if (opc == 2 && I == 1 && G == 1)
1147 OUTS (outf, "CC = ");
1148 OUTS (outf, pregs (x));
1149 OUTS (outf, " <= ");
1150 OUTS (outf, imm3 (y));
1152 else if (opc == 3 && I == 1 && G == 1)
1154 OUTS (outf, "CC = ");
1155 OUTS (outf, pregs (x));
1157 OUTS (outf, uimm3 (y));
1158 OUTS (outf, " (IU)");
1160 else if (opc == 4 && I == 1 && G == 1)
1162 OUTS (outf, "CC = ");
1163 OUTS (outf, pregs (x));
1164 OUTS (outf, " <= ");
1165 OUTS (outf, uimm3 (y));
1166 OUTS (outf, " (IU)");
1168 else if (opc == 5 && I == 0 && G == 0 && x == 0 && y == 0)
1169 OUTS (outf, "CC = A0 == A1");
1171 else if (opc == 6 && I == 0 && G == 0 && x == 0 && y == 0)
1172 OUTS (outf, "CC = A0 < A1");
1174 else if (opc == 7 && I == 0 && G == 0 && x == 0 && y == 0)
1175 OUTS (outf, "CC = A0 <= A1");
1183 decode_CC2dreg_0 (TIword iw0, disassemble_info *outf)
1185 struct private *priv = outf->private_data;
1187 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1188 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |.op....|.reg.......|
1189 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1190 int op = ((iw0 >> CC2dreg_op_bits) & CC2dreg_op_mask);
1191 int reg = ((iw0 >> CC2dreg_reg_bits) & CC2dreg_reg_mask);
1198 OUTS (outf, dregs (reg));
1199 OUTS (outf, " = CC");
1203 OUTS (outf, "CC = ");
1204 OUTS (outf, dregs (reg));
1206 else if (op == 3 && reg == 0)
1207 OUTS (outf, "CC = !CC");
1215 decode_CC2stat_0 (TIword iw0, disassemble_info *outf)
1217 struct private *priv = outf->private_data;
1219 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1220 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |.D.|.op....|.cbit..............|
1221 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1222 int D = ((iw0 >> CC2stat_D_bits) & CC2stat_D_mask);
1223 int op = ((iw0 >> CC2stat_op_bits) & CC2stat_op_mask);
1224 int cbit = ((iw0 >> CC2stat_cbit_bits) & CC2stat_cbit_mask);
1226 const char *bitname = statbits (cbit);
1231 if (decode_statbits[cbit] == REG_LASTREG)
1233 /* All ASTAT bits except CC may be operated on in hardware, but may
1234 not have a dedicated insn, so still decode "valid" insns. */
1235 static char bitnames[64];
1237 sprintf (bitnames, "ASTAT[%i /* unused bit */]", cbit);
1244 if (op == 0 && D == 0)
1246 OUTS (outf, "CC = ");
1247 OUTS (outf, bitname);
1249 else if (op == 1 && D == 0)
1251 OUTS (outf, "CC |= ");
1252 OUTS (outf, bitname);
1254 else if (op == 2 && D == 0)
1256 OUTS (outf, "CC &= ");
1257 OUTS (outf, bitname);
1259 else if (op == 3 && D == 0)
1261 OUTS (outf, "CC ^= ");
1262 OUTS (outf, bitname);
1264 else if (op == 0 && D == 1)
1266 OUTS (outf, bitname);
1267 OUTS (outf, " = CC");
1269 else if (op == 1 && D == 1)
1271 OUTS (outf, bitname);
1272 OUTS (outf, " |= CC");
1274 else if (op == 2 && D == 1)
1276 OUTS (outf, bitname);
1277 OUTS (outf, " &= CC");
1279 else if (op == 3 && D == 1)
1281 OUTS (outf, bitname);
1282 OUTS (outf, " ^= CC");
1291 decode_BRCC_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
1293 struct private *priv = outf->private_data;
1295 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1296 | 0 | 0 | 0 | 1 |.T.|.B.|.offset................................|
1297 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1298 int B = ((iw0 >> BRCC_B_bits) & BRCC_B_mask);
1299 int T = ((iw0 >> BRCC_T_bits) & BRCC_T_mask);
1300 int offset = ((iw0 >> BRCC_offset_bits) & BRCC_offset_mask);
1305 if (T == 1 && B == 1)
1307 OUTS (outf, "IF CC JUMP 0x");
1308 OUTS (outf, pcrel10 (offset));
1309 OUTS (outf, " (BP)");
1311 else if (T == 0 && B == 1)
1313 OUTS (outf, "IF !CC JUMP 0x");
1314 OUTS (outf, pcrel10 (offset));
1315 OUTS (outf, " (BP)");
1319 OUTS (outf, "IF CC JUMP 0x");
1320 OUTS (outf, pcrel10 (offset));
1324 OUTS (outf, "IF !CC JUMP 0x");
1325 OUTS (outf, pcrel10 (offset));
1334 decode_UJUMP_0 (TIword iw0, bfd_vma pc, disassemble_info *outf)
1336 struct private *priv = outf->private_data;
1338 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1339 | 0 | 0 | 1 | 0 |.offset........................................|
1340 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1341 int offset = ((iw0 >> UJump_offset_bits) & UJump_offset_mask);
1346 OUTS (outf, "JUMP.S 0x");
1347 OUTS (outf, pcrel12 (offset));
1352 decode_REGMV_0 (TIword iw0, disassemble_info *outf)
1355 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1356 | 0 | 0 | 1 | 1 |.gd........|.gs........|.dst.......|.src.......|
1357 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1358 int gs = ((iw0 >> RegMv_gs_bits) & RegMv_gs_mask);
1359 int gd = ((iw0 >> RegMv_gd_bits) & RegMv_gd_mask);
1360 int src = ((iw0 >> RegMv_src_bits) & RegMv_src_mask);
1361 int dst = ((iw0 >> RegMv_dst_bits) & RegMv_dst_mask);
1363 /* Reserved slots cannot be a src/dst. */
1364 if (IS_RESERVEDREG (gs, src) || IS_RESERVEDREG (gd, dst))
1367 /* Standard register moves */
1368 if ((gs < 2) || /* Dregs/Pregs as source */
1369 (gd < 2) || /* Dregs/Pregs as dest */
1370 (gs == 4 && src < 4) || /* Accumulators as source */
1371 (gd == 4 && dst < 4 && (gs < 4)) || /* Accumulators as dest */
1372 (gs == 7 && src == 7 && !(gd == 4 && dst < 4)) || /* EMUDAT as src */
1373 (gd == 7 && dst == 7)) /* EMUDAT as dest */
1376 /* dareg = dareg (IMBL) */
1377 if (gs < 4 && gd < 4)
1380 /* USP can be src to sysregs, but not dagregs. */
1381 if ((gs == 7 && src == 0) && (gd >= 4))
1384 /* USP can move between genregs (only check Accumulators). */
1385 if (((gs == 7 && src == 0) && (gd == 4 && dst < 4)) ||
1386 ((gd == 7 && dst == 0) && (gs == 4 && src < 4)))
1389 /* Still here ? Invalid reg pair. */
1394 OUTS (outf, allregs (dst, gd));
1396 OUTS (outf, allregs (src, gs));
1401 decode_ALU2op_0 (TIword iw0, disassemble_info *outf)
1404 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1405 | 0 | 1 | 0 | 0 | 0 | 0 |.opc...........|.src.......|.dst.......|
1406 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1407 int src = ((iw0 >> ALU2op_src_bits) & ALU2op_src_mask);
1408 int opc = ((iw0 >> ALU2op_opc_bits) & ALU2op_opc_mask);
1409 int dst = ((iw0 >> ALU2op_dst_bits) & ALU2op_dst_mask);
1413 OUTS (outf, dregs (dst));
1414 OUTS (outf, " >>>= ");
1415 OUTS (outf, dregs (src));
1419 OUTS (outf, dregs (dst));
1420 OUTS (outf, " >>= ");
1421 OUTS (outf, dregs (src));
1425 OUTS (outf, dregs (dst));
1426 OUTS (outf, " <<= ");
1427 OUTS (outf, dregs (src));
1431 OUTS (outf, dregs (dst));
1432 OUTS (outf, " *= ");
1433 OUTS (outf, dregs (src));
1437 OUTS (outf, dregs (dst));
1438 OUTS (outf, " = (");
1439 OUTS (outf, dregs (dst));
1441 OUTS (outf, dregs (src));
1442 OUTS (outf, ") << 0x1");
1446 OUTS (outf, dregs (dst));
1447 OUTS (outf, " = (");
1448 OUTS (outf, dregs (dst));
1450 OUTS (outf, dregs (src));
1451 OUTS (outf, ") << 0x2");
1455 OUTS (outf, "DIVQ (");
1456 OUTS (outf, dregs (dst));
1458 OUTS (outf, dregs (src));
1463 OUTS (outf, "DIVS (");
1464 OUTS (outf, dregs (dst));
1466 OUTS (outf, dregs (src));
1471 OUTS (outf, dregs (dst));
1473 OUTS (outf, dregs_lo (src));
1474 OUTS (outf, " (X)");
1478 OUTS (outf, dregs (dst));
1480 OUTS (outf, dregs_lo (src));
1481 OUTS (outf, " (Z)");
1485 OUTS (outf, dregs (dst));
1487 OUTS (outf, dregs_byte (src));
1488 OUTS (outf, " (X)");
1492 OUTS (outf, dregs (dst));
1494 OUTS (outf, dregs_byte (src));
1495 OUTS (outf, " (Z)");
1499 OUTS (outf, dregs (dst));
1500 OUTS (outf, " = -");
1501 OUTS (outf, dregs (src));
1505 OUTS (outf, dregs (dst));
1506 OUTS (outf, " =~ ");
1507 OUTS (outf, dregs (src));
1516 decode_PTR2op_0 (TIword iw0, disassemble_info *outf)
1519 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1520 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |.opc.......|.src.......|.dst.......|
1521 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1522 int src = ((iw0 >> PTR2op_src_bits) & PTR2op_dst_mask);
1523 int opc = ((iw0 >> PTR2op_opc_bits) & PTR2op_opc_mask);
1524 int dst = ((iw0 >> PTR2op_dst_bits) & PTR2op_dst_mask);
1528 OUTS (outf, pregs (dst));
1529 OUTS (outf, " -= ");
1530 OUTS (outf, pregs (src));
1534 OUTS (outf, pregs (dst));
1536 OUTS (outf, pregs (src));
1537 OUTS (outf, " << 0x2");
1541 OUTS (outf, pregs (dst));
1543 OUTS (outf, pregs (src));
1544 OUTS (outf, " >> 0x2");
1548 OUTS (outf, pregs (dst));
1550 OUTS (outf, pregs (src));
1551 OUTS (outf, " >> 0x1");
1555 OUTS (outf, pregs (dst));
1556 OUTS (outf, " += ");
1557 OUTS (outf, pregs (src));
1558 OUTS (outf, " (BREV)");
1562 OUTS (outf, pregs (dst));
1563 OUTS (outf, " = (");
1564 OUTS (outf, pregs (dst));
1566 OUTS (outf, pregs (src));
1567 OUTS (outf, ") << 0x1");
1571 OUTS (outf, pregs (dst));
1572 OUTS (outf, " = (");
1573 OUTS (outf, pregs (dst));
1575 OUTS (outf, pregs (src));
1576 OUTS (outf, ") << 0x2");
1585 decode_LOGI2op_0 (TIword iw0, disassemble_info *outf)
1587 struct private *priv = outf->private_data;
1589 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1590 | 0 | 1 | 0 | 0 | 1 |.opc.......|.src...............|.dst.......|
1591 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1592 int src = ((iw0 >> LOGI2op_src_bits) & LOGI2op_src_mask);
1593 int opc = ((iw0 >> LOGI2op_opc_bits) & LOGI2op_opc_mask);
1594 int dst = ((iw0 >> LOGI2op_dst_bits) & LOGI2op_dst_mask);
1601 OUTS (outf, "CC = !BITTST (");
1602 OUTS (outf, dregs (dst));
1604 OUTS (outf, uimm5 (src));
1605 OUTS (outf, ");\t\t/* bit");
1606 OUTS (outf, imm7d (src));
1612 OUTS (outf, "CC = BITTST (");
1613 OUTS (outf, dregs (dst));
1615 OUTS (outf, uimm5 (src));
1616 OUTS (outf, ");\t\t/* bit");
1617 OUTS (outf, imm7d (src));
1623 OUTS (outf, "BITSET (");
1624 OUTS (outf, dregs (dst));
1626 OUTS (outf, uimm5 (src));
1627 OUTS (outf, ");\t\t/* bit");
1628 OUTS (outf, imm7d (src));
1634 OUTS (outf, "BITTGL (");
1635 OUTS (outf, dregs (dst));
1637 OUTS (outf, uimm5 (src));
1638 OUTS (outf, ");\t\t/* bit");
1639 OUTS (outf, imm7d (src));
1645 OUTS (outf, "BITCLR (");
1646 OUTS (outf, dregs (dst));
1648 OUTS (outf, uimm5 (src));
1649 OUTS (outf, ");\t\t/* bit");
1650 OUTS (outf, imm7d (src));
1656 OUTS (outf, dregs (dst));
1657 OUTS (outf, " >>>= ");
1658 OUTS (outf, uimm5 (src));
1662 OUTS (outf, dregs (dst));
1663 OUTS (outf, " >>= ");
1664 OUTS (outf, uimm5 (src));
1668 OUTS (outf, dregs (dst));
1669 OUTS (outf, " <<= ");
1670 OUTS (outf, uimm5 (src));
1679 decode_COMP3op_0 (TIword iw0, disassemble_info *outf)
1682 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1683 | 0 | 1 | 0 | 1 |.opc.......|.dst.......|.src1......|.src0......|
1684 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1685 int opc = ((iw0 >> COMP3op_opc_bits) & COMP3op_opc_mask);
1686 int dst = ((iw0 >> COMP3op_dst_bits) & COMP3op_dst_mask);
1687 int src0 = ((iw0 >> COMP3op_src0_bits) & COMP3op_src0_mask);
1688 int src1 = ((iw0 >> COMP3op_src1_bits) & COMP3op_src1_mask);
1690 if (opc == 5 && src1 == src0)
1692 OUTS (outf, pregs (dst));
1694 OUTS (outf, pregs (src0));
1695 OUTS (outf, " << 0x1");
1699 OUTS (outf, dregs (dst));
1701 OUTS (outf, dregs (src0));
1703 OUTS (outf, dregs (src1));
1707 OUTS (outf, dregs (dst));
1709 OUTS (outf, dregs (src0));
1711 OUTS (outf, dregs (src1));
1715 OUTS (outf, dregs (dst));
1717 OUTS (outf, dregs (src0));
1719 OUTS (outf, dregs (src1));
1723 OUTS (outf, dregs (dst));
1725 OUTS (outf, dregs (src0));
1727 OUTS (outf, dregs (src1));
1731 OUTS (outf, pregs (dst));
1733 OUTS (outf, pregs (src0));
1735 OUTS (outf, pregs (src1));
1739 OUTS (outf, pregs (dst));
1741 OUTS (outf, pregs (src0));
1742 OUTS (outf, " + (");
1743 OUTS (outf, pregs (src1));
1744 OUTS (outf, " << 0x1)");
1748 OUTS (outf, pregs (dst));
1750 OUTS (outf, pregs (src0));
1751 OUTS (outf, " + (");
1752 OUTS (outf, pregs (src1));
1753 OUTS (outf, " << 0x2)");
1757 OUTS (outf, dregs (dst));
1759 OUTS (outf, dregs (src0));
1761 OUTS (outf, dregs (src1));
1770 decode_COMPI2opD_0 (TIword iw0, disassemble_info *outf)
1772 struct private *priv = outf->private_data;
1774 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1775 | 0 | 1 | 1 | 0 | 0 |.op|..src......................|.dst.......|
1776 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1777 int op = ((iw0 >> COMPI2opD_op_bits) & COMPI2opD_op_mask);
1778 int dst = ((iw0 >> COMPI2opD_dst_bits) & COMPI2opD_dst_mask);
1779 int src = ((iw0 >> COMPI2opD_src_bits) & COMPI2opD_src_mask);
1781 bu32 *pval = get_allreg (0, dst);
1786 /* Since we don't have 32-bit immediate loads, we allow the disassembler
1787 to combine them, so it prints out the right values.
1788 Here we keep track of the registers. */
1791 *pval = imm7_val (src);
1793 *pval |= 0xFFFFFF80;
1800 OUTS (outf, dregs (dst));
1802 OUTS (outf, imm7 (src));
1803 OUTS (outf, " (X);\t\t/*\t\t");
1804 OUTS (outf, dregs (dst));
1806 OUTS (outf, uimm32 (*pval));
1808 OUTS (outf, imm32 (*pval));
1809 OUTS (outf, ") */");
1814 OUTS (outf, dregs (dst));
1815 OUTS (outf, " += ");
1816 OUTS (outf, imm7 (src));
1817 OUTS (outf, ";\t\t/* (");
1818 OUTS (outf, imm7d (src));
1819 OUTS (outf, ") */");
1829 decode_COMPI2opP_0 (TIword iw0, disassemble_info *outf)
1831 struct private *priv = outf->private_data;
1833 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1834 | 0 | 1 | 1 | 0 | 1 |.op|.src.......................|.dst.......|
1835 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1836 int op = ((iw0 >> COMPI2opP_op_bits) & COMPI2opP_op_mask);
1837 int src = ((iw0 >> COMPI2opP_src_bits) & COMPI2opP_src_mask);
1838 int dst = ((iw0 >> COMPI2opP_dst_bits) & COMPI2opP_dst_mask);
1840 bu32 *pval = get_allreg (1, dst);
1847 *pval = imm7_val (src);
1849 *pval |= 0xFFFFFF80;
1856 OUTS (outf, pregs (dst));
1858 OUTS (outf, imm7 (src));
1859 OUTS (outf, " (X);\t\t/*\t\t");
1860 OUTS (outf, pregs (dst));
1862 OUTS (outf, uimm32 (*pval));
1864 OUTS (outf, imm32 (*pval));
1865 OUTS (outf, ") */");
1870 OUTS (outf, pregs (dst));
1871 OUTS (outf, " += ");
1872 OUTS (outf, imm7 (src));
1873 OUTS (outf, ";\t\t/* (");
1874 OUTS (outf, imm7d (src));
1875 OUTS (outf, ") */");
1885 decode_LDSTpmod_0 (TIword iw0, disassemble_info *outf)
1888 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1889 | 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......|
1890 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
1891 int W = ((iw0 >> LDSTpmod_W_bits) & LDSTpmod_W_mask);
1892 int aop = ((iw0 >> LDSTpmod_aop_bits) & LDSTpmod_aop_mask);
1893 int idx = ((iw0 >> LDSTpmod_idx_bits) & LDSTpmod_idx_mask);
1894 int ptr = ((iw0 >> LDSTpmod_ptr_bits) & LDSTpmod_ptr_mask);
1895 int reg = ((iw0 >> LDSTpmod_reg_bits) & LDSTpmod_reg_mask);
1897 if (aop == 1 && W == 0 && idx == ptr)
1899 OUTS (outf, dregs_lo (reg));
1900 OUTS (outf, " = W[");
1901 OUTS (outf, pregs (ptr));
1904 else if (aop == 2 && W == 0 && idx == ptr)
1906 OUTS (outf, dregs_hi (reg));
1907 OUTS (outf, " = W[");
1908 OUTS (outf, pregs (ptr));
1911 else if (aop == 1 && W == 1 && idx == ptr)
1914 OUTS (outf, pregs (ptr));
1915 OUTS (outf, "] = ");
1916 OUTS (outf, dregs_lo (reg));
1918 else if (aop == 2 && W == 1 && idx == ptr)
1921 OUTS (outf, pregs (ptr));
1922 OUTS (outf, "] = ");
1923 OUTS (outf, dregs_hi (reg));
1925 else if (aop == 0 && W == 0)
1927 OUTS (outf, dregs (reg));
1928 OUTS (outf, " = [");
1929 OUTS (outf, pregs (ptr));
1930 OUTS (outf, " ++ ");
1931 OUTS (outf, pregs (idx));
1934 else if (aop == 1 && W == 0)
1936 OUTS (outf, dregs_lo (reg));
1937 OUTS (outf, " = W[");
1938 OUTS (outf, pregs (ptr));
1939 OUTS (outf, " ++ ");
1940 OUTS (outf, pregs (idx));
1943 else if (aop == 2 && W == 0)
1945 OUTS (outf, dregs_hi (reg));
1946 OUTS (outf, " = W[");
1947 OUTS (outf, pregs (ptr));
1948 OUTS (outf, " ++ ");
1949 OUTS (outf, pregs (idx));
1952 else if (aop == 3 && W == 0)
1954 OUTS (outf, dregs (reg));
1955 OUTS (outf, " = W[");
1956 OUTS (outf, pregs (ptr));
1957 OUTS (outf, " ++ ");
1958 OUTS (outf, pregs (idx));
1959 OUTS (outf, "] (Z)");
1961 else if (aop == 3 && W == 1)
1963 OUTS (outf, dregs (reg));
1964 OUTS (outf, " = W[");
1965 OUTS (outf, pregs (ptr));
1966 OUTS (outf, " ++ ");
1967 OUTS (outf, pregs (idx));
1968 OUTS (outf, "] (X)");
1970 else if (aop == 0 && W == 1)
1973 OUTS (outf, pregs (ptr));
1974 OUTS (outf, " ++ ");
1975 OUTS (outf, pregs (idx));
1976 OUTS (outf, "] = ");
1977 OUTS (outf, dregs (reg));
1979 else if (aop == 1 && W == 1)
1982 OUTS (outf, pregs (ptr));
1983 OUTS (outf, " ++ ");
1984 OUTS (outf, pregs (idx));
1985 OUTS (outf, "] = ");
1986 OUTS (outf, dregs_lo (reg));
1988 else if (aop == 2 && W == 1)
1991 OUTS (outf, pregs (ptr));
1992 OUTS (outf, " ++ ");
1993 OUTS (outf, pregs (idx));
1994 OUTS (outf, "] = ");
1995 OUTS (outf, dregs_hi (reg));
2004 decode_dagMODim_0 (TIword iw0, disassemble_info *outf)
2007 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2008 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....|
2009 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2010 int i = ((iw0 >> DagMODim_i_bits) & DagMODim_i_mask);
2011 int m = ((iw0 >> DagMODim_m_bits) & DagMODim_m_mask);
2012 int br = ((iw0 >> DagMODim_br_bits) & DagMODim_br_mask);
2013 int op = ((iw0 >> DagMODim_op_bits) & DagMODim_op_mask);
2015 if (op == 0 && br == 1)
2017 OUTS (outf, iregs (i));
2018 OUTS (outf, " += ");
2019 OUTS (outf, mregs (m));
2020 OUTS (outf, " (BREV)");
2024 OUTS (outf, iregs (i));
2025 OUTS (outf, " += ");
2026 OUTS (outf, mregs (m));
2028 else if (op == 1 && br == 0)
2030 OUTS (outf, iregs (i));
2031 OUTS (outf, " -= ");
2032 OUTS (outf, mregs (m));
2041 decode_dagMODik_0 (TIword iw0, disassemble_info *outf)
2043 struct private *priv = outf->private_data;
2045 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2046 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....|
2047 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2048 int i = ((iw0 >> DagMODik_i_bits) & DagMODik_i_mask);
2049 int op = ((iw0 >> DagMODik_op_bits) & DagMODik_op_mask);
2053 OUTS (outf, iregs (i));
2054 OUTS (outf, " += 0x2");
2058 OUTS (outf, iregs (i));
2059 OUTS (outf, " -= 0x2");
2063 OUTS (outf, iregs (i));
2064 OUTS (outf, " += 0x4");
2068 OUTS (outf, iregs (i));
2069 OUTS (outf, " -= 0x4");
2074 if (!priv->parallel)
2076 OUTS (outf, ";\t\t/* ( ");
2077 if (op == 0 || op == 1)
2079 else if (op == 2 || op == 3)
2081 OUTS (outf, ") */");
2089 decode_dspLDST_0 (TIword iw0, disassemble_info *outf)
2092 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2093 | 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......|
2094 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2095 int i = ((iw0 >> DspLDST_i_bits) & DspLDST_i_mask);
2096 int m = ((iw0 >> DspLDST_m_bits) & DspLDST_m_mask);
2097 int W = ((iw0 >> DspLDST_W_bits) & DspLDST_W_mask);
2098 int aop = ((iw0 >> DspLDST_aop_bits) & DspLDST_aop_mask);
2099 int reg = ((iw0 >> DspLDST_reg_bits) & DspLDST_reg_mask);
2101 if (aop == 0 && W == 0 && m == 0)
2103 OUTS (outf, dregs (reg));
2104 OUTS (outf, " = [");
2105 OUTS (outf, iregs (i));
2108 else if (aop == 0 && W == 0 && m == 1)
2110 OUTS (outf, dregs_lo (reg));
2111 OUTS (outf, " = W[");
2112 OUTS (outf, iregs (i));
2115 else if (aop == 0 && W == 0 && m == 2)
2117 OUTS (outf, dregs_hi (reg));
2118 OUTS (outf, " = W[");
2119 OUTS (outf, iregs (i));
2122 else if (aop == 1 && W == 0 && m == 0)
2124 OUTS (outf, dregs (reg));
2125 OUTS (outf, " = [");
2126 OUTS (outf, iregs (i));
2129 else if (aop == 1 && W == 0 && m == 1)
2131 OUTS (outf, dregs_lo (reg));
2132 OUTS (outf, " = W[");
2133 OUTS (outf, iregs (i));
2136 else if (aop == 1 && W == 0 && m == 2)
2138 OUTS (outf, dregs_hi (reg));
2139 OUTS (outf, " = W[");
2140 OUTS (outf, iregs (i));
2143 else if (aop == 2 && W == 0 && m == 0)
2145 OUTS (outf, dregs (reg));
2146 OUTS (outf, " = [");
2147 OUTS (outf, iregs (i));
2150 else if (aop == 2 && W == 0 && m == 1)
2152 OUTS (outf, dregs_lo (reg));
2153 OUTS (outf, " = W[");
2154 OUTS (outf, iregs (i));
2157 else if (aop == 2 && W == 0 && m == 2)
2159 OUTS (outf, dregs_hi (reg));
2160 OUTS (outf, " = W[");
2161 OUTS (outf, iregs (i));
2164 else if (aop == 0 && W == 1 && m == 0)
2167 OUTS (outf, iregs (i));
2168 OUTS (outf, "++] = ");
2169 OUTS (outf, dregs (reg));
2171 else if (aop == 0 && W == 1 && m == 1)
2174 OUTS (outf, iregs (i));
2175 OUTS (outf, "++] = ");
2176 OUTS (outf, dregs_lo (reg));
2178 else if (aop == 0 && W == 1 && m == 2)
2181 OUTS (outf, iregs (i));
2182 OUTS (outf, "++] = ");
2183 OUTS (outf, dregs_hi (reg));
2185 else if (aop == 1 && W == 1 && m == 0)
2188 OUTS (outf, iregs (i));
2189 OUTS (outf, "--] = ");
2190 OUTS (outf, dregs (reg));
2192 else if (aop == 1 && W == 1 && m == 1)
2195 OUTS (outf, iregs (i));
2196 OUTS (outf, "--] = ");
2197 OUTS (outf, dregs_lo (reg));
2199 else if (aop == 1 && W == 1 && m == 2)
2202 OUTS (outf, iregs (i));
2203 OUTS (outf, "--] = ");
2204 OUTS (outf, dregs_hi (reg));
2206 else if (aop == 2 && W == 1 && m == 0)
2209 OUTS (outf, iregs (i));
2210 OUTS (outf, "] = ");
2211 OUTS (outf, dregs (reg));
2213 else if (aop == 2 && W == 1 && m == 1)
2216 OUTS (outf, iregs (i));
2217 OUTS (outf, "] = ");
2218 OUTS (outf, dregs_lo (reg));
2220 else if (aop == 2 && W == 1 && m == 2)
2223 OUTS (outf, iregs (i));
2224 OUTS (outf, "] = ");
2225 OUTS (outf, dregs_hi (reg));
2227 else if (aop == 3 && W == 0)
2229 OUTS (outf, dregs (reg));
2230 OUTS (outf, " = [");
2231 OUTS (outf, iregs (i));
2232 OUTS (outf, " ++ ");
2233 OUTS (outf, mregs (m));
2236 else if (aop == 3 && W == 1)
2239 OUTS (outf, iregs (i));
2240 OUTS (outf, " ++ ");
2241 OUTS (outf, mregs (m));
2242 OUTS (outf, "] = ");
2243 OUTS (outf, dregs (reg));
2252 decode_LDST_0 (TIword iw0, disassemble_info *outf)
2255 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2256 | 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......|
2257 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2258 int Z = ((iw0 >> LDST_Z_bits) & LDST_Z_mask);
2259 int W = ((iw0 >> LDST_W_bits) & LDST_W_mask);
2260 int sz = ((iw0 >> LDST_sz_bits) & LDST_sz_mask);
2261 int aop = ((iw0 >> LDST_aop_bits) & LDST_aop_mask);
2262 int reg = ((iw0 >> LDST_reg_bits) & LDST_reg_mask);
2263 int ptr = ((iw0 >> LDST_ptr_bits) & LDST_ptr_mask);
2265 if (aop == 0 && sz == 0 && Z == 0 && W == 0)
2267 OUTS (outf, dregs (reg));
2268 OUTS (outf, " = [");
2269 OUTS (outf, pregs (ptr));
2272 else if (aop == 0 && sz == 0 && Z == 1 && W == 0 && reg != ptr)
2274 OUTS (outf, pregs (reg));
2275 OUTS (outf, " = [");
2276 OUTS (outf, pregs (ptr));
2279 else if (aop == 0 && sz == 1 && Z == 0 && W == 0)
2281 OUTS (outf, dregs (reg));
2282 OUTS (outf, " = W[");
2283 OUTS (outf, pregs (ptr));
2284 OUTS (outf, "++] (Z)");
2286 else if (aop == 0 && sz == 1 && Z == 1 && W == 0)
2288 OUTS (outf, dregs (reg));
2289 OUTS (outf, " = W[");
2290 OUTS (outf, pregs (ptr));
2291 OUTS (outf, "++] (X)");
2293 else if (aop == 0 && sz == 2 && Z == 0 && W == 0)
2295 OUTS (outf, dregs (reg));
2296 OUTS (outf, " = B[");
2297 OUTS (outf, pregs (ptr));
2298 OUTS (outf, "++] (Z)");
2300 else if (aop == 0 && sz == 2 && Z == 1 && W == 0)
2302 OUTS (outf, dregs (reg));
2303 OUTS (outf, " = B[");
2304 OUTS (outf, pregs (ptr));
2305 OUTS (outf, "++] (X)");
2307 else if (aop == 1 && sz == 0 && Z == 0 && W == 0)
2309 OUTS (outf, dregs (reg));
2310 OUTS (outf, " = [");
2311 OUTS (outf, pregs (ptr));
2314 else if (aop == 1 && sz == 0 && Z == 1 && W == 0 && reg != ptr)
2316 OUTS (outf, pregs (reg));
2317 OUTS (outf, " = [");
2318 OUTS (outf, pregs (ptr));
2321 else if (aop == 1 && sz == 1 && Z == 0 && W == 0)
2323 OUTS (outf, dregs (reg));
2324 OUTS (outf, " = W[");
2325 OUTS (outf, pregs (ptr));
2326 OUTS (outf, "--] (Z)");
2328 else if (aop == 1 && sz == 1 && Z == 1 && W == 0)
2330 OUTS (outf, dregs (reg));
2331 OUTS (outf, " = W[");
2332 OUTS (outf, pregs (ptr));
2333 OUTS (outf, "--] (X)");
2335 else if (aop == 1 && sz == 2 && Z == 0 && W == 0)
2337 OUTS (outf, dregs (reg));
2338 OUTS (outf, " = B[");
2339 OUTS (outf, pregs (ptr));
2340 OUTS (outf, "--] (Z)");
2342 else if (aop == 1 && sz == 2 && Z == 1 && W == 0)
2344 OUTS (outf, dregs (reg));
2345 OUTS (outf, " = B[");
2346 OUTS (outf, pregs (ptr));
2347 OUTS (outf, "--] (X)");
2349 else if (aop == 2 && sz == 0 && Z == 0 && W == 0)
2351 OUTS (outf, dregs (reg));
2352 OUTS (outf, " = [");
2353 OUTS (outf, pregs (ptr));
2356 else if (aop == 2 && sz == 0 && Z == 1 && W == 0)
2358 OUTS (outf, pregs (reg));
2359 OUTS (outf, " = [");
2360 OUTS (outf, pregs (ptr));
2363 else if (aop == 2 && sz == 1 && Z == 0 && W == 0)
2365 OUTS (outf, dregs (reg));
2366 OUTS (outf, " = W[");
2367 OUTS (outf, pregs (ptr));
2368 OUTS (outf, "] (Z)");
2370 else if (aop == 2 && sz == 1 && Z == 1 && W == 0)
2372 OUTS (outf, dregs (reg));
2373 OUTS (outf, " = W[");
2374 OUTS (outf, pregs (ptr));
2375 OUTS (outf, "] (X)");
2377 else if (aop == 2 && sz == 2 && Z == 0 && W == 0)
2379 OUTS (outf, dregs (reg));
2380 OUTS (outf, " = B[");
2381 OUTS (outf, pregs (ptr));
2382 OUTS (outf, "] (Z)");
2384 else if (aop == 2 && sz == 2 && Z == 1 && W == 0)
2386 OUTS (outf, dregs (reg));
2387 OUTS (outf, " = B[");
2388 OUTS (outf, pregs (ptr));
2389 OUTS (outf, "] (X)");
2391 else if (aop == 0 && sz == 0 && Z == 0 && W == 1)
2394 OUTS (outf, pregs (ptr));
2395 OUTS (outf, "++] = ");
2396 OUTS (outf, dregs (reg));
2398 else if (aop == 0 && sz == 0 && Z == 1 && W == 1)
2401 OUTS (outf, pregs (ptr));
2402 OUTS (outf, "++] = ");
2403 OUTS (outf, pregs (reg));
2405 else if (aop == 0 && sz == 1 && Z == 0 && W == 1)
2408 OUTS (outf, pregs (ptr));
2409 OUTS (outf, "++] = ");
2410 OUTS (outf, dregs (reg));
2412 else if (aop == 0 && sz == 2 && Z == 0 && W == 1)
2415 OUTS (outf, pregs (ptr));
2416 OUTS (outf, "++] = ");
2417 OUTS (outf, dregs (reg));
2419 else if (aop == 1 && sz == 0 && Z == 0 && W == 1)
2422 OUTS (outf, pregs (ptr));
2423 OUTS (outf, "--] = ");
2424 OUTS (outf, dregs (reg));
2426 else if (aop == 1 && sz == 0 && Z == 1 && W == 1)
2429 OUTS (outf, pregs (ptr));
2430 OUTS (outf, "--] = ");
2431 OUTS (outf, pregs (reg));
2433 else if (aop == 1 && sz == 1 && Z == 0 && W == 1)
2436 OUTS (outf, pregs (ptr));
2437 OUTS (outf, "--] = ");
2438 OUTS (outf, dregs (reg));
2440 else if (aop == 1 && sz == 2 && Z == 0 && W == 1)
2443 OUTS (outf, pregs (ptr));
2444 OUTS (outf, "--] = ");
2445 OUTS (outf, dregs (reg));
2447 else if (aop == 2 && sz == 0 && Z == 0 && W == 1)
2450 OUTS (outf, pregs (ptr));
2451 OUTS (outf, "] = ");
2452 OUTS (outf, dregs (reg));
2454 else if (aop == 2 && sz == 0 && Z == 1 && W == 1)
2457 OUTS (outf, pregs (ptr));
2458 OUTS (outf, "] = ");
2459 OUTS (outf, pregs (reg));
2461 else if (aop == 2 && sz == 1 && Z == 0 && W == 1)
2464 OUTS (outf, pregs (ptr));
2465 OUTS (outf, "] = ");
2466 OUTS (outf, dregs (reg));
2468 else if (aop == 2 && sz == 2 && Z == 0 && W == 1)
2471 OUTS (outf, pregs (ptr));
2472 OUTS (outf, "] = ");
2473 OUTS (outf, dregs (reg));
2482 decode_LDSTiiFP_0 (TIword iw0, disassemble_info *outf)
2485 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2486 | 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........|
2487 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2488 int reg = ((iw0 >> LDSTiiFP_reg_bits) & LDSTiiFP_reg_mask);
2489 int offset = ((iw0 >> LDSTiiFP_offset_bits) & LDSTiiFP_offset_mask);
2490 int W = ((iw0 >> LDSTiiFP_W_bits) & LDSTiiFP_W_mask);
2494 OUTS (outf, dpregs (reg));
2495 OUTS (outf, " = [FP ");
2496 OUTS (outf, negimm5s4 (offset));
2501 OUTS (outf, "[FP ");
2502 OUTS (outf, negimm5s4 (offset));
2503 OUTS (outf, "] = ");
2504 OUTS (outf, dpregs (reg));
2513 decode_LDSTii_0 (TIword iw0, disassemble_info *outf)
2516 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2517 | 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......|
2518 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2519 int reg = ((iw0 >> LDSTii_reg_bit) & LDSTii_reg_mask);
2520 int ptr = ((iw0 >> LDSTii_ptr_bit) & LDSTii_ptr_mask);
2521 int offset = ((iw0 >> LDSTii_offset_bit) & LDSTii_offset_mask);
2522 int op = ((iw0 >> LDSTii_op_bit) & LDSTii_op_mask);
2523 int W = ((iw0 >> LDSTii_W_bit) & LDSTii_W_mask);
2525 if (W == 0 && op == 0)
2527 OUTS (outf, dregs (reg));
2528 OUTS (outf, " = [");
2529 OUTS (outf, pregs (ptr));
2531 OUTS (outf, uimm4s4 (offset));
2534 else if (W == 0 && op == 1)
2536 OUTS (outf, dregs (reg));
2537 OUTS (outf, " = W[");
2538 OUTS (outf, pregs (ptr));
2540 OUTS (outf, uimm4s2 (offset));
2541 OUTS (outf, "] (Z)");
2543 else if (W == 0 && op == 2)
2545 OUTS (outf, dregs (reg));
2546 OUTS (outf, " = W[");
2547 OUTS (outf, pregs (ptr));
2549 OUTS (outf, uimm4s2 (offset));
2550 OUTS (outf, "] (X)");
2552 else if (W == 0 && op == 3)
2554 OUTS (outf, pregs (reg));
2555 OUTS (outf, " = [");
2556 OUTS (outf, pregs (ptr));
2558 OUTS (outf, uimm4s4 (offset));
2561 else if (W == 1 && op == 0)
2564 OUTS (outf, pregs (ptr));
2566 OUTS (outf, uimm4s4 (offset));
2567 OUTS (outf, "] = ");
2568 OUTS (outf, dregs (reg));
2570 else if (W == 1 && op == 1)
2573 OUTS (outf, pregs (ptr));
2575 OUTS (outf, uimm4s2 (offset));
2576 OUTS (outf, "] = ");
2577 OUTS (outf, dregs (reg));
2579 else if (W == 1 && op == 3)
2582 OUTS (outf, pregs (ptr));
2584 OUTS (outf, uimm4s4 (offset));
2585 OUTS (outf, "] = ");
2586 OUTS (outf, pregs (reg));
2595 decode_LoopSetup_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
2597 struct private *priv = outf->private_data;
2599 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2600 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |.rop...|.c.|.soffset.......|
2601 |.reg...........| - | - |.eoffset...............................|
2602 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2603 int c = ((iw0 >> (LoopSetup_c_bits - 16)) & LoopSetup_c_mask);
2604 int reg = ((iw1 >> LoopSetup_reg_bits) & LoopSetup_reg_mask);
2605 int rop = ((iw0 >> (LoopSetup_rop_bits - 16)) & LoopSetup_rop_mask);
2606 int soffset = ((iw0 >> (LoopSetup_soffset_bits - 16)) & LoopSetup_soffset_mask);
2607 int eoffset = ((iw1 >> LoopSetup_eoffset_bits) & LoopSetup_eoffset_mask);
2617 OUTS (outf, "LSETUP");
2619 OUTS (outf, pcrel4 (soffset));
2620 OUTS (outf, ", 0x");
2621 OUTS (outf, lppcrel10 (eoffset));
2623 OUTS (outf, counters (c));
2627 OUTS (outf, "LSETUP");
2629 OUTS (outf, pcrel4 (soffset));
2630 OUTS (outf, ", 0x");
2631 OUTS (outf, lppcrel10 (eoffset));
2633 OUTS (outf, counters (c));
2635 OUTS (outf, pregs (reg));
2639 OUTS (outf, "LSETUP");
2641 OUTS (outf, pcrel4 (soffset));
2642 OUTS (outf, ", 0x");
2643 OUTS (outf, lppcrel10 (eoffset));
2645 OUTS (outf, counters (c));
2647 OUTS (outf, pregs (reg));
2648 OUTS (outf, " >> 0x1");
2657 decode_LDIMMhalf_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2659 struct private *priv = outf->private_data;
2661 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2662 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |.Z.|.H.|.S.|.grp...|.reg.......|
2663 |.hword.........................................................|
2664 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2665 int H = ((iw0 >> (LDIMMhalf_H_bits - 16)) & LDIMMhalf_H_mask);
2666 int Z = ((iw0 >> (LDIMMhalf_Z_bits - 16)) & LDIMMhalf_Z_mask);
2667 int S = ((iw0 >> (LDIMMhalf_S_bits - 16)) & LDIMMhalf_S_mask);
2668 int reg = ((iw0 >> (LDIMMhalf_reg_bits - 16)) & LDIMMhalf_reg_mask);
2669 int grp = ((iw0 >> (LDIMMhalf_grp_bits - 16)) & LDIMMhalf_grp_mask);
2670 int hword = ((iw1 >> LDIMMhalf_hword_bits) & LDIMMhalf_hword_mask);
2672 bu32 *pval = get_allreg (grp, reg);
2677 /* Since we don't have 32-bit immediate loads, we allow the disassembler
2678 to combine them, so it prints out the right values.
2679 Here we keep track of the registers. */
2680 if (H == 0 && S == 1 && Z == 0)
2682 /* regs = imm16 (x) */
2683 *pval = imm16_val (hword);
2685 *pval |= 0xFFFF0000;
2689 else if (H == 0 && S == 0 && Z == 1)
2691 /* regs = luimm16 (Z) */
2692 *pval = luimm16_val (hword);
2695 else if (H == 0 && S == 0 && Z == 0)
2697 /* regs_lo = luimm16 */
2698 *pval &= 0xFFFF0000;
2699 *pval |= luimm16_val (hword);
2701 else if (H == 1 && S == 0 && Z == 0)
2703 /* regs_hi = huimm16 */
2705 *pval |= luimm16_val (hword) << 16;
2708 /* Here we do the disassembly */
2709 if (grp == 0 && H == 0 && S == 0 && Z == 0)
2711 OUTS (outf, dregs_lo (reg));
2713 OUTS (outf, uimm16 (hword));
2715 else if (grp == 0 && H == 1 && S == 0 && Z == 0)
2717 OUTS (outf, dregs_hi (reg));
2719 OUTS (outf, uimm16 (hword));
2721 else if (grp == 0 && H == 0 && S == 1 && Z == 0)
2723 OUTS (outf, dregs (reg));
2725 OUTS (outf, imm16 (hword));
2726 OUTS (outf, " (X)");
2728 else if (H == 0 && S == 1 && Z == 0)
2730 OUTS (outf, regs (reg, grp));
2732 OUTS (outf, imm16 (hword));
2733 OUTS (outf, " (X)");
2735 else if (H == 0 && S == 0 && Z == 1)
2737 OUTS (outf, regs (reg, grp));
2739 OUTS (outf, uimm16 (hword));
2740 OUTS (outf, " (Z)");
2742 else if (H == 0 && S == 0 && Z == 0)
2744 OUTS (outf, regs_lo (reg, grp));
2746 OUTS (outf, uimm16 (hword));
2748 else if (H == 1 && S == 0 && Z == 0)
2750 OUTS (outf, regs_hi (reg, grp));
2752 OUTS (outf, uimm16 (hword));
2757 /* And we print out the 32-bit value if it is a pointer. */
2758 if (S == 0 && Z == 0)
2760 OUTS (outf, ";\t\t/* (");
2761 OUTS (outf, imm16d (hword));
2764 /* If it is an MMR, don't print the symbol. */
2765 if (*pval < 0xFFC00000 && grp == 1)
2767 OUTS (outf, regs (reg, grp));
2769 OUTS (outf, huimm32e (*pval));
2773 OUTS (outf, regs (reg, grp));
2775 OUTS (outf, huimm32e (*pval));
2777 OUTS (outf, imm32 (*pval));
2784 if (S == 1 || Z == 1)
2786 OUTS (outf, ";\t\t/*\t\t");
2787 OUTS (outf, regs (reg, grp));
2789 OUTS (outf, huimm32e (*pval));
2791 OUTS (outf, imm32 (*pval));
2792 OUTS (outf, ") */");
2799 decode_CALLa_0 (TIword iw0, TIword iw1, bfd_vma pc, disassemble_info *outf)
2801 struct private *priv = outf->private_data;
2803 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2804 | 1 | 1 | 1 | 0 | 0 | 0 | 1 |.S.|.msw...........................|
2805 |.lsw...........................................................|
2806 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2807 int S = ((iw0 >> (CALLa_S_bits - 16)) & CALLa_S_mask);
2808 int lsw = ((iw1 >> 0) & 0xffff);
2809 int msw = ((iw0 >> 0) & 0xff);
2815 OUTS (outf, "CALL 0x");
2817 OUTS (outf, "JUMP.L 0x");
2821 OUTS (outf, pcrel24 (((msw) << 16) | (lsw)));
2826 decode_LDSTidxI_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2829 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2830 | 1 | 1 | 1 | 0 | 0 | 1 |.W.|.Z.|.sz....|.ptr.......|.reg.......|
2831 |.offset........................................................|
2832 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2833 int Z = ((iw0 >> (LDSTidxI_Z_bits - 16)) & LDSTidxI_Z_mask);
2834 int W = ((iw0 >> (LDSTidxI_W_bits - 16)) & LDSTidxI_W_mask);
2835 int sz = ((iw0 >> (LDSTidxI_sz_bits - 16)) & LDSTidxI_sz_mask);
2836 int reg = ((iw0 >> (LDSTidxI_reg_bits - 16)) & LDSTidxI_reg_mask);
2837 int ptr = ((iw0 >> (LDSTidxI_ptr_bits - 16)) & LDSTidxI_ptr_mask);
2838 int offset = ((iw1 >> LDSTidxI_offset_bits) & LDSTidxI_offset_mask);
2840 if (W == 0 && sz == 0 && Z == 0)
2842 OUTS (outf, dregs (reg));
2843 OUTS (outf, " = [");
2844 OUTS (outf, pregs (ptr));
2846 OUTS (outf, imm16s4 (offset));
2849 else if (W == 0 && sz == 0 && Z == 1)
2851 OUTS (outf, pregs (reg));
2852 OUTS (outf, " = [");
2853 OUTS (outf, pregs (ptr));
2855 OUTS (outf, imm16s4 (offset));
2858 else if (W == 0 && sz == 1 && Z == 0)
2860 OUTS (outf, dregs (reg));
2861 OUTS (outf, " = W[");
2862 OUTS (outf, pregs (ptr));
2864 OUTS (outf, imm16s2 (offset));
2865 OUTS (outf, "] (Z)");
2867 else if (W == 0 && sz == 1 && Z == 1)
2869 OUTS (outf, dregs (reg));
2870 OUTS (outf, " = W[");
2871 OUTS (outf, pregs (ptr));
2873 OUTS (outf, imm16s2 (offset));
2874 OUTS (outf, "] (X)");
2876 else if (W == 0 && sz == 2 && Z == 0)
2878 OUTS (outf, dregs (reg));
2879 OUTS (outf, " = B[");
2880 OUTS (outf, pregs (ptr));
2882 OUTS (outf, imm16 (offset));
2883 OUTS (outf, "] (Z)");
2885 else if (W == 0 && sz == 2 && Z == 1)
2887 OUTS (outf, dregs (reg));
2888 OUTS (outf, " = B[");
2889 OUTS (outf, pregs (ptr));
2891 OUTS (outf, imm16 (offset));
2892 OUTS (outf, "] (X)");
2894 else if (W == 1 && sz == 0 && Z == 0)
2897 OUTS (outf, pregs (ptr));
2899 OUTS (outf, imm16s4 (offset));
2900 OUTS (outf, "] = ");
2901 OUTS (outf, dregs (reg));
2903 else if (W == 1 && sz == 0 && Z == 1)
2906 OUTS (outf, pregs (ptr));
2908 OUTS (outf, imm16s4 (offset));
2909 OUTS (outf, "] = ");
2910 OUTS (outf, pregs (reg));
2912 else if (W == 1 && sz == 1 && Z == 0)
2915 OUTS (outf, pregs (ptr));
2917 OUTS (outf, imm16s2 (offset));
2918 OUTS (outf, "] = ");
2919 OUTS (outf, dregs (reg));
2921 else if (W == 1 && sz == 2 && Z == 0)
2924 OUTS (outf, pregs (ptr));
2926 OUTS (outf, imm16 (offset));
2927 OUTS (outf, "] = ");
2928 OUTS (outf, dregs (reg));
2937 decode_linkage_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2939 struct private *priv = outf->private_data;
2941 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2942 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |.R.|
2943 |.framesize.....................................................|
2944 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2945 int R = ((iw0 >> (Linkage_R_bits - 16)) & Linkage_R_mask);
2946 int framesize = ((iw1 >> Linkage_framesize_bits) & Linkage_framesize_mask);
2953 OUTS (outf, "LINK ");
2954 OUTS (outf, uimm16s4 (framesize));
2955 OUTS (outf, ";\t\t/* (");
2956 OUTS (outf, uimm16s4d (framesize));
2957 OUTS (outf, ") */");
2961 OUTS (outf, "UNLINK");
2969 decode_dsp32mac_0 (TIword iw0, TIword iw1, disassemble_info *outf)
2972 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2973 | 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|
2974 |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
2975 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2976 int op1 = ((iw0 >> (DSP32Mac_op1_bits - 16)) & DSP32Mac_op1_mask);
2977 int w1 = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2978 int P = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2979 int MM = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
2980 int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2981 int w0 = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2982 int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
2983 int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
2984 int dst = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2985 int h10 = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
2986 int h00 = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
2987 int op0 = ((iw1 >> DSP32Mac_op0_bits) & DSP32Mac_op0_mask);
2988 int h11 = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
2989 int h01 = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
2991 if (w0 == 0 && w1 == 0 && op1 == 3 && op0 == 3)
2997 if ((w1 || w0) && mmod == M_W32)
3000 if (((1 << mmod) & (P ? 0x131b : 0x1b5f)) == 0)
3003 if (w1 == 1 || op1 != 3)
3006 OUTS (outf, P ? dregs (dst + 1) : dregs_hi (dst));
3009 OUTS (outf, " = A1");
3013 OUTS (outf, " = (");
3014 decode_macfunc (1, op1, h01, h11, src0, src1, outf);
3019 if (w0 == 1 || op0 != 3)
3022 OUTS (outf, " (M)");
3027 if (w0 == 1 || op0 != 3)
3029 /* Clear MM option since it only matters for MAC1, and if we made
3030 it this far, we've already shown it or we want to ignore it. */
3034 OUTS (outf, P ? dregs (dst) : dregs_lo (dst));
3037 OUTS (outf, " = A0");
3041 OUTS (outf, " = (");
3042 decode_macfunc (0, op0, h00, h10, src0, src1, outf);
3048 decode_optmode (mmod, MM, outf);
3054 decode_dsp32mult_0 (TIword iw0, TIword iw1, disassemble_info *outf)
3057 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
3058 | 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...|
3059 |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
3060 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
3061 int w1 = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
3062 int P = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
3063 int MM = ((iw0 >> (DSP32Mac_MM_bits - 16)) & DSP32Mac_MM_mask);
3064 int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
3065 int w0 = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
3066 int src0 = ((iw1 >> DSP32Mac_src0_bits) & DSP32Mac_src0_mask);
3067 int src1 = ((iw1 >> DSP32Mac_src1_bits) & DSP32Mac_src1_mask);
3068 int dst = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
3069 int h10 = ((iw1 >> DSP32Mac_h10_bits) & DSP32Mac_h10_mask);
3070 int h00 = ((iw1 >> DSP32Mac_h00_bits) & DSP32Mac_h00_mask);
3071 int h11 = ((iw1 >> DSP32Mac_h11_bits) & DSP32Mac_h11_mask);
3072 int h01 = ((iw1 >> DSP32Mac_h01_bits) & DSP32Mac_h01_mask);
3074 if (w1 == 0 && w0 == 0)
3077 if (((1 << mmod) & (P ? 0x313 : 0x1b57)) == 0)
3082 OUTS (outf, P ? dregs (dst + 1) : dregs_hi (dst));
3084 decode_multfunc (h01, h11, src0, src1, outf);
3089 OUTS (outf, " (M)");
3097 OUTS (outf, P ? dregs (dst) : dregs_lo (dst));
3099 decode_multfunc (h00, h10, src0, src1, outf);
3102 decode_optmode (mmod, MM, outf);
3107 decode_dsp32alu_0 (TIword iw0, TIword iw1, disassemble_info *outf)
3110 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
3111 | 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............|
3112 |.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......|
3113 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
3114 int s = ((iw1 >> DSP32Alu_s_bits) & DSP32Alu_s_mask);
3115 int x = ((iw1 >> DSP32Alu_x_bits) & DSP32Alu_x_mask);
3116 int aop = ((iw1 >> DSP32Alu_aop_bits) & DSP32Alu_aop_mask);
3117 int src0 = ((iw1 >> DSP32Alu_src0_bits) & DSP32Alu_src0_mask);
3118 int src1 = ((iw1 >> DSP32Alu_src1_bits) & DSP32Alu_src1_mask);
3119 int dst0 = ((iw1 >> DSP32Alu_dst0_bits) & DSP32Alu_dst0_mask);
3120 int dst1 = ((iw1 >> DSP32Alu_dst1_bits) & DSP32Alu_dst1_mask);
3121 int HL = ((iw0 >> (DSP32Alu_HL_bits - 16)) & DSP32Alu_HL_mask);
3122 int aopcde = ((iw0 >> (DSP32Alu_aopcde_bits - 16)) & DSP32Alu_aopcde_mask);
3124 if (aop == 0 && aopcde == 9 && HL == 0 && s == 0)
3126 OUTS (outf, "A0.L = ");
3127 OUTS (outf, dregs_lo (src0));
3129 else if (aop == 2 && aopcde == 9 && HL == 1 && s == 0)
3131 OUTS (outf, "A1.H = ");
3132 OUTS (outf, dregs_hi (src0));
3134 else if (aop == 2 && aopcde == 9 && HL == 0 && s == 0)
3136 OUTS (outf, "A1.L = ");
3137 OUTS (outf, dregs_lo (src0));
3139 else if (aop == 0 && aopcde == 9 && HL == 1 && s == 0)
3141 OUTS (outf, "A0.H = ");
3142 OUTS (outf, dregs_hi (src0));
3144 else if (x == 1 && HL == 1 && aop == 3 && aopcde == 5)
3146 OUTS (outf, dregs_hi (dst0));
3148 OUTS (outf, dregs (src0));
3150 OUTS (outf, dregs (src1));
3151 OUTS (outf, " (RND20)");
3153 else if (x == 1 && HL == 1 && aop == 2 && aopcde == 5)
3155 OUTS (outf, dregs_hi (dst0));
3157 OUTS (outf, dregs (src0));
3159 OUTS (outf, dregs (src1));
3160 OUTS (outf, " (RND20)");
3162 else if (x == 0 && HL == 0 && aop == 1 && aopcde == 5)
3164 OUTS (outf, dregs_lo (dst0));
3166 OUTS (outf, dregs (src0));
3168 OUTS (outf, dregs (src1));
3169 OUTS (outf, " (RND12)");
3171 else if (x == 0 && HL == 0 && aop == 0 && aopcde == 5)
3173 OUTS (outf, dregs_lo (dst0));
3175 OUTS (outf, dregs (src0));
3177 OUTS (outf, dregs (src1));
3178 OUTS (outf, " (RND12)");
3180 else if (x == 1 && HL == 0 && aop == 3 && aopcde == 5)
3182 OUTS (outf, dregs_lo (dst0));
3184 OUTS (outf, dregs (src0));
3186 OUTS (outf, dregs (src1));
3187 OUTS (outf, " (RND20)");
3189 else if (x == 0 && HL == 1 && aop == 0 && aopcde == 5)
3191 OUTS (outf, dregs_hi (dst0));
3193 OUTS (outf, dregs (src0));
3195 OUTS (outf, dregs (src1));
3196 OUTS (outf, " (RND12)");
3198 else if (x == 1 && HL == 0 && aop == 2 && aopcde == 5)
3200 OUTS (outf, dregs_lo (dst0));
3202 OUTS (outf, dregs (src0));
3204 OUTS (outf, dregs (src1));
3205 OUTS (outf, " (RND20)");
3207 else if (x == 0 && HL == 1 && aop == 1 && aopcde == 5)
3209 OUTS (outf, dregs_hi (dst0));
3211 OUTS (outf, dregs (src0));
3213 OUTS (outf, dregs (src1));
3214 OUTS (outf, " (RND12)");
3216 else if (HL == 1 && aop == 0 && aopcde == 2)
3218 OUTS (outf, dregs_hi (dst0));
3220 OUTS (outf, dregs_lo (src0));
3222 OUTS (outf, dregs_lo (src1));
3225 else if (HL == 1 && aop == 1 && aopcde == 2)
3227 OUTS (outf, dregs_hi (dst0));
3229 OUTS (outf, dregs_lo (src0));
3231 OUTS (outf, dregs_hi (src1));
3234 else if (HL == 1 && aop == 2 && aopcde == 2)
3236 OUTS (outf, dregs_hi (dst0));
3238 OUTS (outf, dregs_hi (src0));
3240 OUTS (outf, dregs_lo (src1));
3243 else if (HL == 1 && aop == 3 && aopcde == 2)
3245 OUTS (outf, dregs_hi (dst0));
3247 OUTS (outf, dregs_hi (src0));
3249 OUTS (outf, dregs_hi (src1));
3252 else if (HL == 0 && aop == 0 && aopcde == 3)
3254 OUTS (outf, dregs_lo (dst0));
3256 OUTS (outf, dregs_lo (src0));
3258 OUTS (outf, dregs_lo (src1));
3261 else if (HL == 0 && aop == 1 && aopcde == 3)
3263 OUTS (outf, dregs_lo (dst0));
3265 OUTS (outf, dregs_lo (src0));
3267 OUTS (outf, dregs_hi (src1));
3270 else if (HL == 0 && aop == 3 && aopcde == 2)
3272 OUTS (outf, dregs_lo (dst0));
3274 OUTS (outf, dregs_hi (src0));
3276 OUTS (outf, dregs_hi (src1));
3279 else if (HL == 1 && aop == 0 && aopcde == 3)
3281 OUTS (outf, dregs_hi (dst0));
3283 OUTS (outf, dregs_lo (src0));
3285 OUTS (outf, dregs_lo (src1));
3288 else if (HL == 1 && aop == 1 && aopcde == 3)
3290 OUTS (outf, dregs_hi (dst0));
3292 OUTS (outf, dregs_lo (src0));
3294 OUTS (outf, dregs_hi (src1));
3297 else if (HL == 1 && aop == 2 && aopcde == 3)
3299 OUTS (outf, dregs_hi (dst0));
3301 OUTS (outf, dregs_hi (src0));
3303 OUTS (outf, dregs_lo (src1));
3306 else if (HL == 1 && aop == 3 && aopcde == 3)
3308 OUTS (outf, dregs_hi (dst0));
3310 OUTS (outf, dregs_hi (src0));
3312 OUTS (outf, dregs_hi (src1));
3315 else if (HL == 0 && aop == 2 && aopcde == 2)
3317 OUTS (outf, dregs_lo (dst0));
3319 OUTS (outf, dregs_hi (src0));
3321 OUTS (outf, dregs_lo (src1));
3324 else if (HL == 0 && aop == 1 && aopcde == 2)
3326 OUTS (outf, dregs_lo (dst0));
3328 OUTS (outf, dregs_lo (src0));
3330 OUTS (outf, dregs_hi (src1));
3333 else if (HL == 0 && aop == 2 && aopcde == 3)
3335 OUTS (outf, dregs_lo (dst0));
3337 OUTS (outf, dregs_hi (src0));
3339 OUTS (outf, dregs_lo (src1));
3342 else if (HL == 0 && aop == 3 && aopcde == 3)
3344 OUTS (outf, dregs_lo (dst0));
3346 OUTS (outf, dregs_hi (src0));
3348 OUTS (outf, dregs_hi (src1));
3351 else if (HL == 0 && aop == 0 && aopcde == 2)
3353 OUTS (outf, dregs_lo (dst0));
3355 OUTS (outf, dregs_lo (src0));
3357 OUTS (outf, dregs_lo (src1));
3360 else if (aop == 0 && aopcde == 9 && s == 1)
3362 OUTS (outf, "A0 = ");
3363 OUTS (outf, dregs (src0));
3365 else if (aop == 3 && aopcde == 11 && s == 0)
3366 OUTS (outf, "A0 -= A1");
3368 else if (aop == 3 && aopcde == 11 && s == 1)
3369 OUTS (outf, "A0 -= A1 (W32)");
3371 else if (aop == 1 && aopcde == 22 && HL == 1)
3373 OUTS (outf, dregs (dst0));
3374 OUTS (outf, " = BYTEOP2P (");
3375 OUTS (outf, dregs (src0 + 1));
3377 OUTS (outf, imm5d (src0));
3379 OUTS (outf, dregs (src1 + 1));
3381 OUTS (outf, imm5d (src1));
3382 OUTS (outf, ") (TH");
3384 OUTS (outf, ", R)");
3388 else if (aop == 1 && aopcde == 22 && HL == 0)
3390 OUTS (outf, dregs (dst0));
3391 OUTS (outf, " = BYTEOP2P (");
3392 OUTS (outf, dregs (src0 + 1));
3394 OUTS (outf, imm5d (src0));
3396 OUTS (outf, dregs (src1 + 1));
3398 OUTS (outf, imm5d (src1));
3399 OUTS (outf, ") (TL");
3401 OUTS (outf, ", R)");
3405 else if (aop == 0 && aopcde == 22 && HL == 1)
3407 OUTS (outf, dregs (dst0));
3408 OUTS (outf, " = BYTEOP2P (");
3409 OUTS (outf, dregs (src0 + 1));
3411 OUTS (outf, imm5d (src0));
3413 OUTS (outf, dregs (src1 + 1));
3415 OUTS (outf, imm5d (src1));
3416 OUTS (outf, ") (RNDH");
3418 OUTS (outf, ", R)");
3422 else if (aop == 0 && aopcde == 22 && HL == 0)
3424 OUTS (outf, dregs (dst0));
3425 OUTS (outf, " = BYTEOP2P (");
3426 OUTS (outf, dregs (src0 + 1));
3428 OUTS (outf, imm5d (src0));
3430 OUTS (outf, dregs (src1 + 1));
3432 OUTS (outf, imm5d (src1));
3433 OUTS (outf, ") (RNDL");
3435 OUTS (outf, ", R)");
3439 else if (aop == 0 && s == 0 && aopcde == 8)
3440 OUTS (outf, "A0 = 0");
3442 else if (aop == 0 && s == 1 && aopcde == 8)
3443 OUTS (outf, "A0 = A0 (S)");
3445 else if (aop == 1 && s == 0 && aopcde == 8)
3446 OUTS (outf, "A1 = 0");
3448 else if (aop == 1 && s == 1 && aopcde == 8)
3449 OUTS (outf, "A1 = A1 (S)");
3451 else if (aop == 2 && s == 0 && aopcde == 8)
3452 OUTS (outf, "A1 = A0 = 0");
3454 else if (aop == 2 && s == 1 && aopcde == 8)
3455 OUTS (outf, "A1 = A1 (S), A0 = A0 (S)");
3457 else if (aop == 3 && s == 0 && aopcde == 8)
3458 OUTS (outf, "A0 = A1");
3460 else if (aop == 3 && s == 1 && aopcde == 8)
3461 OUTS (outf, "A1 = A0");
3463 else if (aop == 1 && aopcde == 9 && s == 0)
3465 OUTS (outf, "A0.X = ");
3466 OUTS (outf, dregs_lo (src0));
3468 else if (aop == 1 && HL == 0 && aopcde == 11)
3470 OUTS (outf, dregs_lo (dst0));
3471 OUTS (outf, " = (A0 += A1)");
3473 else if (aop == 3 && HL == 0 && aopcde == 16)
3474 OUTS (outf, "A1 = ABS A1, A0 = ABS A0");
3476 else if (aop == 0 && aopcde == 23 && HL == 1)
3478 OUTS (outf, dregs (dst0));
3479 OUTS (outf, " = BYTEOP3P (");
3480 OUTS (outf, dregs (src0 + 1));
3482 OUTS (outf, imm5d (src0));
3484 OUTS (outf, dregs (src1 + 1));
3486 OUTS (outf, imm5d (src1));
3487 OUTS (outf, ") (HI");
3489 OUTS (outf, ", R)");
3493 else if (aop == 3 && aopcde == 9 && s == 0)
3495 OUTS (outf, "A1.X = ");
3496 OUTS (outf, dregs_lo (src0));
3498 else if (aop == 1 && HL == 1 && aopcde == 16)
3499 OUTS (outf, "A1 = ABS A1");
3501 else if (aop == 0 && HL == 1 && aopcde == 16)
3502 OUTS (outf, "A1 = ABS A0");
3504 else if (aop == 2 && aopcde == 9 && s == 1)
3506 OUTS (outf, "A1 = ");
3507 OUTS (outf, dregs (src0));
3509 else if (HL == 0 && aop == 3 && aopcde == 12)
3511 OUTS (outf, dregs_lo (dst0));
3513 OUTS (outf, dregs (src0));
3514 OUTS (outf, " (RND)");
3516 else if (aop == 1 && HL == 0 && aopcde == 16)
3517 OUTS (outf, "A0 = ABS A1");
3519 else if (aop == 0 && HL == 0 && aopcde == 16)
3520 OUTS (outf, "A0 = ABS A0");
3522 else if (aop == 3 && HL == 0 && aopcde == 15)
3524 OUTS (outf, dregs (dst0));
3525 OUTS (outf, " = -");
3526 OUTS (outf, dregs (src0));
3527 OUTS (outf, " (V)");
3529 else if (aop == 3 && s == 1 && HL == 0 && aopcde == 7)
3531 OUTS (outf, dregs (dst0));
3532 OUTS (outf, " = -");
3533 OUTS (outf, dregs (src0));
3534 OUTS (outf, " (S)");
3536 else if (aop == 3 && s == 0 && HL == 0 && aopcde == 7)
3538 OUTS (outf, dregs (dst0));
3539 OUTS (outf, " = -");
3540 OUTS (outf, dregs (src0));
3541 OUTS (outf, " (NS)");
3543 else if (aop == 1 && HL == 1 && aopcde == 11)
3545 OUTS (outf, dregs_hi (dst0));
3546 OUTS (outf, " = (A0 += A1)");
3548 else if (aop == 2 && aopcde == 11 && s == 0)
3549 OUTS (outf, "A0 += A1");
3551 else if (aop == 2 && aopcde == 11 && s == 1)
3552 OUTS (outf, "A0 += A1 (W32)");
3554 else if (aop == 3 && HL == 0 && aopcde == 14)
3555 OUTS (outf, "A1 = -A1, A0 = -A0");
3557 else if (HL == 1 && aop == 3 && aopcde == 12)
3559 OUTS (outf, dregs_hi (dst0));
3561 OUTS (outf, dregs (src0));
3562 OUTS (outf, " (RND)");
3564 else if (aop == 0 && aopcde == 23 && HL == 0)
3566 OUTS (outf, dregs (dst0));
3567 OUTS (outf, " = BYTEOP3P (");
3568 OUTS (outf, dregs (src0 + 1));
3570 OUTS (outf, imm5d (src0));
3572 OUTS (outf, dregs (src1 + 1));
3574 OUTS (outf, imm5d (src1));
3575 OUTS (outf, ") (LO");
3577 OUTS (outf, ", R)");
3581 else if (aop == 0 && HL == 0 && aopcde == 14)
3582 OUTS (outf, "A0 = -A0");
3584 else if (aop == 1 && HL == 0 && aopcde == 14)
3585 OUTS (outf, "A0 = -A1");
3587 else if (aop == 0 && HL == 1 && aopcde == 14)
3588 OUTS (outf, "A1 = -A0");
3590 else if (aop == 1 && HL == 1 && aopcde == 14)
3591 OUTS (outf, "A1 = -A1");
3593 else if (aop == 0 && aopcde == 12)
3595 OUTS (outf, dregs_hi (dst0));
3597 OUTS (outf, dregs_lo (dst0));
3598 OUTS (outf, " = SIGN (");
3599 OUTS (outf, dregs_hi (src0));
3600 OUTS (outf, ") * ");
3601 OUTS (outf, dregs_hi (src1));
3602 OUTS (outf, " + SIGN (");
3603 OUTS (outf, dregs_lo (src0));
3604 OUTS (outf, ") * ");
3605 OUTS (outf, dregs_lo (src1));
3607 else if (aop == 2 && aopcde == 0)
3609 OUTS (outf, dregs (dst0));
3611 OUTS (outf, dregs (src0));
3612 OUTS (outf, " -|+ ");
3613 OUTS (outf, dregs (src1));
3616 else if (aop == 1 && aopcde == 12)
3618 OUTS (outf, dregs (dst1));
3619 OUTS (outf, " = A1.L + A1.H, ");
3620 OUTS (outf, dregs (dst0));
3621 OUTS (outf, " = A0.L + A0.H");
3623 else if (aop == 2 && aopcde == 4)
3625 OUTS (outf, dregs (dst1));
3627 OUTS (outf, dregs (src0));
3629 OUTS (outf, dregs (src1));
3631 OUTS (outf, dregs (dst0));
3633 OUTS (outf, dregs (src0));
3635 OUTS (outf, dregs (src1));
3638 else if (HL == 0 && aopcde == 1)
3640 OUTS (outf, dregs (dst1));
3642 OUTS (outf, dregs (src0));
3643 OUTS (outf, " +|+ ");
3644 OUTS (outf, dregs (src1));
3646 OUTS (outf, dregs (dst0));
3648 OUTS (outf, dregs (src0));
3649 OUTS (outf, " -|- ");
3650 OUTS (outf, dregs (src1));
3651 amod0amod2 (s, x, aop, outf);
3653 else if (aop == 0 && aopcde == 11)
3655 OUTS (outf, dregs (dst0));
3656 OUTS (outf, " = (A0 += A1)");
3658 else if (aop == 0 && aopcde == 10)
3660 OUTS (outf, dregs_lo (dst0));
3661 OUTS (outf, " = A0.X");
3663 else if (aop == 1 && aopcde == 10)
3665 OUTS (outf, dregs_lo (dst0));
3666 OUTS (outf, " = A1.X");
3668 else if (aop == 1 && aopcde == 0)
3670 OUTS (outf, dregs (dst0));
3672 OUTS (outf, dregs (src0));
3673 OUTS (outf, " +|- ");
3674 OUTS (outf, dregs (src1));
3677 else if (aop == 3 && aopcde == 0)
3679 OUTS (outf, dregs (dst0));
3681 OUTS (outf, dregs (src0));
3682 OUTS (outf, " -|- ");
3683 OUTS (outf, dregs (src1));
3686 else if (aop == 1 && aopcde == 4)
3688 OUTS (outf, dregs (dst0));
3690 OUTS (outf, dregs (src0));
3692 OUTS (outf, dregs (src1));
3695 else if (aop == 0 && aopcde == 17)
3697 OUTS (outf, dregs (dst1));
3698 OUTS (outf, " = A1 + A0, ");
3699 OUTS (outf, dregs (dst0));
3700 OUTS (outf, " = A1 - A0");
3703 else if (aop == 1 && aopcde == 17)
3705 OUTS (outf, dregs (dst1));
3706 OUTS (outf, " = A0 + A1, ");
3707 OUTS (outf, dregs (dst0));
3708 OUTS (outf, " = A0 - A1");
3711 else if (aop == 0 && aopcde == 18)
3713 OUTS (outf, "SAA (");
3714 OUTS (outf, dregs (src0 + 1));
3716 OUTS (outf, imm5d (src0));
3718 OUTS (outf, dregs (src1 + 1));
3720 OUTS (outf, imm5d (src1));
3724 else if (aop == 3 && aopcde == 18)
3725 OUTS (outf, "DISALGNEXCPT");
3727 else if (aop == 0 && aopcde == 20)
3729 OUTS (outf, dregs (dst0));
3730 OUTS (outf, " = BYTEOP1P (");
3731 OUTS (outf, dregs (src0 + 1));
3733 OUTS (outf, imm5d (src0));
3735 OUTS (outf, dregs (src1 + 1));
3737 OUTS (outf, imm5d (src1));
3741 else if (aop == 1 && aopcde == 20)
3743 OUTS (outf, dregs (dst0));
3744 OUTS (outf, " = BYTEOP1P (");
3745 OUTS (outf, dregs (src0 + 1));
3747 OUTS (outf, imm5d (src0));
3749 OUTS (outf, dregs (src1 + 1));
3751 OUTS (outf, imm5d (src1));
3752 OUTS (outf, ") (T");
3754 OUTS (outf, ", R)");
3758 else if (aop == 0 && aopcde == 21)
3761 OUTS (outf, dregs (dst1));
3763 OUTS (outf, dregs (dst0));
3764 OUTS (outf, ") = BYTEOP16P (");
3765 OUTS (outf, dregs (src0 + 1));
3767 OUTS (outf, imm5d (src0));
3769 OUTS (outf, dregs (src1 + 1));
3771 OUTS (outf, imm5d (src1));
3775 else if (aop == 1 && aopcde == 21)
3778 OUTS (outf, dregs (dst1));
3780 OUTS (outf, dregs (dst0));
3781 OUTS (outf, ") = BYTEOP16M (");
3782 OUTS (outf, dregs (src0 + 1));
3784 OUTS (outf, imm5d (src0));
3786 OUTS (outf, dregs (src1 + 1));
3788 OUTS (outf, imm5d (src1));
3792 else if (aop == 2 && aopcde == 7)
3794 OUTS (outf, dregs (dst0));
3795 OUTS (outf, " = ABS ");
3796 OUTS (outf, dregs (src0));
3798 else if (aop == 1 && aopcde == 7)
3800 OUTS (outf, dregs (dst0));
3801 OUTS (outf, " = MIN (");
3802 OUTS (outf, dregs (src0));
3804 OUTS (outf, dregs (src1));
3807 else if (aop == 0 && aopcde == 7)
3809 OUTS (outf, dregs (dst0));
3810 OUTS (outf, " = MAX (");
3811 OUTS (outf, dregs (src0));
3813 OUTS (outf, dregs (src1));
3816 else if (aop == 2 && aopcde == 6)
3818 OUTS (outf, dregs (dst0));
3819 OUTS (outf, " = ABS ");
3820 OUTS (outf, dregs (src0));
3821 OUTS (outf, " (V)");
3823 else if (aop == 1 && aopcde == 6)
3825 OUTS (outf, dregs (dst0));
3826 OUTS (outf, " = MIN (");
3827 OUTS (outf, dregs (src0));
3829 OUTS (outf, dregs (src1));
3830 OUTS (outf, ") (V)");
3832 else if (aop == 0 && aopcde == 6)
3834 OUTS (outf, dregs (dst0));
3835 OUTS (outf, " = MAX (");
3836 OUTS (outf, dregs (src0));
3838 OUTS (outf, dregs (src1));
3839 OUTS (outf, ") (V)");
3841 else if (HL == 1 && aopcde == 1)
3843 OUTS (outf, dregs (dst1));
3845 OUTS (outf, dregs (src0));
3846 OUTS (outf, " +|- ");
3847 OUTS (outf, dregs (src1));
3849 OUTS (outf, dregs (dst0));
3851 OUTS (outf, dregs (src0));
3852 OUTS (outf, " -|+ ");
3853 OUTS (outf, dregs (src1));
3854 amod0amod2 (s, x, aop, outf);
3856 else if (aop == 0 && aopcde == 4)
3858 OUTS (outf, dregs (dst0));
3860 OUTS (outf, dregs (src0));
3862 OUTS (outf, dregs (src1));
3865 else if (aop == 0 && aopcde == 0)
3867 OUTS (outf, dregs (dst0));
3869 OUTS (outf, dregs (src0));
3870 OUTS (outf, " +|+ ");
3871 OUTS (outf, dregs (src1));
3874 else if (aop == 0 && aopcde == 24)
3876 OUTS (outf, dregs (dst0));
3877 OUTS (outf, " = BYTEPACK (");
3878 OUTS (outf, dregs (src0));
3880 OUTS (outf, dregs (src1));
3883 else if (aop == 1 && aopcde == 24)
3886 OUTS (outf, dregs (dst1));
3888 OUTS (outf, dregs (dst0));
3889 OUTS (outf, ") = BYTEUNPACK ");
3890 OUTS (outf, dregs (src0 + 1));
3892 OUTS (outf, imm5d (src0));
3895 else if (aopcde == 13)
3898 OUTS (outf, dregs (dst1));
3900 OUTS (outf, dregs (dst0));
3901 OUTS (outf, ") = SEARCH ");
3902 OUTS (outf, dregs (src0));
3904 searchmod (aop, outf);
3914 decode_dsp32shift_0 (TIword iw0, TIword iw1, disassemble_info *outf)
3917 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
3918 | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............|
3919 |.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......|
3920 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
3921 int HLs = ((iw1 >> DSP32Shift_HLs_bits) & DSP32Shift_HLs_mask);
3922 int sop = ((iw1 >> DSP32Shift_sop_bits) & DSP32Shift_sop_mask);
3923 int src0 = ((iw1 >> DSP32Shift_src0_bits) & DSP32Shift_src0_mask);
3924 int src1 = ((iw1 >> DSP32Shift_src1_bits) & DSP32Shift_src1_mask);
3925 int dst0 = ((iw1 >> DSP32Shift_dst0_bits) & DSP32Shift_dst0_mask);
3926 int sopcde = ((iw0 >> (DSP32Shift_sopcde_bits - 16)) & DSP32Shift_sopcde_mask);
3927 const char *acc01 = (HLs & 1) == 0 ? "A0" : "A1";
3929 if (HLs == 0 && sop == 0 && sopcde == 0)
3931 OUTS (outf, dregs_lo (dst0));
3932 OUTS (outf, " = ASHIFT ");
3933 OUTS (outf, dregs_lo (src1));
3934 OUTS (outf, " BY ");
3935 OUTS (outf, dregs_lo (src0));
3937 else if (HLs == 1 && sop == 0 && sopcde == 0)
3939 OUTS (outf, dregs_lo (dst0));
3940 OUTS (outf, " = ASHIFT ");
3941 OUTS (outf, dregs_hi (src1));
3942 OUTS (outf, " BY ");
3943 OUTS (outf, dregs_lo (src0));
3945 else if (HLs == 2 && sop == 0 && sopcde == 0)
3947 OUTS (outf, dregs_hi (dst0));
3948 OUTS (outf, " = ASHIFT ");
3949 OUTS (outf, dregs_lo (src1));
3950 OUTS (outf, " BY ");
3951 OUTS (outf, dregs_lo (src0));
3953 else if (HLs == 3 && sop == 0 && sopcde == 0)
3955 OUTS (outf, dregs_hi (dst0));
3956 OUTS (outf, " = ASHIFT ");
3957 OUTS (outf, dregs_hi (src1));
3958 OUTS (outf, " BY ");
3959 OUTS (outf, dregs_lo (src0));
3961 else if (HLs == 0 && sop == 1 && sopcde == 0)
3963 OUTS (outf, dregs_lo (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)");
3970 else if (HLs == 1 && sop == 1 && sopcde == 0)
3972 OUTS (outf, dregs_lo (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)");
3979 else if (HLs == 2 && sop == 1 && sopcde == 0)
3981 OUTS (outf, dregs_hi (dst0));
3982 OUTS (outf, " = ASHIFT ");
3983 OUTS (outf, dregs_lo (src1));
3984 OUTS (outf, " BY ");
3985 OUTS (outf, dregs_lo (src0));
3986 OUTS (outf, " (S)");
3988 else if (HLs == 3 && sop == 1 && sopcde == 0)
3990 OUTS (outf, dregs_hi (dst0));
3991 OUTS (outf, " = ASHIFT ");
3992 OUTS (outf, dregs_hi (src1));
3993 OUTS (outf, " BY ");
3994 OUTS (outf, dregs_lo (src0));
3995 OUTS (outf, " (S)");
3997 else if (sop == 2 && sopcde == 0)
3999 OUTS (outf, (HLs & 2) == 0 ? dregs_lo (dst0) : dregs_hi (dst0));
4000 OUTS (outf, " = LSHIFT ");
4001 OUTS (outf, (HLs & 1) == 0 ? dregs_lo (src1) : dregs_hi (src1));
4002 OUTS (outf, " BY ");
4003 OUTS (outf, dregs_lo (src0));
4005 else if (sop == 0 && sopcde == 3)
4008 OUTS (outf, " = ASHIFT ");
4010 OUTS (outf, " BY ");
4011 OUTS (outf, dregs_lo (src0));
4013 else if (sop == 1 && sopcde == 3)
4016 OUTS (outf, " = LSHIFT ");
4018 OUTS (outf, " BY ");
4019 OUTS (outf, dregs_lo (src0));
4021 else if (sop == 2 && sopcde == 3)
4024 OUTS (outf, " = ROT ");
4026 OUTS (outf, " BY ");
4027 OUTS (outf, dregs_lo (src0));
4029 else if (sop == 3 && sopcde == 3)
4031 OUTS (outf, dregs (dst0));
4032 OUTS (outf, " = ROT ");
4033 OUTS (outf, dregs (src1));
4034 OUTS (outf, " BY ");
4035 OUTS (outf, dregs_lo (src0));
4037 else if (sop == 1 && sopcde == 1)
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 OUTS (outf, " (V, S)");
4046 else if (sop == 0 && sopcde == 1)
4048 OUTS (outf, dregs (dst0));
4049 OUTS (outf, " = ASHIFT ");
4050 OUTS (outf, dregs (src1));
4051 OUTS (outf, " BY ");
4052 OUTS (outf, dregs_lo (src0));
4053 OUTS (outf, " (V)");
4055 else if (sop == 0 && sopcde == 2)
4057 OUTS (outf, dregs (dst0));
4058 OUTS (outf, " = ASHIFT ");
4059 OUTS (outf, dregs (src1));
4060 OUTS (outf, " BY ");
4061 OUTS (outf, dregs_lo (src0));
4063 else if (sop == 1 && sopcde == 2)
4065 OUTS (outf, dregs (dst0));
4066 OUTS (outf, " = ASHIFT ");
4067 OUTS (outf, dregs (src1));
4068 OUTS (outf, " BY ");
4069 OUTS (outf, dregs_lo (src0));
4070 OUTS (outf, " (S)");
4072 else if (sop == 2 && sopcde == 2)
4074 OUTS (outf, dregs (dst0));
4075 OUTS (outf, " = LSHIFT ");
4076 OUTS (outf, dregs (src1));
4077 OUTS (outf, " BY ");
4078 OUTS (outf, dregs_lo (src0));
4080 else if (sop == 3 && sopcde == 2)
4082 OUTS (outf, dregs (dst0));
4083 OUTS (outf, " = ROT ");
4084 OUTS (outf, dregs (src1));
4085 OUTS (outf, " BY ");
4086 OUTS (outf, dregs_lo (src0));
4088 else if (sop == 2 && sopcde == 1)
4090 OUTS (outf, dregs (dst0));
4091 OUTS (outf, " = LSHIFT ");
4092 OUTS (outf, dregs (src1));
4093 OUTS (outf, " BY ");
4094 OUTS (outf, dregs_lo (src0));
4095 OUTS (outf, " (V)");
4097 else if (sop == 0 && sopcde == 4)
4099 OUTS (outf, dregs (dst0));
4100 OUTS (outf, " = PACK (");
4101 OUTS (outf, dregs_lo (src1));
4103 OUTS (outf, dregs_lo (src0));
4106 else if (sop == 1 && sopcde == 4)
4108 OUTS (outf, dregs (dst0));
4109 OUTS (outf, " = PACK (");
4110 OUTS (outf, dregs_lo (src1));
4112 OUTS (outf, dregs_hi (src0));
4115 else if (sop == 2 && sopcde == 4)
4117 OUTS (outf, dregs (dst0));
4118 OUTS (outf, " = PACK (");
4119 OUTS (outf, dregs_hi (src1));
4121 OUTS (outf, dregs_lo (src0));
4124 else if (sop == 3 && sopcde == 4)
4126 OUTS (outf, dregs (dst0));
4127 OUTS (outf, " = PACK (");
4128 OUTS (outf, dregs_hi (src1));
4130 OUTS (outf, dregs_hi (src0));
4133 else if (sop == 0 && sopcde == 5)
4135 OUTS (outf, dregs_lo (dst0));
4136 OUTS (outf, " = SIGNBITS ");
4137 OUTS (outf, dregs (src1));
4139 else if (sop == 1 && sopcde == 5)
4141 OUTS (outf, dregs_lo (dst0));
4142 OUTS (outf, " = SIGNBITS ");
4143 OUTS (outf, dregs_lo (src1));
4145 else if (sop == 2 && sopcde == 5)
4147 OUTS (outf, dregs_lo (dst0));
4148 OUTS (outf, " = SIGNBITS ");
4149 OUTS (outf, dregs_hi (src1));
4151 else if (sop == 0 && sopcde == 6)
4153 OUTS (outf, dregs_lo (dst0));
4154 OUTS (outf, " = SIGNBITS A0");
4156 else if (sop == 1 && sopcde == 6)
4158 OUTS (outf, dregs_lo (dst0));
4159 OUTS (outf, " = SIGNBITS A1");
4161 else if (sop == 3 && sopcde == 6)
4163 OUTS (outf, dregs_lo (dst0));
4164 OUTS (outf, " = ONES ");
4165 OUTS (outf, dregs (src1));
4167 else if (sop == 0 && sopcde == 7)
4169 OUTS (outf, dregs_lo (dst0));
4170 OUTS (outf, " = EXPADJ (");
4171 OUTS (outf, dregs (src1));
4173 OUTS (outf, dregs_lo (src0));
4176 else if (sop == 1 && sopcde == 7)
4178 OUTS (outf, dregs_lo (dst0));
4179 OUTS (outf, " = EXPADJ (");
4180 OUTS (outf, dregs (src1));
4182 OUTS (outf, dregs_lo (src0));
4183 OUTS (outf, ") (V)");
4185 else if (sop == 2 && sopcde == 7)
4187 OUTS (outf, dregs_lo (dst0));
4188 OUTS (outf, " = EXPADJ (");
4189 OUTS (outf, dregs_lo (src1));
4191 OUTS (outf, dregs_lo (src0));
4194 else if (sop == 3 && sopcde == 7)
4196 OUTS (outf, dregs_lo (dst0));
4197 OUTS (outf, " = EXPADJ (");
4198 OUTS (outf, dregs_hi (src1));
4200 OUTS (outf, dregs_lo (src0));
4203 else if (sop == 0 && sopcde == 8)
4205 OUTS (outf, "BITMUX (");
4206 OUTS (outf, dregs (src0));
4208 OUTS (outf, dregs (src1));
4209 OUTS (outf, ", A0) (ASR)");
4211 else if (sop == 1 && sopcde == 8)
4213 OUTS (outf, "BITMUX (");
4214 OUTS (outf, dregs (src0));
4216 OUTS (outf, dregs (src1));
4217 OUTS (outf, ", A0) (ASL)");
4219 else if (sop == 0 && sopcde == 9)
4221 OUTS (outf, dregs_lo (dst0));
4222 OUTS (outf, " = VIT_MAX (");
4223 OUTS (outf, dregs (src1));
4224 OUTS (outf, ") (ASL)");
4226 else if (sop == 1 && sopcde == 9)
4228 OUTS (outf, dregs_lo (dst0));
4229 OUTS (outf, " = VIT_MAX (");
4230 OUTS (outf, dregs (src1));
4231 OUTS (outf, ") (ASR)");
4233 else if (sop == 2 && sopcde == 9)
4235 OUTS (outf, dregs (dst0));
4236 OUTS (outf, " = VIT_MAX (");
4237 OUTS (outf, dregs (src1));
4239 OUTS (outf, dregs (src0));
4240 OUTS (outf, ") (ASL)");
4242 else if (sop == 3 && sopcde == 9)
4244 OUTS (outf, dregs (dst0));
4245 OUTS (outf, " = VIT_MAX (");
4246 OUTS (outf, dregs (src1));
4248 OUTS (outf, dregs (src0));
4249 OUTS (outf, ") (ASR)");
4251 else if (sop == 0 && sopcde == 10)
4253 OUTS (outf, dregs (dst0));
4254 OUTS (outf, " = EXTRACT (");
4255 OUTS (outf, dregs (src1));
4257 OUTS (outf, dregs_lo (src0));
4258 OUTS (outf, ") (Z)");
4260 else if (sop == 1 && sopcde == 10)
4262 OUTS (outf, dregs (dst0));
4263 OUTS (outf, " = EXTRACT (");
4264 OUTS (outf, dregs (src1));
4266 OUTS (outf, dregs_lo (src0));
4267 OUTS (outf, ") (X)");
4269 else if (sop == 2 && sopcde == 10)
4271 OUTS (outf, dregs (dst0));
4272 OUTS (outf, " = DEPOSIT (");
4273 OUTS (outf, dregs (src1));
4275 OUTS (outf, dregs (src0));
4278 else if (sop == 3 && sopcde == 10)
4280 OUTS (outf, dregs (dst0));
4281 OUTS (outf, " = DEPOSIT (");
4282 OUTS (outf, dregs (src1));
4284 OUTS (outf, dregs (src0));
4285 OUTS (outf, ") (X)");
4287 else if (sop == 0 && sopcde == 11)
4289 OUTS (outf, dregs_lo (dst0));
4290 OUTS (outf, " = CC = BXORSHIFT (A0, ");
4291 OUTS (outf, dregs (src0));
4294 else if (sop == 1 && sopcde == 11)
4296 OUTS (outf, dregs_lo (dst0));
4297 OUTS (outf, " = CC = BXOR (A0, ");
4298 OUTS (outf, dregs (src0));
4301 else if (sop == 0 && sopcde == 12)
4302 OUTS (outf, "A0 = BXORSHIFT (A0, A1, CC)");
4304 else if (sop == 1 && sopcde == 12)
4306 OUTS (outf, dregs_lo (dst0));
4307 OUTS (outf, " = CC = BXOR (A0, A1, CC)");
4309 else if (sop == 0 && sopcde == 13)
4311 OUTS (outf, dregs (dst0));
4312 OUTS (outf, " = ALIGN8 (");
4313 OUTS (outf, dregs (src1));
4315 OUTS (outf, dregs (src0));
4318 else if (sop == 1 && sopcde == 13)
4320 OUTS (outf, dregs (dst0));
4321 OUTS (outf, " = ALIGN16 (");
4322 OUTS (outf, dregs (src1));
4324 OUTS (outf, dregs (src0));
4327 else if (sop == 2 && sopcde == 13)
4329 OUTS (outf, dregs (dst0));
4330 OUTS (outf, " = ALIGN24 (");
4331 OUTS (outf, dregs (src1));
4333 OUTS (outf, dregs (src0));
4343 decode_dsp32shiftimm_0 (TIword iw0, TIword iw1, disassemble_info *outf)
4346 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4347 | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............|
4348 |.sop...|.HLs...|.dst0......|.immag.................|.src1......|
4349 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
4350 int src1 = ((iw1 >> DSP32ShiftImm_src1_bits) & DSP32ShiftImm_src1_mask);
4351 int sop = ((iw1 >> DSP32ShiftImm_sop_bits) & DSP32ShiftImm_sop_mask);
4352 int bit8 = ((iw1 >> 8) & 0x1);
4353 int immag = ((iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
4354 int newimmag = (-(iw1 >> DSP32ShiftImm_immag_bits) & DSP32ShiftImm_immag_mask);
4355 int dst0 = ((iw1 >> DSP32ShiftImm_dst0_bits) & DSP32ShiftImm_dst0_mask);
4356 int sopcde = ((iw0 >> (DSP32ShiftImm_sopcde_bits - 16)) & DSP32ShiftImm_sopcde_mask);
4357 int HLs = ((iw1 >> DSP32ShiftImm_HLs_bits) & DSP32ShiftImm_HLs_mask);
4359 if (sop == 0 && sopcde == 0)
4361 OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4363 OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4364 OUTS (outf, " >>> ");
4365 OUTS (outf, uimm4 (newimmag));
4367 else if (sop == 1 && sopcde == 0 && bit8 == 0)
4369 OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4371 OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4372 OUTS (outf, " << ");
4373 OUTS (outf, uimm4 (immag));
4374 OUTS (outf, " (S)");
4376 else if (sop == 1 && sopcde == 0 && bit8 == 1)
4378 OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4380 OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4381 OUTS (outf, " >>> ");
4382 OUTS (outf, uimm4 (newimmag));
4383 OUTS (outf, " (S)");
4385 else if (sop == 2 && sopcde == 0 && bit8 == 0)
4387 OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4389 OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4390 OUTS (outf, " << ");
4391 OUTS (outf, uimm4 (immag));
4393 else if (sop == 2 && sopcde == 0 && bit8 == 1)
4395 OUTS (outf, (HLs & 2) ? dregs_hi (dst0) : dregs_lo (dst0));
4397 OUTS (outf, (HLs & 1) ? dregs_hi (src1) : dregs_lo (src1));
4398 OUTS (outf, " >> ");
4399 OUTS (outf, uimm4 (newimmag));
4401 else if (sop == 2 && sopcde == 3 && HLs == 1)
4403 OUTS (outf, "A1 = ROT A1 BY ");
4404 OUTS (outf, imm6 (immag));
4406 else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 0)
4408 OUTS (outf, "A0 = A0 << ");
4409 OUTS (outf, uimm5 (immag));
4411 else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 1)
4413 OUTS (outf, "A0 = A0 >>> ");
4414 OUTS (outf, uimm5 (newimmag));
4416 else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 0)
4418 OUTS (outf, "A1 = A1 << ");
4419 OUTS (outf, uimm5 (immag));
4421 else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 1)
4423 OUTS (outf, "A1 = A1 >>> ");
4424 OUTS (outf, uimm5 (newimmag));
4426 else if (sop == 1 && sopcde == 3 && HLs == 0)
4428 OUTS (outf, "A0 = A0 >> ");
4429 OUTS (outf, uimm5 (newimmag));
4431 else if (sop == 1 && sopcde == 3 && HLs == 1)
4433 OUTS (outf, "A1 = A1 >> ");
4434 OUTS (outf, uimm5 (newimmag));
4436 else if (sop == 2 && sopcde == 3 && HLs == 0)
4438 OUTS (outf, "A0 = ROT A0 BY ");
4439 OUTS (outf, imm6 (immag));
4441 else if (sop == 1 && sopcde == 1 && bit8 == 0)
4443 OUTS (outf, dregs (dst0));
4445 OUTS (outf, dregs (src1));
4446 OUTS (outf, " << ");
4447 OUTS (outf, uimm5 (immag));
4448 OUTS (outf, " (V, S)");
4450 else if (sop == 1 && sopcde == 1 && bit8 == 1)
4452 OUTS (outf, dregs (dst0));
4454 OUTS (outf, dregs (src1));
4455 OUTS (outf, " >>> ");
4456 OUTS (outf, imm5 (-immag));
4457 OUTS (outf, " (V, S)");
4459 else if (sop == 2 && sopcde == 1 && bit8 == 1)
4461 OUTS (outf, dregs (dst0));
4463 OUTS (outf, dregs (src1));
4464 OUTS (outf, " >> ");
4465 OUTS (outf, uimm5 (newimmag));
4466 OUTS (outf, " (V)");
4468 else if (sop == 2 && sopcde == 1 && bit8 == 0)
4470 OUTS (outf, dregs (dst0));
4472 OUTS (outf, dregs (src1));
4473 OUTS (outf, " << ");
4474 OUTS (outf, imm5 (immag));
4475 OUTS (outf, " (V)");
4477 else if (sop == 0 && sopcde == 1)
4479 OUTS (outf, dregs (dst0));
4481 OUTS (outf, dregs (src1));
4482 OUTS (outf, " >>> ");
4483 OUTS (outf, uimm5 (newimmag));
4484 OUTS (outf, " (V)");
4486 else if (sop == 1 && sopcde == 2)
4488 OUTS (outf, dregs (dst0));
4490 OUTS (outf, dregs (src1));
4491 OUTS (outf, " << ");
4492 OUTS (outf, uimm5 (immag));
4493 OUTS (outf, " (S)");
4495 else if (sop == 2 && sopcde == 2 && bit8 == 1)
4497 OUTS (outf, dregs (dst0));
4499 OUTS (outf, dregs (src1));
4500 OUTS (outf, " >> ");
4501 OUTS (outf, uimm5 (newimmag));
4503 else if (sop == 2 && sopcde == 2 && bit8 == 0)
4505 OUTS (outf, dregs (dst0));
4507 OUTS (outf, dregs (src1));
4508 OUTS (outf, " << ");
4509 OUTS (outf, uimm5 (immag));
4511 else if (sop == 3 && sopcde == 2)
4513 OUTS (outf, dregs (dst0));
4514 OUTS (outf, " = ROT ");
4515 OUTS (outf, dregs (src1));
4516 OUTS (outf, " BY ");
4517 OUTS (outf, imm6 (immag));
4519 else if (sop == 0 && sopcde == 2)
4521 OUTS (outf, dregs (dst0));
4523 OUTS (outf, dregs (src1));
4524 OUTS (outf, " >>> ");
4525 OUTS (outf, uimm5 (newimmag));
4534 decode_pseudoDEBUG_0 (TIword iw0, disassemble_info *outf)
4536 struct private *priv = outf->private_data;
4538 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4539 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 |.fn....|.grp.......|.reg.......|
4540 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
4541 int fn = ((iw0 >> PseudoDbg_fn_bits) & PseudoDbg_fn_mask);
4542 int grp = ((iw0 >> PseudoDbg_grp_bits) & PseudoDbg_grp_mask);
4543 int reg = ((iw0 >> PseudoDbg_reg_bits) & PseudoDbg_reg_mask);
4548 if (reg == 0 && fn == 3)
4549 OUTS (outf, "DBG A0");
4551 else if (reg == 1 && fn == 3)
4552 OUTS (outf, "DBG A1");
4554 else if (reg == 3 && fn == 3)
4555 OUTS (outf, "ABORT");
4557 else if (reg == 4 && fn == 3)
4560 else if (reg == 5 && fn == 3)
4561 OUTS (outf, "DBGHALT");
4563 else if (reg == 6 && fn == 3)
4565 OUTS (outf, "DBGCMPLX (");
4566 OUTS (outf, dregs (grp));
4569 else if (reg == 7 && fn == 3)
4572 else if (grp == 0 && fn == 2)
4574 OUTS (outf, "OUTC ");
4575 OUTS (outf, dregs (reg));
4579 OUTS (outf, "DBG ");
4580 OUTS (outf, allregs (reg, grp));
4584 OUTS (outf, "PRNT ");
4585 OUTS (outf, allregs (reg, grp));
4594 decode_pseudoOChar_0 (TIword iw0, disassemble_info *outf)
4596 struct private *priv = outf->private_data;
4598 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4599 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |.ch............................|
4600 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
4601 int ch = ((iw0 >> PseudoChr_ch_bits) & PseudoChr_ch_mask);
4606 OUTS (outf, "OUTC ");
4607 OUTS (outf, uimm8 (ch));
4613 decode_pseudodbg_assert_0 (TIword iw0, TIword iw1, disassemble_info *outf)
4615 struct private *priv = outf->private_data;
4617 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
4618 | 1 | 1 | 1 | 1 | 0 | - | - | - | dbgop |.grp.......|.regtest...|
4619 |.expected......................................................|
4620 +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
4621 int expected = ((iw1 >> PseudoDbg_Assert_expected_bits) & PseudoDbg_Assert_expected_mask);
4622 int dbgop = ((iw0 >> (PseudoDbg_Assert_dbgop_bits - 16)) & PseudoDbg_Assert_dbgop_mask);
4623 int grp = ((iw0 >> (PseudoDbg_Assert_grp_bits - 16)) & PseudoDbg_Assert_grp_mask);
4624 int regtest = ((iw0 >> (PseudoDbg_Assert_regtest_bits - 16)) & PseudoDbg_Assert_regtest_mask);
4631 OUTS (outf, "DBGA (");
4632 OUTS (outf, regs_lo (regtest, grp));
4634 OUTS (outf, uimm16 (expected));
4637 else if (dbgop == 1)
4639 OUTS (outf, "DBGA (");
4640 OUTS (outf, regs_hi (regtest, grp));
4642 OUTS (outf, uimm16 (expected));
4645 else if (dbgop == 2)
4647 OUTS (outf, "DBGAL (");
4648 OUTS (outf, allregs (regtest, grp));
4650 OUTS (outf, uimm16 (expected));
4653 else if (dbgop == 3)
4655 OUTS (outf, "DBGAH (");
4656 OUTS (outf, allregs (regtest, grp));
4658 OUTS (outf, uimm16 (expected));
4667 ifetch (bfd_vma pc, disassemble_info *outf, TIword *iw)
4672 status = (*outf->read_memory_func) (pc, buf, 2, outf);
4675 (*outf->memory_error_func) (status, pc, outf);
4679 *iw = bfd_getl16 (buf);
4684 _print_insn_bfin (bfd_vma pc, disassemble_info *outf)
4686 struct private *priv = outf->private_data;
4691 /* The PC must be 16-bit aligned. */
4694 OUTS (outf, "ILLEGAL (UNALIGNED)");
4695 /* For people dumping data, just re-align the return value. */
4699 if (ifetch (pc, outf, &iw0))
4703 if ((iw0 & 0xc000) == 0xc000)
4706 if (ifetch (pc + 2, outf, &iw1))
4713 if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
4717 OUTS (outf, "ILLEGAL");
4720 OUTS (outf, "MNOP");
4723 else if ((iw0 & 0xff00) == 0x0000)
4724 rv = decode_ProgCtrl_0 (iw0, outf);
4725 else if ((iw0 & 0xffc0) == 0x0240)
4726 rv = decode_CaCTRL_0 (iw0, outf);
4727 else if ((iw0 & 0xff80) == 0x0100)
4728 rv = decode_PushPopReg_0 (iw0, outf);
4729 else if ((iw0 & 0xfe00) == 0x0400)
4730 rv = decode_PushPopMultiple_0 (iw0, outf);
4731 else if ((iw0 & 0xfe00) == 0x0600)
4732 rv = decode_ccMV_0 (iw0, outf);
4733 else if ((iw0 & 0xf800) == 0x0800)
4734 rv = decode_CCflag_0 (iw0, outf);
4735 else if ((iw0 & 0xffe0) == 0x0200)
4736 rv = decode_CC2dreg_0 (iw0, outf);
4737 else if ((iw0 & 0xff00) == 0x0300)
4738 rv = decode_CC2stat_0 (iw0, outf);
4739 else if ((iw0 & 0xf000) == 0x1000)
4740 rv = decode_BRCC_0 (iw0, pc, outf);
4741 else if ((iw0 & 0xf000) == 0x2000)
4742 rv = decode_UJUMP_0 (iw0, pc, outf);
4743 else if ((iw0 & 0xf000) == 0x3000)
4744 rv = decode_REGMV_0 (iw0, outf);
4745 else if ((iw0 & 0xfc00) == 0x4000)
4746 rv = decode_ALU2op_0 (iw0, outf);
4747 else if ((iw0 & 0xfe00) == 0x4400)
4748 rv = decode_PTR2op_0 (iw0, outf);
4749 else if ((iw0 & 0xf800) == 0x4800)
4750 rv = decode_LOGI2op_0 (iw0, outf);
4751 else if ((iw0 & 0xf000) == 0x5000)
4752 rv = decode_COMP3op_0 (iw0, outf);
4753 else if ((iw0 & 0xf800) == 0x6000)
4754 rv = decode_COMPI2opD_0 (iw0, outf);
4755 else if ((iw0 & 0xf800) == 0x6800)
4756 rv = decode_COMPI2opP_0 (iw0, outf);
4757 else if ((iw0 & 0xf000) == 0x8000)
4758 rv = decode_LDSTpmod_0 (iw0, outf);
4759 else if ((iw0 & 0xff60) == 0x9e60)
4760 rv = decode_dagMODim_0 (iw0, outf);
4761 else if ((iw0 & 0xfff0) == 0x9f60)
4762 rv = decode_dagMODik_0 (iw0, outf);
4763 else if ((iw0 & 0xfc00) == 0x9c00)
4764 rv = decode_dspLDST_0 (iw0, outf);
4765 else if ((iw0 & 0xf000) == 0x9000)
4766 rv = decode_LDST_0 (iw0, outf);
4767 else if ((iw0 & 0xfc00) == 0xb800)
4768 rv = decode_LDSTiiFP_0 (iw0, outf);
4769 else if ((iw0 & 0xe000) == 0xA000)
4770 rv = decode_LDSTii_0 (iw0, outf);
4771 else if ((iw0 & 0xff80) == 0xe080 && (iw1 & 0x0C00) == 0x0000)
4772 rv = decode_LoopSetup_0 (iw0, iw1, pc, outf);
4773 else if ((iw0 & 0xff00) == 0xe100 && (iw1 & 0x0000) == 0x0000)
4774 rv = decode_LDIMMhalf_0 (iw0, iw1, outf);
4775 else if ((iw0 & 0xfe00) == 0xe200 && (iw1 & 0x0000) == 0x0000)
4776 rv = decode_CALLa_0 (iw0, iw1, pc, outf);
4777 else if ((iw0 & 0xfc00) == 0xe400 && (iw1 & 0x0000) == 0x0000)
4778 rv = decode_LDSTidxI_0 (iw0, iw1, outf);
4779 else if ((iw0 & 0xfffe) == 0xe800 && (iw1 & 0x0000) == 0x0000)
4780 rv = decode_linkage_0 (iw0, iw1, outf);
4781 else if ((iw0 & 0xf600) == 0xc000 && (iw1 & 0x0000) == 0x0000)
4782 rv = decode_dsp32mac_0 (iw0, iw1, outf);
4783 else if ((iw0 & 0xf600) == 0xc200 && (iw1 & 0x0000) == 0x0000)
4784 rv = decode_dsp32mult_0 (iw0, iw1, outf);
4785 else if ((iw0 & 0xf7c0) == 0xc400 && (iw1 & 0x0000) == 0x0000)
4786 rv = decode_dsp32alu_0 (iw0, iw1, outf);
4787 else if ((iw0 & 0xf780) == 0xc600 && (iw1 & 0x01c0) == 0x0000)
4788 rv = decode_dsp32shift_0 (iw0, iw1, outf);
4789 else if ((iw0 & 0xf780) == 0xc680 && (iw1 & 0x0000) == 0x0000)
4790 rv = decode_dsp32shiftimm_0 (iw0, iw1, outf);
4791 else if ((iw0 & 0xff00) == 0xf800)
4792 rv = decode_pseudoDEBUG_0 (iw0, outf);
4793 else if ((iw0 & 0xFF00) == 0xF900)
4794 rv = decode_pseudoOChar_0 (iw0, outf);
4795 else if ((iw0 & 0xFF00) == 0xf000 && (iw1 & 0x0000) == 0x0000)
4796 rv = decode_pseudodbg_assert_0 (iw0, iw1, outf);
4799 OUTS (outf, "ILLEGAL");
4805 print_insn_bfin (bfd_vma pc, disassemble_info *outf)
4807 struct private priv;
4812 outf->private_data = &priv;
4814 count = _print_insn_bfin (pc, outf);
4818 /* Proper display of multiple issue instructions. */
4820 if (count == 4 && (priv.iw0 & 0xc000) == 0xc000 && (priv.iw0 & BIT_MULTI_INS)
4821 && ((priv.iw0 & 0xe800) != 0xe800 /* Not Linkage. */ ))
4827 OUTS (outf, " || ");
4828 len = _print_insn_bfin (pc + 4, outf);
4831 OUTS (outf, " || ");
4834 len = _print_insn_bfin (pc + 6, outf);
4844 OUTS (outf, ";\t\t/* ILLEGAL PARALLEL INSTRUCTION */");