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