1 1.1 christos /* s12z-decode.c -- Freescale S12Z disassembly 2 1.1.1.4 christos Copyright (C) 2018-2025 Free Software Foundation, Inc. 3 1.1 christos 4 1.1 christos This file is part of the GNU opcodes library. 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 #include <stdint.h> 24 1.1 christos #include <stdbool.h> 25 1.1 christos #include <assert.h> 26 1.1 christos 27 1.1 christos #include "opcode/s12z.h" 28 1.1 christos 29 1.1 christos #include "bfd.h" 30 1.1 christos 31 1.1 christos #include "s12z-opc.h" 32 1.1 christos 33 1.1 christos 34 1.1.1.2 christos typedef int (*insn_bytes_f) (struct mem_read_abstraction_base *); 35 1.1 christos 36 1.1.1.2 christos typedef int (*operands_f) (struct mem_read_abstraction_base *, 37 1.1.1.2 christos int *n_operands, struct operand **operand); 38 1.1 christos 39 1.1 christos typedef enum optr (*discriminator_f) (struct mem_read_abstraction_base *, 40 1.1.1.2 christos enum optr hint); 41 1.1 christos 42 1.1 christos enum OPR_MODE 43 1.1 christos { 44 1.1 christos OPR_IMMe4, 45 1.1 christos OPR_REG, 46 1.1 christos OPR_OFXYS, 47 1.1 christos OPR_XY_PRE_INC, 48 1.1 christos OPR_XY_POST_INC, 49 1.1 christos OPR_XY_PRE_DEC, 50 1.1 christos OPR_XY_POST_DEC, 51 1.1 christos OPR_S_PRE_DEC, 52 1.1 christos OPR_S_POST_INC, 53 1.1 christos OPR_REG_DIRECT, 54 1.1 christos OPR_REG_INDIRECT, 55 1.1 christos OPR_IDX_DIRECT, 56 1.1 christos OPR_IDX_INDIRECT, 57 1.1 christos OPR_EXT1, 58 1.1 christos OPR_IDX2_REG, 59 1.1 christos OPR_IDX3_DIRECT, 60 1.1 christos OPR_IDX3_INDIRECT, 61 1.1 christos 62 1.1 christos OPR_EXT18, 63 1.1 christos OPR_IDX3_DIRECT_REG, 64 1.1 christos OPR_EXT3_DIRECT, 65 1.1 christos OPR_EXT3_INDIRECT 66 1.1 christos }; 67 1.1 christos 68 1.1 christos struct opr_pb 69 1.1 christos { 70 1.1 christos uint8_t mask; 71 1.1 christos uint8_t value; 72 1.1 christos int n_operands; 73 1.1 christos enum OPR_MODE mode; 74 1.1 christos }; 75 1.1 christos 76 1.1 christos static const struct opr_pb opr_pb[] = { 77 1.1 christos {0xF0, 0x70, 1, OPR_IMMe4}, 78 1.1 christos {0xF8, 0xB8, 1, OPR_REG}, 79 1.1 christos {0xC0, 0x40, 1, OPR_OFXYS}, 80 1.1 christos {0xEF, 0xE3, 1, OPR_XY_PRE_INC}, 81 1.1 christos {0xEF, 0xE7, 1, OPR_XY_POST_INC}, 82 1.1 christos {0xEF, 0xC3, 1, OPR_XY_PRE_DEC}, 83 1.1 christos {0xEF, 0xC7, 1, OPR_XY_POST_DEC}, 84 1.1 christos {0xFF, 0xFB, 1, OPR_S_PRE_DEC}, 85 1.1 christos {0xFF, 0xFF, 1, OPR_S_POST_INC}, 86 1.1 christos {0xC8, 0x88, 1, OPR_REG_DIRECT}, 87 1.1 christos {0xE8, 0xC8, 1, OPR_REG_INDIRECT}, 88 1.1 christos 89 1.1 christos {0xCE, 0xC0, 2, OPR_IDX_DIRECT}, 90 1.1 christos {0xCE, 0xC4, 2, OPR_IDX_INDIRECT}, 91 1.1 christos {0xC0, 0x00, 2, OPR_EXT1}, 92 1.1 christos 93 1.1 christos {0xC8, 0x80, 3, OPR_IDX2_REG}, 94 1.1 christos {0xFA, 0xF8, 3, OPR_EXT18}, 95 1.1 christos 96 1.1 christos {0xCF, 0xC2, 4, OPR_IDX3_DIRECT}, 97 1.1 christos {0xCF, 0xC6, 4, OPR_IDX3_INDIRECT}, 98 1.1 christos 99 1.1 christos {0xF8, 0xE8, 4, OPR_IDX3_DIRECT_REG}, 100 1.1 christos {0xFF, 0xFA, 4, OPR_EXT3_DIRECT}, 101 1.1 christos {0xFF, 0xFE, 4, OPR_EXT3_INDIRECT}, 102 1.1 christos }; 103 1.1 christos 104 1.1 christos /* Return the number of bytes in a OPR operand, including the XB postbyte. 105 1.1 christos It does not include any preceeding opcodes. */ 106 1.1 christos static int 107 1.1 christos x_opr_n_bytes (struct mem_read_abstraction_base *mra, int offset) 108 1.1 christos { 109 1.1 christos bfd_byte xb; 110 1.1 christos int status = mra->read (mra, offset, 1, &xb); 111 1.1 christos if (status < 0) 112 1.1 christos return status; 113 1.1 christos 114 1.1 christos size_t i; 115 1.1 christos for (i = 0; i < sizeof (opr_pb) / sizeof (opr_pb[0]); ++i) 116 1.1 christos { 117 1.1 christos const struct opr_pb *pb = opr_pb + i; 118 1.1 christos if ((xb & pb->mask) == pb->value) 119 1.1 christos { 120 1.1 christos return pb->n_operands; 121 1.1 christos } 122 1.1 christos } 123 1.1 christos 124 1.1 christos return 1; 125 1.1 christos } 126 1.1 christos 127 1.1 christos static int 128 1.1 christos opr_n_bytes_p1 (struct mem_read_abstraction_base *mra) 129 1.1 christos { 130 1.1.1.2 christos int n = x_opr_n_bytes (mra, 0); 131 1.1.1.2 christos if (n < 0) 132 1.1.1.2 christos return n; 133 1.1.1.2 christos return 1 + n; 134 1.1 christos } 135 1.1 christos 136 1.1 christos static int 137 1.1 christos opr_n_bytes2 (struct mem_read_abstraction_base *mra) 138 1.1 christos { 139 1.1 christos int s = x_opr_n_bytes (mra, 0); 140 1.1.1.2 christos if (s < 0) 141 1.1.1.2 christos return s; 142 1.1.1.2 christos int n = x_opr_n_bytes (mra, s); 143 1.1.1.2 christos if (n < 0) 144 1.1.1.2 christos return n; 145 1.1.1.2 christos return s + n + 1; 146 1.1 christos } 147 1.1 christos 148 1.1 christos enum BB_MODE 149 1.1 christos { 150 1.1 christos BB_REG_REG_REG, 151 1.1 christos BB_REG_REG_IMM, 152 1.1 christos BB_REG_OPR_REG, 153 1.1 christos BB_OPR_REG_REG, 154 1.1 christos BB_REG_OPR_IMM, 155 1.1 christos BB_OPR_REG_IMM 156 1.1 christos }; 157 1.1 christos 158 1.1 christos struct opr_bb 159 1.1 christos { 160 1.1 christos uint8_t mask; 161 1.1 christos uint8_t value; 162 1.1 christos int n_operands; 163 1.1 christos bool opr; 164 1.1 christos enum BB_MODE mode; 165 1.1 christos }; 166 1.1 christos 167 1.1 christos static const struct opr_bb bb_modes[] = 168 1.1 christos { 169 1.1 christos {0x60, 0x00, 2, false, BB_REG_REG_REG}, 170 1.1 christos {0x60, 0x20, 3, false, BB_REG_REG_IMM}, 171 1.1 christos {0x70, 0x40, 2, true, BB_REG_OPR_REG}, 172 1.1 christos {0x70, 0x50, 2, true, BB_OPR_REG_REG}, 173 1.1 christos {0x70, 0x60, 3, true, BB_REG_OPR_IMM}, 174 1.1 christos {0x70, 0x70, 3, true, BB_OPR_REG_IMM} 175 1.1 christos }; 176 1.1 christos 177 1.1 christos static int 178 1.1 christos bfextins_n_bytes (struct mem_read_abstraction_base *mra) 179 1.1 christos { 180 1.1 christos bfd_byte bb; 181 1.1 christos int status = mra->read (mra, 0, 1, &bb); 182 1.1 christos if (status < 0) 183 1.1 christos return status; 184 1.1 christos 185 1.1 christos size_t i; 186 1.1 christos const struct opr_bb *bbs = 0; 187 1.1 christos for (i = 0; i < sizeof (bb_modes) / sizeof (bb_modes[0]); ++i) 188 1.1 christos { 189 1.1 christos bbs = bb_modes + i; 190 1.1 christos if ((bb & bbs->mask) == bbs->value) 191 1.1 christos { 192 1.1 christos break; 193 1.1 christos } 194 1.1 christos } 195 1.1 christos 196 1.1 christos int n = bbs->n_operands; 197 1.1 christos if (bbs->opr) 198 1.1.1.2 christos { 199 1.1.1.2 christos int x = x_opr_n_bytes (mra, n - 1); 200 1.1.1.2 christos if (x < 0) 201 1.1.1.2 christos return x; 202 1.1.1.2 christos n += x; 203 1.1.1.2 christos } 204 1.1 christos 205 1.1 christos return n; 206 1.1 christos } 207 1.1 christos 208 1.1 christos static int 209 1.1 christos single (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED) 210 1.1 christos { 211 1.1 christos return 1; 212 1.1 christos } 213 1.1 christos 214 1.1 christos static int 215 1.1 christos two (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED) 216 1.1 christos { 217 1.1 christos return 2; 218 1.1 christos } 219 1.1 christos 220 1.1 christos static int 221 1.1 christos three (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED) 222 1.1 christos { 223 1.1 christos return 3; 224 1.1 christos } 225 1.1 christos 226 1.1 christos static int 227 1.1 christos four (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED) 228 1.1 christos { 229 1.1 christos return 4; 230 1.1 christos } 231 1.1 christos 232 1.1 christos static int 233 1.1 christos five (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED) 234 1.1 christos { 235 1.1 christos return 5; 236 1.1 christos } 237 1.1 christos 238 1.1 christos static int 239 1.1 christos pcrel_15bit (struct mem_read_abstraction_base *mra) 240 1.1 christos { 241 1.1 christos bfd_byte byte; 242 1.1 christos int status = mra->read (mra, 0, 1, &byte); 243 1.1 christos if (status < 0) 244 1.1 christos return status; 245 1.1 christos return (byte & 0x80) ? 3 : 2; 246 1.1 christos } 247 1.1 christos 248 1.1 christos 249 1.1 christos 250 1.1 christos static int 252 1.1 christos xysp_reg_from_postbyte (uint8_t postbyte) 253 1.1 christos { 254 1.1 christos int reg = -1; 255 1.1 christos switch ((postbyte & 0x30) >> 4) 256 1.1 christos { 257 1.1 christos case 0: 258 1.1 christos reg = REG_X; 259 1.1 christos break; 260 1.1 christos case 1: 261 1.1 christos reg = REG_Y; 262 1.1 christos break; 263 1.1 christos case 2: 264 1.1 christos reg = REG_S; 265 1.1 christos break; 266 1.1 christos default: 267 1.1 christos reg = REG_P; 268 1.1 christos } 269 1.1 christos return reg; 270 1.1 christos } 271 1.1 christos 272 1.1 christos static struct operand * 273 1.1 christos create_immediate_operand (int value) 274 1.1 christos { 275 1.1 christos struct immediate_operand *op = malloc (sizeof (*op)); 276 1.1.1.2 christos 277 1.1.1.2 christos if (op != NULL) 278 1.1.1.2 christos { 279 1.1.1.2 christos op->parent.cl = OPND_CL_IMMEDIATE; 280 1.1.1.2 christos op->parent.osize = -1; 281 1.1.1.2 christos op->value = value; 282 1.1 christos } 283 1.1 christos return (struct operand *) op; 284 1.1 christos } 285 1.1 christos 286 1.1 christos static struct operand * 287 1.1 christos create_bitfield_operand (int width, int offset) 288 1.1 christos { 289 1.1 christos struct bitfield_operand *op = malloc (sizeof (*op)); 290 1.1.1.2 christos 291 1.1.1.2 christos if (op != NULL) 292 1.1.1.2 christos { 293 1.1.1.2 christos op->parent.cl = OPND_CL_BIT_FIELD; 294 1.1.1.2 christos op->parent.osize = -1; 295 1.1.1.2 christos op->width = width; 296 1.1.1.2 christos op->offset = offset; 297 1.1 christos } 298 1.1 christos return (struct operand *) op; 299 1.1 christos } 300 1.1 christos 301 1.1 christos static struct operand * 302 1.1 christos create_register_operand_with_size (int reg, short osize) 303 1.1 christos { 304 1.1 christos struct register_operand *op = malloc (sizeof (*op)); 305 1.1.1.2 christos 306 1.1.1.2 christos if (op != NULL) 307 1.1.1.2 christos { 308 1.1.1.2 christos op->parent.cl = OPND_CL_REGISTER; 309 1.1.1.2 christos op->parent.osize = osize; 310 1.1.1.2 christos op->reg = reg; 311 1.1 christos } 312 1.1 christos return (struct operand *) op; 313 1.1 christos } 314 1.1 christos 315 1.1 christos static struct operand * 316 1.1 christos create_register_operand (int reg) 317 1.1 christos { 318 1.1 christos return create_register_operand_with_size (reg, -1); 319 1.1 christos } 320 1.1 christos 321 1.1 christos static struct operand * 322 1.1 christos create_register_all_operand (void) 323 1.1 christos { 324 1.1 christos struct register_operand *op = malloc (sizeof (*op)); 325 1.1.1.2 christos 326 1.1.1.2 christos if (op != NULL) 327 1.1.1.2 christos { 328 1.1.1.2 christos op->parent.cl = OPND_CL_REGISTER_ALL; 329 1.1.1.2 christos op->parent.osize = -1; 330 1.1 christos } 331 1.1 christos return (struct operand *) op; 332 1.1 christos } 333 1.1 christos 334 1.1 christos static struct operand * 335 1.1 christos create_register_all16_operand (void) 336 1.1 christos { 337 1.1 christos struct register_operand *op = malloc (sizeof (*op)); 338 1.1.1.2 christos 339 1.1.1.2 christos if (op != NULL) 340 1.1.1.2 christos { 341 1.1.1.2 christos op->parent.cl = OPND_CL_REGISTER_ALL16; 342 1.1.1.2 christos op->parent.osize = -1; 343 1.1 christos } 344 1.1 christos return (struct operand *) op; 345 1.1 christos } 346 1.1 christos 347 1.1 christos 348 1.1 christos static struct operand * 349 1.1 christos create_simple_memory_operand (bfd_vma addr, bfd_vma base, bool relative) 350 1.1.1.2 christos { 351 1.1 christos struct simple_memory_operand *op; 352 1.1 christos 353 1.1.1.2 christos assert (relative || base == 0); 354 1.1.1.2 christos op = malloc (sizeof (*op)); 355 1.1.1.2 christos if (op != NULL) 356 1.1.1.2 christos { 357 1.1.1.2 christos op->parent.cl = OPND_CL_SIMPLE_MEMORY; 358 1.1.1.2 christos op->parent.osize = -1; 359 1.1.1.2 christos op->addr = addr; 360 1.1.1.2 christos op->base = base; 361 1.1.1.2 christos op->relative = relative; 362 1.1 christos } 363 1.1 christos return (struct operand *) op; 364 1.1 christos } 365 1.1 christos 366 1.1 christos static struct operand * 367 1.1 christos create_memory_operand (bool indirect, int base, int n_regs, int reg0, int reg1) 368 1.1 christos { 369 1.1 christos struct memory_operand *op = malloc (sizeof (*op)); 370 1.1.1.2 christos 371 1.1.1.2 christos if (op != NULL) 372 1.1.1.2 christos { 373 1.1.1.2 christos op->parent.cl = OPND_CL_MEMORY; 374 1.1.1.2 christos op->parent.osize = -1; 375 1.1.1.2 christos op->indirect = indirect; 376 1.1.1.2 christos op->base_offset = base; 377 1.1.1.2 christos op->mutation = OPND_RM_NONE; 378 1.1.1.2 christos op->n_regs = n_regs; 379 1.1.1.2 christos op->regs[0] = reg0; 380 1.1.1.2 christos op->regs[1] = reg1; 381 1.1 christos } 382 1.1 christos return (struct operand *) op; 383 1.1 christos } 384 1.1 christos 385 1.1 christos static struct operand * 386 1.1 christos create_memory_auto_operand (enum op_reg_mutation mutation, int reg) 387 1.1 christos { 388 1.1 christos struct memory_operand *op = malloc (sizeof (*op)); 389 1.1.1.2 christos 390 1.1.1.2 christos if (op != NULL) 391 1.1.1.2 christos { 392 1.1.1.2 christos op->parent.cl = OPND_CL_MEMORY; 393 1.1.1.2 christos op->parent.osize = -1; 394 1.1.1.2 christos op->indirect = false; 395 1.1.1.2 christos op->base_offset = 0; 396 1.1.1.2 christos op->mutation = mutation; 397 1.1.1.2 christos op->n_regs = 1; 398 1.1.1.2 christos op->regs[0] = reg; 399 1.1.1.2 christos op->regs[1] = -1; 400 1.1 christos } 401 1.1 christos return (struct operand *) op; 402 1.1 christos } 403 1.1 christos 404 1.1 christos 405 1.1.1.2 christos 407 1.1 christos static int 408 1.1 christos z_ext24_decode (struct mem_read_abstraction_base *mra, int *n_operands, 409 1.1.1.2 christos struct operand **operand) 410 1.1 christos { 411 1.1 christos struct operand *op; 412 1.1 christos uint8_t buffer[3]; 413 1.1.1.2 christos int status = mra->read (mra, 0, 3, buffer); 414 1.1 christos if (status < 0) 415 1.1 christos return status; 416 1.1 christos 417 1.1 christos int i; 418 1.1 christos uint32_t addr = 0; 419 1.1 christos for (i = 0; i < 3; ++i) 420 1.1 christos { 421 1.1 christos addr <<= 8; 422 1.1 christos addr |= buffer[i]; 423 1.1.1.2 christos } 424 1.1.1.2 christos 425 1.1.1.2 christos op = create_simple_memory_operand (addr, 0, false); 426 1.1.1.2 christos if (op == NULL) 427 1.1.1.2 christos return -1; 428 1.1 christos operand[(*n_operands)++] = op; 429 1.1 christos return 0; 430 1.1 christos } 431 1.1.1.2 christos 432 1.1 christos 433 1.1.1.2 christos static int 434 1.1 christos z_decode_signed_value (struct mem_read_abstraction_base *mra, int offset, 435 1.1 christos short size, uint32_t *result) 436 1.1 christos { 437 1.1 christos assert (size >0); 438 1.1.1.2 christos assert (size <= 4); 439 1.1.1.2 christos bfd_byte buffer[4]; 440 1.1.1.2 christos int status = mra->read (mra, offset, size, buffer); 441 1.1 christos if (status < 0) 442 1.1 christos return status; 443 1.1 christos 444 1.1 christos int i; 445 1.1 christos uint32_t value = 0; 446 1.1 christos for (i = 0; i < size; ++i) 447 1.1 christos value = (value << 8) | buffer[i]; 448 1.1 christos 449 1.1 christos if (buffer[0] & 0x80) 450 1.1.1.2 christos { 451 1.1 christos /* Deal with negative values */ 452 1.1.1.2 christos value -= 1u << (size * 4) << (size * 4); 453 1.1.1.2 christos } 454 1.1 christos *result = value; 455 1.1 christos return 0; 456 1.1.1.2 christos } 457 1.1.1.2 christos 458 1.1.1.2 christos static int 459 1.1 christos decode_signed_value (struct mem_read_abstraction_base *mra, short size, 460 1.1.1.2 christos uint32_t *result) 461 1.1 christos { 462 1.1 christos return z_decode_signed_value (mra, 0, size, result); 463 1.1.1.2 christos } 464 1.1 christos 465 1.1 christos static int 466 1.1 christos x_imm1 (struct mem_read_abstraction_base *mra, 467 1.1 christos int offset, 468 1.1.1.2 christos int *n_operands, struct operand **operand) 469 1.1 christos { 470 1.1 christos struct operand *op; 471 1.1 christos bfd_byte byte; 472 1.1.1.2 christos int status = mra->read (mra, offset, 1, &byte); 473 1.1 christos if (status < 0) 474 1.1.1.2 christos return status; 475 1.1.1.2 christos 476 1.1.1.2 christos op = create_immediate_operand (byte); 477 1.1.1.2 christos if (op == NULL) 478 1.1.1.2 christos return -1; 479 1.1 christos operand[(*n_operands)++] = op; 480 1.1 christos return 0; 481 1.1 christos } 482 1.1.1.2 christos 483 1.1 christos /* An eight bit immediate operand. */ 484 1.1 christos static int 485 1.1 christos imm1_decode (struct mem_read_abstraction_base *mra, 486 1.1.1.2 christos int *n_operands, struct operand **operand) 487 1.1 christos { 488 1.1 christos return x_imm1 (mra, 0, n_operands, operand); 489 1.1.1.2 christos } 490 1.1 christos 491 1.1 christos static int 492 1.1 christos trap_decode (struct mem_read_abstraction_base *mra, 493 1.1.1.2 christos int *n_operands, struct operand **operand) 494 1.1 christos { 495 1.1 christos return x_imm1 (mra, -1, n_operands, operand); 496 1.1 christos } 497 1.1 christos 498 1.1 christos 499 1.1 christos static struct operand * 500 1.1 christos x_opr_decode_with_size (struct mem_read_abstraction_base *mra, int offset, 501 1.1 christos short osize) 502 1.1 christos { 503 1.1 christos bfd_byte postbyte; 504 1.1 christos int status = mra->read (mra, offset, 1, &postbyte); 505 1.1 christos if (status < 0) 506 1.1 christos return NULL; 507 1.1 christos offset++; 508 1.1 christos 509 1.1 christos enum OPR_MODE mode = -1; 510 1.1 christos size_t i; 511 1.1 christos for (i = 0; i < sizeof (opr_pb) / sizeof (opr_pb[0]); ++i) 512 1.1 christos { 513 1.1 christos const struct opr_pb *pb = opr_pb + i; 514 1.1 christos if ((postbyte & pb->mask) == pb->value) 515 1.1 christos { 516 1.1 christos mode = pb->mode; 517 1.1 christos break; 518 1.1 christos } 519 1.1 christos } 520 1.1 christos 521 1.1 christos struct operand *operand = NULL; 522 1.1 christos switch (mode) 523 1.1 christos { 524 1.1 christos case OPR_IMMe4: 525 1.1 christos { 526 1.1 christos int n; 527 1.1 christos uint8_t x = (postbyte & 0x0F); 528 1.1 christos if (x == 0) 529 1.1 christos n = -1; 530 1.1 christos else 531 1.1 christos n = x; 532 1.1 christos 533 1.1 christos operand = create_immediate_operand (n); 534 1.1 christos break; 535 1.1 christos } 536 1.1 christos case OPR_REG: 537 1.1 christos { 538 1.1 christos uint8_t x = (postbyte & 0x07); 539 1.1 christos operand = create_register_operand (x); 540 1.1 christos break; 541 1.1 christos } 542 1.1 christos case OPR_OFXYS: 543 1.1 christos { 544 1.1 christos operand = create_memory_operand (false, postbyte & 0x0F, 1, 545 1.1 christos xysp_reg_from_postbyte (postbyte), -1); 546 1.1 christos break; 547 1.1 christos } 548 1.1 christos case OPR_REG_DIRECT: 549 1.1 christos { 550 1.1 christos operand = create_memory_operand (false, 0, 2, postbyte & 0x07, 551 1.1 christos xysp_reg_from_postbyte (postbyte)); 552 1.1 christos break; 553 1.1 christos } 554 1.1 christos case OPR_REG_INDIRECT: 555 1.1 christos { 556 1.1 christos operand = create_memory_operand (true, 0, 2, postbyte & 0x07, 557 1.1 christos (postbyte & 0x10) ? REG_Y : REG_X); 558 1.1 christos break; 559 1.1 christos } 560 1.1 christos 561 1.1 christos case OPR_IDX_INDIRECT: 562 1.1.1.2 christos { 563 1.1.1.2 christos uint8_t x1; 564 1.1.1.2 christos status = mra->read (mra, offset, 1, &x1); 565 1.1 christos if (status < 0) 566 1.1 christos return NULL; 567 1.1 christos int idx = x1; 568 1.1 christos 569 1.1 christos if (postbyte & 0x01) 570 1.1 christos { 571 1.1 christos /* Deal with negative values */ 572 1.1 christos idx -= 0x1UL << 8; 573 1.1 christos } 574 1.1 christos 575 1.1 christos operand = create_memory_operand (true, idx, 1, 576 1.1 christos xysp_reg_from_postbyte (postbyte), -1); 577 1.1 christos break; 578 1.1 christos } 579 1.1 christos 580 1.1 christos case OPR_IDX3_DIRECT: 581 1.1.1.2 christos { 582 1.1.1.2 christos uint8_t x[3]; 583 1.1.1.2 christos status = mra->read (mra, offset, 3, x); 584 1.1 christos if (status < 0) 585 1.1 christos return NULL; 586 1.1 christos int idx = x[0] << 16 | x[1] << 8 | x[2]; 587 1.1 christos 588 1.1 christos if (x[0] & 0x80) 589 1.1 christos { 590 1.1 christos /* Deal with negative values */ 591 1.1 christos idx -= 0x1UL << 24; 592 1.1 christos } 593 1.1 christos 594 1.1 christos operand = create_memory_operand (false, idx, 1, 595 1.1 christos xysp_reg_from_postbyte (postbyte), -1); 596 1.1 christos break; 597 1.1 christos } 598 1.1 christos 599 1.1 christos case OPR_IDX3_DIRECT_REG: 600 1.1.1.2 christos { 601 1.1.1.2 christos uint8_t x[3]; 602 1.1.1.2 christos status = mra->read (mra, offset, 3, x); 603 1.1 christos if (status < 0) 604 1.1 christos return NULL; 605 1.1 christos int idx = x[0] << 16 | x[1] << 8 | x[2]; 606 1.1 christos 607 1.1 christos if (x[0] & 0x80) 608 1.1 christos { 609 1.1 christos /* Deal with negative values */ 610 1.1 christos idx -= 0x1UL << 24; 611 1.1 christos } 612 1.1 christos 613 1.1 christos operand = create_memory_operand (false, idx, 1, postbyte & 0x07, -1); 614 1.1 christos break; 615 1.1 christos } 616 1.1 christos 617 1.1 christos case OPR_IDX3_INDIRECT: 618 1.1.1.2 christos { 619 1.1.1.2 christos uint8_t x[3]; 620 1.1.1.2 christos status = mra->read (mra, offset, 3, x); 621 1.1 christos if (status < 0) 622 1.1 christos return NULL; 623 1.1 christos int idx = x[0] << 16 | x[1] << 8 | x[2]; 624 1.1 christos 625 1.1 christos if (x[0] & 0x80) 626 1.1 christos { 627 1.1 christos /* Deal with negative values */ 628 1.1 christos idx -= 0x1UL << 24; 629 1.1 christos } 630 1.1 christos 631 1.1 christos operand = create_memory_operand (true, idx, 1, 632 1.1 christos xysp_reg_from_postbyte (postbyte), -1); 633 1.1 christos break; 634 1.1 christos } 635 1.1 christos 636 1.1 christos case OPR_IDX_DIRECT: 637 1.1.1.2 christos { 638 1.1.1.2 christos uint8_t x1; 639 1.1.1.2 christos status = mra->read (mra, offset, 1, &x1); 640 1.1 christos if (status < 0) 641 1.1 christos return NULL; 642 1.1 christos int idx = x1; 643 1.1 christos 644 1.1 christos if (postbyte & 0x01) 645 1.1 christos { 646 1.1 christos /* Deal with negative values */ 647 1.1 christos idx -= 0x1UL << 8; 648 1.1 christos } 649 1.1 christos 650 1.1 christos operand = create_memory_operand (false, idx, 1, 651 1.1 christos xysp_reg_from_postbyte (postbyte), -1); 652 1.1 christos break; 653 1.1 christos } 654 1.1 christos 655 1.1 christos case OPR_IDX2_REG: 656 1.1.1.2 christos { 657 1.1.1.2 christos uint8_t x[2]; 658 1.1.1.2 christos status = mra->read (mra, offset, 2, x); 659 1.1 christos if (status < 0) 660 1.1 christos return NULL; 661 1.1 christos uint32_t idx = x[1] | x[0] << 8 ; 662 1.1 christos idx |= (postbyte & 0x30) << 12; 663 1.1 christos 664 1.1 christos operand = create_memory_operand (false, idx, 1, postbyte & 0x07, -1); 665 1.1 christos break; 666 1.1 christos } 667 1.1 christos 668 1.1 christos case OPR_XY_PRE_INC: 669 1.1 christos { 670 1.1 christos operand = create_memory_auto_operand (OPND_RM_PRE_INC, 671 1.1 christos (postbyte & 0x10) ? REG_Y: REG_X); 672 1.1 christos break; 673 1.1 christos } 674 1.1 christos case OPR_XY_POST_INC: 675 1.1 christos { 676 1.1 christos operand = create_memory_auto_operand (OPND_RM_POST_INC, 677 1.1 christos (postbyte & 0x10) ? REG_Y: REG_X); 678 1.1 christos break; 679 1.1 christos } 680 1.1 christos case OPR_XY_PRE_DEC: 681 1.1 christos { 682 1.1 christos operand = create_memory_auto_operand (OPND_RM_PRE_DEC, 683 1.1 christos (postbyte & 0x10) ? REG_Y: REG_X); 684 1.1 christos break; 685 1.1 christos } 686 1.1 christos case OPR_XY_POST_DEC: 687 1.1 christos { 688 1.1 christos operand = create_memory_auto_operand (OPND_RM_POST_DEC, 689 1.1 christos (postbyte & 0x10) ? REG_Y: REG_X); 690 1.1 christos break; 691 1.1 christos } 692 1.1 christos case OPR_S_PRE_DEC: 693 1.1 christos { 694 1.1 christos operand = create_memory_auto_operand (OPND_RM_PRE_DEC, REG_S); 695 1.1 christos break; 696 1.1 christos } 697 1.1 christos case OPR_S_POST_INC: 698 1.1 christos { 699 1.1 christos operand = create_memory_auto_operand (OPND_RM_POST_INC, REG_S); 700 1.1 christos break; 701 1.1 christos } 702 1.1 christos 703 1.1 christos case OPR_EXT18: 704 1.1 christos { 705 1.1 christos const size_t size = 2; 706 1.1 christos bfd_byte buffer[4]; 707 1.1.1.2 christos status = mra->read (mra, offset, size, buffer); 708 1.1 christos if (status < 0) 709 1.1 christos return NULL; 710 1.1 christos 711 1.1 christos uint32_t ext18 = 0; 712 1.1 christos for (i = 0; i < size; ++i) 713 1.1 christos { 714 1.1 christos ext18 <<= 8; 715 1.1 christos ext18 |= buffer[i]; 716 1.1 christos } 717 1.1 christos 718 1.1 christos ext18 |= (postbyte & 0x01) << 16; 719 1.1 christos ext18 |= (postbyte & 0x04) << 15; 720 1.1 christos 721 1.1 christos operand = create_simple_memory_operand (ext18, 0, false); 722 1.1 christos break; 723 1.1 christos } 724 1.1 christos 725 1.1 christos case OPR_EXT1: 726 1.1.1.2 christos { 727 1.1.1.2 christos uint8_t x1 = 0; 728 1.1.1.2 christos status = mra->read (mra, offset, 1, &x1); 729 1.1 christos if (status < 0) 730 1.1 christos return NULL; 731 1.1 christos int16_t addr; 732 1.1 christos addr = x1; 733 1.1 christos addr |= (postbyte & 0x3f) << 8; 734 1.1 christos 735 1.1 christos operand = create_simple_memory_operand (addr, 0, false); 736 1.1 christos break; 737 1.1 christos } 738 1.1 christos 739 1.1 christos case OPR_EXT3_DIRECT: 740 1.1 christos { 741 1.1 christos const size_t size = 3; 742 1.1 christos bfd_byte buffer[4]; 743 1.1.1.2 christos status = mra->read (mra, offset, size, buffer); 744 1.1 christos if (status < 0) 745 1.1 christos return NULL; 746 1.1 christos 747 1.1 christos uint32_t ext24 = 0; 748 1.1 christos for (i = 0; i < size; ++i) 749 1.1 christos { 750 1.1 christos ext24 |= buffer[i] << (8 * (size - i - 1)); 751 1.1 christos } 752 1.1 christos 753 1.1 christos operand = create_simple_memory_operand (ext24, 0, false); 754 1.1 christos break; 755 1.1 christos } 756 1.1 christos 757 1.1 christos case OPR_EXT3_INDIRECT: 758 1.1 christos { 759 1.1 christos const size_t size = 3; 760 1.1 christos bfd_byte buffer[4]; 761 1.1.1.2 christos status = mra->read (mra, offset, size, buffer); 762 1.1 christos if (status < 0) 763 1.1 christos return NULL; 764 1.1 christos 765 1.1 christos uint32_t ext24 = 0; 766 1.1 christos for (i = 0; i < size; ++i) 767 1.1 christos { 768 1.1 christos ext24 |= buffer[i] << (8 * (size - i - 1)); 769 1.1 christos } 770 1.1 christos 771 1.1 christos operand = create_memory_operand (true, ext24, 0, -1, -1); 772 1.1 christos break; 773 1.1 christos } 774 1.1 christos 775 1.1 christos default: 776 1.1 christos printf ("Unknown OPR mode #0x%x (%d)", postbyte, mode); 777 1.1 christos abort (); 778 1.1.1.2 christos } 779 1.1.1.2 christos 780 1.1 christos if (operand != NULL) 781 1.1 christos operand->osize = osize; 782 1.1 christos 783 1.1 christos return operand; 784 1.1 christos } 785 1.1 christos 786 1.1 christos static struct operand * 787 1.1 christos x_opr_decode (struct mem_read_abstraction_base *mra, int offset) 788 1.1 christos { 789 1.1 christos return x_opr_decode_with_size (mra, offset, -1); 790 1.1.1.2 christos } 791 1.1 christos 792 1.1 christos static int 793 1.1 christos z_opr_decode (struct mem_read_abstraction_base *mra, 794 1.1.1.2 christos int *n_operands, struct operand **operand) 795 1.1.1.2 christos { 796 1.1.1.2 christos struct operand *op = x_opr_decode (mra, 0); 797 1.1.1.2 christos if (op == NULL) 798 1.1.1.2 christos return -1; 799 1.1 christos operand[(*n_operands)++] = op; 800 1.1 christos return 0; 801 1.1.1.2 christos } 802 1.1 christos 803 1.1 christos static int 804 1.1 christos z_opr_decode2 (struct mem_read_abstraction_base *mra, 805 1.1 christos int *n_operands, struct operand **operand) 806 1.1.1.2 christos { 807 1.1.1.2 christos int n = x_opr_n_bytes (mra, 0); 808 1.1.1.2 christos if (n < 0) 809 1.1.1.2 christos return n; 810 1.1.1.2 christos struct operand *op = x_opr_decode (mra, 0); 811 1.1.1.2 christos if (op == NULL) 812 1.1.1.2 christos return -1; 813 1.1.1.2 christos operand[(*n_operands)++] = op; 814 1.1.1.2 christos op = x_opr_decode (mra, n); 815 1.1.1.2 christos if (op == NULL) 816 1.1.1.2 christos return -1; 817 1.1 christos operand[(*n_operands)++] = op; 818 1.1 christos return 0; 819 1.1.1.2 christos } 820 1.1 christos 821 1.1 christos static int 822 1.1 christos imm1234 (struct mem_read_abstraction_base *mra, int base, 823 1.1.1.2 christos int *n_operands, struct operand **operand) 824 1.1 christos { 825 1.1 christos struct operand *op; 826 1.1 christos bfd_byte opcode; 827 1.1.1.2 christos int status = mra->read (mra, -1, 1, &opcode); 828 1.1 christos if (status < 0) 829 1.1 christos return status; 830 1.1 christos 831 1.1 christos opcode -= base; 832 1.1 christos 833 1.1.1.2 christos int size = registers[opcode & 0xF].bytes; 834 1.1.1.2 christos 835 1.1.1.2 christos uint32_t imm; 836 1.1.1.2 christos if (decode_signed_value (mra, size, &imm) < 0) 837 1.1.1.2 christos return -1; 838 1.1.1.2 christos 839 1.1.1.2 christos op = create_immediate_operand (imm); 840 1.1.1.2 christos if (op == NULL) 841 1.1.1.2 christos return -1; 842 1.1 christos operand[(*n_operands)++] = op; 843 1.1 christos return 0; 844 1.1 christos } 845 1.1 christos 846 1.1.1.2 christos 847 1.1 christos /* Special case of LD and CMP with register S and IMM operand */ 848 1.1 christos static int 849 1.1 christos reg_s_imm (struct mem_read_abstraction_base *mra, int *n_operands, 850 1.1.1.2 christos struct operand **operand) 851 1.1 christos { 852 1.1.1.2 christos struct operand *op; 853 1.1.1.2 christos 854 1.1.1.2 christos op = create_register_operand (REG_S); 855 1.1.1.2 christos if (op == NULL) 856 1.1.1.2 christos return -1; 857 1.1.1.2 christos operand[(*n_operands)++] = op; 858 1.1.1.2 christos 859 1.1.1.2 christos uint32_t imm; 860 1.1.1.2 christos if (decode_signed_value (mra, 3, &imm) < 0) 861 1.1.1.2 christos return -1; 862 1.1.1.2 christos op = create_immediate_operand (imm); 863 1.1.1.2 christos if (op == NULL) 864 1.1.1.2 christos return -1; 865 1.1 christos operand[(*n_operands)++] = op; 866 1.1 christos return 0; 867 1.1 christos } 868 1.1.1.2 christos 869 1.1 christos /* Special case of LD, CMP and ST with register S and OPR operand */ 870 1.1 christos static int 871 1.1 christos reg_s_opr (struct mem_read_abstraction_base *mra, int *n_operands, 872 1.1.1.2 christos struct operand **operand) 873 1.1.1.2 christos { 874 1.1.1.2 christos struct operand *op; 875 1.1.1.2 christos 876 1.1.1.2 christos op = create_register_operand (REG_S); 877 1.1.1.2 christos if (op == NULL) 878 1.1.1.2 christos return -1; 879 1.1.1.2 christos operand[(*n_operands)++] = op; 880 1.1.1.2 christos op = x_opr_decode (mra, 0); 881 1.1.1.2 christos if (op == NULL) 882 1.1.1.2 christos return -1; 883 1.1 christos operand[(*n_operands)++] = op; 884 1.1 christos return 0; 885 1.1.1.2 christos } 886 1.1 christos 887 1.1 christos static int 888 1.1 christos z_imm1234_8base (struct mem_read_abstraction_base *mra, int *n_operands, 889 1.1.1.2 christos struct operand **operand) 890 1.1 christos { 891 1.1 christos return imm1234 (mra, 8, n_operands, operand); 892 1.1.1.2 christos } 893 1.1 christos 894 1.1 christos static int 895 1.1 christos z_imm1234_0base (struct mem_read_abstraction_base *mra, int *n_operands, 896 1.1.1.2 christos struct operand **operand) 897 1.1 christos { 898 1.1 christos return imm1234 (mra, 0, n_operands, operand); 899 1.1 christos } 900 1.1.1.2 christos 901 1.1 christos 902 1.1 christos static int 903 1.1 christos z_tfr (struct mem_read_abstraction_base *mra, int *n_operands, 904 1.1.1.2 christos struct operand **operand) 905 1.1 christos { 906 1.1 christos struct operand *op; 907 1.1 christos bfd_byte byte; 908 1.1.1.2 christos int status = mra->read (mra, 0, 1, &byte); 909 1.1 christos if (status < 0) 910 1.1.1.2 christos return status; 911 1.1.1.2 christos 912 1.1.1.2 christos op = create_register_operand (byte >> 4); 913 1.1.1.2 christos if (op == NULL) 914 1.1.1.2 christos return -1; 915 1.1.1.2 christos operand[(*n_operands)++] = op; 916 1.1.1.2 christos op = create_register_operand (byte & 0x0F); 917 1.1.1.2 christos if (op == NULL) 918 1.1.1.2 christos return -1; 919 1.1 christos operand[(*n_operands)++] = op; 920 1.1 christos return 0; 921 1.1.1.2 christos } 922 1.1 christos 923 1.1 christos static int 924 1.1 christos z_reg (struct mem_read_abstraction_base *mra, int *n_operands, 925 1.1.1.2 christos struct operand **operand) 926 1.1 christos { 927 1.1 christos struct operand *op; 928 1.1 christos bfd_byte byte; 929 1.1.1.2 christos int status = mra->read (mra, -1, 1, &byte); 930 1.1 christos if (status < 0) 931 1.1.1.2 christos return status; 932 1.1.1.2 christos 933 1.1.1.2 christos op = create_register_operand (byte & 0x07); 934 1.1.1.2 christos if (op == NULL) 935 1.1.1.2 christos return -1; 936 1.1 christos operand[(*n_operands)++] = op; 937 1.1 christos return 0; 938 1.1 christos } 939 1.1.1.2 christos 940 1.1 christos 941 1.1 christos static int 942 1.1 christos reg_xy (struct mem_read_abstraction_base *mra, 943 1.1.1.2 christos int *n_operands, struct operand **operand) 944 1.1 christos { 945 1.1 christos struct operand *op; 946 1.1 christos bfd_byte byte; 947 1.1.1.2 christos int status = mra->read (mra, -1, 1, &byte); 948 1.1 christos if (status < 0) 949 1.1.1.2 christos return status; 950 1.1.1.2 christos 951 1.1.1.2 christos op = create_register_operand ((byte & 0x01) ? REG_Y : REG_X); 952 1.1.1.2 christos if (op == NULL) 953 1.1.1.2 christos return -1; 954 1.1 christos operand[(*n_operands)++] = op; 955 1.1 christos return 0; 956 1.1.1.2 christos } 957 1.1 christos 958 1.1 christos static int 959 1.1 christos lea_reg_xys_opr (struct mem_read_abstraction_base *mra, 960 1.1.1.2 christos int *n_operands, struct operand **operand) 961 1.1 christos { 962 1.1 christos struct operand *op; 963 1.1 christos bfd_byte byte; 964 1.1.1.2 christos int status = mra->read (mra, -1, 1, &byte); 965 1.1 christos if (status < 0) 966 1.1 christos return status; 967 1.1 christos 968 1.1 christos int reg_xys = -1; 969 1.1 christos switch (byte & 0x03) 970 1.1 christos { 971 1.1 christos case 0x00: 972 1.1 christos reg_xys = REG_X; 973 1.1 christos break; 974 1.1 christos case 0x01: 975 1.1 christos reg_xys = REG_Y; 976 1.1 christos break; 977 1.1 christos case 0x02: 978 1.1 christos reg_xys = REG_S; 979 1.1 christos break; 980 1.1.1.2 christos } 981 1.1.1.2 christos 982 1.1.1.2 christos op = create_register_operand (reg_xys); 983 1.1.1.2 christos if (op == NULL) 984 1.1.1.2 christos return -1; 985 1.1.1.2 christos operand[(*n_operands)++] = op; 986 1.1.1.2 christos op = x_opr_decode (mra, 0); 987 1.1.1.2 christos if (op == NULL) 988 1.1.1.2 christos return -1; 989 1.1 christos operand[(*n_operands)++] = op; 990 1.1 christos return 0; 991 1.1.1.2 christos } 992 1.1 christos 993 1.1 christos static int 994 1.1 christos lea_reg_xys (struct mem_read_abstraction_base *mra, 995 1.1.1.2 christos int *n_operands, struct operand **operand) 996 1.1 christos { 997 1.1 christos struct operand *op; 998 1.1 christos bfd_byte byte; 999 1.1.1.2 christos int status = mra->read (mra, -1, 1, &byte); 1000 1.1 christos if (status < 0) 1001 1.1 christos return status; 1002 1.1 christos 1003 1.1 christos int reg_n = -1; 1004 1.1 christos switch (byte & 0x03) 1005 1.1 christos { 1006 1.1 christos case 0x00: 1007 1.1 christos reg_n = REG_X; 1008 1.1 christos break; 1009 1.1 christos case 0x01: 1010 1.1 christos reg_n = REG_Y; 1011 1.1 christos break; 1012 1.1 christos case 0x02: 1013 1.1 christos reg_n = REG_S; 1014 1.1 christos break; 1015 1.1 christos } 1016 1.1 christos 1017 1.1.1.2 christos status = mra->read (mra, 0, 1, &byte); 1018 1.1 christos if (status < 0) 1019 1.1.1.2 christos return status; 1020 1.1.1.2 christos 1021 1.1.1.2 christos op = create_register_operand (reg_n); 1022 1.1.1.2 christos if (op == NULL) 1023 1.1.1.2 christos return -1; 1024 1.1.1.2 christos operand[(*n_operands)++] = op; 1025 1.1.1.2 christos op = create_memory_operand (false, (int8_t) byte, 1, reg_n, -1); 1026 1.1.1.2 christos if (op == NULL) 1027 1.1.1.2 christos return -1; 1028 1.1 christos operand[(*n_operands)++] = op; 1029 1.1 christos return 0; 1030 1.1 christos } 1031 1.1 christos 1032 1.1.1.2 christos 1033 1.1 christos /* PC Relative offsets of size 15 or 7 bits */ 1034 1.1 christos static int 1035 1.1 christos rel_15_7 (struct mem_read_abstraction_base *mra, int offset, 1036 1.1.1.2 christos int *n_operands, struct operand **operands) 1037 1.1 christos { 1038 1.1 christos struct operand *op; 1039 1.1 christos bfd_byte upper; 1040 1.1.1.2 christos int status = mra->read (mra, offset - 1, 1, &upper); 1041 1.1 christos if (status < 0) 1042 1.1 christos return status; 1043 1.1 christos 1044 1.1 christos bool rel_size = (upper & 0x80); 1045 1.1 christos 1046 1.1 christos int16_t addr = upper; 1047 1.1 christos if (rel_size) 1048 1.1 christos { 1049 1.1 christos /* 15 bits. Get the next byte */ 1050 1.1 christos bfd_byte lower; 1051 1.1.1.2 christos status = mra->read (mra, offset, 1, &lower); 1052 1.1 christos if (status < 0) 1053 1.1 christos return status; 1054 1.1 christos 1055 1.1 christos addr <<= 8; 1056 1.1 christos addr |= lower; 1057 1.1 christos addr &= 0x7FFF; 1058 1.1 christos 1059 1.1 christos bool negative = (addr & 0x4000); 1060 1.1 christos addr &= 0x3FFF; 1061 1.1 christos if (negative) 1062 1.1 christos addr = addr - 0x4000; 1063 1.1 christos } 1064 1.1 christos else 1065 1.1 christos { 1066 1.1 christos /* 7 bits. */ 1067 1.1 christos bool negative = (addr & 0x40); 1068 1.1 christos addr &= 0x3F; 1069 1.1 christos if (negative) 1070 1.1 christos addr = addr - 0x40; 1071 1.1.1.2 christos } 1072 1.1.1.2 christos 1073 1.1.1.2 christos op = create_simple_memory_operand (addr, mra->posn (mra) - 1, true); 1074 1.1.1.2 christos if (op == NULL) 1075 1.1.1.2 christos return -1; 1076 1.1 christos operands[(*n_operands)++] = op; 1077 1.1 christos return 0; 1078 1.1 christos } 1079 1.1 christos 1080 1.1.1.2 christos 1081 1.1 christos /* PC Relative offsets of size 15 or 7 bits */ 1082 1.1 christos static int 1083 1.1 christos decode_rel_15_7 (struct mem_read_abstraction_base *mra, 1084 1.1.1.2 christos int *n_operands, struct operand **operand) 1085 1.1 christos { 1086 1.1 christos return rel_15_7 (mra, 1, n_operands, operand); 1087 1.1 christos } 1088 1.1 christos 1089 1.1 christos static int shift_n_bytes (struct mem_read_abstraction_base *); 1090 1.1 christos static int mov_imm_opr_n_bytes (struct mem_read_abstraction_base *); 1091 1.1 christos static int loop_prim_n_bytes (struct mem_read_abstraction_base *); 1092 1.1 christos static int bm_rel_n_bytes (struct mem_read_abstraction_base *); 1093 1.1 christos static int mul_n_bytes (struct mem_read_abstraction_base *); 1094 1.1.1.2 christos static int bm_n_bytes (struct mem_read_abstraction_base *); 1095 1.1.1.2 christos 1096 1.1.1.2 christos static int psh_pul_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand); 1097 1.1.1.2 christos static int shift_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand); 1098 1.1.1.2 christos static int mul_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand); 1099 1.1.1.2 christos static int bm_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand); 1100 1.1.1.2 christos static int bm_rel_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand); 1101 1.1.1.2 christos static int mov_imm_opr (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand); 1102 1.1.1.2 christos static int loop_primitive_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operands); 1103 1.1 christos static int bit_field_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operands); 1104 1.1 christos static int exg_sex_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operands); 1105 1.1 christos 1106 1.1 christos 1107 1.1 christos static enum optr shift_discrim (struct mem_read_abstraction_base *mra, enum optr hint); 1108 1.1 christos static enum optr psh_pul_discrim (struct mem_read_abstraction_base *mra, enum optr hint); 1109 1.1 christos static enum optr mul_discrim (struct mem_read_abstraction_base *mra, enum optr hint); 1110 1.1 christos static enum optr loop_primitive_discrim (struct mem_read_abstraction_base *mra, enum optr hint); 1111 1.1 christos static enum optr bit_field_discrim (struct mem_read_abstraction_base *mra, enum optr hint); 1112 1.1 christos static enum optr exg_sex_discrim (struct mem_read_abstraction_base *mra, enum optr hint); 1113 1.1.1.2 christos 1114 1.1 christos 1115 1.1 christos static int 1116 1.1 christos cmp_xy (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED, 1117 1.1.1.2 christos int *n_operands, struct operand **operand) 1118 1.1.1.2 christos { 1119 1.1.1.2 christos struct operand *op; 1120 1.1.1.2 christos 1121 1.1.1.2 christos op = create_register_operand (REG_X); 1122 1.1.1.2 christos if (op == NULL) 1123 1.1.1.2 christos return -1; 1124 1.1.1.2 christos operand[(*n_operands)++] = op; 1125 1.1.1.2 christos op = create_register_operand (REG_Y); 1126 1.1.1.2 christos if (op == NULL) 1127 1.1.1.2 christos return -1; 1128 1.1 christos operand[(*n_operands)++] = op; 1129 1.1 christos return 0; 1130 1.1.1.2 christos } 1131 1.1 christos 1132 1.1 christos static int 1133 1.1 christos sub_d6_x_y (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED, 1134 1.1.1.2 christos int *n_operands, struct operand **operand) 1135 1.1.1.2 christos { 1136 1.1.1.2 christos struct operand *op; 1137 1.1.1.2 christos 1138 1.1.1.2 christos op = create_register_operand (REG_D6); 1139 1.1.1.2 christos if (op == NULL) 1140 1.1.1.2 christos return -1; 1141 1.1.1.2 christos operand[(*n_operands)++] = op; 1142 1.1.1.2 christos op = create_register_operand (REG_X); 1143 1.1.1.2 christos if (op == NULL) 1144 1.1.1.2 christos return -1; 1145 1.1.1.2 christos operand[(*n_operands)++] = op; 1146 1.1.1.2 christos op = create_register_operand (REG_Y); 1147 1.1.1.2 christos if (op == NULL) 1148 1.1.1.2 christos return -1; 1149 1.1 christos operand[(*n_operands)++] = op; 1150 1.1 christos return 0; 1151 1.1.1.2 christos } 1152 1.1 christos 1153 1.1 christos static int 1154 1.1 christos sub_d6_y_x (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED, 1155 1.1.1.2 christos int *n_operands, struct operand **operand) 1156 1.1.1.2 christos { 1157 1.1.1.2 christos struct operand *op; 1158 1.1.1.2 christos 1159 1.1.1.2 christos op = create_register_operand (REG_D6); 1160 1.1.1.2 christos if (op == NULL) 1161 1.1.1.2 christos return -1; 1162 1.1.1.2 christos operand[(*n_operands)++] = op; 1163 1.1.1.2 christos op = create_register_operand (REG_Y); 1164 1.1.1.2 christos if (op == NULL) 1165 1.1.1.2 christos return -1; 1166 1.1.1.2 christos operand[(*n_operands)++] = op; 1167 1.1.1.2 christos op = create_register_operand (REG_X); 1168 1.1.1.2 christos if (op == NULL) 1169 1.1.1.2 christos return -1; 1170 1.1 christos operand[(*n_operands)++] = op; 1171 1.1 christos return 0; 1172 1.1.1.2 christos } 1173 1.1 christos 1174 1.1 christos static int 1175 1.1 christos ld_18bit_decode (struct mem_read_abstraction_base *mra, int *n_operands, 1176 1.1 christos struct operand **operand); 1177 1.1 christos 1178 1.1 christos static enum optr 1179 1.1 christos mul_discrim (struct mem_read_abstraction_base *mra, enum optr hint) 1180 1.1 christos { 1181 1.1 christos uint8_t mb; 1182 1.1 christos int status = mra->read (mra, 0, 1, &mb); 1183 1.1 christos if (status < 0) 1184 1.1 christos return OP_INVALID; 1185 1.1 christos 1186 1.1 christos bool signed_op = (mb & 0x80); 1187 1.1 christos 1188 1.1 christos switch (hint) 1189 1.1 christos { 1190 1.1 christos case OPBASE_mul: 1191 1.1 christos return signed_op ? OP_muls : OP_mulu; 1192 1.1 christos break; 1193 1.1 christos case OPBASE_div: 1194 1.1 christos return signed_op ? OP_divs : OP_divu; 1195 1.1 christos break; 1196 1.1 christos case OPBASE_mod: 1197 1.1 christos return signed_op ? OP_mods : OP_modu; 1198 1.1 christos break; 1199 1.1 christos case OPBASE_mac: 1200 1.1 christos return signed_op ? OP_macs : OP_macu; 1201 1.1 christos break; 1202 1.1 christos case OPBASE_qmul: 1203 1.1 christos return signed_op ? OP_qmuls : OP_qmulu; 1204 1.1 christos break; 1205 1.1 christos default: 1206 1.1 christos abort (); 1207 1.1 christos } 1208 1.1 christos 1209 1.1 christos return OP_INVALID; 1210 1.1 christos } 1211 1.1 christos 1212 1.1 christos struct opcode 1213 1.1 christos { 1214 1.1 christos /* The operation that this opcode performs. */ 1215 1.1 christos enum optr operator; 1216 1.1 christos 1217 1.1 christos /* The size of this operation. May be -1 if it is implied 1218 1.1 christos in the operands or if size is not applicable. */ 1219 1.1 christos short osize; 1220 1.1 christos 1221 1.1 christos /* Some operations need this function to work out which operation 1222 1.1 christos is intended. */ 1223 1.1 christos discriminator_f discriminator; 1224 1.1 christos 1225 1.1 christos /* A function returning the number of bytes in this instruction. */ 1226 1.1 christos insn_bytes_f insn_bytes; 1227 1.1 christos 1228 1.1 christos operands_f operands; 1229 1.1 christos operands_f operands2; 1230 1.1 christos }; 1231 1.1 christos 1232 1.1 christos static const struct opcode page2[] = 1233 1.1 christos { 1234 1.1 christos [0x00] = {OP_ld, -1, 0, opr_n_bytes_p1, reg_s_opr, 0}, 1235 1.1 christos [0x01] = {OP_st, -1, 0, opr_n_bytes_p1, reg_s_opr, 0}, 1236 1.1 christos [0x02] = {OP_cmp, -1, 0, opr_n_bytes_p1, reg_s_opr, 0}, 1237 1.1 christos [0x03] = {OP_ld, -1, 0, four, reg_s_imm, 0}, 1238 1.1 christos [0x04] = {OP_cmp, -1, 0, four, reg_s_imm, 0}, 1239 1.1 christos [0x05] = {OP_stop, -1, 0, single, 0, 0}, 1240 1.1 christos [0x06] = {OP_wai, -1, 0, single, 0, 0}, 1241 1.1 christos [0x07] = {OP_sys, -1, 0, single, 0, 0}, 1242 1.1 christos [0x08] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, /* BFEXT / BFINS */ 1243 1.1 christos [0x09] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, 1244 1.1 christos [0x0a] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, 1245 1.1 christos [0x0b] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, 1246 1.1 christos [0x0c] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, 1247 1.1 christos [0x0d] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, 1248 1.1 christos [0x0e] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, 1249 1.1 christos [0x0f] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, 1250 1.1 christos [0x10] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1251 1.1 christos [0x11] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1252 1.1 christos [0x12] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1253 1.1 christos [0x13] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1254 1.1 christos [0x14] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1255 1.1 christos [0x15] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1256 1.1 christos [0x16] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1257 1.1 christos [0x17] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1258 1.1 christos [0x18] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1259 1.1 christos [0x19] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1260 1.1 christos [0x1a] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1261 1.1 christos [0x1b] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1262 1.1 christos [0x1c] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1263 1.1 christos [0x1d] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1264 1.1 christos [0x1e] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1265 1.1 christos [0x1f] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1266 1.1 christos [0x20] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1267 1.1 christos [0x21] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1268 1.1 christos [0x22] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1269 1.1 christos [0x23] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1270 1.1 christos [0x24] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1271 1.1 christos [0x25] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1272 1.1 christos [0x26] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1273 1.1 christos [0x27] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1274 1.1 christos [0x28] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1275 1.1 christos [0x29] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1276 1.1 christos [0x2a] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1277 1.1 christos [0x2b] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1278 1.1 christos [0x2c] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1279 1.1 christos [0x2d] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1280 1.1 christos [0x2e] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1281 1.1 christos [0x2f] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1282 1.1 christos [0x30] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1283 1.1 christos [0x31] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1284 1.1 christos [0x32] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1285 1.1 christos [0x33] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1286 1.1 christos [0x34] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1287 1.1 christos [0x35] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1288 1.1 christos [0x36] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1289 1.1 christos [0x37] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1290 1.1 christos [0x38] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1291 1.1 christos [0x39] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1292 1.1 christos [0x3a] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1293 1.1 christos [0x3b] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1294 1.1 christos [0x3c] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1295 1.1 christos [0x3d] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1296 1.1 christos [0x3e] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1297 1.1 christos [0x3f] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1298 1.1 christos [0x40] = {OP_abs, -1, 0, single, z_reg, 0}, 1299 1.1 christos [0x41] = {OP_abs, -1, 0, single, z_reg, 0}, 1300 1.1 christos [0x42] = {OP_abs, -1, 0, single, z_reg, 0}, 1301 1.1 christos [0x43] = {OP_abs, -1, 0, single, z_reg, 0}, 1302 1.1 christos [0x44] = {OP_abs, -1, 0, single, z_reg, 0}, 1303 1.1 christos [0x45] = {OP_abs, -1, 0, single, z_reg, 0}, 1304 1.1 christos [0x46] = {OP_abs, -1, 0, single, z_reg, 0}, 1305 1.1 christos [0x47] = {OP_abs, -1, 0, single, z_reg, 0}, 1306 1.1 christos [0x48] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1307 1.1 christos [0x49] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1308 1.1 christos [0x4a] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1309 1.1 christos [0x4b] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1310 1.1 christos [0x4c] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1311 1.1 christos [0x4d] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1312 1.1 christos [0x4e] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1313 1.1 christos [0x4f] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1314 1.1 christos [0x50] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base}, 1315 1.1 christos [0x51] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base}, 1316 1.1 christos [0x52] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base}, 1317 1.1 christos [0x53] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base}, 1318 1.1 christos [0x54] = {OP_adc, -1, 0, two, z_reg, z_imm1234_0base}, 1319 1.1 christos [0x55] = {OP_adc, -1, 0, two, z_reg, z_imm1234_0base}, 1320 1.1 christos [0x56] = {OP_adc, -1, 0, five, z_reg, z_imm1234_0base}, 1321 1.1 christos [0x57] = {OP_adc, -1, 0, five, z_reg, z_imm1234_0base}, 1322 1.1 christos [0x58] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base}, 1323 1.1 christos [0x59] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base}, 1324 1.1 christos [0x5a] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base}, 1325 1.1 christos [0x5b] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base}, 1326 1.1 christos [0x5c] = {OP_bit, -1, 0, two, z_reg, z_imm1234_8base}, 1327 1.1 christos [0x5d] = {OP_bit, -1, 0, two, z_reg, z_imm1234_8base}, 1328 1.1 christos [0x5e] = {OP_bit, -1, 0, five, z_reg, z_imm1234_8base}, 1329 1.1 christos [0x5f] = {OP_bit, -1, 0, five, z_reg, z_imm1234_8base}, 1330 1.1 christos [0x60] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1331 1.1 christos [0x61] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1332 1.1 christos [0x62] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1333 1.1 christos [0x63] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1334 1.1 christos [0x64] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1335 1.1 christos [0x65] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1336 1.1 christos [0x66] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1337 1.1 christos [0x67] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1338 1.1 christos [0x68] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1339 1.1 christos [0x69] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1340 1.1 christos [0x6a] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1341 1.1 christos [0x6b] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1342 1.1 christos [0x6c] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1343 1.1 christos [0x6d] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1344 1.1 christos [0x6e] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1345 1.1 christos [0x6f] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1346 1.1 christos [0x70] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base}, 1347 1.1 christos [0x71] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base}, 1348 1.1 christos [0x72] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base}, 1349 1.1 christos [0x73] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base}, 1350 1.1 christos [0x74] = {OP_sbc, -1, 0, two, z_reg, z_imm1234_0base}, 1351 1.1 christos [0x75] = {OP_sbc, -1, 0, two, z_reg, z_imm1234_0base}, 1352 1.1 christos [0x76] = {OP_sbc, -1, 0, five, z_reg, z_imm1234_0base}, 1353 1.1 christos [0x77] = {OP_sbc, -1, 0, five, z_reg, z_imm1234_0base}, 1354 1.1 christos [0x78] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base}, 1355 1.1 christos [0x79] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base}, 1356 1.1 christos [0x7a] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base}, 1357 1.1 christos [0x7b] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base}, 1358 1.1 christos [0x7c] = {OP_eor, -1, 0, two, z_reg, z_imm1234_8base}, 1359 1.1 christos [0x7d] = {OP_eor, -1, 0, two, z_reg, z_imm1234_8base}, 1360 1.1 christos [0x7e] = {OP_eor, -1, 0, five, z_reg, z_imm1234_8base}, 1361 1.1 christos [0x7f] = {OP_eor, -1, 0, five, z_reg, z_imm1234_8base}, 1362 1.1 christos [0x80] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1363 1.1 christos [0x81] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1364 1.1 christos [0x82] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1365 1.1 christos [0x83] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1366 1.1 christos [0x84] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1367 1.1 christos [0x85] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1368 1.1 christos [0x86] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1369 1.1 christos [0x87] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1370 1.1 christos [0x88] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1371 1.1 christos [0x89] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1372 1.1 christos [0x8a] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1373 1.1 christos [0x8b] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1374 1.1 christos [0x8c] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1375 1.1 christos [0x8d] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1376 1.1 christos [0x8e] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1377 1.1 christos [0x8f] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1378 1.1 christos [0x90] = {OP_rti, -1, 0, single, 0, 0}, 1379 1.1 christos [0x91] = {OP_clb, -1, 0, two, z_tfr, 0}, 1380 1.1 christos [0x92] = {OP_trap, -1, 0, single, trap_decode, 0}, 1381 1.1 christos [0x93] = {OP_trap, -1, 0, single, trap_decode, 0}, 1382 1.1 christos [0x94] = {OP_trap, -1, 0, single, trap_decode, 0}, 1383 1.1 christos [0x95] = {OP_trap, -1, 0, single, trap_decode, 0}, 1384 1.1 christos [0x96] = {OP_trap, -1, 0, single, trap_decode, 0}, 1385 1.1 christos [0x97] = {OP_trap, -1, 0, single, trap_decode, 0}, 1386 1.1 christos [0x98] = {OP_trap, -1, 0, single, trap_decode, 0}, 1387 1.1 christos [0x99] = {OP_trap, -1, 0, single, trap_decode, 0}, 1388 1.1 christos [0x9a] = {OP_trap, -1, 0, single, trap_decode, 0}, 1389 1.1 christos [0x9b] = {OP_trap, -1, 0, single, trap_decode, 0}, 1390 1.1 christos [0x9c] = {OP_trap, -1, 0, single, trap_decode, 0}, 1391 1.1 christos [0x9d] = {OP_trap, -1, 0, single, trap_decode, 0}, 1392 1.1 christos [0x9e] = {OP_trap, -1, 0, single, trap_decode, 0}, 1393 1.1 christos [0x9f] = {OP_trap, -1, 0, single, trap_decode, 0}, 1394 1.1 christos [0xa0] = {OP_sat, -1, 0, single, z_reg, 0}, 1395 1.1 christos [0xa1] = {OP_sat, -1, 0, single, z_reg, 0}, 1396 1.1 christos [0xa2] = {OP_sat, -1, 0, single, z_reg, 0}, 1397 1.1 christos [0xa3] = {OP_sat, -1, 0, single, z_reg, 0}, 1398 1.1 christos [0xa4] = {OP_sat, -1, 0, single, z_reg, 0}, 1399 1.1 christos [0xa5] = {OP_sat, -1, 0, single, z_reg, 0}, 1400 1.1 christos [0xa6] = {OP_sat, -1, 0, single, z_reg, 0}, 1401 1.1 christos [0xa7] = {OP_sat, -1, 0, single, z_reg, 0}, 1402 1.1 christos [0xa8] = {OP_trap, -1, 0, single, trap_decode, 0}, 1403 1.1 christos [0xa9] = {OP_trap, -1, 0, single, trap_decode, 0}, 1404 1.1 christos [0xaa] = {OP_trap, -1, 0, single, trap_decode, 0}, 1405 1.1 christos [0xab] = {OP_trap, -1, 0, single, trap_decode, 0}, 1406 1.1 christos [0xac] = {OP_trap, -1, 0, single, trap_decode, 0}, 1407 1.1 christos [0xad] = {OP_trap, -1, 0, single, trap_decode, 0}, 1408 1.1 christos [0xae] = {OP_trap, -1, 0, single, trap_decode, 0}, 1409 1.1 christos [0xaf] = {OP_trap, -1, 0, single, trap_decode, 0}, 1410 1.1 christos [0xb0] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1411 1.1 christos [0xb1] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1412 1.1 christos [0xb2] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1413 1.1 christos [0xb3] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1414 1.1 christos [0xb4] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1415 1.1 christos [0xb5] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1416 1.1 christos [0xb6] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1417 1.1 christos [0xb7] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1418 1.1 christos [0xb8] = {OP_trap, -1, 0, single, trap_decode, 0}, 1419 1.1 christos [0xb9] = {OP_trap, -1, 0, single, trap_decode, 0}, 1420 1.1 christos [0xba] = {OP_trap, -1, 0, single, trap_decode, 0}, 1421 1.1 christos [0xbb] = {OP_trap, -1, 0, single, trap_decode, 0}, 1422 1.1 christos [0xbc] = {OP_trap, -1, 0, single, trap_decode, 0}, 1423 1.1 christos [0xbd] = {OP_trap, -1, 0, single, trap_decode, 0}, 1424 1.1 christos [0xbe] = {OP_trap, -1, 0, single, trap_decode, 0}, 1425 1.1 christos [0xbf] = {OP_trap, -1, 0, single, trap_decode, 0}, 1426 1.1 christos [0xc0] = {OP_trap, -1, 0, single, trap_decode, 0}, 1427 1.1 christos [0xc1] = {OP_trap, -1, 0, single, trap_decode, 0}, 1428 1.1 christos [0xc2] = {OP_trap, -1, 0, single, trap_decode, 0}, 1429 1.1 christos [0xc3] = {OP_trap, -1, 0, single, trap_decode, 0}, 1430 1.1 christos [0xc4] = {OP_trap, -1, 0, single, trap_decode, 0}, 1431 1.1 christos [0xc5] = {OP_trap, -1, 0, single, trap_decode, 0}, 1432 1.1 christos [0xc6] = {OP_trap, -1, 0, single, trap_decode, 0}, 1433 1.1 christos [0xc7] = {OP_trap, -1, 0, single, trap_decode, 0}, 1434 1.1 christos [0xc8] = {OP_trap, -1, 0, single, trap_decode, 0}, 1435 1.1 christos [0xc9] = {OP_trap, -1, 0, single, trap_decode, 0}, 1436 1.1 christos [0xca] = {OP_trap, -1, 0, single, trap_decode, 0}, 1437 1.1 christos [0xcb] = {OP_trap, -1, 0, single, trap_decode, 0}, 1438 1.1 christos [0xcc] = {OP_trap, -1, 0, single, trap_decode, 0}, 1439 1.1 christos [0xcd] = {OP_trap, -1, 0, single, trap_decode, 0}, 1440 1.1 christos [0xce] = {OP_trap, -1, 0, single, trap_decode, 0}, 1441 1.1 christos [0xcf] = {OP_trap, -1, 0, single, trap_decode, 0}, 1442 1.1 christos [0xd0] = {OP_trap, -1, 0, single, trap_decode, 0}, 1443 1.1 christos [0xd1] = {OP_trap, -1, 0, single, trap_decode, 0}, 1444 1.1 christos [0xd2] = {OP_trap, -1, 0, single, trap_decode, 0}, 1445 1.1 christos [0xd3] = {OP_trap, -1, 0, single, trap_decode, 0}, 1446 1.1 christos [0xd4] = {OP_trap, -1, 0, single, trap_decode, 0}, 1447 1.1 christos [0xd5] = {OP_trap, -1, 0, single, trap_decode, 0}, 1448 1.1 christos [0xd6] = {OP_trap, -1, 0, single, trap_decode, 0}, 1449 1.1 christos [0xd7] = {OP_trap, -1, 0, single, trap_decode, 0}, 1450 1.1 christos [0xd8] = {OP_trap, -1, 0, single, trap_decode, 0}, 1451 1.1 christos [0xd9] = {OP_trap, -1, 0, single, trap_decode, 0}, 1452 1.1 christos [0xda] = {OP_trap, -1, 0, single, trap_decode, 0}, 1453 1.1 christos [0xdb] = {OP_trap, -1, 0, single, trap_decode, 0}, 1454 1.1 christos [0xdc] = {OP_trap, -1, 0, single, trap_decode, 0}, 1455 1.1 christos [0xdd] = {OP_trap, -1, 0, single, trap_decode, 0}, 1456 1.1 christos [0xde] = {OP_trap, -1, 0, single, trap_decode, 0}, 1457 1.1 christos [0xdf] = {OP_trap, -1, 0, single, trap_decode, 0}, 1458 1.1 christos [0xe0] = {OP_trap, -1, 0, single, trap_decode, 0}, 1459 1.1 christos [0xe1] = {OP_trap, -1, 0, single, trap_decode, 0}, 1460 1.1 christos [0xe2] = {OP_trap, -1, 0, single, trap_decode, 0}, 1461 1.1 christos [0xe3] = {OP_trap, -1, 0, single, trap_decode, 0}, 1462 1.1 christos [0xe4] = {OP_trap, -1, 0, single, trap_decode, 0}, 1463 1.1 christos [0xe5] = {OP_trap, -1, 0, single, trap_decode, 0}, 1464 1.1 christos [0xe6] = {OP_trap, -1, 0, single, trap_decode, 0}, 1465 1.1 christos [0xe7] = {OP_trap, -1, 0, single, trap_decode, 0}, 1466 1.1 christos [0xe8] = {OP_trap, -1, 0, single, trap_decode, 0}, 1467 1.1 christos [0xe9] = {OP_trap, -1, 0, single, trap_decode, 0}, 1468 1.1 christos [0xea] = {OP_trap, -1, 0, single, trap_decode, 0}, 1469 1.1 christos [0xeb] = {OP_trap, -1, 0, single, trap_decode, 0}, 1470 1.1 christos [0xec] = {OP_trap, -1, 0, single, trap_decode, 0}, 1471 1.1 christos [0xed] = {OP_trap, -1, 0, single, trap_decode, 0}, 1472 1.1 christos [0xee] = {OP_trap, -1, 0, single, trap_decode, 0}, 1473 1.1 christos [0xef] = {OP_trap, -1, 0, single, trap_decode, 0}, 1474 1.1 christos [0xf0] = {OP_trap, -1, 0, single, trap_decode, 0}, 1475 1.1 christos [0xf1] = {OP_trap, -1, 0, single, trap_decode, 0}, 1476 1.1 christos [0xf2] = {OP_trap, -1, 0, single, trap_decode, 0}, 1477 1.1 christos [0xf3] = {OP_trap, -1, 0, single, trap_decode, 0}, 1478 1.1 christos [0xf4] = {OP_trap, -1, 0, single, trap_decode, 0}, 1479 1.1 christos [0xf5] = {OP_trap, -1, 0, single, trap_decode, 0}, 1480 1.1 christos [0xf6] = {OP_trap, -1, 0, single, trap_decode, 0}, 1481 1.1 christos [0xf7] = {OP_trap, -1, 0, single, trap_decode, 0}, 1482 1.1 christos [0xf8] = {OP_trap, -1, 0, single, trap_decode, 0}, 1483 1.1 christos [0xf9] = {OP_trap, -1, 0, single, trap_decode, 0}, 1484 1.1 christos [0xfa] = {OP_trap, -1, 0, single, trap_decode, 0}, 1485 1.1 christos [0xfb] = {OP_trap, -1, 0, single, trap_decode, 0}, 1486 1.1 christos [0xfc] = {OP_trap, -1, 0, single, trap_decode, 0}, 1487 1.1 christos [0xfd] = {OP_trap, -1, 0, single, trap_decode, 0}, 1488 1.1 christos [0xfe] = {OP_trap, -1, 0, single, trap_decode, 0}, 1489 1.1 christos [0xff] = {OP_trap, -1, 0, single, trap_decode, 0}, 1490 1.1 christos }; 1491 1.1 christos 1492 1.1 christos static const struct opcode page1[] = 1493 1.1 christos { 1494 1.1 christos [0x00] = {OP_bgnd, -1, 0, single, 0, 0}, 1495 1.1 christos [0x01] = {OP_nop, -1, 0, single, 0, 0}, 1496 1.1 christos [0x02] = {OP_brclr, -1, 0, bm_rel_n_bytes, bm_rel_decode, 0}, 1497 1.1 christos [0x03] = {OP_brset, -1, 0, bm_rel_n_bytes, bm_rel_decode, 0}, 1498 1.1 christos [0x04] = {0xFFFF, -1, psh_pul_discrim, two, psh_pul_decode, 0}, /* psh/pul */ 1499 1.1 christos [0x05] = {OP_rts, -1, 0, single, 0, 0}, 1500 1.1 christos [0x06] = {OP_lea, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1501 1.1 christos [0x07] = {OP_lea, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1502 1.1 christos [0x08] = {OP_lea, -1, 0, opr_n_bytes_p1, lea_reg_xys_opr, 0}, 1503 1.1 christos [0x09] = {OP_lea, -1, 0, opr_n_bytes_p1, lea_reg_xys_opr, 0}, 1504 1.1 christos [0x0a] = {OP_lea, -1, 0, opr_n_bytes_p1, lea_reg_xys_opr, 0}, 1505 1.1 christos [0x0b] = {0xFFFF, -1, loop_primitive_discrim, loop_prim_n_bytes, loop_primitive_decode, 0}, /* Loop primitives TBcc / DBcc */ 1506 1.1 christos [0x0c] = {OP_mov, 0, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0}, 1507 1.1 christos [0x0d] = {OP_mov, 1, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0}, 1508 1.1 christos [0x0e] = {OP_mov, 2, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0}, 1509 1.1 christos [0x0f] = {OP_mov, 3, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0}, 1510 1.1 christos [0x10] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, /* lsr/lsl/asl/asr/rol/ror */ 1511 1.1 christos [0x11] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, 1512 1.1 christos [0x12] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, 1513 1.1 christos [0x13] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, 1514 1.1 christos [0x14] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, 1515 1.1 christos [0x15] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, 1516 1.1 christos [0x16] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, 1517 1.1 christos [0x17] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, 1518 1.1 christos [0x18] = {OP_lea, -1, 0, two, lea_reg_xys, NULL}, 1519 1.1 christos [0x19] = {OP_lea, -1, 0, two, lea_reg_xys, NULL}, 1520 1.1 christos [0x1a] = {OP_lea, -1, 0, two, lea_reg_xys, NULL}, 1521 1.1 christos /* 0x1b PG2 */ 1522 1.1 christos [0x1c] = {OP_mov, 0, 0, opr_n_bytes2, z_opr_decode2, 0}, 1523 1.1 christos [0x1d] = {OP_mov, 1, 0, opr_n_bytes2, z_opr_decode2, 0}, 1524 1.1 christos [0x1e] = {OP_mov, 2, 0, opr_n_bytes2, z_opr_decode2, 0}, 1525 1.1 christos [0x1f] = {OP_mov, 3, 0, opr_n_bytes2, z_opr_decode2, 0}, 1526 1.1 christos [0x20] = {OP_bra, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1527 1.1 christos [0x21] = {OP_bsr, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1528 1.1 christos [0x22] = {OP_bhi, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1529 1.1 christos [0x23] = {OP_bls, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1530 1.1 christos [0x24] = {OP_bcc, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1531 1.1 christos [0x25] = {OP_bcs, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1532 1.1 christos [0x26] = {OP_bne, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1533 1.1 christos [0x27] = {OP_beq, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1534 1.1 christos [0x28] = {OP_bvc, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1535 1.1 christos [0x29] = {OP_bvs, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1536 1.1 christos [0x2a] = {OP_bpl, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1537 1.1 christos [0x2b] = {OP_bmi, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1538 1.1 christos [0x2c] = {OP_bge, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1539 1.1 christos [0x2d] = {OP_blt, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1540 1.1 christos [0x2e] = {OP_bgt, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1541 1.1 christos [0x2f] = {OP_ble, -1, 0, pcrel_15bit, decode_rel_15_7, 0}, 1542 1.1 christos [0x30] = {OP_inc, -1, 0, single, z_reg, 0}, 1543 1.1 christos [0x31] = {OP_inc, -1, 0, single, z_reg, 0}, 1544 1.1 christos [0x32] = {OP_inc, -1, 0, single, z_reg, 0}, 1545 1.1 christos [0x33] = {OP_inc, -1, 0, single, z_reg, 0}, 1546 1.1 christos [0x34] = {OP_inc, -1, 0, single, z_reg, 0}, 1547 1.1 christos [0x35] = {OP_inc, -1, 0, single, z_reg, 0}, 1548 1.1 christos [0x36] = {OP_inc, -1, 0, single, z_reg, 0}, 1549 1.1 christos [0x37] = {OP_inc, -1, 0, single, z_reg, 0}, 1550 1.1 christos [0x38] = {OP_clr, -1, 0, single, z_reg, 0}, 1551 1.1 christos [0x39] = {OP_clr, -1, 0, single, z_reg, 0}, 1552 1.1 christos [0x3a] = {OP_clr, -1, 0, single, z_reg, 0}, 1553 1.1 christos [0x3b] = {OP_clr, -1, 0, single, z_reg, 0}, 1554 1.1 christos [0x3c] = {OP_clr, -1, 0, single, z_reg, 0}, 1555 1.1 christos [0x3d] = {OP_clr, -1, 0, single, z_reg, 0}, 1556 1.1 christos [0x3e] = {OP_clr, -1, 0, single, z_reg, 0}, 1557 1.1 christos [0x3f] = {OP_clr, -1, 0, single, z_reg, 0}, 1558 1.1 christos [0x40] = {OP_dec, -1, 0, single, z_reg, 0}, 1559 1.1 christos [0x41] = {OP_dec, -1, 0, single, z_reg, 0}, 1560 1.1 christos [0x42] = {OP_dec, -1, 0, single, z_reg, 0}, 1561 1.1 christos [0x43] = {OP_dec, -1, 0, single, z_reg, 0}, 1562 1.1 christos [0x44] = {OP_dec, -1, 0, single, z_reg, 0}, 1563 1.1 christos [0x45] = {OP_dec, -1, 0, single, z_reg, 0}, 1564 1.1 christos [0x46] = {OP_dec, -1, 0, single, z_reg, 0}, 1565 1.1 christos [0x47] = {OP_dec, -1, 0, single, z_reg, 0}, 1566 1.1 christos [0x48] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1567 1.1 christos [0x49] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1568 1.1 christos [0x4a] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1569 1.1 christos [0x4b] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1570 1.1 christos [0x4c] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1571 1.1 christos [0x4d] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1572 1.1 christos [0x4e] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1573 1.1 christos [0x4f] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0}, 1574 1.1 christos [0x50] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base}, 1575 1.1 christos [0x51] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base}, 1576 1.1 christos [0x52] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base}, 1577 1.1 christos [0x53] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base}, 1578 1.1 christos [0x54] = {OP_add, -1, 0, two, z_reg, z_imm1234_0base}, 1579 1.1 christos [0x55] = {OP_add, -1, 0, two, z_reg, z_imm1234_0base}, 1580 1.1 christos [0x56] = {OP_add, -1, 0, five, z_reg, z_imm1234_0base}, 1581 1.1 christos [0x57] = {OP_add, -1, 0, five, z_reg, z_imm1234_0base}, 1582 1.1 christos [0x58] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base}, 1583 1.1 christos [0x59] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base}, 1584 1.1 christos [0x5a] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base}, 1585 1.1 christos [0x5b] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base}, 1586 1.1 christos [0x5c] = {OP_and, -1, 0, two, z_reg, z_imm1234_8base}, 1587 1.1 christos [0x5d] = {OP_and, -1, 0, two, z_reg, z_imm1234_8base}, 1588 1.1 christos [0x5e] = {OP_and, -1, 0, five, z_reg, z_imm1234_8base}, 1589 1.1 christos [0x5f] = {OP_and, -1, 0, five, z_reg, z_imm1234_8base}, 1590 1.1 christos [0x60] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1591 1.1 christos [0x61] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1592 1.1 christos [0x62] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1593 1.1 christos [0x63] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1594 1.1 christos [0x64] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1595 1.1 christos [0x65] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1596 1.1 christos [0x66] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1597 1.1 christos [0x67] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1598 1.1 christos [0x68] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1599 1.1 christos [0x69] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1600 1.1 christos [0x6a] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1601 1.1 christos [0x6b] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1602 1.1 christos [0x6c] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1603 1.1 christos [0x6d] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1604 1.1 christos [0x6e] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1605 1.1 christos [0x6f] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1606 1.1 christos [0x70] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base}, 1607 1.1 christos [0x71] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base}, 1608 1.1 christos [0x72] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base}, 1609 1.1 christos [0x73] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base}, 1610 1.1 christos [0x74] = {OP_sub, -1, 0, two, z_reg, z_imm1234_0base}, 1611 1.1 christos [0x75] = {OP_sub, -1, 0, two, z_reg, z_imm1234_0base}, 1612 1.1 christos [0x76] = {OP_sub, -1, 0, five, z_reg, z_imm1234_0base}, 1613 1.1 christos [0x77] = {OP_sub, -1, 0, five, z_reg, z_imm1234_0base}, 1614 1.1 christos [0x78] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base}, 1615 1.1 christos [0x79] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base}, 1616 1.1 christos [0x7a] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base}, 1617 1.1 christos [0x7b] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base}, 1618 1.1 christos [0x7c] = {OP_or, -1, 0, two, z_reg, z_imm1234_8base}, 1619 1.1 christos [0x7d] = {OP_or, -1, 0, two, z_reg, z_imm1234_8base}, 1620 1.1 christos [0x7e] = {OP_or, -1, 0, five, z_reg, z_imm1234_8base}, 1621 1.1 christos [0x7f] = {OP_or, -1, 0, five, z_reg, z_imm1234_8base}, 1622 1.1 christos [0x80] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1623 1.1 christos [0x81] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1624 1.1 christos [0x82] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1625 1.1 christos [0x83] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1626 1.1 christos [0x84] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1627 1.1 christos [0x85] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1628 1.1 christos [0x86] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1629 1.1 christos [0x87] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1630 1.1 christos [0x88] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1631 1.1 christos [0x89] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1632 1.1 christos [0x8a] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1633 1.1 christos [0x8b] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1634 1.1 christos [0x8c] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1635 1.1 christos [0x8d] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1636 1.1 christos [0x8e] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1637 1.1 christos [0x8f] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1638 1.1 christos [0x90] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base}, 1639 1.1 christos [0x91] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base}, 1640 1.1 christos [0x92] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base}, 1641 1.1 christos [0x93] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base}, 1642 1.1 christos [0x94] = {OP_ld, -1, 0, two, z_reg, z_imm1234_0base}, 1643 1.1 christos [0x95] = {OP_ld, -1, 0, two, z_reg, z_imm1234_0base}, 1644 1.1 christos [0x96] = {OP_ld, -1, 0, five, z_reg, z_imm1234_0base}, 1645 1.1 christos [0x97] = {OP_ld, -1, 0, five, z_reg, z_imm1234_0base}, 1646 1.1 christos [0x98] = {OP_ld, -1, 0, four, reg_xy, z_imm1234_0base}, 1647 1.1 christos [0x99] = {OP_ld, -1, 0, four, reg_xy, z_imm1234_0base}, 1648 1.1 christos [0x9a] = {OP_clr, -1, 0, single, reg_xy, 0}, 1649 1.1 christos [0x9b] = {OP_clr, -1, 0, single, reg_xy, 0}, 1650 1.1 christos [0x9c] = {OP_inc, 0, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1651 1.1 christos [0x9d] = {OP_inc, 1, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1652 1.1 christos [0x9e] = {OP_tfr, -1, 0, two, z_tfr, NULL}, 1653 1.1 christos [0x9f] = {OP_inc, 3, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1654 1.1 christos [0xa0] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1655 1.1 christos [0xa1] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1656 1.1 christos [0xa2] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1657 1.1 christos [0xa3] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1658 1.1 christos [0xa4] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1659 1.1 christos [0xa5] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1660 1.1 christos [0xa6] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1661 1.1 christos [0xa7] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1662 1.1 christos [0xa8] = {OP_ld, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode}, 1663 1.1 christos [0xa9] = {OP_ld, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode}, 1664 1.1 christos [0xaa] = {OP_jmp, -1, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1665 1.1 christos [0xab] = {OP_jsr, -1, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1666 1.1 christos [0xac] = {OP_dec, 0, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1667 1.1 christos [0xad] = {OP_dec, 1, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1668 1.1 christos [0xae] = {0xFFFF, -1, exg_sex_discrim, two, exg_sex_decode, 0}, /* EXG / SEX */ 1669 1.1 christos [0xaf] = {OP_dec, 3, 0, opr_n_bytes_p1, 0, z_opr_decode}, 1670 1.1 christos [0xb0] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1671 1.1 christos [0xb1] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1672 1.1 christos [0xb2] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1673 1.1 christos [0xb3] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1674 1.1 christos [0xb4] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1675 1.1 christos [0xb5] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1676 1.1 christos [0xb6] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1677 1.1 christos [0xb7] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode}, 1678 1.1 christos [0xb8] = {OP_ld, -1, 0, four, reg_xy, z_ext24_decode}, 1679 1.1 christos [0xb9] = {OP_ld, -1, 0, four, reg_xy, z_ext24_decode}, 1680 1.1 christos [0xba] = {OP_jmp, -1, 0, four, z_ext24_decode, 0}, 1681 1.1 christos [0xbb] = {OP_jsr, -1, 0, four, z_ext24_decode, 0}, 1682 1.1 christos [0xbc] = {OP_clr, 0, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1683 1.1 christos [0xbd] = {OP_clr, 1, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1684 1.1 christos [0xbe] = {OP_clr, 2, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1685 1.1 christos [0xbf] = {OP_clr, 3, 0, opr_n_bytes_p1, z_opr_decode, 0}, 1686 1.1 christos [0xc0] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1687 1.1 christos [0xc1] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1688 1.1 christos [0xc2] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1689 1.1 christos [0xc3] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1690 1.1 christos [0xc4] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1691 1.1 christos [0xc5] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1692 1.1 christos [0xc6] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1693 1.1 christos [0xc7] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1694 1.1 christos [0xc8] = {OP_st, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode}, 1695 1.1 christos [0xc9] = {OP_st, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode}, 1696 1.1 christos [0xca] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1697 1.1 christos [0xcb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1698 1.1 christos [0xcc] = {OP_com, 0, 0, opr_n_bytes_p1, NULL, z_opr_decode}, 1699 1.1 christos [0xcd] = {OP_com, 1, 0, opr_n_bytes_p1, NULL, z_opr_decode}, 1700 1.1 christos [0xce] = {OP_andcc, -1, 0, two, imm1_decode, 0}, 1701 1.1 christos [0xcf] = {OP_com, 3, 0, opr_n_bytes_p1, NULL, z_opr_decode}, 1702 1.1 christos [0xd0] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1703 1.1 christos [0xd1] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1704 1.1 christos [0xd2] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1705 1.1 christos [0xd3] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1706 1.1 christos [0xd4] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1707 1.1 christos [0xd5] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1708 1.1 christos [0xd6] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1709 1.1 christos [0xd7] = {OP_st, -1, 0, four, z_reg, z_ext24_decode}, 1710 1.1 christos [0xd8] = {OP_st, -1, 0, four, reg_xy, z_ext24_decode}, 1711 1.1 christos [0xd9] = {OP_st, -1, 0, four, reg_xy, z_ext24_decode}, 1712 1.1 christos [0xda] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1713 1.1 christos [0xdb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1714 1.1 christos [0xdc] = {OP_neg, 0, 0, opr_n_bytes_p1, NULL, z_opr_decode}, 1715 1.1 christos [0xdd] = {OP_neg, 1, 0, opr_n_bytes_p1, NULL, z_opr_decode}, 1716 1.1 christos [0xde] = {OP_orcc, -1, 0, two, imm1_decode, 0}, 1717 1.1 christos [0xdf] = {OP_neg, 3, 0, opr_n_bytes_p1, NULL, z_opr_decode}, 1718 1.1 christos [0xe0] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base}, 1719 1.1 christos [0xe1] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base}, 1720 1.1 christos [0xe2] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base}, 1721 1.1 christos [0xe3] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base}, 1722 1.1 christos [0xe4] = {OP_cmp, -1, 0, two, z_reg, z_imm1234_0base}, 1723 1.1 christos [0xe5] = {OP_cmp, -1, 0, two, z_reg, z_imm1234_0base}, 1724 1.1 christos [0xe6] = {OP_cmp, -1, 0, five, z_reg, z_imm1234_0base}, 1725 1.1 christos [0xe7] = {OP_cmp, -1, 0, five, z_reg, z_imm1234_0base}, 1726 1.1 christos [0xe8] = {OP_cmp, -1, 0, four, reg_xy, z_imm1234_0base}, 1727 1.1 christos [0xe9] = {OP_cmp, -1, 0, four, reg_xy, z_imm1234_0base}, 1728 1.1 christos [0xea] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1729 1.1 christos [0xeb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1730 1.1 christos [0xec] = {OP_bclr, -1, 0, bm_n_bytes, bm_decode, 0}, 1731 1.1 christos [0xed] = {OP_bset, -1, 0, bm_n_bytes, bm_decode, 0}, 1732 1.1 christos [0xee] = {OP_btgl, -1, 0, bm_n_bytes, bm_decode, 0}, 1733 1.1 christos [0xef] = {OP_INVALID, -1, 0, NULL, NULL, NULL}, /* SPARE */ 1734 1.1 christos [0xf0] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1735 1.1 christos [0xf1] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1736 1.1 christos [0xf2] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1737 1.1 christos [0xf3] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1738 1.1 christos [0xf4] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1739 1.1 christos [0xf5] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1740 1.1 christos [0xf6] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1741 1.1 christos [0xf7] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode}, 1742 1.1 christos [0xf8] = {OP_cmp, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode}, 1743 1.1 christos [0xf9] = {OP_cmp, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode}, 1744 1.1 christos [0xfa] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1745 1.1 christos [0xfb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode}, 1746 1.1 christos [0xfc] = {OP_cmp, -1, 0, single, cmp_xy, 0}, 1747 1.1 christos [0xfd] = {OP_sub, -1, 0, single, sub_d6_x_y, 0}, 1748 1.1 christos [0xfe] = {OP_sub, -1, 0, single, sub_d6_y_x, 0}, 1749 1.1 christos [0xff] = {OP_swi, -1, 0, single, 0, 0} 1750 1.1 christos }; 1751 1.1 christos 1752 1.1 christos static const int oprregs1[] = 1753 1.1 christos { 1754 1.1 christos REG_D3, REG_D2, REG_D1, REG_D0, REG_CCL, REG_CCH 1755 1.1 christos }; 1756 1.1 christos 1757 1.1 christos static const int oprregs2[] = 1758 1.1 christos { 1759 1.1 christos REG_Y, REG_X, REG_D7, REG_D6, REG_D5, REG_D4 1760 1.1 christos }; 1761 1.1 christos 1762 1.1 christos 1763 1.1 christos 1764 1.1 christos 1766 1.1 christos enum MUL_MODE 1767 1.1 christos { 1768 1.1 christos MUL_REG_REG, 1769 1.1 christos MUL_REG_OPR, 1770 1.1 christos MUL_REG_IMM, 1771 1.1 christos MUL_OPR_OPR 1772 1.1 christos }; 1773 1.1 christos 1774 1.1 christos struct mb 1775 1.1 christos { 1776 1.1 christos uint8_t mask; 1777 1.1 christos uint8_t value; 1778 1.1 christos enum MUL_MODE mode; 1779 1.1 christos }; 1780 1.1 christos 1781 1.1 christos static const struct mb mul_table[] = { 1782 1.1 christos {0x40, 0x00, MUL_REG_REG}, 1783 1.1 christos 1784 1.1 christos {0x47, 0x40, MUL_REG_OPR}, 1785 1.1 christos {0x47, 0x41, MUL_REG_OPR}, 1786 1.1 christos {0x47, 0x43, MUL_REG_OPR}, 1787 1.1 christos 1788 1.1 christos {0x47, 0x44, MUL_REG_IMM}, 1789 1.1 christos {0x47, 0x45, MUL_REG_IMM}, 1790 1.1 christos {0x47, 0x47, MUL_REG_IMM}, 1791 1.1 christos 1792 1.1 christos {0x43, 0x42, MUL_OPR_OPR}, 1793 1.1.1.2 christos }; 1794 1.1 christos 1795 1.1 christos 1796 1.1 christos static int 1797 1.1 christos mul_decode (struct mem_read_abstraction_base *mra, 1798 1.1.1.2 christos int *n_operands, struct operand **operand) 1799 1.1 christos { 1800 1.1 christos uint8_t mb; 1801 1.1.1.2 christos struct operand *op; 1802 1.1 christos int status = mra->read (mra, 0, 1, &mb); 1803 1.1 christos if (status < 0) 1804 1.1 christos return status; 1805 1.1 christos 1806 1.1.1.2 christos uint8_t byte; 1807 1.1 christos status = mra->read (mra, -1, 1, &byte); 1808 1.1 christos if (status < 0) 1809 1.1 christos return status; 1810 1.1 christos 1811 1.1 christos enum MUL_MODE mode = -1; 1812 1.1 christos size_t i; 1813 1.1 christos for (i = 0; i < sizeof (mul_table) / sizeof (mul_table[0]); ++i) 1814 1.1 christos { 1815 1.1 christos const struct mb *mm = mul_table + i; 1816 1.1 christos if ((mb & mm->mask) == mm->value) 1817 1.1 christos { 1818 1.1 christos mode = mm->mode; 1819 1.1.1.2 christos break; 1820 1.1.1.2 christos } 1821 1.1.1.2 christos } 1822 1.1.1.2 christos op = create_register_operand (byte & 0x07); 1823 1.1 christos if (op == NULL) 1824 1.1 christos return -1; 1825 1.1 christos operand[(*n_operands)++] = op; 1826 1.1 christos 1827 1.1 christos switch (mode) 1828 1.1 christos { 1829 1.1.1.2 christos case MUL_REG_IMM: 1830 1.1.1.2 christos { 1831 1.1.1.2 christos int size = (mb & 0x3); 1832 1.1.1.2 christos op = create_register_operand_with_size ((mb & 0x38) >> 3, size); 1833 1.1.1.2 christos if (op == NULL) 1834 1.1.1.2 christos return -1; 1835 1.1.1.2 christos operand[(*n_operands)++] = op; 1836 1.1.1.2 christos 1837 1.1.1.2 christos uint32_t imm; 1838 1.1.1.2 christos if (z_decode_signed_value (mra, 1, size + 1, &imm) < 0) 1839 1.1.1.2 christos return -1; 1840 1.1.1.2 christos op = create_immediate_operand (imm); 1841 1.1 christos if (op == NULL) 1842 1.1 christos return -1; 1843 1.1 christos operand[(*n_operands)++] = op; 1844 1.1.1.2 christos } 1845 1.1.1.2 christos break; 1846 1.1.1.2 christos case MUL_REG_REG: 1847 1.1.1.2 christos op = create_register_operand ((mb & 0x38) >> 3); 1848 1.1.1.2 christos if (op == NULL) 1849 1.1.1.2 christos return -1; 1850 1.1.1.2 christos operand[(*n_operands)++] = op; 1851 1.1.1.2 christos op = create_register_operand (mb & 0x07); 1852 1.1 christos if (op == NULL) 1853 1.1 christos return -1; 1854 1.1.1.2 christos operand[(*n_operands)++] = op; 1855 1.1.1.2 christos break; 1856 1.1.1.2 christos case MUL_REG_OPR: 1857 1.1.1.2 christos op = create_register_operand ((mb & 0x38) >> 3); 1858 1.1.1.2 christos if (op == NULL) 1859 1.1.1.2 christos return -1; 1860 1.1.1.2 christos operand[(*n_operands)++] = op; 1861 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, mb & 0x3); 1862 1.1 christos if (op == NULL) 1863 1.1 christos return -1; 1864 1.1 christos operand[(*n_operands)++] = op; 1865 1.1 christos break; 1866 1.1.1.2 christos case MUL_OPR_OPR: 1867 1.1.1.2 christos { 1868 1.1.1.2 christos int first = x_opr_n_bytes (mra, 1); 1869 1.1.1.2 christos if (first < 0) 1870 1.1.1.2 christos return first; 1871 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, (mb & 0x30) >> 4); 1872 1.1.1.2 christos if (op == NULL) 1873 1.1.1.2 christos return -1; 1874 1.1.1.2 christos operand[(*n_operands)++] = op; 1875 1.1.1.2 christos op = x_opr_decode_with_size (mra, first + 1, (mb & 0x0c) >> 2); 1876 1.1 christos if (op == NULL) 1877 1.1 christos return -1; 1878 1.1 christos operand[(*n_operands)++] = op; 1879 1.1.1.2 christos break; 1880 1.1 christos } 1881 1.1 christos } 1882 1.1 christos return 0; 1883 1.1 christos } 1884 1.1 christos 1885 1.1 christos 1886 1.1 christos static int 1887 1.1.1.2 christos mul_n_bytes (struct mem_read_abstraction_base *mra) 1888 1.1 christos { 1889 1.1 christos int nx = 2; 1890 1.1 christos int first, second; 1891 1.1.1.2 christos uint8_t mb; 1892 1.1 christos int status = mra->read (mra, 0, 1, &mb); 1893 1.1 christos if (status < 0) 1894 1.1 christos return status; 1895 1.1 christos 1896 1.1 christos enum MUL_MODE mode = -1; 1897 1.1 christos size_t i; 1898 1.1 christos for (i = 0; i < sizeof (mul_table) / sizeof (mul_table[0]); ++i) 1899 1.1 christos { 1900 1.1 christos const struct mb *mm = mul_table + i; 1901 1.1 christos if ((mb & mm->mask) == mm->value) 1902 1.1 christos { 1903 1.1 christos mode = mm->mode; 1904 1.1 christos break; 1905 1.1 christos } 1906 1.1 christos } 1907 1.1 christos 1908 1.1 christos int size = (mb & 0x3) + 1; 1909 1.1 christos 1910 1.1 christos switch (mode) 1911 1.1 christos { 1912 1.1 christos case MUL_REG_IMM: 1913 1.1 christos nx += size; 1914 1.1 christos break; 1915 1.1.1.2 christos case MUL_REG_REG: 1916 1.1.1.2 christos break; 1917 1.1.1.2 christos case MUL_REG_OPR: 1918 1.1.1.2 christos first = x_opr_n_bytes (mra, 1); 1919 1.1 christos if (first < 0) 1920 1.1 christos return first; 1921 1.1.1.2 christos nx += first; 1922 1.1.1.2 christos break; 1923 1.1.1.2 christos case MUL_OPR_OPR: 1924 1.1.1.2 christos first = x_opr_n_bytes (mra, nx - 1); 1925 1.1.1.2 christos if (first < 0) 1926 1.1.1.2 christos return first; 1927 1.1.1.2 christos nx += first; 1928 1.1.1.2 christos second = x_opr_n_bytes (mra, nx - 1); 1929 1.1 christos if (second < 0) 1930 1.1 christos return second; 1931 1.1 christos nx += second; 1932 1.1 christos break; 1933 1.1 christos } 1934 1.1 christos 1935 1.1 christos return nx; 1936 1.1 christos } 1937 1.1 christos 1938 1.1 christos 1939 1.1 christos /* The NXP documentation is vague about BM_RESERVED0 and BM_RESERVED1, 1941 1.1 christos and contains obvious typos. 1942 1.1 christos However the Freescale tools and experiments with the chip itself 1943 1.1 christos seem to indicate that they behave like BM_REG_IMM and BM_OPR_REG 1944 1.1 christos respectively. */ 1945 1.1 christos 1946 1.1 christos enum BM_MODE 1947 1.1 christos { 1948 1.1 christos BM_REG_IMM, 1949 1.1 christos BM_RESERVED0, 1950 1.1 christos BM_OPR_B, 1951 1.1 christos BM_OPR_W, 1952 1.1 christos BM_OPR_L, 1953 1.1 christos BM_OPR_REG, 1954 1.1 christos BM_RESERVED1 1955 1.1 christos }; 1956 1.1 christos 1957 1.1 christos struct bm 1958 1.1 christos { 1959 1.1 christos uint8_t mask; 1960 1.1 christos uint8_t value; 1961 1.1 christos enum BM_MODE mode; 1962 1.1 christos }; 1963 1.1 christos 1964 1.1 christos static const struct bm bm_table[] = { 1965 1.1.1.2 christos { 0xC6, 0x04, BM_REG_IMM}, 1966 1.1 christos { 0x84, 0x00, BM_REG_IMM}, 1967 1.1 christos { 0x06, 0x06, BM_REG_IMM}, 1968 1.1 christos { 0xC6, 0x44, BM_RESERVED0}, 1969 1.1 christos 1970 1.1 christos { 0x8F, 0x80, BM_OPR_B}, 1971 1.1 christos { 0x8E, 0x82, BM_OPR_W}, 1972 1.1 christos { 0x8C, 0x88, BM_OPR_L}, 1973 1.1 christos 1974 1.1.1.2 christos { 0x83, 0x81, BM_OPR_REG}, 1975 1.1 christos { 0x87, 0x84, BM_RESERVED1}, 1976 1.1 christos }; 1977 1.1 christos 1978 1.1.1.2 christos static int 1979 1.1 christos bm_decode (struct mem_read_abstraction_base *mra, 1980 1.1 christos int *n_operands, struct operand **operand) 1981 1.1 christos { 1982 1.1.1.2 christos struct operand *op; 1983 1.1 christos uint8_t bm; 1984 1.1 christos int status = mra->read (mra, 0, 1, &bm); 1985 1.1 christos if (status < 0) 1986 1.1 christos return status; 1987 1.1 christos 1988 1.1 christos size_t i; 1989 1.1 christos enum BM_MODE mode = -1; 1990 1.1 christos for (i = 0; i < sizeof (bm_table) / sizeof (bm_table[0]); ++i) 1991 1.1 christos { 1992 1.1 christos const struct bm *bme = bm_table + i; 1993 1.1 christos if ((bm & bme->mask) == bme->value) 1994 1.1 christos { 1995 1.1 christos mode = bme->mode; 1996 1.1 christos break; 1997 1.1 christos } 1998 1.1 christos } 1999 1.1 christos 2000 1.1.1.2 christos switch (mode) 2001 1.1.1.2 christos { 2002 1.1.1.2 christos case BM_REG_IMM: 2003 1.1.1.2 christos case BM_RESERVED0: 2004 1.1 christos op = create_register_operand (bm & 0x07); 2005 1.1 christos if (op == NULL) 2006 1.1.1.2 christos return -1; 2007 1.1.1.2 christos operand[(*n_operands)++] = op; 2008 1.1.1.2 christos break; 2009 1.1.1.2 christos case BM_OPR_B: 2010 1.1 christos op = x_opr_decode_with_size (mra, 1, 0); 2011 1.1 christos if (op == NULL) 2012 1.1.1.2 christos return -1; 2013 1.1.1.2 christos operand[(*n_operands)++] = op; 2014 1.1.1.2 christos break; 2015 1.1.1.2 christos case BM_OPR_W: 2016 1.1 christos op = x_opr_decode_with_size (mra, 1, 1); 2017 1.1 christos if (op == NULL) 2018 1.1.1.2 christos return -1; 2019 1.1.1.2 christos operand[(*n_operands)++] = op; 2020 1.1.1.2 christos break; 2021 1.1.1.2 christos case BM_OPR_L: 2022 1.1 christos op = x_opr_decode_with_size (mra, 1, 3); 2023 1.1 christos if (op == NULL) 2024 1.1 christos return -1; 2025 1.1 christos operand[(*n_operands)++] = op; 2026 1.1 christos break; 2027 1.1.1.2 christos case BM_OPR_REG: 2028 1.1.1.2 christos case BM_RESERVED1: 2029 1.1.1.2 christos { 2030 1.1 christos uint8_t xb; 2031 1.1 christos status = mra->read (mra, 1, 1, &xb); 2032 1.1.1.2 christos if (status < 0) 2033 1.1 christos return status; 2034 1.1.1.2 christos /* Don't emit a size suffix for register operands */ 2035 1.1.1.2 christos if ((xb & 0xF8) != 0xB8) 2036 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, (bm & 0x0c) >> 2); 2037 1.1.1.2 christos else 2038 1.1 christos op = x_opr_decode (mra, 1); 2039 1.1 christos if (op == NULL) 2040 1.1 christos return -1; 2041 1.1 christos operand[(*n_operands)++] = op; 2042 1.1 christos } 2043 1.1 christos break; 2044 1.1 christos } 2045 1.1 christos 2046 1.1 christos uint8_t imm = 0; 2047 1.1 christos switch (mode) 2048 1.1.1.2 christos { 2049 1.1.1.2 christos case BM_REG_IMM: 2050 1.1.1.2 christos case BM_RESERVED0: 2051 1.1.1.2 christos imm = (bm & 0x38) >> 3; 2052 1.1 christos op = create_immediate_operand (imm); 2053 1.1 christos if (op == NULL) 2054 1.1 christos return -1; 2055 1.1 christos operand[(*n_operands)++] = op; 2056 1.1 christos break; 2057 1.1 christos case BM_OPR_L: 2058 1.1 christos imm |= (bm & 0x03) << 3; 2059 1.1 christos /* fallthrough */ 2060 1.1 christos case BM_OPR_W: 2061 1.1.1.2 christos imm |= (bm & 0x01) << 3; 2062 1.1.1.2 christos /* fallthrough */ 2063 1.1.1.2 christos case BM_OPR_B: 2064 1.1.1.2 christos imm |= (bm & 0x70) >> 4; 2065 1.1 christos op = create_immediate_operand (imm); 2066 1.1 christos if (op == NULL) 2067 1.1 christos return -1; 2068 1.1.1.2 christos operand[(*n_operands)++] = op; 2069 1.1.1.2 christos break; 2070 1.1.1.2 christos case BM_OPR_REG: 2071 1.1.1.2 christos case BM_RESERVED1: 2072 1.1 christos op = create_register_operand ((bm & 0x70) >> 4); 2073 1.1 christos if (op == NULL) 2074 1.1.1.2 christos return -1; 2075 1.1 christos operand[(*n_operands)++] = op; 2076 1.1 christos break; 2077 1.1 christos } 2078 1.1.1.2 christos return 0; 2079 1.1 christos } 2080 1.1 christos 2081 1.1 christos 2082 1.1.1.2 christos static int 2083 1.1 christos bm_rel_decode (struct mem_read_abstraction_base *mra, 2084 1.1 christos int *n_operands, struct operand **operand) 2085 1.1 christos { 2086 1.1.1.2 christos struct operand *op; 2087 1.1 christos uint8_t bm; 2088 1.1 christos int status = mra->read (mra, 0, 1, &bm); 2089 1.1 christos if (status < 0) 2090 1.1 christos return status; 2091 1.1 christos 2092 1.1 christos size_t i; 2093 1.1 christos enum BM_MODE mode = -1; 2094 1.1 christos for (i = 0; i < sizeof (bm_table) / sizeof (bm_table[0]); ++i) 2095 1.1 christos { 2096 1.1 christos const struct bm *bme = bm_table + i; 2097 1.1 christos if ((bm & bme->mask) == bme->value) 2098 1.1 christos { 2099 1.1 christos mode = bme->mode; 2100 1.1 christos break; 2101 1.1 christos } 2102 1.1 christos } 2103 1.1 christos 2104 1.1 christos int n = 1; 2105 1.1.1.2 christos switch (mode) 2106 1.1.1.2 christos { 2107 1.1.1.2 christos case BM_REG_IMM: 2108 1.1.1.2 christos case BM_RESERVED0: 2109 1.1 christos op = create_register_operand (bm & 0x07); 2110 1.1 christos if (op == NULL) 2111 1.1.1.2 christos return -1; 2112 1.1.1.2 christos operand[(*n_operands)++] = op; 2113 1.1.1.2 christos break; 2114 1.1.1.2 christos case BM_OPR_B: 2115 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, 0); 2116 1.1.1.2 christos if (op == NULL) 2117 1.1.1.2 christos return -1; 2118 1.1.1.2 christos operand[(*n_operands)++] = op; 2119 1.1 christos n = x_opr_n_bytes (mra, 1); 2120 1.1 christos if (n < 0) 2121 1.1.1.2 christos return n; 2122 1.1.1.2 christos n += 1; 2123 1.1.1.2 christos break; 2124 1.1.1.2 christos case BM_OPR_W: 2125 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, 1); 2126 1.1.1.2 christos if (op == NULL) 2127 1.1.1.2 christos return -1; 2128 1.1.1.2 christos operand[(*n_operands)++] = op; 2129 1.1 christos n = x_opr_n_bytes (mra, 1); 2130 1.1 christos if (n < 0) 2131 1.1.1.2 christos return n; 2132 1.1.1.2 christos n += 1; 2133 1.1.1.2 christos break; 2134 1.1.1.2 christos case BM_OPR_L: 2135 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, 3); 2136 1.1.1.2 christos if (op == NULL) 2137 1.1.1.2 christos return -1; 2138 1.1.1.2 christos operand[(*n_operands)++] = op; 2139 1.1 christos n = x_opr_n_bytes (mra, 1); 2140 1.1 christos if (n < 0) 2141 1.1 christos return n; 2142 1.1 christos n += 1; 2143 1.1 christos break; 2144 1.1.1.2 christos case BM_OPR_REG: 2145 1.1.1.2 christos case BM_RESERVED1: 2146 1.1.1.2 christos { 2147 1.1 christos uint8_t xb; 2148 1.1 christos status = mra->read (mra, +1, 1, &xb); 2149 1.1 christos if (status < 0) 2150 1.1 christos return status; 2151 1.1.1.2 christos /* Don't emit a size suffix for register operands */ 2152 1.1 christos if ((xb & 0xF8) != 0xB8) 2153 1.1 christos { 2154 1.1.1.2 christos short os = (bm & 0x0c) >> 2; 2155 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, os); 2156 1.1.1.2 christos } 2157 1.1.1.2 christos else 2158 1.1 christos op = x_opr_decode (mra, 1); 2159 1.1 christos if (op == NULL) 2160 1.1 christos return -1; 2161 1.1 christos operand[(*n_operands)++] = op; 2162 1.1.1.2 christos } 2163 1.1 christos break; 2164 1.1 christos } 2165 1.1 christos 2166 1.1 christos int x, imm = 0; 2167 1.1 christos switch (mode) 2168 1.1 christos { 2169 1.1 christos case BM_OPR_L: 2170 1.1 christos imm |= (bm & 0x02) << 3; 2171 1.1 christos /* fall through */ 2172 1.1 christos case BM_OPR_W: 2173 1.1.1.2 christos imm |= (bm & 0x01) << 3; 2174 1.1.1.2 christos /* fall through */ 2175 1.1.1.2 christos case BM_OPR_B: 2176 1.1.1.2 christos imm |= (bm & 0x70) >> 4; 2177 1.1 christos op = create_immediate_operand (imm); 2178 1.1 christos if (op == NULL) 2179 1.1 christos return -1; 2180 1.1.1.2 christos operand[(*n_operands)++] = op; 2181 1.1.1.2 christos break; 2182 1.1.1.2 christos case BM_RESERVED0: 2183 1.1.1.2 christos imm = (bm & 0x38) >> 3; 2184 1.1 christos op = create_immediate_operand (imm); 2185 1.1 christos if (op == NULL) 2186 1.1 christos return -1; 2187 1.1.1.2 christos operand[(*n_operands)++] = op; 2188 1.1.1.2 christos break; 2189 1.1.1.2 christos case BM_REG_IMM: 2190 1.1.1.2 christos imm = (bm & 0xF8) >> 3; 2191 1.1 christos op = create_immediate_operand (imm); 2192 1.1 christos if (op == NULL) 2193 1.1 christos return -1; 2194 1.1.1.2 christos operand[(*n_operands)++] = op; 2195 1.1.1.2 christos break; 2196 1.1.1.2 christos case BM_OPR_REG: 2197 1.1.1.2 christos case BM_RESERVED1: 2198 1.1.1.2 christos op = create_register_operand ((bm & 0x70) >> 4); 2199 1.1.1.2 christos if (op == NULL) 2200 1.1.1.2 christos return -1; 2201 1.1.1.2 christos operand[(*n_operands)++] = op; 2202 1.1 christos x = x_opr_n_bytes (mra, 1); 2203 1.1 christos if (x < 0) 2204 1.1 christos return x; 2205 1.1.1.2 christos n += x; 2206 1.1 christos break; 2207 1.1 christos } 2208 1.1 christos 2209 1.1 christos return rel_15_7 (mra, n + 1, n_operands, operand); 2210 1.1 christos } 2211 1.1 christos 2212 1.1 christos static int 2213 1.1 christos bm_n_bytes (struct mem_read_abstraction_base *mra) 2214 1.1 christos { 2215 1.1 christos uint8_t bm; 2216 1.1 christos int status = mra->read (mra, 0, 1, &bm); 2217 1.1 christos if (status < 0) 2218 1.1 christos return status; 2219 1.1 christos 2220 1.1 christos size_t i; 2221 1.1 christos enum BM_MODE mode = -1; 2222 1.1 christos for (i = 0; i < sizeof (bm_table) / sizeof (bm_table[0]); ++i) 2223 1.1 christos { 2224 1.1 christos const struct bm *bme = bm_table + i; 2225 1.1 christos if ((bm & bme->mask) == bme->value) 2226 1.1 christos { 2227 1.1 christos mode = bme->mode; 2228 1.1.1.2 christos break; 2229 1.1 christos } 2230 1.1 christos } 2231 1.1 christos 2232 1.1 christos int n = 0; 2233 1.1 christos switch (mode) 2234 1.1 christos { 2235 1.1 christos case BM_REG_IMM: 2236 1.1 christos case BM_RESERVED0: 2237 1.1 christos break; 2238 1.1 christos 2239 1.1 christos case BM_OPR_B: 2240 1.1.1.2 christos case BM_OPR_W: 2241 1.1.1.2 christos case BM_OPR_L: 2242 1.1.1.2 christos case BM_OPR_REG: 2243 1.1 christos case BM_RESERVED1: 2244 1.1 christos n = x_opr_n_bytes (mra, 1); 2245 1.1 christos if (n < 0) 2246 1.1.1.2 christos return n; 2247 1.1 christos break; 2248 1.1 christos } 2249 1.1 christos 2250 1.1 christos return n + 2; 2251 1.1 christos } 2252 1.1 christos 2253 1.1 christos static int 2254 1.1 christos bm_rel_n_bytes (struct mem_read_abstraction_base *mra) 2255 1.1 christos { 2256 1.1 christos int n = 1 + bm_n_bytes (mra); 2257 1.1 christos 2258 1.1 christos bfd_byte rb; 2259 1.1 christos int status = mra->read (mra, n - 2, 1, &rb); 2260 1.1 christos if (status != 0) 2261 1.1 christos return status; 2262 1.1 christos 2263 1.1 christos if (rb & 0x80) 2264 1.1 christos n++; 2265 1.1 christos 2266 1.1 christos return n; 2267 1.1 christos } 2268 1.1 christos 2269 1.1 christos 2270 1.1 christos 2271 1.1 christos 2273 1.1 christos 2274 1.1 christos /* shift direction */ 2275 1.1 christos enum SB_DIR 2276 1.1 christos { 2277 1.1 christos SB_LEFT, 2278 1.1 christos SB_RIGHT 2279 1.1 christos }; 2280 1.1 christos 2281 1.1 christos enum SB_TYPE 2282 1.1 christos { 2283 1.1 christos SB_ARITHMETIC, 2284 1.1 christos SB_LOGICAL 2285 1.1 christos }; 2286 1.1 christos 2287 1.1 christos 2288 1.1 christos enum SB_MODE 2289 1.1 christos { 2290 1.1 christos SB_REG_REG_N_EFF, 2291 1.1 christos SB_REG_REG_N, 2292 1.1 christos SB_REG_OPR_EFF, 2293 1.1 christos SB_ROT, 2294 1.1 christos SB_REG_OPR_OPR, 2295 1.1 christos SB_OPR_N 2296 1.1 christos }; 2297 1.1 christos 2298 1.1 christos struct sb 2299 1.1 christos { 2300 1.1 christos uint8_t mask; 2301 1.1 christos uint8_t value; 2302 1.1 christos enum SB_MODE mode; 2303 1.1 christos }; 2304 1.1 christos 2305 1.1 christos static const struct sb sb_table[] = { 2306 1.1 christos {0x30, 0x00, SB_REG_REG_N_EFF}, 2307 1.1 christos {0x30, 0x10, SB_REG_REG_N}, 2308 1.1 christos {0x34, 0x20, SB_REG_OPR_EFF}, 2309 1.1 christos {0x34, 0x24, SB_ROT}, 2310 1.1 christos {0x34, 0x30, SB_REG_OPR_OPR}, 2311 1.1 christos {0x34, 0x34, SB_OPR_N}, 2312 1.1 christos }; 2313 1.1.1.2 christos 2314 1.1 christos static int 2315 1.1 christos shift_n_bytes (struct mem_read_abstraction_base *mra) 2316 1.1 christos { 2317 1.1 christos bfd_byte sb; 2318 1.1 christos int opr1, opr2; 2319 1.1 christos int status = mra->read (mra, 0, 1, &sb); 2320 1.1 christos if (status != 0) 2321 1.1 christos return status; 2322 1.1 christos 2323 1.1 christos size_t i; 2324 1.1 christos enum SB_MODE mode = -1; 2325 1.1 christos for (i = 0; i < sizeof (sb_table) / sizeof (sb_table[0]); ++i) 2326 1.1 christos { 2327 1.1 christos const struct sb *sbe = sb_table + i; 2328 1.1 christos if ((sb & sbe->mask) == sbe->value) 2329 1.1 christos mode = sbe->mode; 2330 1.1 christos } 2331 1.1 christos 2332 1.1 christos switch (mode) 2333 1.1.1.2 christos { 2334 1.1.1.2 christos case SB_REG_REG_N_EFF: 2335 1.1.1.2 christos return 2; 2336 1.1.1.2 christos case SB_REG_OPR_EFF: 2337 1.1 christos case SB_ROT: 2338 1.1.1.2 christos opr1 = x_opr_n_bytes (mra, 1); 2339 1.1.1.2 christos if (opr1 < 0) 2340 1.1.1.2 christos return opr1; 2341 1.1.1.2 christos return 2 + opr1; 2342 1.1.1.2 christos case SB_REG_OPR_OPR: 2343 1.1.1.2 christos opr1 = x_opr_n_bytes (mra, 1); 2344 1.1 christos if (opr1 < 0) 2345 1.1.1.2 christos return opr1; 2346 1.1.1.2 christos opr2 = 0; 2347 1.1.1.2 christos if ((sb & 0x30) != 0x20) 2348 1.1.1.2 christos { 2349 1.1 christos opr2 = x_opr_n_bytes (mra, opr1 + 1); 2350 1.1 christos if (opr2 < 0) 2351 1.1 christos return opr2; 2352 1.1 christos } 2353 1.1 christos return 2 + opr1 + opr2; 2354 1.1 christos default: 2355 1.1 christos return 3; 2356 1.1 christos } 2357 1.1 christos 2358 1.1 christos /* not reached */ 2359 1.1 christos return -1; 2360 1.1 christos } 2361 1.1 christos 2362 1.1.1.2 christos 2364 1.1 christos static int 2365 1.1 christos mov_imm_opr_n_bytes (struct mem_read_abstraction_base *mra) 2366 1.1 christos { 2367 1.1.1.2 christos bfd_byte byte; 2368 1.1.1.2 christos int status = mra->read (mra, -1, 1, &byte); 2369 1.1.1.2 christos if (status < 0) 2370 1.1 christos return status; 2371 1.1.1.2 christos 2372 1.1 christos int size = byte - 0x0c + 1; 2373 1.1 christos int n = x_opr_n_bytes (mra, size); 2374 1.1.1.2 christos if (n < 0) 2375 1.1 christos return n; 2376 1.1 christos 2377 1.1 christos return size + n + 1; 2378 1.1.1.2 christos } 2379 1.1 christos 2380 1.1 christos static int 2381 1.1 christos mov_imm_opr (struct mem_read_abstraction_base *mra, 2382 1.1.1.2 christos int *n_operands, struct operand **operand) 2383 1.1 christos { 2384 1.1 christos struct operand *op; 2385 1.1.1.2 christos bfd_byte byte; 2386 1.1.1.2 christos int status = mra->read (mra, -1, 1, &byte); 2387 1.1.1.2 christos if (status < 0) 2388 1.1.1.2 christos return status; 2389 1.1.1.2 christos 2390 1.1.1.2 christos int size = byte - 0x0c + 1; 2391 1.1.1.2 christos uint32_t imm; 2392 1.1.1.2 christos if (decode_signed_value (mra, size, &imm)) 2393 1.1.1.2 christos return -1; 2394 1.1.1.2 christos 2395 1.1.1.2 christos op = create_immediate_operand (imm); 2396 1.1.1.2 christos if (op == NULL) 2397 1.1.1.2 christos return -1; 2398 1.1 christos operand[(*n_operands)++] = op; 2399 1.1 christos op = x_opr_decode (mra, size); 2400 1.1 christos if (op == NULL) 2401 1.1 christos return -1; 2402 1.1.1.2 christos operand[(*n_operands)++] = op; 2403 1.1 christos return 0; 2404 1.1 christos } 2405 1.1 christos 2406 1.1.1.2 christos 2407 1.1 christos 2409 1.1 christos static int 2410 1.1 christos ld_18bit_decode (struct mem_read_abstraction_base *mra, 2411 1.1.1.2 christos int *n_operands, struct operand **operand) 2412 1.1 christos { 2413 1.1 christos struct operand *op; 2414 1.1 christos size_t size = 3; 2415 1.1.1.2 christos bfd_byte buffer[3]; 2416 1.1 christos int status = mra->read (mra, 0, 2, buffer + 1); 2417 1.1 christos if (status < 0) 2418 1.1 christos return status; 2419 1.1 christos 2420 1.1 christos status = mra->read (mra, -1, 1, buffer); 2421 1.1 christos if (status < 0) 2422 1.1 christos return status; 2423 1.1 christos 2424 1.1 christos buffer[0] = (buffer[0] & 0x30) >> 4; 2425 1.1 christos 2426 1.1.1.2 christos size_t i; 2427 1.1.1.2 christos uint32_t imm = 0; 2428 1.1.1.2 christos for (i = 0; i < size; ++i) 2429 1.1.1.2 christos { 2430 1.1.1.2 christos imm |= buffer[i] << (8 * (size - i - 1)); 2431 1.1 christos } 2432 1.1 christos 2433 1.1 christos op = create_immediate_operand (imm); 2434 1.1 christos if (op == NULL) 2435 1.1 christos return -1; 2436 1.1 christos operand[(*n_operands)++] = op; 2437 1.1 christos return 0; 2438 1.1 christos } 2439 1.1 christos 2440 1.1 christos 2441 1.1 christos 2443 1.1 christos /* Loop Primitives */ 2444 1.1 christos 2445 1.1 christos enum LP_MODE { 2446 1.1 christos LP_REG, 2447 1.1 christos LP_XY, 2448 1.1 christos LP_OPR 2449 1.1 christos }; 2450 1.1 christos 2451 1.1 christos struct lp 2452 1.1 christos { 2453 1.1 christos uint8_t mask; 2454 1.1 christos uint8_t value; 2455 1.1 christos enum LP_MODE mode; 2456 1.1 christos }; 2457 1.1 christos 2458 1.1 christos static const struct lp lp_mode[] = { 2459 1.1 christos {0x08, 0x00, LP_REG}, 2460 1.1 christos {0x0C, 0x08, LP_XY}, 2461 1.1 christos {0x0C, 0x0C, LP_OPR}, 2462 1.1.1.2 christos }; 2463 1.1.1.2 christos 2464 1.1.1.2 christos 2465 1.1 christos static int 2466 1.1 christos loop_prim_n_bytes (struct mem_read_abstraction_base *mra) 2467 1.1 christos { 2468 1.1 christos int mx = 0; 2469 1.1 christos uint8_t lb; 2470 1.1 christos int status = mra->read (mra, mx++, 1, &lb); 2471 1.1 christos if (status < 0) 2472 1.1 christos return status; 2473 1.1 christos 2474 1.1 christos enum LP_MODE mode = -1; 2475 1.1 christos size_t i; 2476 1.1 christos for (i = 0; i < sizeof (lp_mode) / sizeof (lp_mode[0]); ++i) 2477 1.1 christos { 2478 1.1 christos const struct lp *pb = lp_mode + i; 2479 1.1 christos if ((lb & pb->mask) == pb->value) 2480 1.1.1.2 christos { 2481 1.1.1.2 christos mode = pb->mode; 2482 1.1.1.2 christos break; 2483 1.1.1.2 christos } 2484 1.1 christos } 2485 1.1 christos 2486 1.1 christos if (mode == LP_OPR) 2487 1.1.1.2 christos { 2488 1.1.1.2 christos int n = x_opr_n_bytes (mra, mx); 2489 1.1.1.2 christos if (n < 0) 2490 1.1 christos return n; 2491 1.1 christos mx += n; 2492 1.1 christos } 2493 1.1 christos 2494 1.1 christos uint8_t rb; 2495 1.1 christos status = mra->read (mra, mx++, 1, &rb); 2496 1.1 christos if (status < 0) 2497 1.1 christos return status; 2498 1.1 christos if (rb & 0x80) 2499 1.1 christos mx++; 2500 1.1 christos 2501 1.1 christos return mx + 1; 2502 1.1 christos } 2503 1.1 christos 2504 1.1 christos 2505 1.1 christos 2506 1.1 christos 2508 1.1 christos static enum optr 2509 1.1 christos exg_sex_discrim (struct mem_read_abstraction_base *mra, 2510 1.1.1.2 christos enum optr hint ATTRIBUTE_UNUSED) 2511 1.1.1.2 christos { 2512 1.1 christos uint8_t eb; 2513 1.1.1.2 christos int status = mra->read (mra, 0, 1, &eb); 2514 1.1.1.2 christos enum optr operator = OP_INVALID; 2515 1.1 christos if (status < 0) 2516 1.1 christos return operator; 2517 1.1 christos 2518 1.1 christos struct operand *op0 = create_register_operand ((eb & 0xf0) >> 4); 2519 1.1 christos if (op0 == NULL) 2520 1.1 christos return -1; 2521 1.1 christos struct operand *op1 = create_register_operand (eb & 0xf); 2522 1.1 christos if (op1 == NULL) 2523 1.1 christos return -1; 2524 1.1 christos 2525 1.1 christos int reg0 = ((struct register_operand *) op0)->reg; 2526 1.1 christos int reg1 = ((struct register_operand *) op1)->reg; 2527 1.1 christos if (reg0 >= 0 && reg0 < S12Z_N_REGISTERS 2528 1.1 christos && reg1 >= 0 && reg1 < S12Z_N_REGISTERS) 2529 1.1 christos { 2530 1.1 christos const struct reg *r0 = registers + reg0; 2531 1.1 christos const struct reg *r1 = registers + reg1; 2532 1.1 christos 2533 1.1 christos operator = r0->bytes < r1->bytes ? OP_sex : OP_exg; 2534 1.1.1.2 christos } 2535 1.1 christos 2536 1.1 christos free (op0); 2537 1.1 christos free (op1); 2538 1.1.1.2 christos 2539 1.1 christos return operator; 2540 1.1 christos } 2541 1.1 christos 2542 1.1.1.2 christos 2543 1.1 christos static int 2544 1.1 christos exg_sex_decode (struct mem_read_abstraction_base *mra, 2545 1.1.1.2 christos int *n_operands, struct operand **operands) 2546 1.1.1.2 christos { 2547 1.1.1.2 christos struct operand *op; 2548 1.1.1.2 christos uint8_t eb; 2549 1.1.1.2 christos int status = mra->read (mra, 0, 1, &eb); 2550 1.1.1.2 christos if (status < 0) 2551 1.1.1.2 christos return status; 2552 1.1.1.2 christos 2553 1.1.1.2 christos /* Ship out the operands. */ 2554 1.1 christos op = create_register_operand ((eb & 0xf0) >> 4); 2555 1.1 christos if (op == NULL) 2556 1.1 christos return -1; 2557 1.1 christos operands[(*n_operands)++] = op; 2558 1.1 christos op = create_register_operand (eb & 0xf); 2559 1.1 christos if (op == NULL) 2560 1.1 christos return -1; 2561 1.1 christos operands[(*n_operands)++] = op; 2562 1.1 christos return 0; 2563 1.1 christos } 2564 1.1 christos 2565 1.1 christos static enum optr 2566 1.1 christos loop_primitive_discrim (struct mem_read_abstraction_base *mra, 2567 1.1 christos enum optr hint ATTRIBUTE_UNUSED) 2568 1.1 christos { 2569 1.1.1.2 christos uint8_t lb; 2570 1.1 christos int status = mra->read (mra, 0, 1, &lb); 2571 1.1 christos if (status < 0) 2572 1.1 christos return OP_INVALID; 2573 1.1.1.2 christos 2574 1.1.1.2 christos enum optr opbase = (lb & 0x80) ? OP_dbNE : OP_tbNE; 2575 1.1 christos return opbase + ((lb & 0x70) >> 4); 2576 1.1 christos } 2577 1.1 christos 2578 1.1.1.2 christos static int 2579 1.1 christos loop_primitive_decode (struct mem_read_abstraction_base *mra, 2580 1.1 christos int *n_operands, struct operand **operands) 2581 1.1 christos { 2582 1.1 christos struct operand *op; 2583 1.1 christos int n, offs = 1; 2584 1.1 christos uint8_t lb; 2585 1.1 christos int status = mra->read (mra, 0, 1, &lb); 2586 1.1 christos if (status < 0) 2587 1.1 christos return status; 2588 1.1 christos 2589 1.1 christos enum LP_MODE mode = -1; 2590 1.1 christos size_t i; 2591 1.1 christos for (i = 0; i < sizeof (lp_mode) / sizeof (lp_mode[0]); ++i) 2592 1.1 christos { 2593 1.1 christos const struct lp *pb = lp_mode + i; 2594 1.1 christos if ((lb & pb->mask) == pb->value) 2595 1.1.1.2 christos { 2596 1.1.1.2 christos mode = pb->mode; 2597 1.1.1.2 christos break; 2598 1.1.1.2 christos } 2599 1.1 christos } 2600 1.1 christos 2601 1.1.1.2 christos switch (mode) 2602 1.1.1.2 christos { 2603 1.1.1.2 christos case LP_REG: 2604 1.1.1.2 christos op = create_register_operand (lb & 0x07); 2605 1.1 christos if (op == NULL) 2606 1.1 christos return -1; 2607 1.1.1.2 christos operands[(*n_operands)++] = op; 2608 1.1.1.2 christos break; 2609 1.1.1.2 christos case LP_XY: 2610 1.1.1.2 christos op = create_register_operand ((lb & 0x01) + REG_X); 2611 1.1.1.2 christos if (op == NULL) 2612 1.1.1.2 christos return -1; 2613 1.1.1.2 christos operands[(*n_operands)++] = op; 2614 1.1.1.2 christos break; 2615 1.1 christos case LP_OPR: 2616 1.1 christos n = x_opr_n_bytes (mra, 1); 2617 1.1 christos if (n < 0) 2618 1.1.1.2 christos return n; 2619 1.1 christos offs += n; 2620 1.1 christos op = x_opr_decode_with_size (mra, 1, lb & 0x03); 2621 1.1 christos if (op == NULL) 2622 1.1 christos return -1; 2623 1.1 christos operands[(*n_operands)++] = op; 2624 1.1 christos break; 2625 1.1 christos } 2626 1.1 christos 2627 1.1 christos return rel_15_7 (mra, offs + 1, n_operands, operands); 2628 1.1 christos } 2629 1.1 christos 2630 1.1 christos 2631 1.1 christos static enum optr 2632 1.1 christos shift_discrim (struct mem_read_abstraction_base *mra, 2633 1.1 christos enum optr hint ATTRIBUTE_UNUSED) 2634 1.1 christos { 2635 1.1 christos size_t i; 2636 1.1 christos uint8_t sb; 2637 1.1 christos int status = mra->read (mra, 0, 1, &sb); 2638 1.1 christos if (status < 0) 2639 1.1 christos return OP_INVALID; 2640 1.1 christos 2641 1.1 christos enum SB_DIR dir = (sb & 0x40) ? SB_LEFT : SB_RIGHT; 2642 1.1 christos enum SB_TYPE type = (sb & 0x80) ? SB_ARITHMETIC : SB_LOGICAL; 2643 1.1 christos enum SB_MODE mode = -1; 2644 1.1 christos for (i = 0; i < sizeof (sb_table) / sizeof (sb_table[0]); ++i) 2645 1.1 christos { 2646 1.1 christos const struct sb *sbe = sb_table + i; 2647 1.1 christos if ((sb & sbe->mask) == sbe->value) 2648 1.1 christos mode = sbe->mode; 2649 1.1 christos } 2650 1.1 christos 2651 1.1 christos if (mode == SB_ROT) 2652 1.1.1.2 christos return (dir == SB_LEFT) ? OP_rol : OP_ror; 2653 1.1 christos 2654 1.1 christos if (type == SB_LOGICAL) 2655 1.1 christos return (dir == SB_LEFT) ? OP_lsl : OP_lsr; 2656 1.1.1.2 christos 2657 1.1 christos return (dir == SB_LEFT) ? OP_asl : OP_asr; 2658 1.1 christos } 2659 1.1 christos 2660 1.1 christos 2661 1.1.1.2 christos static int 2662 1.1 christos shift_decode (struct mem_read_abstraction_base *mra, int *n_operands, 2663 1.1 christos struct operand **operands) 2664 1.1 christos { 2665 1.1 christos struct operand *op; 2666 1.1.1.2 christos size_t i; 2667 1.1 christos uint8_t byte; 2668 1.1 christos int status = mra->read (mra, -1, 1, &byte); 2669 1.1 christos if (status < 0) 2670 1.1 christos return status; 2671 1.1 christos 2672 1.1 christos uint8_t sb; 2673 1.1 christos status = mra->read (mra, 0, 1, &sb); 2674 1.1 christos if (status < 0) 2675 1.1 christos return status; 2676 1.1 christos 2677 1.1 christos enum SB_MODE mode = -1; 2678 1.1 christos for (i = 0; i < sizeof (sb_table) / sizeof (sb_table[0]); ++i) 2679 1.1 christos { 2680 1.1 christos const struct sb *sbe = sb_table + i; 2681 1.1 christos if ((sb & sbe->mask) == sbe->value) 2682 1.1 christos mode = sbe->mode; 2683 1.1 christos } 2684 1.1 christos 2685 1.1 christos short osize = -1; 2686 1.1 christos switch (mode) 2687 1.1.1.2 christos { 2688 1.1.1.2 christos case SB_REG_OPR_EFF: 2689 1.1.1.2 christos case SB_ROT: 2690 1.1 christos case SB_REG_OPR_OPR: 2691 1.1 christos osize = sb & 0x03; 2692 1.1 christos break; 2693 1.1 christos case SB_OPR_N: 2694 1.1 christos { 2695 1.1 christos uint8_t xb; 2696 1.1 christos status = mra->read (mra, 1, 1, &xb); 2697 1.1 christos if (status < 0) 2698 1.1 christos return status; 2699 1.1 christos /* The size suffix is not printed if the OPR operand refers 2700 1.1 christos directly to a register, because the size is implied by the 2701 1.1 christos size of that register. */ 2702 1.1 christos if ((xb & 0xF8) != 0xB8) 2703 1.1 christos osize = sb & 0x03; 2704 1.1 christos } 2705 1.1 christos break; 2706 1.1.1.2 christos default: 2707 1.1.1.2 christos break; 2708 1.1.1.2 christos }; 2709 1.1.1.2 christos 2710 1.1 christos /* Destination register */ 2711 1.1 christos switch (mode) 2712 1.1 christos { 2713 1.1.1.2 christos case SB_REG_REG_N_EFF: 2714 1.1.1.2 christos case SB_REG_REG_N: 2715 1.1.1.2 christos op = create_register_operand (byte & 0x07); 2716 1.1.1.2 christos if (op == NULL) 2717 1.1 christos return -1; 2718 1.1 christos operands[(*n_operands)++] = op; 2719 1.1 christos break; 2720 1.1.1.2 christos case SB_REG_OPR_EFF: 2721 1.1.1.2 christos case SB_REG_OPR_OPR: 2722 1.1.1.2 christos op = create_register_operand (byte & 0x07); 2723 1.1.1.2 christos if (op == NULL) 2724 1.1 christos return -1; 2725 1.1 christos operands[(*n_operands)++] = op; 2726 1.1 christos break; 2727 1.1 christos 2728 1.1 christos case SB_ROT: 2729 1.1 christos op = x_opr_decode_with_size (mra, 1, osize); 2730 1.1 christos if (op == NULL) 2731 1.1 christos return -1; 2732 1.1 christos operands[(*n_operands)++] = op; 2733 1.1 christos break; 2734 1.1 christos 2735 1.1.1.2 christos default: 2736 1.1.1.2 christos break; 2737 1.1.1.2 christos } 2738 1.1.1.2 christos 2739 1.1 christos /* Source register */ 2740 1.1 christos switch (mode) 2741 1.1 christos { 2742 1.1.1.2 christos case SB_REG_REG_N_EFF: 2743 1.1.1.2 christos case SB_REG_REG_N: 2744 1.1.1.2 christos op = create_register_operand_with_size (sb & 0x07, osize); 2745 1.1.1.2 christos if (op == NULL) 2746 1.1 christos return -1; 2747 1.1 christos operands[(*n_operands)++] = op; 2748 1.1 christos break; 2749 1.1 christos 2750 1.1 christos case SB_REG_OPR_OPR: 2751 1.1 christos op = x_opr_decode_with_size (mra, 1, osize); 2752 1.1 christos if (op == NULL) 2753 1.1 christos return -1; 2754 1.1 christos operands[(*n_operands)++] = op; 2755 1.1 christos break; 2756 1.1 christos 2757 1.1.1.2 christos default: 2758 1.1.1.2 christos break; 2759 1.1.1.2 christos } 2760 1.1.1.2 christos 2761 1.1 christos /* 3rd arg */ 2762 1.1 christos switch (mode) 2763 1.1 christos { 2764 1.1 christos case SB_REG_OPR_EFF: 2765 1.1 christos case SB_OPR_N: 2766 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, osize); 2767 1.1.1.2 christos if (op == NULL) 2768 1.1.1.2 christos return -1; 2769 1.1 christos operands[(*n_operands)++] = op; 2770 1.1 christos break; 2771 1.1 christos 2772 1.1 christos case SB_REG_REG_N: 2773 1.1 christos { 2774 1.1 christos uint8_t xb; 2775 1.1 christos status = mra->read (mra, 1, 1, &xb); 2776 1.1 christos if (status < 0) 2777 1.1 christos return status; 2778 1.1 christos 2779 1.1.1.2 christos /* This case is slightly unusual. 2780 1.1.1.2 christos If XB matches the binary pattern 0111XXXX, then instead of 2781 1.1.1.2 christos interpreting this as a general OPR postbyte in the IMMe4 mode, 2782 1.1.1.2 christos the XB byte is interpreted in s special way. */ 2783 1.1 christos if ((xb & 0xF0) == 0x70) 2784 1.1 christos { 2785 1.1 christos if (byte & 0x10) 2786 1.1 christos { 2787 1.1 christos int shift = ((sb & 0x08) >> 3) | ((xb & 0x0f) << 1); 2788 1.1 christos op = create_immediate_operand (shift); 2789 1.1 christos if (op == NULL) 2790 1.1 christos return -1; 2791 1.1 christos operands[(*n_operands)++] = op; 2792 1.1.1.2 christos } 2793 1.1.1.2 christos else 2794 1.1.1.2 christos { 2795 1.1.1.2 christos /* This should not happen. */ 2796 1.1 christos abort (); 2797 1.1 christos } 2798 1.1 christos } 2799 1.1 christos else 2800 1.1 christos { 2801 1.1 christos op = x_opr_decode (mra, 1); 2802 1.1 christos if (op == NULL) 2803 1.1.1.2 christos return -1; 2804 1.1.1.2 christos operands[(*n_operands)++] = op; 2805 1.1.1.2 christos } 2806 1.1.1.2 christos } 2807 1.1.1.2 christos break; 2808 1.1 christos case SB_REG_OPR_OPR: 2809 1.1 christos { 2810 1.1 christos uint8_t xb; 2811 1.1 christos int n = x_opr_n_bytes (mra, 1); 2812 1.1 christos if (n < 0) 2813 1.1 christos return n; 2814 1.1.1.2 christos status = mra->read (mra, 1 + n, 1, &xb); 2815 1.1.1.2 christos if (status < 0) 2816 1.1.1.2 christos return status; 2817 1.1.1.2 christos 2818 1.1 christos if ((xb & 0xF0) == 0x70) 2819 1.1 christos { 2820 1.1 christos int imm = xb & 0x0F; 2821 1.1.1.2 christos imm <<= 1; 2822 1.1.1.2 christos imm |= (sb & 0x08) >> 3; 2823 1.1.1.2 christos op = create_immediate_operand (imm); 2824 1.1.1.2 christos if (op == NULL) 2825 1.1 christos return -1; 2826 1.1 christos operands[(*n_operands)++] = op; 2827 1.1 christos } 2828 1.1 christos else 2829 1.1 christos { 2830 1.1 christos op = x_opr_decode (mra, 1 + n); 2831 1.1 christos if (op == NULL) 2832 1.1 christos return -1; 2833 1.1 christos operands[(*n_operands)++] = op; 2834 1.1 christos } 2835 1.1 christos } 2836 1.1 christos break; 2837 1.1 christos default: 2838 1.1 christos break; 2839 1.1.1.2 christos } 2840 1.1.1.2 christos 2841 1.1.1.2 christos switch (mode) 2842 1.1.1.2 christos { 2843 1.1 christos case SB_REG_REG_N_EFF: 2844 1.1 christos case SB_REG_OPR_EFF: 2845 1.1 christos case SB_OPR_N: 2846 1.1 christos { 2847 1.1 christos int imm = (sb & 0x08) ? 2 : 1; 2848 1.1 christos op = create_immediate_operand (imm); 2849 1.1.1.2 christos if (op == NULL) 2850 1.1 christos return -1; 2851 1.1 christos operands[(*n_operands)++] = op; 2852 1.1 christos } 2853 1.1 christos break; 2854 1.1 christos 2855 1.1 christos default: 2856 1.1 christos break; 2857 1.1 christos } 2858 1.1 christos return 0; 2859 1.1 christos } 2860 1.1 christos 2861 1.1 christos static enum optr 2862 1.1 christos psh_pul_discrim (struct mem_read_abstraction_base *mra, 2863 1.1 christos enum optr hint ATTRIBUTE_UNUSED) 2864 1.1 christos { 2865 1.1.1.2 christos uint8_t byte; 2866 1.1 christos int status = mra->read (mra, 0, 1, &byte); 2867 1.1 christos if (status != 0) 2868 1.1 christos return OP_INVALID; 2869 1.1.1.2 christos 2870 1.1 christos return (byte & 0x80) ? OP_pull: OP_push; 2871 1.1 christos } 2872 1.1 christos 2873 1.1.1.2 christos 2874 1.1 christos static int 2875 1.1 christos psh_pul_decode (struct mem_read_abstraction_base *mra, 2876 1.1 christos int *n_operands, struct operand **operand) 2877 1.1 christos { 2878 1.1.1.2 christos struct operand *op; 2879 1.1.1.2 christos uint8_t byte; 2880 1.1.1.2 christos int status = mra->read (mra, 0, 1, &byte); 2881 1.1.1.2 christos if (status != 0) 2882 1.1.1.2 christos return status; 2883 1.1.1.2 christos int bit; 2884 1.1 christos if (byte & 0x40) 2885 1.1 christos { 2886 1.1 christos if ((byte & 0x3F) == 0) 2887 1.1 christos { 2888 1.1 christos op = create_register_all16_operand (); 2889 1.1.1.2 christos if (op == NULL) 2890 1.1.1.2 christos return -1; 2891 1.1.1.2 christos operand[(*n_operands)++] = op; 2892 1.1.1.2 christos } 2893 1.1 christos else 2894 1.1 christos for (bit = 5; bit >= 0; --bit) 2895 1.1 christos { 2896 1.1 christos if (byte & (0x1 << bit)) 2897 1.1 christos { 2898 1.1 christos op = create_register_operand (oprregs2[bit]); 2899 1.1.1.2 christos if (op == NULL) 2900 1.1.1.2 christos return -1; 2901 1.1.1.2 christos operand[(*n_operands)++] = op; 2902 1.1.1.2 christos } 2903 1.1.1.2 christos } 2904 1.1.1.2 christos } 2905 1.1 christos else 2906 1.1 christos { 2907 1.1 christos if ((byte & 0x3F) == 0) 2908 1.1 christos { 2909 1.1 christos op = create_register_all_operand (); 2910 1.1.1.2 christos if (op == NULL) 2911 1.1.1.2 christos return -1; 2912 1.1.1.2 christos operand[(*n_operands)++] = op; 2913 1.1.1.2 christos } 2914 1.1 christos else 2915 1.1 christos for (bit = 5; bit >= 0; --bit) 2916 1.1 christos { 2917 1.1.1.2 christos if (byte & (0x1 << bit)) 2918 1.1 christos { 2919 1.1 christos op = create_register_operand (oprregs1[bit]); 2920 1.1 christos if (op == NULL) 2921 1.1 christos return -1; 2922 1.1 christos operand[(*n_operands)++] = op; 2923 1.1 christos } 2924 1.1 christos } 2925 1.1 christos } 2926 1.1 christos return 0; 2927 1.1 christos } 2928 1.1 christos 2929 1.1 christos static enum optr 2930 1.1.1.2 christos bit_field_discrim (struct mem_read_abstraction_base *mra, 2931 1.1 christos enum optr hint ATTRIBUTE_UNUSED) 2932 1.1 christos { 2933 1.1.1.2 christos int status; 2934 1.1 christos bfd_byte bb; 2935 1.1 christos status = mra->read (mra, 0, 1, &bb); 2936 1.1 christos if (status != 0) 2937 1.1.1.2 christos return OP_INVALID; 2938 1.1 christos 2939 1.1 christos return (bb & 0x80) ? OP_bfins : OP_bfext; 2940 1.1 christos } 2941 1.1 christos 2942 1.1 christos static int 2943 1.1.1.2 christos bit_field_decode (struct mem_read_abstraction_base *mra, 2944 1.1 christos int *n_operands, struct operand **operands) 2945 1.1 christos { 2946 1.1 christos struct operand *op; 2947 1.1 christos int status; 2948 1.1.1.2 christos 2949 1.1 christos bfd_byte byte2; 2950 1.1 christos status = mra->read (mra, -1, 1, &byte2); 2951 1.1 christos if (status != 0) 2952 1.1 christos return status; 2953 1.1 christos 2954 1.1 christos bfd_byte bb; 2955 1.1 christos status = mra->read (mra, 0, 1, &bb); 2956 1.1 christos if (status != 0) 2957 1.1 christos return status; 2958 1.1 christos 2959 1.1 christos enum BB_MODE mode = -1; 2960 1.1 christos size_t i; 2961 1.1 christos const struct opr_bb *bbs = 0; 2962 1.1 christos for (i = 0; i < sizeof (bb_modes) / sizeof (bb_modes[0]); ++i) 2963 1.1 christos { 2964 1.1 christos bbs = bb_modes + i; 2965 1.1 christos if ((bb & bbs->mask) == bbs->value) 2966 1.1 christos { 2967 1.1 christos mode = bbs->mode; 2968 1.1 christos break; 2969 1.1 christos } 2970 1.1.1.2 christos } 2971 1.1.1.2 christos int reg1 = byte2 & 0x07; 2972 1.1.1.2 christos /* First operand */ 2973 1.1.1.2 christos switch (mode) 2974 1.1 christos { 2975 1.1 christos case BB_REG_REG_REG: 2976 1.1.1.2 christos case BB_REG_REG_IMM: 2977 1.1.1.2 christos case BB_REG_OPR_REG: 2978 1.1.1.2 christos case BB_REG_OPR_IMM: 2979 1.1.1.2 christos op = create_register_operand (reg1); 2980 1.1 christos if (op == NULL) 2981 1.1 christos return -1; 2982 1.1.1.2 christos operands[(*n_operands)++] = op; 2983 1.1.1.2 christos break; 2984 1.1.1.2 christos case BB_OPR_REG_REG: 2985 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, (bb >> 2) & 0x03); 2986 1.1 christos if (op == NULL) 2987 1.1 christos return -1; 2988 1.1 christos operands[(*n_operands)++] = op; 2989 1.1 christos break; 2990 1.1 christos case BB_OPR_REG_IMM: 2991 1.1 christos op = x_opr_decode_with_size (mra, 2, (bb >> 2) & 0x03); 2992 1.1 christos if (op == NULL) 2993 1.1 christos return -1; 2994 1.1 christos operands[(*n_operands)++] = op; 2995 1.1 christos break; 2996 1.1.1.2 christos } 2997 1.1.1.2 christos 2998 1.1.1.2 christos /* Second operand */ 2999 1.1.1.2 christos switch (mode) 3000 1.1 christos { 3001 1.1 christos case BB_REG_REG_REG: 3002 1.1 christos case BB_REG_REG_IMM: 3003 1.1 christos { 3004 1.1 christos int reg_src = (bb >> 2) & 0x07; 3005 1.1 christos op = create_register_operand (reg_src); 3006 1.1.1.2 christos if (op == NULL) 3007 1.1.1.2 christos return -1; 3008 1.1.1.2 christos operands[(*n_operands)++] = op; 3009 1.1.1.2 christos } 3010 1.1 christos break; 3011 1.1 christos case BB_OPR_REG_REG: 3012 1.1 christos case BB_OPR_REG_IMM: 3013 1.1.1.2 christos { 3014 1.1.1.2 christos int reg_src = (byte2 & 0x07); 3015 1.1.1.2 christos op = create_register_operand (reg_src); 3016 1.1.1.2 christos if (op == NULL) 3017 1.1 christos return -1; 3018 1.1 christos operands[(*n_operands)++] = op; 3019 1.1.1.2 christos } 3020 1.1.1.2 christos break; 3021 1.1.1.2 christos case BB_REG_OPR_REG: 3022 1.1.1.2 christos op = x_opr_decode_with_size (mra, 1, (bb >> 2) & 0x03); 3023 1.1 christos if (op == NULL) 3024 1.1 christos return -1; 3025 1.1 christos operands[(*n_operands)++] = op; 3026 1.1 christos break; 3027 1.1 christos case BB_REG_OPR_IMM: 3028 1.1 christos op = x_opr_decode_with_size (mra, 2, (bb >> 2) & 0x03); 3029 1.1 christos if (op == NULL) 3030 1.1 christos return -1; 3031 1.1 christos operands[(*n_operands)++] = op; 3032 1.1 christos break; 3033 1.1 christos } 3034 1.1.1.2 christos 3035 1.1.1.2 christos /* Third operand */ 3036 1.1.1.2 christos switch (mode) 3037 1.1.1.2 christos { 3038 1.1 christos case BB_REG_REG_REG: 3039 1.1 christos case BB_OPR_REG_REG: 3040 1.1 christos case BB_REG_OPR_REG: 3041 1.1 christos { 3042 1.1 christos int reg_parm = bb & 0x03; 3043 1.1 christos op = create_register_operand (reg_parm); 3044 1.1 christos if (op == NULL) 3045 1.1.1.2 christos return -1; 3046 1.1.1.2 christos operands[(*n_operands)++] = op; 3047 1.1.1.2 christos } 3048 1.1 christos break; 3049 1.1 christos case BB_REG_REG_IMM: 3050 1.1 christos case BB_OPR_REG_IMM: 3051 1.1 christos case BB_REG_OPR_IMM: 3052 1.1.1.2 christos { 3053 1.1.1.2 christos bfd_byte i1; 3054 1.1.1.2 christos status = mra->read (mra, 1, 1, &i1); 3055 1.1.1.2 christos if (status < 0) 3056 1.1 christos return status; 3057 1.1 christos int offset = i1 & 0x1f; 3058 1.1 christos int width = bb & 0x03; 3059 1.1.1.2 christos width <<= 3; 3060 1.1 christos width |= i1 >> 5; 3061 1.1 christos op = create_bitfield_operand (width, offset); 3062 1.1 christos if (op == NULL) 3063 1.1 christos return -1; 3064 1.1 christos operands[(*n_operands)++] = op; 3065 1.1 christos } 3066 1.1 christos break; 3067 1.1 christos } 3068 1.1 christos return 0; 3069 1.1 christos } 3070 1.1 christos 3071 1.1 christos 3072 1.1 christos /* Decode the next instruction at MRA, according to OPC. 3073 1.1 christos The operation to be performed is returned. 3074 1.1.1.2 christos The number of operands, will be placed in N_OPERANDS. 3075 1.1.1.2 christos The operands themselved into OPERANDS. */ 3076 1.1.1.2 christos static enum optr 3077 1.1.1.2 christos decode_operation (const struct opcode *opc, 3078 1.1.1.2 christos struct mem_read_abstraction_base *mra, 3079 1.1 christos int *n_operands, struct operand **operands) 3080 1.1 christos { 3081 1.1.1.2 christos enum optr op = opc->operator; 3082 1.1.1.2 christos if (opc->discriminator) 3083 1.1 christos { 3084 1.1 christos op = opc->discriminator (mra, opc->operator); 3085 1.1.1.2 christos if (op == OP_INVALID) 3086 1.1.1.2 christos return op; 3087 1.1 christos } 3088 1.1 christos 3089 1.1 christos if (opc->operands) 3090 1.1 christos if (opc->operands (mra, n_operands, operands) < 0) 3091 1.1 christos return OP_INVALID; 3092 1.1 christos 3093 1.1 christos if (opc->operands2) 3094 1.1 christos if (opc->operands2 (mra, n_operands, operands) < 0) 3095 1.1 christos return OP_INVALID; 3096 1.1 christos 3097 1.1 christos return op; 3098 1.1 christos } 3099 1.1 christos 3100 1.1.1.2 christos int 3101 1.1 christos decode_s12z (enum optr *myoperator, short *osize, 3102 1.1 christos int *n_operands, struct operand **operands, 3103 1.1 christos struct mem_read_abstraction_base *mra) 3104 1.1 christos { 3105 1.1 christos int n_bytes = 0; 3106 1.1 christos bfd_byte byte; 3107 1.1 christos 3108 1.1 christos int status = mra->read (mra, 0, 1, &byte); 3109 1.1 christos if (status < 0) 3110 1.1 christos return status; 3111 1.1 christos 3112 1.1.1.2 christos mra->advance (mra); 3113 1.1.1.2 christos 3114 1.1.1.2 christos const struct opcode *opc = page1 + byte; 3115 1.1 christos if (byte == PAGE2_PREBYTE) 3116 1.1 christos { 3117 1.1 christos /* Opcodes in page2 have an additional byte */ 3118 1.1 christos n_bytes++; 3119 1.1 christos 3120 1.1 christos bfd_byte byte2; 3121 1.1 christos status = mra->read (mra, 0, 1, &byte2); 3122 1.1.1.2 christos if (status < 0) 3123 1.1.1.2 christos return status; 3124 1.1.1.2 christos mra->advance (mra); 3125 1.1.1.2 christos opc = page2 + byte2; 3126 1.1.1.2 christos } 3127 1.1.1.2 christos *myoperator = decode_operation (opc, mra, n_operands, operands); 3128 1.1.1.2 christos *osize = opc->osize; 3129 1.1.1.2 christos 3130 1.1.1.2 christos /* Return the number of bytes in the instruction. */ 3131 1.1 christos if (*myoperator != OP_INVALID && opc->insn_bytes) 3132 1.1 christos { 3133 1.1 christos int n = opc->insn_bytes (mra); 3134 1.1 christos if (n < 0) 3135 return n; 3136 n_bytes += n; 3137 } 3138 else 3139 n_bytes += 1; 3140 3141 return n_bytes; 3142 } 3143 3144