1/* m32c.opc --- semantics for m32c opcodes. -*- mode: c -*- 2 3Copyright (C) 2005-2024 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/* This must come before any other includes. */ 22#include "defs.h" 23 24#include <stdio.h> 25#include <stdlib.h> 26 27#include "ansidecl.h" 28#include "cpu.h" 29#include "mem.h" 30#include "misc.h" 31#include "int.h" 32 33#define tprintf if (trace) printf 34 35static unsigned char 36getbyte (void) 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. */ 109static void 110prefix (int src_allowed, int dest_allowed, int 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 (void) 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 101bit BTST:S src */ 732 733 sc = decode_src23 (3, 3, 1); /* bit,base:19 */ 734 bit = get_bit2 (sc, bb*2 + bit); 735 set_zc (!bit, bit); 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 1flg LDIPL #IMM */ 1174 1175 set_flags (0x7000, flg*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 { 1354 static reg_id map[8] = { r2r0, r3r1, a0, a1 }; 1355 prefix (0, 0, 0); 1356 sc = decode_src23 (sss, ss, 1); 1357 if (!sc.mem || !map[dst]) 1358 UNSUPPORTED(); 1359 put_reg (map[dst], sc.u.addr); 1360 } 1361 1362 /** 0000 0001 1011 ddd0 dd hl 1110 MOVdir R0L,dest */ 1363 1364 prefix (0, 0, 0); 1365 dc = decode_dest23 (ddd, dd, 1); 1366 a = get_src (dc); 1367 b = get_reg (r0l); 1368 switch (hl) 1369 { 1370 case 0: a = (a & 0xf0) | (b & 0x0f); break; 1371 case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break; 1372 case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break; 1373 case 3: a = (a & 0x0f) | (b & 0xf0); break; 1374 } 1375 put_dest (dc, a); 1376 1377 /** 0000 0001 1010 sss0 ss hl 1110 MOVdir src,R0L */ 1378 1379 prefix (0, 0, 0); 1380 sc = decode_dest23 (sss, ss, 1); 1381 a = get_reg (r0l); 1382 b = get_src (dc); 1383 switch (hl) 1384 { 1385 case 0: a = (a & 0xf0) | (b & 0x0f); break; 1386 case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break; 1387 case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break; 1388 case 3: a = (a & 0x0f) | (b & 0xf0); break; 1389 } 1390 put_reg (r0l, a); 1391 1392 /** 1011 ddd0 dd01 0001 MOVX #IMM,dest */ 1393 1394 prefix (0, 1, 0); 1395 dc = decode_dest23 (ddd, dd, 4); 1396 imm = sign_ext (IMM(1), 8); 1397 put_dest (dc, imm); 1398 set_sz (imm, 1); 1399 1400 /** 1000 ddd w dd01 1111 MUL.size #IMM,dest */ 1401 1402 prefix (0, 1, 0); 1403 w ++; 1404 dc = decode_dest23 (ddd, dd, w); 1405 v = sign_ext (get_src (dc), w*8); 1406 imm = sign_ext (IMM(w), w*8); 1407 tprintf("%d * %d = %d\n", v, imm, v*imm); 1408 v *= imm; 1409 dc = widen_sd (dc); 1410 put_dest (dc, v); 1411 1412 /** 1sss ddd w dd ss 1100 MUL.size src,dest */ 1413 1414 prefix (1, 1, 0); 1415 w ++; 1416 sc = decode_src23 (sss, ss, w); 1417 dc = decode_dest23 (ddd, dd, w); 1418 a = sign_ext (get_src (sc), w*8); 1419 b = sign_ext (get_src (dc), w*8); 1420 tprintf("%d * %d = %d\n", a, b, a*b); 1421 v = a * b; 1422 dc = widen_sd (dc); 1423 put_dest (dc, v); 1424 1425 /** 0000 0001 1000 sss1 ss01 1111 MUL.L src,R2R0 */ 1426 1427 M32C_ONLY(); 1428 prefix (0, 0, 0); 1429 sc = decode_src23 (sss, ss, 4); 1430 a = sign_ext (get_src (sc), 32); 1431 b = sign_ext (get_reg (r2r0), 32); 1432 ll = (long long)a * (long long)b; 1433 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1434 if (ll < b2minsigned[4] || ll > b2maxsigned[4]) 1435 set_flags (FLAGBIT_O, FLAGBIT_O); 1436 else 1437 set_flags (FLAGBIT_O, 0); 1438 put_reg (r2r0, (int)ll); 1439 1440 /** 1100 sss1 ss11 1110 MULEX src */ 1441 1442 prefix (0, 1, 0); 1443 sc = decode_dest23 (sss, ss, 2); 1444 a = sign_ext (get_src (sc), 16); 1445 b = sign_ext (get_reg (r2r0), 32); 1446 ll = (long long)a * (long long)b; 1447 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1448 put_reg (r2r0, (int)ll); 1449 put_reg (r1, (int)(ll >> 32)); 1450 1451 /** 1000 ddd w dd00 1111 MULU.size #IMM,dest */ 1452 1453 prefix (0, 1, 0); 1454 w ++; 1455 dc = decode_dest23 (ddd, dd, w); 1456 v = get_src (dc); 1457 imm = IMM(w); 1458 tprintf("%d * %d = %d\n", v, imm, v*imm); 1459 v *= imm; 1460 dc = widen_sd (dc); 1461 put_dest (dc, v); 1462 1463 /** 1sss ddd w dd ss 0100 MULU.size src,dest */ 1464 1465 prefix (1, 1, 0); 1466 w ++; 1467 sc = decode_src23 (sss, ss, w); 1468 dc = decode_dest23 (ddd, dd, w); 1469 a = get_src (sc); 1470 b = get_src (dc); 1471 tprintf("%d * %d = %d\n", a, b, a*b); 1472 v = a * b; 1473 dc = widen_sd (dc); 1474 put_dest (dc, v); 1475 1476 /** 0000 0001 1000 sss1 ss00 1111 MULU.L src,R2R0 */ 1477 1478 M32C_ONLY(); 1479 prefix (0, 0, 0); 1480 sc = decode_src23 (sss, ss, 4); 1481 a = get_src (sc); 1482 b = get_reg (r2r0); 1483 ll = (long long)a * (long long)b; 1484 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll); 1485 if (ll < b2minsigned[4] || ll > b2maxsigned[4]) 1486 set_flags (FLAGBIT_O, FLAGBIT_O); 1487 else 1488 set_flags (FLAGBIT_O, 0); 1489 put_reg (r2r0, (int)ll); 1490 1491 /** 1010 ddd w dd10 1111 NEG.size dest */ 1492 1493 prefix (0, 1, 0); 1494 dc = decode_dest23 (ddd, dd, w+1); 1495 a = sign_ext (get_src (dc), (w+1)*8); 1496 v = -a; 1497 tprintf("%d * -1 = %d\n", a, v); 1498 set_oszc(v, w+1, v==0); 1499 put_dest (dc, v); 1500 1501 /** 1101 1110 NOP */ 1502 1503 tprintf("nop\n"); 1504 1505 /** 1010 ddd w dd01 1110 NOT.size dest */ 1506 1507 prefix (0, 1, 0); 1508 dc = decode_dest23 (ddd, dd, w+1); 1509 a = get_src (dc); 1510 v = ~a; 1511 tprintf("~ %x = %x\n", a, v); 1512 set_sz(v, w+1); 1513 put_dest (dc, v); 1514 1515 /** 1000 ddd w dd10 1111 OR.size:G #IMM,dest */ 1516 1517 prefix (0, 1, 0); 1518 dc = decode_dest23(ddd, dd, w+1); 1519 imm = IMM(w+1); 1520 LOGIC_OP (dc, imm, |); 1521 1522 /** 01dd 010w OR.size:S #IMM,dest */ 1523 1524 prefix (0, 1, 0); 1525 dc = decode_dest2(dd, w+1); 1526 imm = IMM (w+1); 1527 LOGIC_OP (dc, imm, |); 1528 1529 /** 1sss ddd w dd ss 0101 OR.size:G src,dest */ 1530 1531 prefix (1, 1, 0); 1532 sc = decode_src23(sss, ss, w+1); 1533 dc = decode_dest23(ddd, dd, w+1); 1534 b = get_src (sc); 1535 LOGIC_OP (dc, b, |); 1536 1537 /** 1011 ddd w dd10 1111 POP.size dest */ 1538 1539 prefix (0, 1, 0); 1540 dc = decode_dest23 (ddd, dd, w+1); 1541 if (w) 1542 a = mem_get_hi (get_reg (sp)); 1543 else 1544 a = mem_get_qi (get_reg (sp)); 1545 put_reg (sp, get_reg (sp) + 2); 1546 tprintf("pop%s: %x\n", w ? "hi" : "qi", a); 1547 put_dest (dc, a); 1548 1549 /** 1101 0011 1010 1dst POPC dest */ 1550 1551 prefix (0, 0, 0); 1552 dc = decode_cr_b (dst, CR_B_DCT0); 1553 a = mem_get_hi (get_reg (sp)); 1554 put_reg (sp, get_reg (sp) + 2); 1555 tprintf("pophi: %x\n", a); 1556 put_dest (dc, a); 1557 1558 /** 1101 0011 0010 1dst POPC dest */ 1559 1560 prefix (0, 0, 0); 1561 dc = decode_cr_b (dst, CR_B_INTB); 1562 a = mem_get_si (get_reg (sp)); 1563 put_reg (sp, get_reg (sp) + 4); 1564 tprintf("popsi: %x\n", a); 1565 put_dest (dc, a); 1566 1567 /** 1000 1110 POPM dest */ 1568 1569 { 1570 static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb }; 1571 prefix (0, 0, 0); 1572 imm = IMM(1); 1573 tprintf("popm: %x\n", imm); 1574 for (a=0; a<4; a++) 1575 if (imm & (1<<a)) 1576 { 1577 v = mem_get_hi (get_reg (sp)); 1578 put_reg (map[a], v); 1579 put_reg (sp, get_reg (sp) + 2); 1580 } 1581 for (; a<8; a++) 1582 if (imm & (1<<a)) 1583 { 1584 v = mem_get_si (get_reg (sp)); 1585 put_reg (map[a], v); 1586 put_reg (sp, get_reg (sp) + 4); 1587 } 1588 } 1589 1590 /** 1010 111w PUSH.size #IMM */ 1591 1592 prefix (0, 0, 0); 1593 imm = IMM(w+1); 1594 tprintf("push%s: %x\n", w ? "hi" : "qi", imm); 1595 a = get_reg (sp) - 2; 1596 if (w) 1597 mem_put_hi (a, imm); 1598 else 1599 mem_put_qi (a, imm); 1600 put_reg (sp, a); 1601 1602 /** 1100 sss w ss00 1110 PUSH.size src */ 1603 1604 prefix (0, 1, 0); 1605 sc = decode_dest23 (sss, ss, w+1); 1606 a = get_src (sc); 1607 put_reg (sp, get_reg (sp) - 2); 1608 if (w) 1609 mem_put_hi (get_reg (sp), a); 1610 else 1611 mem_put_qi (get_reg (sp), a); 1612 tprintf("push%s: %x\n", w ? "hi" : "qi", a); 1613 1614 /** 1011 0110 0101 0011 PUSH.L #IMM32 */ 1615 1616 imm = IMM(4); 1617 put_reg (sp, get_reg (sp) - 4); 1618 mem_put_si (get_reg (sp), imm); 1619 1620 /** 1010 sss0 ss00 0001 PUSH.L src */ 1621 1622 prefix (0, 1, 0); 1623 sc = decode_dest23 (sss, ss, 4); 1624 a = get_src (sc); 1625 put_reg (sp, get_reg (sp) - 4); 1626 mem_put_si (get_reg (sp), a); 1627 1628 /** 1011 0sa0 ss00 0001 PUSHA src */ 1629 1630 prefix (0, 0, 0); 1631 sc = decode_dest23 (sa, ss, 1); 1632 put_reg (sp, get_reg (sp) - 4); 1633 mem_put_hi (get_reg (sp), sc.u.addr); 1634 tprintf("pushsi: %x\n", sc.u.addr); 1635 1636 /** 1101 0001 1010 1src PUSHC src */ 1637 1638 prefix (0, 0, 0); 1639 sc = decode_cr_b (src, CR_B_DCT0); 1640 a = get_src (sc); 1641 put_reg (sp, get_reg (sp) - 2); 1642 mem_put_hi (get_reg (sp), a); 1643 tprintf("pushhi: %x\n", a); 1644 1645 /** 1101 0001 0010 1src PUSHC src */ 1646 1647 prefix (0, 0, 0); 1648 sc = decode_cr_b (src, CR_B_INTB); 1649 a = get_src (sc); 1650 put_reg (sp, get_reg (sp) - 4); 1651 mem_put_si (get_reg (sp), a); 1652 tprintf("pushsi: %x\n", a); 1653 1654 /** 1000 1111 PUSHM src */ 1655 1656 { 1657 static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 }; 1658 imm = IMM(1); 1659 tprintf("pushm: %x\n", imm); 1660 for (a=0; a<4; a++) 1661 if (imm & (1<<a)) 1662 { 1663 put_reg (sp, get_reg (sp) - 4); 1664 v = get_reg (map[a]); 1665 mem_put_si (get_reg (sp), v); 1666 } 1667 for (; a<8; a++) 1668 if (imm & (1<<a)) 1669 { 1670 put_reg (sp, get_reg (sp) - 2); 1671 v = get_reg (map[a]); 1672 mem_put_hi (get_reg (sp), v); 1673 } 1674 } 1675 1676 /** 1001 1110 REIT */ 1677 1678 a = get_reg (sp); 1679 put_reg (pc, mem_get_si (a)); 1680 a += 4; 1681 put_reg (flags, mem_get_hi (a)); 1682 a += 2; 1683 put_reg (sp, a); 1684 1685 /** 1011 1000 010w 0011 RMPA.size */ 1686 1687 { 1688 int count = get_reg (r3); 1689 int list1 = get_reg (a0); 1690 int list2 = get_reg (a1); 1691 long long sum = get_reg_ll (r3r1r2r0) & 0xffffff; 1692 1693 while (count) 1694 { 1695 if (w) 1696 { 1697 a = sign_ext (mem_get_hi (list1), 16); 1698 b = sign_ext (mem_get_hi (list2), 16); 1699 } 1700 else 1701 { 1702 a = sign_ext (mem_get_qi (list1), 8); 1703 b = sign_ext (mem_get_qi (list2), 8); 1704 } 1705 tprintf("%lld + %d * %d = ", sum, a, b); 1706 sum += a * b; 1707 tprintf("%lld\n", sum); 1708 list1 += w ? 2 : 1; 1709 list2 += w ? 2 : 1; 1710 count --; 1711 } 1712 put_reg (r3, count); 1713 put_reg (a0, list1); 1714 put_reg (a1, list2); 1715 put_reg (r2r0, (int)(sum & 0xffffffffU)); 1716 put_reg (r1, (int)(sum >> 32)); 1717 } 1718 1719 /** 1011 ddd w dd10 1110 ROLC.size dest */ 1720 1721 prefix (0, 1, 0); 1722 dc = decode_dest23 (ddd, dd, w+1); 1723 rot_op (dc, 1, 1); 1724 1725 /** 1010 ddd w dd10 1110 RORC.size dest */ 1726 1727 prefix (0, 1, 0); 1728 dc = decode_dest23 (ddd, dd, w+1); 1729 rot_op (dc, 1, -1); 1730 1731 /** 1110 ddd w dd10 immm ROT.size #IMM, dest */ 1732 1733 prefix (0, 1, 0); 1734 dc = decode_dest23 (ddd, dd, w+1); 1735 rot_op (dc, IMM4(), -1); 1736 1737 /** 1010 ddd w dd11 1111 ROT.size R1H,dest */ 1738 1739 prefix (0, 1, 0); 1740 dc = decode_dest23 (ddd, dd, w+1); 1741 a = sign_ext (get_reg (r1h), 8); 1742 rot_op (dc, a, -1); 1743 1744 /** 1101 1111 RTS */ 1745 1746 put_reg (pc, mem_get_si (get_reg (sp))); 1747 put_reg (sp, get_reg (sp) + 4); 1748 1749 /** 0000 0001 1001 ddd w dd10 1110 SBB.size #IMM, dest */ 1750 1751 prefix (0, 0, 0); 1752 dc = decode_dest23 (ddd, dd, w+1); 1753 imm = IMM (w+1); 1754 MATH_OP (dc, imm, !carry, -); 1755 1756 /** 0000 0001 1sss ddd w dd ss 0110 SBB.size src,dest */ 1757 1758 prefix (0, 0, 0); 1759 sc = decode_src23 (sss, ss, w+1); 1760 dc = decode_dest23 (ddd, dd, w+1); 1761 MATH_OP (dc, get_src (sc), !carry, -); 1762 1763 /** 1101 ddd1 dd11 cond SCcond dest */ 1764 1765 prefix (0, 1, 0); 1766 dc = decode_dest23 (ddd, dd, 2); 1767 if (condition_true (cond)) 1768 put_dest (dc, 1); 1769 else 1770 put_dest (dc, 0); 1771 1772 /** 1011 1000 110w 0011 SCMPU.size */ 1773 1774 ta0 = get_reg (a0); 1775 ta1 = get_reg (a1); 1776 1777 for (;;) 1778 { 1779 t0 = mem_get_qi (ta0); 1780 t2 = mem_get_qi (ta1); 1781 if (w) 1782 { 1783 t1 = mem_get_qi (ta0 + 1); 1784 t3 = mem_get_qi (ta1 + 1); 1785 } 1786 dif = t0 - t2; 1787 if (dif == 0 && t0 != 0 && w) 1788 dif = t1 - t3; 1789 set_oszc (dif, 1, dif > 0); 1790 1791 ta0 += w ? 2 : 1; 1792 ta1 += w ? 2 : 1; 1793 1794 if (t0 == 0 || t0 != t2) 1795 break; 1796 if (w && (t1 == 0 || t1 != t3)) 1797 break; 1798 } 1799 1800 /** 1111 ddd w dd00 immm SHA.size #IMM,dest */ 1801 1802 prefix (0, 1, 0); 1803 dc = decode_dest23 (ddd, dd, w+1); 1804 shift_op (dc, 1, IMM4(), 1); 1805 1806 /** 1010 ddd0 dd10 0001 SHA.L #IMM,dest */ 1807 1808 prefix (0, 1, 0); 1809 dc = decode_dest23 (ddd, dd, 4); 1810 imm = sign_ext (IMM(1), 8); 1811 shift_op (dc, 1, imm, 1); 1812 1813 /** 1011 ddd w dd11 1110 SHA.size R1H,dest */ 1814 1815 prefix (0, 1, 0); 1816 dc = decode_dest23 (ddd, dd, w+1); 1817 a = sign_ext (get_reg (r1h), 8); 1818 shift_op (dc, 1, a, 1); 1819 1820 /** 1100 ddd0 dd01 0001 SHA.L R1H,dest */ 1821 1822 prefix (0, 1, 0); 1823 dc = decode_dest23 (ddd, dd, 4); 1824 a = sign_ext (get_reg (r1h), 8); 1825 shift_op (dc, 1, a, 1); 1826 1827 /** 1100 ddd0 dd10 0001 SHANC.L #IMM,dest */ 1828 1829 M32C_ONLY(); 1830 prefix (0, 1, 0); 1831 dc = decode_dest23 (ddd, dd, 4); 1832 imm = sign_ext (IMM(1), 8); 1833 shift_op (dc, 1, imm, 0); 1834 1835 /** 1110 ddd w dd00 immm SHL.size #IMM, dest */ 1836 1837 prefix (0, 1, 0); 1838 dc = decode_dest23 (ddd, dd, w+1); 1839 shift_op (dc, 0, IMM4(), 1); 1840 1841 /** 1001 ddd0 dd10 0001 SHL.L #IMM, dest */ 1842 1843 prefix (0, 1, 0); 1844 dc = decode_dest23 (ddd, dd, 4); 1845 imm = sign_ext (IMM(1), 8); 1846 shift_op (dc, 0, imm, 1); 1847 1848 /** 1010 ddd w dd11 1110 SHL.size R1H,dest */ 1849 1850 prefix (0, 1, 0); 1851 dc = decode_dest23 (ddd, dd, w+1); 1852 a = sign_ext (get_reg (r1h), 8); 1853 shift_op (dc, 0, a, 1); 1854 1855 /** 1100 ddd0 dd00 0001 SHL.L R1H,dest */ 1856 1857 prefix (0, 1, 0); 1858 dc = decode_dest23 (ddd, dd, 4); 1859 a = sign_ext (get_reg (r1h), 8); 1860 shift_op (dc, 0, a, 1); 1861 1862 /** 1000 ddd0 dd10 0001 SHLNC.L #IMM,dest */ 1863 1864 M32C_ONLY(); 1865 prefix (0, 1, 0); 1866 dc = decode_dest23 (ddd, dd, 4); 1867 imm = sign_ext (IMM(1), 8); 1868 shift_op (dc, 0, imm, 0); 1869 1870 /** 1011 0010 100w 0011 SIN.size */ 1871 1872 v = get_reg (a0); 1873 a = get_reg (a1); 1874 b = get_reg (r3); 1875 if (b) for (;b;) 1876 { 1877 if (w) 1878 mem_put_hi(a, mem_get_hi (v)); 1879 else 1880 mem_put_qi(a, mem_get_qi (v)); 1881 a += w ? 2 : 1; 1882 b --; 1883 } 1884 put_reg (a0, v); 1885 put_reg (a1, a); 1886 put_reg (r3, b); 1887 1888 /** 1011 0110 100w 0011 SMOVB.size */ 1889 1890 v = get_reg (a0); 1891 a = get_reg (a1); 1892 b = get_reg (r3); 1893 if (b) for (;b;) 1894 { 1895 if (w) 1896 mem_put_hi(a, mem_get_hi (v)); 1897 else 1898 mem_put_qi(a, mem_get_qi (v)); 1899 v -= w ? 2 : 1; 1900 a -= w ? 2 : 1; 1901 b --; 1902 } 1903 put_reg (a0, v); 1904 put_reg (a1, a); 1905 put_reg (r3, b); 1906 1907 /** 1011 0000 100w 0011 SMOVF.size */ 1908 1909 v = get_reg (a0); 1910 a = get_reg (a1); 1911 b = get_reg (r3); 1912 if (b) for (;b;) 1913 { 1914 if (w) 1915 mem_put_hi(a, mem_get_hi (v)); 1916 else 1917 mem_put_qi(a, mem_get_qi (v)); 1918 v += w ? 2 : 1; 1919 a += w ? 2 : 1; 1920 b --; 1921 } 1922 put_reg (a0, v); 1923 put_reg (a1, a); 1924 put_reg (r3, b); 1925 1926 /** 1011 1000 100w 0011 SMOVU.size */ 1927 1928 v = get_reg (a0); 1929 a = get_reg (a1); 1930 do 1931 { 1932 if (w) 1933 mem_put_hi(a, (t0 = mem_get_hi (v))); 1934 else 1935 mem_put_qi(a, (t0 = mem_get_qi (v))); 1936 v += w ? 2 : 1; 1937 a += w ? 2 : 1; 1938 if (t0 == 0 1939 || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0))) 1940 break; 1941 } while (1); 1942 put_reg (a0, v); 1943 put_reg (a1, a); 1944 1945 /** 1011 0100 100w 0011 SOUT.size */ 1946 1947 v = get_reg (a0); 1948 a = get_reg (a1); 1949 b = get_reg (r3); 1950 for (;b;) 1951 { 1952 if (w) 1953 mem_put_hi(a, mem_get_hi (v)); 1954 else 1955 mem_put_qi(a, mem_get_qi (v)); 1956 v += w ? 2 : 1; 1957 b --; 1958 } 1959 put_reg (a0, v); 1960 put_reg (a1, a); 1961 put_reg (r3, b); 1962 1963 /** 1011 1000 000w 0011 SSTR.size */ 1964 1965 a = get_reg (a1); 1966 b = get_reg (r3); 1967 v = get_reg (w ? r0 : r0l); 1968 for (;b;) 1969 { 1970 if (w) 1971 mem_put_hi(a, v); 1972 else 1973 mem_put_qi(a, v); 1974 a += w ? 2 : 1; 1975 b --; 1976 } 1977 put_reg (a1, a); 1978 put_reg (r3, b); 1979 1980 /** 0000 0001 1101 ddd1 dd01 0src STC src,dest */ 1981 1982 prefix (0, 0, 0); 1983 dc = decode_dest23 (ddd, dd, 4); 1984 sc = decode_cr_b (src, CR_B_DMA0); 1985 a = get_src (sc); 1986 put_dest (dc, a); 1987 1988 /** 0000 0001 1101 ddd1 dd01 1src STC src,dest */ 1989 1990 prefix (0, 0, 0); 1991 dc = decode_dest23 (ddd, dd, 2); 1992 sc = decode_cr_b (src, CR_B_DCT0); 1993 a = get_src (sc); 1994 put_dest (dc, a); 1995 1996 /** 1101 ddd1 dd01 0src STC src,dest */ 1997 1998 prefix (0, 0, 0); 1999 dc = decode_dest23 (ddd, dd, 4); 2000 sc = decode_cr_b (src, CR_B_INTB); 2001 a = get_src (sc); 2002 put_dest (dc, a); 2003 2004 /** 1011 0110 1101 0011 STCX abs16,abs24 */ 2005 2006 NOTYET(); 2007 2008 /** 1001 ddd w dd01 1111 STNZ.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 dd00 1111 STZ.size #IMM,dest */ 2017 2018 prefix (0, 1, 0); 2019 dc = decode_dest23 (ddd, dd, w+1); 2020 imm = IMM(w+1); 2021 if (FLAG_Z) 2022 put_dest (dc, imm); 2023 2024 /** 1001 ddd w dd11 1111 STZX.size #IMM1,#IMM2,dest */ 2025 2026 prefix (0, 1, 0); 2027 dc = decode_dest23 (ddd, dd, w+1); 2028 a = IMM(w+1); 2029 b = IMM(w+1); 2030 if (FLAG_Z) 2031 put_dest (dc, a); 2032 else 2033 put_dest (dc, b); 2034 2035 /** 1000 ddd w dd11 1110 SUB.size:G #IMM,dest */ 2036 2037 prefix (0, 1, 0); 2038 dc = decode_dest23(ddd, dd, w+1); 2039 imm = IMM(w+1); 2040 MATH_OP (dc, imm, 0, -); 2041 2042 /** 1001 ddd0 dd11 0001 SUB.L:G #IMM,dest */ 2043 2044 prefix (0, 1, 0); 2045 dc = decode_dest23(ddd, dd, 4); 2046 imm = IMM(4); 2047 MATH_OP (dc, imm, 0, -); 2048 2049 /** 00dd 111w SUB.size:S #IMM,dest */ 2050 2051 prefix (0, 1, 0); 2052 dc = decode_dest2(dd, w+1); 2053 imm = IMM (w+1); 2054 MATH_OP (dc, imm, 0, -); 2055 2056 /** 1sss ddd w dd ss 1010 SUB.size:G src,dest */ 2057 2058 prefix (1, 1, 0); 2059 sc = decode_src23(sss, ss, w+1); 2060 dc = decode_dest23(ddd, dd, w+1); 2061 b = get_src (sc); 2062 MATH_OP (dc, b, 0, -); 2063 2064 /** 1sss ddd1 dd ss 0000 SUB.L:G src,dest */ 2065 2066 prefix (1, 1, 0); 2067 sc = decode_src23(sss, ss, 4); 2068 dc = decode_dest23(ddd, dd, 4); 2069 b = get_src (sc); 2070 MATH_OP (dc, b, 0, -); 2071 2072 /** 1001 ddd0 dd01 0001 SUBX #IMM,dest */ 2073 2074 prefix (0, 1, 0); 2075 dc = decode_dest23(ddd, dd, 4); 2076 imm = sign_ext (IMM(1), 8); 2077 MATH_OP (dc, imm, 0, -); 2078 2079 /** 1sss ddd0 dd ss 0000 SUBX src,dest */ 2080 2081 prefix (1, 1, 0); 2082 sc = decode_src23(sss, ss, 1); 2083 dc = decode_dest23(ddd, dd, 4); 2084 b = sign_ext (get_src (sc), 8); 2085 MATH_OP (dc, b, 0, -); 2086 2087 /** 1001 ddd w dd11 1110 TST.size:G #IMM,dest */ 2088 2089 prefix (0, 0, 0); 2090 dc = decode_dest23 (ddd, 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 /** 00dd 110w TST.size:S #IMM,dest */ 2097 2098 prefix (0, 0, 0); 2099 dc = decode_dest2 (dd, w+1); 2100 imm = IMM(w+1); 2101 a = get_src (dc); 2102 v = a & imm; 2103 set_sz (v, w+1); 2104 2105 /** 0000 0001 1sss ddd w dd ss 1001 TST.size:G src,dest */ 2106 2107 prefix (0, 0, 0); 2108 sc = decode_src23 (sss, ss, w+1); 2109 dc = decode_dest23 (ddd, dd, w+1); 2110 b = get_src (sc); 2111 a = get_src (dc); 2112 v = a & b; 2113 set_sz (v, w+1); 2114 2115 /** 1111 1111 UND */ 2116 2117 trigger_fixed_interrupt (0xffffdc); 2118 2119 /** 1011 0010 0000 0011 WAIT */ 2120 2121 ; 2122 2123 /** 1101 ddd w dd00 1src XCHG.size src,dest */ 2124 2125 dc = decode_dest23 (ddd, dd, w+1); 2126 sc = decode_src3 (src, w+1); 2127 a = get_src (dc); 2128 b = get_src (sc); 2129 put_dest (dc, b); 2130 put_dest (sc, a); 2131 2132 /** 1001 ddd w dd00 1110 XOR.size #IMM,dest */ 2133 2134 prefix (0, 1, 0); 2135 dc = decode_dest23(ddd, dd, w+1); 2136 imm = IMM(w+1); 2137 LOGIC_OP (dc, imm, ^); 2138 2139 /** 1sss ddd w dd ss 1001 XOR.size src,dest */ 2140 2141 prefix (1, 1, 0); 2142 sc = decode_src23(sss, ss, w+1); 2143 dc = decode_dest23(ddd, dd, w+1); 2144 b = get_src (sc); 2145 LOGIC_OP (dc, b, ^); 2146 2147/** */ 2148 2149 return step_result; 2150} 2151