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