Home | History | Annotate | Line # | Download | only in m32c
m32c.opc revision 1.1.1.11
      1 /* m32c.opc --- semantics for m32c opcodes.		        -*- mode: c -*-
      2 
      3 Copyright (C) 2005-2024 Free Software Foundation, Inc.
      4 Contributed by Red Hat, Inc.
      5 
      6 This file is part of the GNU simulators.
      7 
      8 This program is free software; you can redistribute it and/or modify
      9 it under the terms of the GNU General Public License as published by
     10 the Free Software Foundation; either version 3 of the License, or
     11 (at your option) any later version.
     12 
     13 This program is distributed in the hope that it will be useful,
     14 but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 GNU General Public License for more details.
     17 
     18 You should have received a copy of the GNU General Public License
     19 along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     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 
     35 static unsigned char
     36 getbyte (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 
     56 static void
     57 unsupported (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 
     80 static int
     81 IMM(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.  */
    109 static void
    110 prefix (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 
    160 static void
    161 cmp (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 
    182 static void
    183 dadd_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 
    234 static void
    235 div_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 
    306 static void
    307 index_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 
    317 static void
    318 rot_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 
    350 static void
    351 shift_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 
    394 static int pcs[16];
    395 static int ipcs = 0;
    396 
    397 int
    398 decode_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 
    415 next_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