1 /* m32c.opc --- semantics for m32c opcodes. -*- mode: c -*-
3 Copyright (C) 2005-2021 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
6 This file is part of the GNU simulators.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
31 #define tprintf if (trace) printf
47 #define M32C_ONLY() /* FIXME: add something here */
49 #define GETBYTE() (op[opi++] = getbyte())
51 #define UNSUPPORTED() unsupported("unsupported", m32c_opcode_pc)
52 #define NOTYET() unsupported("unimplemented", m32c_opcode_pc)
55 unsupported (char *tag, int orig_pc)
58 printf("%s opcode at %08x\n", tag, orig_pc);
63 printf(" %s", bits(b>>4, 4));
64 printf(" %s", bits(b, 4));
71 printf(" %02x", mem_get_pc ());
85 rv = mem_get_qi (get_reg(pc));
88 rv = mem_get_hi (get_reg(pc));
91 rv = mem_get_psi (get_reg(pc));
94 rv = mem_get_si (get_reg(pc));
101 #define IMM4() (immm >= 8 ? 7 - immm : immm + 1)
103 #define NO_PREFIX() PREFIX(0,0,0)
105 /* Indicate which sorts of prefixes are allowed for the current
108 prefix (int src_allowed, int dest_allowed, int index_bytewidth)
110 /* At the moment, we don't do anything with this information. We
111 just wanted to get the information entered in some
112 machine-readable form while we were going through all the
116 #define MATH_OP(dc,s,c,op) \
120 mb = s & b2mask[dc.bytes]; \
121 ll = (long long)ma op (long long)mb op c; \
122 tprintf("0x%x " #op " 0x%x " #op " 0x%x = 0x%llx\n", ma, mb, c, ll); \
123 ma = sign_ext (ma, dc.bytes * 8); \
124 mb = sign_ext (s, dc.bytes * 8); \
126 tprintf("%d " #op " %d " #op " %d = %d\n", ma, mb, c, v); \
127 set_oszc (v, dc.bytes, (1 op 1) ? (ll > b2mask[dc.bytes]) : (ll >= 0)); \
131 #define LOGIC_OP(dc,s,op) \
135 mb = s & b2mask[dc.bytes]; \
137 tprintf("0x%x " #op " 0x%x = 0x%x\n", ma, mb, v); \
138 set_sz (v, dc.bytes); \
142 #define BIT_OP(dc,bit,expr) \
143 b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \
145 tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \
146 b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \
147 put_bit2 (dc, bitindex == -1 ? bit : bitindex, v);
149 #define BIT_OPC(dc,bit,expr) \
150 b = get_bit2 (dc, bitindex == -1 ? bit : bitindex); \
152 tprintf ("b=%d, bit=%d, carry=%d, %s = %d\n", \
153 b, bitindex == -1 ? bit : bitindex, carry, #expr, v); \
156 #define carry (FLAG_C ? 1 : 0)
159 cmp (int d, int s, int bytes)
163 b = sign_ext (d, bytes*8) - sign_ext (s, bytes*8);
164 tprintf ("cmp: %x - %x = %08x, %x - %x = %d\n",
166 sign_ext(d,bytes*8), sign_ext(s,bytes*8), b);
170 if (b & b2signbit[bytes])
172 if ((d & b2mask[bytes]) >= (s & b2mask[bytes]))
174 if (b < b2minsigned[bytes] || b > b2maxsigned[bytes])
177 set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f);
181 dadd_op (int ddd, int dd, int sss, int ss, int imm, int add, int cy, int w)
190 sc = decode_src23 (sss, ss, w+1);
193 dc = decode_dest23 (ddd, dd, w+1);
201 tprintf("decimal: %d %s %d", a, add?"+":"-", b);
203 tprintf(" c=%d", carry);
210 cy = res > (w ? 9999 : 99);
219 res += w ? 10000 : 100;
222 res = int2bcd (res, w);
223 tprintf(" = %x\n", res);
225 set_szc (res, w+1, cy);
229 #define DADDV(A,C) dadd_op(ddd, dd, sss, ss, 0, A, C, w)
230 #define DADDI(A,C) dadd_op(ddd, dd, 0, 0, 1, A, C, w)
233 div_op (int sss, int ss, int u, int x, int bytes)
242 sc = decode_dest23 (sss, ss, bytes);
246 v = get_reg (bytes > 1 ? r2r0 : r0);
250 /* FIXME? do we sign extend a0/a1 to .L? Docs say zero extend. */
251 s = sign_ext (s, bytes*8);
252 v = sign_ext (v, bytes*8);
257 set_flags (FLAGBIT_O, FLAGBIT_O);
263 a = (unsigned int)v / (unsigned int)s;
264 b = (unsigned int)v % (unsigned int)s;
280 tprintf ("%d / %d = %d rem %d\n", v, s, a, b);
281 if ((!u && (a > b2maxsigned[bytes]
282 || a < b2minsigned[bytes]))
283 || (u && (a > b2mask[bytes])))
284 set_flags (FLAGBIT_O, FLAGBIT_O);
286 set_flags (FLAGBIT_O, 0);
305 index_op (int sss, int ss, int do_s, int do_d, int scale, int w)
307 srcdest sc = decode_src23 (sss, ss, w+1);
308 int v = get_src (sc) * scale;
309 tprintf("%d = %d * %d, %d %d\n", v, get_src(sc), scale, do_s, do_d);
310 decode_index (do_s * v, do_d * v);
312 #define INDEXOP(scale,do_s,do_d) \
313 index_op (sss, ss, do_s, do_d, scale, w); goto next_opcode
316 rot_op (srcdest sd, int rotc, int count)
318 int mask = (sd.bytes == 2) ? 0xffff : 0xff;
319 int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
320 int v = get_src (sd);
323 tprintf("%s %x by %d\n", rotc ? "rotc" : "rot", v, count);
324 tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
327 ct = (v & msb) ? 1 : 0;
332 tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
339 v |= (rotc ? c : ct) * msb;
341 tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
345 set_szc (v, sd.bytes, c);
349 shift_op (srcdest sd, int arith, int count, int setc)
351 int mask = (sd.bytes == 2) ? 0xffff : 0xff;
352 int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
353 int v = get_src (sd);
363 tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count);
364 tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
367 c = (v & msb) ? 1 : 0;
370 if (c != ((v & msb) ? 1 : 0))
372 tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
379 v = (v & msb) | (v >> 1);
381 v = (v >> 1) & (msb - 1);
382 tprintf (": %s %d %d\n", bits(v, 8*sd.bytes), c, o);
386 set_sz (v, sd.bytes);
389 set_flags (FLAGBIT_O, o ? FLAGBIT_O : 0);
398 unsigned char op[40];
405 int t0, t1=0, t2, t3=0;
408 step_result = M32C_MAKE_STEPPED ();
410 decode_indirect (0, 0);
415 m32c_opcode_pc = get_reg (pc);
417 tprintf("trace: decode pc = %06x\n", m32c_opcode_pc);
419 if (m32c_opcode_pc == 0)
422 printf("Abort: PC is zero, here from:\n");
424 printf(" 0x%06x\n", pcs[(ipcs+15-i)%16]);
425 return M32C_MAKE_HIT_BREAK ();
427 pcs[ipcs++] = m32c_opcode_pc;
430 /** VARY sss 000 001 010 011 100 */
431 /** VARY ddd 000 001 010 011 100 */
433 /** 0000 1001 indirect dest */
435 decode_indirect (0, 1);
438 /** 0100 0001 indirect src */
440 decode_indirect (1, 0);
443 /** 0100 1001 indirect src and dest */
445 decode_indirect (1, 1);
448 /** 1010 ddd w dd01 1111 ABS.size dest */
451 dc = decode_dest23 (ddd, dd, w+1);
452 v = sign_ext (get_src (dc), w?16:8);
454 tprintf("abs(%d) = %d\n", v, a);
458 /** 0000 0001 1000 ddd w dd10 1110 ADC.size #IMM,dest */
461 dc = decode_dest23 (ddd, dd, w+1);
463 MATH_OP (dc, imm, carry, +);
465 /** 0000 0001 1sss ddd w dd ss 0100 ADC.size src,dest */
468 sc = decode_src23 (sss, ss, w+1);
469 dc = decode_dest23 (ddd, dd, w+1);
471 MATH_OP (dc, b, carry, +);
473 /** 1011 ddd w dd01 1110 ADCF.size dest */
476 dc = decode_dest23 (ddd, dd, w+1);
477 MATH_OP (dc, 0, carry, +);
479 /** 1000 ddd w dd10 1110 ADD.size:G #IMM,dest */
482 dc = decode_dest23(ddd, dd, w+1);
484 MATH_OP (dc, imm, 0, +);
486 /** 1000 ddd0 dd11 0001 ADD.L:G #IMM,dest */
489 dc = decode_dest23(ddd, dd, 4);
491 MATH_OP (dc, imm, 0, +);
493 /** 111L ddd w dd11 immm ADD.size:Q #IMM,dest */
496 dc = decode_dest23(ddd, dd, L ? 4 : (w+1));
497 imm = sign_ext (immm, 4);
498 MATH_OP (dc, imm, 0, +);
500 /** 00dd 011w ADD.size:S #IMM,dest */
503 dc = decode_dest2(dd, w+1);
505 MATH_OP (dc, imm, 0, +);
507 /** 10i0 110d ADD.L:S #IMM,A0/A1 */
510 dc = reg_sd (d ? a1 : a0);
512 MATH_OP (dc, imm, 0, +);
514 /** 1sss ddd w dd ss 1000 ADD.size:G src,dest */
517 sc = decode_src23(sss, ss, w+1);
518 dc = decode_dest23(ddd, dd, w+1);
520 MATH_OP (dc, b, 0, +);
522 /** 1sss ddd1 dd ss 0010 ADD.L:G src,dest */
525 sc = decode_src23(sss, ss, 4);
526 dc = decode_dest23(ddd, dd, 4);
528 MATH_OP (dc, b, 0, +);
530 /** 1011 0110 0001 0011 ADD.L:G #IMM16,SP */
534 b = sign_ext (IMM(2), 16);
535 MATH_OP (dc, b, 0, +);
537 /** 01ii 001i ADD.L:Q #IMM3,SP */
542 MATH_OP (dc, b, 0, +);
544 /** 1011 0110 0000 0011 ADD.L:S #IMM8,SP */
548 b = sign_ext (IMM(1), 8);
549 MATH_OP (dc, b, 0, +);
551 /** 1000 ddd0 dd01 0001 ADDX #IMM,dest */
554 dc = decode_dest23(ddd, dd, 4);
555 imm = sign_ext (IMM(1), 8);
556 MATH_OP (dc, imm, 0, +);
558 /** 1sss ddd0 dd ss 0010 ADDX src,dest */
561 sc = decode_src23(sss, ss, 1);
562 dc = decode_dest23(ddd, dd, 4);
563 b = sign_ext (get_src (sc), 8);
564 MATH_OP (dc, b, 0, +);
566 /** 1111 ddd w dd01 immm ADJNZ.size #IMM,dest,label */
569 dc = decode_dest23 (ddd, dd, w+1);
571 imm = sign_ext(immm, 4);
572 tprintf("%d + %d = %d\n", v, imm, v+imm);
575 a = sign_ext (IMM(1), 8);
576 if ((v & (w ? 0xffff : 0xff)) != 0)
578 tprintf("jmp: %x + 2 + %d = ", get_reg (pc), a);
579 put_reg (pc, m32c_opcode_pc + 2 + a);
580 tprintf("%x\n", get_reg (pc));
583 /** 1000 ddd w dd11 1111 AND.size:G #IMM,dest */
586 dc = decode_dest23(ddd, dd, w+1);
588 LOGIC_OP (dc, imm, &);
590 /** 01dd 110w AND.size:S #IMM,dest */
593 dc = decode_dest2(dd, w+1);
595 LOGIC_OP (dc, imm, &);
597 /** 1sss ddd w dd ss 1101 AND.size:G src,dest */
600 sc = decode_src23(sss, ss, w+1);
601 dc = decode_dest23(ddd, dd, w+1);
605 /** 0000 0001 1101 sss0 ss00 1bit BAND src */
607 sc = decode_src23 (sss, ss, 1);
608 BIT_OPC (sc, bit, b & carry);
610 /** 1101 ddd0 dd11 0bit BCLR dest */
612 dc = decode_dest23 (ddd, dd, 1);
615 /** 1100 ddd w dd10 1110 BITINDEX.size src */
618 dc = decode_dest23 (ddd, dd, w+1);
619 bitindex = get_src (dc);
620 tprintf ("bitindex set to %d\n", bitindex);
623 /** 1101 ddd0 dd01 0bit BMcnd dest */
626 dc = decode_dest23 (ddd, dd, 1);
627 if (condition_true (IMM (1)))
628 put_bit2 (dc, bit, 1);
630 put_bit2 (dc, bit, 0);
632 /** 1101 1001 0c10 1cnd BMcnd C */
635 if (condition_true (c * 8 + cnd))
640 /** 0000 0001 1101 sss0 ss01 1bit BNAND src */
643 sc = decode_src23 (sss, ss, 1);
644 BIT_OPC (sc, bit, (!b) & carry);
646 /** 0000 0001 1101 sss0 ss11 0bit BNOR src */
649 sc = decode_src23 (sss, ss, 1);
650 BIT_OPC (sc, bit, (!b) | carry);
652 /** 1101 ddd0 dd01 1bit BNOT dest */
655 dc = decode_dest23 (ddd, dd, 1);
656 BIT_OP (dc, bit, !b);
658 /** 0000 0001 1101 sss0 ss00 0bit BNTST src */
661 sc = decode_dest23 (sss, ss, 1);
662 b = get_bit2 (sc, bit);
665 /** 0000 0001 1101 sss0 ss11 1bit BNXOR src */
668 sc = decode_src23 (sss, ss, 1);
669 BIT_OPC (sc, bit, !b ^ carry);
671 /** 0000 0001 1101 sss0 ss10 0bit BOR src */
674 sc = decode_src23 (sss, ss, 1);
675 BIT_OPC (sc, bit, b | carry);
679 /* We report the break to our caller with the PC still pointing at the
680 breakpoint instruction. */
681 put_reg (pc, m32c_opcode_pc);
684 if (in_gdb || (regs.r_intbl == 0 && regs.r_intbh == 0))
685 return M32C_MAKE_HIT_BREAK ();
686 if (mem_get_qi (0xFFFFE7) == 0xff)
687 trigger_based_interrupt (0);
689 trigger_fixed_interrupt (0xFFFFE4);
691 /** 1111 1110 GBRK */
693 /* This alternate break, which is not part of the chip's opcode set,
694 is here in case you need to debug a program that itself uses the
695 chip's BRK opcode. You'll need to modify your copy of GDB to use
696 this opcode instead of the real BRK. */
699 /* We report the break to our caller with the PC still pointing at the
700 breakpoint instruction. */
701 put_reg (pc, m32c_opcode_pc);
703 printf("[gdb break]\n");
704 return M32C_MAKE_HIT_BREAK ();
706 /** 0000 1000 BRK2 */
709 printf("[break2]\n");
711 return M32C_MAKE_HIT_BREAK ();
712 if (mem_get_qi (0xFFFFE7) == 0xff)
713 trigger_based_interrupt (0);
715 trigger_fixed_interrupt (0xFFFFE4);
717 /** 1101 ddd0 dd11 1bit BSET dest */
719 dc = decode_dest23 (ddd, dd, 1);
722 /** 1101 sss0 ss00 0bit BTST:G src */
725 sc = decode_src23 (sss, ss, 1);
726 b = get_bit2 (sc, bit);
729 /** 00bb 101b BTST:S src */
731 sc = decode_src23 (3, 3, 1); /* bit,base:19 */
732 b = get_bit2 (sc, bb*2 + b);
735 /** 1101 ddd0 dd10 0bit BTSTC dest */
738 sc = decode_dest23 (ddd, dd, 1);
739 b = get_bit2 (sc, bit);
741 put_bit2 (sc, bit, 0);
743 /** 1101 ddd0 dd10 1bit BTSTS dest */
746 sc = decode_dest23 (ddd, dd, 1);
747 b = get_bit2 (sc, bit);
749 put_bit2 (sc, bit, 1);
751 /** 0000 0001 1101 sss0 ss10 1bit BXOR src */
754 sc = decode_src23 (sss, ss, 1);
755 BIT_OPC (sc, bit, b ^ carry);
757 /** 0000 0001 1000 ddd w dd11 1110 CLIP.size #IMM1,#IMM2,dest */
760 dc = decode_dest23 (ddd, dd, w+1);
761 a = sign_ext (IMM(w+1), w*8+8);
762 b = sign_ext (IMM(w+1), w*8+8);
763 v = sign_ext (get_src (dc), w*8+8);
764 tprintf("clip %d <= %d <= %d : ", a, v, b);
772 /** 1001 ddd w dd10 1110 CMP.size:G #IMM,dest */
775 dc = decode_dest23 (ddd, dd, w+1);
780 /** 1010 ddd0 dd11 0001 CMP.L:G #IMM32,dest */
783 dc = decode_dest23 (ddd, dd, 4);
788 /** 1110 ddd w dd01 immm CMP.size:Q #IMM,dest */
791 dc = decode_dest23 (ddd, dd, w+1);
793 immm = sign_ext (immm, 4);
796 /** 01dd 011w CMP.size:S #IMM,dest */
799 dc = decode_dest2 (dd, w+1);
801 imm = sign_ext (IMM(w+1),w*8+8);
804 /** 1sss ddd w dd ss 0110 CMP.size:G src,dest */
807 sc = decode_src23 (sss, ss, w+1);
808 dc = decode_dest23 (ddd, dd, w+1);
813 /** 1sss ddd1 dd ss 0001 CMP.L:G src,dest */
816 sc = decode_src23 (sss, ss, 4);
817 dc = decode_dest23 (ddd, dd, 4);
822 /** 01dd 000w CMP.size:S src,R0/R0L */
825 dc = decode_dest2 (dd, w+1);
826 a = get_reg (w ? r0 : r0l);
830 /** 1010 ddd0 dd01 0001 CMPX #IMM,dest */
833 dc = decode_dest23 (ddd, dd, 4);
835 imm = sign_ext (IMM(1), 8);
838 /** 0000 0001 1000 ddd w dd00 1110 DADC.size #IMM,dest */
842 /** 0000 0001 1sss ddd w dd ss 1000 DADC.size src,dest */
846 /** 0000 0001 1000 ddd w dd01 1110 DADD.size #IMM,dest */
850 /** 0000 0001 1sss ddd w dd ss 0000 DADD.size src,dest */
854 /** 1011 ddd w dd00 1110 DEC.size dest */
857 dc = decode_dest23 (ddd, dd, w+1);
860 tprintf ("%x -- = %x\n", a, v);
864 /** 1011 0000 010w 0011 DIV.size #IMM */
867 div_op (-1, 0, 0, 0, w+1);
869 /** 1000 sss w ss01 1110 DIV.size src */
872 div_op (sss, ss, 0, 0, w+1);
874 /** 0000 0001 1010 sss1 ss01 1111 DIV.L src */
878 div_op (sss, ss, 0, 0, 4);
880 /** 1011 0000 000w 0011 DIVU.size #IMM */
883 div_op (-1, 0, 1, 0, w+1);
885 /** 1000 sss w ss00 1110 DIVU.size src */
888 div_op (sss, ss, 1, 0, w+1);
890 /** 0000 0001 1010 sss1 ss00 1111 DIVU.L src */
894 div_op (sss, ss, 1, 0, 4);
896 /** 1011 0010 010w 0011 DIVX.size #IMM */
899 div_op (-1, 0, 0, 1, w+1);
901 /** 1001 sss w ss01 1110 DIVX.size src */
904 div_op (sss, ss, 0, 1, w+1);
906 /** 0000 0001 1010 sss1 ss10 1111 DIVX.L src */
910 div_op (sss, ss, 0, 1, 4);
912 /** 0000 0001 1001 ddd w dd00 1110 DSBB.size #IMM,dest */
916 /** 0000 0001 1sss ddd w dd ss 1010 DSBB.size src,dest */
920 /** 0000 0001 1001 ddd w dd01 1110 DSUB.size #IMM,dest */
924 /** 0000 0001 1sss ddd w dd ss 0010 DSUB.size src,dest */
928 /** 1110 1100 ENTER #IMM */
931 put_reg (sp, get_reg (sp) - 4);
932 mem_put_si (get_reg (sp), get_reg (fb));
933 put_reg (fb, get_reg (sp));
934 put_reg (sp, get_reg (sp) - imm);
936 /** 1111 1100 EXITD */
938 put_reg (sp, get_reg (fb));
939 put_reg (fb, mem_get_si (get_reg (sp)));
940 put_reg (sp, get_reg (sp) + 4);
941 put_reg (pc, mem_get_si (get_reg (sp)));
942 put_reg (sp, get_reg (sp) + 4);
944 /** 1100 ddd w dd01 1110 EXTS.size dest */
947 dc = decode_dest23 (ddd, dd, w+1);
948 v = sign_ext (get_src (dc), (w+1)*8);
953 /** 0000 0001 1sss ddd0 dd ss 0111 EXTS.B src,dest */
956 sc = decode_src23 (sss, ss, 1);
957 dc = decode_dest23 (ddd, dd, 2);
958 v = sign_ext (get_src (sc), 8);
962 /** 0000 0001 1sss ddd0 dd ss 1011 EXTZ src,dest */
965 sc = decode_src23 (sss, ss, 1);
966 dc = decode_dest23 (ddd, dd, 2);
971 /** 1101 0011 1110 1dst FCLR dest */
973 set_flags (1 << dst, 0);
975 /** 1001 1111 FREIT */
979 /** 1101 0001 1110 1dst FSET dest */
981 set_flags (1 << dst, 1 << dst);
983 /** 1010 ddd w dd00 1110 INC.size dest */
986 dc = decode_dest23 (ddd, dd, w+1);
989 tprintf ("%x ++ = %x\n", a, v);
993 /** 1000 sss0 ss0w 0011 INDEXB.size src */
995 /** 1010 sss0 ss0w 0011 INDEXBD.size src */
997 /** 1100 sss0 ss0w 0011 INDEXBS.size src */
999 /** 1001 sss0 ss1w 0011 INDEXL.size src */
1001 /** 1011 sss0 ss1w 0011 INDEXLD.size src */
1003 /** 1001 sss0 ss0w 0011 INDEXLS.size src */
1005 /** 1000 sss0 ss1w 0011 INDEXW.size src */
1007 /** 1010 sss0 ss1w 0011 INDEXWD.size src */
1009 /** 1100 sss0 ss1w 0011 INDEXWS.size src */
1012 /** 1011 1110 vector00 INT #IMM */
1015 trigger_based_interrupt (vector);
1017 /** 1011 1111 INTO */
1021 trigger_fixed_interrupt (0xffffe0);
1023 /** 1ccc 101c Jcnd label */
1026 v = sign_ext (IMM(1), 8);
1027 if (condition_true (ccc*2+c))
1028 put_reg (pc, m32c_opcode_pc + 1 + v);
1030 /** 01dd 101d JMP.S label */
1033 put_reg (pc, m32c_opcode_pc + (dd*2+d) + 2);
1035 /** 1011 1011 JMP.B label */
1038 imm = sign_ext (IMM(1), 8);
1042 printf("[jmp-to-self detected as exit]\n");
1043 return M32C_MAKE_HIT_BREAK ();
1045 put_reg (pc, m32c_opcode_pc + 1 + imm);
1047 /** 1100 1110 JMP.W label */
1050 imm = sign_ext (IMM(2), 16);
1051 put_reg (pc, m32c_opcode_pc + 1 + imm);
1053 /** 1100 1100 JMP.A label */
1059 /** 1100 sss1 ss00 1111 JMPI.W src */
1062 sc = decode_src23 (sss, ss, 2);
1064 a = sign_ext (a, 16);
1065 put_reg (pc, m32c_opcode_pc + a);
1067 /** 1000 sss0 ss00 0001 JMPI.A src */
1070 sc = decode_src23 (sss, ss, 3);
1074 /** 1101 1100 JMPS #IMM8 */
1078 a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2);
1081 /** 1100 1111 JSR.W label */
1084 imm = sign_ext (IMM(2), 16);
1085 put_reg (sp, get_reg (sp) - 4);
1086 mem_put_si (get_reg (sp), get_reg (pc));
1087 put_reg (pc, m32c_opcode_pc + imm + 1);
1089 /** 1100 1101 JSR.A label */
1093 put_reg (sp, get_reg (sp) - 4);
1094 mem_put_si (get_reg (sp), get_reg (pc));
1097 /** 1100 sss1 ss01 1111 JSRI.W src */
1100 sc = decode_src23 (sss, ss, 2);
1102 a = sign_ext (a, 16);
1103 put_reg (sp, get_reg (sp) - 4);
1104 mem_put_si (get_reg (sp), get_reg (pc));
1105 put_reg (pc, m32c_opcode_pc + a);
1107 /** 1001 sss0 ss00 0001 JSRI.A src */
1110 sc = decode_src23 (sss, ss, 3);
1112 put_reg (sp, get_reg (sp) - 4);
1113 mem_put_si (get_reg (sp), get_reg (pc));
1116 /** 1101 1101 JSRS #IMM8 */
1120 a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2);
1121 put_reg (sp, get_reg (sp) - 4);
1122 mem_put_si (get_reg (sp), get_reg (pc));
1125 /** 1101 0101 1010 1dst LDC #IMM16,dest */
1128 dc = decode_cr_b (dst, CR_B_DCT0);
1131 /** 1101 0101 0010 1dst LDC #IMM24,dest */
1134 dc = decode_cr_b (dst, CR_B_INTB);
1137 /** 1101 0101 0110 1dst LDC #IMM24,dest */
1140 dc = decode_cr_b (dst, CR_B_DMA0);
1143 /** 0000 0001 1101 sss1 ss00 1dst LDC src,dest */
1146 sc = decode_src23 (sss, ss, 2);
1147 dc = decode_cr_b (dst, CR_B_DCT0);
1151 /** 1101 sss1 ss00 0dst LDC src,dest */
1154 sc = decode_src23 (sss, ss, 3);
1155 dc = decode_cr_b (dst, CR_B_INTB);
1159 /** 0000 0001 1101 sss1 ss00 0dst LDC src,dest */
1162 sc = decode_src23 (sss, ss, 3);
1163 dc = decode_cr_b (dst, CR_B_DMA0);
1167 /** 1011 0110 1100 0011 LDCTX */
1171 /** 1101 0101 1110 1imm LDIPL #IMM */
1173 set_flags (0x7000, imm*0x1000);
1175 /** 0000 0001 1000 ddd w dd11 1111 MAX.size #IMM,dest */
1179 dc = decode_dest23 (ddd, dd, w);
1180 imm = sign_ext (IMM(w), w*8);
1181 a = sign_ext (get_src (dc), w*8);
1182 tprintf ("max %d %d\n", imm, a);
1186 /** 0000 0001 1sss ddd w dd ss 1101 MAX.size src,dest */
1190 sc = decode_src23 (sss, ss, w);
1191 dc = decode_dest23 (ddd, dd, w);
1192 b = sign_ext (get_src (sc), w*8);
1193 a = sign_ext (get_src (dc), w*8);
1194 tprintf ("max %d %d\n", b, a);
1198 /** 0000 0001 1000 ddd w dd10 1111 MIN.size #IMM,dest */
1202 dc = decode_dest23 (ddd, dd, w);
1203 imm = sign_ext (IMM(w), w*8);
1204 a = sign_ext (get_src (dc), w*8);
1205 tprintf ("min %d %d\n", imm, a);
1209 /** 0000 0001 1sss ddd w dd ss 1100 MIN.size src,dest */
1213 sc = decode_src23 (sss, ss, w);
1214 dc = decode_dest23 (ddd, dd, w);
1215 b = sign_ext (get_src (sc), w*8);
1216 a = sign_ext (get_src (dc), w*8);
1217 tprintf ("min %d %d\n", b, a);
1221 /** 1001 ddd w dd10 1111 MOV.size:G #IMM,dest */
1223 dc = decode_dest23 (ddd, dd, w+1);
1226 tprintf("%x = %x\n", v, v);
1230 /** 1011 ddd0 dd11 0001 MOV.L:G #IMM,dest */
1232 dc = decode_dest23 (ddd, dd, 4);
1235 tprintf("%x = %x\n", v, v);
1239 /** 1111 ddd w dd10 immm MOV.size:Q #IMM4,dest */
1241 dc = decode_dest23 (ddd, dd, w+1);
1242 imm = sign_ext (immm, 4);
1244 tprintf("%x = %d\n", v, v);
1248 /** 00dd 010w MOV.size:S #IMM,dest */
1251 dc = decode_dest2 (dd, w+1);
1256 /** 10w1 110d MOV.size:S #IMM,a0/a1 */
1258 imm = IMM(w ? 3 : 2);
1259 put_reg (d ? a1 : a0, imm);
1260 set_sz (imm & addr_mask, w+1);
1262 /** 00dd 001w MOV.size:Z #0,dest */
1265 dc = decode_dest2 (dd, w+1);
1269 /** 1sss ddd w dd ss 1011 MOV.size:G src,dest */
1272 sc = decode_src23 (sss, ss, w+1);
1273 dc = decode_dest23 (ddd, dd, w+1);
1278 /** 1sss ddd1 dd ss 0011 MOV.L:G src,dest */
1281 sc = decode_src23 (sss, ss, 4);
1282 dc = decode_dest23 (ddd, dd, 4);
1287 /** VARY SS 01 10 11 */
1288 /** 00SS 100w MOV.size:S src,R0L/R0 */
1291 sc = decode_dest2 (SS, w+1);
1293 put_reg (w ? r0 : r0l, v);
1296 /** 01ss 111w MOV.size:S src,R1L/R1 */
1299 sc = decode_dest2 (ss, w+1);
1301 put_reg (w ? r1 : r1l, v);
1304 /** VARY DD 01 10 11 */
1305 /** 00DD 000w MOV.size:S R0L/R0,dest */
1308 dc = decode_dest2 (DD, w+1);
1309 v = get_reg (w ? r0 : r0l);
1313 /** 01ss 100d MOV.L:S src,A0/A1 */
1316 sc = decode_dest2 (ss, 4);
1318 put_reg (d ? a1 : a0, v);
1321 /** 1011 ddd w dd00 1111 MOV.size:G dsp:8[SP], dest */
1325 dc = decode_dest23 (ddd, dd, w+1);
1326 a = get_reg (sp) + sign_ext (imm, 8);
1335 /** 1010 sss w ss00 1111 MOV.size:G src,dsp:8[SP] */
1338 sc = decode_dest23 (sss, ss, w+1);
1340 a = get_reg (sp) + sign_ext (imm, 8);
1349 /** 1101 sss1 ss01 1dst MOVA src,dest */
1352 static reg_id map[8] = { r2r0, r3r1, a0, a1 };
1354 sc = decode_src23 (sss, ss, 1);
1355 if (!sc.mem || !map[dst])
1357 put_reg (map[dst], sc.u.addr);
1360 /** 0000 0001 1011 ddd0 dd hl 1110 MOVdir R0L,dest */
1363 dc = decode_dest23 (ddd, dd, 1);
1368 case 0: a = (a & 0xf0) | (b & 0x0f); break;
1369 case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
1370 case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
1371 case 3: a = (a & 0x0f) | (b & 0xf0); break;
1375 /** 0000 0001 1010 sss0 ss hl 1110 MOVdir src,R0L */
1378 sc = decode_dest23 (sss, ss, 1);
1383 case 0: a = (a & 0xf0) | (b & 0x0f); break;
1384 case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
1385 case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
1386 case 3: a = (a & 0x0f) | (b & 0xf0); break;
1390 /** 1011 ddd0 dd01 0001 MOVX #IMM,dest */
1393 dc = decode_dest23 (ddd, dd, 4);
1394 imm = sign_ext (IMM(1), 8);
1398 /** 1000 ddd w dd01 1111 MUL.size #IMM,dest */
1402 dc = decode_dest23 (ddd, dd, w);
1403 v = sign_ext (get_src (dc), w*8);
1404 imm = sign_ext (IMM(w), w*8);
1405 tprintf("%d * %d = %d\n", v, imm, v*imm);
1410 /** 1sss ddd w dd ss 1100 MUL.size src,dest */
1414 sc = decode_src23 (sss, ss, w);
1415 dc = decode_dest23 (ddd, dd, w);
1416 a = sign_ext (get_src (sc), w*8);
1417 b = sign_ext (get_src (dc), w*8);
1418 tprintf("%d * %d = %d\n", a, b, a*b);
1423 /** 0000 0001 1000 sss1 ss01 1111 MUL.L src,R2R0 */
1427 sc = decode_src23 (sss, ss, 4);
1428 a = sign_ext (get_src (sc), 32);
1429 b = sign_ext (get_reg (r2r0), 32);
1430 ll = (long long)a * (long long)b;
1431 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1432 if (ll < b2minsigned[4] || ll > b2maxsigned[4])
1433 set_flags (FLAGBIT_O, FLAGBIT_O);
1435 set_flags (FLAGBIT_O, 0);
1436 put_reg (r2r0, (int)ll);
1438 /** 1100 sss1 ss11 1110 MULEX src */
1441 sc = decode_dest23 (sss, ss, 2);
1442 a = sign_ext (get_src (sc), 16);
1443 b = sign_ext (get_reg (r2r0), 32);
1444 ll = (long long)a * (long long)b;
1445 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1446 put_reg (r2r0, (int)ll);
1447 put_reg (r1, (int)(ll >> 32));
1449 /** 1000 ddd w dd00 1111 MULU.size #IMM,dest */
1453 dc = decode_dest23 (ddd, dd, w);
1456 tprintf("%d * %d = %d\n", v, imm, v*imm);
1461 /** 1sss ddd w dd ss 0100 MULU.size src,dest */
1465 sc = decode_src23 (sss, ss, w);
1466 dc = decode_dest23 (ddd, dd, w);
1469 tprintf("%d * %d = %d\n", a, b, a*b);
1474 /** 0000 0001 1000 sss1 ss00 1111 MULU.L src,R2R0 */
1478 sc = decode_src23 (sss, ss, 4);
1481 ll = (long long)a * (long long)b;
1482 tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
1483 if (ll < b2minsigned[4] || ll > b2maxsigned[4])
1484 set_flags (FLAGBIT_O, FLAGBIT_O);
1486 set_flags (FLAGBIT_O, 0);
1487 put_reg (r2r0, (int)ll);
1489 /** 1010 ddd w dd10 1111 NEG.size dest */
1492 dc = decode_dest23 (ddd, dd, w+1);
1493 a = sign_ext (get_src (dc), (w+1)*8);
1495 tprintf("%d * -1 = %d\n", a, v);
1496 set_oszc(v, w+1, v==0);
1499 /** 1101 1110 NOP */
1503 /** 1010 ddd w dd01 1110 NOT.size dest */
1506 dc = decode_dest23 (ddd, dd, w+1);
1509 tprintf("~ %x = %x\n", a, v);
1513 /** 1000 ddd w dd10 1111 OR.size:G #IMM,dest */
1516 dc = decode_dest23(ddd, dd, w+1);
1518 LOGIC_OP (dc, imm, |);
1520 /** 01dd 010w OR.size:S #IMM,dest */
1523 dc = decode_dest2(dd, w+1);
1525 LOGIC_OP (dc, imm, |);
1527 /** 1sss ddd w dd ss 0101 OR.size:G src,dest */
1530 sc = decode_src23(sss, ss, w+1);
1531 dc = decode_dest23(ddd, dd, w+1);
1533 LOGIC_OP (dc, b, |);
1535 /** 1011 ddd w dd10 1111 POP.size dest */
1538 dc = decode_dest23 (ddd, dd, w+1);
1540 a = mem_get_hi (get_reg (sp));
1542 a = mem_get_qi (get_reg (sp));
1543 put_reg (sp, get_reg (sp) + 2);
1544 tprintf("pop%s: %x\n", w ? "hi" : "qi", a);
1547 /** 1101 0011 1010 1dst POPC dest */
1550 dc = decode_cr_b (dst, CR_B_DCT0);
1551 a = mem_get_hi (get_reg (sp));
1552 put_reg (sp, get_reg (sp) + 2);
1553 tprintf("pophi: %x\n", a);
1556 /** 1101 0011 0010 1dst POPC dest */
1559 dc = decode_cr_b (dst, CR_B_INTB);
1560 a = mem_get_si (get_reg (sp));
1561 put_reg (sp, get_reg (sp) + 4);
1562 tprintf("popsi: %x\n", a);
1565 /** 1000 1110 POPM dest */
1568 static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb };
1571 tprintf("popm: %x\n", imm);
1575 v = mem_get_hi (get_reg (sp));
1576 put_reg (map[a], v);
1577 put_reg (sp, get_reg (sp) + 2);
1582 v = mem_get_si (get_reg (sp));
1583 put_reg (map[a], v);
1584 put_reg (sp, get_reg (sp) + 4);
1588 /** 1010 111w PUSH.size #IMM */
1594 tprintf("push%s: %x\n", w ? "hi" : "qi", imm);
1595 a = get_reg (sp) - 2;
1597 mem_put_hi (a, imm);
1599 mem_put_qi (a, imm);
1603 /** 1100 sss w ss00 1110 PUSH.size src */
1606 sc = decode_dest23 (sss, ss, w+1);
1608 put_reg (sp, get_reg (sp) - 2);
1610 mem_put_hi (get_reg (sp), a);
1612 mem_put_qi (get_reg (sp), a);
1613 tprintf("push%s: %x\n", w ? "hi" : "qi", a);
1615 /** 1011 0110 0101 0011 PUSH.L #IMM32 */
1618 put_reg (sp, get_reg (sp) - 4);
1619 mem_put_si (get_reg (sp), imm);
1621 /** 1010 sss0 ss00 0001 PUSH.L src */
1624 sc = decode_dest23 (sss, ss, 4);
1626 put_reg (sp, get_reg (sp) - 4);
1627 mem_put_si (get_reg (sp), a);
1629 /** 1011 0sa0 ss00 0001 PUSHA src */
1632 sc = decode_dest23 (sa, ss, 1);
1633 put_reg (sp, get_reg (sp) - 4);
1634 mem_put_hi (get_reg (sp), sc.u.addr);
1635 tprintf("pushsi: %x\n", sc.u.addr);
1637 /** 1101 0001 1010 1src PUSHC src */
1640 sc = decode_cr_b (src, CR_B_DCT0);
1642 put_reg (sp, get_reg (sp) - 2);
1643 mem_put_hi (get_reg (sp), a);
1644 tprintf("pushhi: %x\n", a);
1646 /** 1101 0001 0010 1src PUSHC src */
1649 sc = decode_cr_b (src, CR_B_INTB);
1651 put_reg (sp, get_reg (sp) - 4);
1652 mem_put_si (get_reg (sp), a);
1653 tprintf("pushsi: %x\n", a);
1655 /** 1000 1111 PUSHM src */
1658 static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 };
1660 tprintf("pushm: %x\n", imm);
1664 put_reg (sp, get_reg (sp) - 4);
1665 v = get_reg (map[a]);
1666 mem_put_si (get_reg (sp), v);
1671 put_reg (sp, get_reg (sp) - 2);
1672 v = get_reg (map[a]);
1673 mem_put_hi (get_reg (sp), v);
1677 /** 1001 1110 REIT */
1680 put_reg (pc, mem_get_si (a));
1682 put_reg (flags, mem_get_hi (a));
1686 /** 1011 1000 010w 0011 RMPA.size */
1689 int count = get_reg (r3);
1690 int list1 = get_reg (a0);
1691 int list2 = get_reg (a1);
1692 long long sum = get_reg_ll (r3r1r2r0) & 0xffffff;
1698 a = sign_ext (mem_get_hi (list1), 16);
1699 b = sign_ext (mem_get_hi (list2), 16);
1703 a = sign_ext (mem_get_qi (list1), 8);
1704 b = sign_ext (mem_get_qi (list2), 8);
1706 tprintf("%lld + %d * %d = ", sum, a, b);
1708 tprintf("%lld\n", sum);
1713 put_reg (r3, count);
1714 put_reg (a0, list1);
1715 put_reg (a1, list2);
1716 put_reg (r2r0, (int)(sum & 0xffffffffU));
1717 put_reg (r1, (int)(sum >> 32));
1720 /** 1011 ddd w dd10 1110 ROLC.size dest */
1723 dc = decode_dest23 (ddd, dd, w+1);
1726 /** 1010 ddd w dd10 1110 RORC.size dest */
1729 dc = decode_dest23 (ddd, dd, w+1);
1732 /** 1110 ddd w dd10 immm ROT.size #IMM, dest */
1735 dc = decode_dest23 (ddd, dd, w+1);
1736 rot_op (dc, IMM4(), -1);
1738 /** 1010 ddd w dd11 1111 ROT.size R1H,dest */
1741 dc = decode_dest23 (ddd, dd, w+1);
1742 a = sign_ext (get_reg (r1h), 8);
1745 /** 1101 1111 RTS */
1747 put_reg (pc, mem_get_si (get_reg (sp)));
1748 put_reg (sp, get_reg (sp) + 4);
1750 /** 0000 0001 1001 ddd w dd10 1110 SBB.size #IMM, dest */
1753 dc = decode_dest23 (ddd, dd, w+1);
1755 MATH_OP (dc, imm, !carry, -);
1757 /** 0000 0001 1sss ddd w dd ss 0110 SBB.size src,dest */
1760 sc = decode_src23 (sss, ss, w+1);
1761 dc = decode_dest23 (ddd, dd, w+1);
1762 MATH_OP (dc, get_src (sc), !carry, -);
1764 /** 1101 ddd1 dd11 cond SCcond dest */
1767 dc = decode_dest23 (ddd, dd, 2);
1768 if (condition_true (cond))
1773 /** 1011 1000 110w 0011 SCMPU.size */
1780 t0 = mem_get_qi (ta0);
1781 t2 = mem_get_qi (ta1);
1784 t1 = mem_get_qi (ta0 + 1);
1785 t3 = mem_get_qi (ta1 + 1);
1788 if (dif == 0 && t0 != 0 && w)
1790 set_oszc (dif, 1, dif > 0);
1795 if (t0 == 0 || t0 != t2)
1797 if (w && (t1 == 0 || t1 != t3))
1801 /** 1111 ddd w dd00 immm SHA.size #IMM,dest */
1804 dc = decode_dest23 (ddd, dd, w+1);
1805 shift_op (dc, 1, IMM4(), 1);
1807 /** 1010 ddd0 dd10 0001 SHA.L #IMM,dest */
1810 dc = decode_dest23 (ddd, dd, 4);
1811 imm = sign_ext (IMM(1), 8);
1812 shift_op (dc, 1, imm, 1);
1814 /** 1011 ddd w dd11 1110 SHA.size R1H,dest */
1817 dc = decode_dest23 (ddd, dd, w+1);
1818 a = sign_ext (get_reg (r1h), 8);
1819 shift_op (dc, 1, a, 1);
1821 /** 1100 ddd0 dd01 0001 SHA.L R1H,dest */
1824 dc = decode_dest23 (ddd, dd, 4);
1825 a = sign_ext (get_reg (r1h), 8);
1826 shift_op (dc, 1, a, 1);
1828 /** 1100 ddd0 dd10 0001 SHANC.L #IMM,dest */
1832 dc = decode_dest23 (ddd, dd, 4);
1833 imm = sign_ext (IMM(1), 8);
1834 shift_op (dc, 1, imm, 0);
1836 /** 1110 ddd w dd00 immm SHL.size #IMM, dest */
1839 dc = decode_dest23 (ddd, dd, w+1);
1840 shift_op (dc, 0, IMM4(), 1);
1842 /** 1001 ddd0 dd10 0001 SHL.L #IMM, dest */
1845 dc = decode_dest23 (ddd, dd, 4);
1846 imm = sign_ext (IMM(1), 8);
1847 shift_op (dc, 0, imm, 1);
1849 /** 1010 ddd w dd11 1110 SHL.size R1H,dest */
1852 dc = decode_dest23 (ddd, dd, w+1);
1853 a = sign_ext (get_reg (r1h), 8);
1854 shift_op (dc, 0, a, 1);
1856 /** 1100 ddd0 dd00 0001 SHL.L R1H,dest */
1859 dc = decode_dest23 (ddd, dd, 4);
1860 a = sign_ext (get_reg (r1h), 8);
1861 shift_op (dc, 0, a, 1);
1863 /** 1000 ddd0 dd10 0001 SHLNC.L #IMM,dest */
1867 dc = decode_dest23 (ddd, dd, 4);
1868 imm = sign_ext (IMM(1), 8);
1869 shift_op (dc, 0, imm, 0);
1871 /** 1011 0010 100w 0011 SIN.size */
1879 mem_put_hi(a, mem_get_hi (v));
1881 mem_put_qi(a, mem_get_qi (v));
1889 /** 1011 0110 100w 0011 SMOVB.size */
1897 mem_put_hi(a, mem_get_hi (v));
1899 mem_put_qi(a, mem_get_qi (v));
1908 /** 1011 0000 100w 0011 SMOVF.size */
1916 mem_put_hi(a, mem_get_hi (v));
1918 mem_put_qi(a, mem_get_qi (v));
1927 /** 1011 1000 100w 0011 SMOVU.size */
1934 mem_put_hi(a, (t0 = mem_get_hi (v)));
1936 mem_put_qi(a, (t0 = mem_get_qi (v)));
1940 || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0)))
1946 /** 1011 0100 100w 0011 SOUT.size */
1954 mem_put_hi(a, mem_get_hi (v));
1956 mem_put_qi(a, mem_get_qi (v));
1964 /** 1011 1000 000w 0011 SSTR.size */
1968 v = get_reg (w ? r0 : r0l);
1981 /** 0000 0001 1101 ddd1 dd01 0src STC src,dest */
1984 dc = decode_dest23 (ddd, dd, 4);
1985 sc = decode_cr_b (src, CR_B_DMA0);
1989 /** 0000 0001 1101 ddd1 dd01 1src STC src,dest */
1992 dc = decode_dest23 (ddd, dd, 2);
1993 sc = decode_cr_b (src, CR_B_DCT0);
1997 /** 1101 ddd1 dd01 0src STC src,dest */
2000 dc = decode_dest23 (ddd, dd, 4);
2001 sc = decode_cr_b (src, CR_B_INTB);
2005 /** 1011 0110 1101 0011 STCX abs16,abs24 */
2009 /** 1001 ddd w dd01 1111 STNZ.size #IMM,dest */
2012 dc = decode_dest23 (ddd, dd, w+1);
2017 /** 1001 ddd w dd00 1111 STZ.size #IMM,dest */
2020 dc = decode_dest23 (ddd, dd, w+1);
2025 /** 1001 ddd w dd11 1111 STZX.size #IMM1,#IMM2,dest */
2028 dc = decode_dest23 (ddd, dd, w+1);
2036 /** 1000 ddd w dd11 1110 SUB.size:G #IMM,dest */
2039 dc = decode_dest23(ddd, dd, w+1);
2041 MATH_OP (dc, imm, 0, -);
2043 /** 1001 ddd0 dd11 0001 SUB.L:G #IMM,dest */
2046 dc = decode_dest23(ddd, dd, 4);
2048 MATH_OP (dc, imm, 0, -);
2050 /** 00dd 111w SUB.size:S #IMM,dest */
2053 dc = decode_dest2(dd, w+1);
2055 MATH_OP (dc, imm, 0, -);
2057 /** 1sss ddd w dd ss 1010 SUB.size:G src,dest */
2060 sc = decode_src23(sss, ss, w+1);
2061 dc = decode_dest23(ddd, dd, w+1);
2063 MATH_OP (dc, b, 0, -);
2065 /** 1sss ddd1 dd ss 0000 SUB.L:G src,dest */
2068 sc = decode_src23(sss, ss, 4);
2069 dc = decode_dest23(ddd, dd, 4);
2071 MATH_OP (dc, b, 0, -);
2073 /** 1001 ddd0 dd01 0001 SUBX #IMM,dest */
2076 dc = decode_dest23(ddd, dd, 4);
2077 imm = sign_ext (IMM(1), 8);
2078 MATH_OP (dc, imm, 0, -);
2080 /** 1sss ddd0 dd ss 0000 SUBX src,dest */
2083 sc = decode_src23(sss, ss, 1);
2084 dc = decode_dest23(ddd, dd, 4);
2085 b = sign_ext (get_src (sc), 8);
2086 MATH_OP (dc, b, 0, -);
2088 /** 1001 ddd w dd11 1110 TST.size:G #IMM,dest */
2091 dc = decode_dest23 (ddd, dd, w+1);
2097 /** 00dd 110w TST.size:S #IMM,dest */
2100 dc = decode_dest2 (dd, w+1);
2106 /** 0000 0001 1sss ddd w dd ss 1001 TST.size:G src,dest */
2109 sc = decode_src23 (sss, ss, w+1);
2110 dc = decode_dest23 (ddd, dd, w+1);
2116 /** 1111 1111 UND */
2118 trigger_fixed_interrupt (0xffffdc);
2120 /** 1011 0010 0000 0011 WAIT */
2124 /** 1101 ddd w dd00 1src XCHG.size src,dest */
2126 dc = decode_dest23 (ddd, dd, w+1);
2127 sc = decode_src3 (src, w+1);
2133 /** 1001 ddd w dd00 1110 XOR.size #IMM,dest */
2136 dc = decode_dest23(ddd, dd, w+1);
2138 LOGIC_OP (dc, imm, ^);
2140 /** 1sss ddd w dd ss 1001 XOR.size src,dest */
2143 sc = decode_src23(sss, ss, w+1);
2144 dc = decode_dest23(ddd, dd, w+1);
2146 LOGIC_OP (dc, b, ^);