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