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