1/* m32c.opc --- semantics for m32c opcodes. -*- mode: c -*- 2 3Copyright (C) 2005, 2007, 2008, 2009, 2010, 2011 4Free Software Foundation, Inc. 5Contributed by Red Hat, Inc. 6 7This file is part of the GNU simulators. 8 9This program is free software; you can redistribute it and/or modify 10it under the terms of the GNU General Public License as published by 11the Free Software Foundation; either version 3 of the License, or 12(at your option) any later version. 13 14This program is distributed in the hope that it will be useful, 15but WITHOUT ANY WARRANTY; without even the implied warranty of 16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17GNU General Public License for more details. 18 19You should have received a copy of the GNU General Public License 20along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 23#include <stdio.h> 24#include <stdlib.h> 25 26#include "cpu.h" 27#include "mem.h" 28#include "misc.h" 29#include "int.h" 30 31#define AU __attribute__((unused)) 32 33#define tprintf if (trace) printf 34 35static unsigned char 36getbyte () 37{ 38 int tsave = trace; 39 unsigned char b; 40 41 if (trace == 1) 42 trace = 0; 43 b = mem_get_pc (); 44 regs.r_pc ++; 45 trace = tsave; 46 return b; 47} 48 49#define M32C_ONLY() /* FIXME: add something here */ 50 51#define GETBYTE() (op[opi++] = getbyte()) 52 53#define UNSUPPORTED() unsupported("unsupported", m32c_opcode_pc) 54#define NOTYET() unsupported("unimplemented", m32c_opcode_pc) 55 56static void 57unsupported (char *tag, int orig_pc) 58{ 59 int i; 60 printf("%s opcode at %08x\n", tag, orig_pc); 61 regs.r_pc = orig_pc; 62 for (i=0; i<2; i++) 63 { 64 int b = mem_get_pc(); 65 printf(" %s", bits(b>>4, 4)); 66 printf(" %s", bits(b, 4)); 67 regs.r_pc ++; 68 } 69 printf("\n"); 70 regs.r_pc = orig_pc; 71 for (i=0; i<6; i++) 72 { 73 printf(" %02x", mem_get_pc ()); 74 regs.r_pc ++; 75 } 76 printf("\n"); 77 exit(1); 78} 79 80static int 81IMM(int bytes) 82{ 83 int rv = 0; 84 switch (bytes) 85 { 86 case 1: 87 rv = mem_get_qi (get_reg(pc)); 88 break; 89 case 2: 90 rv = mem_get_hi (get_reg(pc)); 91 break; 92 case 3: 93 rv = mem_get_psi (get_reg(pc)); 94 break; 95 case 4: 96 rv = mem_get_si (get_reg(pc)); 97 break; 98 } 99 regs.r_pc += bytes; 100 return rv; 101} 102 103#define IMM4() (immm >= 8 ? 7 - immm : immm + 1) 104 105#define NO_PREFIX() PREFIX(0,0,0) 106 107/* Indicate which sorts of prefixes are allowed for the current 108 opcode. */ 109void 110prefix (src_allowed, dest_allowed, index_bytewidth) 111{ 112 /* At the moment, we don't do anything with this information. We 113 just wanted to get the information entered in some 114 machine-readable form while we were going through all the 115 opcodes. */ 116} 117 118#define MATH_OP(dc,s,c,op) \ 119{ \ 120 int ma, mb; \ 121 ma = get_src(dc); \ 122 mb = s & b2mask[dc.bytes]; \ 123 ll = (long long)ma op (long long)mb op c; \ 124 tprintf("0x%x " #op " 0x%x " #op " 0x%x = 0x%llx\n", ma, mb, c, ll); \ 125 ma = sign_ext (ma, dc.bytes * 8); \ 126 mb = sign_ext (s, dc.bytes * 8); \ 127 v = ma op mb op c; \ 128 tprintf("%d " #op " %d " #op " %d = %d\n", ma, mb, c, v); \ 129 set_oszc (v, dc.bytes, (1 op 1) ? (ll > b2mask[dc.bytes]) : (ll >= 0)); \ 130 put_dest (dc, v); \ 131} 132 133#define LOGIC_OP(dc,s,op) \ 134{ \ 135 int ma, mb; \ 136 ma = get_src(dc); \ 137 mb = s & b2mask[dc.bytes]; \ 138 v = ma op mb; \ 139 tprintf("0x%x " #op " 0x%x = 0x%x\n", ma, mb, v); \ 140 set_sz (v, dc.bytes); \ 141 put_dest (dc, v); \ 142} 143 144#define BIT_OP(dc,bit,expr) \ 145 b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \ 146 v = expr; \ 147 tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \ 148 b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \ 149 put_bit2 (dc, bitindex == -1 ? bit : bitindex, v); 150 151#define BIT_OPC(dc,bit,expr) \ 152 b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \ 153 v = expr; \ 154 tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \ 155 b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \ 156 set_c (v); 157 158#define carry (FLAG_C ? 1 : 0) 159 160static void 161cmp (int d, int s, int bytes) 162{ 163 int a, b, f=0; 164 a = d - s; 165 b = sign_ext (d, bytes*8) - sign_ext (s, bytes*8); 166 tprintf ("cmp: %x - %x = %08x, %x - %x = %d\n", 167 d, s, a, 168 sign_ext(d,bytes*8), sign_ext(s,bytes*8), b); 169 170 if (b == 0) 171 f |= FLAGBIT_Z; 172 if (b & b2signbit[bytes]) 173 f |= FLAGBIT_S; 174 if ((d & b2mask[bytes]) >= (s & b2mask[bytes])) 175 f |= FLAGBIT_C; 176 if (b < b2minsigned[bytes] || b > b2maxsigned[bytes]) 177 f |= FLAGBIT_O; 178 179 set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f); 180} 181 182static void 183dadd_op (int ddd, int dd, int sss, int ss, int imm, int add, int cy, int w) 184{ 185 srcdest sc, dc; 186 int a, b=0, res; 187 188 prefix (0, 0, 0); 189 190 if (!imm) 191 { 192 sc = decode_src23 (sss, ss, w+1); 193 b = get_src (sc); 194 } 195 dc = decode_dest23 (ddd, dd, w+1); 196 a = get_src (dc); 197 if (imm) 198 b = IMM(w+1); 199 200 a = bcd2int(a, w); 201 b = bcd2int(b, w); 202 203 tprintf("decimal: %d %s %d", a, add?"+":"-", b); 204 if (cy) 205 tprintf(" c=%d", carry); 206 207 if (add) 208 { 209 res = a + b; 210 if (cy) 211 res += carry; 212 cy = res > (w ? 9999 : 99); 213 } 214 else 215 { 216 res = a - b; 217 if (cy) 218 res -= (1-carry); 219 cy = res >= 0; 220 if (res < 0) 221 res += w ? 10000 : 100; 222 } 223 224 res = int2bcd (res, w); 225 tprintf(" = %x\n", res); 226 227 set_szc (res, w+1, cy); 228 229 put_dest (dc, res); 230} 231#define DADDV(A,C) dadd_op(ddd, dd, sss, ss, 0, A, C, w) 232#define DADDI(A,C) dadd_op(ddd, dd, 0, 0, 1, A, C, w) 233 234static void 235div_op (int sss, int ss, int u, int x, int bytes) 236{ 237 srcdest sc; 238 int s, v, a, b; 239 240 if (sss == -1) 241 s = IMM(bytes); 242 else 243 { 244 sc = decode_dest23 (sss, ss, bytes); 245 s = get_src (sc); 246 } 247 248 v = get_reg (bytes > 1 ? r2r0 : r0); 249 250 if (!u) 251 { 252 /* FIXME? do we sign extend a0/a1 to .L? Docs say zero extend. */ 253 s = sign_ext (s, bytes*8); 254 v = sign_ext (v, bytes*8); 255 } 256 257 if (s == 0) 258 { 259 set_flags (FLAGBIT_O, FLAGBIT_O); 260 return; 261 } 262 263 if (u) 264 { 265 a = (unsigned int)v / (unsigned int)s; 266 b = (unsigned int)v % (unsigned int)s; 267 } 268 else 269 { 270 a = v / s; 271 b = v % s; 272 } 273 if (x) 274 { 275 if ((s > 0 && b < 0) 276 || (s < 0 && b > 0)) 277 { 278 a --; 279 b += s; 280 } 281 } 282 tprintf ("%d / %d = %d rem %d\n", v, s, a, b); 283 if ((!u && (a > b2maxsigned[bytes] 284 || a < b2minsigned[bytes])) 285 || (u && (a > b2mask[bytes]))) 286 set_flags (FLAGBIT_O, FLAGBIT_O); 287 else 288 set_flags (FLAGBIT_O, 0); 289 290 switch (bytes) 291 { 292 case 1: 293 put_reg (r0l, a); 294 put_reg (r0h, b); 295 break; 296 case 2: 297 put_reg (r0, a); 298 put_reg (r2, b); 299 break; 300 case 4: 301 put_reg (r2r0, a); 302 break; 303 } 304} 305 306static void 307index_op (int sss, int ss, int do_s, int do_d, int scale, int w) 308{ 309 srcdest sc = decode_src23 (sss, ss, w+1); 310 int v = get_src (sc) * scale; 311 tprintf("%d = %d * %d, %d %d\n", v, get_src(sc), scale, do_s, do_d); 312 decode_index (do_s * v, do_d * v); 313} 314#define INDEXOP(scale,do_s,do_d) \ 315 index_op (sss, ss, do_s, do_d, scale, w); goto next_opcode 316 317static void 318rot_op (srcdest sd, int rotc, int count) 319{ 320 int mask = (sd.bytes == 2) ? 0xffff : 0xff; 321 int msb = (sd.bytes == 2) ? 0x8000 : 0x80; 322 int v = get_src (sd); 323 int c = carry, ct; 324 325 tprintf("%s %x by %d\n", rotc ? "rotc" : "rot", v, count); 326 tprintf (": %s %d\n", bits(v, 8*sd.bytes), c); 327 while (count > 0) 328 { 329 ct = (v & msb) ? 1 : 0; 330 v <<= 1; 331 v |= rotc ? c : ct; 332 v &= mask; 333 c = ct; 334 tprintf (": %s %d\n", bits(v, 8*sd.bytes), c); 335 count --; 336 } 337 while (count < 0) 338 { 339 ct = v & 1; 340 v >>= 1; 341 v |= (rotc ? c : ct) * msb; 342 c = ct; 343 tprintf (": %s %d\n", bits(v, 8*sd.bytes), c); 344 count ++; 345 } 346 put_dest (sd, v); 347 set_szc (v, sd.bytes, c); 348} 349 350static void 351shift_op (srcdest sd, int arith, int count, int setc) 352{ 353 int mask = (sd.bytes == 2) ? 0xffff : 0xff; 354 int msb = (sd.bytes == 2) ? 0x8000 : 0x80; 355 int v = get_src (sd); 356 int c = 0; 357 int o = 0; 358 359 if (sd.bytes == 4) 360 { 361 mask = 0xffffffffU; 362 msb = 0x80000000U; 363 } 364 365 tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count); 366 tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o); 367 while (count > 0) 368 { 369 c = (v & msb) ? 1 : 0; 370 v <<= 1; 371 v &= mask; 372 if (c != ((v & msb) ? 1 : 0)) 373 o = 1; 374 tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o); 375 count --; 376 } 377 while (count < 0) 378 { 379 c = v & 1; 380 if (arith) 381 v = (v & msb) | (v >> 1); 382 else 383 v = (v >> 1) & (msb - 1); 384 tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o); 385 count ++; 386 } 387 put_dest (sd, v); 388 set_sz (v, sd.bytes); 389 if (setc) 390 set_c (c); 391 set_flags (FLAGBIT_O, o ? FLAGBIT_O : 0); 392} 393 394static int pcs[16]; 395static int ipcs = 0; 396 397int 398decode_m32c() 399{ 400 unsigned char op[40]; 401 int opi; 402 int v, a, b; 403 long long ll; 404 srcdest sc, dc; 405 int imm; 406 int bitindex = -1; 407 int t0, t1=0, t2, t3=0; 408 int ta0, ta1, dif; 409 410 step_result = M32C_MAKE_STEPPED (); 411 412 decode_indirect (0, 0); 413 decode_index (0, 0); 414 415next_opcode: 416 opi = 0; 417 m32c_opcode_pc = get_reg (pc); 418 419 tprintf("trace: decode pc = %06x\n", m32c_opcode_pc); 420 421 if (m32c_opcode_pc == 0) 422 { 423 int i; 424 printf("Abort: PC is zero, here from:\n"); 425 for (i=0; i<4; i++) 426 printf(" 0x%06x\n", pcs[(ipcs+15-i)%16]); 427 return M32C_MAKE_HIT_BREAK (); 428 } 429 pcs[ipcs++] = m32c_opcode_pc; 430 ipcs %= 16; 431 432 /** VARY sss 000 001 010 011 100 */ 433 /** VARY ddd 000 001 010 011 100 */ 434 435 /** 0000 1001 indirect dest */ 436 437 decode_indirect (0, 1); 438 goto next_opcode; 439 440 /** 0100 0001 indirect src */ 441 442 decode_indirect (1, 0); 443 goto next_opcode; 444 445 /** 0100 1001 indirect src and dest */ 446 447 decode_indirect (1, 1); 448 goto next_opcode; 449 450 /** 1010 ddd w dd01 1111 ABS.size dest */ 451 452 prefix (0, 1, 0); 453 dc = decode_dest23 (ddd, dd, w+1); 454 v = sign_ext (get_src (dc), w?16:8); 455 a = v<0 ? -v : v; 456 tprintf("abs(%d) = %d\n", v, a); 457 set_osz(a, w+1); 458 put_dest (dc, a); 459 460 /** 0000 0001 1000 ddd w dd10 1110 ADC.size #IMM,dest */ 461 462 prefix (0, 0, 0); 463 dc = decode_dest23 (ddd, dd, w+1); 464 imm = IMM (w+1); 465 MATH_OP (dc, imm, carry, +); 466 467 /** 0000 0001 1sss ddd w dd ss 0100 ADC.size src,dest */ 468 469 prefix (0, 0, 0); 470 sc = decode_src23 (sss, ss, w+1); 471 dc = decode_dest23 (ddd, dd, w+1); 472 b = get_src (sc); 473 MATH_OP (dc, b, carry, +); 474 475 /** 1011 ddd w dd01 1110 ADCF.size dest */ 476 477 prefix (0, 1, 0); 478 dc = decode_dest23 (ddd, dd, w+1); 479 MATH_OP (dc, 0, carry, +); 480 481 /** 1000 ddd w dd10 1110 ADD.size:G #IMM,dest */ 482 483 prefix (0, 1, 0); 484 dc = decode_dest23(ddd, dd, w+1); 485 imm = IMM(w+1); 486 MATH_OP (dc, imm, 0, +); 487 488 /** 1000 ddd0 dd11 0001 ADD.L:G #IMM,dest */ 489 490 prefix (0, 1, 0); 491 dc = decode_dest23(ddd, dd, 4); 492 imm = IMM(4); 493 MATH_OP (dc, imm, 0, +); 494 495 /** 111L ddd w dd11 immm ADD.size:Q #IMM,dest */ 496 497 prefix (0, 1, 0); 498 dc = decode_dest23(ddd, dd, L ? 4 : (w+1)); 499 imm = sign_ext (immm, 4); 500 MATH_OP (dc, imm, 0, +); 501 502 /** 00dd 011w ADD.size:S #IMM,dest */ 503 504 prefix (0, 1, 0); 505 dc = decode_dest2(dd, w+1); 506 imm = IMM (w+1); 507 MATH_OP (dc, imm, 0, +); 508 509 /** 10i0 110d ADD.L:S #IMM,A0/A1 */ 510 511 prefix (0, 0, 0); 512 dc = reg_sd (d ? a1 : a0); 513 imm = i ? 2 : 1; 514 MATH_OP (dc, imm, 0, +); 515 516 /** 1sss ddd w dd ss 1000 ADD.size:G src,dest */ 517 518 prefix (1, 1, 0); 519 sc = decode_src23(sss, ss, w+1); 520 dc = decode_dest23(ddd, dd, w+1); 521 b = get_src (sc); 522 MATH_OP (dc, b, 0, +); 523 524 /** 1sss ddd1 dd ss 0010 ADD.L:G src,dest */ 525 526 prefix (1, 1, 0); 527 sc = decode_src23(sss, ss, 4); 528 dc = decode_dest23(ddd, dd, 4); 529 b = get_src (sc); 530 MATH_OP (dc, b, 0, +); 531 532 /** 1011 0110 0001 0011 ADD.L:G #IMM16,SP */ 533 534 prefix (0, 0, 0); 535 dc = reg_sd (sp); 536 b = sign_ext (IMM(2), 16); 537 MATH_OP (dc, b, 0, +); 538 539 /** 01ii 001i ADD.L:Q #IMM3,SP */ 540 541 prefix (0, 0, 0); 542 dc = reg_sd (sp); 543 b = ii * 2 + i + 1; 544 MATH_OP (dc, b, 0, +); 545 546 /** 1011 0110 0000 0011 ADD.L:S #IMM8,SP */ 547 548 prefix (0, 0, 0); 549 dc = reg_sd (sp); 550 b = sign_ext (IMM(1), 8); 551 MATH_OP (dc, b, 0, +); 552 553 /** 1000 ddd0 dd01 0001 ADDX #IMM,dest */ 554 555 prefix (0, 1, 0); 556 dc = decode_dest23(ddd, dd, 4); 557 imm = sign_ext (IMM(1), 8); 558 MATH_OP (dc, imm, 0, +); 559 560 /** 1sss ddd0 dd ss 0010 ADDX src,dest */ 561 562 prefix (1, 1, 0); 563 sc = decode_src23(sss, ss, 1); 564 dc = decode_dest23(ddd, dd, 4); 565 b = sign_ext (get_src (sc), 8); 566 MATH_OP (dc, b, 0, +); 567 568 /** 1111 ddd w dd01 immm ADJNZ.size #IMM,dest,label */ 569 570 prefix (0, 0, 0); 571 dc = decode_dest23 (ddd, dd, w+1); 572 v = get_src (dc); 573 imm = sign_ext(immm, 4); 574 tprintf("%d + %d = %d\n", v, imm, v+imm); 575 v += imm; 576 put_dest (dc, v); 577 a = sign_ext (IMM(1), 8); 578 if ((v & (w ? 0xffff : 0xff)) != 0) 579 { 580 tprintf("jmp: %x + 2 + %d = ", get_reg (pc), a); 581 put_reg (pc, m32c_opcode_pc + 2 + a); 582 tprintf("%x\n", get_reg (pc)); 583 } 584 585 /** 1000 ddd w dd11 1111 AND.size:G #IMM,dest */ 586 587 prefix (0, 1, 0); 588 dc = decode_dest23(ddd, dd, w+1); 589 imm = IMM(w+1); 590 LOGIC_OP (dc, imm, &); 591 592 /** 01dd 110w AND.size:S #IMM,dest */ 593 594 prefix (0, 1, 0); 595 dc = decode_dest2(dd, w+1); 596 imm = IMM (w+1); 597 LOGIC_OP (dc, imm, &); 598 599 /** 1sss ddd w dd ss 1101 AND.size:G src,dest */ 600 601 prefix (1, 1, 0); 602 sc = decode_src23(sss, ss, w+1); 603 dc = decode_dest23(ddd, dd, w+1); 604 b = get_src (sc); 605 LOGIC_OP (dc, b, &); 606 607 /** 0000 0001 1101 sss0 ss00 1bit BAND src */ 608 609 sc = decode_src23 (sss, ss, 1); 610 BIT_OPC (sc, bit, b & carry); 611 612 /** 1101 ddd0 dd11 0bit BCLR dest */ 613 614 dc = decode_dest23 (ddd, dd, 1); 615 BIT_OP (dc, bit, 0); 616 617 /** 1100 ddd w dd10 1110 BITINDEX.size src */ 618 619 prefix (0, 0, 0); 620 dc = decode_dest23 (ddd, dd, w+1); 621 bitindex = get_src (dc); 622 tprintf ("bitindex set to %d\n", bitindex); 623 goto next_opcode; 624 625 /** 1101 ddd0 dd01 0bit BMcnd dest */ 626 627 prefix (0, 0, 0); 628 dc = decode_dest23 (ddd, dd, 1); 629 if (condition_true (IMM (1))) 630 put_bit2 (dc, bit, 1); 631 else 632 put_bit2 (dc, bit, 0); 633 634 /** 1101 1001 0c10 1cnd BMcnd C */ 635 636 prefix (0, 0, 0); 637 if (condition_true (c * 8 + cnd)) 638 set_c (1); 639 else 640 set_c (0); 641 642 /** 0000 0001 1101 sss0 ss01 1bit BNAND src */ 643 644 prefix (0, 0, 0); 645 sc = decode_src23 (sss, ss, 1); 646 BIT_OPC (sc, bit, (!b) & carry); 647 648 /** 0000 0001 1101 sss0 ss11 0bit BNOR src */ 649 650 prefix (0, 0, 0); 651 sc = decode_src23 (sss, ss, 1); 652 BIT_OPC (sc, bit, (!b) | carry); 653 654 /** 1101 ddd0 dd01 1bit BNOT dest */ 655 656 prefix (0, 0, 0); 657 dc = decode_dest23 (ddd, dd, 1); 658 BIT_OP (dc, bit, !b); 659 660 /** 0000 0001 1101 sss0 ss00 0bit BNTST src */ 661 662 prefix (0, 0, 0); 663 sc = decode_dest23 (sss, ss, 1); 664 b = get_bit2 (sc, bit); 665 set_zc (!b, !b); 666 667 /** 0000 0001 1101 sss0 ss11 1bit BNXOR src */ 668 669 prefix (0, 0, 0); 670 sc = decode_src23 (sss, ss, 1); 671 BIT_OPC (sc, bit, !b ^ carry); 672 673 /** 0000 0001 1101 sss0 ss10 0bit BOR src */ 674 675 prefix (0, 0, 0); 676 sc = decode_src23 (sss, ss, 1); 677 BIT_OPC (sc, bit, b | carry); 678 679 /** 0000 0000 BRK */ 680 681 /* We report the break to our caller with the PC still pointing at the 682 breakpoint instruction. */ 683 put_reg (pc, m32c_opcode_pc); 684 if (verbose) 685 printf("[break]\n"); 686 if (in_gdb || (regs.r_intbl == 0 && regs.r_intbh == 0)) 687 return M32C_MAKE_HIT_BREAK (); 688 if (mem_get_qi (0xFFFFE7) == 0xff) 689 trigger_based_interrupt (0); 690 else 691 trigger_fixed_interrupt (0xFFFFE4); 692 693 /** 1111 1110 GBRK */ 694 695 /* This alternate break, which is not part of the chip's opcode set, 696 is here in case you need to debug a program that itself uses the 697 chip's BRK opcode. You'll need to modify your copy of GDB to use 698 this opcode instead of the real BRK. */ 699 700 /* GDB Break. */ 701 /* We report the break to our caller with the PC still pointing at the 702 breakpoint instruction. */ 703 put_reg (pc, m32c_opcode_pc); 704 if (verbose) 705 printf("[gdb break]\n"); 706 return M32C_MAKE_HIT_BREAK (); 707 708 /** 0000 1000 BRK2 */ 709 710 if (verbose) 711 printf("[break2]\n"); 712 if (in_gdb) 713 return M32C_MAKE_HIT_BREAK (); 714 if (mem_get_qi (0xFFFFE7) == 0xff) 715 trigger_based_interrupt (0); 716 else 717 trigger_fixed_interrupt (0xFFFFE4); 718 719 /** 1101 ddd0 dd11 1bit BSET dest */ 720 721 dc = decode_dest23 (ddd, dd, 1); 722 BIT_OP (dc, bit, 1); 723 724 /** 1101 sss0 ss00 0bit BTST:G src */ 725 726 prefix (0, 0, 0); 727 sc = decode_src23 (sss, ss, 1); 728 b = get_bit2 (sc, bit); 729 set_zc (!b, b); 730 731 /** 00bb 101b BTST:S src */ 732 733 sc = decode_src23 (3, 3, 1); /* bit,base:19 */ 734 b = get_bit2 (sc, bb*2 + b); 735 set_zc (!b, b); 736 737 /** 1101 ddd0 dd10 0bit BTSTC dest */ 738 739 prefix (0, 0, 0); 740 sc = decode_dest23 (ddd, dd, 1); 741 b = get_bit2 (sc, bit); 742 set_zc (!b, b); 743 put_bit2 (sc, bit, 0); 744 745 /** 1101 ddd0 dd10 1bit BTSTS dest */ 746 747 prefix (0, 0, 0); 748 sc = decode_dest23 (ddd, dd, 1); 749 b = get_bit2 (sc, bit); 750 set_zc (!b, b); 751 put_bit2 (sc, bit, 1); 752 753 /** 0000 0001 1101 sss0 ss10 1bit BXOR src */ 754 755 prefix (0, 0, 0); 756 sc = decode_src23 (sss, ss, 1); 757 BIT_OPC (sc, bit, b ^ carry); 758 759 /** 0000 0001 1000 ddd w dd11 1110 CLIP.size #IMM1,#IMM2,dest */ 760 761 prefix (0, 0, 0); 762 dc = decode_dest23 (ddd, dd, w+1); 763 a = sign_ext (IMM(w+1), w*8+8); 764 b = sign_ext (IMM(w+1), w*8+8); 765 v = sign_ext (get_src (dc), w*8+8); 766 tprintf("clip %d <= %d <= %d : ", a, v, b); 767 if (a > v) 768 v = a; 769 if (v > b) 770 v = b; 771 tprintf("%d\n", v); 772 put_dest (dc, v); 773 774 /** 1001 ddd w dd10 1110 CMP.size:G #IMM,dest */ 775 776 prefix (0, 1, 0); 777 dc = decode_dest23 (ddd, dd, w+1); 778 v = get_src (dc); 779 imm = IMM(w+1); 780 cmp (v, imm, w+1); 781 782 /** 1010 ddd0 dd11 0001 CMP.L:G #IMM32,dest */ 783 784 prefix (0, 1, 0); 785 dc = decode_dest23 (ddd, dd, 4); 786 v = get_src (dc); 787 imm = IMM(4); 788 cmp (v, imm, 4); 789 790 /** 1110 ddd w dd01 immm CMP.size:Q #IMM,dest */ 791 792 prefix (0, 1, 0); 793 dc = decode_dest23 (ddd, dd, w+1); 794 v = get_src (dc); 795 immm = sign_ext (immm, 4); 796 cmp (v, immm, w+1); 797 798 /** 01dd 011w CMP.size:S #IMM,dest */ 799 800 prefix (0, 1, 0); 801 dc = decode_dest2 (dd, w+1); 802 v = get_src (dc); 803 imm = sign_ext (IMM(w+1),w*8+8); 804 cmp (v, imm, w+1); 805 806 /** 1sss ddd w dd ss 0110 CMP.size:G src,dest */ 807 808 prefix (1, 1, 0); 809 sc = decode_src23 (sss, ss, w+1); 810 dc = decode_dest23 (ddd, dd, w+1); 811 a = get_src (dc); 812 b = get_src (sc); 813 cmp (a, b, w+1); 814 815 /** 1sss ddd1 dd ss 0001 CMP.L:G src,dest */ 816 817 prefix (1, 1, 0); 818 sc = decode_src23 (sss, ss, 4); 819 dc = decode_dest23 (ddd, dd, 4); 820 a = get_src (dc); 821 b = get_src (sc); 822 cmp (a, b, 4); 823 824 /** 01dd 000w CMP.size:S src,R0/R0L */ 825 826 prefix (0, 1, 0); 827 dc = decode_dest2 (dd, w+1); 828 a = get_reg (w ? r0 : r0l); 829 b = get_src (dc); 830 cmp (a, b, w+1); 831 832 /** 1010 ddd0 dd01 0001 CMPX #IMM,dest */ 833 834 prefix (0, 1, 0); 835 dc = decode_dest23 (ddd, dd, 4); 836 v = get_src (dc); 837 imm = sign_ext (IMM(1), 8); 838 cmp (v, imm, 4); 839 840 /** 0000 0001 1000 ddd w dd00 1110 DADC.size #IMM,dest */ 841 842 DADDI(1,1); 843 844 /** 0000 0001 1sss ddd w dd ss 1000 DADC.size src,dest */ 845 846 DADDV(1,1); 847 848 /** 0000 0001 1000 ddd w dd01 1110 DADD.size #IMM,dest */ 849 850 DADDI(1,0); 851 852 /** 0000 0001 1sss ddd w dd ss 0000 DADD.size src,dest */ 853 854 DADDV(1,0); 855 856 /** 1011 ddd w dd00 1110 DEC.size dest */ 857 858 prefix (0, 1, 0); 859 dc = decode_dest23 (ddd, dd, w+1); 860 a = get_src (dc); 861 v = a-1; 862 tprintf ("%x -- = %x\n", a, v); 863 set_sz (v, w+1); 864 put_dest (dc, v); 865 866 /** 1011 0000 010w 0011 DIV.size #IMM */ 867 868 prefix (0, 0, 0); 869 div_op (-1, 0, 0, 0, w+1); 870 871 /** 1000 sss w ss01 1110 DIV.size src */ 872 873 prefix (0, 1, 0); 874 div_op (sss, ss, 0, 0, w+1); 875 876 /** 0000 0001 1010 sss1 ss01 1111 DIV.L src */ 877 878 M32C_ONLY(); 879 prefix (0, 0, 0); 880 div_op (sss, ss, 0, 0, 4); 881 882 /** 1011 0000 000w 0011 DIVU.size #IMM */ 883 884 prefix (0, 0, 0); 885 div_op (-1, 0, 1, 0, w+1); 886 887 /** 1000 sss w ss00 1110 DIVU.size src */ 888 889 prefix (0, 1, 0); 890 div_op (sss, ss, 1, 0, w+1); 891 892 /** 0000 0001 1010 sss1 ss00 1111 DIVU.L src */ 893 894 M32C_ONLY(); 895 prefix (0, 0, 0); 896 div_op (sss, ss, 1, 0, 4); 897 898 /** 1011 0010 010w 0011 DIVX.size #IMM */ 899 900 prefix (0, 0, 0); 901 div_op (-1, 0, 0, 1, w+1); 902 903 /** 1001 sss w ss01 1110 DIVX.size src */ 904 905 prefix (0, 1, 0); 906 div_op (sss, ss, 0, 1, w+1); 907 908 /** 0000 0001 1010 sss1 ss10 1111 DIVX.L src */ 909 910 M32C_ONLY(); 911 prefix (0, 0, 0); 912 div_op (sss, ss, 0, 1, 4); 913 914 /** 0000 0001 1001 ddd w dd00 1110 DSBB.size #IMM,dest */ 915 916 DADDI(0,1); 917 918 /** 0000 0001 1sss ddd w dd ss 1010 DSBB.size src,dest */ 919 920 DADDV(0,1); 921 922 /** 0000 0001 1001 ddd w dd01 1110 DSUB.size #IMM,dest */ 923 924 DADDI(0,0); 925 926 /** 0000 0001 1sss ddd w dd ss 0010 DSUB.size src,dest */ 927 928 DADDV(0,0); 929 930 /** 1110 1100 ENTER #IMM */ 931 932 imm = IMM(1); 933 put_reg (sp, get_reg (sp) - 4); 934 mem_put_si (get_reg (sp), get_reg (fb)); 935 put_reg (fb, get_reg (sp)); 936 put_reg (sp, get_reg (sp) - imm); 937 938 /** 1111 1100 EXITD */ 939 940 put_reg (sp, get_reg (fb)); 941 put_reg (fb, mem_get_si (get_reg (sp))); 942 put_reg (sp, get_reg (sp) + 4); 943 put_reg (pc, mem_get_si (get_reg (sp))); 944 put_reg (sp, get_reg (sp) + 4); 945 946 /** 1100 ddd w dd01 1110 EXTS.size dest */ 947 948 prefix (0, 0, 0); 949 dc = decode_dest23 (ddd, dd, w+1); 950 v = sign_ext (get_src (dc), (w+1)*8); 951 dc = widen_sd (dc); 952 put_dest (dc, v); 953 set_sz (v, (w+1)*2); 954 955 /** 0000 0001 1sss ddd0 dd ss 0111 EXTS.B src,dest */ 956 957 prefix (0, 0, 0); 958 sc = decode_src23 (sss, ss, 1); 959 dc = decode_dest23 (ddd, dd, 2); 960 v = sign_ext (get_src (sc), 8); 961 put_dest (dc, v); 962 set_sz (v, 16); 963 964 /** 0000 0001 1sss ddd0 dd ss 1011 EXTZ src,dest */ 965 966 prefix (0, 0, 0); 967 sc = decode_src23 (sss, ss, 1); 968 dc = decode_dest23 (ddd, dd, 2); 969 v = get_src (sc); 970 put_dest (dc, v); 971 set_sz (v, 16); 972 973 /** 1101 0011 1110 1dst FCLR dest */ 974 975 set_flags (1 << dst, 0); 976 977 /** 1001 1111 FREIT */ 978 979 NOTYET(); 980 981 /** 1101 0001 1110 1dst FSET dest */ 982 983 set_flags (1 << dst, 1 << dst); 984 985 /** 1010 ddd w dd00 1110 INC.size dest */ 986 987 prefix (0, 1, 0); 988 dc = decode_dest23 (ddd, dd, w+1); 989 a = get_src (dc); 990 v = a+1; 991 tprintf ("%x ++ = %x\n", a, v); 992 set_sz (v, w+1); 993 put_dest (dc, v); 994 995 /** 1000 sss0 ss0w 0011 INDEXB.size src */ 996 INDEXOP(1, 1, 1); 997 /** 1010 sss0 ss0w 0011 INDEXBD.size src */ 998 INDEXOP(1, 0, 1); 999 /** 1100 sss0 ss0w 0011 INDEXBS.size src */ 1000 INDEXOP(1, 1, 0); 1001 /** 1001 sss0 ss1w 0011 INDEXL.size src */ 1002 INDEXOP(4, 1, 1); 1003 /** 1011 sss0 ss1w 0011 INDEXLD.size src */ 1004 INDEXOP(4, 0, 1); 1005 /** 1001 sss0 ss0w 0011 INDEXLS.size src */ 1006 INDEXOP(4, 1, 0); 1007 /** 1000 sss0 ss1w 0011 INDEXW.size src */ 1008 INDEXOP(2, 1, 1); 1009 /** 1010 sss0 ss1w 0011 INDEXWD.size src */ 1010 INDEXOP(2, 0, 1); 1011 /** 1100 sss0 ss1w 0011 INDEXWS.size src */ 1012 INDEXOP(2, 1, 0); 1013 1014 /** 1011 1110 vector00 INT #IMM */ 1015 1016 prefix (0, 0, 0); 1017 trigger_based_interrupt (vector); 1018 1019 /** 1011 1111 INTO */ 1020 1021 prefix (0, 0, 0); 1022 if (FLAG_O) 1023 trigger_fixed_interrupt (0xffffe0); 1024 1025 /** 1ccc 101c Jcnd label */ 1026 1027 prefix (0, 0, 0); 1028 v = sign_ext (IMM(1), 8); 1029 if (condition_true (ccc*2+c)) 1030 put_reg (pc, m32c_opcode_pc + 1 + v); 1031 1032 /** 01dd 101d JMP.S label */ 1033 1034 prefix (0, 0, 0); 1035 put_reg (pc, m32c_opcode_pc + (dd*2+d) + 2); 1036 1037 /** 1011 1011 JMP.B label */ 1038 1039 prefix (0, 0, 0); 1040 imm = sign_ext (IMM(1), 8); 1041 if (imm == -1) 1042 { 1043 if (verbose) 1044 printf("[jmp-to-self detected as exit]\n"); 1045 return M32C_MAKE_HIT_BREAK (); 1046 } 1047 put_reg (pc, m32c_opcode_pc + 1 + imm); 1048 1049 /** 1100 1110 JMP.W label */ 1050 1051 prefix (0, 0, 0); 1052 imm = sign_ext (IMM(2), 16); 1053 put_reg (pc, m32c_opcode_pc + 1 + imm); 1054 1055 /** 1100 1100 JMP.A label */ 1056 1057 prefix (0, 0, 0); 1058 imm = IMM(3); 1059 put_reg (pc, imm); 1060 1061 /** 1100 sss1 ss00 1111 JMPI.W src */ 1062 1063 prefix (0, 0, 0); 1064 sc = decode_src23 (sss, ss, 2); 1065 a = get_src (sc); 1066 a = sign_ext (a, 16); 1067 put_reg (pc, m32c_opcode_pc + a); 1068 1069 /** 1000 sss0 ss00 0001 JMPI.A src */ 1070 1071 prefix (0, 0, 0); 1072 sc = decode_src23 (sss, ss, 3); 1073 a = get_src (sc); 1074 put_reg (pc, a); 1075 1076 /** 1101 1100 JMPS #IMM8 */ 1077 1078 prefix (0, 0, 0); 1079 imm = IMM(1); 1080 a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2); 1081 put_reg (pc, a); 1082 1083 /** 1100 1111 JSR.W label */ 1084 1085 prefix (0, 0, 0); 1086 imm = sign_ext (IMM(2), 16); 1087 put_reg (sp, get_reg (sp) - 4); 1088 mem_put_si (get_reg (sp), get_reg (pc)); 1089 put_reg (pc, m32c_opcode_pc + imm + 1); 1090 1091 /** 1100 1101 JSR.A label */ 1092 1093 prefix (0, 0, 0); 1094 imm = IMM(3); 1095 put_reg (sp, get_reg (sp) - 4); 1096 mem_put_si (get_reg (sp), get_reg (pc)); 1097 put_reg (pc, imm); 1098 1099 /** 1100 sss1 ss01 1111 JSRI.W src */ 1100 1101 prefix (0, 0, 0); 1102 sc = decode_src23 (sss, ss, 2); 1103 a = get_src (sc); 1104 a = sign_ext (a, 16); 1105 put_reg (sp, get_reg (sp) - 4); 1106 mem_put_si (get_reg (sp), get_reg (pc)); 1107 put_reg (pc, m32c_opcode_pc + a); 1108 1109 /** 1001 sss0 ss00 0001 JSRI.A src */ 1110 1111 prefix (0, 0, 0); 1112 sc = decode_src23 (sss, ss, 3); 1113 a = get_src (sc); 1114 put_reg (sp, get_reg (sp) - 4); 1115 mem_put_si (get_reg (sp), get_reg (pc)); 1116 put_reg (pc, a); 1117 1118 /** 1101 1101 JSRS #IMM8 */ 1119 1120 prefix (0, 0, 0); 1121 imm = IMM(1); 1122 a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2); 1123 put_reg (sp, get_reg (sp) - 4); 1124 mem_put_si (get_reg (sp), get_reg (pc)); 1125 put_reg (pc, a); 1126 1127 /** 1101 0101 1010 1dst LDC #IMM16,dest */ 1128 1129 imm = IMM(2); 1130 dc = decode_cr_b (dst, CR_B_DCT0); 1131 put_dest (dc, imm); 1132 1133 /** 1101 0101 0010 1dst LDC #IMM24,dest */ 1134 1135 imm = IMM(3); 1136 dc = decode_cr_b (dst, CR_B_INTB); 1137 put_dest (dc, imm); 1138 1139 /** 1101 0101 0110 1dst LDC #IMM24,dest */ 1140 1141 imm = IMM(3); 1142 dc = decode_cr_b (dst, CR_B_DMA0); 1143 put_dest (dc, imm); 1144 1145 /** 0000 0001 1101 sss1 ss00 1dst LDC src,dest */ 1146 1147 prefix (0, 0, 0); 1148 sc = decode_src23 (sss, ss, 2); 1149 dc = decode_cr_b (dst, CR_B_DCT0); 1150 a = get_src (sc); 1151 put_dest (dc, a); 1152 1153 /** 1101 sss1 ss00 0dst LDC src,dest */ 1154 1155 prefix (0, 0, 0); 1156 sc = decode_src23 (sss, ss, 3); 1157 dc = decode_cr_b (dst, CR_B_INTB); 1158 a = get_src (sc); 1159 put_dest (dc, a); 1160 1161 /** 0000 0001 1101 sss1 ss00 0dst LDC src,dest */ 1162 1163 prefix (0, 0, 0); 1164 sc = decode_src23 (sss, ss, 3); 1165 dc = decode_cr_b (dst, CR_B_DMA0); 1166 a = get_src (sc); 1167 put_dest (dc, a); 1168 1169 /** 1011 0110 1100 0011 LDCTX */ 1170 1171 NOTYET(); 1172 1173 /** 1101 0101 1110 1imm LDIPL #IMM */ 1174 1175 set_flags (0x7000, imm*0x1000); 1176 1177 /** 0000 0001 1000 ddd w dd11 1111 MAX.size #IMM,dest */ 1178 1179 prefix (0, 0, 0); 1180 w++; 1181 dc = decode_dest23 (ddd, dd, w); 1182 imm = sign_ext (IMM(w), w*8); 1183 a = sign_ext (get_src (dc), w*8); 1184 tprintf ("max %d %d\n", imm, a); 1185 if (imm > a) 1186 put_dest (dc, imm); 1187 1188 /** 0000 0001 1sss ddd w dd ss 1101 MAX.size src,dest */ 1189 1190 prefix (0, 0, 0); 1191 w++; 1192 sc = decode_src23 (sss, ss, w); 1193 dc = decode_dest23 (ddd, dd, w); 1194 b = sign_ext (get_src (sc), w*8); 1195 a = sign_ext (get_src (dc), w*8); 1196 tprintf ("max %d %d\n", b, a); 1197 if (b > a) 1198 put_dest (dc, b); 1199 1200 /** 0000 0001 1000 ddd w dd10 1111 MIN.size #IMM,dest */ 1201 1202 prefix (0, 0, 0); 1203 w++; 1204 dc = decode_dest23 (ddd, dd, w); 1205 imm = sign_ext (IMM(w), w*8); 1206 a = sign_ext (get_src (dc), w*8); 1207 tprintf ("min %d %d\n", imm, a); 1208 if (imm < a) 1209 put_dest (dc, imm); 1210 1211 /** 0000 0001 1sss ddd w dd ss 1100 MIN.size src,dest */ 1212 1213 prefix (0, 0, 0); 1214 w++; 1215 sc = decode_src23 (sss, ss, w); 1216 dc = decode_dest23 (ddd, dd, w); 1217 b = sign_ext (get_src (sc), w*8); 1218 a = sign_ext (get_src (dc), w*8); 1219 tprintf ("min %d %d\n", b, a); 1220 if (b < a) 1221 put_dest (dc, b); 1222 1223 /** 1001 ddd w dd10 1111 MOV.size:G #IMM,dest */ 1224 1225 dc = decode_dest23 (ddd, dd, w+1); 1226 imm = IMM(w+1); 1227 v = imm; 1228 tprintf("%x = %x\n", v, v); 1229 set_sz(v, w+1); 1230 put_dest (dc, v); 1231 1232 /** 1011 ddd0 dd11 0001 MOV.L:G #IMM,dest */ 1233 1234 dc = decode_dest23 (ddd, dd, 4); 1235 imm = IMM(4); 1236 v = imm; 1237 tprintf("%x = %x\n", v, v); 1238 set_sz(v, 4); 1239 put_dest (dc, v); 1240 1241 /** 1111 ddd w dd10 immm MOV.size:Q #IMM4,dest */ 1242 1243 dc = decode_dest23 (ddd, dd, w+1); 1244 imm = sign_ext (immm, 4); 1245 v = imm; 1246 tprintf("%x = %d\n", v, v); 1247 set_sz(v, w+1); 1248 put_dest (dc, v); 1249 1250 /** 00dd 010w MOV.size:S #IMM,dest */ 1251 1252 prefix (0, 1, 0); 1253 dc = decode_dest2 (dd, w+1); 1254 imm = IMM(w+1); 1255 put_dest (dc, imm); 1256 set_sz (imm, w+1); 1257 1258 /** 10w1 110d MOV.size:S #IMM,a0/a1 */ 1259 1260 imm = IMM(w ? 3 : 2); 1261 put_reg (d ? a1 : a0, imm); 1262 set_sz (imm & addr_mask, w+1); 1263 1264 /** 00dd 001w MOV.size:Z #0,dest */ 1265 1266 prefix (0, 1, 0); 1267 dc = decode_dest2 (dd, w+1); 1268 put_dest (dc, 0); 1269 set_sz (0, w+1); 1270 1271 /** 1sss ddd w dd ss 1011 MOV.size:G src,dest */ 1272 1273 prefix (1, 1, 0); 1274 sc = decode_src23 (sss, ss, w+1); 1275 dc = decode_dest23 (ddd, dd, w+1); 1276 v = get_src (sc); 1277 put_dest (dc, v); 1278 set_sz (v, w+1); 1279 1280 /** 1sss ddd1 dd ss 0011 MOV.L:G src,dest */ 1281 1282 prefix (1, 1, 0); 1283 sc = decode_src23 (sss, ss, 4); 1284 dc = decode_dest23 (ddd, dd, 4); 1285 v = get_src (sc); 1286 put_dest (dc, v); 1287 set_sz (v, 4); 1288 1289 /** VARY SS 01 10 11 */ 1290 /** 00SS 100w MOV.size:S src,R0L/R0 */ 1291 1292 prefix (0, 1, 0); 1293 sc = decode_dest2 (SS, w+1); 1294 v = get_src (sc); 1295 put_reg (w ? r0 : r0l, v); 1296 set_sz (v, w+1); 1297 1298 /** 01ss 111w MOV.size:S src,R1L/R1 */ 1299 1300 prefix (0, 1, 0); 1301 sc = decode_dest2 (ss, w+1); 1302 v = get_src (sc); 1303 put_reg (w ? r1 : r1l, v); 1304 set_sz (v, w+1); 1305 1306 /** VARY DD 01 10 11 */ 1307 /** 00DD 000w MOV.size:S R0L/R0,dest */ 1308 1309 prefix (0, 1, 0); 1310 dc = decode_dest2 (DD, w+1); 1311 v = get_reg (w ? r0 : r0l); 1312 put_dest (dc, v); 1313 set_sz (v, w+1); 1314 1315 /** 01ss 100d MOV.L:S src,A0/A1 */ 1316 1317 prefix (0, 1, 0); 1318 sc = decode_dest2 (ss, 4); 1319 v = get_src (sc); 1320 put_reg (d ? a1 : a0, v); 1321 set_sz (v, 4); 1322 1323 /** 1011 ddd w dd00 1111 MOV.size:G dsp:8[SP], dest */ 1324 1325 prefix (0, 0, 0); 1326 imm = IMM(1); 1327 dc = decode_dest23 (ddd, dd, w+1); 1328 a = get_reg (sp) + sign_ext (imm, 8); 1329 a &= addr_mask; 1330 if (w) 1331 v = mem_get_hi (a); 1332 else 1333 v = mem_get_qi (a); 1334 put_dest (dc, v); 1335 set_sz (v, w+1); 1336 1337 /** 1010 sss w ss00 1111 MOV.size:G src,dsp:8[SP] */ 1338 1339 prefix (0, 0, 0); 1340 sc = decode_dest23 (sss, ss, w+1); 1341 imm = IMM(1); 1342 a = get_reg (sp) + sign_ext (imm, 8); 1343 a &= addr_mask; 1344 v = get_src (sc); 1345 if (w) 1346 mem_put_hi (a, v); 1347 else 1348 mem_put_qi (a, v); 1349 set_sz (v, w+1); 1350 1351 /** 1101 sss1 ss01 1dst MOVA src,dest */ 1352 1353 static reg_id map[8] = { r2r0, r3r1, a0, a1 }; 1354 prefix (0, 0, 0); 1355 sc = decode_src23 (sss, ss, 1); 1356 if (!sc.mem || !map[dst]) 1357 UNSUPPORTED(); 1358 put_reg (map[dst], sc.u.addr); 1359 1360 /** 0000 0001 1011 ddd0 dd hl 1110 MOVdir R0L,dest */ 1361 1362 prefix (0, 0, 0); 1363 dc = decode_dest23 (ddd, dd, 1); 1364 a = get_src (dc); 1365 b = get_reg (r0l); 1366 switch (hl) 1367 { 1368 case 0: a = (a & 0xf0) | (b & 0x0f); break; 1369 case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break; 1370 case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break; 1371 case 3: a = (a & 0x0f) | (b & 0xf0); break; 1372 } 1373 put_dest (dc, a); 1374 1375 /** 0000 0001 1010 sss0 ss hl 1110 MOVdir src,R0L */ 1376 1377 prefix (0, 0, 0); 1378 sc = decode_dest23 (sss, ss, 1); 1379 a = get_reg (r0l); 1380 b = get_src (dc); 1381 switch (hl) 1382 { 1383 case 0: a = (a & 0xf0) | (b & 0x0f); break; 1384 case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break; 1385 case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break; 1386 case 3: a = (a & 0x0f) | (b & 0xf0); break; 1387 } 1388 put_reg (r0l, a); 1389 1390 /** 1011 ddd0 dd01 0001 MOVX #IMM,dest */ 1391 1392 prefix (0, 1, 0); 1393 dc = decode_dest23 (ddd, dd, 4); 1394 imm = sign_ext (IMM(1), 8); 1395 put_dest (dc, imm); 1396 set_sz (imm, 1); 1397 1398 /** 1000 ddd w dd01 1111 MUL.size #IMM,dest */ 1399 1400 prefix (0, 1, 0); 1401 w ++; 1402 dc = decode_dest23 (ddd, dd, w); 1403 v = sign_ext (get_src (dc), w*8); 1404 imm = sign_ext (IMM(w), w*8); 1405 tprintf("%d * %d = %d\n", v, imm, v*imm); 1406 v *= imm; 1407 dc = widen_sd (dc); 1408 put_dest (dc, v); 1409 1410 /** 1sss ddd w dd ss 1100 MUL.size src,dest */ 1411 1412 prefix (1, 1, 0); 1413 w ++; 1414 sc = decode_src23 (sss, ss, w); 1415 dc = decode_dest23 (ddd, dd, w); 1416 a = sign_ext (get_src (sc), w*8); 1417 b = sign_ext (get_src (dc), w*8); 1418 tprintf("%d * %d = %d\n", a, b, a*b); 1419 v = a * b; 1420 dc = widen_sd (dc); 1421 put_dest (dc, v); 1422 1423 /** 0000 0001 1000 sss1 ss01 1111 MUL.L src,R2R0 */ 1424 1425 M32C_ONLY(); 1426 prefix (0, 0, 0); 1427 sc = decode_src23 (sss, ss, 4); 1428 a = sign_ext (get_src (sc), 32); 1429 b = sign_ext (get_reg (r2r0), 32); 1430 ll = (long long)a * (long long)b; 1431 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1432 if (ll < b2minsigned[4] || ll > b2maxsigned[4]) 1433 set_flags (FLAGBIT_O, FLAGBIT_O); 1434 else 1435 set_flags (FLAGBIT_O, 0); 1436 put_reg (r2r0, (int)ll); 1437 1438 /** 1100 sss1 ss11 1110 MULEX src */ 1439 1440 prefix (0, 1, 0); 1441 sc = decode_dest23 (sss, ss, 2); 1442 a = sign_ext (get_src (sc), 16); 1443 b = sign_ext (get_reg (r2r0), 32); 1444 ll = (long long)a * (long long)b; 1445 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1446 put_reg (r2r0, (int)ll); 1447 put_reg (r1, (int)(ll >> 32)); 1448 1449 /** 1000 ddd w dd00 1111 MULU.size #IMM,dest */ 1450 1451 prefix (0, 1, 0); 1452 w ++; 1453 dc = decode_dest23 (ddd, dd, w); 1454 v = get_src (dc); 1455 imm = IMM(w); 1456 tprintf("%d * %d = %d\n", v, imm, v*imm); 1457 v *= imm; 1458 dc = widen_sd (dc); 1459 put_dest (dc, v); 1460 1461 /** 1sss ddd w dd ss 0100 MULU.size src,dest */ 1462 1463 prefix (1, 1, 0); 1464 w ++; 1465 sc = decode_src23 (sss, ss, w); 1466 dc = decode_dest23 (ddd, dd, w); 1467 a = get_src (sc); 1468 b = get_src (dc); 1469 tprintf("%d * %d = %d\n", a, b, a*b); 1470 v = a * b; 1471 dc = widen_sd (dc); 1472 put_dest (dc, v); 1473 1474 /** 0000 0001 1000 sss1 ss00 1111 MULU.L src,R2R0 */ 1475 1476 M32C_ONLY(); 1477 prefix (0, 0, 0); 1478 sc = decode_src23 (sss, ss, 4); 1479 a = get_src (sc); 1480 b = get_reg (r2r0); 1481 ll = (long long)a * (long long)b; 1482 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1483 if (ll < b2minsigned[4] || ll > b2maxsigned[4]) 1484 set_flags (FLAGBIT_O, FLAGBIT_O); 1485 else 1486 set_flags (FLAGBIT_O, 0); 1487 put_reg (r2r0, (int)ll); 1488 1489 /** 1010 ddd w dd10 1111 NEG.size dest */ 1490 1491 prefix (0, 1, 0); 1492 dc = decode_dest23 (ddd, dd, w+1); 1493 a = sign_ext (get_src (dc), (w+1)*8); 1494 v = -a; 1495 tprintf("%d * -1 = %d\n", a, v); 1496 set_oszc(v, w+1, v==0); 1497 put_dest (dc, v); 1498 1499 /** 1101 1110 NOP */ 1500 1501 tprintf("nop\n"); 1502 1503 /** 1010 ddd w dd01 1110 NOT.size dest */ 1504 1505 prefix (0, 1, 0); 1506 dc = decode_dest23 (ddd, dd, w+1); 1507 a = get_src (dc); 1508 v = ~a; 1509 tprintf("~ %x = %x\n", a, v); 1510 set_sz(v, w+1); 1511 put_dest (dc, v); 1512 1513 /** 1000 ddd w dd10 1111 OR.size:G #IMM,dest */ 1514 1515 prefix (0, 1, 0); 1516 dc = decode_dest23(ddd, dd, w+1); 1517 imm = IMM(w+1); 1518 LOGIC_OP (dc, imm, |); 1519 1520 /** 01dd 010w OR.size:S #IMM,dest */ 1521 1522 prefix (0, 1, 0); 1523 dc = decode_dest2(dd, w+1); 1524 imm = IMM (w+1); 1525 LOGIC_OP (dc, imm, |); 1526 1527 /** 1sss ddd w dd ss 0101 OR.size:G src,dest */ 1528 1529 prefix (1, 1, 0); 1530 sc = decode_src23(sss, ss, w+1); 1531 dc = decode_dest23(ddd, dd, w+1); 1532 b = get_src (sc); 1533 LOGIC_OP (dc, b, |); 1534 1535 /** 1011 ddd w dd10 1111 POP.size dest */ 1536 1537 prefix (0, 1, 0); 1538 dc = decode_dest23 (ddd, dd, w+1); 1539 if (w) 1540 a = mem_get_hi (get_reg (sp)); 1541 else 1542 a = mem_get_qi (get_reg (sp)); 1543 put_reg (sp, get_reg (sp) + 2); 1544 tprintf("pop%s: %x\n", w ? "hi" : "qi", a); 1545 put_dest (dc, a); 1546 1547 /** 1101 0011 1010 1dst POPC dest */ 1548 1549 prefix (0, 0, 0); 1550 dc = decode_cr_b (dst, CR_B_DCT0); 1551 a = mem_get_hi (get_reg (sp)); 1552 put_reg (sp, get_reg (sp) + 2); 1553 tprintf("pophi: %x\n", a); 1554 put_dest (dc, a); 1555 1556 /** 1101 0011 0010 1dst POPC dest */ 1557 1558 prefix (0, 0, 0); 1559 dc = decode_cr_b (dst, CR_B_INTB); 1560 a = mem_get_si (get_reg (sp)); 1561 put_reg (sp, get_reg (sp) + 4); 1562 tprintf("popsi: %x\n", a); 1563 put_dest (dc, a); 1564 1565 /** 1000 1110 POPM dest */ 1566 1567 static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb }; 1568 prefix (0, 0, 0); 1569 imm = IMM(1); 1570 tprintf("popm: %x\n", imm); 1571 for (a=0; a<4; a++) 1572 if (imm & (1<<a)) 1573 { 1574 v = mem_get_hi (get_reg (sp)); 1575 put_reg (map[a], v); 1576 put_reg (sp, get_reg (sp) + 2); 1577 } 1578 for (; a<8; a++) 1579 if (imm & (1<<a)) 1580 { 1581 v = mem_get_si (get_reg (sp)); 1582 put_reg (map[a], v); 1583 put_reg (sp, get_reg (sp) + 4); 1584 } 1585 1586 /** 1010 111w PUSH.size #IMM */ 1587 1588 prefix (0, 0, 0); 1589 imm = IMM(w+1); 1590 tprintf("push%s: %x\n", w ? "hi" : "qi", imm); 1591 int a = get_reg (sp) - 2; 1592 if (w) 1593 mem_put_hi (a, imm); 1594 else 1595 mem_put_qi (a, imm); 1596 put_reg (sp, a); 1597 1598 /** 1100 sss w ss00 1110 PUSH.size src */ 1599 1600 prefix (0, 1, 0); 1601 sc = decode_dest23 (sss, ss, w+1); 1602 a = get_src (sc); 1603 put_reg (sp, get_reg (sp) - 2); 1604 if (w) 1605 mem_put_hi (get_reg (sp), a); 1606 else 1607 mem_put_qi (get_reg (sp), a); 1608 tprintf("push%s: %x\n", w ? "hi" : "qi", a); 1609 1610 /** 1011 0110 0101 0011 PUSH.L #IMM32 */ 1611 1612 imm = IMM(4); 1613 put_reg (sp, get_reg (sp) - 4); 1614 mem_put_si (get_reg (sp), imm); 1615 1616 /** 1010 sss0 ss00 0001 PUSH.L src */ 1617 1618 prefix (0, 1, 0); 1619 sc = decode_dest23 (sss, ss, 4); 1620 a = get_src (sc); 1621 put_reg (sp, get_reg (sp) - 4); 1622 mem_put_si (get_reg (sp), a); 1623 1624 /** 1011 0sa0 ss00 0001 PUSHA src */ 1625 1626 prefix (0, 0, 0); 1627 sc = decode_dest23 (sa, ss, 1); 1628 put_reg (sp, get_reg (sp) - 4); 1629 mem_put_hi (get_reg (sp), sc.u.addr); 1630 tprintf("pushsi: %x\n", sc.u.addr); 1631 1632 /** 1101 0001 1010 1src PUSHC src */ 1633 1634 prefix (0, 0, 0); 1635 sc = decode_cr_b (src, CR_B_DCT0); 1636 a = get_src (sc); 1637 put_reg (sp, get_reg (sp) - 2); 1638 mem_put_hi (get_reg (sp), a); 1639 tprintf("pushhi: %x\n", a); 1640 1641 /** 1101 0001 0010 1src PUSHC src */ 1642 1643 prefix (0, 0, 0); 1644 sc = decode_cr_b (src, CR_B_INTB); 1645 a = get_src (sc); 1646 put_reg (sp, get_reg (sp) - 4); 1647 mem_put_si (get_reg (sp), a); 1648 tprintf("pushsi: %x\n", a); 1649 1650 /** 1000 1111 PUSHM src */ 1651 1652 static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 }; 1653 imm = IMM(1); 1654 tprintf("pushm: %x\n", imm); 1655 for (a=0; a<4; a++) 1656 if (imm & (1<<a)) 1657 { 1658 put_reg (sp, get_reg (sp) - 4); 1659 v = get_reg (map[a]); 1660 mem_put_si (get_reg (sp), v); 1661 } 1662 for (; a<8; a++) 1663 if (imm & (1<<a)) 1664 { 1665 put_reg (sp, get_reg (sp) - 2); 1666 v = get_reg (map[a]); 1667 mem_put_hi (get_reg (sp), v); 1668 } 1669 1670 /** 1001 1110 REIT */ 1671 1672 a = get_reg (sp); 1673 put_reg (pc, mem_get_si (a)); 1674 a += 4; 1675 put_reg (flags, mem_get_hi (a)); 1676 a += 2; 1677 put_reg (sp, a); 1678 1679 /** 1011 1000 010w 0011 RMPA.size */ 1680 1681 int count = get_reg (r3); 1682 int list1 = get_reg (a0); 1683 int list2 = get_reg (a1); 1684 long long sum = get_reg_ll (r3r1r2r0) & 0xffffff; 1685 1686 while (count) 1687 { 1688 if (w) 1689 { 1690 a = sign_ext (mem_get_hi (list1), 16); 1691 b = sign_ext (mem_get_hi (list2), 16); 1692 } 1693 else 1694 { 1695 a = sign_ext (mem_get_qi (list1), 8); 1696 b = sign_ext (mem_get_qi (list2), 8); 1697 } 1698 tprintf("%lld + %d * %d = ", sum, a, b); 1699 sum += a * b; 1700 tprintf("%lld\n", sum); 1701 list1 += w ? 2 : 1; 1702 list2 += w ? 2 : 1; 1703 count --; 1704 } 1705 put_reg (r3, count); 1706 put_reg (a0, list1); 1707 put_reg (a1, list2); 1708 put_reg (r2r0, (int)(sum & 0xffffffffU)); 1709 put_reg (r1, (int)(sum >> 32)); 1710 1711 /** 1011 ddd w dd10 1110 ROLC.size dest */ 1712 1713 prefix (0, 1, 0); 1714 dc = decode_dest23 (ddd, dd, w+1); 1715 rot_op (dc, 1, 1); 1716 1717 /** 1010 ddd w dd10 1110 RORC.size dest */ 1718 1719 prefix (0, 1, 0); 1720 dc = decode_dest23 (ddd, dd, w+1); 1721 rot_op (dc, 1, -1); 1722 1723 /** 1110 ddd w dd10 immm ROT.size #IMM, dest */ 1724 1725 prefix (0, 1, 0); 1726 dc = decode_dest23 (ddd, dd, w+1); 1727 rot_op (dc, IMM4(), -1); 1728 1729 /** 1010 ddd w dd11 1111 ROT.size R1H,dest */ 1730 1731 prefix (0, 1, 0); 1732 dc = decode_dest23 (ddd, dd, w+1); 1733 a = sign_ext (get_reg (r1h), 8); 1734 rot_op (dc, a, -1); 1735 1736 /** 1101 1111 RTS */ 1737 1738 put_reg (pc, mem_get_si (get_reg (sp))); 1739 put_reg (sp, get_reg (sp) + 4); 1740 1741 /** 0000 0001 1001 ddd w dd10 1110 SBB.size #IMM, dest */ 1742 1743 prefix (0, 0, 0); 1744 dc = decode_dest23 (ddd, dd, w+1); 1745 imm = IMM (w+1); 1746 MATH_OP (dc, imm, !carry, -); 1747 1748 /** 0000 0001 1sss ddd w dd ss 0110 SBB.size src,dest */ 1749 1750 prefix (0, 0, 0); 1751 sc = decode_src23 (sss, ss, w+1); 1752 dc = decode_dest23 (ddd, dd, w+1); 1753 MATH_OP (dc, get_src (sc), !carry, -); 1754 1755 /** 1101 ddd1 dd11 cond SCcond dest */ 1756 1757 prefix (0, 1, 0); 1758 dc = decode_dest23 (ddd, dd, 2); 1759 if (condition_true (cond)) 1760 put_dest (dc, 1); 1761 else 1762 put_dest (dc, 0); 1763 1764 /** 1011 1000 110w 0011 SCMPU.size */ 1765 1766 ta0 = get_reg (a0); 1767 ta1 = get_reg (a1); 1768 1769 for (;;) 1770 { 1771 t0 = mem_get_qi (ta0); 1772 t2 = mem_get_qi (ta1); 1773 if (w) 1774 { 1775 t1 = mem_get_qi (ta0 + 1); 1776 t3 = mem_get_qi (ta1 + 1); 1777 } 1778 dif = t0 - t2; 1779 if (dif == 0 && t0 != 0 && w) 1780 dif = t1 - t3; 1781 set_oszc (dif, 1, dif > 0); 1782 1783 ta0 += w ? 2 : 1; 1784 ta1 += w ? 2 : 1; 1785 1786 if (t0 == 0 || t0 != t2) 1787 break; 1788 if (w && (t1 == 0 || t1 != t3)) 1789 break; 1790 } 1791 1792 /** 1111 ddd w dd00 immm SHA.size #IMM,dest */ 1793 1794 prefix (0, 1, 0); 1795 dc = decode_dest23 (ddd, dd, w+1); 1796 shift_op (dc, 1, IMM4(), 1); 1797 1798 /** 1010 ddd0 dd10 0001 SHA.L #IMM,dest */ 1799 1800 prefix (0, 1, 0); 1801 dc = decode_dest23 (ddd, dd, 4); 1802 imm = sign_ext (IMM(1), 8); 1803 shift_op (dc, 1, imm, 1); 1804 1805 /** 1011 ddd w dd11 1110 SHA.size R1H,dest */ 1806 1807 prefix (0, 1, 0); 1808 dc = decode_dest23 (ddd, dd, w+1); 1809 a = sign_ext (get_reg (r1h), 8); 1810 shift_op (dc, 1, a, 1); 1811 1812 /** 1100 ddd0 dd01 0001 SHA.L R1H,dest */ 1813 1814 prefix (0, 1, 0); 1815 dc = decode_dest23 (ddd, dd, 4); 1816 a = sign_ext (get_reg (r1h), 8); 1817 shift_op (dc, 1, a, 1); 1818 1819 /** 1100 ddd0 dd10 0001 SHANC.L #IMM,dest */ 1820 1821 M32C_ONLY(); 1822 prefix (0, 1, 0); 1823 dc = decode_dest23 (ddd, dd, 4); 1824 imm = sign_ext (IMM(1), 8); 1825 shift_op (dc, 1, imm, 0); 1826 1827 /** 1110 ddd w dd00 immm SHL.size #IMM, dest */ 1828 1829 prefix (0, 1, 0); 1830 dc = decode_dest23 (ddd, dd, w+1); 1831 shift_op (dc, 0, IMM4(), 1); 1832 1833 /** 1001 ddd0 dd10 0001 SHL.L #IMM, dest */ 1834 1835 prefix (0, 1, 0); 1836 dc = decode_dest23 (ddd, dd, 4); 1837 imm = sign_ext (IMM(1), 8); 1838 shift_op (dc, 0, imm, 1); 1839 1840 /** 1010 ddd w dd11 1110 SHL.size R1H,dest */ 1841 1842 prefix (0, 1, 0); 1843 dc = decode_dest23 (ddd, dd, w+1); 1844 a = sign_ext (get_reg (r1h), 8); 1845 shift_op (dc, 0, a, 1); 1846 1847 /** 1100 ddd0 dd00 0001 SHL.L R1H,dest */ 1848 1849 prefix (0, 1, 0); 1850 dc = decode_dest23 (ddd, dd, 4); 1851 a = sign_ext (get_reg (r1h), 8); 1852 shift_op (dc, 0, a, 1); 1853 1854 /** 1000 ddd0 dd10 0001 SHLNC.L #IMM,dest */ 1855 1856 M32C_ONLY(); 1857 prefix (0, 1, 0); 1858 dc = decode_dest23 (ddd, dd, 4); 1859 imm = sign_ext (IMM(1), 8); 1860 shift_op (dc, 0, imm, 0); 1861 1862 /** 1011 0010 100w 0011 SIN.size */ 1863 1864 v = get_reg (a0); 1865 a = get_reg (a1); 1866 b = get_reg (r3); 1867 if (b) for (;b;) 1868 { 1869 if (w) 1870 mem_put_hi(a, mem_get_hi (v)); 1871 else 1872 mem_put_qi(a, mem_get_qi (v)); 1873 a += w ? 2 : 1; 1874 b --; 1875 } 1876 put_reg (a0, v); 1877 put_reg (a1, a); 1878 put_reg (r3, b); 1879 1880 /** 1011 0110 100w 0011 SMOVB.size */ 1881 1882 v = get_reg (a0); 1883 a = get_reg (a1); 1884 b = get_reg (r3); 1885 if (b) for (;b;) 1886 { 1887 if (w) 1888 mem_put_hi(a, mem_get_hi (v)); 1889 else 1890 mem_put_qi(a, mem_get_qi (v)); 1891 v -= w ? 2 : 1; 1892 a -= w ? 2 : 1; 1893 b --; 1894 } 1895 put_reg (a0, v); 1896 put_reg (a1, a); 1897 put_reg (r3, b); 1898 1899 /** 1011 0000 100w 0011 SMOVF.size */ 1900 1901 v = get_reg (a0); 1902 a = get_reg (a1); 1903 b = get_reg (r3); 1904 if (b) for (;b;) 1905 { 1906 if (w) 1907 mem_put_hi(a, mem_get_hi (v)); 1908 else 1909 mem_put_qi(a, mem_get_qi (v)); 1910 v += w ? 2 : 1; 1911 a += w ? 2 : 1; 1912 b --; 1913 } 1914 put_reg (a0, v); 1915 put_reg (a1, a); 1916 put_reg (r3, b); 1917 1918 /** 1011 1000 100w 0011 SMOVU.size */ 1919 1920 v = get_reg (a0); 1921 a = get_reg (a1); 1922 do 1923 { 1924 if (w) 1925 mem_put_hi(a, (t0 = mem_get_hi (v))); 1926 else 1927 mem_put_qi(a, (t0 = mem_get_qi (v))); 1928 v += w ? 2 : 1; 1929 a += w ? 2 : 1; 1930 if (t0 == 0 1931 || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0))) 1932 break; 1933 } while (1); 1934 put_reg (a0, v); 1935 put_reg (a1, a); 1936 1937 /** 1011 0100 100w 0011 SOUT.size */ 1938 1939 v = get_reg (a0); 1940 a = get_reg (a1); 1941 b = get_reg (r3); 1942 for (;b;) 1943 { 1944 if (w) 1945 mem_put_hi(a, mem_get_hi (v)); 1946 else 1947 mem_put_qi(a, mem_get_qi (v)); 1948 v += w ? 2 : 1; 1949 b --; 1950 } 1951 put_reg (a0, v); 1952 put_reg (a1, a); 1953 put_reg (r3, b); 1954 1955 /** 1011 1000 000w 0011 SSTR.size */ 1956 1957 a = get_reg (a1); 1958 b = get_reg (r3); 1959 v = get_reg (w ? r0 : r0l); 1960 for (;b;) 1961 { 1962 if (w) 1963 mem_put_hi(a, v); 1964 else 1965 mem_put_qi(a, v); 1966 a += w ? 2 : 1; 1967 b --; 1968 } 1969 put_reg (a1, a); 1970 put_reg (r3, b); 1971 1972 /** 0000 0001 1101 ddd1 dd01 0src STC src,dest */ 1973 1974 prefix (0, 0, 0); 1975 dc = decode_dest23 (ddd, dd, 4); 1976 sc = decode_cr_b (src, CR_B_DMA0); 1977 a = get_src (sc); 1978 put_dest (dc, a); 1979 1980 /** 0000 0001 1101 ddd1 dd01 1src STC src,dest */ 1981 1982 prefix (0, 0, 0); 1983 dc = decode_dest23 (ddd, dd, 2); 1984 sc = decode_cr_b (src, CR_B_DCT0); 1985 a = get_src (sc); 1986 put_dest (dc, a); 1987 1988 /** 1101 ddd1 dd01 0src STC src,dest */ 1989 1990 prefix (0, 0, 0); 1991 dc = decode_dest23 (ddd, dd, 4); 1992 sc = decode_cr_b (src, CR_B_INTB); 1993 a = get_src (sc); 1994 put_dest (dc, a); 1995 1996 /** 1011 0110 1101 0011 STCX abs16,abs24 */ 1997 1998 NOTYET(); 1999 2000 /** 1001 ddd w dd01 1111 STNZ.size #IMM,dest */ 2001 2002 prefix (0, 1, 0); 2003 dc = decode_dest23 (ddd, dd, w+1); 2004 imm = IMM(w+1); 2005 if (! FLAG_Z) 2006 put_dest (dc, imm); 2007 2008 /** 1001 ddd w dd00 1111 STZ.size #IMM,dest */ 2009 2010 prefix (0, 1, 0); 2011 dc = decode_dest23 (ddd, dd, w+1); 2012 imm = IMM(w+1); 2013 if (FLAG_Z) 2014 put_dest (dc, imm); 2015 2016 /** 1001 ddd w dd11 1111 STZX.size #IMM1,#IMM2,dest */ 2017 2018 prefix (0, 1, 0); 2019 dc = decode_dest23 (ddd, dd, w+1); 2020 a = IMM(w+1); 2021 b = IMM(w+1); 2022 if (FLAG_Z) 2023 put_dest (dc, a); 2024 else 2025 put_dest (dc, b); 2026 2027 /** 1000 ddd w dd11 1110 SUB.size:G #IMM,dest */ 2028 2029 prefix (0, 1, 0); 2030 dc = decode_dest23(ddd, dd, w+1); 2031 imm = IMM(w+1); 2032 MATH_OP (dc, imm, 0, -); 2033 2034 /** 1001 ddd0 dd11 0001 SUB.L:G #IMM,dest */ 2035 2036 prefix (0, 1, 0); 2037 dc = decode_dest23(ddd, dd, 4); 2038 imm = IMM(4); 2039 MATH_OP (dc, imm, 0, -); 2040 2041 /** 00dd 111w SUB.size:S #IMM,dest */ 2042 2043 prefix (0, 1, 0); 2044 dc = decode_dest2(dd, w+1); 2045 imm = IMM (w+1); 2046 MATH_OP (dc, imm, 0, -); 2047 2048 /** 1sss ddd w dd ss 1010 SUB.size:G src,dest */ 2049 2050 prefix (1, 1, 0); 2051 sc = decode_src23(sss, ss, w+1); 2052 dc = decode_dest23(ddd, dd, w+1); 2053 b = get_src (sc); 2054 MATH_OP (dc, b, 0, -); 2055 2056 /** 1sss ddd1 dd ss 0000 SUB.L:G src,dest */ 2057 2058 prefix (1, 1, 0); 2059 sc = decode_src23(sss, ss, 4); 2060 dc = decode_dest23(ddd, dd, 4); 2061 b = get_src (sc); 2062 MATH_OP (dc, b, 0, -); 2063 2064 /** 1001 ddd0 dd01 0001 SUBX #IMM,dest */ 2065 2066 prefix (0, 1, 0); 2067 dc = decode_dest23(ddd, dd, 4); 2068 imm = sign_ext (IMM(1), 8); 2069 MATH_OP (dc, imm, 0, -); 2070 2071 /** 1sss ddd0 dd ss 0000 SUBX src,dest */ 2072 2073 prefix (1, 1, 0); 2074 sc = decode_src23(sss, ss, 1); 2075 dc = decode_dest23(ddd, dd, 4); 2076 b = sign_ext (get_src (sc), 8); 2077 MATH_OP (dc, b, 0, -); 2078 2079 /** 1001 ddd w dd11 1110 TST.size:G #IMM,dest */ 2080 2081 prefix (0, 0, 0); 2082 dc = decode_dest23 (ddd, dd, w+1); 2083 imm = IMM(w+1); 2084 a = get_src (dc); 2085 v = a & imm; 2086 set_sz (v, w+1); 2087 2088 /** 00dd 110w TST.size:S #IMM,dest */ 2089 2090 prefix (0, 0, 0); 2091 dc = decode_dest2 (dd, w+1); 2092 imm = IMM(w+1); 2093 a = get_src (dc); 2094 v = a & imm; 2095 set_sz (v, w+1); 2096 2097 /** 0000 0001 1sss ddd w dd ss 1001 TST.size:G src,dest */ 2098 2099 prefix (0, 0, 0); 2100 sc = decode_src23 (sss, ss, w+1); 2101 dc = decode_dest23 (ddd, dd, w+1); 2102 b = get_src (sc); 2103 a = get_src (dc); 2104 v = a & b; 2105 set_sz (v, w+1); 2106 2107 /** 1111 1111 UND */ 2108 2109 trigger_fixed_interrupt (0xffffdc); 2110 2111 /** 1011 0010 0000 0011 WAIT */ 2112 2113 ; 2114 2115 /** 1101 ddd w dd00 1src XCHG.size src,dest */ 2116 2117 dc = decode_dest23 (ddd, dd, w+1); 2118 sc = decode_src3 (src, w+1); 2119 a = get_src (dc); 2120 b = get_src (sc); 2121 put_dest (dc, b); 2122 put_dest (sc, a); 2123 2124 /** 1001 ddd w dd00 1110 XOR.size #IMM,dest */ 2125 2126 prefix (0, 1, 0); 2127 dc = decode_dest23(ddd, dd, w+1); 2128 imm = IMM(w+1); 2129 LOGIC_OP (dc, imm, ^); 2130 2131 /** 1sss ddd w dd ss 1001 XOR.size src,dest */ 2132 2133 prefix (1, 1, 0); 2134 sc = decode_src23(sss, ss, w+1); 2135 dc = decode_dest23(ddd, dd, w+1); 2136 b = get_src (sc); 2137 LOGIC_OP (dc, b, ^); 2138 2139/** */ 2140 2141 return step_result; 2142} 2143