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