1 // 1111 0000 0010 00An; mov USP,An
2 8.0xf0+4.0x2,00,2.AN0:D0m:::mov
7 State.regs[REG_A0 + AN0] = State.regs[REG_USP];
11 // 1111 0000 0010 01An; mov SSP,An
12 8.0xf0+4.0x2,01,2.AN0:D0n:::mov
17 State.regs[REG_A0 + AN0] = State.regs[REG_SSP];
21 // 1111 0000 0010 10An; mov MSP,An
22 8.0xf0+4.0x2,10,2.AN0:D0o:::mov
27 State.regs[REG_A0 + AN0] = State.regs[REG_MSP];
31 // 1111 0000 0010 11An; mov PC,An
32 8.0xf0+4.0x2,11,2.AN0:D0p:::mov
37 State.regs[REG_A0 + AN0] = PC;
41 // 1111 0000 0011 Am00; mov Am,USP
42 8.0xf0+4.0x3,2.AM1,00:D0q:::mov
47 State.regs[REG_USP] = State.regs[REG_A0 + AM1];
50 // 1111 0000 0011 Am01; mov Am,SSP
51 8.0xf0+4.0x3,2.AM1,01:D0r:::mov
56 State.regs[REG_SSP] = State.regs[REG_A0 + AM1];
59 // 1111 0000 0011 Am10; mov Am,MSP
60 8.0xf0+4.0x3,2.AM1,10:D0s:::mov
65 State.regs[REG_MSP] = State.regs[REG_A0 + AM1];
69 // 1111 0000 1110 imm4; syscall
70 8.0xf0+4.0xe,IMM4:D0t:::syscall
74 unsigned int sp, next_pc;
77 sp = State.regs[REG_SP];
78 next_pc = State.regs[REG_PC] + 2;
79 store_word (sp - 4, next_pc);
80 store_word (sp - 8, PSW);
81 State.regs[REG_PC] = 0x40000000 + IMM4 * 8;
86 // 1111 0010 1110 11Dn; mov EPSW,Dn
87 8.0xf2+4.0xe,11,2.DN0:D0u:::mov
92 State.regs[REG_D0 + DN0] = PSW;
96 // 1111 0010 1111 Dm01; mov Dm,EPSW
97 8.0xf2+4.0xf,2.DM1,01:D0v:::mov
102 PSW = State.regs[REG_D0 + DM1];
105 // 1111 0101 00Am Rn; mov Am,Rn
106 8.0xf5+00,2.AM1,4.RN0:D0w:::mov
111 /* The higher register numbers actually correspond to the
112 basic machine's address and data registers. */
113 if (RN0 > 7 && RN0 < 12)
114 State.regs[REG_A0 + RN0 - 8] = State.regs[REG_A0 + AM1];
115 else if (RN0 > 11 && RN0 < 16)
116 State.regs[REG_D0 + RN0 - 12] = State.regs[REG_A0 + AM1];
118 State.regs[REG_E0 + RN0] = State.regs[REG_A0 + AM1] ;
121 // 1111 0101 01Dm Rn; mov Dm,Rn
122 8.0xf5+01,2.DM1,4.RN0:D0x:::mov
127 /* The higher register numbers actually correspond to the
128 basic machine's address and data registers. */
129 if (RN0 > 7 && RN0 < 12)
130 State.regs[REG_A0 + RN0 - 8] = State.regs[REG_D0 + DM1];
131 else if (RN0 > 11 && RN0 < 16)
132 State.regs[REG_D0 + RN0 - 12] = State.regs[REG_D0 + DM1];
134 State.regs[REG_E0 + RN0] = State.regs[REG_D0 + DM1] ;
137 // 1111 0101 10Rm An; mov Rm,An
138 8.0xf5+10,4.RM1,2.AN0:D0y:::mov
143 /* The higher register numbers actually correspond to the
144 basic machine's address and data registers. */
145 if (RM1 > 7 && RM1 < 12)
146 State.regs[REG_A0 + AN0] = State.regs[REG_A0 + RM1 - 8];
147 else if (RM1 > 11 && RM1 < 16)
148 State.regs[REG_A0 + AN0] = State.regs[REG_D0 + RM1 - 12];
150 State.regs[REG_A0 + AN0] = State.regs[REG_E0 + RM1];
153 // 1111 0101 11Rm Dn; mov Rm,Dn
154 8.0xf5+11,4.RM1,2.DN0:D0z:::mov
159 /* The higher register numbers actually correspond to the
160 basic machine's address and data registers. */
161 if (RM1 > 7 && RM1 < 12)
162 State.regs[REG_D0 + DN0] = State.regs[REG_A0 + RM1 - 8];
163 else if (RM1 > 11 && RM1 < 16)
164 State.regs[REG_D0 + DN0] = State.regs[REG_D0 + RM1 - 12];
166 State.regs[REG_D0 + DN0] = State.regs[REG_E0 + RM1];
170 // 1111 1000 1100 1110 regs....; movm (USP),regs
171 8.0xf8+8.0xce+8.REGS:D1a:::movm
174 unsigned long usp = State.regs[REG_USP];
183 State.regs[REG_LAR] = load_word (usp);
185 State.regs[REG_LIR] = load_word (usp);
187 State.regs[REG_MDR] = load_word (usp);
189 State.regs[REG_A0 + 1] = load_word (usp);
191 State.regs[REG_A0] = load_word (usp);
193 State.regs[REG_D0 + 1] = load_word (usp);
195 State.regs[REG_D0] = load_word (usp);
201 State.regs[REG_A0 + 3] = load_word (usp);
207 State.regs[REG_A0 + 2] = load_word (usp);
213 State.regs[REG_D0 + 3] = load_word (usp);
219 State.regs[REG_D0 + 2] = load_word (usp);
223 /* start-sanitize-am33 */
224 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
228 /* Need to restore MDQR, MCRH, MCRL, and MCVF */
230 State.regs[REG_E0 + 1] = load_word (usp);
232 State.regs[REG_E0 + 0] = load_word (usp);
238 State.regs[REG_E0 + 7] = load_word (usp);
240 State.regs[REG_E0 + 6] = load_word (usp);
242 State.regs[REG_E0 + 5] = load_word (usp);
244 State.regs[REG_E0 + 4] = load_word (usp);
250 State.regs[REG_E0 + 3] = load_word (usp);
252 State.regs[REG_E0 + 2] = load_word (usp);
256 /* end-sanitize-am33 */
258 /* And make sure to update the stack pointer. */
259 State.regs[REG_USP] = usp;
262 // 1111 1000 1100 1111 regs....; movm (USP),regs
263 8.0xf8+8.0xcf+8.REGS:D1b:::movm
266 unsigned long usp = State.regs[REG_USP];
269 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
274 store_word (usp, State.regs[REG_E0 + 2]);
276 store_word (usp, State.regs[REG_E0 + 3]);
282 store_word (usp, State.regs[REG_E0 + 4]);
284 store_word (usp, State.regs[REG_E0 + 5]);
286 store_word (usp, State.regs[REG_E0 + 6]);
288 store_word (usp, State.regs[REG_E0 + 7]);
294 store_word (usp, State.regs[REG_E0 + 0]);
296 store_word (usp, State.regs[REG_E0 + 1]);
298 /* Need to save MDQR, MCRH, MCRL, and MCVF */
301 /* end-sanitize-am33 */
306 store_word (usp, State.regs[REG_D0 + 2]);
312 store_word (usp, State.regs[REG_D0 + 3]);
318 store_word (usp, State.regs[REG_A0 + 2]);
324 store_word (usp, State.regs[REG_A0 + 3]);
330 store_word (usp, State.regs[REG_D0]);
332 store_word (usp, State.regs[REG_D0 + 1]);
334 store_word (usp, State.regs[REG_A0]);
336 store_word (usp, State.regs[REG_A0 + 1]);
338 store_word (usp, State.regs[REG_MDR]);
340 store_word (usp, State.regs[REG_LIR]);
342 store_word (usp, State.regs[REG_LAR]);
346 /* And make sure to update the stack pointer. */
347 State.regs[REG_USP] = usp;
350 // 1111 1100 1111 1100 imm32...; and imm32,EPSW
351 8.0xfc+8.0xfc+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:4a:::and
356 PSW &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
359 // 1111 1100 1111 1101 imm32...; or imm32,EPSW
360 8.0xfc+8.0xfd+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::or
365 PSW |= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
368 // 1111 1001 0000 1000 Rm Rn; mov Rm,Rn (Rm != Rn)
369 8.0xf9+8.0x08+4.RM2,4.RN0!RM2:D1g:::mov
377 if (RM2 > 7 && RM2 < 12)
378 srcreg = REG_A0 + RM2 - 8;
379 else if (RM2 > 11 && RM2 < 16)
380 srcreg = REG_D0 + RM2 - 12;
382 srcreg = REG_E0 + RM2;
384 if (RN0 > 7 && RN0 < 12)
385 dstreg = REG_A0 + RN0 - 8;
386 else if (RN0 > 11 && RN0 < 16)
387 dstreg = REG_D0 + RN0 - 12;
389 dstreg = REG_E0 + RN0;
391 State.regs[dstreg] = State.regs[srcreg];
394 // 1111 1001 0001 1000 Rn Rn; ext Rn
395 8.0xf9+8.0x18+4.RN0,4.RN2=RN0:D1:::ext
403 if (RN0 > 7 && RN0 < 12)
404 srcreg = REG_A0 + RN0 - 8;
405 else if (RN0 > 11 && RN0 < 16)
406 srcreg = REG_D0 + RN0 - 12;
408 srcreg = REG_E0 + RN0;
410 if (State.regs[srcreg] & 0x80000000)
411 State.regs[REG_MDR] = -1;
413 State.regs[REG_MDR] = 0;
416 // 1111 1001 0010 1000 Rm Rn; extb Rm,Rn
417 8.0xf9+8.0x28+4.RM2,4.RN0!RM2:D1:::extb
425 if (RM2 > 7 && RM2 < 12)
426 srcreg = REG_A0 + RM2 - 8;
427 else if (RM2 > 11 && RM2 < 16)
428 srcreg = REG_D0 + RM2 - 12;
430 srcreg = REG_E0 + RM2;
432 if (RN0 > 7 && RN0 < 12)
433 dstreg = REG_A0 + RN0 - 8;
434 else if (RN0 > 11 && RN0 < 16)
435 dstreg = REG_D0 + RN0 - 12;
437 dstreg = REG_E0 + RN0;
439 State.regs[dstreg] = EXTEND8 (State.regs[srcreg]);
442 // 1111 1001 0011 1000 Rm Rn; extbu Rm,Rn
443 8.0xf9+8.0x38+4.RM2,4.RN0!RM2:D1:::extbu
451 if (RM2 > 7 && RM2 < 12)
452 srcreg = REG_A0 + RM2 - 8;
453 else if (RM2 > 11 && RM2 < 16)
454 srcreg = REG_D0 + RM2 - 12;
456 srcreg = REG_E0 + RM2;
458 if (RN0 > 7 && RN0 < 12)
459 dstreg = REG_A0 + RN0 - 8;
460 else if (RN0 > 11 && RN0 < 16)
461 dstreg = REG_D0 + RN0 - 12;
463 dstreg = REG_E0 + RN0;
465 State.regs[dstreg] = State.regs[srcreg] & 0xff;
468 // 1111 1001 0100 1000 Rm Rn; exth Rm,Rn
469 8.0xf9+8.0x48+4.RM2,4.RN0!RM2:D1:::exth
477 if (RM2 > 7 && RM2 < 12)
478 srcreg = REG_A0 + RM2 - 8;
479 else if (RM2 > 11 && RM2 < 16)
480 srcreg = REG_D0 + RM2 - 12;
482 srcreg = REG_E0 + RM2;
484 if (RN0 > 7 && RN0 < 12)
485 dstreg = REG_A0 + RN0 - 8;
486 else if (RN0 > 11 && RN0 < 16)
487 dstreg = REG_D0 + RN0 - 12;
489 dstreg = REG_E0 + RN0;
491 State.regs[dstreg] = EXTEND16 (State.regs[srcreg]);
494 // 1111 1001 0101 1000 Rm Rn; exthu Rm,Rn
495 8.0xf9+8.0x58+4.RM2,4.RN0!RM2:D1:::exthu
503 if (RM2 > 7 && RM2 < 12)
504 srcreg = REG_A0 + RM2 - 8;
505 else if (RM2 > 11 && RM2 < 16)
506 srcreg = REG_D0 + RM2 - 12;
508 srcreg = REG_E0 + RM2;
510 if (RN0 > 7 && RN0 < 12)
511 dstreg = REG_A0 + RN0 - 8;
512 else if (RN0 > 11 && RN0 < 16)
513 dstreg = REG_D0 + RN0 - 12;
515 dstreg = REG_E0 + RN0;
517 State.regs[dstreg] = State.regs[srcreg] & 0xffff;
520 // 1111 1001 0110 1000 Rn Rn; clr Rn
521 8.0xf9+8.0x68+4.RM2,4.RN0=RM2:D1:::clr
529 if (RN0 > 7 && RN0 < 12)
530 dstreg = REG_A0 + RN0 - 8;
531 else if (RN0 > 11 && RN0 < 16)
532 dstreg = REG_D0 + RN0 - 12;
534 dstreg = REG_E0 + RN0;
536 State.regs[dstreg] = 0;
539 PSW &= ~(PSW_V | PSW_C | PSW_N);
542 // 1111 1001 0111 1000 Rm Rn; add Rm,Rn
543 8.0xf9+8.0x78+4.RM2,4.RN0:D1b:::add
551 if (RM2 > 7 && RM2 < 12)
552 srcreg = REG_A0 + RM2 - 8;
553 else if (RM2 > 11 && RM2 < 16)
554 srcreg = REG_D0 + RM2 - 12;
556 srcreg = REG_E0 + RM2;
558 if (RN0 > 7 && RN0 < 12)
559 dstreg = REG_A0 + RN0 - 8;
560 else if (RN0 > 11 && RN0 < 16)
561 dstreg = REG_D0 + RN0 - 12;
563 dstreg = REG_E0 + RN0;
565 genericAdd (State.regs[srcreg], dstreg);
568 // 1111 1001 1000 1000 Rm Rn; addc Rm,Rn
569 8.0xf9+8.0x88+4.RM2,4.RN0:D1b:::addc
575 unsigned long reg1, reg2, sum;
579 if (RM2 > 7 && RM2 < 12)
580 srcreg = REG_A0 + RM2 - 8;
581 else if (RM2 > 11 && RM2 < 16)
582 srcreg = REG_D0 + RM2 - 12;
584 srcreg = REG_E0 + RM2;
586 if (RN0 > 7 && RN0 < 12)
587 dstreg = REG_A0 + RN0 - 8;
588 else if (RN0 > 11 && RN0 < 16)
589 dstreg = REG_D0 + RN0 - 12;
591 dstreg = REG_E0 + RN0;
593 reg1 = State.regs[srcreg];
594 reg2 = State.regs[dstreg];
595 sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
596 State.regs[dstreg] = sum;
599 n = (sum & 0x80000000);
600 c = (sum < reg1) || (sum < reg2);
601 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
602 && (reg2 & 0x80000000) != (sum & 0x80000000));
604 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
605 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
606 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
609 // 1111 1001 1001 1000 Rm Rn; sub Rm,Rn
610 8.0xf9+8.0x98+4.RM2,4.RN0:D1b:::sub
618 if (RM2 > 7 && RM2 < 12)
619 srcreg = REG_A0 + RM2 - 8;
620 else if (RM2 > 11 && RM2 < 16)
621 srcreg = REG_D0 + RM2 - 12;
623 srcreg = REG_E0 + RM2;
625 if (RN0 > 7 && RN0 < 12)
626 dstreg = REG_A0 + RN0 - 8;
627 else if (RN0 > 11 && RN0 < 16)
628 dstreg = REG_D0 + RN0 - 12;
630 dstreg = REG_E0 + RN0;
632 genericSub (State.regs[srcreg], dstreg);
635 // 1111 1001 1010 1000 Rm Rn; subc Rm,Rn
636 8.0xf9+8.0xa8+4.RM2,4.RN0:D1b:::subc
642 unsigned long reg1, reg2, difference;
646 if (RM2 > 7 && RM2 < 12)
647 srcreg = REG_A0 + RM2 - 8;
648 else if (RM2 > 11 && RM2 < 16)
649 srcreg = REG_D0 + RM2 - 12;
651 srcreg = REG_E0 + RM2;
653 if (RN0 > 7 && RN0 < 12)
654 dstreg = REG_A0 + RN0 - 8;
655 else if (RN0 > 11 && RN0 < 16)
656 dstreg = REG_D0 + RN0 - 12;
658 dstreg = REG_E0 + RN0;
660 reg1 = State.regs[srcreg];
661 reg2 = State.regs[dstreg];
662 difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
663 State.regs[dstreg] = difference;
665 z = (difference == 0);
666 n = (difference & 0x80000000);
668 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
669 && (reg2 & 0x80000000) != (difference & 0x80000000));
671 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
672 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
673 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
676 // 1111 1001 1011 1000 Rn Rn; inc Rn
677 8.0xf9+8.0xb8+4.RN0,4.RN2=RN0:D1:::inc
685 if (RN0 > 7 && RN0 < 12)
686 dstreg = REG_A0 + RN0 - 8;
687 else if (RN0 > 11 && RN0 < 16)
688 dstreg = REG_D0 + RN0 - 12;
690 dstreg = REG_E0 + RN0;
692 genericAdd (1, dstreg);
695 // 1111 1001 1101 1000 Rn Rn; inc Rn
696 8.0xf9+8.0xc8+4.RN0,4.RN2=RN0:D1:::inc4
704 if (RN0 > 7 && RN0 < 12)
705 dstreg = REG_A0 + RN0 - 8;
706 else if (RN0 > 11 && RN0 < 16)
707 dstreg = REG_D0 + RN0 - 12;
709 dstreg = REG_E0 + RN0;
710 State.regs[dstreg] += 4;
713 // 1111 1001 1101 1000 Rm Rn; cmp Rm,Rn
714 8.0xf9+8.0xd8+4.RM2,4.RN0:D1:::cmp
718 int srcreg1, srcreg2;
722 if (RN0 > 7 && RN0 < 12)
723 srcreg1 = REG_A0 + RN0 - 8;
724 else if (RN0 > 11 && RN0 < 16)
725 srcreg1 = REG_D0 + RN0 - 12;
727 srcreg1 = REG_E0 + RN0;
729 if (RM2 > 7 && RM2 < 12)
730 srcreg2 = REG_A0 + RM2 - 8;
731 else if (RM2 > 11 && RM2 < 16)
732 srcreg2 = REG_D0 + RM2 - 12;
734 srcreg2 = REG_E0 + RM2;
735 genericCmp (State.regs[srcreg2], State.regs[srcreg1]);
738 // 1111 1001 1110 1000 XRm Rn; mov XRm,Rn
739 8.0xf9+8.0xe8+4.XRM2,4.RN0:D1l:::mov
746 if (RN0 > 7 && RN0 < 12)
747 dstreg = REG_A0 + RN0 - 8;
748 else if (RN0 > 11 && RN0 < 16)
749 dstreg = REG_D0 + RN0 - 12;
751 dstreg = REG_E0 + RN0;
755 State.regs[dstreg] = State.regs[REG_SP];
761 // 1111 1001 1111 1000 Rm XRn; mov Rm,XRn
762 8.0xf9+8.0xf8+4.RM2,4.XRN0:D1m:::mov
770 if (RM2 > 7 && RM2 < 12)
771 srcreg = REG_A0 + RM2 - 8;
772 else if (RM2 > 11 && RM2 < 16)
773 srcreg = REG_D0 + RM2 - 12;
775 srcreg = REG_E0 + RM2;
779 State.regs[REG_SP] = State.regs[srcreg];
785 // 1111 1001 0000 1001 Rm Rn; and Rm,Rn
786 8.0xf9+8.0x09+4.RM2,4.RN0:D1a:::and
795 if (RM2 > 7 && RM2 < 12)
796 srcreg = REG_A0 + RM2 - 8;
797 else if (RM2 > 11 && RM2 < 16)
798 srcreg = REG_D0 + RM2 - 12;
800 srcreg = REG_E0 + RM2;
802 if (RN0 > 7 && RN0 < 12)
803 dstreg = REG_A0 + RN0 - 8;
804 else if (RN0 > 11 && RN0 < 16)
805 dstreg = REG_D0 + RN0 - 12;
807 dstreg = REG_E0 + RN0;
809 State.regs[dstreg] &= State.regs[srcreg];
810 z = (State.regs[dstreg] == 0);
811 n = (State.regs[dstreg] & 0x80000000) != 0;
812 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
813 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
816 // 1111 1001 0001 1001 Rm Rn; or Rm,Rn
817 8.0xf9+8.0x19+4.RM2,4.RN0:D1a:::or
826 if (RM2 > 7 && RM2 < 12)
827 srcreg = REG_A0 + RM2 - 8;
828 else if (RM2 > 11 && RM2 < 16)
829 srcreg = REG_D0 + RM2 - 12;
831 srcreg = REG_E0 + RM2;
833 if (RN0 > 7 && RN0 < 12)
834 dstreg = REG_A0 + RN0 - 8;
835 else if (RN0 > 11 && RN0 < 16)
836 dstreg = REG_D0 + RN0 - 12;
838 dstreg = REG_E0 + RN0;
840 State.regs[dstreg] |= State.regs[srcreg];
841 z = (State.regs[dstreg] == 0);
842 n = (State.regs[dstreg] & 0x80000000) != 0;
843 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
844 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
847 // 1111 1001 0010 1001 Rm Rn; xor Rm,Rn
848 8.0xf9+8.0x29+4.RM2,4.RN0:D1a:::xor
857 if (RM2 > 7 && RM2 < 12)
858 srcreg = REG_A0 + RM2 - 8;
859 else if (RM2 > 11 && RM2 < 16)
860 srcreg = REG_D0 + RM2 - 12;
862 srcreg = REG_E0 + RM2;
864 if (RN0 > 7 && RN0 < 12)
865 dstreg = REG_A0 + RN0 - 8;
866 else if (RN0 > 11 && RN0 < 16)
867 dstreg = REG_D0 + RN0 - 12;
869 dstreg = REG_E0 + RN0;
871 State.regs[dstreg] ^= State.regs[srcreg];
872 z = (State.regs[dstreg] == 0);
873 n = (State.regs[dstreg] & 0x80000000) != 0;
874 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
875 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
878 // 1111 1001 0011 1001 Rn Rn; not Rn
879 8.0xf9+8.0x39+4.RM2,4.RN0=RM2:D1:::not
888 if (RN0 > 7 && RN0 < 12)
889 dstreg = REG_A0 + RN0 - 8;
890 else if (RN0 > 11 && RN0 < 16)
891 dstreg = REG_D0 + RN0 - 12;
893 dstreg = REG_E0 + RN0;
895 State.regs[dstreg] = ~State.regs[dstreg];
896 z = (State.regs[dstreg] == 0);
897 n = (State.regs[dstreg] & 0x80000000) != 0;
898 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
899 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
902 // 1111 1001 0100 1001 Rm Rn; asr Rm,Rn
903 8.0xf9+8.0x49+4.RM2,4.RN0:D1a:::asr
913 if (RM2 > 7 && RM2 < 12)
914 srcreg = REG_A0 + RM2 - 8;
915 else if (RM2 > 11 && RM2 < 16)
916 srcreg = REG_D0 + RM2 - 12;
918 srcreg = REG_E0 + RM2;
920 if (RN0 > 7 && RN0 < 12)
921 dstreg = REG_A0 + RN0 - 8;
922 else if (RN0 > 11 && RN0 < 16)
923 dstreg = REG_D0 + RN0 - 12;
925 dstreg = REG_E0 + RN0;
927 temp = State.regs[dstreg];
929 temp >>= State.regs[srcreg];
930 State.regs[dstreg] = temp;
931 z = (State.regs[dstreg] == 0);
932 n = (State.regs[dstreg] & 0x80000000) != 0;
933 PSW &= ~(PSW_Z | PSW_N | PSW_C);
934 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
937 // 1111 1001 0101 1001 Rm Rn; lsr Rm,Rn
938 8.0xf9+8.0x59+4.RM2,4.RN0:D1a:::lsr
947 if (RM2 > 7 && RM2 < 12)
948 srcreg = REG_A0 + RM2 - 8;
949 else if (RM2 > 11 && RM2 < 16)
950 srcreg = REG_D0 + RM2 - 12;
952 srcreg = REG_E0 + RM2;
954 if (RN0 > 7 && RN0 < 12)
955 dstreg = REG_A0 + RN0 - 8;
956 else if (RN0 > 11 && RN0 < 16)
957 dstreg = REG_D0 + RN0 - 12;
959 dstreg = REG_E0 + RN0;
961 c = State.regs[dstreg] & 1;
962 State.regs[dstreg] >>= State.regs[srcreg];
963 z = (State.regs[dstreg] == 0);
964 n = (State.regs[dstreg] & 0x80000000) != 0;
965 PSW &= ~(PSW_Z | PSW_N | PSW_C);
966 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
969 // 1111 1001 0110 1001 Rm Rn; asl Rm,Rn
970 8.0xf9+8.0x69+4.RM2,4.RN0:D1a:::asl
979 if (RM2 > 7 && RM2 < 12)
980 srcreg = REG_A0 + RM2 - 8;
981 else if (RM2 > 11 && RM2 < 16)
982 srcreg = REG_D0 + RM2 - 12;
984 srcreg = REG_E0 + RM2;
986 if (RN0 > 7 && RN0 < 12)
987 dstreg = REG_A0 + RN0 - 8;
988 else if (RN0 > 11 && RN0 < 16)
989 dstreg = REG_D0 + RN0 - 12;
991 dstreg = REG_E0 + RN0;
993 State.regs[dstreg] <<= State.regs[srcreg];
994 z = (State.regs[dstreg] == 0);
995 n = (State.regs[dstreg] & 0x80000000) != 0;
996 PSW &= ~(PSW_Z | PSW_N);
997 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1000 // 1111 1001 0111 1001 Rn Rn; asl2 Rn
1001 8.0xf9+8.0x79+4.RM2,4.RN0=RM2:D1:::asl2
1010 if (RN0 > 7 && RN0 < 12)
1011 dstreg = REG_A0 + RN0 - 8;
1012 else if (RN0 > 11 && RN0 < 16)
1013 dstreg = REG_D0 + RN0 - 12;
1015 dstreg = REG_E0 + RN0;
1017 State.regs[dstreg] <<= 2;
1018 z = (State.regs[dstreg] == 0);
1019 n = (State.regs[dstreg] & 0x80000000) != 0;
1020 PSW &= ~(PSW_Z | PSW_N);
1021 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1024 // 1111 1001 1000 1001 Rn Rn; ror Rn
1025 8.0xf9+8.0x89+4.RM2,4.RN0=RM2:D1:::ror
1031 unsigned long value;
1035 if (RN0 > 7 && RN0 < 12)
1036 dstreg = REG_A0 + RN0 - 8;
1037 else if (RN0 > 11 && RN0 < 16)
1038 dstreg = REG_D0 + RN0 - 12;
1040 dstreg = REG_E0 + RN0;
1042 value = State.regs[dstreg];
1046 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
1047 State.regs[dstreg] = value;
1049 n = (value & 0x80000000) != 0;
1050 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1051 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1054 // 1111 1001 1001 1001 Rn Rn; rol Rn
1055 8.0xf9+8.0x99+4.RM2,4.RN0=RM2:D1:::rol
1061 unsigned long value;
1065 if (RN0 > 7 && RN0 < 12)
1066 dstreg = REG_A0 + RN0 - 8;
1067 else if (RN0 > 11 && RN0 < 16)
1068 dstreg = REG_D0 + RN0 - 12;
1070 dstreg = REG_E0 + RN0;
1072 value = State.regs[dstreg];
1073 c = (value & 0x80000000) ? 1 : 0;
1076 value |= ((PSW & PSW_C) != 0);
1077 State.regs[dstreg] = value;
1079 n = (value & 0x80000000) != 0;
1080 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1081 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1084 // 1111 1001 1010 1001 Rm Rn; mul Rm,Rn
1085 8.0xf9+8.0xa9+4.RM2,4.RN0:D1b:::mul
1090 unsigned long long temp;
1095 if (RM2 > 7 && RM2 < 12)
1096 srcreg = REG_A0 + RM2 - 8;
1097 else if (RM2 > 11 && RM2 < 16)
1098 srcreg = REG_D0 + RM2 - 12;
1100 srcreg = REG_E0 + RM2;
1102 if (RN0 > 7 && RN0 < 12)
1103 dstreg = REG_A0 + RN0 - 8;
1104 else if (RN0 > 11 && RN0 < 16)
1105 dstreg = REG_D0 + RN0 - 12;
1107 dstreg = REG_E0 + RN0;
1109 temp = ((signed64)(signed32)State.regs[dstreg]
1110 * (signed64)(signed32)State.regs[srcreg]);
1111 State.regs[dstreg] = temp & 0xffffffff;
1112 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1113 z = (State.regs[dstreg] == 0);
1114 n = (State.regs[dstreg] & 0x80000000) != 0;
1115 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1116 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1119 // 1111 1001 1011 1001 Rm Rn; mulu Rm,Rn
1120 8.0xf9+8.0xb9+4.RM2,4.RN0:D1b:::mulu
1125 unsigned long long temp;
1130 if (RM2 > 7 && RM2 < 12)
1131 srcreg = REG_A0 + RM2 - 8;
1132 else if (RM2 > 11 && RM2 < 16)
1133 srcreg = REG_D0 + RM2 - 12;
1135 srcreg = REG_E0 + RM2;
1137 if (RN0 > 7 && RN0 < 12)
1138 dstreg = REG_A0 + RN0 - 8;
1139 else if (RN0 > 11 && RN0 < 16)
1140 dstreg = REG_D0 + RN0 - 12;
1142 dstreg = REG_E0 + RN0;
1144 temp = ((unsigned64)State.regs[dstreg]
1145 * (unsigned64)State.regs[srcreg]);
1146 State.regs[dstreg] = temp & 0xffffffff;
1147 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1148 z = (State.regs[dstreg] == 0);
1149 n = (State.regs[dstreg] & 0x80000000) != 0;
1150 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1151 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1154 // 1111 1001 1100 1001 Rm Rn; div Rm,Rn
1155 8.0xf9+8.0xc9+4.RM2,4.RN0:D1b:::div
1160 unsigned long long temp;
1165 if (RM2 > 7 && RM2 < 12)
1166 srcreg = REG_A0 + RM2 - 8;
1167 else if (RM2 > 11 && RM2 < 16)
1168 srcreg = REG_D0 + RM2 - 12;
1170 srcreg = REG_E0 + RM2;
1172 if (RN0 > 7 && RN0 < 12)
1173 dstreg = REG_A0 + RN0 - 8;
1174 else if (RN0 > 11 && RN0 < 16)
1175 dstreg = REG_D0 + RN0 - 12;
1177 dstreg = REG_E0 + RN0;
1179 temp = State.regs[REG_MDR];
1181 temp |= State.regs[dstreg];
1182 State.regs[REG_MDR] = temp % (long)State.regs[srcreg];
1183 temp /= (long)State.regs[srcreg];
1184 State.regs[dstreg] = temp & 0xffffffff;
1185 z = (State.regs[dstreg] == 0);
1186 n = (State.regs[dstreg] & 0x80000000) != 0;
1187 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1188 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1191 // 1111 1001 1101 1001 Rm Rn; divu Rm,Rn
1192 8.0xf9+8.0xd9+4.RM2,4.RN0:D1b:::divu
1197 unsigned long long temp;
1202 if (RM2 > 7 && RM2 < 12)
1203 srcreg = REG_A0 + RM2 - 8;
1204 else if (RM2 > 11 && RM2 < 16)
1205 srcreg = REG_D0 + RM2 - 12;
1207 srcreg = REG_E0 + RM2;
1209 if (RN0 > 7 && RN0 < 12)
1210 dstreg = REG_A0 + RN0 - 8;
1211 else if (RN0 > 11 && RN0 < 16)
1212 dstreg = REG_D0 + RN0 - 12;
1214 dstreg = REG_E0 + RN0;
1216 temp = State.regs[REG_MDR];
1218 temp |= State.regs[dstreg];
1219 State.regs[REG_MDR] = temp % State.regs[srcreg];
1220 temp /= State.regs[srcreg];
1221 State.regs[dstreg] = temp & 0xffffffff;
1222 z = (State.regs[dstreg] == 0);
1223 n = (State.regs[dstreg] & 0x80000000) != 0;
1224 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1225 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1229 // 1111 1001 0000 1010 Rm Rn; mov (Rm),Rn
1230 8.0xf9+8.0x0a+4.RM2,4.RN0:D1h:::mov
1238 if (RM2 > 7 && RM2 < 12)
1239 srcreg = REG_A0 + RM2 - 8;
1240 else if (RM2 > 11 && RM2 < 16)
1241 srcreg = REG_D0 + RM2 - 12;
1243 srcreg = REG_E0 + RM2;
1245 if (RN0 > 7 && RN0 < 12)
1246 dstreg = REG_A0 + RN0 - 8;
1247 else if (RN0 > 11 && RN0 < 16)
1248 dstreg = REG_D0 + RN0 - 12;
1250 dstreg = REG_E0 + RN0;
1252 if (RN0 > 7 && RN0 < 12)
1253 dstreg = REG_A0 + RN0 - 8;
1254 else if (RN0 > 11 && RN0 < 16)
1255 dstreg = REG_D0 + RN0 - 12;
1257 dstreg = REG_E0 + RN0;
1259 State.regs[dstreg] = load_word (State.regs[srcreg]);
1262 // 1111 1001 0001 1010 Rm Rn; mov Rm,(Rn)
1263 8.0xf9+8.0x1a+4.RM2,4.RN0:D1i:::mov
1271 if (RM2 > 7 && RM2 < 12)
1272 srcreg = REG_A0 + RM2 - 8;
1273 else if (RM2 > 11 && RM2 < 16)
1274 srcreg = REG_D0 + RM2 - 12;
1276 srcreg = REG_E0 + RM2;
1278 if (RN0 > 7 && RN0 < 12)
1279 dstreg = REG_A0 + RN0 - 8;
1280 else if (RN0 > 11 && RN0 < 16)
1281 dstreg = REG_D0 + RN0 - 12;
1283 dstreg = REG_E0 + RN0;
1285 if (RN0 > 7 && RN0 < 12)
1286 dstreg = REG_A0 + RN0 - 8;
1287 else if (RN0 > 11 && RN0 < 16)
1288 dstreg = REG_D0 + RN0 - 12;
1290 dstreg = REG_E0 + RN0;
1292 store_word (State.regs[dstreg], State.regs[srcreg]);
1295 // 1111 1001 0010 1010 Rm Rn; movbu (Rm),Rn
1296 8.0xf9+8.0x2a+4.RM2,4.RN0:D1g:::movbu
1304 if (RM2 > 7 && RM2 < 12)
1305 srcreg = REG_A0 + RM2 - 8;
1306 else if (RM2 > 11 && RM2 < 16)
1307 srcreg = REG_D0 + RM2 - 12;
1309 srcreg = REG_E0 + RM2;
1311 if (RN0 > 7 && RN0 < 12)
1312 dstreg = REG_A0 + RN0 - 8;
1313 else if (RN0 > 11 && RN0 < 16)
1314 dstreg = REG_D0 + RN0 - 12;
1316 dstreg = REG_E0 + RN0;
1318 if (RN0 > 7 && RN0 < 12)
1319 dstreg = REG_A0 + RN0 - 8;
1320 else if (RN0 > 11 && RN0 < 16)
1321 dstreg = REG_D0 + RN0 - 12;
1323 dstreg = REG_E0 + RN0;
1325 State.regs[dstreg] = load_byte (State.regs[srcreg]);
1328 // 1111 1001 0011 1010 Rm Rn; movbu Rm,(Rn)
1329 8.0xf9+8.0x3a+4.RM2,4.RN0:D1i:::movbu
1337 if (RM2 > 7 && RM2 < 12)
1338 srcreg = REG_A0 + RM2 - 8;
1339 else if (RM2 > 11 && RM2 < 16)
1340 srcreg = REG_D0 + RM2 - 12;
1342 srcreg = REG_E0 + RM2;
1344 if (RN0 > 7 && RN0 < 12)
1345 dstreg = REG_A0 + RN0 - 8;
1346 else if (RN0 > 11 && RN0 < 16)
1347 dstreg = REG_D0 + RN0 - 12;
1349 dstreg = REG_E0 + RN0;
1351 if (RN0 > 7 && RN0 < 12)
1352 dstreg = REG_A0 + RN0 - 8;
1353 else if (RN0 > 11 && RN0 < 16)
1354 dstreg = REG_D0 + RN0 - 12;
1356 dstreg = REG_E0 + RN0;
1358 store_byte (State.regs[dstreg], State.regs[srcreg]);
1361 // 1111 1001 0100 1010 Rm Rn; movhu (Rm),Rn
1362 8.0xf9+8.0x4a+4.RM2,4.RN0:D1g:::movhu
1370 if (RM2 > 7 && RM2 < 12)
1371 srcreg = REG_A0 + RM2 - 8;
1372 else if (RM2 > 11 && RM2 < 16)
1373 srcreg = REG_D0 + RM2 - 12;
1375 srcreg = REG_E0 + RM2;
1377 if (RN0 > 7 && RN0 < 12)
1378 dstreg = REG_A0 + RN0 - 8;
1379 else if (RN0 > 11 && RN0 < 16)
1380 dstreg = REG_D0 + RN0 - 12;
1382 dstreg = REG_E0 + RN0;
1384 if (RN0 > 7 && RN0 < 12)
1385 dstreg = REG_A0 + RN0 - 8;
1386 else if (RN0 > 11 && RN0 < 16)
1387 dstreg = REG_D0 + RN0 - 12;
1389 dstreg = REG_E0 + RN0;
1391 State.regs[dstreg] = load_half (State.regs[srcreg]);
1394 // 1111 1001 0101 1010 Rm Rn; movhu Rm,(Rn)
1395 8.0xf9+8.0x5a+4.RM2,4.RN0:D1i:::movhu
1403 if (RM2 > 7 && RM2 < 12)
1404 srcreg = REG_A0 + RM2 - 8;
1405 else if (RM2 > 11 && RM2 < 16)
1406 srcreg = REG_D0 + RM2 - 12;
1408 srcreg = REG_E0 + RM2;
1410 if (RN0 > 7 && RN0 < 12)
1411 dstreg = REG_A0 + RN0 - 8;
1412 else if (RN0 > 11 && RN0 < 16)
1413 dstreg = REG_D0 + RN0 - 12;
1415 dstreg = REG_E0 + RN0;
1417 if (RN0 > 7 && RN0 < 12)
1418 dstreg = REG_A0 + RN0 - 8;
1419 else if (RN0 > 11 && RN0 < 16)
1420 dstreg = REG_D0 + RN0 - 12;
1422 dstreg = REG_E0 + RN0;
1424 store_half (State.regs[dstreg], State.regs[srcreg]);
1430 // 1111 1001 1000 1010 Rn 0000; mov (sp),Rn
1431 8.0xf9+8.0x8a+4.RN2,4.0000:D1j:::mov
1439 if (RN2 > 7 && RN2 < 12)
1440 dstreg = REG_A0 + RN2 - 8;
1441 else if (RN2 > 11 && RN2 < 16)
1442 dstreg = REG_D0 + RN2 - 12;
1444 dstreg = REG_E0 + RN2;
1446 State.regs[dstreg] = load_word (State.regs[REG_SP]);
1449 // 1111 1001 1001 1010 Rm 0000; mov Rm, (sp)
1450 8.0xf9+8.0x9a+4.RM2,4.0000:D1k:::mov
1458 if (RM2 > 7 && RM2 < 12)
1459 dstreg = REG_A0 + RM2 - 8;
1460 else if (RM2 > 11 && RM2 < 16)
1461 dstreg = REG_D0 + RM2 - 12;
1463 dstreg = REG_E0 + RM2;
1465 store_word (State.regs[REG_SP], State.regs[dstreg]);
1468 // 1111 1001 1010 1010 Rn 0000; mobvu (sp),Rn
1469 8.0xf9+8.0xaa+4.RN2,4.0000:D1j:::movbu
1477 if (RN2 > 7 && RN2 < 12)
1478 dstreg = REG_A0 + RN2 - 8;
1479 else if (RN2 > 11 && RN2 < 16)
1480 dstreg = REG_D0 + RN2 - 12;
1482 dstreg = REG_E0 + RN2;
1484 State.regs[dstreg] = load_byte (State.regs[REG_SP]);
1487 // 1111 1001 1011 1010 Rm 0000; movbu Rm, (sp)
1488 8.0xf9+8.0xba+4.RM2,4.0000:D1k:::movbu
1496 if (RM2 > 7 && RM2 < 12)
1497 dstreg = REG_A0 + RM2 - 8;
1498 else if (RM2 > 11 && RM2 < 16)
1499 dstreg = REG_D0 + RM2 - 12;
1501 dstreg = REG_E0 + RM2;
1503 store_byte (State.regs[REG_SP], State.regs[dstreg]);
1506 // 1111 1001 1000 1100 Rn 0000; movhu (sp),Rn
1507 8.0xf9+8.0xca+4.RN2,4.0000:D1j:::movhu
1515 if (RN2 > 7 && RN2 < 12)
1516 dstreg = REG_A0 + RN2 - 8;
1517 else if (RN2 > 11 && RN2 < 16)
1518 dstreg = REG_D0 + RN2 - 12;
1520 dstreg = REG_E0 + RN2;
1522 State.regs[dstreg] = load_half (State.regs[REG_SP]);
1525 // 1111 1001 1001 1101 Rm 0000; movhu Rm, (sp)
1526 8.0xf9+8.0xda+4.RM2,4.0000:D1k:::movhu
1534 if (RM2 > 7 && RM2 < 12)
1535 dstreg = REG_A0 + RM2 - 8;
1536 else if (RM2 > 11 && RM2 < 16)
1537 dstreg = REG_D0 + RM2 - 12;
1539 dstreg = REG_E0 + RM2;
1541 store_half (State.regs[REG_SP], State.regs[dstreg]);
1561 // 1111 1011 0000 1000 Rn Rn IMM8; mov IMM8,Rn
1562 8.0xfb+8.0x08+4.RM2,4.RN0=RM2+8.IMM8:D2j:::mov
1570 if (RN0 > 7 && RN0 < 12)
1571 dstreg = REG_A0 + RN0 - 8;
1572 else if (RN0 > 11 && RN0 < 16)
1573 dstreg = REG_D0 + RN0 - 12;
1575 dstreg = REG_E0 + RN0;
1577 State.regs[dstreg] = EXTEND8 (IMM8);
1580 // 1111 1011 0001 1000 Rn Rn IMM8; movu IMM8,Rn
1581 8.0xfb+8.0x18+4.RM2,4.RN0=RM2+8.IMM8:D2:::movu
1589 if (RN0 > 7 && RN0 < 12)
1590 dstreg = REG_A0 + RN0 - 8;
1591 else if (RN0 > 11 && RN0 < 16)
1592 dstreg = REG_D0 + RN0 - 12;
1594 dstreg = REG_E0 + RN0;
1596 State.regs[dstreg] = IMM8 & 0xff;
1599 // 1111 1011 0111 1000 Rn Rn IMM8; add IMM8,Rn
1600 8.0xfb+8.0x78+4.RM2,4.RN0=RM2+8.IMM8:D2d:::add
1608 if (RN0 > 7 && RN0 < 12)
1609 dstreg = REG_A0 + RN0 - 8;
1610 else if (RN0 > 11 && RN0 < 16)
1611 dstreg = REG_D0 + RN0 - 12;
1613 dstreg = REG_E0 + RN0;
1615 genericAdd (EXTEND8 (IMM8), dstreg);
1618 // 1111 1011 1000 1000 Rn Rn IMM8; addc IMM8,Rn
1619 8.0xfb+8.0x88+4.RM2,4.RN0=RM2+8.IMM8:D2d:::addc
1625 unsigned long reg1, reg2, sum;
1629 if (RN0 > 7 && RN0 < 12)
1630 dstreg = REG_A0 + RN0 - 8;
1631 else if (RN0 > 11 && RN0 < 16)
1632 dstreg = REG_D0 + RN0 - 12;
1634 dstreg = REG_E0 + RN0;
1636 imm = EXTEND8 (IMM8);
1637 reg2 = State.regs[dstreg];
1638 sum = imm + reg2 + ((PSW & PSW_C) != 0);
1639 State.regs[dstreg] = sum;
1642 n = (sum & 0x80000000);
1643 c = (sum < imm) || (sum < reg2);
1644 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1645 && (reg2 & 0x80000000) != (sum & 0x80000000));
1647 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1648 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1649 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1652 // 1111 1011 1001 1000 Rn Rn IMM8; sub IMM8,Rn
1653 8.0xfb+8.0x98+4.RM2,4.RN0=RM2+8.IMM8:D2d:::sub
1661 if (RN0 > 7 && RN0 < 12)
1662 dstreg = REG_A0 + RN0 - 8;
1663 else if (RN0 > 11 && RN0 < 16)
1664 dstreg = REG_D0 + RN0 - 12;
1666 dstreg = REG_E0 + RN0;
1668 genericSub (EXTEND8 (IMM8), dstreg);
1671 // 1111 1011 1010 1000 Rn Rn IMM8; subc IMM8,Rn
1672 8.0xfb+8.0xa8+4.RM2,4.RN0=RM2+8.IMM8:D2d:::subc
1678 unsigned long reg1, reg2, difference;
1682 if (RN0 > 7 && RN0 < 12)
1683 dstreg = REG_A0 + RN0 - 8;
1684 else if (RN0 > 11 && RN0 < 16)
1685 dstreg = REG_D0 + RN0 - 12;
1687 dstreg = REG_E0 + RN0;
1689 imm = EXTEND8 (IMM8);
1690 reg2 = State.regs[dstreg];
1691 difference = reg2 - imm - ((PSW & PSW_C) != 0);
1692 State.regs[dstreg] = difference;
1694 z = (difference == 0);
1695 n = (difference & 0x80000000);
1697 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1698 && (reg2 & 0x80000000) != (difference & 0x80000000));
1700 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1701 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1702 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1705 // 1111 1011 1101 1000 Rn Rn IMM8; cmp IMM8,Rn
1706 8.0xfb+8.0xd8+4.RM2,4.RN0=RM2+8.IMM8:D2b:::cmp
1714 if (RN0 > 7 && RN0 < 12)
1715 srcreg = REG_A0 + RN0 - 8;
1716 else if (RN0 > 11 && RN0 < 16)
1717 srcreg = REG_D0 + RN0 - 12;
1719 srcreg = REG_E0 + RN0;
1721 genericCmp (EXTEND8 (IMM8), State.regs[srcreg]);
1724 // 1111 1011 1111 1000 XRn XRn IMM8; mov IMM8,XRn
1725 8.0xfb+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM8:D2k:::mov
1734 State.regs[REG_SP] = EXTEND8 (IMM8);
1739 // 1111 1011 0000 1001 Rn Rn IMM8; and IMM8,Rn
1740 8.0xfb+8.0x09+4.RM2,4.RN0=RM2+8.IMM8:D2d:::and
1749 if (RN0 > 7 && RN0 < 12)
1750 dstreg = REG_A0 + RN0 - 8;
1751 else if (RN0 > 11 && RN0 < 16)
1752 dstreg = REG_D0 + RN0 - 12;
1754 dstreg = REG_E0 + RN0;
1756 State.regs[dstreg] &= (IMM8 & 0xff);
1757 z = (State.regs[dstreg] == 0);
1758 n = (State.regs[dstreg] & 0x80000000) != 0;
1759 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1760 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1763 // 1111 1011 0001 1001 Rn Rn IMM8; or IMM8,Rn
1764 8.0xfb+8.0x19+4.RM2,4.RN0=RM2+8.IMM8:D2d:::or
1773 if (RN0 > 7 && RN0 < 12)
1774 dstreg = REG_A0 + RN0 - 8;
1775 else if (RN0 > 11 && RN0 < 16)
1776 dstreg = REG_D0 + RN0 - 12;
1778 dstreg = REG_E0 + RN0;
1780 State.regs[dstreg] |= (IMM8 & 0xff);
1781 z = (State.regs[dstreg] == 0);
1782 n = (State.regs[dstreg] & 0x80000000) != 0;
1783 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1784 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1787 // 1111 1011 0010 1001 Rn Rn IMM8; xor IMM8,Rn
1788 8.0xfb+8.0x29+4.RM2,4.RN0=RM2+8.IMM8:D2d:::xor
1797 if (RN0 > 7 && RN0 < 12)
1798 dstreg = REG_A0 + RN0 - 8;
1799 else if (RN0 > 11 && RN0 < 16)
1800 dstreg = REG_D0 + RN0 - 12;
1802 dstreg = REG_E0 + RN0;
1804 State.regs[dstreg] ^= (IMM8 & 0xff);
1805 z = (State.regs[dstreg] == 0);
1806 n = (State.regs[dstreg] & 0x80000000) != 0;
1807 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1808 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1811 // 1111 1011 0100 1001 Rn Rn IMM8; asr IMM8,Rn
1812 8.0xfb+8.0x49+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asr
1822 if (RN0 > 7 && RN0 < 12)
1823 dstreg = REG_A0 + RN0 - 8;
1824 else if (RN0 > 11 && RN0 < 16)
1825 dstreg = REG_D0 + RN0 - 12;
1827 dstreg = REG_E0 + RN0;
1829 temp = State.regs[dstreg];
1831 temp >>= (IMM8 & 0xff);
1832 State.regs[dstreg] = temp;
1833 z = (State.regs[dstreg] == 0);
1834 n = (State.regs[dstreg] & 0x80000000) != 0;
1835 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1836 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1839 // 1111 1011 0101 1001 Rn Rn IMM8; lsr IMM8,Rn
1840 8.0xfb+8.0x59+4.RM2,4.RN0=RM2+8.IMM8:D2a:::lsr
1849 if (RN0 > 7 && RN0 < 12)
1850 dstreg = REG_A0 + RN0 - 8;
1851 else if (RN0 > 11 && RN0 < 16)
1852 dstreg = REG_D0 + RN0 - 12;
1854 dstreg = REG_E0 + RN0;
1856 c = State.regs[dstreg] & 1;
1857 State.regs[dstreg] >>= (IMM8 & 0xff);
1858 z = (State.regs[dstreg] == 0);
1859 n = (State.regs[dstreg] & 0x80000000) != 0;
1860 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1861 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1864 // 1111 1011 0110 1001 Rn Rn IMM8; asl IMM8,Rn
1865 8.0xfb+8.0x69+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asl
1874 if (RN0 > 7 && RN0 < 12)
1875 dstreg = REG_A0 + RN0 - 8;
1876 else if (RN0 > 11 && RN0 < 16)
1877 dstreg = REG_D0 + RN0 - 12;
1879 dstreg = REG_E0 + RN0;
1881 State.regs[dstreg] <<= (IMM8 & 0xff);
1882 z = (State.regs[dstreg] == 0);
1883 n = (State.regs[dstreg] & 0x80000000) != 0;
1884 PSW &= ~(PSW_Z | PSW_N);
1885 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1888 // 1111 1011 1010 1001 Rn Rn IMM8; mul IMM8,Rn
1889 8.0xfb+8.0xa9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mul
1894 unsigned long long temp;
1899 if (RN0 > 7 && RN0 < 12)
1900 dstreg = REG_A0 + RN0 - 8;
1901 else if (RN0 > 11 && RN0 < 16)
1902 dstreg = REG_D0 + RN0 - 12;
1904 dstreg = REG_E0 + RN0;
1906 temp = ((signed64)(signed32)State.regs[dstreg]
1907 * (signed64)(signed32)EXTEND8 (IMM8));
1908 State.regs[dstreg] = temp & 0xffffffff;
1909 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1910 z = (State.regs[dstreg] == 0);
1911 n = (State.regs[dstreg] & 0x80000000) != 0;
1912 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1913 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1916 // 1111 1011 1011 1001 Rn Rn IMM8; mulu IMM8,Rn
1917 8.0xfb+8.0xb9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mulu
1922 unsigned long long temp;
1927 if (RN0 > 7 && RN0 < 12)
1928 dstreg = REG_A0 + RN0 - 8;
1929 else if (RN0 > 11 && RN0 < 16)
1930 dstreg = REG_D0 + RN0 - 12;
1932 dstreg = REG_E0 + RN0;
1934 temp = ((unsigned64)State.regs[dstreg]
1935 * (unsigned64)(IMM8 & 0xff));
1936 State.regs[dstreg] = temp & 0xffffffff;
1937 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1938 z = (State.regs[dstreg] == 0);
1939 n = (State.regs[dstreg] & 0x80000000) != 0;
1940 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1941 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1946 // 1111 1011 0000 1010 Rn Rm IMM8; mov (d8,Rm),Rn
1947 8.0xfb+8.0x0a+4.RN2,4.RM0+8.IMM8:D2l:::mov
1954 if (RM0 > 7 && RM0 < 12)
1955 srcreg = REG_A0 + RM0 - 8;
1956 else if (RM0 > 11 && RM0 < 16)
1957 srcreg = REG_D0 + RM0 - 12;
1959 srcreg = REG_E0 + RM0;
1961 if (RN2 > 7 && RN2 < 12)
1962 dstreg = REG_A0 + RN2 - 8;
1963 else if (RN2 > 11 && RN2 < 16)
1964 dstreg = REG_D0 + RN2 - 12;
1966 dstreg = REG_E0 + RN2;
1968 State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
1971 // 1111 1011 0001 1010 Rn Rm IMM8; mov Rm,(d8,Rn)
1972 8.0xfb+8.0x1a+4.RM2,4.RN0+8.IMM8:D2m:::mov
1979 if (RM2 > 7 && RM2 < 12)
1980 srcreg = REG_A0 + RM2 - 8;
1981 else if (RM2 > 11 && RM2 < 16)
1982 srcreg = REG_D0 + RM2 - 12;
1984 srcreg = REG_E0 + RM2;
1986 if (RN0 > 7 && RN0 < 12)
1987 dstreg = REG_A0 + RN0 - 8;
1988 else if (RN0 > 11 && RN0 < 16)
1989 dstreg = REG_D0 + RN0 - 12;
1991 dstreg = REG_E0 + RN0;
1993 store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1996 // 1111 1011 0010 1010 Rn Rm IMM8; movbu (d8,Rm),Rn
1997 8.0xfb+8.0x2a+4.RN2,4.RM0+8.IMM8:D2l:::movbu
2004 if (RM0 > 7 && RM0 < 12)
2005 srcreg = REG_A0 + RM0 - 8;
2006 else if (RM0 > 11 && RM0 < 16)
2007 srcreg = REG_D0 + RM0 - 12;
2009 srcreg = REG_E0 + RM0;
2011 if (RN2 > 7 && RN2 < 12)
2012 dstreg = REG_A0 + RN2 - 8;
2013 else if (RN2 > 11 && RN2 < 16)
2014 dstreg = REG_D0 + RN2 - 12;
2016 dstreg = REG_E0 + RN2;
2018 State.regs[dstreg] = load_byte (State.regs[srcreg] + EXTEND8 (IMM8));
2021 // 1111 1011 0011 1010 Rn Rm IMM8; movbu Rm,(d8,Rn)
2022 8.0xfb+8.0x3a+4.RM2,4.RN0+8.IMM8:D2m:::movbu
2029 if (RM2 > 7 && RM2 < 12)
2030 srcreg = REG_A0 + RM2 - 8;
2031 else if (RM2 > 11 && RM2 < 16)
2032 srcreg = REG_D0 + RM2 - 12;
2034 srcreg = REG_E0 + RM2;
2036 if (RN0 > 7 && RN0 < 12)
2037 dstreg = REG_A0 + RN0 - 8;
2038 else if (RN0 > 11 && RN0 < 16)
2039 dstreg = REG_D0 + RN0 - 12;
2041 dstreg = REG_E0 + RN0;
2043 store_byte (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2046 // 1111 1011 0100 1010 Rn Rm IMM8; movhu (d8,Rm),Rn
2047 8.0xfb+8.0x4a+4.RN2,4.RM0+8.IMM8:D2l:::movhu
2054 if (RM0 > 7 && RM0 < 12)
2055 srcreg = REG_A0 + RM0 - 8;
2056 else if (RM0 > 11 && RM0 < 16)
2057 srcreg = REG_D0 + RM0 - 12;
2059 srcreg = REG_E0 + RM0;
2061 if (RN2 > 7 && RN2 < 12)
2062 dstreg = REG_A0 + RN2 - 8;
2063 else if (RN2 > 11 && RN2 < 16)
2064 dstreg = REG_D0 + RN2 - 12;
2066 dstreg = REG_E0 + RN2;
2068 State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
2071 // 1111 1011 0101 1010 Rn Rm IMM8; movhu Rm,(d8,Rn)
2072 8.0xfb+8.0x5a+4.RM2,4.RN0+8.IMM8:D2m:::movhu
2079 if (RM2 > 7 && RM2 < 12)
2080 srcreg = REG_A0 + RM2 - 8;
2081 else if (RM2 > 11 && RM2 < 16)
2082 srcreg = REG_D0 + RM2 - 12;
2084 srcreg = REG_E0 + RM2;
2086 if (RN0 > 7 && RN0 < 12)
2087 dstreg = REG_A0 + RN0 - 8;
2088 else if (RN0 > 11 && RN0 < 16)
2089 dstreg = REG_D0 + RN0 - 12;
2091 dstreg = REG_E0 + RN0;
2093 store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2099 // 1111 1011 1000 1010 Rn 0000 IMM8; mov (d8,sp),Rn
2100 8.0xfb+8.0x8a+4.RN2,4.0x0+8.IMM8:D2n:::mov
2107 if (RN2 > 7 && RN2 < 12)
2108 dstreg = REG_A0 + RN2 - 8;
2109 else if (RN2 > 11 && RN2 < 16)
2110 dstreg = REG_D0 + RN2 - 12;
2112 dstreg = REG_E0 + RN2;
2114 State.regs[dstreg] = load_word (State.regs[REG_SP] + EXTEND8 (IMM8));
2117 // 1111 1011 1001 1010 Rm 0000 IMM8; mov Rm,(d8,Rn)
2118 8.0xfb+8.0x9a+4.RM2,4.0x0+8.IMM8:D2o:::mov
2125 if (RM2 > 7 && RM2 < 12)
2126 srcreg = REG_A0 + RM2 - 8;
2127 else if (RM2 > 11 && RM2 < 16)
2128 srcreg = REG_D0 + RM2 - 12;
2130 srcreg = REG_E0 + RM2;
2132 store_word (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2135 // 1111 1011 1010 1010 Rn Rm IMM8; movbu (d8,sp),Rn
2136 8.0xfb+8.0xaa+4.RN2,4.0x0+8.IMM8:D2n:::movbu
2143 if (RN2 > 7 && RN2 < 12)
2144 dstreg = REG_A0 + RN2 - 8;
2145 else if (RN2 > 11 && RN2 < 16)
2146 dstreg = REG_D0 + RN2 - 12;
2148 dstreg = REG_E0 + RN2;
2150 State.regs[dstreg] = load_byte (State.regs[REG_SP] + EXTEND8 (IMM8));
2153 // 1111 1011 1011 1010 Rn Rm IMM8; movbu Rm,(sp,Rn)
2154 8.0xfb+8.0xba+4.RM2,4.0x0+8.IMM8:D2o:::movbu
2161 if (RM2 > 7 && RM2 < 12)
2162 srcreg = REG_A0 + RM2 - 8;
2163 else if (RM2 > 11 && RM2 < 16)
2164 srcreg = REG_D0 + RM2 - 12;
2166 srcreg = REG_E0 + RM2;
2168 store_byte (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2171 // 1111 1011 1100 1010 Rn Rm IMM8; movhu (d8,sp),Rn
2172 8.0xfb+8.0xca+4.RN2,4.0x0+8.IMM8:D2n:::movhu
2179 if (RN2 > 7 && RN2 < 12)
2180 dstreg = REG_A0 + RN2 - 8;
2181 else if (RN2 > 11 && RN2 < 16)
2182 dstreg = REG_D0 + RN2 - 12;
2184 dstreg = REG_E0 + RN2;
2186 State.regs[dstreg] = load_half (State.regs[REG_SP] + EXTEND8 (IMM8));
2189 // 1111 1011 1101 1010 Rn Rm IMM8; movhu Rm,(d8,sp)
2190 8.0xfb+8.0xda+4.RM2,4.0x0+8.IMM8:D2o:::movhu
2197 if (RM2 > 7 && RM2 < 12)
2198 srcreg = REG_A0 + RM2 - 8;
2199 else if (RM2 > 11 && RM2 < 16)
2200 srcreg = REG_D0 + RM2 - 12;
2202 srcreg = REG_E0 + RM2;
2204 store_half (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2207 // 1111 1011 0111 1100 Rm Rn Rd; add Rm,Rn,Rd
2208 8.0xfb+8.0x7c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::add
2214 int srcreg1, srcreg2, dstreg;
2218 if (RM2 > 7 && RM2 < 12)
2219 srcreg1 = REG_A0 + RM2 - 8;
2220 else if (RM2 > 11 && RM2 < 16)
2221 srcreg1 = REG_D0 + RM2 - 12;
2223 srcreg1 = REG_E0 + RM2;
2225 if (RN0 > 7 && RN0 < 12)
2226 srcreg2 = REG_A0 + RN0 - 8;
2227 else if (RN0 > 11 && RN0 < 16)
2228 srcreg2 = REG_D0 + RN0 - 12;
2230 srcreg2 = REG_E0 + RN0;
2232 if (RD0 > 7 && RD0 < 12)
2233 dstreg = REG_A0 + RD0 - 8;
2234 else if (RD0 > 11 && RD0 < 16)
2235 dstreg = REG_D0 + RD0 - 12;
2237 dstreg = REG_E0 + RD0;
2239 sum = source1 + source2;
2240 State.regs[dstreg] = sum;
2243 n = (sum & 0x80000000);
2244 c = (sum < source1) || (sum < source2);
2245 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2246 && (source1 & 0x80000000) != (sum & 0x80000000));
2248 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2249 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2250 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2253 // 1111 1101 1101 1000 Rn Rn IMM32; cmp imm24,Rn
2254 8.0xfd+8.0xd8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::cmp
2262 if (RN0 > 7 && RN0 < 12)
2263 srcreg = REG_A0 + RN0 - 8;
2264 else if (RN0 > 11 && RN0 < 16)
2265 srcreg = REG_D0 + RN0 - 12;
2267 srcreg = REG_E0 + RN0;
2269 genericCmp (FETCH24(IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
2272 // 1111 1110 0000 1000 Rn Rn IMM32; mov imm32,Rn
2273 8.0xfe+8.0x08+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mov
2281 if (RN0 > 7 && RN0 < 12)
2282 dstreg = REG_A0 + RN0 - 8;
2283 else if (RN0 > 11 && RN0 < 16)
2284 dstreg = REG_D0 + RN0 - 12;
2286 dstreg = REG_E0 + RN0;
2288 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
2291 // 1111 1110 0001 1000 Rn Rn IMM32; movu imm32,Rn
2292 8.0xfe+8.0x18+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movu
2300 if (RN0 > 7 && RN0 < 12)
2301 dstreg = REG_A0 + RN0 - 8;
2302 else if (RN0 > 11 && RN0 < 16)
2303 dstreg = REG_D0 + RN0 - 12;
2305 dstreg = REG_E0 + RN0;
2307 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
2310 // 1111 1110 0000 1000 Rn Rn IMM32; add imm32,Rn
2311 8.0xfe+8.0x78+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::add
2319 if (RN0 > 7 && RN0 < 12)
2320 dstreg = REG_A0 + RN0 - 8;
2321 else if (RN0 > 11 && RN0 < 16)
2322 dstreg = REG_D0 + RN0 - 12;
2324 dstreg = REG_E0 + RN0;
2326 genericAdd (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
2329 // 1111 1110 0111 1000 Rn Rn IMM32; cmp imm32,Rn
2330 8.0xfe+8.0xd8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::cmp
2338 if (RN0 > 7 && RN0 < 12)
2339 srcreg = REG_A0 + RN0 - 8;
2340 else if (RN0 > 11 && RN0 < 16)
2341 srcreg = REG_D0 + RN0 - 12;
2343 srcreg = REG_E0 + RN0;
2345 genericCmp (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);