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