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