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