Home | History | Annotate | Line # | Download | only in m32c
      1       1.1  christos /* m32c.opc --- semantics for m32c opcodes.		        -*- mode: c -*-
      2       1.1  christos 
      3  1.1.1.12  christos Copyright (C) 2005-2025 Free Software Foundation, Inc.
      4       1.1  christos Contributed by Red Hat, Inc.
      5       1.1  christos 
      6       1.1  christos This file is part of the GNU simulators.
      7       1.1  christos 
      8       1.1  christos This program is free software; you can redistribute it and/or modify
      9       1.1  christos it under the terms of the GNU General Public License as published by
     10       1.1  christos the Free Software Foundation; either version 3 of the License, or
     11       1.1  christos (at your option) any later version.
     12       1.1  christos 
     13       1.1  christos This program is distributed in the hope that it will be useful,
     14       1.1  christos but WITHOUT ANY WARRANTY; without even the implied warranty of
     15       1.1  christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16       1.1  christos GNU General Public License for more details.
     17       1.1  christos 
     18       1.1  christos You should have received a copy of the GNU General Public License
     19       1.1  christos along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     20       1.1  christos 
     21  1.1.1.10  christos /* This must come before any other includes.  */
     22  1.1.1.10  christos #include "defs.h"
     23       1.1  christos 
     24       1.1  christos #include <stdio.h>
     25       1.1  christos #include <stdlib.h>
     26       1.1  christos 
     27  1.1.1.10  christos #include "ansidecl.h"
     28       1.1  christos #include "cpu.h"
     29       1.1  christos #include "mem.h"
     30       1.1  christos #include "misc.h"
     31       1.1  christos #include "int.h"
     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.1.5  christos getbyte (void)
     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.1.5  christos static void
    110   1.1.1.5  christos prefix (int src_allowed, int dest_allowed, int 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.1.5  christos decode_m32c (void)
    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.1.11  christos   /** 00bb 101bit			BTST:S src */
    732       1.1  christos 
    733       1.1  christos   sc = decode_src23 (3, 3, 1); /* bit,base:19 */
    734  1.1.1.11  christos   bit = get_bit2 (sc, bb*2 + bit);
    735  1.1.1.11  christos   set_zc (!bit, bit);
    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.1.11  christos   /** 1101 0101 1110 1flg		LDIPL #IMM */
   1174       1.1  christos 
   1175  1.1.1.11  christos   set_flags (0x7000, flg*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.1.10  christos   {
   1354       1.1  christos   static reg_id map[8] = { r2r0, r3r1, a0, a1 };
   1355       1.1  christos   prefix (0, 0, 0);
   1356       1.1  christos   sc = decode_src23 (sss, ss, 1);
   1357       1.1  christos   if (!sc.mem || !map[dst])
   1358       1.1  christos     UNSUPPORTED();
   1359       1.1  christos   put_reg (map[dst], sc.u.addr);
   1360  1.1.1.10  christos   }
   1361       1.1  christos 
   1362       1.1  christos   /** 0000 0001 1011 ddd0 dd hl 1110	MOVdir R0L,dest */
   1363       1.1  christos 
   1364       1.1  christos   prefix (0, 0, 0);
   1365       1.1  christos   dc = decode_dest23 (ddd, dd, 1);
   1366       1.1  christos   a = get_src (dc);
   1367       1.1  christos   b = get_reg (r0l);
   1368       1.1  christos   switch (hl)
   1369       1.1  christos     {
   1370       1.1  christos     case 0: a = (a & 0xf0) | (b & 0x0f); break;
   1371       1.1  christos     case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
   1372       1.1  christos     case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
   1373       1.1  christos     case 3: a = (a & 0x0f) | (b & 0xf0); break;
   1374       1.1  christos     }
   1375       1.1  christos   put_dest (dc, a);
   1376       1.1  christos 
   1377       1.1  christos   /** 0000 0001 1010 sss0 ss hl 1110	MOVdir src,R0L */
   1378       1.1  christos 
   1379       1.1  christos   prefix (0, 0, 0);
   1380       1.1  christos   sc = decode_dest23 (sss, ss, 1);
   1381       1.1  christos   a = get_reg (r0l);
   1382       1.1  christos   b = get_src (dc);
   1383       1.1  christos   switch (hl)
   1384       1.1  christos     {
   1385       1.1  christos     case 0: a = (a & 0xf0) | (b & 0x0f); break;
   1386       1.1  christos     case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
   1387       1.1  christos     case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
   1388       1.1  christos     case 3: a = (a & 0x0f) | (b & 0xf0); break;
   1389       1.1  christos     }
   1390       1.1  christos   put_reg (r0l, a);
   1391       1.1  christos 
   1392       1.1  christos   /** 1011 ddd0 dd01 0001		MOVX #IMM,dest */
   1393       1.1  christos 
   1394       1.1  christos   prefix (0, 1, 0);
   1395       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1396       1.1  christos   imm = sign_ext (IMM(1), 8);
   1397       1.1  christos   put_dest (dc, imm);
   1398       1.1  christos   set_sz (imm, 1);
   1399       1.1  christos 
   1400       1.1  christos   /** 1000 ddd w dd01 1111		MUL.size #IMM,dest */
   1401       1.1  christos 
   1402       1.1  christos   prefix (0, 1, 0);
   1403       1.1  christos   w ++;
   1404       1.1  christos   dc = decode_dest23 (ddd, dd, w);
   1405       1.1  christos   v = sign_ext (get_src (dc), w*8);
   1406       1.1  christos   imm = sign_ext (IMM(w), w*8);
   1407       1.1  christos   tprintf("%d * %d = %d\n", v, imm, v*imm);
   1408       1.1  christos   v *= imm;
   1409       1.1  christos   dc = widen_sd (dc);
   1410       1.1  christos   put_dest (dc, v);
   1411       1.1  christos 
   1412       1.1  christos   /** 1sss ddd w dd ss 1100		MUL.size src,dest */
   1413       1.1  christos 
   1414       1.1  christos   prefix (1, 1, 0);
   1415       1.1  christos   w ++;
   1416       1.1  christos   sc = decode_src23 (sss, ss, w);
   1417       1.1  christos   dc = decode_dest23 (ddd, dd, w);
   1418       1.1  christos   a = sign_ext (get_src (sc), w*8);
   1419       1.1  christos   b = sign_ext (get_src (dc), w*8);
   1420       1.1  christos   tprintf("%d * %d = %d\n", a, b, a*b);
   1421       1.1  christos   v = a * b;
   1422       1.1  christos   dc = widen_sd (dc);
   1423       1.1  christos   put_dest (dc, v);
   1424       1.1  christos 
   1425       1.1  christos   /** 0000 0001 1000 sss1 ss01 1111	MUL.L src,R2R0 */
   1426       1.1  christos 
   1427       1.1  christos   M32C_ONLY();
   1428       1.1  christos   prefix (0, 0, 0);
   1429       1.1  christos   sc = decode_src23 (sss, ss, 4);
   1430       1.1  christos   a = sign_ext (get_src (sc), 32);
   1431       1.1  christos   b = sign_ext (get_reg (r2r0), 32);
   1432       1.1  christos   ll = (long long)a * (long long)b;
   1433       1.1  christos   tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
   1434       1.1  christos   if (ll < b2minsigned[4] || ll > b2maxsigned[4])
   1435       1.1  christos     set_flags (FLAGBIT_O, FLAGBIT_O);
   1436       1.1  christos   else
   1437       1.1  christos     set_flags (FLAGBIT_O, 0);
   1438       1.1  christos   put_reg (r2r0, (int)ll);
   1439       1.1  christos 
   1440       1.1  christos   /** 1100 sss1 ss11 1110		MULEX src */
   1441       1.1  christos 
   1442       1.1  christos   prefix (0, 1, 0);
   1443       1.1  christos   sc = decode_dest23 (sss, ss, 2);
   1444       1.1  christos   a = sign_ext (get_src (sc), 16);
   1445       1.1  christos   b = sign_ext (get_reg (r2r0), 32);
   1446       1.1  christos   ll = (long long)a * (long long)b;
   1447       1.1  christos   tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
   1448       1.1  christos   put_reg (r2r0, (int)ll);
   1449       1.1  christos   put_reg (r1, (int)(ll >> 32));
   1450       1.1  christos 
   1451       1.1  christos   /** 1000 ddd w dd00 1111		MULU.size #IMM,dest */
   1452       1.1  christos 
   1453       1.1  christos   prefix (0, 1, 0);
   1454       1.1  christos   w ++;
   1455       1.1  christos   dc = decode_dest23 (ddd, dd, w);
   1456       1.1  christos   v = get_src (dc);
   1457       1.1  christos   imm = IMM(w);
   1458       1.1  christos   tprintf("%d * %d = %d\n", v, imm, v*imm);
   1459       1.1  christos   v *= imm;
   1460       1.1  christos   dc = widen_sd (dc);
   1461       1.1  christos   put_dest (dc, v);
   1462       1.1  christos 
   1463       1.1  christos   /** 1sss ddd w dd ss 0100		MULU.size src,dest */
   1464       1.1  christos 
   1465       1.1  christos   prefix (1, 1, 0);
   1466       1.1  christos   w ++;
   1467       1.1  christos   sc = decode_src23 (sss, ss, w);
   1468       1.1  christos   dc = decode_dest23 (ddd, dd, w);
   1469       1.1  christos   a = get_src (sc);
   1470       1.1  christos   b = get_src (dc);
   1471       1.1  christos   tprintf("%d * %d = %d\n", a, b, a*b);
   1472       1.1  christos   v = a * b;
   1473       1.1  christos   dc = widen_sd (dc);
   1474       1.1  christos   put_dest (dc, v);
   1475       1.1  christos 
   1476       1.1  christos   /** 0000 0001 1000 sss1 ss00 1111	MULU.L src,R2R0 */
   1477       1.1  christos 
   1478       1.1  christos   M32C_ONLY();
   1479       1.1  christos   prefix (0, 0, 0);
   1480       1.1  christos   sc = decode_src23 (sss, ss, 4);
   1481       1.1  christos   a = get_src (sc);
   1482       1.1  christos   b = get_reg (r2r0);
   1483       1.1  christos   ll = (long long)a * (long long)b;
   1484       1.1  christos   tprintf("%d * %d = %lld (%llx)\n", a, b, ll, ll);
   1485       1.1  christos   if (ll < b2minsigned[4] || ll > b2maxsigned[4])
   1486       1.1  christos     set_flags (FLAGBIT_O, FLAGBIT_O);
   1487       1.1  christos   else
   1488       1.1  christos     set_flags (FLAGBIT_O, 0);
   1489       1.1  christos   put_reg (r2r0, (int)ll);
   1490       1.1  christos 
   1491       1.1  christos   /** 1010 ddd w dd10 1111		NEG.size dest */
   1492       1.1  christos 
   1493       1.1  christos   prefix (0, 1, 0);
   1494       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1495       1.1  christos   a = sign_ext (get_src (dc), (w+1)*8);
   1496       1.1  christos   v = -a;
   1497       1.1  christos   tprintf("%d * -1 = %d\n", a, v);
   1498       1.1  christos   set_oszc(v, w+1, v==0);
   1499       1.1  christos   put_dest (dc, v);
   1500       1.1  christos 
   1501       1.1  christos   /** 1101 1110				NOP */
   1502       1.1  christos 
   1503       1.1  christos   tprintf("nop\n");
   1504       1.1  christos 
   1505       1.1  christos   /** 1010 ddd w dd01 1110		NOT.size dest */
   1506       1.1  christos 
   1507       1.1  christos   prefix (0, 1, 0);
   1508       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1509       1.1  christos   a = get_src (dc);
   1510       1.1  christos   v = ~a;
   1511       1.1  christos   tprintf("~ %x = %x\n", a, v);
   1512       1.1  christos   set_sz(v, w+1);
   1513       1.1  christos   put_dest (dc, v);
   1514       1.1  christos 
   1515       1.1  christos   /** 1000 ddd w dd10 1111		OR.size:G #IMM,dest */
   1516       1.1  christos 
   1517       1.1  christos   prefix (0, 1, 0);
   1518       1.1  christos   dc = decode_dest23(ddd, dd, w+1);
   1519       1.1  christos   imm = IMM(w+1);
   1520       1.1  christos   LOGIC_OP (dc, imm, |);
   1521       1.1  christos 
   1522       1.1  christos   /** 01dd 010w				OR.size:S #IMM,dest */
   1523       1.1  christos 
   1524       1.1  christos   prefix (0, 1, 0);
   1525       1.1  christos   dc = decode_dest2(dd, w+1);
   1526       1.1  christos   imm = IMM (w+1);
   1527       1.1  christos   LOGIC_OP (dc, imm, |);
   1528       1.1  christos 
   1529       1.1  christos   /** 1sss ddd w dd ss 0101		OR.size:G src,dest */
   1530       1.1  christos 
   1531       1.1  christos   prefix (1, 1, 0);
   1532       1.1  christos   sc = decode_src23(sss, ss, w+1);
   1533       1.1  christos   dc = decode_dest23(ddd, dd, w+1);
   1534       1.1  christos   b = get_src (sc);
   1535       1.1  christos   LOGIC_OP (dc, b, |);
   1536       1.1  christos 
   1537       1.1  christos   /** 1011 ddd w dd10 1111		POP.size dest */
   1538       1.1  christos 
   1539       1.1  christos   prefix (0, 1, 0);
   1540       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1541       1.1  christos   if (w)
   1542       1.1  christos     a = mem_get_hi (get_reg (sp));
   1543       1.1  christos   else
   1544       1.1  christos     a = mem_get_qi (get_reg (sp));
   1545       1.1  christos   put_reg (sp, get_reg (sp) + 2);
   1546       1.1  christos   tprintf("pop%s: %x\n", w ? "hi" : "qi", a);
   1547       1.1  christos   put_dest (dc, a);
   1548       1.1  christos 
   1549       1.1  christos   /** 1101 0011 1010 1dst		POPC dest */
   1550       1.1  christos 
   1551       1.1  christos   prefix (0, 0, 0);
   1552       1.1  christos   dc = decode_cr_b (dst, CR_B_DCT0);
   1553       1.1  christos   a = mem_get_hi (get_reg (sp));
   1554       1.1  christos   put_reg (sp, get_reg (sp) + 2);
   1555       1.1  christos   tprintf("pophi: %x\n", a);
   1556       1.1  christos   put_dest (dc, a);
   1557       1.1  christos 
   1558       1.1  christos   /** 1101 0011 0010 1dst		POPC dest */
   1559       1.1  christos 
   1560       1.1  christos   prefix (0, 0, 0);
   1561       1.1  christos   dc = decode_cr_b (dst, CR_B_INTB);
   1562       1.1  christos   a = mem_get_si (get_reg (sp));
   1563       1.1  christos   put_reg (sp, get_reg (sp) + 4);
   1564       1.1  christos   tprintf("popsi: %x\n", a);
   1565       1.1  christos   put_dest (dc, a);
   1566       1.1  christos 
   1567       1.1  christos   /** 1000 1110				POPM dest */
   1568       1.1  christos 
   1569  1.1.1.10  christos   {
   1570       1.1  christos   static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb };
   1571       1.1  christos   prefix (0, 0, 0);
   1572       1.1  christos   imm = IMM(1);
   1573       1.1  christos   tprintf("popm: %x\n", imm);
   1574       1.1  christos   for (a=0; a<4; a++)
   1575       1.1  christos     if (imm & (1<<a))
   1576       1.1  christos       {
   1577       1.1  christos 	v = mem_get_hi (get_reg (sp));
   1578       1.1  christos 	put_reg (map[a], v);
   1579       1.1  christos 	put_reg (sp, get_reg (sp) + 2);
   1580       1.1  christos       }
   1581       1.1  christos   for (; a<8; a++)
   1582       1.1  christos     if (imm & (1<<a))
   1583       1.1  christos       {
   1584       1.1  christos 	v = mem_get_si (get_reg (sp));
   1585       1.1  christos 	put_reg (map[a], v);
   1586       1.1  christos 	put_reg (sp, get_reg (sp) + 4);
   1587       1.1  christos       }
   1588  1.1.1.10  christos   }
   1589       1.1  christos 
   1590       1.1  christos   /** 1010 111w				PUSH.size #IMM */
   1591       1.1  christos 
   1592       1.1  christos   prefix (0, 0, 0);
   1593       1.1  christos   imm = IMM(w+1);
   1594       1.1  christos   tprintf("push%s: %x\n", w ? "hi" : "qi", imm);
   1595  1.1.1.10  christos   a = get_reg (sp) - 2;
   1596       1.1  christos   if (w)
   1597       1.1  christos     mem_put_hi (a, imm);
   1598       1.1  christos   else
   1599       1.1  christos     mem_put_qi (a, imm);
   1600       1.1  christos   put_reg (sp, a);
   1601       1.1  christos 
   1602       1.1  christos   /** 1100 sss w ss00 1110		PUSH.size src */
   1603       1.1  christos 
   1604       1.1  christos   prefix (0, 1, 0);
   1605       1.1  christos   sc = decode_dest23 (sss, ss, w+1);
   1606       1.1  christos   a = get_src (sc);
   1607       1.1  christos   put_reg (sp, get_reg (sp) - 2);
   1608       1.1  christos   if (w)
   1609       1.1  christos     mem_put_hi (get_reg (sp), a);
   1610       1.1  christos   else
   1611       1.1  christos     mem_put_qi (get_reg (sp), a);
   1612       1.1  christos   tprintf("push%s: %x\n", w ? "hi" : "qi", a);
   1613       1.1  christos 
   1614       1.1  christos   /** 1011 0110 0101 0011		PUSH.L #IMM32 */
   1615       1.1  christos 
   1616       1.1  christos   imm = IMM(4);
   1617       1.1  christos   put_reg (sp, get_reg (sp) - 4);
   1618       1.1  christos   mem_put_si (get_reg (sp), imm);
   1619       1.1  christos 
   1620       1.1  christos   /** 1010 sss0 ss00 0001		PUSH.L src */
   1621       1.1  christos 
   1622       1.1  christos   prefix (0, 1, 0);
   1623       1.1  christos   sc = decode_dest23 (sss, ss, 4);
   1624       1.1  christos   a = get_src (sc);
   1625       1.1  christos   put_reg (sp, get_reg (sp) - 4);
   1626       1.1  christos   mem_put_si (get_reg (sp), a);
   1627       1.1  christos 
   1628       1.1  christos   /** 1011 0sa0 ss00 0001		PUSHA src */
   1629       1.1  christos 
   1630       1.1  christos   prefix (0, 0, 0);
   1631       1.1  christos   sc = decode_dest23 (sa, ss, 1);
   1632       1.1  christos   put_reg (sp, get_reg (sp) - 4);
   1633       1.1  christos   mem_put_hi (get_reg (sp), sc.u.addr);
   1634       1.1  christos   tprintf("pushsi: %x\n", sc.u.addr);
   1635       1.1  christos 
   1636       1.1  christos   /** 1101 0001 1010 1src		PUSHC src */
   1637       1.1  christos 
   1638       1.1  christos   prefix (0, 0, 0);
   1639       1.1  christos   sc = decode_cr_b (src, CR_B_DCT0);
   1640       1.1  christos   a = get_src (sc);
   1641       1.1  christos   put_reg (sp, get_reg (sp) - 2);
   1642       1.1  christos   mem_put_hi (get_reg (sp), a);
   1643       1.1  christos   tprintf("pushhi: %x\n", a);
   1644       1.1  christos 
   1645       1.1  christos   /** 1101 0001 0010 1src		PUSHC src */
   1646       1.1  christos 
   1647       1.1  christos   prefix (0, 0, 0);
   1648       1.1  christos   sc = decode_cr_b (src, CR_B_INTB);
   1649       1.1  christos   a = get_src (sc);
   1650       1.1  christos   put_reg (sp, get_reg (sp) - 4);
   1651       1.1  christos   mem_put_si (get_reg (sp), a);
   1652       1.1  christos   tprintf("pushsi: %x\n", a);
   1653       1.1  christos 
   1654       1.1  christos   /** 1000 1111				PUSHM src */
   1655       1.1  christos 
   1656  1.1.1.10  christos   {
   1657       1.1  christos   static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 };
   1658       1.1  christos   imm = IMM(1);
   1659       1.1  christos   tprintf("pushm: %x\n", imm);
   1660       1.1  christos   for (a=0; a<4; a++)
   1661       1.1  christos     if (imm & (1<<a))
   1662       1.1  christos       {
   1663       1.1  christos 	put_reg (sp, get_reg (sp) - 4);
   1664       1.1  christos 	v = get_reg (map[a]);
   1665       1.1  christos 	mem_put_si (get_reg (sp), v);
   1666       1.1  christos       }
   1667       1.1  christos   for (; a<8; a++)
   1668       1.1  christos     if (imm & (1<<a))
   1669       1.1  christos       {
   1670       1.1  christos 	put_reg (sp, get_reg (sp) - 2);
   1671       1.1  christos 	v = get_reg (map[a]);
   1672       1.1  christos 	mem_put_hi (get_reg (sp), v);
   1673       1.1  christos       }
   1674  1.1.1.10  christos   }
   1675       1.1  christos 
   1676       1.1  christos   /** 1001 1110				REIT */
   1677       1.1  christos 
   1678       1.1  christos   a = get_reg (sp);
   1679       1.1  christos   put_reg (pc, mem_get_si (a));
   1680       1.1  christos   a += 4;
   1681       1.1  christos   put_reg (flags, mem_get_hi (a));
   1682       1.1  christos   a += 2;
   1683       1.1  christos   put_reg (sp, a);
   1684       1.1  christos 
   1685       1.1  christos   /** 1011 1000 010w 0011		RMPA.size */
   1686       1.1  christos 
   1687  1.1.1.10  christos   {
   1688       1.1  christos   int count = get_reg (r3);
   1689       1.1  christos   int list1 = get_reg (a0);
   1690       1.1  christos   int list2 = get_reg (a1);
   1691       1.1  christos   long long sum = get_reg_ll (r3r1r2r0) & 0xffffff;
   1692       1.1  christos 
   1693       1.1  christos   while (count)
   1694       1.1  christos     {
   1695       1.1  christos       if (w)
   1696       1.1  christos 	{
   1697       1.1  christos 	  a = sign_ext (mem_get_hi (list1), 16);
   1698       1.1  christos 	  b = sign_ext (mem_get_hi (list2), 16);
   1699       1.1  christos 	}
   1700       1.1  christos       else
   1701       1.1  christos 	{
   1702       1.1  christos 	  a = sign_ext (mem_get_qi (list1), 8);
   1703       1.1  christos 	  b = sign_ext (mem_get_qi (list2), 8);
   1704       1.1  christos 	}
   1705       1.1  christos       tprintf("%lld + %d * %d = ", sum, a, b);
   1706       1.1  christos       sum += a * b;
   1707       1.1  christos       tprintf("%lld\n", sum);
   1708       1.1  christos       list1 += w ? 2 : 1;
   1709       1.1  christos       list2 += w ? 2 : 1;
   1710       1.1  christos       count --;
   1711       1.1  christos     }
   1712       1.1  christos   put_reg (r3, count);
   1713       1.1  christos   put_reg (a0, list1);
   1714       1.1  christos   put_reg (a1, list2);
   1715       1.1  christos   put_reg (r2r0, (int)(sum & 0xffffffffU));
   1716       1.1  christos   put_reg (r1, (int)(sum >> 32));
   1717  1.1.1.10  christos   }
   1718       1.1  christos 
   1719       1.1  christos   /** 1011 ddd w dd10 1110		ROLC.size dest */
   1720       1.1  christos 
   1721       1.1  christos   prefix (0, 1, 0);
   1722       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1723       1.1  christos   rot_op (dc, 1, 1);
   1724       1.1  christos 
   1725       1.1  christos   /** 1010 ddd w dd10 1110		RORC.size dest */
   1726       1.1  christos 
   1727       1.1  christos   prefix (0, 1, 0);
   1728       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1729       1.1  christos   rot_op (dc, 1, -1);
   1730       1.1  christos 
   1731       1.1  christos   /** 1110 ddd w dd10 immm		ROT.size #IMM, dest */
   1732       1.1  christos 
   1733       1.1  christos   prefix (0, 1, 0);
   1734       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1735       1.1  christos   rot_op (dc, IMM4(), -1);
   1736       1.1  christos 
   1737       1.1  christos   /** 1010 ddd w dd11 1111		ROT.size R1H,dest */
   1738       1.1  christos 
   1739       1.1  christos   prefix (0, 1, 0);
   1740       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1741       1.1  christos   a = sign_ext (get_reg (r1h), 8);
   1742       1.1  christos   rot_op (dc, a, -1);
   1743       1.1  christos 
   1744       1.1  christos   /** 1101 1111				RTS */
   1745       1.1  christos 
   1746       1.1  christos   put_reg (pc, mem_get_si (get_reg (sp)));
   1747       1.1  christos   put_reg (sp, get_reg (sp) + 4);
   1748       1.1  christos 
   1749       1.1  christos   /** 0000 0001 1001 ddd w dd10 1110	SBB.size #IMM, dest */
   1750       1.1  christos 
   1751       1.1  christos   prefix (0, 0, 0);
   1752       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1753       1.1  christos   imm = IMM (w+1);
   1754       1.1  christos   MATH_OP (dc, imm, !carry, -);
   1755       1.1  christos 
   1756       1.1  christos   /** 0000 0001 1sss ddd w dd ss 0110	SBB.size src,dest */
   1757       1.1  christos 
   1758       1.1  christos   prefix (0, 0, 0);
   1759       1.1  christos   sc = decode_src23 (sss, ss, w+1);
   1760       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1761       1.1  christos   MATH_OP (dc, get_src (sc), !carry, -);
   1762       1.1  christos 
   1763       1.1  christos   /** 1101 ddd1 dd11 cond		SCcond dest */
   1764       1.1  christos 
   1765       1.1  christos   prefix (0, 1, 0);
   1766       1.1  christos   dc = decode_dest23 (ddd, dd, 2);
   1767       1.1  christos   if (condition_true (cond))
   1768       1.1  christos     put_dest (dc, 1);
   1769       1.1  christos   else
   1770       1.1  christos     put_dest (dc, 0);
   1771       1.1  christos 
   1772       1.1  christos   /** 1011 1000 110w 0011		SCMPU.size */
   1773       1.1  christos 
   1774       1.1  christos   ta0 = get_reg (a0);
   1775       1.1  christos   ta1 = get_reg (a1);
   1776       1.1  christos 
   1777       1.1  christos   for (;;)
   1778       1.1  christos     {
   1779       1.1  christos       t0 = mem_get_qi (ta0);
   1780       1.1  christos       t2 = mem_get_qi (ta1);
   1781       1.1  christos       if (w)
   1782       1.1  christos 	{
   1783       1.1  christos 	  t1 = mem_get_qi (ta0 + 1);
   1784       1.1  christos 	  t3 = mem_get_qi (ta1 + 1);
   1785       1.1  christos 	}
   1786       1.1  christos       dif = t0 - t2;
   1787       1.1  christos       if (dif == 0 && t0 != 0 && w)
   1788       1.1  christos 	dif = t1 - t3;
   1789       1.1  christos       set_oszc (dif, 1, dif > 0);
   1790       1.1  christos 
   1791       1.1  christos       ta0 += w ? 2 : 1;
   1792       1.1  christos       ta1 += w ? 2 : 1;
   1793       1.1  christos 
   1794       1.1  christos       if (t0 == 0 || t0 != t2)
   1795       1.1  christos 	break;
   1796       1.1  christos       if (w && (t1 == 0 || t1 != t3))
   1797       1.1  christos 	break;
   1798       1.1  christos     }
   1799       1.1  christos 
   1800       1.1  christos   /** 1111 ddd w dd00 immm		SHA.size #IMM,dest */
   1801       1.1  christos 
   1802       1.1  christos   prefix (0, 1, 0);
   1803       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1804       1.1  christos   shift_op (dc, 1, IMM4(), 1);
   1805       1.1  christos 
   1806       1.1  christos   /** 1010 ddd0 dd10 0001		SHA.L #IMM,dest */
   1807       1.1  christos 
   1808       1.1  christos   prefix (0, 1, 0);
   1809       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1810       1.1  christos   imm = sign_ext (IMM(1), 8);
   1811       1.1  christos   shift_op (dc, 1, imm, 1);
   1812       1.1  christos 
   1813       1.1  christos   /** 1011 ddd w dd11 1110		SHA.size R1H,dest */
   1814       1.1  christos 
   1815       1.1  christos   prefix (0, 1, 0);
   1816       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1817       1.1  christos   a = sign_ext (get_reg (r1h), 8);
   1818       1.1  christos   shift_op (dc, 1, a, 1);
   1819       1.1  christos 
   1820       1.1  christos   /** 1100 ddd0 dd01 0001		SHA.L	R1H,dest */
   1821       1.1  christos 
   1822       1.1  christos   prefix (0, 1, 0);
   1823       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1824       1.1  christos   a = sign_ext (get_reg (r1h), 8);
   1825       1.1  christos   shift_op (dc, 1, a, 1);
   1826       1.1  christos 
   1827       1.1  christos   /** 1100 ddd0 dd10 0001		SHANC.L #IMM,dest */
   1828       1.1  christos 
   1829       1.1  christos   M32C_ONLY();
   1830       1.1  christos   prefix (0, 1, 0);
   1831       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1832       1.1  christos   imm = sign_ext (IMM(1), 8);
   1833       1.1  christos   shift_op (dc, 1, imm, 0);
   1834       1.1  christos 
   1835       1.1  christos   /** 1110 ddd w dd00 immm		SHL.size #IMM, dest */
   1836       1.1  christos 
   1837       1.1  christos   prefix (0, 1, 0);
   1838       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1839       1.1  christos   shift_op (dc, 0, IMM4(), 1);
   1840       1.1  christos 
   1841       1.1  christos   /** 1001 ddd0 dd10 0001		SHL.L #IMM, dest */
   1842       1.1  christos 
   1843       1.1  christos   prefix (0, 1, 0);
   1844       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1845       1.1  christos   imm = sign_ext (IMM(1), 8);
   1846       1.1  christos   shift_op (dc, 0, imm, 1);
   1847       1.1  christos 
   1848       1.1  christos   /** 1010 ddd w dd11 1110		SHL.size R1H,dest */
   1849       1.1  christos 
   1850       1.1  christos   prefix (0, 1, 0);
   1851       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   1852       1.1  christos   a = sign_ext (get_reg (r1h), 8);
   1853       1.1  christos   shift_op (dc, 0, a, 1);
   1854       1.1  christos 
   1855       1.1  christos   /** 1100 ddd0 dd00 0001		SHL.L R1H,dest */
   1856       1.1  christos 
   1857       1.1  christos   prefix (0, 1, 0);
   1858       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1859       1.1  christos   a = sign_ext (get_reg (r1h), 8);
   1860       1.1  christos   shift_op (dc, 0, a, 1);
   1861       1.1  christos 
   1862       1.1  christos   /** 1000 ddd0 dd10 0001		SHLNC.L #IMM,dest */
   1863       1.1  christos 
   1864       1.1  christos   M32C_ONLY();
   1865       1.1  christos   prefix (0, 1, 0);
   1866       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1867       1.1  christos   imm = sign_ext (IMM(1), 8);
   1868       1.1  christos   shift_op (dc, 0, imm, 0);
   1869       1.1  christos 
   1870       1.1  christos   /** 1011 0010 100w 0011		SIN.size */
   1871       1.1  christos 
   1872       1.1  christos   v = get_reg (a0);
   1873       1.1  christos   a = get_reg (a1);
   1874       1.1  christos   b = get_reg (r3);
   1875       1.1  christos   if (b) for (;b;)
   1876       1.1  christos     {
   1877       1.1  christos       if (w)
   1878       1.1  christos 	mem_put_hi(a, mem_get_hi (v));
   1879       1.1  christos       else
   1880       1.1  christos 	mem_put_qi(a, mem_get_qi (v));
   1881       1.1  christos       a += w ? 2 : 1;
   1882       1.1  christos       b --;
   1883       1.1  christos     }
   1884       1.1  christos   put_reg (a0, v);
   1885       1.1  christos   put_reg (a1, a);
   1886       1.1  christos   put_reg (r3, b);
   1887       1.1  christos 
   1888       1.1  christos   /** 1011 0110 100w 0011		SMOVB.size */
   1889       1.1  christos 
   1890       1.1  christos   v = get_reg (a0);
   1891       1.1  christos   a = get_reg (a1);
   1892       1.1  christos   b = get_reg (r3);
   1893       1.1  christos   if (b) for (;b;)
   1894       1.1  christos     {
   1895       1.1  christos       if (w)
   1896       1.1  christos 	mem_put_hi(a, mem_get_hi (v));
   1897       1.1  christos       else
   1898       1.1  christos 	mem_put_qi(a, mem_get_qi (v));
   1899       1.1  christos       v -= w ? 2 : 1;
   1900       1.1  christos       a -= w ? 2 : 1;
   1901       1.1  christos       b --;
   1902       1.1  christos     }
   1903       1.1  christos   put_reg (a0, v);
   1904       1.1  christos   put_reg (a1, a);
   1905       1.1  christos   put_reg (r3, b);
   1906       1.1  christos 
   1907       1.1  christos   /** 1011 0000 100w 0011		SMOVF.size */
   1908       1.1  christos 
   1909       1.1  christos   v = get_reg (a0);
   1910       1.1  christos   a = get_reg (a1);
   1911       1.1  christos   b = get_reg (r3);
   1912       1.1  christos   if (b) for (;b;)
   1913       1.1  christos     {
   1914       1.1  christos       if (w)
   1915       1.1  christos 	mem_put_hi(a, mem_get_hi (v));
   1916       1.1  christos       else
   1917       1.1  christos 	mem_put_qi(a, mem_get_qi (v));
   1918       1.1  christos       v += w ? 2 : 1;
   1919       1.1  christos       a += w ? 2 : 1;
   1920       1.1  christos       b --;
   1921       1.1  christos     }
   1922       1.1  christos   put_reg (a0, v);
   1923       1.1  christos   put_reg (a1, a);
   1924       1.1  christos   put_reg (r3, b);
   1925       1.1  christos 
   1926       1.1  christos   /** 1011 1000 100w 0011		SMOVU.size */
   1927       1.1  christos 
   1928       1.1  christos   v = get_reg (a0);
   1929       1.1  christos   a = get_reg (a1);
   1930       1.1  christos   do
   1931       1.1  christos     {
   1932       1.1  christos       if (w)
   1933       1.1  christos 	mem_put_hi(a, (t0 = mem_get_hi (v)));
   1934       1.1  christos       else
   1935       1.1  christos 	mem_put_qi(a, (t0 = mem_get_qi (v)));
   1936       1.1  christos       v += w ? 2 : 1;
   1937       1.1  christos       a += w ? 2 : 1;
   1938       1.1  christos       if (t0 == 0
   1939       1.1  christos 	  || (w && ((t0 & 0xff) == 0 || (t0 & 0xff00) == 0)))
   1940       1.1  christos 	break;
   1941       1.1  christos     } while (1);
   1942       1.1  christos   put_reg (a0, v);
   1943       1.1  christos   put_reg (a1, a);
   1944       1.1  christos 
   1945       1.1  christos   /** 1011 0100 100w 0011		SOUT.size */
   1946       1.1  christos 
   1947       1.1  christos   v = get_reg (a0);
   1948       1.1  christos   a = get_reg (a1);
   1949       1.1  christos   b = get_reg (r3);
   1950       1.1  christos   for (;b;)
   1951       1.1  christos     {
   1952       1.1  christos       if (w)
   1953       1.1  christos 	mem_put_hi(a, mem_get_hi (v));
   1954       1.1  christos       else
   1955       1.1  christos 	mem_put_qi(a, mem_get_qi (v));
   1956       1.1  christos       v += w ? 2 : 1;
   1957       1.1  christos       b --;
   1958       1.1  christos     }
   1959       1.1  christos   put_reg (a0, v);
   1960       1.1  christos   put_reg (a1, a);
   1961       1.1  christos   put_reg (r3, b);
   1962       1.1  christos 
   1963       1.1  christos   /** 1011 1000 000w 0011		SSTR.size */
   1964       1.1  christos 
   1965       1.1  christos   a = get_reg (a1);
   1966       1.1  christos   b = get_reg (r3);
   1967       1.1  christos   v = get_reg (w ? r0 : r0l);
   1968       1.1  christos   for (;b;)
   1969       1.1  christos     {
   1970       1.1  christos       if (w)
   1971       1.1  christos 	mem_put_hi(a, v);
   1972       1.1  christos       else
   1973       1.1  christos 	mem_put_qi(a, v);
   1974       1.1  christos       a += w ? 2 : 1;
   1975       1.1  christos       b --;
   1976       1.1  christos     }
   1977       1.1  christos   put_reg (a1, a);
   1978       1.1  christos   put_reg (r3, b);
   1979       1.1  christos 
   1980       1.1  christos   /** 0000 0001 1101 ddd1 dd01 0src	STC src,dest */
   1981       1.1  christos 
   1982       1.1  christos   prefix (0, 0, 0);
   1983       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   1984       1.1  christos   sc = decode_cr_b (src, CR_B_DMA0);
   1985       1.1  christos   a = get_src (sc);
   1986       1.1  christos   put_dest (dc, a);
   1987       1.1  christos 
   1988       1.1  christos   /** 0000 0001 1101 ddd1 dd01 1src	STC src,dest */
   1989       1.1  christos 
   1990       1.1  christos   prefix (0, 0, 0);
   1991       1.1  christos   dc = decode_dest23 (ddd, dd, 2);
   1992       1.1  christos   sc = decode_cr_b (src, CR_B_DCT0);
   1993       1.1  christos   a = get_src (sc);
   1994       1.1  christos   put_dest (dc, a);
   1995       1.1  christos 
   1996       1.1  christos   /** 1101 ddd1 dd01 0src		STC src,dest */
   1997       1.1  christos 
   1998       1.1  christos   prefix (0, 0, 0);
   1999       1.1  christos   dc = decode_dest23 (ddd, dd, 4);
   2000       1.1  christos   sc = decode_cr_b (src, CR_B_INTB);
   2001       1.1  christos   a = get_src (sc);
   2002       1.1  christos   put_dest (dc, a);
   2003       1.1  christos 
   2004       1.1  christos   /** 1011 0110 1101 0011		STCX abs16,abs24 */
   2005       1.1  christos 
   2006       1.1  christos   NOTYET();
   2007       1.1  christos 
   2008       1.1  christos   /** 1001 ddd w dd01 1111		STNZ.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 dd00 1111		STZ.size #IMM,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   imm = IMM(w+1);
   2021       1.1  christos   if (FLAG_Z)
   2022       1.1  christos     put_dest (dc, imm);
   2023       1.1  christos 
   2024       1.1  christos   /** 1001 ddd w dd11 1111		STZX.size #IMM1,#IMM2,dest */
   2025       1.1  christos 
   2026       1.1  christos   prefix (0, 1, 0);
   2027       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   2028       1.1  christos   a = IMM(w+1);
   2029       1.1  christos   b = IMM(w+1);
   2030       1.1  christos   if (FLAG_Z)
   2031       1.1  christos     put_dest (dc, a);
   2032       1.1  christos   else
   2033       1.1  christos     put_dest (dc, b);
   2034       1.1  christos 
   2035       1.1  christos   /** 1000 ddd w dd11 1110		SUB.size:G #IMM,dest */
   2036       1.1  christos 
   2037       1.1  christos   prefix (0, 1, 0);
   2038       1.1  christos   dc = decode_dest23(ddd, dd, w+1);
   2039       1.1  christos   imm = IMM(w+1);
   2040       1.1  christos   MATH_OP (dc, imm, 0, -);
   2041       1.1  christos 
   2042       1.1  christos   /** 1001 ddd0 dd11 0001		SUB.L:G #IMM,dest */
   2043       1.1  christos 
   2044       1.1  christos   prefix (0, 1, 0);
   2045       1.1  christos   dc = decode_dest23(ddd, dd, 4);
   2046       1.1  christos   imm = IMM(4);
   2047       1.1  christos   MATH_OP (dc, imm, 0, -);
   2048       1.1  christos 
   2049       1.1  christos   /** 00dd 111w				SUB.size:S #IMM,dest */
   2050       1.1  christos 
   2051       1.1  christos   prefix (0, 1, 0);
   2052       1.1  christos   dc = decode_dest2(dd, w+1);
   2053       1.1  christos   imm = IMM (w+1);
   2054       1.1  christos   MATH_OP (dc, imm, 0, -);
   2055       1.1  christos 
   2056       1.1  christos   /** 1sss ddd w dd ss 1010		SUB.size:G src,dest */
   2057       1.1  christos 
   2058       1.1  christos   prefix (1, 1, 0);
   2059       1.1  christos   sc = decode_src23(sss, ss, w+1);
   2060       1.1  christos   dc = decode_dest23(ddd, dd, w+1);
   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   /** 1sss ddd1 dd ss 0000		SUB.L:G src,dest */
   2065       1.1  christos 
   2066       1.1  christos   prefix (1, 1, 0);
   2067       1.1  christos   sc = decode_src23(sss, ss, 4);
   2068       1.1  christos   dc = decode_dest23(ddd, dd, 4);
   2069       1.1  christos   b = get_src (sc);
   2070       1.1  christos   MATH_OP (dc, b, 0, -);
   2071       1.1  christos 
   2072       1.1  christos   /** 1001 ddd0 dd01 0001		SUBX #IMM,dest */
   2073       1.1  christos 
   2074       1.1  christos   prefix (0, 1, 0);
   2075       1.1  christos   dc = decode_dest23(ddd, dd, 4);
   2076       1.1  christos   imm = sign_ext (IMM(1), 8);
   2077       1.1  christos   MATH_OP (dc, imm, 0, -);
   2078       1.1  christos 
   2079       1.1  christos   /** 1sss ddd0 dd ss 0000		SUBX src,dest */
   2080       1.1  christos 
   2081       1.1  christos   prefix (1, 1, 0);
   2082       1.1  christos   sc = decode_src23(sss, ss, 1);
   2083       1.1  christos   dc = decode_dest23(ddd, dd, 4);
   2084       1.1  christos   b = sign_ext (get_src (sc), 8);
   2085       1.1  christos   MATH_OP (dc, b, 0, -);
   2086       1.1  christos 
   2087       1.1  christos   /** 1001 ddd w dd11 1110		TST.size:G #IMM,dest */
   2088       1.1  christos 
   2089       1.1  christos   prefix (0, 0, 0);
   2090       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   2091       1.1  christos   imm = IMM(w+1);
   2092       1.1  christos   a = get_src (dc);
   2093       1.1  christos   v = a & imm;
   2094       1.1  christos   set_sz (v, w+1);
   2095       1.1  christos 
   2096       1.1  christos   /** 00dd 110w				TST.size:S #IMM,dest */
   2097       1.1  christos 
   2098       1.1  christos   prefix (0, 0, 0);
   2099       1.1  christos   dc = decode_dest2 (dd, w+1);
   2100       1.1  christos   imm = IMM(w+1);
   2101       1.1  christos   a = get_src (dc);
   2102       1.1  christos   v = a & imm;
   2103       1.1  christos   set_sz (v, w+1);
   2104       1.1  christos 
   2105       1.1  christos   /** 0000 0001 1sss ddd w dd ss 1001	TST.size:G src,dest */
   2106       1.1  christos 
   2107       1.1  christos   prefix (0, 0, 0);
   2108       1.1  christos   sc = decode_src23 (sss, ss, w+1);
   2109       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   2110       1.1  christos   b = get_src (sc);
   2111       1.1  christos   a = get_src (dc);
   2112       1.1  christos   v = a & b;
   2113       1.1  christos   set_sz (v, w+1);
   2114       1.1  christos 
   2115       1.1  christos   /** 1111 1111				UND */
   2116       1.1  christos 
   2117       1.1  christos   trigger_fixed_interrupt (0xffffdc);
   2118       1.1  christos 
   2119       1.1  christos   /** 1011 0010 0000 0011		WAIT */
   2120       1.1  christos 
   2121       1.1  christos   ;
   2122       1.1  christos 
   2123       1.1  christos   /** 1101 ddd w dd00 1src		XCHG.size src,dest */
   2124       1.1  christos 
   2125       1.1  christos   dc = decode_dest23 (ddd, dd, w+1);
   2126       1.1  christos   sc = decode_src3 (src, w+1);
   2127       1.1  christos   a = get_src (dc);
   2128       1.1  christos   b = get_src (sc);
   2129       1.1  christos   put_dest (dc, b);
   2130       1.1  christos   put_dest (sc, a);
   2131       1.1  christos 
   2132       1.1  christos   /** 1001 ddd w dd00 1110		XOR.size #IMM,dest */
   2133       1.1  christos 
   2134       1.1  christos   prefix (0, 1, 0);
   2135       1.1  christos   dc = decode_dest23(ddd, dd, w+1);
   2136       1.1  christos   imm = IMM(w+1);
   2137       1.1  christos   LOGIC_OP (dc, imm, ^);
   2138       1.1  christos 
   2139       1.1  christos   /** 1sss ddd w dd ss 1001		XOR.size src,dest */
   2140       1.1  christos 
   2141       1.1  christos   prefix (1, 1, 0);
   2142       1.1  christos   sc = decode_src23(sss, ss, w+1);
   2143       1.1  christos   dc = decode_dest23(ddd, dd, w+1);
   2144       1.1  christos   b = get_src (sc);
   2145       1.1  christos   LOGIC_OP (dc, b, ^);
   2146       1.1  christos 
   2147       1.1  christos /** */
   2148       1.1  christos 
   2149       1.1  christos   return step_result;
   2150       1.1  christos }
   2151