/* r8c.opc --- semantics for r8c opcodes.		        -*- mode: c -*-

Copyright (C) 2005-2013 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.

This file is part of the GNU simulators.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.  */


#include <stdio.h>
#include <stdlib.h>

#include "cpu.h"
#include "mem.h"
#include "misc.h"
#include "int.h"

#define AU  __attribute__((unused))

#define tprintf if (trace) printf

static unsigned char
getbyte ()
{
  int tsave = trace;
  unsigned char b;

  if (trace == 1)
    trace = 0;
  b = mem_get_pc ();
  regs.r_pc ++;
  trace = tsave;
  return b;
}

#define M16C_ONLY() /* FIXME: add something here */

#define GETBYTE() (op[opi++] = getbyte())

#define UNSUPPORTED() unsupported("unsupported", orig_pc)
#define NOTYET() unsupported("unimplemented", orig_pc)

static void
unsupported (char *tag, int orig_pc)
{
  int i;
  printf("%s opcode at %08x\n", tag, orig_pc);
  regs.r_pc = orig_pc;
  for (i=0; i<2; i++)
    {
      int b = mem_get_pc();
      printf(" %s", bits(b>>4, 4));
      printf(" %s", bits(b, 4));
      regs.r_pc ++;
    }
  printf("\n");
  regs.r_pc = orig_pc;
  for (i=0; i<6; i++)
    {
      printf(" %02x", mem_get_pc ());
      regs.r_pc ++;
    }
  printf("\n");
  exit(1);
}

static int
IMM(bw)
{
  int rv = getbyte ();
  if (bw)
    rv = rv + 256 * getbyte();
  if (bw == 2)
    rv = rv + 65536 * getbyte();
  return rv;
}

#define IMM4() (immm >= 8 ? 7 - immm : immm + 1)

#define UNARY_SOP \
  dc = decode_srcdest4 (dest, w); \
  v = sign_ext (get_src (dc), w?16:8);

#define UNARY_UOP \
  dc = decode_srcdest4 (dest, w); \
  v = get_src (dc);

#define BINARY_SOP \
  sc = decode_srcdest4 (srcx, w); \
  dc = decode_srcdest4 (dest, w); \
  a = sign_ext (get_src (sc), w?16:8); \
  b = sign_ext (get_src (dc), w?16:8);

#define BINARY_UOP \
  sc = decode_srcdest4 (srcx, w); \
  dc = decode_srcdest4 (dest, w); \
  a = get_src (sc); \
  b = get_src (dc);

#define carry (FLAG_C ? 1 : 0)

static void
cmp (int d, int s, int w)
{
  int a, b, f=0;
  int mask = w ? 0xffff : 0xff;
  a = d - s;
  b = sign_ext (d, w?16:8) - sign_ext (s, w?16:8);
  tprintf ("cmp: %x - %x = %08x, %x - %x = %d\n",
	   d, s, a,
	   sign_ext(d,w?16:8), sign_ext(s,w?16:8), b);

  if (b == 0)
    f |= FLAGBIT_Z;
  if (b & (w ? 0x8000 : 0x80))
    f |= FLAGBIT_S;
  if ((d & mask) >= (s & mask))
    f |= FLAGBIT_C;
  if (b < (w ? -32768 : -128) || b > (w ? 32767 : 127))
    f |= FLAGBIT_O;

  set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f);
}

static void
div_op (int s, int u, int x, int w)
{
  srcdest sc;
  int v, a, b;

  if (s == -1)
    s = IMM(w);
  else
    {
      sc = decode_srcdest4 (s, w);
      s = get_src (sc);
    }

  v = get_reg (w ? r2r0 : r0);

  if (!u)
    {
      s = sign_ext (s, w ? 16 : 8);
      v = sign_ext (v, w ? 16 : 8);
    }

  if (s == 0)
    {
      set_flags (FLAGBIT_O, FLAGBIT_O);
      return;
    }

  if (u)
    {
      a = (unsigned int)v / (unsigned int)s;
      b = (unsigned int)v % (unsigned int)s;
    }
  else
    {
      a = v / s;
      b = v % s;
    }
  if (x)
    {
      if ((s > 0 && b < 0)
	  || (s < 0 && b > 0))
	{
	  a --;
	  b += s;
	}
    }
  tprintf ("%d / %d = %d rem %d\n", v, s, a, b);
  if ((!u && (a > (w ? 32767 : 127)
	     || a < (w ? -32768 : -129)))
      || (u && (a > (w ? 65536 : 255))))
    set_flags (FLAGBIT_O, FLAGBIT_O);
  else
    set_flags (FLAGBIT_O, 0);

  put_reg (w ? r0 : r0l, a);
  put_reg (w ? r2 : r0h, b);
}

static void
rot_op (srcdest sd, int rotc, int count)
{
  int mask = (sd.bytes == 2) ? 0xffff : 0xff;
  int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
  int v = get_src (sd);
  int c = carry, ct;

  tprintf("%s %x by %d\n", rotc ? "rotc" : "rot", v, count);
  tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
  while (count > 0)
    {
      ct = (v & msb) ? 1 : 0;
      v <<= 1;
      v |= rotc ? c : ct;
      v &= mask;
      c = ct;
      tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
      count --;
    }
  while (count < 0)
    {
      ct = v & 1;
      v >>= 1;
      v |= (rotc ? c : ct) * msb;
      c = ct;
      tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
      count ++;
    }
  put_dest (sd, v);
  set_szc (v, sd.bytes, c);
}

static void
shift_op (srcdest sd, int arith, int count)
{
  int mask = (sd.bytes == 2) ? 0xffff : 0xff;
  int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
  int v = get_src (sd);
  int c = 0;

  if (sd.bytes == 4)
    {
      mask = 0xffffffffU;
      msb = 0x80000000U;
      if (count > 16 || count < -16)
	{
	  fprintf(stderr, "Error: SI shift of %d undefined\n", count);
	  exit(1);
	}
      if (count > 16)
	count = (count - 1) % 16 + 1;
      if (count < -16)
	count = -((-count - 1) % 16 + 1);
    }

  tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count);
  tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
  while (count > 0)
    {
      c = (v & msb) ? 1 : 0;
      v <<= 1;
      v &= mask;
      tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
      count --;
    }
  while (count < 0)
    {
      c = v & 1;
      if (arith)
	v = (v & msb) | (v >> 1);
      else
	v = (v >> 1) & (msb - 1);
      tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
      count ++;
    }
  put_dest (sd, v);
  set_szc (v, sd.bytes, c);
}

#define MATH_OP(dc,s,c,op,carryrel) \
  a = get_src(dc); \
  b = s & b2mask[dc.bytes]; \
  v2 = a op b op c; \
  tprintf("0x%x " #op " 0x%x " #op " 0x%x = 0x%x\n", a, b, c, v2); \
  a = sign_ext (a, dc.bytes * 8); \
  b = sign_ext (s, dc.bytes * 8); \
  v = a op b op c; \
  tprintf("%d " #op " %d " #op " %d = %d\n", a, b, c, v); \
  set_oszc (v, dc.bytes, v2 carryrel); \
  put_dest (dc, v2);

#define BIT_OP(field,expr) \
  dc = decode_bit (field); \
  b = get_bit (dc); \
  v = expr; \
  tprintf ("b=%d, carry=%d, %s = %d\n", b, carry, #expr, v); \
  put_bit (dc, v);

#define BIT_OPC(field,expr) \
  dc = decode_bit (field); \
  b = get_bit (dc); \
  v = expr; \
  tprintf ("b=%d, carry=%d, %s = %d\n", b, carry, #expr, v); \
  set_c (v);

/* The "BMcnd dest" opcode uses a different encoding for the */
/* condition than other opcodes.  */
static int bmcnd_cond_map[] = {
  0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 12, 13, 14, 15
};

int
decode_r8c()
{
  unsigned char op[40];
  int opi = 0;
  int v, v2, a, b;
  int orig_pc = get_reg (pc);
  srcdest sc, dc;
  int imm;

  step_result = M32C_MAKE_STEPPED ();

  tprintf("trace: decode pc = %05x\n", orig_pc);

  /** VARY dst 011 100 101 110 111 */

  /** 0111 011w 1111 dest  ABS.size dest */

  UNARY_SOP;
  a = v<0 ? -v : v;
  tprintf("abs(%d) = %d\n", v, a);
  set_osz(a, w+1);
  put_dest (dc, a);

  /** 0111 011w 0110 dest  ADC.size #IMM,dest */

  dc = decode_srcdest4(dest, w);
  imm = IMM(w);
  MATH_OP (dc, imm, carry, +, > (w?0xffff:0xff));

  /** 1011 000w srcx dest  ADC.size src,dest */

  sc = decode_srcdest4(srcx, w);
  dc = decode_srcdest4(dest, w);
  b = get_src (sc);
  MATH_OP (dc, b, carry, +, > (w?0xffff:0xff));

  /** 0111 011w 1110 dest  ADCF.size dest */

  dc = decode_srcdest4(dest, w);
  MATH_OP (dc, 0, carry, +, > (w?0xffff:0xff));

  /** 0111 011w 0100 dest  ADD.size:G #imm,dest */

  dc = decode_srcdest4(dest, w);
  imm = IMM(w);
  MATH_OP (dc, imm, 0, +, > (w?0xffff:0xff));

  /** 1100 100w immm dest  ADD.size:Q #IMM,dest */

  dc = decode_srcdest4(dest, w);
  imm = sign_ext (immm, 4);
  MATH_OP (dc, imm, 0, +, > (w?0xffff:0xff));

  /** 1000 0dst            ADD.B:S #IMM8,dst */

  imm = IMM(0);
  dc = decode_dest3 (dst, 0);
  MATH_OP (dc, imm, 0, +, > 0xff);

  /** 1010 000w srcx dest  ADD.size:G src,dest */

  sc = decode_srcdest4(srcx, w);
  dc = decode_srcdest4(dest, w);
  b = get_src (sc);
  MATH_OP (dc, b, 0, +, > (w?0xffff:0xff));

  /** 0010 0d sr           ADD.B:S src,R0L/R0H */

  sc = decode_src2 (sr, 0, d);
  dc = decode_dest1 (d, 0);
  b = get_src (sc);
  MATH_OP (dc, b, 0, +, > 0xff);

  /** 0111 110w 1110 1011  ADD.size:G #IMM,sp */

  dc = reg_sd (sp);
  imm = sign_ext (IMM(w), w?16:8);
  MATH_OP (dc, imm, 0, +, > 0xffff);

  /** 0111 1101 1011 immm  ADD.size:Q #IMM,sp */

  dc = reg_sd (sp);
  imm = sign_ext (immm, 4);
  MATH_OP (dc, imm, 0, +, > 0xffff);

  /** 1111 100w immm dest  ADJNZ.size #IMM,dest,label */

  UNARY_UOP;
  imm = sign_ext(immm, 4);
  tprintf("%x + %d = %x\n", v, imm, v+imm);
  v += imm;
  put_dest (dc, v);
  a = sign_ext (IMM(0), 8);
  if ((v & (w ? 0xffff : 0xff)) != 0)
    {
      tprintf("jmp: %x + 2 + %d = ", get_reg (pc), a);
      put_reg (pc, orig_pc + 2 + a);
      tprintf("%x\n", get_reg (pc));
    }

  /** 0111 011w 0010 dest  AND.size:G #IMM,dest */

  UNARY_UOP;
  imm = IMM(w);
  tprintf ("%x & %x = %x\n", v, imm, v & imm);
  v &= imm;
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 1001 0dst            AND.B:S #IMM8,dest */

  imm = IMM(0);
  dc = decode_dest3 (dst, 0);
  v = get_src (dc);
  tprintf("%x & %x = %x\n", v, imm, v & imm);
  v &= imm;
  set_sz (v, 1);
  put_dest (dc, v);

  /** 1001 000w srcx dest  AND.size:G src.dest */

  BINARY_UOP;
  tprintf ("%x & %x = %x\n", a, b, a & b);
  v = a & b;
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 0001 0d sr           AND.B:S src,R0L/R0H */

  sc = decode_src2 (sr, 0, d);
  dc = decode_dest1 (d, 0);
  a = get_src (sc);
  b = get_src (dc);
  v = a & b;
  tprintf("%x & %x = %x\n", a, b, v);
  set_sz (v, 1);
  put_dest (dc, v);

  /** 0111 1110 0100 srcx  BAND src */

  BIT_OPC (srcx, b & carry);

  /** 0111 1110 1000 dest  BCLR:G dest */

  dc = decode_bit (dest);
  put_bit (dc, 0);

  /** 0100 0bit            BCLR:S bit,base:11[SB] */

  dc = decode_bit11 (bit);
  put_bit (dc, 0);

  /** 0111 1110 0010 dest  BMcnd dest  */

  dc = decode_bit (dest);
  if (condition_true (bmcnd_cond_map [IMM (0) & 15]))
    put_bit (dc, 1);
  else
    put_bit (dc, 0);

  /** 0111 1101 1101 cond  BMcnd C  */

  if (condition_true (cond))
    set_c (1);
  else
    set_c (0);

  /** 0111 1110 0101 srcx  BNAND src */

  BIT_OPC (srcx, (!b) & carry);

  /** 0111 1110 0111 srcx  BNOR src */

  BIT_OPC (srcx, (!b) | carry);

  /** 0111 1110 1010 dest  BNOT:G dest */

  BIT_OP (dest, !b);

  /** 0101 0bit            BNOT:S bit,base:11[SB] */

  dc = decode_bit11 (bit);
  put_bit (dc, !get_bit (dc));

  /** 0111 1110 0011 srcx  BNTST src */

  dc = decode_bit (srcx);
  b = get_bit (dc);
  set_zc (!b, !b);

  /** 0111 1110 1101 srcx  BNXOR src */

  BIT_OPC (srcx, !b ^ carry);

  /** 0111 1110 0110 srcx  BOR src */

  BIT_OPC (srcx, b | carry);

  /** 0000 0000            BRK */

  /* We report the break to our caller with the PC still pointing at the 
     breakpoint instruction.  */
  put_reg (pc, orig_pc);
  if (verbose)
    printf("[break]\n");
  return M32C_MAKE_HIT_BREAK ();

  /** 0111 1110 1001 dest  BSET:G dest */

  dc = decode_bit (dest);
  put_bit (dc, 1);

  /** 0100 1bit            BSET:S bit,base:11[SB] */

  dc = decode_bit11 (bit);
  put_bit (dc, 1);

  /** 0111 1110 1011 srcx  BTST:G src */

  dc = decode_bit (srcx);
  b = get_bit (dc);
  set_zc (!b, b);

  /** 0101 1bit            BTST:S bit,base:11[SB] */

  dc = decode_bit11 (bit);
  b = get_bit (dc);
  set_zc (!b, b);

  /** 0111 1110 0000 dest  BTSTC dest */

  dc = decode_bit (dest);
  b = get_bit (dc);
  set_zc (!b, b);
  put_bit (dc, 0);

  /** 0111 1110 0001 dest  BTSTS dest */

  dc = decode_bit (dest);
  b = get_bit (dc);
  set_zc (!b, b);
  put_bit (dc, 1);

  /** 0111 1110 1100 srcx  BXOR src */

  BIT_OPC (srcx, b ^ carry);

  /** 0111 011w 1000 dest  CMP.size:G #IMM,dest */

  UNARY_UOP;
  imm = IMM(w);
  cmp (v, imm, w);

  /** 1101 000w immm dest  CMP.size:Q #IMM,dest */

  UNARY_UOP;
  immm = sign_ext (immm, 4);
  cmp (v, immm, w);

  /** 1110 0dst            CMP.B:S #IMM8,dest */

  imm = IMM(0);
  dc = decode_dest3 (dst, 0);
  v = get_src (dc);
  cmp (v, imm, 0);

  /** 1100 000w srcx dest  CMP.size:G src,dest */

  BINARY_UOP;
  cmp(b, a, w);

  /** 0011 1d sr           CMP.B:S src,R0L/R0H */

  sc = decode_src2 (sr, 0, d);
  dc = decode_dest1 (d, 0);
  a = get_src (sc);
  b = get_src (dc);
  cmp (b, a, 0);

  /** 0111 110w 1110 i1c s  DADC,DADD,DSBB,DSUB */

  /* w = width, i = immediate, c = carry, s = subtract */

  int src = i ? IMM(w) : get_reg (w ? r1 : r0h);
  int dest = get_reg (w ? r0 : r0l);
  int res;

  src = bcd2int(src, w);
  dest = bcd2int(dest, w);

  tprintf("decimal: %d %s %d", dest, s?"-":"+", src);
  if (c)
    tprintf(" c=%d", carry);

  if (!s)
    {
      res = dest + src;
      if (c)
	res += carry;
      c = res > (w ? 9999 : 99);
    }
  else
    {
      res = dest - src;
      if (c)
	res -= (1-carry);
      c = res >= 0;
      if (res < 0)
	res += w ? 10000 : 100;
    }

  res = int2bcd (res, w);
  tprintf(" = %x\n", res);

  set_szc (res, w+1, c);

  put_reg (w ? r0 : r0l, res);

  /** 1010 1dst            DEC.B dest */

  dc = decode_dest3 (dst, 0);
  v = get_src (dc);
  tprintf("%x -- = %x\n", v, v-1);
  v --;
  set_sz (v, 1);
  put_dest (dc, v);

  /** 1111 d010            DEC.W dest */

  v = get_reg (d ? a1 : a0);
  tprintf("%x -- = %x\n", v, v-1);
  v --;
  set_sz (v, 2);
  put_reg (d ? a1 : a0, v);

  /** 0111 110w 1110 0001  DIV.size #IMM */

  div_op (-1, 0, 0, w);

  /** 0111 011w 1101 srcx  DIV.size src */

  div_op (srcx, 0, 0, w);

  /** 0111 110w 1110 0000  DIVU.size #IMM */

  div_op (-1, 1, 0, w);

  /** 0111 011w 1100 srcx  DIVU.size src */

  div_op (srcx, 1, 0, w);

  /** 0111 110w 1110 0011  DIVX.size #IMM */

  div_op (-1, 0, 1, w);

  /** 0111 011w 1001 srcx  DIVX.size src */

  div_op (srcx, 0, 1, w);

  /** 0111 1100 1111 0010  ENTER #IMM8 */

  imm = IMM(0);
  put_reg (sp, get_reg (sp) - 2);
  mem_put_hi (get_reg (sp), get_reg (fb));
  put_reg (fb, get_reg (sp));
  put_reg (sp, get_reg (sp) - imm);

  /** 0111 1101 1111 0010  EXITD */

  put_reg (sp, get_reg (fb));
  put_reg (fb, mem_get_hi (get_reg (sp)));
  put_reg (sp, get_reg (sp) + 2);
  put_reg (pc, mem_get_psi (get_reg (sp)));
  put_reg (sp, get_reg (sp) + 3);

  /** 0111 1100 0110 dest  EXTS.B dest */

  dc = decode_srcdest4 (dest, 0);
  v = sign_ext (get_src (dc), 8);
  dc = widen_sd (dc);
  put_dest (dc, v);
  set_sz (v, 1);

  /** 0111 1100 1111 0011  EXTS.W R0 */

  v = sign_ext (get_reg (r0), 16);
  put_reg (r2r0, v);
  set_sz (v, 2);

  /** 1110 1011 0flg 0101  FCLR dest */

  set_flags (1 << flg, 0);

  /** 1110 1011 0flg 0100  FSET dest */

  set_flags (1 << flg, 1 << flg);

  /** 1010 0dst            INC.B dest */

  dc = decode_dest3 (dst, 0);
  v = get_src (dc);
  tprintf("%x ++ = %x\n", v, v+1);
  v ++;
  set_sz (v, 1);
  put_dest (dc, v);

  /** 1011 d010            INC.W dest */

  v = get_reg (d ? a1 : a0);
  tprintf("%x ++ = %x\n", v, v+1);
  v ++;
  set_sz (v, 2);
  put_reg (d ? a1 : a0, v);

  /** 1110 1011 11vector   INT #imm */

  trigger_based_interrupt (vector);

  /** 1111 0110            INTO */

  if (FLAG_O)
    trigger_fixed_interrupt (0xffe0);

  /** 0110 1cnd            Jcnd label */

  v = sign_ext (IMM(0), 8);
  if (condition_true (cnd))
    put_reg (pc, orig_pc + 1 + v);

  /** 0111 1101 1100 cond  Jcnd label */

  v = sign_ext (IMM(0), 8);
  if (condition_true (cond))
    put_reg (pc, orig_pc + 2 + v);

  /** 0110 0dsp            JMP.S label */

  put_reg (pc, orig_pc + 2 + dsp);

  /** 1111 1110            JMP.B label */

  imm = sign_ext (IMM(0), 8);
  if (imm == -1)
    {
      if (verbose)
	printf("[jmp-to-self detected as exit]\n");
      return M32C_MAKE_HIT_BREAK ();
    }
  put_reg (pc, orig_pc + 1 + imm);

  /** 1111 0100            JMP.W label */

  imm = sign_ext (IMM(1), 16);
  put_reg (pc, orig_pc + 1 + imm);

  /** 1111 1100            JMP.A label */
  
  imm = IMM(2);
  put_reg (pc, imm);

  /** 0111 1101 0010 srcx  JMPI.W src */

  sc = decode_jumpdest (srcx, 1);
  a = get_src (sc);
  a = sign_ext (a, 16);
  put_reg (pc, orig_pc + a);

  /** 0111 1101 0000 srcx  JMPI.A src */

  sc = decode_jumpdest (srcx, 0);
  a = get_src (sc);
  put_reg (pc, a);

  /** 1110 1110            JMPS #IMM8 */

  M16C_ONLY();

  imm = IMM(0);
  a = 0xf0000 + mem_get_hi (0xffffe - imm * 2);
  put_reg (pc, a);

  /** 1111 0101            JSR.W label */

  imm = sign_ext (IMM(1), 16);
  put_reg (sp, get_reg (sp) - 3);
  mem_put_psi (get_reg (sp), get_reg (pc));
  put_reg (pc, orig_pc + imm + 1);

  /** 1111 1101            JSR.A label */

  imm = IMM(2);
  put_reg (sp, get_reg (sp) - 3);
  mem_put_psi (get_reg (sp), get_reg (pc));
  put_reg (pc, imm);

  /** 0111 1101 0011 srcx  JSRI.W src */

  sc = decode_jumpdest (srcx, 1);
  a = get_src (sc);
  a = sign_ext (a, 16);

  put_reg (sp, get_reg (sp) - 3);
  mem_put_psi (get_reg (sp), get_reg (pc));
  put_reg (pc, orig_pc + a);

  /** 0111 1101 0001 srcx  JSRI.A src */

  sc = decode_jumpdest (srcx, 0);
  a = get_src (sc);

  put_reg (sp, get_reg (sp) - 3);
  mem_put_psi (get_reg (sp), get_reg (pc));
  put_reg (pc, a);

  /** 1110 1111            JSRS #IMM8 */

  M16C_ONLY();

  imm = IMM(0);
  a = 0xf0000 + mem_get_hi (0xffffe - imm * 2);

  put_reg (sp, get_reg (sp) - 3);
  mem_put_psi (get_reg (sp), get_reg (pc));
  put_reg (pc, a);

  /** 1110 1011 0reg 0000  LDC #IMM16,dest */

  dc = decode_cr (reg);
  imm = IMM(1);
  put_dest (dc, imm);

  /** 0111 1010 1reg srcx  LDC src,dest */

  dc = decode_cr (reg);
  sc = decode_srcdest4 (srcx,1);
  put_dest (dc, get_src (sc));

  /** 0111 1100 1111 0000  LDCTX abs16,abs20 */

  NOTYET();

  /** 0111 010w 1000 dest  LDE.size abs20,dest */

  dc = decode_srcdest4 (dest, w);
  imm = IMM(2);
  if (w)
    v = mem_get_hi (imm);
  else
    v = mem_get_qi (imm);
  put_dest (dc, v);

  /** 0111 010w 1001 dest  LDE.size dsp:20[a0], dest */

  dc = decode_srcdest4 (dest, w);
  imm = IMM(2) + get_reg (a0);
  if (w)
    v = mem_get_hi (imm);
  else
    v = mem_get_qi (imm);
  put_dest (dc, v);

  /** 0111 010w 1010 dest  LDE.size [a1a0],dest */
  
  dc = decode_srcdest4 (dest, w);
  imm = get_reg (a1a0);
  if (w)
    v = mem_get_hi (imm);
  else
    v = mem_get_qi (imm);
  put_dest (dc, v);

  /** 0111 1101 1010 0imm  LDIPL #IMM */

  set_flags (0x700, imm*0x100);

  /** 0111 010w 1100 dest  MOV.size:G #IMM,dest */

  dc = decode_srcdest4 (dest, w);
  imm = IMM(w);
  v = imm;
  tprintf("%x = %x\n", v, v);
  set_sz(v, w+1);
  put_dest (dc, v);

  /** 1101 100w immm dest  MOV.size:Q #IMM,dest */

  dc = decode_srcdest4 (dest, w);
  v = sign_ext (immm, 4);
  tprintf ("%x = %x\n", v, v);
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 1100 0dst            MOV.B:S #IMM8,dest */

  imm = IMM(0);
  dc = decode_dest3 (dst, 0);
  v = imm;
  tprintf("%x = %x\n", v, v);
  set_sz (v, 1);
  put_dest (dc, v);

  /** 1w10 d010            MOV.size:S #IMM,dest */

  /* Note that for w, 0=W and 1=B unlike the usual meaning.  */
  v = IMM(1-w);
  tprintf("%x = %x\n", v, v);
  set_sz (v, 2-w);
  put_reg (d ? a1 : a0, v);

  /** 1011 0dst            MOV.B:Z #0,dest */

  dc = decode_dest3 (dst, 0);
  v = 0;
  set_sz (v, 1);
  put_dest (dc, v);

  /** 0111 001w srcx dest  MOV.size:G src,dest */

  sc = decode_srcdest4 (srcx, w);
  dc = decode_srcdest4 (dest, w);
  v = get_src (sc);
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 0011 0d sr           MOV.B:S src,dest */

  sc = decode_src2 (sr, 0, d);
  v = get_src (sc);
  set_sz (v, 1);
  put_reg (d ? a1 : a0, v);

  /** 0000 0s ds           MOV.B:S R0L/R0H,dest */

  if (ds == 0)
    UNSUPPORTED();
  dc = decode_src2 (ds, 0, s);
  v = get_reg (s ? r0h : r0l);
  set_sz (v, 1);
  put_dest (dc, v);

  /** 0000 1d sr           MOV.B:S src,R0L/R0H */

  sc = decode_src2 (sr, 0, d);
  v = get_src (sc);
  set_sz (v, 1);
  put_reg (d ? r0h : r0l, v);

  /** 0111 010w 1011 dest  MOV.size:G dsp:8[SP], dest */

  dc = decode_srcdest4 (dest, w);
  imm = IMM(0);
  a = get_reg (sp) + sign_ext (imm, 8);
  a &= addr_mask;
  if (w)
    v = mem_get_hi (a);
  else
    v = mem_get_qi (a);
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 0111 010w 0011 srcx  MOV.size:G src, disp8[SP] */

  sc = decode_srcdest4 (srcx, w);
  imm = IMM(0);
  a = get_reg (sp) + sign_ext (imm, 8);
  a &= addr_mask;
  v = get_src (sc);
  if (w)
    mem_put_hi (a, v);
  else
    mem_put_qi (a, v);
  set_sz (v, w+1);

  /** 1110 1011 0reg 1src  MOVA src,dest */

  static reg_id map[] = { r0, r1, r2, r3, a0, a1, 0, 0 };
  sc = decode_srcdest4 (8 + src, 0);
  put_reg (map[reg], sc.u.addr);

  /** 0111 1100 10hl dest  MOVdir R0L,dest */

  if (dest == 0 || dest == 4 || dest == 5)
    UNSUPPORTED();
  dc = decode_srcdest4 (dest, 0);
  a = get_src (dc);
  b = get_reg (r0l);
  switch (hl)
    {
    case 0: a = (a & 0xf0) | (b & 0x0f); break;
    case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
    case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
    case 3: a = (a & 0x0f) | (b & 0xf0); break;
    }
  put_dest (dc, a);

  /** 0111 1100 00hl srcx  MOVdir src,R0L */

  if (srcx == 0 || srcx == 4 || srcx == 5)
    UNSUPPORTED();
  sc = decode_srcdest4 (srcx, 0);
  a = get_reg (r0l);
  b = get_src (sc);
  switch (hl)
    {
    case 0: a = (a & 0xf0) | (b & 0x0f); break;
    case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
    case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
    case 3: a = (a & 0x0f) | (b & 0xf0); break;
    }
  put_reg (r0l, a);

  /** 0111 110w 0101 dest  MUL.size #IMM,dest */

  UNARY_SOP;
  imm = sign_ext (IMM(w), w?16:8);
  tprintf("%d * %d = %d\n", v, imm, v*imm);
  v *= imm;
  dc = widen_sd (dc);
  put_dest (dc, v);

  /** 0111 100w srcx dest  MUL.size src,dest */

  BINARY_SOP;
  v = a * b;
  tprintf("%d * %d = %d\n", a, b, v);
  dc = widen_sd (dc);
  put_dest (dc, v);

  /** 0111 110w 0100 dest  MULU.size #IMM,dest */

  UNARY_UOP;
  imm = IMM(w);
  tprintf("%u * %u = %u\n", v, imm, v*imm);
  v *= imm;
  dc = widen_sd (dc);
  put_dest (dc, v);

  /** 0111 000w srcx dest  MULU.size src,dest */

  BINARY_UOP;
  v = a * b;
  tprintf("%u * %u = %u\n", a, b, v);
  dc = widen_sd (dc);
  put_dest (dc, v);

  /** 0111 010w 0101 dest  NEG.size dest */

  UNARY_SOP;
  tprintf("%d * -1 = %d\n", v, -v);
  v = -v;
  set_oszc (v, w+1, v == 0);
  put_dest (dc, v);

  /** 0000 0100            NOP */

  tprintf("nop\n");

  /** 0111 010w 0111 dest  NOT.size:G */

  UNARY_UOP;
  tprintf("~ %x = %x\n", v, ~v);
  v = ~v;
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 1011 1dst            NOT.B:S dest */

  dc = decode_dest3 (dst, 0);
  v = get_src (dc);
  tprintf("~ %x = %x\n", v, ~v);
  v = ~v;
  set_sz (v, 1);
  put_dest (dc, v);

  /** 0111 011w 0011 dest  OR.size:G #IMM,dest */

  UNARY_UOP;
  imm = IMM(w);
  tprintf ("%x | %x = %x\n", v, imm, v | imm);
  v |= imm;
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 1001 1dst            OR.B:S #IMM8,dest */

  imm = IMM(0);
  dc = decode_dest3 (dst, 0);
  v = get_src (dc);
  tprintf("%x | %x = %x\n", v, imm, v|imm);
  v |= imm;
  set_sz (v, 1);
  put_dest (dc, v);

  /** 1001 100w srcx dest  OR.size:G src,dest */

  BINARY_UOP;
  tprintf ("%x | %x = %x\n", a, b, a | b);
  v = a | b;
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 0001 1d sr           OR.B:S src,R0L/R0H */

  sc = decode_src2 (sr, 0, d);
  dc = decode_dest1 (d, 0);
  a = get_src (sc);
  b = get_src (dc);
  v = a | b;
  tprintf("%x | %x = %x\n", a, b, v);
  set_sz (v, 1);
  put_dest (dc, v);

  /** 0111 010w 1101 dest  POP.size:G dest */

  dc = decode_srcdest4 (dest, w);
  if (w)
    {
      v = mem_get_hi (get_reg (sp));
      put_reg (sp, get_reg (sp) + 2);
      tprintf("pophi: %x\n", v);
    }
  else
    {
      v = mem_get_qi (get_reg (sp));
      put_reg (sp, get_reg (sp) + 1);
      tprintf("popqi: %x\n", v);
    }
  put_dest (dc, v);

  /** 1001 d010            POP.B:S dest */

  v = mem_get_qi (get_reg (sp));
  put_reg (d ? r0h : r0l, v);
  put_reg (sp, get_reg (sp) + 1);
  tprintf("popqi: %x\n", v);

  /** 1101 d010            POP.W:S dest */

  v = mem_get_hi (get_reg (sp));
  put_reg (d ? a1 : a0, v);
  put_reg (sp, get_reg (sp) + 2);
  tprintf("pophi: %x\n", v);

  /** 1110 1011 0reg 0011  POPC dest */

  dc = decode_cr (reg);
  v = mem_get_hi (get_reg (sp));
  put_dest (dc, v);
  put_reg (sp, get_reg (sp) + 2);
  tprintf("popc: %x\n", v);

  /** 1110 1101            POPM dest */

  static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb };
  imm = IMM(0);
  tprintf("popm: %x\n", imm);
  for (a=0; a<8; a++)
    if (imm & (1<<a))
      {
	v = mem_get_hi (get_reg (sp));
	put_reg (map[a], v);
	put_reg (sp, get_reg (sp) + 2);
      }

  /** 0111 110w 1110 0010  PUSH.size:G #IMM */

  imm = IMM(w);
  if (w)
    {
      put_reg (sp, get_reg (sp) - 2);
      mem_put_hi (get_reg (sp), imm);
      tprintf("pushhi %04x\n", imm);
    }
  else
    {
      put_reg (sp, get_reg (sp) - 1);
      mem_put_qi (get_reg (sp), imm);
      tprintf("pushqi %02x\n", imm);
    }

  /** 0111 010w 0100 srcx  PUSH.size:G src */

  sc = decode_srcdest4 (srcx, w);
  v = get_src (sc);
  if (w)
    {
      put_reg (sp, get_reg (sp) - 2);
      mem_put_hi (get_reg (sp), v);
      tprintf("pushhi: %x\n", v);
    }
  else
    {
      put_reg (sp, get_reg (sp) - 1);
      mem_put_qi (get_reg (sp), v);
      tprintf("pushqi: %x\n", v);
    }

  /** 1000 s010            PUSH.B:S src */

  v = get_reg (s ? r0h : r0l);
  put_reg (sp, get_reg (sp) - 1);
  mem_put_qi (get_reg (sp), v);
  tprintf("pushqi: %x\n", v);

  /** 1100 s010            PUSH.W:S src */

  v = get_reg (s ? a1 : a0);
  put_reg (sp, get_reg (sp) - 2);
  mem_put_hi (get_reg (sp), v);
  tprintf("pushhi: %x\n", v);

  /** 0111 1101 1001 srcx  PUSHA src */

  sc = decode_srcdest4 (srcx, 0);
  put_reg (sp, get_reg (sp) - 2);
  mem_put_hi (get_reg (sp), sc.u.addr);
  tprintf("pushhi: %x\n", sc.u.addr);

  /** 1110 1011 0src 0010  PUSHC src */

  sc = decode_cr (src);
  put_reg (sp, get_reg (sp) - 2);
  v = get_src (sc);
  mem_put_hi (get_reg (sp), v);
  tprintf("pushc: %x\n", v);

  /** 1110 1100            PUSHM src */

  static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 };
  imm = IMM(0);
  tprintf("pushm: %x\n", imm);
  for (a=0; a<8; a++)
    if (imm & (1<<a))
      {
	put_reg (sp, get_reg (sp) - 2);
	v = get_reg (map[a]);
	mem_put_hi (get_reg (sp), v);
      }

  /** 1111 1011            REIT */

  a = get_reg (sp);
  v = (mem_get_hi (a)
       + 4096 * (mem_get_qi (a+3) & 0xf0));
  b = (mem_get_qi (a+2)
       + 256 * (mem_get_qi (a+3) & 0xff));
  put_reg (pc, v);
  put_reg (flags, b);
  put_reg (sp, get_reg (sp) + 4);

  /** 0111 110w 1111 0001  RMPA.size */

  int count = get_reg (r3);
  int list1 = get_reg (a0);
  int list2 = get_reg (a1);
  int sum = get_reg (w ? r2r0 : r0);

  while (count)
    {
      if (w)
	{
	  a = sign_ext (mem_get_hi (list1), 16);
	  b = sign_ext (mem_get_hi (list2), 16);
	}
      else
	{
	  a = sign_ext (mem_get_qi (list1), 8);
	  b = sign_ext (mem_get_qi (list2), 8);
	}
      tprintf("%d + %d * %d = ", sum, a, b);
      sum += a * b;
      tprintf("%d\n", sum);
      list1 += w ? 2 : 1;
      list2 += w ? 2 : 1;
      count --;
    }
  put_reg (r3, count);
  put_reg (a0, list1);
  put_reg (a1, list2);
  put_reg (w ? r2r0 : r0, sum);

  /** 0111 011w 1010 dest  ROLC.size dest */

  dc = decode_srcdest4 (dest, w);
  rot_op (dc, 1, 1);

  /** 0111 011w 1011 dest  RORC.size dest */

  dc = decode_srcdest4 (dest, w);
  rot_op (dc, 1, -1);

  /** 1110 000w immm dest  ROT.size #IMM,dest */

  dc = decode_srcdest4 (dest, w);
  rot_op (dc, 0, IMM4());

  /** 0111 010w 0110 dest  ROT.size R1H,dest */

  dc = decode_srcdest4 (dest, w);
  rot_op (dc, 0, sign_ext (get_reg (r1h), 8));

  /** 1111 0011            RTS */

  put_reg (pc, mem_get_psi (get_reg (sp)));
  put_reg (sp, get_reg (sp) + 3);

  /** 0111 011w 0111 dest  SBB.size #IMM,dest */

  dc = decode_srcdest4 (dest, w);
  imm = IMM(w);
  MATH_OP (dc, imm, !carry, -, >= 0);

  /** 1011 100w srcx dest  SBB.size src,dest */

  sc = decode_srcdest4(srcx, w);
  dc = decode_srcdest4(dest, w);
  b = get_src (sc);
  MATH_OP (dc, b, !carry, -, >= 0);

  /** 1111 000w immm dest  SHA.size #IMM, dest */

  dc = decode_srcdest4(dest, w);
  shift_op (dc, 1, IMM4());

  /** 0111 010w 1111 dest  SHA.size R1H,dest */

  dc = decode_srcdest4(dest, w);
  a = sign_ext (get_reg (r1h), 8);
  shift_op (dc, 1, a);

  /** 1110 1011 101d immm  SHA.L #IMM, dest */

  dc = reg_sd (d ? r3r1 : r2r0);
  shift_op (dc, 1, IMM4());

  /** 1110 1011 001d 0001  SHA.L R1H,dest */

  dc = reg_sd (d ? r3r1 : r2r0);
  a = sign_ext (get_reg (r1h), 8);
  shift_op (dc, 1, a);

  /** 1110 100w immm dest  SHL.size #IMM, dest */

  dc = decode_srcdest4(dest, w);
  shift_op (dc, 0, IMM4());

  /** 0111 010w 1110 dest  SHL.size R1H,dest */

  dc = decode_srcdest4(dest, w);
  a = sign_ext (get_reg (r1h), 8);
  shift_op (dc, 0, a);

  /** 1110 1011 100d immm  SHL.L #IMM,dest */

  dc = reg_sd (d ? r3r1 : r2r0);
  shift_op (dc, 0, IMM4());

  /** 1110 1011 000d 0001  SHL.L R1H,dest */

  dc = reg_sd (d ? r3r1 : r2r0);
  a = sign_ext (get_reg (r1h), 8);
  shift_op (dc, 0, a);

  /** 0111 110w 1110 100b  SMOVB.size */

  int count = get_reg (r3);
  int s1 = get_reg (a0) + (get_reg (r1h) << 16);
  int s2 = get_reg (a1);
  int inc = (w ? 2 : 1) * (b ? -1 : 1);

  while (count)
    {
      if (w)
	{
	  v = mem_get_hi (s1);
	  mem_put_hi (s2, v);
	}
      else
	{
	  v = mem_get_qi (s1);
	  mem_put_qi (s2, v);
	}
      s1 += inc;
      s2 += inc;
      count --;
    }
  put_reg (r3, count);
  put_reg (a0, s1 & 0xffff);
  put_reg (a1, s2);
  put_reg (r1h, s1 >> 16);

  /** 0111 110w 1110 1010  SSTR.size */

  int count = get_reg (r3);
  int s1 = get_reg (a1);
  v = get_reg (w ? r0 : r0l);

  while (count)
    {
      if (w)
	{
	  mem_put_hi (s1, v);
	  s1 += 2;
	}
      else
	{
	  mem_put_qi (s1, v);
	  s1 += 1;
	}
      count --;
    }
  put_reg (r3, count);
  put_reg (a1, s1);

  /** 0111 1011 1src dest  STC src,dest */

  dc = decode_srcdest4 (dest, 1);
  sc = decode_cr (src);
  put_dest (dc, get_src(sc));

  /** 0111 1100 1100 dest  STC PC,dest */

  dc = decode_srcdest4 (dest, 1);
  dc.bytes = 3;
  put_dest (dc, orig_pc);

  /** 0111 1101 1111 0000  STCTX abs16,abs20 */

  NOTYET();

  /** 0111 010w 0000 srcx  STE.size src,abs20 */

  sc = decode_srcdest4 (srcx, w);
  a = IMM(2);
  v = get_src (sc);
  if (w)
    mem_put_hi (a, v);
  else
    mem_put_qi (a, v);
  if (srcx == 4 || srcx == 5)
    {
      v = get_reg (sc.u.reg);
      set_sz (v, 2);
    }
  else
    set_sz (v, w+1);
    
  /** 0111 010w 0001 srcx  STE.size src,disp20[a0] */

  sc = decode_srcdest4 (srcx, w);
  a = get_reg(a0) + IMM(2);
  v = get_src (sc);
  if (w)
    mem_put_hi (a, v);
  else
    mem_put_qi (a, v);
  if (srcx == 4 || srcx == 5)
    {
      v = get_reg (sc.u.reg);
      set_sz (v, 2);
    }
  else
    set_sz (v, w+1);

  /** 0111 010w 0010 srcx  STE.size src,[a1a0] */

  sc = decode_srcdest4 (srcx, w);
  a = get_reg(a1a0);
  v = get_src (sc);
  if (w)
    mem_put_hi (a, v);
  else
    mem_put_qi (a, v);
  if (srcx == 4 || srcx == 5)
    {
      v = get_reg (sc.u.reg);
      set_sz (v, 2);
    }
  else
    set_sz (v, w+1);

  /** 1101 0dst            STNZ #IMM8,dest */

  imm = IMM(0);
  dc = decode_dest3(dst, 0);
  if (!FLAG_Z)
    put_dest (dc, imm);

  /** 1100 1dst            STZ #IMM8,dest */

  imm = IMM(0);
  dc = decode_dest3(dst, 0);
  if (FLAG_Z)
    put_dest (dc, imm);

  /** 1101 1dst            STZX #IMM81,#IMM82,dest */

  a = IMM(0);
  dc = decode_dest3(dst, 0);
  b = IMM(0);
  if (FLAG_Z)
    put_dest (dc, a);
  else
    put_dest (dc, b);

  /** 0111 011w 0101 dest  SUB.size:G #IMM,dest */

  dc = decode_srcdest4 (dest, w);
  imm = IMM(w);
  MATH_OP (dc, imm, 0, -, >= 0);

  /** 1000 1dst            SUB.B:S #IMM8,dest */

  imm = IMM(0);
  dc = decode_dest3 (dst, 0);
  MATH_OP (dc, imm, 0, -, >= 0);

  /** 1010 100w srcx dest  SUB.size:G src,dest */

  sc = decode_srcdest4(srcx, w);
  dc = decode_srcdest4(dest, w);
  b = get_src (sc);
  MATH_OP (dc, b, 0, -, >= 0);

  /** 0010 1d sr           SUB.B:S src,R0L/R0H */

  sc = decode_src2 (sr, 0, d);
  dc = decode_dest1 (d, 0);
  b = get_src (sc);
  MATH_OP (dc, b, 0, -, >= 0);

  /** 0111 011w 0000 dest  TST.size #IMM, dest */

  UNARY_UOP;
  imm = IMM(w);
  tprintf ("%x & %x = %x\n", v, imm, v & imm);
  v &= imm;
  set_sz (v, w+1);

  /** 1000 000w srcx dest  TST.size src,dest */

  BINARY_UOP;
  tprintf ("%x & %x = %x\n", a, b, a & b);
  v = a & b;
  set_sz (v, w+1);

  /** 1111 1111            UND */

  trigger_fixed_interrupt (0xffdc);

  /** 0111 1101 1111 0011  WAIT */

  tprintf("waiting...\n");

  /** 0111 101w 00sr dest  XCHG.size src,dest */

  sc = decode_srcdest4 (sr, w);
  dc = decode_srcdest4 (dest, w);
  a = get_src (sc);
  b = get_src (dc);
  put_dest (dc, a);
  put_dest (sc, b);

  /** 0111 011w 0001 dest  XOR.size #IMM,dest */

  UNARY_UOP;
  imm = IMM(w);
  tprintf ("%x ^ %x = %x\n", v, imm, v ^ imm);
  v ^= imm;
  set_sz (v, w+1);
  put_dest (dc, v);

  /** 1000 100w srcx dest  XOR.size src,dest */

  BINARY_UOP;
  tprintf ("%x ^ %x = %x\n", a, b, a ^ b);
  v = a ^ b;
  set_sz (v, w+1);
  put_dest (dc, v);
  
  /**                      OP */
/** */

  return step_result;
}
