sim/ChangeLog:
[external/binutils.git] / sim / m32c / r8c.opc
1 /* r8c.opc --- semantics for r8c opcodes.                       -*- mode: c -*-
2
3 Copyright (C) 2005 Free Software Foundation, Inc.
4 Contributed by Red Hat, Inc.
5
6 This file is part of the GNU simulators.
7
8 The GNU simulators are free software; you can redistribute them and/or
9 modify them under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2 of the
11 License, or (at your option) any later version.
12
13 The GNU simulators are distributed in the hope that they will be
14 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with the GNU simulators; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA  */
22
23
24 #include <stdio.h>
25 #include <stdlib.h>
26
27 #include "cpu.h"
28 #include "mem.h"
29 #include "misc.h"
30 #include "int.h"
31
32 #define AU  __attribute__((unused))
33
34 #define tprintf if (trace) printf
35
36 static unsigned char
37 getbyte ()
38 {
39   int tsave = trace;
40   unsigned char b;
41
42   if (trace == 1)
43     trace = 0;
44   b = mem_get_pc ();
45   regs.r_pc ++;
46   trace = tsave;
47   return b;
48 }
49
50 #define M16C_ONLY() /* FIXME: add something here */
51
52 #define GETBYTE() (op[opi++] = getbyte())
53
54 #define UNSUPPORTED() unsupported("unsupported", orig_pc)
55 #define NOTYET() unsupported("unimplemented", orig_pc)
56
57 static void
58 unsupported (char *tag, int orig_pc)
59 {
60   int i;
61   printf("%s opcode at %08x\n", tag, orig_pc);
62   regs.r_pc = orig_pc;
63   for (i=0; i<2; i++)
64     {
65       int b = mem_get_pc();
66       printf(" %s", bits(b>>4, 4));
67       printf(" %s", bits(b, 4));
68       regs.r_pc ++;
69     }
70   printf("\n");
71   regs.r_pc = orig_pc;
72   for (i=0; i<6; i++)
73     {
74       printf(" %02x", mem_get_pc ());
75       regs.r_pc ++;
76     }
77   printf("\n");
78   exit(1);
79 }
80
81 static int
82 IMM(bw)
83 {
84   int rv = getbyte ();
85   if (bw)
86     rv = rv + 256 * getbyte();
87   if (bw == 2)
88     rv = rv + 65536 * getbyte();
89   return rv;
90 }
91
92 #define IMM4() (immm >= 8 ? 7 - immm : immm + 1)
93
94 #define UNARY_SOP \
95   dc = decode_srcdest4 (dest, w); \
96   v = sign_ext (get_src (dc), w?16:8);
97
98 #define UNARY_UOP \
99   dc = decode_srcdest4 (dest, w); \
100   v = get_src (dc);
101
102 #define BINARY_SOP \
103   sc = decode_srcdest4 (srcx, w); \
104   dc = decode_srcdest4 (dest, w); \
105   a = sign_ext (get_src (sc), w?16:8); \
106   b = sign_ext (get_src (dc), w?16:8);
107
108 #define BINARY_UOP \
109   sc = decode_srcdest4 (srcx, w); \
110   dc = decode_srcdest4 (dest, w); \
111   a = get_src (sc); \
112   b = get_src (dc);
113
114 #define carry (FLAG_C ? 1 : 0)
115
116 static void
117 cmp (int d, int s, int w)
118 {
119   int a, b, f=0;
120   int mask = w ? 0xffff : 0xff;
121   a = d - s;
122   b = sign_ext (d, w?16:8) - sign_ext (s, w?16:8);
123   tprintf ("cmp: %x - %x = %08x, %x - %x = %d\n",
124            d, s, a,
125            sign_ext(d,w?16:8), sign_ext(s,w?16:8), b);
126
127   if (b == 0)
128     f |= FLAGBIT_Z;
129   if (b & (w ? 0x8000 : 0x80))
130     f |= FLAGBIT_S;
131   if ((d & mask) >= (s & mask))
132     f |= FLAGBIT_C;
133   if (b < (w ? -32768 : -128) || b > (w ? 32767 : 127))
134     f |= FLAGBIT_O;
135
136   set_flags (FLAGBIT_Z | FLAGBIT_S | FLAGBIT_O | FLAGBIT_C, f);
137 }
138
139 static void
140 div_op (int s, int u, int x, int w)
141 {
142   srcdest sc;
143   int v, a, b;
144
145   if (s == -1)
146     s = IMM(w);
147   else
148     {
149       sc = decode_srcdest4 (s, w);
150       s = get_src (sc);
151     }
152
153   v = get_reg (w ? r2r0 : r0);
154
155   if (!u)
156     {
157       s = sign_ext (s, w ? 16 : 8);
158       v = sign_ext (v, w ? 16 : 8);
159     }
160
161   if (s == 0)
162     {
163       set_flags (FLAGBIT_O, FLAGBIT_O);
164       return;
165     }
166
167   if (u)
168     {
169       a = (unsigned int)v / (unsigned int)s;
170       b = (unsigned int)v % (unsigned int)s;
171     }
172   else
173     {
174       a = v / s;
175       b = v % s;
176     }
177   if (x)
178     {
179       if ((s > 0 && b < 0)
180           || (s < 0 && b > 0))
181         {
182           a --;
183           b += s;
184         }
185     }
186   tprintf ("%d / %d = %d rem %d\n", v, s, a, b);
187   if ((!u && (a > (w ? 32767 : 127)
188              || a < (w ? -32768 : -129)))
189       || (u && (a > (w ? 65536 : 255))))
190     set_flags (FLAGBIT_O, FLAGBIT_O);
191   else
192     set_flags (FLAGBIT_O, 0);
193
194   put_reg (w ? r0 : r0l, a);
195   put_reg (w ? r2 : r0h, b);
196 }
197
198 static void
199 rot_op (srcdest sd, int rotc, int count)
200 {
201   int mask = (sd.bytes == 2) ? 0xffff : 0xff;
202   int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
203   int v = get_src (sd);
204   int c = carry, ct;
205
206   tprintf("%s %x by %d\n", rotc ? "rotc" : "rot", v, count);
207   tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
208   while (count > 0)
209     {
210       ct = (v & msb) ? 1 : 0;
211       v <<= 1;
212       v |= rotc ? c : ct;
213       v &= mask;
214       c = ct;
215       tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
216       count --;
217     }
218   while (count < 0)
219     {
220       ct = v & 1;
221       v >>= 1;
222       v |= (rotc ? c : ct) * msb;
223       c = ct;
224       tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
225       count ++;
226     }
227   put_dest (sd, v);
228   set_szc (v, sd.bytes, c);
229 }
230
231 static void
232 shift_op (srcdest sd, int arith, int count)
233 {
234   int mask = (sd.bytes == 2) ? 0xffff : 0xff;
235   int msb = (sd.bytes == 2) ? 0x8000 : 0x80;
236   int v = get_src (sd);
237   int c = 0;
238
239   if (sd.bytes == 4)
240     {
241       mask = 0xffffffffU;
242       msb = 0x80000000U;
243     }
244
245   tprintf("%s %x by %d\n", arith ? "sha" : "shl", v, count);
246   tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
247   while (count > 0)
248     {
249       c = (v & msb) ? 1 : 0;
250       v <<= 1;
251       v &= mask;
252       tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
253       count --;
254     }
255   while (count < 0)
256     {
257       c = v & 1;
258       if (arith)
259         v = (v & msb) | (v >> 1);
260       else
261         v = (v >> 1) & (msb - 1);
262       tprintf (": %s %d\n", bits(v, 8*sd.bytes), c);
263       count ++;
264     }
265   put_dest (sd, v);
266   set_szc (v, sd.bytes, c);
267 }
268
269 #define MATH_OP(dc,s,c,op,carryrel) \
270   a = get_src(dc); \
271   b = s & b2mask[dc.bytes]; \
272   v2 = a op b op c; \
273   tprintf("0x%x " #op " 0x%x " #op " 0x%x = 0x%x\n", a, b, c, v2); \
274   a = sign_ext (a, dc.bytes * 8); \
275   b = sign_ext (s, dc.bytes * 8); \
276   v = a op b op c; \
277   tprintf("%d " #op " %d " #op " %d = %d\n", a, b, c, v); \
278   set_oszc (v, dc.bytes, v2 carryrel); \
279   put_dest (dc, v2);
280
281 #define BIT_OP(field,expr) \
282   dc = decode_bit (field); \
283   b = get_bit (dc); \
284   v = expr; \
285   tprintf ("b=%d, carry=%d, %s = %d\n", b, carry, #expr, v); \
286   put_bit (dc, v);
287
288 #define BIT_OPC(field,expr) \
289   dc = decode_bit (field); \
290   b = get_bit (dc); \
291   v = expr; \
292   tprintf ("b=%d, carry=%d, %s = %d\n", b, carry, #expr, v); \
293   set_c (v);
294
295 int
296 decode_r8c()
297 {
298   unsigned char op[40];
299   int opi = 0;
300   int v, v2, a, b;
301   int orig_pc = get_reg (pc);
302   srcdest sc, dc;
303   int imm;
304
305   step_result = M32C_MAKE_STEPPED ();
306
307   tprintf("trace: decode pc = %05x\n", orig_pc);
308
309   /** VARY dst 011 100 101 110 111 */
310
311   /** 0111 011w 1111 dest  ABS.size dest */
312
313   UNARY_SOP;
314   a = v<0 ? -v : v;
315   tprintf("abs(%d) = %d\n", v, a);
316   set_osz(a, w+1);
317   put_dest (dc, a);
318
319   /** 0111 011w 0110 dest  ADC.size #IMM,dest */
320
321   dc = decode_srcdest4(dest, w);
322   imm = IMM(w);
323   MATH_OP (dc, imm, carry, +, > (w?0xffff:0xff));
324
325   /** 1011 000w srcx dest  ADC.size src,dest */
326
327   sc = decode_srcdest4(srcx, w);
328   dc = decode_srcdest4(dest, w);
329   b = get_src (sc);
330   MATH_OP (dc, b, carry, +, > (w?0xffff:0xff));
331
332   /** 0111 011w 1110 dest  ADCF.size dest */
333
334   dc = decode_srcdest4(dest, w);
335   MATH_OP (dc, 0, carry, +, > (w?0xffff:0xff));
336
337   /** 0111 011w 0100 dest  ADD.size:G #imm,dest */
338
339   dc = decode_srcdest4(dest, w);
340   imm = IMM(w);
341   MATH_OP (dc, imm, 0, +, > (w?0xffff:0xff));
342
343   /** 1100 100w immm dest  ADD.size:Q #IMM,dest */
344
345   dc = decode_srcdest4(dest, w);
346   imm = sign_ext (immm, 4);
347   MATH_OP (dc, imm, 0, +, > (w?0xffff:0xff));
348
349   /** 1000 0dst            ADD.B:S #IMM8,dst */
350
351   imm = IMM(0);
352   dc = decode_dest3 (dst, 0);
353   MATH_OP (dc, imm, 0, +, > 0xff);
354
355   /** 1010 000w srcx dest  ADD.size:G src,dest */
356
357   sc = decode_srcdest4(srcx, w);
358   dc = decode_srcdest4(dest, w);
359   b = get_src (sc);
360   MATH_OP (dc, b, 0, +, > (w?0xffff:0xff));
361
362   /** 0010 0d sr           ADD.B:S src,R0L/R0H */
363
364   sc = decode_src2 (sr, 0, d);
365   dc = decode_dest1 (d, 0);
366   b = get_src (sc);
367   MATH_OP (dc, b, 0, +, > 0xff);
368
369   /** 0111 110w 1110 1011  ADD.size:G #IMM,sp */
370
371   dc = reg_sd (sp);
372   imm = sign_ext (IMM(w), w?16:8);
373   MATH_OP (dc, imm, 0, +, > 0xffff);
374
375   /** 0111 1101 1011 immm  ADD.size:Q #IMM,sp */
376
377   dc = reg_sd (sp);
378   imm = sign_ext (immm, 4);
379   MATH_OP (dc, imm, 0, +, > 0xffff);
380
381   /** 1111 100w immm dest  ADJNZ.size #IMM,dest,label */
382
383   UNARY_UOP;
384   imm = sign_ext(immm, 4);
385   tprintf("%x + %d = %x\n", v, imm, v+imm);
386   v += imm;
387   put_dest (dc, v);
388   a = sign_ext (IMM(0), 8);
389   if ((v & (w ? 0xffff : 0xff)) != 0)
390     {
391       tprintf("jmp: %x + 2 + %d = ", get_reg (pc), a);
392       put_reg (pc, orig_pc + 2 + a);
393       tprintf("%x\n", get_reg (pc));
394     }
395
396   /** 0111 011w 0010 dest  AND.size:G #IMM,dest */
397
398   UNARY_UOP;
399   imm = IMM(w);
400   tprintf ("%x & %x = %x\n", v, imm, v & imm);
401   v &= imm;
402   set_sz (v, w+1);
403   put_dest (dc, v);
404
405   /** 1001 0dst            AND.B:S #IMM8,dest */
406
407   imm = IMM(0);
408   dc = decode_dest3 (dst, 0);
409   v = get_src (dc);
410   tprintf("%x & %x = %x\n", v, imm, v & imm);
411   v &= imm;
412   set_sz (v, 1);
413   put_dest (dc, v);
414
415   /** 1001 000w srcx dest  AND.size:G src.dest */
416
417   BINARY_UOP;
418   tprintf ("%x & %x = %x\n", a, b, a & b);
419   v = a & b;
420   set_sz (v, w+1);
421   put_dest (dc, v);
422
423   /** 0001 0d sr           AND.B:S src,R0L/R0H */
424
425   sc = decode_src2 (sr, 0, d);
426   dc = decode_dest1 (d, 0);
427   a = get_src (sc);
428   b = get_src (dc);
429   v = a & b;
430   tprintf("%x & %x = %x\n", a, b, v);
431   set_sz (v, 1);
432   put_dest (dc, v);
433
434   /** 0111 1110 0100 srcx  BAND src */
435
436   BIT_OPC (srcx, b & carry);
437
438   /** 0111 1110 1000 dest  BCLR:G dest */
439
440   dc = decode_bit (dest);
441   put_bit (dc, 0);
442
443   /** 0100 0bit            BCLR:S bit,base:11[SB] */
444
445   dc = decode_bit11 (bit);
446   put_bit (dc, 0);
447
448   /** 0111 1110 0010 dest  BMcnd dest  */
449
450   dc = decode_bit (dest);
451   if (condition_true (IMM (0)))
452     put_bit (dc, 1);
453   else
454     put_bit (dc, 0);
455
456   /** 0111 1101 1101 cond  BMcnd C  */
457
458   if (condition_true (cond))
459     set_c (1);
460   else
461     set_c (0);
462
463   /** 0111 1110 0101 srcx  BNAND src */
464
465   BIT_OPC (srcx, !b & carry);
466
467   /** 0111 1110 0111 srcx  BNOR src */
468
469   BIT_OPC (srcx, !b | carry);
470
471   /** 0111 1110 1010 dest  BNOT:G dest */
472
473   BIT_OP (dest, !b);
474
475   /** 0101 0bit            BNOT:S bit,base:11[SB] */
476
477   dc = decode_bit11 (bit);
478   put_bit (dc, !get_bit (dc));
479
480   /** 0111 1110 0011 srcx  BNTST src */
481
482   dc = decode_bit (srcx);
483   b = get_bit (dc);
484   set_zc (!b, !b);
485
486   /** 0111 1110 1101 srcx  BNXOR src */
487
488   BIT_OPC (srcx, !b ^ carry);
489
490   /** 0111 1110 0110 srcx  BOR src */
491
492   BIT_OPC (srcx, b | carry);
493
494   /** 0000 0000            BRK */
495
496   /* We report the break to our caller with the PC still pointing at the 
497      breakpoint instruction.  */
498   put_reg (pc, orig_pc);
499   if (verbose)
500     printf("[break]\n");
501   return M32C_MAKE_HIT_BREAK ();
502
503   /** 0111 1110 1001 dest  BSET:G dest */
504
505   dc = decode_bit (dest);
506   put_bit (dc, 1);
507
508   /** 0100 1bit            BSET:S bit,base:11[SB] */
509
510   dc = decode_bit11 (bit);
511   put_bit (dc, 1);
512
513   /** 0111 1110 1011 srcx  BTST:G src */
514
515   dc = decode_bit (srcx);
516   b = get_bit (dc);
517   set_zc (!b, b);
518
519   /** 0101 1bit            BTST:S bit,base:11[SB] */
520
521   dc = decode_bit11 (bit);
522   b = get_bit (dc);
523   set_zc (!b, b);
524
525   /** 0111 1110 0000 dest  BTSTC dest */
526
527   dc = decode_bit (dest);
528   b = get_bit (dc);
529   set_zc (!b, b);
530   put_bit (dc, 0);
531
532   /** 0111 1110 0001 dest  BTSTS dest */
533
534   dc = decode_bit (dest);
535   b = get_bit (dc);
536   set_zc (!b, b);
537   put_bit (dc, 1);
538
539   /** 0111 1110 1100 srcx  BXOR src */
540
541   BIT_OPC (srcx, b ^ carry);
542
543   /** 0111 011w 1000 dest  CMP.size:G #IMM,dest */
544
545   UNARY_UOP;
546   imm = IMM(w);
547   cmp (v, imm, w);
548
549   /** 1101 000w immm dest  CMP.size:Q #IMM,dest */
550
551   UNARY_UOP;
552   immm = sign_ext (immm, 4);
553   cmp (v, immm, w);
554
555   /** 1110 0dst            CMP.B:S #IMM8,dest */
556
557   imm = IMM(0);
558   dc = decode_dest3 (dst, 0);
559   v = get_src (dc);
560   cmp (v, imm, 0);
561
562   /** 1100 000w srcx dest  CMP.size:G src,dest */
563
564   BINARY_UOP;
565   cmp(b, a, w);
566
567   /** 0011 1d sr           CMP.B:S src,R0L/R0H */
568
569   sc = decode_src2 (sr, 0, d);
570   dc = decode_dest1 (d, 0);
571   a = get_src (sc);
572   b = get_src (dc);
573   cmp (b, a, 0);
574
575   /** 0111 110w 1110 i1c s  DADC,DADD,DSBB,DSUB */
576
577   /* w = width, i = immediate, c = carry, s = subtract */
578
579   int src = i ? IMM(w) : get_reg (w ? r1 : r0h);
580   int dest = get_reg (w ? r0 : r0l);
581   int res;
582
583   src = bcd2int(src, w);
584   dest = bcd2int(dest, w);
585
586   tprintf("decimal: %d %s %d", dest, s?"-":"+", src);
587   if (c)
588     tprintf(" c=%d", carry);
589
590   if (!s)
591     {
592       res = dest + src;
593       if (c)
594         res += carry;
595       c = res > (w ? 9999 : 99);
596     }
597   else
598     {
599       res = dest - src;
600       if (c)
601         res -= (1-carry);
602       c = res >= 0;
603       if (res < 0)
604         res += w ? 10000 : 100;
605     }
606
607   res = int2bcd (res, w);
608   tprintf(" = %x\n", res);
609
610   set_szc (res, w+1, c);
611
612   put_reg (w ? r0 : r0l, res);
613
614   /** 1010 1dst            DEC.B dest */
615
616   dc = decode_dest3 (dst, 0);
617   v = get_src (dc);
618   tprintf("%x -- = %x\n", v, v-1);
619   v --;
620   set_sz (v, 1);
621   put_dest (dc, v);
622
623   /** 1111 d010            DEC.W dest */
624
625   v = get_reg (d ? a1 : a0);
626   tprintf("%x -- = %x\n", v, v-1);
627   v --;
628   set_sz (v, 2);
629   put_reg (d ? a1 : a0, v);
630
631   /** 0111 110w 1110 0001  DIV.size #IMM */
632
633   div_op (-1, 0, 0, w);
634
635   /** 0111 011w 1101 srcx  DIV.size src */
636
637   div_op (srcx, 0, 0, w);
638
639   /** 0111 110w 1110 0000  DIVU.size #IMM */
640
641   div_op (-1, 1, 0, w);
642
643   /** 0111 011w 1100 srcx  DIVU.size src */
644
645   div_op (srcx, 1, 0, w);
646
647   /** 0111 110w 1110 0011  DIVX.size #IMM */
648
649   div_op (-1, 0, 1, w);
650
651   /** 0111 011w 1001 srcx  DIVX.size src */
652
653   div_op (srcx, 0, 1, w);
654
655   /** 0111 1100 1111 0010  ENTER #IMM8 */
656
657   imm = IMM(0);
658   put_reg (sp, get_reg (sp) - 2);
659   mem_put_hi (get_reg (sp), get_reg (fb));
660   put_reg (fb, get_reg (sp));
661   put_reg (sp, get_reg (sp) - imm);
662
663   /** 0111 1101 1111 0010  EXITD */
664
665   put_reg (sp, get_reg (fb));
666   put_reg (fb, mem_get_hi (get_reg (sp)));
667   put_reg (sp, get_reg (sp) + 2);
668   put_reg (pc, mem_get_psi (get_reg (sp)));
669   put_reg (sp, get_reg (sp) + 3);
670
671   /** 0111 1100 0110 dest  EXTS.B dest */
672
673   dc = decode_srcdest4 (dest, 0);
674   v = sign_ext (get_src (dc), 8);
675   dc = widen_sd (dc);
676   put_dest (dc, v);
677   set_sz (v, 1);
678
679   /** 0111 1100 1111 0011  EXTS.W R0 */
680
681   v = sign_ext (get_reg (r0), 16);
682   put_reg (r2r0, v);
683   set_sz (v, 2);
684
685   /** 1110 1011 0flg 0101  FCLR dest */
686
687   set_flags (1 << flg, 0);
688
689   /** 1110 1011 0flg 0100  FSET dest */
690
691   set_flags (1 << flg, 1 << flg);
692
693   /** 1010 0dst            INC.B dest */
694
695   dc = decode_dest3 (dst, 0);
696   v = get_src (dc);
697   tprintf("%x ++ = %x\n", v, v+1);
698   v ++;
699   set_sz (v, 1);
700   put_dest (dc, v);
701
702   /** 1011 d010            INC.W dest */
703
704   v = get_reg (d ? a1 : a0);
705   tprintf("%x ++ = %x\n", v, v+1);
706   v ++;
707   set_sz (v, 2);
708   put_reg (d ? a1 : a0, v);
709
710   /** 1110 1011 11vector   INT #imm */
711
712   trigger_based_interrupt (vector);
713
714   /** 1111 0110            INTO */
715
716   if (FLAG_O)
717     trigger_fixed_interrupt (0xffe0);
718
719   /** 0110 1cnd            Jcnd label */
720
721   v = sign_ext (IMM(0), 8);
722   if (condition_true (cnd))
723     put_reg (pc, orig_pc + 1 + v);
724
725   /** 0111 1101 1100 cond  Jcnd label */
726
727   v = sign_ext (IMM(0), 8);
728   if (condition_true (cond))
729     put_reg (pc, orig_pc + 2 + v);
730
731   /** 0110 0dsp            JMP.S label */
732
733   put_reg (pc, orig_pc + 2 + dsp);
734
735   /** 1111 1110            JMP.B label */
736
737   imm = sign_ext (IMM(0), 8);
738   if (imm == -1)
739     {
740       if (verbose)
741         printf("[jmp-to-self detected as exit]\n");
742       return M32C_MAKE_HIT_BREAK ();
743     }
744   put_reg (pc, orig_pc + 1 + imm);
745
746   /** 1111 0100            JMP.W label */
747
748   imm = sign_ext (IMM(1), 16);
749   put_reg (pc, orig_pc + 1 + imm);
750
751   /** 1111 1100            JMP.A label */
752   
753   imm = IMM(2);
754   put_reg (pc, imm);
755
756   /** 0111 1101 0010 srcx  JMPI.W src */
757
758   sc = decode_jumpdest (srcx, 1);
759   a = get_src (sc);
760   a = sign_ext (a, 16);
761   put_reg (pc, orig_pc + a);
762
763   /** 0111 1101 0000 srcx  JMPI.A src */
764
765   sc = decode_jumpdest (srcx, 0);
766   a = get_src (sc);
767   put_reg (pc, a);
768
769   /** 1110 1110            JMPS #IMM8 */
770
771   M16C_ONLY();
772
773   imm = IMM(0);
774   a = 0xf0000 + mem_get_hi (0xffffe - imm * 2);
775   put_reg (pc, a);
776
777   /** 1111 0101            JSR.W label */
778
779   imm = sign_ext (IMM(1), 16);
780   put_reg (sp, get_reg (sp) - 3);
781   mem_put_psi (get_reg (sp), get_reg (pc));
782   put_reg (pc, orig_pc + imm + 1);
783
784   /** 1111 1101            JSR.A label */
785
786   imm = IMM(2);
787   put_reg (sp, get_reg (sp) - 3);
788   mem_put_psi (get_reg (sp), get_reg (pc));
789   put_reg (pc, imm);
790
791   /** 0111 1101 0011 srcx  JSRI.W src */
792
793   sc = decode_jumpdest (srcx, 1);
794   a = get_src (sc);
795   a = sign_ext (a, 16);
796
797   put_reg (sp, get_reg (sp) - 3);
798   mem_put_psi (get_reg (sp), get_reg (pc));
799   put_reg (pc, orig_pc + a);
800
801   /** 0111 1101 0001 srcx  JSRI.A src */
802
803   sc = decode_jumpdest (srcx, 0);
804   a = get_src (sc);
805
806   put_reg (sp, get_reg (sp) - 3);
807   mem_put_psi (get_reg (sp), get_reg (pc));
808   put_reg (pc, a);
809
810   /** 1110 1111            JSRS #IMM8 */
811
812   M16C_ONLY();
813
814   imm = IMM(0);
815   a = 0xf0000 + mem_get_hi (0xffffe - imm * 2);
816
817   put_reg (sp, get_reg (sp) - 3);
818   mem_put_psi (get_reg (sp), get_reg (pc));
819   put_reg (pc, a);
820
821   /** 1110 1011 0reg 0000  LDC #IMM16,dest */
822
823   dc = decode_cr (reg);
824   imm = IMM(1);
825   put_dest (dc, imm);
826
827   /** 0111 1010 1reg srcx  LDC src,dest */
828
829   dc = decode_cr (reg);
830   sc = decode_srcdest4 (srcx,1);
831   put_dest (dc, get_src (sc));
832
833   /** 0111 1100 1111 0000  LDCTX abs16,abs20 */
834
835   NOTYET();
836
837   /** 0111 010w 1000 dest  LDE.size abs20,dest */
838
839   dc = decode_srcdest4 (dest, w);
840   imm = IMM(2);
841   if (w)
842     v = mem_get_hi (imm);
843   else
844     v = mem_get_qi (imm);
845   put_dest (dc, v);
846
847   /** 0111 010w 1001 dest  LDE.size dsp:20[a0], dest */
848
849   dc = decode_srcdest4 (dest, w);
850   imm = IMM(2) + get_reg (a0);
851   if (w)
852     v = mem_get_hi (imm);
853   else
854     v = mem_get_qi (imm);
855   put_dest (dc, v);
856
857   /** 0111 010w 1010 dest  LDE.size [a1a0],dest */
858   
859   dc = decode_srcdest4 (dest, w);
860   imm = get_reg (a1a0);
861   if (w)
862     v = mem_get_hi (imm);
863   else
864     v = mem_get_qi (imm);
865   put_dest (dc, v);
866
867   /** 0111 1101 1010 0imm  LDIPL #IMM */
868
869   set_flags (0x700, imm*0x100);
870
871   /** 0111 010w 1100 dest  MOV.size:G #IMM,dest */
872
873   UNARY_UOP;
874   imm = IMM(w);
875   v = imm;
876   tprintf("%x = %x\n", v, v);
877   set_sz(v, w+1);
878   put_dest (dc, v);
879
880   /** 1101 100w immm dest  MOV.size:Q #IMM,dest */
881
882   UNARY_SOP;
883   v = sign_ext (immm, 4);
884   tprintf ("%x = %x\n", v, v);
885   set_sz (v, w+1);
886   put_dest (dc, v);
887
888   /** 1100 0dst            MOV.B:S #IMM8,dest */
889
890   imm = IMM(0);
891   dc = decode_dest3 (dst, 0);
892   v = imm;
893   tprintf("%x = %x\n", v, v);
894   set_sz (v, 1);
895   put_dest (dc, v);
896
897   /** 1w10 d010            MOV.size:S #IMM,dest */
898
899   /* Note that for w, 0=W and 1=B unlike the usual meaning.  */
900   v = IMM(1-w);
901   tprintf("%x = %x\n", v, v);
902   set_sz (v, 2-w);
903   put_reg (d ? a1 : a0, v);
904
905   /** 1011 0dst            MOV.B:Z #0,dest */
906
907   dc = decode_dest3 (dst, 0);
908   v = 0;
909   set_sz (v, 1);
910   put_dest (dc, v);
911
912   /** 0111 001w srcx dest  MOV.size:G src,dest */
913
914   sc = decode_srcdest4 (srcx, w);
915   dc = decode_srcdest4 (dest, w);
916   v = get_src (sc);
917   set_sz (v, w+1);
918   put_dest (dc, v);
919
920   /** 0011 0d sr           MOV.B:S src,dest */
921
922   sc = decode_src2 (sr, 0, d);
923   v = get_src (sc);
924   set_sz (v, 1);
925   put_reg (d ? a1 : a0, v);
926
927   /** 0000 0s ds           MOV.B:S R0L/R0H,dest */
928
929   if (ds == 0)
930     UNSUPPORTED();
931   dc = decode_src2 (ds, 0, s);
932   v = get_reg (s ? r0h : r0l);
933   set_sz (v, 1);
934   put_dest (dc, v);
935
936   /** 0000 1d sr           MOV.B:S src,R0L/R0H */
937
938   sc = decode_src2 (sr, 0, d);
939   v = get_src (sc);
940   set_sz (v, 1);
941   put_reg (d ? r0h : r0l, v);
942
943   /** 0111 010w 1011 dest  MOV.size:G dsp:8[SP], dest */
944
945   dc = decode_srcdest4 (dest, w);
946   imm = IMM(0);
947   a = get_reg (sp) + sign_ext (imm, 8);
948   a &= addr_mask;
949   if (w)
950     v = mem_get_hi (a);
951   else
952     v = mem_get_qi (a);
953   set_sz (v, w+1);
954   put_dest (dc, v);
955
956   /** 0111 010w 0011 srcx  MOV.size:G src, disp8[SP] */
957
958   sc = decode_srcdest4 (srcx, w);
959   imm = IMM(0);
960   a = get_reg (sp) + sign_ext (imm, 8);
961   a &= addr_mask;
962   v = get_src (sc);
963   if (w)
964     mem_put_hi (a, v);
965   else
966     mem_put_qi (a, v);
967   set_sz (v, w+1);
968
969   /** 1110 1011 0reg 1src  MOVA src,dest */
970
971   static reg_id map[] = { r0, r1, r2, r3, a0, a1, 0, 0 };
972   sc = decode_srcdest4 (8 + src, 0);
973   put_reg (map[reg], sc.u.addr);
974
975   /** 0111 1100 10hl dest  MOVdir R0L,dest */
976
977   if (dest == 0 || dest == 4 || dest == 5)
978     UNSUPPORTED();
979   dc = decode_srcdest4 (dest, 0);
980   a = get_src (dc);
981   b = get_reg (r0l);
982   switch (hl)
983     {
984     case 0: a = (a & 0xf0) | (b & 0x0f); break;
985     case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
986     case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
987     case 3: a = (a & 0x0f) | (b & 0xf0); break;
988     }
989   put_dest (dc, a);
990
991   /** 0111 1100 00hl srcx  MOVdir src,R0L */
992
993   if (srcx == 0 || srcx == 4 || srcx == 5)
994     UNSUPPORTED();
995   sc = decode_srcdest4 (srcx, 0);
996   a = get_reg (r0l);
997   b = get_src (sc);
998   switch (hl)
999     {
1000     case 0: a = (a & 0xf0) | (b & 0x0f); break;
1001     case 1: a = (a & 0xf0) | ((b>>4) & 0x0f); break;
1002     case 2: a = (a & 0x0f) | ((b & 0x0f)<<4); break;
1003     case 3: a = (a & 0x0f) | (b & 0xf0); break;
1004     }
1005   put_reg (r0l, a);
1006
1007   /** 0111 110w 0101 dest  MUL.size #IMM,dest */
1008
1009   UNARY_SOP;
1010   imm = sign_ext (IMM(w), w?16:8);
1011   tprintf("%d * %d = %d\n", v, imm, v*imm);
1012   v *= imm;
1013   dc = widen_sd (dc);
1014   put_dest (dc, v);
1015
1016   /** 0111 100w srcx dest  MUL.size src,dest */
1017
1018   BINARY_SOP;
1019   v = a * b;
1020   tprintf("%d * %d = %d\n", a, b, v);
1021   dc = widen_sd (dc);
1022   put_dest (dc, v);
1023
1024   /** 0111 110w 0100 dest  MULU.size #IMM,dest */
1025
1026   UNARY_UOP;
1027   imm = IMM(w);
1028   tprintf("%u * %u = %u\n", v, imm, v*imm);
1029   v *= imm;
1030   dc = widen_sd (dc);
1031   put_dest (dc, v);
1032
1033   /** 0111 000w srcx dest  MULU.size src,dest */
1034
1035   BINARY_UOP;
1036   v = a * b;
1037   tprintf("%u * %u = %u\n", a, b, v);
1038   dc = widen_sd (dc);
1039   put_dest (dc, v);
1040
1041   /** 0111 010w 0101 dest  NEG.size dest */
1042
1043   UNARY_SOP;
1044   tprintf("%d * -1 = %d\n", v, -v);
1045   v = -v;
1046   set_oszc (v, w+1, v == 0);
1047   put_dest (dc, v);
1048
1049   /** 0000 0100            NOP */
1050
1051   tprintf("nop\n");
1052
1053   /** 0111 010w 0111 dest  NOT.size:G */
1054
1055   UNARY_UOP;
1056   tprintf("~ %x = %x\n", v, ~v);
1057   v = ~v;
1058   set_sz (v, w+1);
1059   put_dest (dc, v);
1060
1061   /** 1011 1dst            NOT.B:S dest */
1062
1063   dc = decode_dest3 (dst, 0);
1064   v = get_src (dc);
1065   tprintf("~ %x = %x\n", v, ~v);
1066   v = ~v;
1067   set_sz (v, 1);
1068   put_dest (dc, v);
1069
1070   /** 0111 011w 0011 dest  OR.size:G #IMM,dest */
1071
1072   UNARY_UOP;
1073   imm = IMM(w);
1074   tprintf ("%x | %x = %x\n", v, imm, v | imm);
1075   v |= imm;
1076   set_sz (v, w+1);
1077   put_dest (dc, v);
1078
1079   /** 1001 1dst            OR.B:S #IMM8,dest */
1080
1081   imm = IMM(0);
1082   dc = decode_dest3 (dst, 0);
1083   v = get_src (dc);
1084   tprintf("%x | %x = %x\n", v, imm, v|imm);
1085   v |= imm;
1086   set_sz (v, 1);
1087   put_dest (dc, v);
1088
1089   /** 1001 100w srcx dest  OR.size:G src,dest */
1090
1091   BINARY_UOP;
1092   tprintf ("%x | %x = %x\n", a, b, a | b);
1093   v = a | b;
1094   set_sz (v, w+1);
1095   put_dest (dc, v);
1096
1097   /** 0001 1d sr           OR.B:S src,R0L/R0H */
1098
1099   sc = decode_src2 (sr, 0, d);
1100   dc = decode_dest1 (d, 0);
1101   a = get_src (sc);
1102   b = get_src (dc);
1103   v = a | b;
1104   tprintf("%x | %x = %x\n", a, b, v);
1105   set_sz (v, 1);
1106   put_dest (dc, v);
1107
1108   /** 0111 010w 1101 dest  POP.size:G dest */
1109
1110   dc = decode_srcdest4 (dest, w);
1111   if (w)
1112     {
1113       v = mem_get_hi (get_reg (sp));
1114       put_reg (sp, get_reg (sp) + 2);
1115       tprintf("pophi: %x\n", v);
1116     }
1117   else
1118     {
1119       v = mem_get_qi (get_reg (sp));
1120       put_reg (sp, get_reg (sp) + 1);
1121       tprintf("popqi: %x\n", v);
1122     }
1123   put_dest (dc, v);
1124
1125   /** 1001 d010            POP.B:S dest */
1126
1127   v = mem_get_qi (get_reg (sp));
1128   put_reg (d ? r0h : r0l, v);
1129   put_reg (sp, get_reg (sp) + 1);
1130   tprintf("popqi: %x\n", v);
1131
1132   /** 1101 d010            POP.W:S dest */
1133
1134   v = mem_get_hi (get_reg (sp));
1135   put_reg (d ? a1 : a0, v);
1136   put_reg (sp, get_reg (sp) + 2);
1137   tprintf("pophi: %x\n", v);
1138
1139   /** 1110 1011 0reg 0011  POPC dest */
1140
1141   dc = decode_cr (reg);
1142   v = mem_get_hi (get_reg (sp));
1143   put_dest (dc, v);
1144   put_reg (sp, get_reg (sp) + 2);
1145   tprintf("popc: %x\n", v);
1146
1147   /** 1110 1101            POPM dest */
1148
1149   static int map[] = { r0, r1, r2, r3, a0, a1, sb, fb };
1150   imm = IMM(0);
1151   tprintf("popm: %x\n", imm);
1152   for (a=0; a<8; a++)
1153     if (imm & (1<<a))
1154       {
1155         v = mem_get_hi (get_reg (sp));
1156         put_reg (map[a], v);
1157         put_reg (sp, get_reg (sp) + 2);
1158       }
1159
1160   /** 0111 110w 1110 0010  PUSH.size:G #IMM */
1161
1162   imm = IMM(w);
1163   if (w)
1164     {
1165       put_reg (sp, get_reg (sp) - 2);
1166       mem_put_hi (get_reg (sp), imm);
1167       tprintf("pushhi %04x\n", imm);
1168     }
1169   else
1170     {
1171       put_reg (sp, get_reg (sp) - 1);
1172       mem_put_qi (get_reg (sp), imm);
1173       tprintf("pushqi %02x\n", imm);
1174     }
1175
1176   /** 0111 010w 0100 srcx  PUSH.size:G src */
1177
1178   sc = decode_srcdest4 (srcx, w);
1179   v = get_src (sc);
1180   if (w)
1181     {
1182       put_reg (sp, get_reg (sp) - 2);
1183       mem_put_hi (get_reg (sp), v);
1184       tprintf("pushhi: %x\n", v);
1185     }
1186   else
1187     {
1188       put_reg (sp, get_reg (sp) - 1);
1189       mem_put_qi (get_reg (sp), v);
1190       tprintf("pushqi: %x\n", v);
1191     }
1192
1193   /** 1000 s010            PUSH.B:S src */
1194
1195   v = get_reg (s ? r0h : r0l);
1196   put_reg (sp, get_reg (sp) - 1);
1197   mem_put_qi (get_reg (sp), v);
1198   tprintf("pushqi: %x\n", v);
1199
1200   /** 1100 s010            PUSH.W:S src */
1201
1202   v = get_reg (s ? a1 : a0);
1203   put_reg (sp, get_reg (sp) - 2);
1204   mem_put_hi (get_reg (sp), v);
1205   tprintf("pushhi: %x\n", v);
1206
1207   /** 0111 1101 1001 srcx  PUSHA src */
1208
1209   sc = decode_srcdest4 (srcx, 0);
1210   put_reg (sp, get_reg (sp) - 2);
1211   mem_put_hi (get_reg (sp), sc.u.addr);
1212   tprintf("pushhi: %x\n", sc.u.addr);
1213
1214   /** 1110 1011 0src 0010  PUSHC src */
1215
1216   sc = decode_cr (src);
1217   put_reg (sp, get_reg (sp) - 2);
1218   v = get_src (sc);
1219   mem_put_hi (get_reg (sp), v);
1220   tprintf("pushc: %x\n", v);
1221
1222   /** 1110 1100            PUSHM src */
1223
1224   static int map[] = { fb, sb, a1, a0, r3, r2, r1, r0 };
1225   imm = IMM(0);
1226   tprintf("pushm: %x\n", imm);
1227   for (a=0; a<8; a++)
1228     if (imm & (1<<a))
1229       {
1230         put_reg (sp, get_reg (sp) - 2);
1231         v = get_reg (map[a]);
1232         mem_put_hi (get_reg (sp), v);
1233       }
1234
1235   /** 1111 1011            REIT */
1236
1237   a = get_reg (sp);
1238   v = (mem_get_hi (a)
1239        + 65536 * (mem_get_qi (a+3) & 0x0f));
1240   b = (mem_get_qi (a+2)
1241        + 16 * (mem_get_qi (a+3) & 0xf0));
1242   put_reg (pc, v);
1243   put_reg (flags, b);
1244   put_reg (sp, get_reg (sp) + 4);
1245
1246   /** 0111 110w 1111 0001  RMPA.size */
1247
1248   int count = get_reg (r3);
1249   int list1 = get_reg (a0);
1250   int list2 = get_reg (a1);
1251   int sum = get_reg (w ? r2r0 : r0);
1252
1253   while (count)
1254     {
1255       if (w)
1256         {
1257           a = sign_ext (mem_get_hi (list1), 16);
1258           b = sign_ext (mem_get_hi (list2), 16);
1259         }
1260       else
1261         {
1262           a = sign_ext (mem_get_qi (list1), 8);
1263           b = sign_ext (mem_get_qi (list2), 8);
1264         }
1265       tprintf("%d + %d * %d = ", sum, a, b);
1266       sum += a * b;
1267       tprintf("%d\n", sum);
1268       list1 += w ? 2 : 1;
1269       list2 += w ? 2 : 1;
1270       count --;
1271     }
1272   put_reg (r3, count);
1273   put_reg (a0, list1);
1274   put_reg (a1, list2);
1275   put_reg (w ? r2r0 : r0, sum);
1276
1277   /** 0111 011w 1010 dest  ROLC.size dest */
1278
1279   dc = decode_srcdest4 (dest, w);
1280   rot_op (dc, 1, 1);
1281
1282   /** 0111 011w 1011 dest  RORC.size dest */
1283
1284   dc = decode_srcdest4 (dest, w);
1285   rot_op (dc, 1, -1);
1286
1287   /** 1110 000w immm dest  ROT.size #IMM,dest */
1288
1289   dc = decode_srcdest4 (dest, w);
1290   rot_op (dc, 0, IMM4());
1291
1292   /** 0111 010w 0110 dest  ROT.size R1H,dest */
1293
1294   dc = decode_srcdest4 (dest, w);
1295   rot_op (dc, 0, sign_ext (get_reg (r1h), 8));
1296
1297   /** 1111 0011            RTS */
1298
1299   put_reg (pc, mem_get_psi (get_reg (sp)));
1300   put_reg (sp, get_reg (sp) + 3);
1301
1302   /** 0111 011w 0111 dest  SBB.size #IMM,dest */
1303
1304   dc = decode_srcdest4 (dest, w);
1305   imm = IMM(w);
1306   MATH_OP (dc, imm, !carry, -, >= 0);
1307
1308   /** 1011 100w srcx dest  SBB.size src,dest */
1309
1310   sc = decode_srcdest4(srcx, w);
1311   dc = decode_srcdest4(dest, w);
1312   b = get_src (sc);
1313   MATH_OP (dc, b, !carry, -, >= 0);
1314
1315   /** 1111 000w immm dest  SHA.size #IMM, dest */
1316
1317   dc = decode_srcdest4(dest, w);
1318   shift_op (dc, 1, IMM4());
1319
1320   /** 0111 010w 1111 dest  SHA.size R1H,dest */
1321
1322   dc = decode_srcdest4(dest, w);
1323   a = sign_ext (get_reg (r1h), 8);
1324   shift_op (dc, 1, a);
1325
1326   /** 1110 1011 101d immm  SHA.L #IMM, dest */
1327
1328   dc = reg_sd (d ? r3r1 : r2r0);
1329   shift_op (dc, 1, IMM4());
1330
1331   /** 1110 1011 001d 0001  SHA.L R1H,dest */
1332
1333   dc = reg_sd (d ? r3r1 : r2r0);
1334   a = sign_ext (get_reg (r1h), 8);
1335   shift_op (dc, 1, a);
1336
1337   /** 1110 100w immm dest  SHL.size #IMM, dest */
1338
1339   dc = decode_srcdest4(dest, w);
1340   shift_op (dc, 0, IMM4());
1341
1342   /** 0111 010w 1110 dest  SHL.size R1H,dest */
1343
1344   dc = decode_srcdest4(dest, w);
1345   a = sign_ext (get_reg (r1h), 8);
1346   shift_op (dc, 0, a);
1347
1348   /** 1110 1011 100d immm  SHL.L #IMM,dest */
1349
1350   dc = reg_sd (d ? r3r1 : r2r0);
1351   shift_op (dc, 0, IMM4());
1352
1353   /** 1110 1011 000d 0001  SHL.L R1H,dest */
1354
1355   dc = reg_sd (d ? r3r1 : r2r0);
1356   a = sign_ext (get_reg (r1h), 8);
1357   shift_op (dc, 0, a);
1358
1359   /** 0111 110w 1110 100b  SMOVB.size */
1360
1361   int count = get_reg (r3);
1362   int s1 = get_reg (a0) + (get_reg (r1h) << 16);
1363   int s2 = get_reg (a1);
1364   int inc = (w ? 2 : 1) * (b ? -1 : 1);
1365
1366   while (count)
1367     {
1368       if (w)
1369         {
1370           v = mem_get_hi (s1);
1371           mem_put_hi (s2, v);
1372         }
1373       else
1374         {
1375           v = mem_get_qi (s1);
1376           mem_put_qi (s2, v);
1377         }
1378       s1 += inc;
1379       s2 += inc;
1380       count --;
1381     }
1382   put_reg (r3, count);
1383   put_reg (a0, s1 & 0xffff);
1384   put_reg (a1, s2);
1385   put_reg (r1h, s1 >> 16);
1386
1387   /** 0111 110w 1110 1010  SSTR.size */
1388
1389   int count = get_reg (r3);
1390   int s1 = get_reg (a1);
1391   v = get_reg (w ? r0 : r0h);
1392
1393   while (count)
1394     {
1395       if (w)
1396         {
1397           mem_put_hi (s1, v);
1398           s1 += 2;
1399         }
1400       else
1401         {
1402           mem_put_qi (s1, v);
1403           s1 += 1;
1404         }
1405       count --;
1406     }
1407   put_reg (r3, count);
1408   put_reg (a1, s1);
1409
1410   /** 0111 1011 1src dest  STC src,dest */
1411
1412   dc = decode_srcdest4 (dest, 1);
1413   sc = decode_cr (src);
1414   put_dest (dc, get_src(sc));
1415
1416   /** 0111 1100 1100 dest  STC PC,dest */
1417
1418   dc = decode_srcdest4 (dest, 1);
1419   dc.bytes = 3;
1420   put_dest (dc, orig_pc);
1421
1422   /** 0111 1101 1111 0000  STCTX abs16,abs20 */
1423
1424   NOTYET();
1425
1426   /** 0111 010w 0000 srcx  STE.size src,abs20 */
1427
1428   sc = decode_srcdest4 (srcx, w);
1429   a = IMM(2);
1430   v = get_src (sc);
1431   if (w)
1432     mem_put_hi (a, v);
1433   else
1434     mem_put_qi (a, v);
1435   if (srcx == 4 || srcx == 5)
1436     {
1437       v = get_reg (sc.u.reg);
1438       set_sz (v, 2);
1439     }
1440   else
1441     set_sz (v, w+1);
1442     
1443   /** 0111 010w 0001 srcx  STE.size src,disp20[a0] */
1444
1445   sc = decode_srcdest4 (srcx, w);
1446   a = get_reg(a0) + IMM(2);
1447   v = get_src (sc);
1448   if (w)
1449     mem_put_hi (a, v);
1450   else
1451     mem_put_qi (a, v);
1452   if (srcx == 4 || srcx == 5)
1453     {
1454       v = get_reg (sc.u.reg);
1455       set_sz (v, 2);
1456     }
1457   else
1458     set_sz (v, w+1);
1459
1460   /** 0111 010w 0010 srcx  STE.size src,[a1a0] */
1461
1462   sc = decode_srcdest4 (srcx, w);
1463   a = get_reg(a1a0);
1464   v = get_src (sc);
1465   if (w)
1466     mem_put_hi (a, v);
1467   else
1468     mem_put_qi (a, v);
1469   if (srcx == 4 || srcx == 5)
1470     {
1471       v = get_reg (sc.u.reg);
1472       set_sz (v, 2);
1473     }
1474   else
1475     set_sz (v, w+1);
1476
1477   /** 1101 0dst            STNZ #IMM8,dest */
1478
1479   imm = IMM(0);
1480   dc = decode_dest3(dst, 0);
1481   if (!FLAG_Z)
1482     put_dest (dc, imm);
1483
1484   /** 1100 1dst            STZ #IMM8,dest */
1485
1486   imm = IMM(0);
1487   dc = decode_dest3(dst, 0);
1488   if (FLAG_Z)
1489     put_dest (dc, imm);
1490
1491   /** 1101 1dst            STZX #IMM81,#IMM82,dest */
1492
1493   a = IMM(0);
1494   dc = decode_dest3(dst, 0);
1495   b = IMM(0);
1496   if (FLAG_Z)
1497     put_dest (dc, a);
1498   else
1499     put_dest (dc, b);
1500
1501   /** 0111 011w 0101 dest  SUB.size:G #IMM,dest */
1502
1503   dc = decode_srcdest4 (dest, w);
1504   imm = IMM(w);
1505   MATH_OP (dc, imm, 0, -, >= 0);
1506
1507   /** 1000 1dst            SUB.B:S #IMM8,dest */
1508
1509   imm = IMM(0);
1510   dc = decode_dest3 (dst, 0);
1511   MATH_OP (dc, imm, 0, -, >= 0);
1512
1513   /** 1010 100w srcx dest  SUB.size:G src,dest */
1514
1515   sc = decode_srcdest4(srcx, w);
1516   dc = decode_srcdest4(dest, w);
1517   b = get_src (sc);
1518   MATH_OP (dc, b, 0, -, > 0);
1519
1520   /** 0010 1d sr           SUB.B:S src,R0L/R0H */
1521
1522   sc = decode_src2 (sr, 0, d);
1523   dc = decode_dest1 (d, 0);
1524   b = get_src (sc);
1525   MATH_OP (dc, b, 0, -, > 0);
1526
1527   /** 0111 011w 0000 dest  TST.size #IMM, dest */
1528
1529   UNARY_UOP;
1530   imm = IMM(w);
1531   tprintf ("%x & %x = %x\n", v, imm, v & imm);
1532   v &= imm;
1533   set_sz (v, w+1);
1534
1535   /** 1000 000w srcx dest  TST.size src,dest */
1536
1537   BINARY_UOP;
1538   tprintf ("%x & %x = %x\n", a, b, a & b);
1539   v = a & b;
1540   set_sz (v, w+1);
1541
1542   /** 1111 1111            UND */
1543
1544   trigger_fixed_interrupt (0xffdc);
1545
1546   /** 0111 1101 1111 0011  WAIT */
1547
1548   tprintf("waiting...\n");
1549
1550   /** 0111 101w 00sr dest  XCHG.size src,dest */
1551
1552   sc = decode_srcdest4 (sr, w);
1553   dc = decode_srcdest4 (dest, w);
1554   a = get_src (sc);
1555   b = get_src (dc);
1556   put_dest (dc, a);
1557   put_dest (sc, b);
1558
1559   /** 0111 011w 0001 dest  XOR.size #IMM,dest */
1560
1561   UNARY_UOP;
1562   imm = IMM(w);
1563   tprintf ("%x ^ %x = %x\n", v, imm, v ^ imm);
1564   v ^= imm;
1565   set_sz (v, w+1);
1566   put_dest (dc, v);
1567
1568   /** 1000 100w srcx dest  XOR.size src,dest */
1569
1570   BINARY_UOP;
1571   tprintf ("%x ^ %x = %x\n", a, b, a ^ b);
1572   v = a ^ b;
1573   set_sz (v, w+1);
1574   put_dest (dc, v);
1575   
1576   /**                      OP */
1577 /** */
1578
1579   return step_result;
1580 }