Synchronize sourceware version of the libiberty sources with the master gcc versions.
[binutils-gdb.git] / sim / m32c / m32c.opc
blob02c894d216b0b3b1ab20b4969742d125151ea4f2
1 /* m32c.opc --- semantics for m32c opcodes.                     -*- mode: c -*-
3 Copyright (C) 2005-2023 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/>.  */
21 /* This must come before any other includes.  */
22 #include "defs.h"
24 #include <stdio.h>
25 #include <stdlib.h>
27 #include "ansidecl.h"
28 #include "cpu.h"
29 #include "mem.h"
30 #include "misc.h"
31 #include "int.h"
33 #define tprintf if (trace) printf
35 static unsigned char
36 getbyte (void)
38   int tsave = trace;
39   unsigned char b;
41   if (trace == 1)
42     trace = 0;
43   b = mem_get_pc ();
44   regs.r_pc ++;
45   trace = tsave;
46   return b;
49 #define M32C_ONLY() /* FIXME: add something here */
51 #define GETBYTE() (op[opi++] = getbyte())
53 #define UNSUPPORTED() unsupported("unsupported", m32c_opcode_pc)
54 #define NOTYET() unsupported("unimplemented", m32c_opcode_pc)
56 static void
57 unsupported (char *tag, int orig_pc)
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);
80 static int
81 IMM(int bytes)
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;
103 #define IMM4() (immm >= 8 ? 7 - immm : immm + 1)
105 #define NO_PREFIX() PREFIX(0,0,0)
107 /* Indicate which sorts of prefixes are allowed for the current
108    opcode.  */
109 static void
110 prefix (int src_allowed, int dest_allowed, int index_bytewidth)
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.  */
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); \
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); \
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);
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);
158 #define carry (FLAG_C ? 1 : 0)
160 static void
161 cmp (int d, int s, int bytes)
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);
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;
179   set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f);
182 static void
183 dadd_op (int ddd, int dd, int sss, int ss, int imm, int add, int cy, int w)
185   srcdest sc, dc;
186   int a, b=0, res;
188   prefix (0, 0, 0);
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);
200   a = bcd2int(a, w);
201   b = bcd2int(b, w);
203   tprintf("decimal: %d %s %d", a, add?"+":"-", b);
204   if (cy)
205     tprintf(" c=%d", carry);
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     }
224   res = int2bcd (res, w);
225   tprintf(" = %x\n", res);
227   set_szc (res, w+1, cy);
229   put_dest (dc, res);
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)
234 static void
235 div_op (int sss, int ss, int u, int x, int bytes)
237   srcdest sc;
238   int s, v, a, b;
240   if (sss == -1)
241     s = IMM(bytes);
242   else
243     {
244       sc = decode_dest23 (sss, ss, bytes);
245       s = get_src (sc);
246     }
248   v = get_reg (bytes > 1 ? r2r0 : r0);
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     }
257   if (s == 0)
258     {
259       set_flags (FLAGBIT_O, FLAGBIT_O);
260       return;
261     }
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);
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     }
306 static void
307 index_op (int sss, int ss, int do_s, int do_d, int scale, int w)
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);
314 #define INDEXOP(scale,do_s,do_d)                                \
315   index_op (sss, ss, do_s, do_d, scale, w); goto next_opcode
317 static void
318 rot_op (srcdest sd, int rotc, int count)
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;
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);
350 static void
351 shift_op (srcdest sd, int arith, int count, int setc)
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;
359   if (sd.bytes == 4)
360     {
361       mask = 0xffffffffU;
362       msb = 0x80000000U;
363     }
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);
394 static int pcs[16];
395 static int ipcs = 0;
398 decode_m32c (void)
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;
410   step_result = M32C_MAKE_STEPPED ();
412   decode_indirect (0, 0);
413   decode_index (0, 0);
415 next_opcode:
416   opi = 0;
417   m32c_opcode_pc = get_reg (pc);
419   tprintf("trace: decode pc = %06x\n", m32c_opcode_pc);
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;
432   /** VARY sss 000 001 010 011 100 */
433   /** VARY ddd 000 001 010 011 100 */
435   /** 0000 1001                         indirect dest */
437   decode_indirect (0, 1);
438   goto next_opcode;
440   /** 0100 0001                         indirect src */
442   decode_indirect (1, 0);
443   goto next_opcode;
445   /** 0100 1001                         indirect src and dest */
447   decode_indirect (1, 1);
448   goto next_opcode;
450   /** 1010 ddd w dd01 1111              ABS.size dest */
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);
460   /** 0000 0001 1000 ddd w dd10 1110    ADC.size #IMM,dest */
462   prefix (0, 0, 0);
463   dc = decode_dest23 (ddd, dd, w+1);
464   imm = IMM (w+1);
465   MATH_OP (dc, imm, carry, +);
467   /** 0000 0001 1sss ddd w dd ss 0100   ADC.size src,dest */
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, +);
475   /** 1011 ddd w dd01 1110              ADCF.size dest */
477   prefix (0, 1, 0);
478   dc = decode_dest23 (ddd, dd, w+1);
479   MATH_OP (dc, 0, carry, +);
481   /** 1000 ddd w dd10 1110              ADD.size:G #IMM,dest */
483   prefix (0, 1, 0);
484   dc = decode_dest23(ddd, dd, w+1);
485   imm = IMM(w+1);
486   MATH_OP (dc, imm, 0, +);
488   /** 1000 ddd0 dd11 0001               ADD.L:G #IMM,dest */
490   prefix (0, 1, 0);
491   dc = decode_dest23(ddd, dd, 4);
492   imm = IMM(4);
493   MATH_OP (dc, imm, 0, +);
495   /** 111L ddd w dd11 immm              ADD.size:Q #IMM,dest */
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, +);
502   /** 00dd 011w                         ADD.size:S #IMM,dest */
504   prefix (0, 1, 0);
505   dc = decode_dest2(dd, w+1);
506   imm = IMM (w+1);
507   MATH_OP (dc, imm, 0, +);
509   /** 10i0 110d                         ADD.L:S #IMM,A0/A1 */
511   prefix (0, 0, 0);
512   dc = reg_sd (d ? a1 : a0);
513   imm = i ? 2 : 1;
514   MATH_OP (dc, imm, 0, +);
516   /** 1sss ddd w dd ss 1000             ADD.size:G src,dest */
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, +);
524   /** 1sss ddd1 dd ss 0010              ADD.L:G src,dest */
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, +);
532   /** 1011 0110 0001 0011               ADD.L:G #IMM16,SP */
534   prefix (0, 0, 0);
535   dc = reg_sd (sp);
536   b = sign_ext (IMM(2), 16);
537   MATH_OP (dc, b, 0, +);
539   /** 01ii 001i                         ADD.L:Q #IMM3,SP */
541   prefix (0, 0, 0);
542   dc = reg_sd (sp);
543   b = ii * 2 + i + 1;
544   MATH_OP (dc, b, 0, +);
546   /** 1011 0110 0000 0011               ADD.L:S #IMM8,SP */
548   prefix (0, 0, 0);
549   dc = reg_sd (sp);
550   b = sign_ext (IMM(1), 8);
551   MATH_OP (dc, b, 0, +);
553   /** 1000 ddd0 dd01 0001               ADDX #IMM,dest */
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, +);
560   /** 1sss ddd0 dd ss 0010              ADDX src,dest */
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, +);
568   /** 1111 ddd w dd01 immm              ADJNZ.size #IMM,dest,label */
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     }
585   /** 1000 ddd w dd11 1111              AND.size:G #IMM,dest */
587   prefix (0, 1, 0);
588   dc = decode_dest23(ddd, dd, w+1);
589   imm = IMM(w+1);
590   LOGIC_OP (dc, imm, &);
592   /** 01dd 110w                         AND.size:S #IMM,dest */
594   prefix (0, 1, 0);
595   dc = decode_dest2(dd, w+1);
596   imm = IMM (w+1);
597   LOGIC_OP (dc, imm, &);
599   /** 1sss ddd w dd ss 1101             AND.size:G src,dest */
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, &);
607   /** 0000 0001 1101 sss0 ss00 1bit     BAND src */
609   sc = decode_src23 (sss, ss, 1);
610   BIT_OPC (sc, bit, b & carry);
612   /** 1101 ddd0 dd11 0bit               BCLR dest */
614   dc = decode_dest23 (ddd, dd, 1);
615   BIT_OP (dc, bit, 0);
617   /** 1100 ddd w dd10 1110              BITINDEX.size src */
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;
625   /** 1101 ddd0 dd01 0bit               BMcnd dest */
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);
634   /** 1101 1001 0c10 1cnd               BMcnd C */
636   prefix (0, 0, 0);
637   if (condition_true (c * 8 + cnd))
638     set_c (1);
639   else
640     set_c (0);
642   /** 0000 0001 1101 sss0 ss01 1bit     BNAND src */
644   prefix (0, 0, 0);
645   sc = decode_src23 (sss, ss, 1);
646   BIT_OPC (sc, bit, (!b) & carry);
648   /** 0000 0001 1101 sss0 ss11 0bit     BNOR src */
650   prefix (0, 0, 0);
651   sc = decode_src23 (sss, ss, 1);
652   BIT_OPC (sc, bit, (!b) | carry);
654   /** 1101 ddd0 dd01 1bit               BNOT dest */
656   prefix (0, 0, 0);
657   dc = decode_dest23 (ddd, dd, 1);
658   BIT_OP (dc, bit, !b);
660   /** 0000 0001 1101 sss0 ss00 0bit     BNTST src */
662   prefix (0, 0, 0);
663   sc = decode_dest23 (sss, ss, 1);
664   b = get_bit2 (sc, bit);
665   set_zc (!b, !b);
667   /** 0000 0001 1101 sss0 ss11 1bit     BNXOR src */
669   prefix (0, 0, 0);
670   sc = decode_src23 (sss, ss, 1);
671   BIT_OPC (sc, bit, !b ^ carry);
673   /** 0000 0001 1101 sss0 ss10 0bit     BOR src */
675   prefix (0, 0, 0);
676   sc = decode_src23 (sss, ss, 1);
677   BIT_OPC (sc, bit, b | carry);
679   /** 0000 0000                         BRK */
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);
693   /** 1111 1110                         GBRK */
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.  */
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 ();
708   /** 0000 1000                         BRK2 */
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);
719   /** 1101 ddd0 dd11 1bit               BSET dest */
721   dc = decode_dest23 (ddd, dd, 1);
722   BIT_OP (dc, bit, 1);
724   /** 1101 sss0 ss00 0bit               BTST:G src */
726   prefix (0, 0, 0);
727   sc = decode_src23 (sss, ss, 1);
728   b = get_bit2 (sc, bit);
729   set_zc (!b, b);
731   /** 00bb 101bit                       BTST:S src */
733   sc = decode_src23 (3, 3, 1); /* bit,base:19 */
734   bit = get_bit2 (sc, bb*2 + bit);
735   set_zc (!bit, bit);
737   /** 1101 ddd0 dd10 0bit               BTSTC dest */
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);
745   /** 1101 ddd0 dd10 1bit               BTSTS dest */
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);
753   /** 0000 0001 1101 sss0 ss10 1bit     BXOR src */
755   prefix (0, 0, 0);
756   sc = decode_src23 (sss, ss, 1);
757   BIT_OPC (sc, bit, b ^ carry);
759   /** 0000 0001 1000 ddd w dd11 1110    CLIP.size #IMM1,#IMM2,dest */
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);
774   /** 1001 ddd w dd10 1110              CMP.size:G #IMM,dest */
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);
782   /** 1010 ddd0 dd11 0001               CMP.L:G #IMM32,dest */
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);
790   /** 1110 ddd w dd01 immm              CMP.size:Q #IMM,dest */
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);
798   /** 01dd 011w                         CMP.size:S #IMM,dest */
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);
806   /** 1sss ddd w dd ss 0110             CMP.size:G src,dest */
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);
815   /** 1sss ddd1 dd ss 0001              CMP.L:G src,dest */
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);
824   /** 01dd 000w                         CMP.size:S src,R0/R0L */
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);
832   /** 1010 ddd0 dd01 0001               CMPX #IMM,dest */
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);
840   /** 0000 0001 1000 ddd w dd00 1110    DADC.size #IMM,dest */
842   DADDI(1,1);
844   /** 0000 0001 1sss ddd w dd ss 1000   DADC.size src,dest */
846   DADDV(1,1);
848   /** 0000 0001 1000 ddd w dd01 1110    DADD.size #IMM,dest */
850   DADDI(1,0);
852   /** 0000 0001 1sss ddd w dd ss 0000   DADD.size src,dest */
854   DADDV(1,0);
856   /** 1011 ddd w dd00 1110              DEC.size dest */
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);
866   /** 1011 0000 010w 0011               DIV.size #IMM */
868   prefix (0, 0, 0);
869   div_op (-1, 0, 0, 0, w+1);
871   /** 1000 sss w ss01 1110              DIV.size src */
873   prefix (0, 1, 0);
874   div_op (sss, ss, 0, 0, w+1);
876   /** 0000 0001 1010 sss1 ss01 1111     DIV.L src */
878   M32C_ONLY();
879   prefix (0, 0, 0);
880   div_op (sss, ss, 0, 0, 4);
882   /** 1011 0000 000w 0011               DIVU.size #IMM */
884   prefix (0, 0, 0);
885   div_op (-1, 0, 1, 0, w+1);
887   /** 1000 sss w ss00 1110              DIVU.size src */
889   prefix (0, 1, 0);
890   div_op (sss, ss, 1, 0, w+1);
892   /** 0000 0001 1010 sss1 ss00 1111     DIVU.L src */
894   M32C_ONLY();
895   prefix (0, 0, 0);
896   div_op (sss, ss, 1, 0, 4);
898   /** 1011 0010 010w 0011               DIVX.size #IMM */
900   prefix (0, 0, 0);
901   div_op (-1, 0, 0, 1, w+1);
903   /** 1001 sss w ss01 1110              DIVX.size src */
905   prefix (0, 1, 0);
906   div_op (sss, ss, 0, 1, w+1);
908   /** 0000 0001 1010 sss1 ss10 1111     DIVX.L src */
910   M32C_ONLY();
911   prefix (0, 0, 0);
912   div_op (sss, ss, 0, 1, 4);
914   /** 0000 0001 1001 ddd w dd00 1110    DSBB.size #IMM,dest */
916   DADDI(0,1);
918   /** 0000 0001 1sss ddd w dd ss 1010   DSBB.size src,dest */
920   DADDV(0,1);
922   /** 0000 0001 1001 ddd w dd01 1110    DSUB.size #IMM,dest */
924   DADDI(0,0);
926   /** 0000 0001 1sss ddd w dd ss 0010   DSUB.size src,dest */
928   DADDV(0,0);
930   /** 1110 1100                         ENTER #IMM */
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);
938   /** 1111 1100                         EXITD */
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);
946   /** 1100 ddd w dd01 1110              EXTS.size dest */
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);
955   /** 0000 0001 1sss ddd0 dd ss 0111    EXTS.B src,dest */
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);
964   /** 0000 0001 1sss ddd0 dd ss 1011    EXTZ src,dest */
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);
973   /** 1101 0011 1110 1dst               FCLR dest */
975   set_flags (1 << dst, 0);
977   /** 1001 1111                         FREIT */
979   NOTYET();
981   /** 1101 0001 1110 1dst               FSET dest */
982   
983   set_flags (1 << dst, 1 << dst);
985   /** 1010 ddd w dd00 1110              INC.size dest */
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);
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);
1014   /** 1011 1110 vector00                        INT #IMM */
1016   prefix (0, 0, 0);
1017   trigger_based_interrupt (vector);
1019   /** 1011 1111                         INTO */
1021   prefix (0, 0, 0);
1022   if (FLAG_O)
1023     trigger_fixed_interrupt (0xffffe0);
1025   /** 1ccc 101c                         Jcnd label */
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);
1032   /** 01dd 101d                         JMP.S label */
1034   prefix (0, 0, 0);
1035   put_reg (pc, m32c_opcode_pc + (dd*2+d) + 2);
1037   /** 1011 1011                         JMP.B label */
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);
1049   /** 1100 1110                         JMP.W label */
1051   prefix (0, 0, 0);
1052   imm = sign_ext (IMM(2), 16);
1053   put_reg (pc, m32c_opcode_pc + 1 + imm);
1055   /** 1100 1100                         JMP.A label */
1056   
1057   prefix (0, 0, 0);
1058   imm = IMM(3);
1059   put_reg (pc, imm);
1061   /** 1100 sss1 ss00 1111               JMPI.W src */
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);
1069   /** 1000 sss0 ss00 0001               JMPI.A src */
1071   prefix (0, 0, 0);
1072   sc = decode_src23 (sss, ss, 3);
1073   a = get_src (sc);
1074   put_reg (pc, a);
1076   /** 1101 1100                         JMPS #IMM8 */
1078   prefix (0, 0, 0);
1079   imm = IMM(1);
1080   a = 0xff0000 + mem_get_hi (0xfffe00 - imm * 2);
1081   put_reg (pc, a);
1083   /** 1100 1111                         JSR.W label */
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);
1091   /** 1100 1101                         JSR.A label */
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);
1099   /** 1100 sss1 ss01 1111               JSRI.W src */
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);
1109   /** 1001 sss0 ss00 0001               JSRI.A src */
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);
1118   /** 1101 1101                         JSRS #IMM8 */
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);
1127   /** 1101 0101 1010 1dst               LDC #IMM16,dest */
1129   imm = IMM(2);
1130   dc = decode_cr_b (dst, CR_B_DCT0);
1131   put_dest (dc, imm);
1133   /** 1101 0101 0010 1dst               LDC #IMM24,dest */
1135   imm = IMM(3);
1136   dc = decode_cr_b (dst, CR_B_INTB);
1137   put_dest (dc, imm);
1139   /** 1101 0101 0110 1dst               LDC #IMM24,dest */
1141   imm = IMM(3);
1142   dc = decode_cr_b (dst, CR_B_DMA0);
1143   put_dest (dc, imm);
1145   /** 0000 0001 1101 sss1 ss00 1dst     LDC src,dest */
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);
1153   /** 1101 sss1 ss00 0dst               LDC src,dest */
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);
1161   /** 0000 0001 1101 sss1 ss00 0dst     LDC src,dest */
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);
1169   /** 1011 0110 1100 0011               LDCTX */
1171   NOTYET();
1173   /** 1101 0101 1110 1flg               LDIPL #IMM */
1175   set_flags (0x7000, flg*0x1000);
1177   /** 0000 0001 1000 ddd w dd11 1111    MAX.size #IMM,dest */
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);
1188   /** 0000 0001 1sss ddd w dd ss 1101   MAX.size src,dest */
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);
1200   /** 0000 0001 1000 ddd w dd10 1111    MIN.size #IMM,dest */
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);
1211   /** 0000 0001 1sss ddd w dd ss 1100   MIN.size src,dest */
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);
1223   /** 1001 ddd w dd10 1111              MOV.size:G #IMM,dest */
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);
1232   /** 1011 ddd0 dd11 0001               MOV.L:G #IMM,dest */
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);
1241   /** 1111 ddd w dd10 immm              MOV.size:Q #IMM4,dest */
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);
1250   /** 00dd 010w                         MOV.size:S #IMM,dest */
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);
1258   /** 10w1 110d                         MOV.size:S #IMM,a0/a1 */
1260   imm = IMM(w ? 3 : 2);
1261   put_reg (d ? a1 : a0, imm);
1262   set_sz (imm & addr_mask, w+1);
1264   /** 00dd 001w                         MOV.size:Z #0,dest */
1266   prefix (0, 1, 0);
1267   dc = decode_dest2 (dd, w+1);
1268   put_dest (dc, 0);
1269   set_sz (0, w+1);
1271   /** 1sss ddd w dd ss 1011             MOV.size:G src,dest */
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);
1280   /** 1sss ddd1 dd ss 0011              MOV.L:G src,dest */
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);
1289   /** VARY SS 01 10 11 */
1290   /** 00SS 100w                         MOV.size:S src,R0L/R0 */
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);
1298   /** 01ss 111w                         MOV.size:S src,R1L/R1 */
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);
1306   /** VARY DD 01 10 11 */
1307   /** 00DD 000w                         MOV.size:S R0L/R0,dest */
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);
1315   /** 01ss 100d                         MOV.L:S src,A0/A1 */
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);
1323   /** 1011 ddd w dd00 1111              MOV.size:G dsp:8[SP], dest */
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);
1337   /** 1010 sss w ss00 1111              MOV.size:G src,dsp:8[SP] */
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);
1351   /** 1101 sss1 ss01 1dst               MOVA src,dest */
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   }
1362   /** 0000 0001 1011 ddd0 dd hl 1110    MOVdir R0L,dest */
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);
1377   /** 0000 0001 1010 sss0 ss hl 1110    MOVdir src,R0L */
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);
1392   /** 1011 ddd0 dd01 0001               MOVX #IMM,dest */
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);
1400   /** 1000 ddd w dd01 1111              MUL.size #IMM,dest */
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);
1412   /** 1sss ddd w dd ss 1100             MUL.size src,dest */
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);
1425   /** 0000 0001 1000 sss1 ss01 1111     MUL.L src,R2R0 */
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);
1440   /** 1100 sss1 ss11 1110               MULEX src */
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));
1451   /** 1000 ddd w dd00 1111              MULU.size #IMM,dest */
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);
1463   /** 1sss ddd w dd ss 0100             MULU.size src,dest */
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);
1476   /** 0000 0001 1000 sss1 ss00 1111     MULU.L src,R2R0 */
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);
1491   /** 1010 ddd w dd10 1111              NEG.size dest */
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);
1501   /** 1101 1110                         NOP */
1503   tprintf("nop\n");
1505   /** 1010 ddd w dd01 1110              NOT.size dest */
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);
1515   /** 1000 ddd w dd10 1111              OR.size:G #IMM,dest */
1517   prefix (0, 1, 0);
1518   dc = decode_dest23(ddd, dd, w+1);
1519   imm = IMM(w+1);
1520   LOGIC_OP (dc, imm, |);
1522   /** 01dd 010w                         OR.size:S #IMM,dest */
1524   prefix (0, 1, 0);
1525   dc = decode_dest2(dd, w+1);
1526   imm = IMM (w+1);
1527   LOGIC_OP (dc, imm, |);
1529   /** 1sss ddd w dd ss 0101             OR.size:G src,dest */
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, |);
1537   /** 1011 ddd w dd10 1111              POP.size dest */
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);
1549   /** 1101 0011 1010 1dst               POPC dest */
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);
1558   /** 1101 0011 0010 1dst               POPC dest */
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);
1567   /** 1000 1110                         POPM dest */
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   }
1590   /** 1010 111w                         PUSH.size #IMM */
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);
1602   /** 1100 sss w ss00 1110              PUSH.size src */
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);
1614   /** 1011 0110 0101 0011               PUSH.L #IMM32 */
1616   imm = IMM(4);
1617   put_reg (sp, get_reg (sp) - 4);
1618   mem_put_si (get_reg (sp), imm);
1620   /** 1010 sss0 ss00 0001               PUSH.L src */
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);
1628   /** 1011 0sa0 ss00 0001               PUSHA src */
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);
1636   /** 1101 0001 1010 1src               PUSHC src */
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);
1645   /** 1101 0001 0010 1src               PUSHC src */
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);
1654   /** 1000 1111                         PUSHM src */
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   }
1676   /** 1001 1110                         REIT */
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);
1685   /** 1011 1000 010w 0011               RMPA.size */
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;
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   }
1719   /** 1011 ddd w dd10 1110              ROLC.size dest */
1721   prefix (0, 1, 0);
1722   dc = decode_dest23 (ddd, dd, w+1);
1723   rot_op (dc, 1, 1);
1725   /** 1010 ddd w dd10 1110              RORC.size dest */
1727   prefix (0, 1, 0);
1728   dc = decode_dest23 (ddd, dd, w+1);
1729   rot_op (dc, 1, -1);
1731   /** 1110 ddd w dd10 immm              ROT.size #IMM, dest */
1733   prefix (0, 1, 0);
1734   dc = decode_dest23 (ddd, dd, w+1);
1735   rot_op (dc, IMM4(), -1);
1737   /** 1010 ddd w dd11 1111              ROT.size R1H,dest */
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);
1744   /** 1101 1111                         RTS */
1746   put_reg (pc, mem_get_si (get_reg (sp)));
1747   put_reg (sp, get_reg (sp) + 4);
1749   /** 0000 0001 1001 ddd w dd10 1110    SBB.size #IMM, dest */
1751   prefix (0, 0, 0);
1752   dc = decode_dest23 (ddd, dd, w+1);
1753   imm = IMM (w+1);
1754   MATH_OP (dc, imm, !carry, -);
1756   /** 0000 0001 1sss ddd w dd ss 0110   SBB.size src,dest */
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, -);
1763   /** 1101 ddd1 dd11 cond               SCcond dest */
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);
1772   /** 1011 1000 110w 0011               SCMPU.size */
1774   ta0 = get_reg (a0);
1775   ta1 = get_reg (a1);
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);
1791       ta0 += w ? 2 : 1;
1792       ta1 += w ? 2 : 1;
1794       if (t0 == 0 || t0 != t2)
1795         break;
1796       if (w && (t1 == 0 || t1 != t3))
1797         break;
1798     }
1800   /** 1111 ddd w dd00 immm              SHA.size #IMM,dest */
1802   prefix (0, 1, 0);
1803   dc = decode_dest23 (ddd, dd, w+1);
1804   shift_op (dc, 1, IMM4(), 1);
1806   /** 1010 ddd0 dd10 0001               SHA.L #IMM,dest */
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);
1813   /** 1011 ddd w dd11 1110              SHA.size R1H,dest */
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);
1820   /** 1100 ddd0 dd01 0001               SHA.L   R1H,dest */
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);
1827   /** 1100 ddd0 dd10 0001               SHANC.L #IMM,dest */
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);
1835   /** 1110 ddd w dd00 immm              SHL.size #IMM, dest */
1837   prefix (0, 1, 0);
1838   dc = decode_dest23 (ddd, dd, w+1);
1839   shift_op (dc, 0, IMM4(), 1);
1841   /** 1001 ddd0 dd10 0001               SHL.L #IMM, dest */
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);
1848   /** 1010 ddd w dd11 1110              SHL.size R1H,dest */
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);
1855   /** 1100 ddd0 dd00 0001               SHL.L R1H,dest */
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);
1862   /** 1000 ddd0 dd10 0001               SHLNC.L #IMM,dest */
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);
1870   /** 1011 0010 100w 0011               SIN.size */
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);
1888   /** 1011 0110 100w 0011               SMOVB.size */
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);
1907   /** 1011 0000 100w 0011               SMOVF.size */
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);
1926   /** 1011 1000 100w 0011               SMOVU.size */
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);
1945   /** 1011 0100 100w 0011               SOUT.size */
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);
1963   /** 1011 1000 000w 0011               SSTR.size */
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);
1980   /** 0000 0001 1101 ddd1 dd01 0src     STC src,dest */
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);
1988   /** 0000 0001 1101 ddd1 dd01 1src     STC src,dest */
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);
1996   /** 1101 ddd1 dd01 0src               STC src,dest */
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);
2004   /** 1011 0110 1101 0011               STCX abs16,abs24 */
2006   NOTYET();
2008   /** 1001 ddd w dd01 1111              STNZ.size #IMM,dest */
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);
2016   /** 1001 ddd w dd00 1111              STZ.size #IMM,dest */
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);
2024   /** 1001 ddd w dd11 1111              STZX.size #IMM1,#IMM2,dest */
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);
2035   /** 1000 ddd w dd11 1110              SUB.size:G #IMM,dest */
2037   prefix (0, 1, 0);
2038   dc = decode_dest23(ddd, dd, w+1);
2039   imm = IMM(w+1);
2040   MATH_OP (dc, imm, 0, -);
2042   /** 1001 ddd0 dd11 0001               SUB.L:G #IMM,dest */
2044   prefix (0, 1, 0);
2045   dc = decode_dest23(ddd, dd, 4);
2046   imm = IMM(4);
2047   MATH_OP (dc, imm, 0, -);
2049   /** 00dd 111w                         SUB.size:S #IMM,dest */
2051   prefix (0, 1, 0);
2052   dc = decode_dest2(dd, w+1);
2053   imm = IMM (w+1);
2054   MATH_OP (dc, imm, 0, -);
2056   /** 1sss ddd w dd ss 1010             SUB.size:G src,dest */
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, -);
2064   /** 1sss ddd1 dd ss 0000              SUB.L:G src,dest */
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, -);
2072   /** 1001 ddd0 dd01 0001               SUBX #IMM,dest */
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, -);
2079   /** 1sss ddd0 dd ss 0000              SUBX src,dest */
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, -);
2087   /** 1001 ddd w dd11 1110              TST.size:G #IMM,dest */
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);
2096   /** 00dd 110w                         TST.size:S #IMM,dest */
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);
2105   /** 0000 0001 1sss ddd w dd ss 1001   TST.size:G src,dest */
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);
2115   /** 1111 1111                         UND */
2117   trigger_fixed_interrupt (0xffffdc);
2119   /** 1011 0010 0000 0011               WAIT */
2121   ;
2123   /** 1101 ddd w dd00 1src              XCHG.size src,dest */
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);
2132   /** 1001 ddd w dd00 1110              XOR.size #IMM,dest */
2134   prefix (0, 1, 0);
2135   dc = decode_dest23(ddd, dd, w+1);
2136   imm = IMM(w+1);
2137   LOGIC_OP (dc, imm, ^);
2139   /** 1sss ddd w dd ss 1001             XOR.size src,dest */
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, ^);
2147 /** */
2149   return step_result;