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