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