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