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