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 &LTREG (0);
710ed0d50c3Schristos 	case 50: return &LBREG (0);
711ed0d50c3Schristos 	case 51: return &LCREG (1);
712ed0d50c3Schristos 	case 52: return &LTREG (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