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
175 unsigned long usp = State.regs[REG_USP];
184 State.regs[REG_LAR] = load_word (usp);
186 State.regs[REG_LIR] = load_word (usp);
188 State.regs[REG_MDR] = load_word (usp);
190 State.regs[REG_A0 + 1] = load_word (usp);
192 State.regs[REG_A0] = load_word (usp);
194 State.regs[REG_D0 + 1] = load_word (usp);
196 State.regs[REG_D0] = load_word (usp);
202 State.regs[REG_A0 + 3] = load_word (usp);
208 State.regs[REG_A0 + 2] = load_word (usp);
214 State.regs[REG_D0 + 3] = load_word (usp);
220 State.regs[REG_D0 + 2] = load_word (usp);
224 /* start-sanitize-am33 */
225 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
229 /* Need to restore MDQR, MCRH, MCRL, and MCVF */
231 State.regs[REG_E0 + 1] = load_word (usp);
233 State.regs[REG_E0 + 0] = load_word (usp);
239 State.regs[REG_E0 + 7] = load_word (usp);
241 State.regs[REG_E0 + 6] = load_word (usp);
243 State.regs[REG_E0 + 5] = load_word (usp);
245 State.regs[REG_E0 + 4] = load_word (usp);
251 State.regs[REG_E0 + 3] = load_word (usp);
253 State.regs[REG_E0 + 2] = load_word (usp);
257 /* end-sanitize-am33 */
259 /* And make sure to update the stack pointer. */
260 State.regs[REG_USP] = usp;
263 // 1111 1000 1100 1111 regs....; movm (USP),regs
264 8.0xf8+8.0xcf+8.REGS:D1b:::movm
268 unsigned long usp = State.regs[REG_USP];
271 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
276 store_word (usp, State.regs[REG_E0 + 2]);
278 store_word (usp, State.regs[REG_E0 + 3]);
284 store_word (usp, State.regs[REG_E0 + 4]);
286 store_word (usp, State.regs[REG_E0 + 5]);
288 store_word (usp, State.regs[REG_E0 + 6]);
290 store_word (usp, State.regs[REG_E0 + 7]);
296 store_word (usp, State.regs[REG_E0 + 0]);
298 store_word (usp, State.regs[REG_E0 + 1]);
300 /* Need to save MDQR, MCRH, MCRL, and MCVF */
303 /* end-sanitize-am33 */
308 store_word (usp, State.regs[REG_D0 + 2]);
314 store_word (usp, State.regs[REG_D0 + 3]);
320 store_word (usp, State.regs[REG_A0 + 2]);
326 store_word (usp, State.regs[REG_A0 + 3]);
332 store_word (usp, State.regs[REG_D0]);
334 store_word (usp, State.regs[REG_D0 + 1]);
336 store_word (usp, State.regs[REG_A0]);
338 store_word (usp, State.regs[REG_A0 + 1]);
340 store_word (usp, State.regs[REG_MDR]);
342 store_word (usp, State.regs[REG_LIR]);
344 store_word (usp, State.regs[REG_LAR]);
348 /* And make sure to update the stack pointer. */
349 State.regs[REG_USP] = usp;
352 // 1111 1100 1111 1100 imm32...; and imm32,EPSW
353 8.0xfc+8.0xfc+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:4a:::and
358 PSW &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
361 // 1111 1100 1111 1101 imm32...; or imm32,EPSW
362 8.0xfc+8.0xfd+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::or
367 PSW |= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
370 // 1111 1001 0000 1000 Rm Rn; mov Rm,Rn (Rm != Rn)
371 8.0xf9+8.0x08+4.RM2,4.RN0!RM2:D1g:::mov
379 if (RM2 > 7 && RM2 < 12)
380 srcreg = REG_A0 + RM2 - 8;
381 else if (RM2 > 11 && RM2 < 16)
382 srcreg = REG_D0 + RM2 - 12;
384 srcreg = REG_E0 + RM2;
386 if (RN0 > 7 && RN0 < 12)
387 dstreg = REG_A0 + RN0 - 8;
388 else if (RN0 > 11 && RN0 < 16)
389 dstreg = REG_D0 + RN0 - 12;
391 dstreg = REG_E0 + RN0;
393 State.regs[dstreg] = State.regs[srcreg];
396 // 1111 1001 0001 1000 Rn Rn; ext Rn
397 8.0xf9+8.0x18+4.RN0,4.RN2=RN0:D1:::ext
405 if (RN0 > 7 && RN0 < 12)
406 srcreg = REG_A0 + RN0 - 8;
407 else if (RN0 > 11 && RN0 < 16)
408 srcreg = REG_D0 + RN0 - 12;
410 srcreg = REG_E0 + RN0;
412 if (State.regs[srcreg] & 0x80000000)
413 State.regs[REG_MDR] = -1;
415 State.regs[REG_MDR] = 0;
418 // 1111 1001 0010 1000 Rm Rn; extb Rm,Rn
419 8.0xf9+8.0x28+4.RM2,4.RN0!RM2:D1:::extb
427 if (RM2 > 7 && RM2 < 12)
428 srcreg = REG_A0 + RM2 - 8;
429 else if (RM2 > 11 && RM2 < 16)
430 srcreg = REG_D0 + RM2 - 12;
432 srcreg = REG_E0 + RM2;
434 if (RN0 > 7 && RN0 < 12)
435 dstreg = REG_A0 + RN0 - 8;
436 else if (RN0 > 11 && RN0 < 16)
437 dstreg = REG_D0 + RN0 - 12;
439 dstreg = REG_E0 + RN0;
441 State.regs[dstreg] = EXTEND8 (State.regs[srcreg]);
444 // 1111 1001 0011 1000 Rm Rn; extbu Rm,Rn
445 8.0xf9+8.0x38+4.RM2,4.RN0!RM2:D1:::extbu
453 if (RM2 > 7 && RM2 < 12)
454 srcreg = REG_A0 + RM2 - 8;
455 else if (RM2 > 11 && RM2 < 16)
456 srcreg = REG_D0 + RM2 - 12;
458 srcreg = REG_E0 + RM2;
460 if (RN0 > 7 && RN0 < 12)
461 dstreg = REG_A0 + RN0 - 8;
462 else if (RN0 > 11 && RN0 < 16)
463 dstreg = REG_D0 + RN0 - 12;
465 dstreg = REG_E0 + RN0;
467 State.regs[dstreg] = State.regs[srcreg] & 0xff;
470 // 1111 1001 0100 1000 Rm Rn; exth Rm,Rn
471 8.0xf9+8.0x48+4.RM2,4.RN0!RM2:D1:::exth
479 if (RM2 > 7 && RM2 < 12)
480 srcreg = REG_A0 + RM2 - 8;
481 else if (RM2 > 11 && RM2 < 16)
482 srcreg = REG_D0 + RM2 - 12;
484 srcreg = REG_E0 + RM2;
486 if (RN0 > 7 && RN0 < 12)
487 dstreg = REG_A0 + RN0 - 8;
488 else if (RN0 > 11 && RN0 < 16)
489 dstreg = REG_D0 + RN0 - 12;
491 dstreg = REG_E0 + RN0;
493 State.regs[dstreg] = EXTEND16 (State.regs[srcreg]);
496 // 1111 1001 0101 1000 Rm Rn; exthu Rm,Rn
497 8.0xf9+8.0x58+4.RM2,4.RN0!RM2:D1:::exthu
505 if (RM2 > 7 && RM2 < 12)
506 srcreg = REG_A0 + RM2 - 8;
507 else if (RM2 > 11 && RM2 < 16)
508 srcreg = REG_D0 + RM2 - 12;
510 srcreg = REG_E0 + RM2;
512 if (RN0 > 7 && RN0 < 12)
513 dstreg = REG_A0 + RN0 - 8;
514 else if (RN0 > 11 && RN0 < 16)
515 dstreg = REG_D0 + RN0 - 12;
517 dstreg = REG_E0 + RN0;
519 State.regs[dstreg] = State.regs[srcreg] & 0xffff;
522 // 1111 1001 0110 1000 Rn Rn; clr Rn
523 8.0xf9+8.0x68+4.RM2,4.RN0=RM2:D1:::clr
531 if (RN0 > 7 && RN0 < 12)
532 dstreg = REG_A0 + RN0 - 8;
533 else if (RN0 > 11 && RN0 < 16)
534 dstreg = REG_D0 + RN0 - 12;
536 dstreg = REG_E0 + RN0;
538 State.regs[dstreg] = 0;
541 PSW &= ~(PSW_V | PSW_C | PSW_N);
544 // 1111 1001 0111 1000 Rm Rn; add Rm,Rn
545 8.0xf9+8.0x78+4.RM2,4.RN0:D1b:::add
553 if (RM2 > 7 && RM2 < 12)
554 srcreg = REG_A0 + RM2 - 8;
555 else if (RM2 > 11 && RM2 < 16)
556 srcreg = REG_D0 + RM2 - 12;
558 srcreg = REG_E0 + RM2;
560 if (RN0 > 7 && RN0 < 12)
561 dstreg = REG_A0 + RN0 - 8;
562 else if (RN0 > 11 && RN0 < 16)
563 dstreg = REG_D0 + RN0 - 12;
565 dstreg = REG_E0 + RN0;
567 genericAdd (State.regs[srcreg], dstreg);
570 // 1111 1001 1000 1000 Rm Rn; addc Rm,Rn
571 8.0xf9+8.0x88+4.RM2,4.RN0:D1b:::addc
577 unsigned long reg1, reg2, sum;
581 if (RM2 > 7 && RM2 < 12)
582 srcreg = REG_A0 + RM2 - 8;
583 else if (RM2 > 11 && RM2 < 16)
584 srcreg = REG_D0 + RM2 - 12;
586 srcreg = REG_E0 + RM2;
588 if (RN0 > 7 && RN0 < 12)
589 dstreg = REG_A0 + RN0 - 8;
590 else if (RN0 > 11 && RN0 < 16)
591 dstreg = REG_D0 + RN0 - 12;
593 dstreg = REG_E0 + RN0;
595 reg1 = State.regs[srcreg];
596 reg2 = State.regs[dstreg];
597 sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
598 State.regs[dstreg] = sum;
601 n = (sum & 0x80000000);
602 c = (sum < reg1) || (sum < reg2);
603 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
604 && (reg2 & 0x80000000) != (sum & 0x80000000));
606 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
607 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
608 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
611 // 1111 1001 1001 1000 Rm Rn; sub Rm,Rn
612 8.0xf9+8.0x98+4.RM2,4.RN0:D1b:::sub
620 if (RM2 > 7 && RM2 < 12)
621 srcreg = REG_A0 + RM2 - 8;
622 else if (RM2 > 11 && RM2 < 16)
623 srcreg = REG_D0 + RM2 - 12;
625 srcreg = REG_E0 + RM2;
627 if (RN0 > 7 && RN0 < 12)
628 dstreg = REG_A0 + RN0 - 8;
629 else if (RN0 > 11 && RN0 < 16)
630 dstreg = REG_D0 + RN0 - 12;
632 dstreg = REG_E0 + RN0;
634 genericSub (State.regs[srcreg], dstreg);
637 // 1111 1001 1010 1000 Rm Rn; subc Rm,Rn
638 8.0xf9+8.0xa8+4.RM2,4.RN0:D1b:::subc
644 unsigned long reg1, reg2, difference;
648 if (RM2 > 7 && RM2 < 12)
649 srcreg = REG_A0 + RM2 - 8;
650 else if (RM2 > 11 && RM2 < 16)
651 srcreg = REG_D0 + RM2 - 12;
653 srcreg = REG_E0 + RM2;
655 if (RN0 > 7 && RN0 < 12)
656 dstreg = REG_A0 + RN0 - 8;
657 else if (RN0 > 11 && RN0 < 16)
658 dstreg = REG_D0 + RN0 - 12;
660 dstreg = REG_E0 + RN0;
662 reg1 = State.regs[srcreg];
663 reg2 = State.regs[dstreg];
664 difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
665 State.regs[dstreg] = difference;
667 z = (difference == 0);
668 n = (difference & 0x80000000);
670 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
671 && (reg2 & 0x80000000) != (difference & 0x80000000));
673 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
674 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
675 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
678 // 1111 1001 1011 1000 Rn Rn; inc Rn
679 8.0xf9+8.0xb8+4.RN0,4.RN2=RN0:D1:::inc
687 if (RN0 > 7 && RN0 < 12)
688 dstreg = REG_A0 + RN0 - 8;
689 else if (RN0 > 11 && RN0 < 16)
690 dstreg = REG_D0 + RN0 - 12;
692 dstreg = REG_E0 + RN0;
694 genericAdd (1, dstreg);
697 // 1111 1001 1101 1000 Rn Rn; inc Rn
698 8.0xf9+8.0xc8+4.RN0,4.RN2=RN0:D1:::inc4
706 if (RN0 > 7 && RN0 < 12)
707 dstreg = REG_A0 + RN0 - 8;
708 else if (RN0 > 11 && RN0 < 16)
709 dstreg = REG_D0 + RN0 - 12;
711 dstreg = REG_E0 + RN0;
712 State.regs[dstreg] += 4;
715 // 1111 1001 1101 1000 Rm Rn; cmp Rm,Rn
716 8.0xf9+8.0xd8+4.RM2,4.RN0:D1:::cmp
720 int srcreg1, srcreg2;
724 if (RN0 > 7 && RN0 < 12)
725 srcreg1 = REG_A0 + RN0 - 8;
726 else if (RN0 > 11 && RN0 < 16)
727 srcreg1 = REG_D0 + RN0 - 12;
729 srcreg1 = REG_E0 + RN0;
731 if (RM2 > 7 && RM2 < 12)
732 srcreg2 = REG_A0 + RM2 - 8;
733 else if (RM2 > 11 && RM2 < 16)
734 srcreg2 = REG_D0 + RM2 - 12;
736 srcreg2 = REG_E0 + RM2;
737 genericCmp (State.regs[srcreg2], State.regs[srcreg1]);
740 // 1111 1001 1110 1000 XRm Rn; mov XRm,Rn
741 8.0xf9+8.0xe8+4.XRM2,4.RN0:D1l:::mov
748 if (RN0 > 7 && RN0 < 12)
749 dstreg = REG_A0 + RN0 - 8;
750 else if (RN0 > 11 && RN0 < 16)
751 dstreg = REG_D0 + RN0 - 12;
753 dstreg = REG_E0 + RN0;
757 State.regs[dstreg] = State.regs[REG_SP];
763 // 1111 1001 1111 1000 Rm XRn; mov Rm,XRn
764 8.0xf9+8.0xf8+4.RM2,4.XRN0:D1m:::mov
772 if (RM2 > 7 && RM2 < 12)
773 srcreg = REG_A0 + RM2 - 8;
774 else if (RM2 > 11 && RM2 < 16)
775 srcreg = REG_D0 + RM2 - 12;
777 srcreg = REG_E0 + RM2;
781 State.regs[REG_SP] = State.regs[srcreg];
787 // 1111 1001 0000 1001 Rm Rn; and Rm,Rn
788 8.0xf9+8.0x09+4.RM2,4.RN0:D1a:::and
797 if (RM2 > 7 && RM2 < 12)
798 srcreg = REG_A0 + RM2 - 8;
799 else if (RM2 > 11 && RM2 < 16)
800 srcreg = REG_D0 + RM2 - 12;
802 srcreg = REG_E0 + RM2;
804 if (RN0 > 7 && RN0 < 12)
805 dstreg = REG_A0 + RN0 - 8;
806 else if (RN0 > 11 && RN0 < 16)
807 dstreg = REG_D0 + RN0 - 12;
809 dstreg = REG_E0 + RN0;
811 State.regs[dstreg] &= State.regs[srcreg];
812 z = (State.regs[dstreg] == 0);
813 n = (State.regs[dstreg] & 0x80000000) != 0;
814 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
815 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
818 // 1111 1001 0001 1001 Rm Rn; or Rm,Rn
819 8.0xf9+8.0x19+4.RM2,4.RN0:D1a:::or
828 if (RM2 > 7 && RM2 < 12)
829 srcreg = REG_A0 + RM2 - 8;
830 else if (RM2 > 11 && RM2 < 16)
831 srcreg = REG_D0 + RM2 - 12;
833 srcreg = REG_E0 + RM2;
835 if (RN0 > 7 && RN0 < 12)
836 dstreg = REG_A0 + RN0 - 8;
837 else if (RN0 > 11 && RN0 < 16)
838 dstreg = REG_D0 + RN0 - 12;
840 dstreg = REG_E0 + RN0;
842 State.regs[dstreg] |= State.regs[srcreg];
843 z = (State.regs[dstreg] == 0);
844 n = (State.regs[dstreg] & 0x80000000) != 0;
845 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
846 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
849 // 1111 1001 0010 1001 Rm Rn; xor Rm,Rn
850 8.0xf9+8.0x29+4.RM2,4.RN0:D1a:::xor
859 if (RM2 > 7 && RM2 < 12)
860 srcreg = REG_A0 + RM2 - 8;
861 else if (RM2 > 11 && RM2 < 16)
862 srcreg = REG_D0 + RM2 - 12;
864 srcreg = REG_E0 + RM2;
866 if (RN0 > 7 && RN0 < 12)
867 dstreg = REG_A0 + RN0 - 8;
868 else if (RN0 > 11 && RN0 < 16)
869 dstreg = REG_D0 + RN0 - 12;
871 dstreg = REG_E0 + RN0;
873 State.regs[dstreg] ^= State.regs[srcreg];
874 z = (State.regs[dstreg] == 0);
875 n = (State.regs[dstreg] & 0x80000000) != 0;
876 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
877 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
880 // 1111 1001 0011 1001 Rn Rn; not Rn
881 8.0xf9+8.0x39+4.RM2,4.RN0=RM2:D1:::not
890 if (RN0 > 7 && RN0 < 12)
891 dstreg = REG_A0 + RN0 - 8;
892 else if (RN0 > 11 && RN0 < 16)
893 dstreg = REG_D0 + RN0 - 12;
895 dstreg = REG_E0 + RN0;
897 State.regs[dstreg] = ~State.regs[dstreg];
898 z = (State.regs[dstreg] == 0);
899 n = (State.regs[dstreg] & 0x80000000) != 0;
900 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
901 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
904 // 1111 1001 0100 1001 Rm Rn; asr Rm,Rn
905 8.0xf9+8.0x49+4.RM2,4.RN0:D1a:::asr
915 if (RM2 > 7 && RM2 < 12)
916 srcreg = REG_A0 + RM2 - 8;
917 else if (RM2 > 11 && RM2 < 16)
918 srcreg = REG_D0 + RM2 - 12;
920 srcreg = REG_E0 + RM2;
922 if (RN0 > 7 && RN0 < 12)
923 dstreg = REG_A0 + RN0 - 8;
924 else if (RN0 > 11 && RN0 < 16)
925 dstreg = REG_D0 + RN0 - 12;
927 dstreg = REG_E0 + RN0;
929 temp = State.regs[dstreg];
931 temp >>= State.regs[srcreg];
932 State.regs[dstreg] = temp;
933 z = (State.regs[dstreg] == 0);
934 n = (State.regs[dstreg] & 0x80000000) != 0;
935 PSW &= ~(PSW_Z | PSW_N | PSW_C);
936 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
939 // 1111 1001 0101 1001 Rm Rn; lsr Rm,Rn
940 8.0xf9+8.0x59+4.RM2,4.RN0:D1a:::lsr
949 if (RM2 > 7 && RM2 < 12)
950 srcreg = REG_A0 + RM2 - 8;
951 else if (RM2 > 11 && RM2 < 16)
952 srcreg = REG_D0 + RM2 - 12;
954 srcreg = REG_E0 + RM2;
956 if (RN0 > 7 && RN0 < 12)
957 dstreg = REG_A0 + RN0 - 8;
958 else if (RN0 > 11 && RN0 < 16)
959 dstreg = REG_D0 + RN0 - 12;
961 dstreg = REG_E0 + RN0;
963 c = State.regs[dstreg] & 1;
964 State.regs[dstreg] >>= State.regs[srcreg];
965 z = (State.regs[dstreg] == 0);
966 n = (State.regs[dstreg] & 0x80000000) != 0;
967 PSW &= ~(PSW_Z | PSW_N | PSW_C);
968 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
971 // 1111 1001 0110 1001 Rm Rn; asl Rm,Rn
972 8.0xf9+8.0x69+4.RM2,4.RN0:D1a:::asl
981 if (RM2 > 7 && RM2 < 12)
982 srcreg = REG_A0 + RM2 - 8;
983 else if (RM2 > 11 && RM2 < 16)
984 srcreg = REG_D0 + RM2 - 12;
986 srcreg = REG_E0 + RM2;
988 if (RN0 > 7 && RN0 < 12)
989 dstreg = REG_A0 + RN0 - 8;
990 else if (RN0 > 11 && RN0 < 16)
991 dstreg = REG_D0 + RN0 - 12;
993 dstreg = REG_E0 + RN0;
995 State.regs[dstreg] <<= State.regs[srcreg];
996 z = (State.regs[dstreg] == 0);
997 n = (State.regs[dstreg] & 0x80000000) != 0;
998 PSW &= ~(PSW_Z | PSW_N);
999 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1002 // 1111 1001 0111 1001 Rn Rn; asl2 Rn
1003 8.0xf9+8.0x79+4.RM2,4.RN0=RM2:D1:::asl2
1012 if (RN0 > 7 && RN0 < 12)
1013 dstreg = REG_A0 + RN0 - 8;
1014 else if (RN0 > 11 && RN0 < 16)
1015 dstreg = REG_D0 + RN0 - 12;
1017 dstreg = REG_E0 + RN0;
1019 State.regs[dstreg] <<= 2;
1020 z = (State.regs[dstreg] == 0);
1021 n = (State.regs[dstreg] & 0x80000000) != 0;
1022 PSW &= ~(PSW_Z | PSW_N);
1023 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1026 // 1111 1001 1000 1001 Rn Rn; ror Rn
1027 8.0xf9+8.0x89+4.RM2,4.RN0=RM2:D1:::ror
1033 unsigned long value;
1037 if (RN0 > 7 && RN0 < 12)
1038 dstreg = REG_A0 + RN0 - 8;
1039 else if (RN0 > 11 && RN0 < 16)
1040 dstreg = REG_D0 + RN0 - 12;
1042 dstreg = REG_E0 + RN0;
1044 value = State.regs[dstreg];
1048 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
1049 State.regs[dstreg] = value;
1051 n = (value & 0x80000000) != 0;
1052 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1053 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1056 // 1111 1001 1001 1001 Rn Rn; rol Rn
1057 8.0xf9+8.0x99+4.RM2,4.RN0=RM2:D1:::rol
1063 unsigned long value;
1067 if (RN0 > 7 && RN0 < 12)
1068 dstreg = REG_A0 + RN0 - 8;
1069 else if (RN0 > 11 && RN0 < 16)
1070 dstreg = REG_D0 + RN0 - 12;
1072 dstreg = REG_E0 + RN0;
1074 value = State.regs[dstreg];
1075 c = (value & 0x80000000) ? 1 : 0;
1078 value |= ((PSW & PSW_C) != 0);
1079 State.regs[dstreg] = value;
1081 n = (value & 0x80000000) != 0;
1082 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1083 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1086 // 1111 1001 1010 1001 Rm Rn; mul Rm,Rn
1087 8.0xf9+8.0xa9+4.RM2,4.RN0:D1b:::mul
1092 unsigned long long temp;
1097 if (RM2 > 7 && RM2 < 12)
1098 srcreg = REG_A0 + RM2 - 8;
1099 else if (RM2 > 11 && RM2 < 16)
1100 srcreg = REG_D0 + RM2 - 12;
1102 srcreg = REG_E0 + RM2;
1104 if (RN0 > 7 && RN0 < 12)
1105 dstreg = REG_A0 + RN0 - 8;
1106 else if (RN0 > 11 && RN0 < 16)
1107 dstreg = REG_D0 + RN0 - 12;
1109 dstreg = REG_E0 + RN0;
1111 temp = ((signed64)(signed32)State.regs[dstreg]
1112 * (signed64)(signed32)State.regs[srcreg]);
1113 State.regs[dstreg] = temp & 0xffffffff;
1114 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1115 z = (State.regs[dstreg] == 0);
1116 n = (State.regs[dstreg] & 0x80000000) != 0;
1117 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1118 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1121 // 1111 1001 1011 1001 Rm Rn; mulu Rm,Rn
1122 8.0xf9+8.0xb9+4.RM2,4.RN0:D1b:::mulu
1127 unsigned long long temp;
1132 if (RM2 > 7 && RM2 < 12)
1133 srcreg = REG_A0 + RM2 - 8;
1134 else if (RM2 > 11 && RM2 < 16)
1135 srcreg = REG_D0 + RM2 - 12;
1137 srcreg = REG_E0 + RM2;
1139 if (RN0 > 7 && RN0 < 12)
1140 dstreg = REG_A0 + RN0 - 8;
1141 else if (RN0 > 11 && RN0 < 16)
1142 dstreg = REG_D0 + RN0 - 12;
1144 dstreg = REG_E0 + RN0;
1146 temp = ((unsigned64)State.regs[dstreg]
1147 * (unsigned64)State.regs[srcreg]);
1148 State.regs[dstreg] = temp & 0xffffffff;
1149 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1150 z = (State.regs[dstreg] == 0);
1151 n = (State.regs[dstreg] & 0x80000000) != 0;
1152 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1153 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1156 // 1111 1001 1100 1001 Rm Rn; div Rm,Rn
1157 8.0xf9+8.0xc9+4.RM2,4.RN0:D1b:::div
1167 if (RM2 > 7 && RM2 < 12)
1168 srcreg = REG_A0 + RM2 - 8;
1169 else if (RM2 > 11 && RM2 < 16)
1170 srcreg = REG_D0 + RM2 - 12;
1172 srcreg = REG_E0 + RM2;
1174 if (RN0 > 7 && RN0 < 12)
1175 dstreg = REG_A0 + RN0 - 8;
1176 else if (RN0 > 11 && RN0 < 16)
1177 dstreg = REG_D0 + RN0 - 12;
1179 dstreg = REG_E0 + RN0;
1181 temp = State.regs[REG_MDR];
1183 temp |= State.regs[dstreg];
1184 State.regs[REG_MDR] = temp % (signed32)State.regs[srcreg];
1185 temp /= (long)State.regs[srcreg];
1186 State.regs[dstreg] = temp & 0xffffffff;
1187 z = (State.regs[dstreg] == 0);
1188 n = (State.regs[dstreg] & 0x80000000) != 0;
1189 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1190 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1193 // 1111 1001 1101 1001 Rm Rn; divu Rm,Rn
1194 8.0xf9+8.0xd9+4.RM2,4.RN0:D1b:::divu
1199 unsigned long long temp;
1204 if (RM2 > 7 && RM2 < 12)
1205 srcreg = REG_A0 + RM2 - 8;
1206 else if (RM2 > 11 && RM2 < 16)
1207 srcreg = REG_D0 + RM2 - 12;
1209 srcreg = REG_E0 + RM2;
1211 if (RN0 > 7 && RN0 < 12)
1212 dstreg = REG_A0 + RN0 - 8;
1213 else if (RN0 > 11 && RN0 < 16)
1214 dstreg = REG_D0 + RN0 - 12;
1216 dstreg = REG_E0 + RN0;
1218 temp = State.regs[REG_MDR];
1220 temp |= State.regs[dstreg];
1221 State.regs[REG_MDR] = temp % State.regs[srcreg];
1222 temp /= State.regs[srcreg];
1223 State.regs[dstreg] = temp & 0xffffffff;
1224 z = (State.regs[dstreg] == 0);
1225 n = (State.regs[dstreg] & 0x80000000) != 0;
1226 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1227 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1231 // 1111 1001 0000 1010 Rm Rn; mov (Rm),Rn
1232 8.0xf9+8.0x0a+4.RN2,4.RM0:D1h:::mov
1240 if (RM0 > 7 && RM0 < 12)
1241 srcreg = REG_A0 + RM0 - 8;
1242 else if (RM0 > 11 && RM0 < 16)
1243 srcreg = REG_D0 + RM0 - 12;
1245 srcreg = REG_E0 + RM0;
1247 if (RN2 > 7 && RN2 < 12)
1248 dstreg = REG_A0 + RN2 - 8;
1249 else if (RN2 > 11 && RN2 < 16)
1250 dstreg = REG_D0 + RN2 - 12;
1252 dstreg = REG_E0 + RN2;
1254 State.regs[dstreg] = load_word (State.regs[srcreg]);
1257 // 1111 1001 0001 1010 Rm Rn; mov Rm,(Rn)
1258 8.0xf9+8.0x1a+4.RM2,4.RN0:D1i:::mov
1266 if (RM2 > 7 && RM2 < 12)
1267 srcreg = REG_A0 + RM2 - 8;
1268 else if (RM2 > 11 && RM2 < 16)
1269 srcreg = REG_D0 + RM2 - 12;
1271 srcreg = REG_E0 + RM2;
1273 if (RN0 > 7 && RN0 < 12)
1274 dstreg = REG_A0 + RN0 - 8;
1275 else if (RN0 > 11 && RN0 < 16)
1276 dstreg = REG_D0 + RN0 - 12;
1278 dstreg = REG_E0 + RN0;
1280 store_word (State.regs[dstreg], State.regs[srcreg]);
1283 // 1111 1001 0010 1010 Rm Rn; movbu (Rm),Rn
1284 8.0xf9+8.0x2a+4.RN2,4.RM0:D1g:::movbu
1292 if (RM0 > 7 && RM0 < 12)
1293 srcreg = REG_A0 + RM0 - 8;
1294 else if (RM0 > 11 && RM0 < 16)
1295 srcreg = REG_D0 + RM0 - 12;
1297 srcreg = REG_E0 + RM0;
1299 if (RN2 > 7 && RN2 < 12)
1300 dstreg = REG_A0 + RN2 - 8;
1301 else if (RN2 > 11 && RN2 < 16)
1302 dstreg = REG_D0 + RN2 - 12;
1304 dstreg = REG_E0 + RN2;
1306 State.regs[dstreg] = load_byte (State.regs[srcreg]);
1309 // 1111 1001 0011 1010 Rm Rn; movbu Rm,(Rn)
1310 8.0xf9+8.0x3a+4.RM2,4.RN0:D1i:::movbu
1318 if (RM2 > 7 && RM2 < 12)
1319 srcreg = REG_A0 + RM2 - 8;
1320 else if (RM2 > 11 && RM2 < 16)
1321 srcreg = REG_D0 + RM2 - 12;
1323 srcreg = REG_E0 + RM2;
1325 if (RN0 > 7 && RN0 < 12)
1326 dstreg = REG_A0 + RN0 - 8;
1327 else if (RN0 > 11 && RN0 < 16)
1328 dstreg = REG_D0 + RN0 - 12;
1330 dstreg = REG_E0 + RN0;
1332 store_byte (State.regs[dstreg], State.regs[srcreg]);
1335 // 1111 1001 0100 1010 Rm Rn; movhu (Rm),Rn
1336 8.0xf9+8.0x4a+4.RN2,4.RM0:D1g:::movhu
1344 if (RM0 > 7 && RM0 < 12)
1345 srcreg = REG_A0 + RM0 - 8;
1346 else if (RM0 > 11 && RM0 < 16)
1347 srcreg = REG_D0 + RM0 - 12;
1349 srcreg = REG_E0 + RM0;
1351 if (RN2 > 7 && RN2 < 12)
1352 dstreg = REG_A0 + RN2 - 8;
1353 else if (RN2 > 11 && RN2 < 16)
1354 dstreg = REG_D0 + RN2 - 12;
1356 dstreg = REG_E0 + RN2;
1358 State.regs[dstreg] = load_half (State.regs[srcreg]);
1361 // 1111 1001 0101 1010 Rm Rn; movhu Rm,(Rn)
1362 8.0xf9+8.0x5a+4.RM2,4.RN0:D1i:::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 store_half (State.regs[dstreg], State.regs[srcreg]);
1387 // 1111 1001 0110 1010 Rm Rn; mov (Rm+),Rn
1388 8.0xf9+8.0x6a+4.RN2,4.RM0:D1y:::mov
1396 if (RM0 > 7 && RM0 < 12)
1397 srcreg = REG_A0 + RM0 - 8;
1398 else if (RM0 > 11 && RM0 < 16)
1399 srcreg = REG_D0 + RM0 - 12;
1401 srcreg = REG_E0 + RM0;
1403 if (RN2 > 7 && RN2 < 12)
1404 dstreg = REG_A0 + RN2 - 8;
1405 else if (RN2 > 11 && RN2 < 16)
1406 dstreg = REG_D0 + RN2 - 12;
1408 dstreg = REG_E0 + RN2;
1410 State.regs[dstreg] = load_word (State.regs[srcreg]);
1411 State.regs[srcreg] += 4;
1414 // 1111 1001 0111 1010 Rm Rn; mov Rm,(Rn+)
1415 8.0xf9+8.0x7a+4.RM2,4.RN0:D1z:::mov
1423 if (RM2 > 7 && RM2 < 12)
1424 srcreg = REG_A0 + RM2 - 8;
1425 else if (RM2 > 11 && RM2 < 16)
1426 srcreg = REG_D0 + RM2 - 12;
1428 srcreg = REG_E0 + RM2;
1430 if (RN0 > 7 && RN0 < 12)
1431 dstreg = REG_A0 + RN0 - 8;
1432 else if (RN0 > 11 && RN0 < 16)
1433 dstreg = REG_D0 + RN0 - 12;
1435 dstreg = REG_E0 + RN0;
1437 store_word (State.regs[dstreg], State.regs[srcreg]);
1438 State.regs[dstreg] += 4;
1441 // 1111 1001 1000 1010 Rn 0000; mov (sp),Rn
1442 8.0xf9+8.0x8a+4.RN2,4.0000:D1j:::mov
1450 if (RN2 > 7 && RN2 < 12)
1451 dstreg = REG_A0 + RN2 - 8;
1452 else if (RN2 > 11 && RN2 < 16)
1453 dstreg = REG_D0 + RN2 - 12;
1455 dstreg = REG_E0 + RN2;
1457 State.regs[dstreg] = load_word (State.regs[REG_SP]);
1460 // 1111 1001 1001 1010 Rm 0000; mov Rm, (sp)
1461 8.0xf9+8.0x9a+4.RM2,4.0000:D1k:::mov
1469 if (RM2 > 7 && RM2 < 12)
1470 dstreg = REG_A0 + RM2 - 8;
1471 else if (RM2 > 11 && RM2 < 16)
1472 dstreg = REG_D0 + RM2 - 12;
1474 dstreg = REG_E0 + RM2;
1476 store_word (State.regs[REG_SP], State.regs[dstreg]);
1479 // 1111 1001 1010 1010 Rn 0000; mobvu (sp),Rn
1480 8.0xf9+8.0xaa+4.RN2,4.0000:D1j:::movbu
1488 if (RN2 > 7 && RN2 < 12)
1489 dstreg = REG_A0 + RN2 - 8;
1490 else if (RN2 > 11 && RN2 < 16)
1491 dstreg = REG_D0 + RN2 - 12;
1493 dstreg = REG_E0 + RN2;
1495 State.regs[dstreg] = load_byte (State.regs[REG_SP]);
1498 // 1111 1001 1011 1010 Rm 0000; movbu Rm, (sp)
1499 8.0xf9+8.0xba+4.RM2,4.0000:D1k:::movbu
1507 if (RM2 > 7 && RM2 < 12)
1508 dstreg = REG_A0 + RM2 - 8;
1509 else if (RM2 > 11 && RM2 < 16)
1510 dstreg = REG_D0 + RM2 - 12;
1512 dstreg = REG_E0 + RM2;
1514 store_byte (State.regs[REG_SP], State.regs[dstreg]);
1517 // 1111 1001 1000 1100 Rn 0000; movhu (sp),Rn
1518 8.0xf9+8.0xca+4.RN2,4.0000:D1j:::movhu
1526 if (RN2 > 7 && RN2 < 12)
1527 dstreg = REG_A0 + RN2 - 8;
1528 else if (RN2 > 11 && RN2 < 16)
1529 dstreg = REG_D0 + RN2 - 12;
1531 dstreg = REG_E0 + RN2;
1533 State.regs[dstreg] = load_half (State.regs[REG_SP]);
1536 // 1111 1001 1001 1101 Rm 0000; movhu Rm, (sp)
1537 8.0xf9+8.0xda+4.RM2,4.0000:D1k:::movhu
1545 if (RM2 > 7 && RM2 < 12)
1546 dstreg = REG_A0 + RM2 - 8;
1547 else if (RM2 > 11 && RM2 < 16)
1548 dstreg = REG_D0 + RM2 - 12;
1550 dstreg = REG_E0 + RM2;
1552 store_half (State.regs[REG_SP], State.regs[dstreg]);
1555 // 1111 1001 1110 1010 Rm Rn; movhu (Rm+),Rn
1556 8.0xf9+8.0xea+4.RN2,4.RM0:D1y:::movhu
1564 if (RM0 > 7 && RM0 < 12)
1565 srcreg = REG_A0 + RM0 - 8;
1566 else if (RM0 > 11 && RM0 < 16)
1567 srcreg = REG_D0 + RM0 - 12;
1569 srcreg = REG_E0 + RM0;
1571 if (RN2 > 7 && RN2 < 12)
1572 dstreg = REG_A0 + RN2 - 8;
1573 else if (RN2 > 11 && RN2 < 16)
1574 dstreg = REG_D0 + RN2 - 12;
1576 dstreg = REG_E0 + RN2;
1578 State.regs[dstreg] = load_half (State.regs[srcreg]);
1579 State.regs[srcreg] += 2;
1582 // 1111 1001 1111 1010 Rm Rn; movhu Rm,(Rn+)
1583 8.0xf9+8.0xfa+4.RM2,4.RN0:D1z:::movhu
1591 if (RM2 > 7 && RM2 < 12)
1592 srcreg = REG_A0 + RM2 - 8;
1593 else if (RM2 > 11 && RM2 < 16)
1594 srcreg = REG_D0 + RM2 - 12;
1596 srcreg = REG_E0 + RM2;
1598 if (RN0 > 7 && RN0 < 12)
1599 dstreg = REG_A0 + RN0 - 8;
1600 else if (RN0 > 11 && RN0 < 16)
1601 dstreg = REG_D0 + RN0 - 12;
1603 dstreg = REG_E0 + RN0;
1605 store_half (State.regs[dstreg], State.regs[srcreg]);
1606 State.regs[dstreg] += 2;
1610 // 1111 1001 0000 1011 Rm Rn; mac Rm,Rn
1611 8.0xf9+8.0x0b+4.RM2,4.RN0:D1:::mac
1615 int srcreg1, srcreg2;
1616 long long temp, sum;
1621 if (RM2 > 7 && RM2 < 12)
1622 srcreg1 = REG_A0 + RM2 - 8;
1623 else if (RM2 > 11 && RM2 < 16)
1624 srcreg1 = REG_D0 + RM2 - 12;
1626 srcreg1 = REG_E0 + RM2;
1628 if (RN0 > 7 && RN0 < 12)
1629 srcreg2 = REG_A0 + RN0 - 8;
1630 else if (RN0 > 11 && RN0 < 16)
1631 srcreg2 = REG_D0 + RN0 - 12;
1633 srcreg2 = REG_E0 + RN0;
1635 temp = ((signed64)State.regs[srcreg2]
1636 * (signed64)State.regs[srcreg1]);
1637 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1638 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1639 State.regs[REG_MCRL] = sum;
1642 sum = State.regs[REG_MCRH] + temp + c;
1643 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1644 && (temp & 0x80000000) != (sum & 0x80000000));
1645 State.regs[REG_MCRH] = sum;
1647 State.regs[REG_MCVF] = 1;
1650 // 1111 1001 0001 1011 Rm Rn; macu Rm,Rn
1651 8.0xf9+8.0x1b+4.RM2,4.RN0:D1:::macu
1655 int srcreg1, srcreg2;
1656 unsigned long long temp, sum;
1661 if (RM2 > 7 && RM2 < 12)
1662 srcreg1 = REG_A0 + RM2 - 8;
1663 else if (RM2 > 11 && RM2 < 16)
1664 srcreg1 = REG_D0 + RM2 - 12;
1666 srcreg1 = REG_E0 + RM2;
1668 if (RN0 > 7 && RN0 < 12)
1669 srcreg2 = REG_A0 + RN0 - 8;
1670 else if (RN0 > 11 && RN0 < 16)
1671 srcreg2 = REG_D0 + RN0 - 12;
1673 srcreg2 = REG_E0 + RN0;
1675 temp = ((unsigned64)State.regs[srcreg2]
1676 * (unsigned64)State.regs[srcreg1]);
1677 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1678 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1679 State.regs[REG_MCRL] = sum;
1682 sum = State.regs[REG_MCRH] + temp + c;
1683 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1684 && (temp & 0x80000000) != (sum & 0x80000000));
1685 State.regs[REG_MCRH] = sum;
1687 State.regs[REG_MCVF] = 1;
1690 // 1111 1001 0010 1011 Rm Rn; macb Rm,Rn
1691 8.0xf9+8.0x2b+4.RM2,4.RN0:D1:::macb
1695 int srcreg1, srcreg2;
1701 if (RM2 > 7 && RM2 < 12)
1702 srcreg1 = REG_A0 + RM2 - 8;
1703 else if (RM2 > 11 && RM2 < 16)
1704 srcreg1 = REG_D0 + RM2 - 12;
1706 srcreg1 = REG_E0 + RM2;
1708 if (RN0 > 7 && RN0 < 12)
1709 srcreg2 = REG_A0 + RN0 - 8;
1710 else if (RN0 > 11 && RN0 < 16)
1711 srcreg2 = REG_D0 + RN0 - 12;
1713 srcreg2 = REG_E0 + RN0;
1715 temp = ((signed32)(State.regs[srcreg2] & 0xff)
1716 * (signed32)(State.regs[srcreg1] & 0xff));
1717 sum = State.regs[REG_MCRL] + temp;
1718 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1719 && (temp & 0x80000000) != (sum & 0x80000000));
1720 State.regs[REG_MCRL] = sum;
1722 State.regs[REG_MCVF] = 1;
1725 // 1111 1001 0011 1011 Rm Rn; macbu Rm,Rn
1726 8.0xf9+8.0x3b+4.RM2,4.RN0:D1:::macbu
1730 int srcreg1, srcreg2;
1731 long long temp, sum;
1736 if (RM2 > 7 && RM2 < 12)
1737 srcreg1 = REG_A0 + RM2 - 8;
1738 else if (RM2 > 11 && RM2 < 16)
1739 srcreg1 = REG_D0 + RM2 - 12;
1741 srcreg1 = REG_E0 + RM2;
1743 if (RN0 > 7 && RN0 < 12)
1744 srcreg2 = REG_A0 + RN0 - 8;
1745 else if (RN0 > 11 && RN0 < 16)
1746 srcreg2 = REG_D0 + RN0 - 12;
1748 srcreg2 = REG_E0 + RN0;
1750 temp = ((unsigned32)(State.regs[srcreg2] & 0xff)
1751 * (unsigned32)(State.regs[srcreg1] & 0xff));
1752 sum = State.regs[REG_MCRL] + temp;
1753 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1754 && (temp & 0x80000000) != (sum & 0x80000000));
1755 State.regs[REG_MCRL] = sum;
1757 State.regs[REG_MCVF] = 1;
1760 // 1111 1001 0100 1011 Rm Rn; mach Rm,Rn
1761 8.0xf9+8.0x4b+4.RM2,4.RN0:D1:::mach
1765 int srcreg1, srcreg2;
1766 long long temp, sum;
1771 if (RM2 > 7 && RM2 < 12)
1772 srcreg1 = REG_A0 + RM2 - 8;
1773 else if (RM2 > 11 && RM2 < 16)
1774 srcreg1 = REG_D0 + RM2 - 12;
1776 srcreg1 = REG_E0 + RM2;
1778 if (RN0 > 7 && RN0 < 12)
1779 srcreg2 = REG_A0 + RN0 - 8;
1780 else if (RN0 > 11 && RN0 < 16)
1781 srcreg2 = REG_D0 + RN0 - 12;
1783 srcreg2 = REG_E0 + RN0;
1785 temp = ((unsigned64)(State.regs[srcreg2] & 0xffff)
1786 * (unsigned64)(State.regs[srcreg1] & 0xffff));
1787 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1788 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1789 State.regs[REG_MCRL] = sum;
1792 sum = State.regs[REG_MCRH] + temp + c;
1793 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1794 && (temp & 0x80000000) != (sum & 0x80000000));
1795 State.regs[REG_MCRH] = sum;
1797 State.regs[REG_MCVF] = 1;
1800 // 1111 1001 0101 1011 Rm Rn; machu Rm,Rn
1801 8.0xf9+8.0x5b+4.RM2,4.RN0:D1:::machu
1805 int srcreg1, srcreg2;
1806 long long temp, sum;
1811 if (RM2 > 7 && RM2 < 12)
1812 srcreg1 = REG_A0 + RM2 - 8;
1813 else if (RM2 > 11 && RM2 < 16)
1814 srcreg1 = REG_D0 + RM2 - 12;
1816 srcreg1 = REG_E0 + RM2;
1818 if (RN0 > 7 && RN0 < 12)
1819 srcreg2 = REG_A0 + RN0 - 8;
1820 else if (RN0 > 11 && RN0 < 16)
1821 srcreg2 = REG_D0 + RN0 - 12;
1823 srcreg2 = REG_E0 + RN0;
1825 temp = ((unsigned64)(State.regs[srcreg2] & 0xffff)
1826 * (unsigned64)(State.regs[srcreg1] & 0xffff));
1827 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1828 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1829 State.regs[REG_MCRL] = sum;
1832 sum = State.regs[REG_MCRH] + temp + c;
1833 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1834 && (temp & 0x80000000) != (sum & 0x80000000));
1835 State.regs[REG_MCRH] = sum;
1837 State.regs[REG_MCVF] = 1;
1840 // 1111 1001 0110 1011 Rm Rn; dmach Rm,Rn
1841 8.0xf9+8.0x6b+4.RM2,4.RN0:D1:::dmach
1845 int srcreg1, srcreg2;
1846 long temp, temp2, sum;
1851 if (RM2 > 7 && RM2 < 12)
1852 srcreg1 = REG_A0 + RM2 - 8;
1853 else if (RM2 > 11 && RM2 < 16)
1854 srcreg1 = REG_D0 + RM2 - 12;
1856 srcreg1 = REG_E0 + RM2;
1858 if (RN0 > 7 && RN0 < 12)
1859 srcreg2 = REG_A0 + RN0 - 8;
1860 else if (RN0 > 11 && RN0 < 16)
1861 srcreg2 = REG_D0 + RN0 - 12;
1863 srcreg2 = REG_E0 + RN0;
1865 temp = ((signed32)(State.regs[srcreg2] & 0xffff)
1866 * (signed32)(State.regs[srcreg1] & 0xffff));
1867 temp2 = ((signed32)((State.regs[srcreg1] >> 16) & 0xffff)
1868 * (signed32)((State.regs[srcreg2] >> 16) & 0xffff));
1869 sum = temp + temp2 + State.regs[REG_MCRL];
1870 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1871 && (temp & 0x80000000) != (sum & 0x80000000));
1872 State.regs[REG_MCRL] = sum;
1874 State.regs[REG_MCVF] = 1;
1877 // 1111 1001 0111 1011 Rm Rn; dmachu Rm,Rn
1878 8.0xf9+8.0x7b+4.RM2,4.RN0:D1:::dmachu
1882 int srcreg1, srcreg2;
1883 unsigned long temp, temp2, sum;
1888 if (RM2 > 7 && RM2 < 12)
1889 srcreg1 = REG_A0 + RM2 - 8;
1890 else if (RM2 > 11 && RM2 < 16)
1891 srcreg1 = REG_D0 + RM2 - 12;
1893 srcreg1 = REG_E0 + RM2;
1895 if (RN0 > 7 && RN0 < 12)
1896 srcreg2 = REG_A0 + RN0 - 8;
1897 else if (RN0 > 11 && RN0 < 16)
1898 srcreg2 = REG_D0 + RN0 - 12;
1900 srcreg2 = REG_E0 + RN0;
1902 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
1903 * (unsigned32)(State.regs[srcreg1] & 0xffff));
1904 temp2 = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
1905 * (unsigned32)((State.regs[srcreg2] >> 16) & 0xffff));
1906 sum = temp + temp2 + State.regs[REG_MCRL];
1907 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1908 && (temp & 0x80000000) != (sum & 0x80000000));
1909 State.regs[REG_MCRL] = sum;
1911 State.regs[REG_MCVF] = 1;
1914 // 1111 1001 1000 1011 Rm Rn; dmulh Rm,Rn
1915 8.0xf9+8.0x8b+4.RM2,4.RN0:D1:::dmulh
1924 if (RM2 > 7 && RM2 < 12)
1925 srcreg = REG_A0 + RM2 - 8;
1926 else if (RM2 > 11 && RM2 < 16)
1927 srcreg = REG_D0 + RM2 - 12;
1929 srcreg = REG_E0 + RM2;
1931 if (RN0 > 7 && RN0 < 12)
1932 dstreg = REG_A0 + RN0 - 8;
1933 else if (RN0 > 11 && RN0 < 16)
1934 dstreg = REG_D0 + RN0 - 12;
1936 dstreg = REG_E0 + RN0;
1938 temp = ((signed32)(State.regs[dstreg] & 0xffff)
1939 * (signed32)(State.regs[srcreg] & 0xffff));
1940 State.regs[REG_MDRQ] = temp;
1941 temp = ((signed32)((State.regs[dstreg] >> 16) & 0xffff)
1942 * (signed32)((State.regs[srcreg] >>16) & 0xffff));
1943 State.regs[dstreg] = temp;
1946 // 1111 1001 1001 1011 Rm Rn; dmulhu Rm,Rn
1947 8.0xf9+8.0x9b+4.RM2,4.RN0:D1:::dumachu
1956 if (RM2 > 7 && RM2 < 12)
1957 srcreg = REG_A0 + RM2 - 8;
1958 else if (RM2 > 11 && RM2 < 16)
1959 srcreg = REG_D0 + RM2 - 12;
1961 srcreg = REG_E0 + RM2;
1963 if (RN0 > 7 && RN0 < 12)
1964 dstreg = REG_A0 + RN0 - 8;
1965 else if (RN0 > 11 && RN0 < 16)
1966 dstreg = REG_D0 + RN0 - 12;
1968 dstreg = REG_E0 + RN0;
1970 temp = ((unsigned32)(State.regs[dstreg] & 0xffff)
1971 * (unsigned32)(State.regs[srcreg] & 0xffff));
1972 State.regs[REG_MDRQ] = temp;
1973 temp = ((unsigned32)((State.regs[dstreg] >> 16) & 0xffff)
1974 * (unsigned32)((State.regs[srcreg] >>16) & 0xffff));
1975 State.regs[dstreg] = temp;
1978 // 1111 1001 1010 1011 Rm Rn; sat16 Rm,Rn
1979 8.0xf9+8.0xab+4.RM2,4.RN0:D1:::sat16
1988 if (RM2 > 7 && RM2 < 12)
1989 srcreg = REG_A0 + RM2 - 8;
1990 else if (RM2 > 11 && RM2 < 16)
1991 srcreg = REG_D0 + RM2 - 12;
1993 srcreg = REG_E0 + RM2;
1995 if (RN0 > 7 && RN0 < 12)
1996 dstreg = REG_A0 + RN0 - 8;
1997 else if (RN0 > 11 && RN0 < 16)
1998 dstreg = REG_D0 + RN0 - 12;
2000 dstreg = REG_E0 + RN0;
2002 value = State.regs[srcreg];
2004 if (value >= 0x7fff)
2005 State.regs[dstreg] = 0x7fff;
2006 else if (value <= 0xffff8000)
2007 State.regs[dstreg] = 0xffff8000;
2009 State.regs[dstreg] = value;
2014 // 1111 1001 1100 1011 Rm Rn; swap Rm,Rn
2015 8.0xf9+8.0xcb+4.RM2,4.RN0:D1:::swap
2021 if (RM2 > 7 && RM2 < 12)
2022 srcreg = REG_A0 + RM2 - 8;
2023 else if (RM2 > 11 && RM2 < 16)
2024 srcreg = REG_D0 + RM2 - 12;
2026 srcreg = REG_E0 + RM2;
2028 if (RN0 > 7 && RN0 < 12)
2029 dstreg = REG_A0 + RN0 - 8;
2030 else if (RN0 > 11 && RN0 < 16)
2031 dstreg = REG_D0 + RN0 - 12;
2033 dstreg = REG_E0 + RN0;
2035 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 24)
2036 | (((State.regs[srcreg] >> 8) & 0xff) << 16)
2037 | (((State.regs[srcreg] >> 16) & 0xff) << 8)
2038 | ((State.regs[srcreg] >> 24) & 0xff));
2041 // 1111 1101 1101 1011 Rm Rn; swaph Rm,Rn
2042 8.0xf9+8.0xdb+4.RM2,4.RN0:D1:::swaph
2048 if (RM2 > 7 && RM2 < 12)
2049 srcreg = REG_A0 + RM2 - 8;
2050 else if (RM2 > 11 && RM2 < 16)
2051 srcreg = REG_D0 + RM2 - 12;
2053 srcreg = REG_E0 + RM2;
2055 if (RN0 > 7 && RN0 < 12)
2056 dstreg = REG_A0 + RN0 - 8;
2057 else if (RN0 > 11 && RN0 < 16)
2058 dstreg = REG_D0 + RN0 - 12;
2060 dstreg = REG_E0 + RN0;
2062 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 8)
2063 | ((State.regs[srcreg] >> 8) & 0xff)
2064 | (((State.regs[srcreg] >> 16) & 0xff) << 24)
2065 | (((State.regs[srcreg] >> 24) & 0xff) << 16));
2068 // 1111 1001 1110 1011 Rm Rn; swhw Rm,Rn
2069 8.0xf9+8.0xeb+4.RM2,4.RN0:D1:::swhw
2075 if (RM2 > 7 && RM2 < 12)
2076 srcreg = REG_A0 + RM2 - 8;
2077 else if (RM2 > 11 && RM2 < 16)
2078 srcreg = REG_D0 + RM2 - 12;
2080 srcreg = REG_E0 + RM2;
2082 if (RN0 > 7 && RN0 < 12)
2083 dstreg = REG_A0 + RN0 - 8;
2084 else if (RN0 > 11 && RN0 < 16)
2085 dstreg = REG_D0 + RN0 - 12;
2087 dstreg = REG_E0 + RN0;
2089 State.regs[dstreg] = (((State.regs[srcreg] & 0xffff) << 16)
2090 | ((State.regs[srcreg] >> 16) & 0xffff));
2093 // 1111 1001 1111 1011 Rm Rn; bsch Rm,Rn
2094 8.0xf9+8.0xfb+4.RM2,4.RN0:D1:::bsch
2104 if (RM2 > 7 && RM2 < 12)
2105 srcreg = REG_A0 + RM2 - 8;
2106 else if (RM2 > 11 && RM2 < 16)
2107 srcreg = REG_D0 + RM2 - 12;
2109 srcreg = REG_E0 + RM2;
2111 if (RN0 > 7 && RN0 < 12)
2112 dstreg = REG_A0 + RN0 - 8;
2113 else if (RN0 > 11 && RN0 < 16)
2114 dstreg = REG_D0 + RN0 - 12;
2116 dstreg = REG_E0 + RN0;
2118 temp = State.regs[srcreg];
2119 start = (State.regs[dstreg] & 0x1f) - 1;
2123 for (i = start; i >= 0; i--)
2125 if (temp & (1 << i))
2128 State.regs[dstreg] = i;
2136 State.regs[dstreg] = 0;
2139 PSW |= (c ? PSW_C : 0);
2143 // 1111 1011 0000 1000 Rn Rn IMM8; mov IMM8,Rn
2144 8.0xfb+8.0x08+4.RM2,4.RN0=RM2+8.IMM8:D2j:::mov
2152 if (RN0 > 7 && RN0 < 12)
2153 dstreg = REG_A0 + RN0 - 8;
2154 else if (RN0 > 11 && RN0 < 16)
2155 dstreg = REG_D0 + RN0 - 12;
2157 dstreg = REG_E0 + RN0;
2159 State.regs[dstreg] = EXTEND8 (IMM8);
2162 // 1111 1011 0001 1000 Rn Rn IMM8; movu IMM8,Rn
2163 8.0xfb+8.0x18+4.RM2,4.RN0=RM2+8.IMM8:D2:::movu
2171 if (RN0 > 7 && RN0 < 12)
2172 dstreg = REG_A0 + RN0 - 8;
2173 else if (RN0 > 11 && RN0 < 16)
2174 dstreg = REG_D0 + RN0 - 12;
2176 dstreg = REG_E0 + RN0;
2178 State.regs[dstreg] = IMM8 & 0xff;
2181 // 1111 1011 0111 1000 Rn Rn IMM8; add IMM8,Rn
2182 8.0xfb+8.0x78+4.RM2,4.RN0=RM2+8.IMM8:D2d:::add
2190 if (RN0 > 7 && RN0 < 12)
2191 dstreg = REG_A0 + RN0 - 8;
2192 else if (RN0 > 11 && RN0 < 16)
2193 dstreg = REG_D0 + RN0 - 12;
2195 dstreg = REG_E0 + RN0;
2197 genericAdd (EXTEND8 (IMM8), dstreg);
2200 // 1111 1011 1000 1000 Rn Rn IMM8; addc IMM8,Rn
2201 8.0xfb+8.0x88+4.RM2,4.RN0=RM2+8.IMM8:D2d:::addc
2207 unsigned long reg1, reg2, sum;
2211 if (RN0 > 7 && RN0 < 12)
2212 dstreg = REG_A0 + RN0 - 8;
2213 else if (RN0 > 11 && RN0 < 16)
2214 dstreg = REG_D0 + RN0 - 12;
2216 dstreg = REG_E0 + RN0;
2218 imm = EXTEND8 (IMM8);
2219 reg2 = State.regs[dstreg];
2220 sum = imm + reg2 + ((PSW & PSW_C) != 0);
2221 State.regs[dstreg] = sum;
2224 n = (sum & 0x80000000);
2225 c = (sum < imm) || (sum < reg2);
2226 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
2227 && (reg2 & 0x80000000) != (sum & 0x80000000));
2229 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2230 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2231 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2234 // 1111 1011 1001 1000 Rn Rn IMM8; sub IMM8,Rn
2235 8.0xfb+8.0x98+4.RM2,4.RN0=RM2+8.IMM8:D2d:::sub
2243 if (RN0 > 7 && RN0 < 12)
2244 dstreg = REG_A0 + RN0 - 8;
2245 else if (RN0 > 11 && RN0 < 16)
2246 dstreg = REG_D0 + RN0 - 12;
2248 dstreg = REG_E0 + RN0;
2250 genericSub (EXTEND8 (IMM8), dstreg);
2253 // 1111 1011 1010 1000 Rn Rn IMM8; subc IMM8,Rn
2254 8.0xfb+8.0xa8+4.RM2,4.RN0=RM2+8.IMM8:D2d:::subc
2260 unsigned long reg1, reg2, difference;
2264 if (RN0 > 7 && RN0 < 12)
2265 dstreg = REG_A0 + RN0 - 8;
2266 else if (RN0 > 11 && RN0 < 16)
2267 dstreg = REG_D0 + RN0 - 12;
2269 dstreg = REG_E0 + RN0;
2271 imm = EXTEND8 (IMM8);
2272 reg2 = State.regs[dstreg];
2273 difference = reg2 - imm - ((PSW & PSW_C) != 0);
2274 State.regs[dstreg] = difference;
2276 z = (difference == 0);
2277 n = (difference & 0x80000000);
2279 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
2280 && (reg2 & 0x80000000) != (difference & 0x80000000));
2282 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2283 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2284 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2287 // 1111 1011 1101 1000 Rn Rn IMM8; cmp IMM8,Rn
2288 8.0xfb+8.0xd8+4.RM2,4.RN0=RM2+8.IMM8:D2b:::cmp
2296 if (RN0 > 7 && RN0 < 12)
2297 srcreg = REG_A0 + RN0 - 8;
2298 else if (RN0 > 11 && RN0 < 16)
2299 srcreg = REG_D0 + RN0 - 12;
2301 srcreg = REG_E0 + RN0;
2303 genericCmp (EXTEND8 (IMM8), State.regs[srcreg]);
2306 // 1111 1011 1111 1000 XRn XRn IMM8; mov IMM8,XRn
2307 8.0xfb+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM8:D2k:::mov
2316 State.regs[REG_SP] = EXTEND8 (IMM8);
2321 // 1111 1011 0000 1001 Rn Rn IMM8; and IMM8,Rn
2322 8.0xfb+8.0x09+4.RM2,4.RN0=RM2+8.IMM8:D2d:::and
2331 if (RN0 > 7 && RN0 < 12)
2332 dstreg = REG_A0 + RN0 - 8;
2333 else if (RN0 > 11 && RN0 < 16)
2334 dstreg = REG_D0 + RN0 - 12;
2336 dstreg = REG_E0 + RN0;
2338 State.regs[dstreg] &= (IMM8 & 0xff);
2339 z = (State.regs[dstreg] == 0);
2340 n = (State.regs[dstreg] & 0x80000000) != 0;
2341 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2342 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2345 // 1111 1011 0001 1001 Rn Rn IMM8; or IMM8,Rn
2346 8.0xfb+8.0x19+4.RM2,4.RN0=RM2+8.IMM8:D2d:::or
2355 if (RN0 > 7 && RN0 < 12)
2356 dstreg = REG_A0 + RN0 - 8;
2357 else if (RN0 > 11 && RN0 < 16)
2358 dstreg = REG_D0 + RN0 - 12;
2360 dstreg = REG_E0 + RN0;
2362 State.regs[dstreg] |= (IMM8 & 0xff);
2363 z = (State.regs[dstreg] == 0);
2364 n = (State.regs[dstreg] & 0x80000000) != 0;
2365 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2366 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2369 // 1111 1011 0010 1001 Rn Rn IMM8; xor IMM8,Rn
2370 8.0xfb+8.0x29+4.RM2,4.RN0=RM2+8.IMM8:D2d:::xor
2379 if (RN0 > 7 && RN0 < 12)
2380 dstreg = REG_A0 + RN0 - 8;
2381 else if (RN0 > 11 && RN0 < 16)
2382 dstreg = REG_D0 + RN0 - 12;
2384 dstreg = REG_E0 + RN0;
2386 State.regs[dstreg] ^= (IMM8 & 0xff);
2387 z = (State.regs[dstreg] == 0);
2388 n = (State.regs[dstreg] & 0x80000000) != 0;
2389 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2390 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2393 // 1111 1011 0100 1001 Rn Rn IMM8; asr IMM8,Rn
2394 8.0xfb+8.0x49+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asr
2404 if (RN0 > 7 && RN0 < 12)
2405 dstreg = REG_A0 + RN0 - 8;
2406 else if (RN0 > 11 && RN0 < 16)
2407 dstreg = REG_D0 + RN0 - 12;
2409 dstreg = REG_E0 + RN0;
2411 temp = State.regs[dstreg];
2413 temp >>= (IMM8 & 0xff);
2414 State.regs[dstreg] = temp;
2415 z = (State.regs[dstreg] == 0);
2416 n = (State.regs[dstreg] & 0x80000000) != 0;
2417 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2418 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2421 // 1111 1011 0101 1001 Rn Rn IMM8; lsr IMM8,Rn
2422 8.0xfb+8.0x59+4.RM2,4.RN0=RM2+8.IMM8:D2a:::lsr
2431 if (RN0 > 7 && RN0 < 12)
2432 dstreg = REG_A0 + RN0 - 8;
2433 else if (RN0 > 11 && RN0 < 16)
2434 dstreg = REG_D0 + RN0 - 12;
2436 dstreg = REG_E0 + RN0;
2438 c = State.regs[dstreg] & 1;
2439 State.regs[dstreg] >>= (IMM8 & 0xff);
2440 z = (State.regs[dstreg] == 0);
2441 n = (State.regs[dstreg] & 0x80000000) != 0;
2442 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2443 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
2446 // 1111 1011 0110 1001 Rn Rn IMM8; asl IMM8,Rn
2447 8.0xfb+8.0x69+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asl
2456 if (RN0 > 7 && RN0 < 12)
2457 dstreg = REG_A0 + RN0 - 8;
2458 else if (RN0 > 11 && RN0 < 16)
2459 dstreg = REG_D0 + RN0 - 12;
2461 dstreg = REG_E0 + RN0;
2463 State.regs[dstreg] <<= (IMM8 & 0xff);
2464 z = (State.regs[dstreg] == 0);
2465 n = (State.regs[dstreg] & 0x80000000) != 0;
2466 PSW &= ~(PSW_Z | PSW_N);
2467 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2470 // 1111 1011 1010 1001 Rn Rn IMM8; mul IMM8,Rn
2471 8.0xfb+8.0xa9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mul
2476 unsigned long long temp;
2481 if (RN0 > 7 && RN0 < 12)
2482 dstreg = REG_A0 + RN0 - 8;
2483 else if (RN0 > 11 && RN0 < 16)
2484 dstreg = REG_D0 + RN0 - 12;
2486 dstreg = REG_E0 + RN0;
2488 temp = ((signed64)(signed32)State.regs[dstreg]
2489 * (signed64)(signed32)EXTEND8 (IMM8));
2490 State.regs[dstreg] = temp & 0xffffffff;
2491 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
2492 z = (State.regs[dstreg] == 0);
2493 n = (State.regs[dstreg] & 0x80000000) != 0;
2494 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2495 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2498 // 1111 1011 1011 1001 Rn Rn IMM8; mulu IMM8,Rn
2499 8.0xfb+8.0xb9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mulu
2504 unsigned long long temp;
2509 if (RN0 > 7 && RN0 < 12)
2510 dstreg = REG_A0 + RN0 - 8;
2511 else if (RN0 > 11 && RN0 < 16)
2512 dstreg = REG_D0 + RN0 - 12;
2514 dstreg = REG_E0 + RN0;
2516 temp = ((unsigned64)State.regs[dstreg]
2517 * (unsigned64)(IMM8 & 0xff));
2518 State.regs[dstreg] = temp & 0xffffffff;
2519 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
2520 z = (State.regs[dstreg] == 0);
2521 n = (State.regs[dstreg] & 0x80000000) != 0;
2522 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2523 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
2526 // 1111 1011 1110 1001 Rn Rn IMM8; btst imm8,Rn
2527 8.0xfb+8.0xe9+4.RN2,4.RM0=RN2+8.IMM8:D2l:::btst
2535 if (RM0 > 7 && RM0 < 12)
2536 srcreg = REG_A0 + RM0 - 8;
2537 else if (RM0 > 11 && RM0 < 16)
2538 srcreg = REG_D0 + RM0 - 12;
2540 srcreg = REG_E0 + RM0;
2542 genericBtst(IMM8, State.regs[srcreg]);
2547 // 1111 1011 0000 1010 Rn Rm IMM8; mov (d8,Rm),Rn
2548 8.0xfb+8.0x0a+4.RN2,4.RM0+8.IMM8:D2l:::mov
2556 if (RM0 > 7 && RM0 < 12)
2557 srcreg = REG_A0 + RM0 - 8;
2558 else if (RM0 > 11 && RM0 < 16)
2559 srcreg = REG_D0 + RM0 - 12;
2561 srcreg = REG_E0 + RM0;
2563 if (RN2 > 7 && RN2 < 12)
2564 dstreg = REG_A0 + RN2 - 8;
2565 else if (RN2 > 11 && RN2 < 16)
2566 dstreg = REG_D0 + RN2 - 12;
2568 dstreg = REG_E0 + RN2;
2570 State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
2573 // 1111 1011 0001 1010 Rn Rm IMM8; mov Rm,(d8,Rn)
2574 8.0xfb+8.0x1a+4.RM2,4.RN0+8.IMM8:D2m:::mov
2581 if (RM2 > 7 && RM2 < 12)
2582 srcreg = REG_A0 + RM2 - 8;
2583 else if (RM2 > 11 && RM2 < 16)
2584 srcreg = REG_D0 + RM2 - 12;
2586 srcreg = REG_E0 + RM2;
2588 if (RN0 > 7 && RN0 < 12)
2589 dstreg = REG_A0 + RN0 - 8;
2590 else if (RN0 > 11 && RN0 < 16)
2591 dstreg = REG_D0 + RN0 - 12;
2593 dstreg = REG_E0 + RN0;
2595 store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2598 // 1111 1011 0010 1010 Rn Rm IMM8; movbu (d8,Rm),Rn
2599 8.0xfb+8.0x2a+4.RN2,4.RM0+8.IMM8:D2l:::movbu
2606 if (RM0 > 7 && RM0 < 12)
2607 srcreg = REG_A0 + RM0 - 8;
2608 else if (RM0 > 11 && RM0 < 16)
2609 srcreg = REG_D0 + RM0 - 12;
2611 srcreg = REG_E0 + RM0;
2613 if (RN2 > 7 && RN2 < 12)
2614 dstreg = REG_A0 + RN2 - 8;
2615 else if (RN2 > 11 && RN2 < 16)
2616 dstreg = REG_D0 + RN2 - 12;
2618 dstreg = REG_E0 + RN2;
2620 State.regs[dstreg] = load_byte (State.regs[srcreg] + EXTEND8 (IMM8));
2623 // 1111 1011 0011 1010 Rn Rm IMM8; movbu Rm,(d8,Rn)
2624 8.0xfb+8.0x3a+4.RM2,4.RN0+8.IMM8:D2m:::movbu
2631 if (RM2 > 7 && RM2 < 12)
2632 srcreg = REG_A0 + RM2 - 8;
2633 else if (RM2 > 11 && RM2 < 16)
2634 srcreg = REG_D0 + RM2 - 12;
2636 srcreg = REG_E0 + RM2;
2638 if (RN0 > 7 && RN0 < 12)
2639 dstreg = REG_A0 + RN0 - 8;
2640 else if (RN0 > 11 && RN0 < 16)
2641 dstreg = REG_D0 + RN0 - 12;
2643 dstreg = REG_E0 + RN0;
2645 store_byte (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2648 // 1111 1011 0100 1010 Rn Rm IMM8; movhu (d8,Rm),Rn
2649 8.0xfb+8.0x4a+4.RN2,4.RM0+8.IMM8:D2l:::movhu
2656 if (RM0 > 7 && RM0 < 12)
2657 srcreg = REG_A0 + RM0 - 8;
2658 else if (RM0 > 11 && RM0 < 16)
2659 srcreg = REG_D0 + RM0 - 12;
2661 srcreg = REG_E0 + RM0;
2663 if (RN2 > 7 && RN2 < 12)
2664 dstreg = REG_A0 + RN2 - 8;
2665 else if (RN2 > 11 && RN2 < 16)
2666 dstreg = REG_D0 + RN2 - 12;
2668 dstreg = REG_E0 + RN2;
2670 State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
2673 // 1111 1011 0101 1010 Rn Rm IMM8; movhu Rm,(d8,Rn)
2674 8.0xfb+8.0x5a+4.RM2,4.RN0+8.IMM8:D2m:::movhu
2681 if (RM2 > 7 && RM2 < 12)
2682 srcreg = REG_A0 + RM2 - 8;
2683 else if (RM2 > 11 && RM2 < 16)
2684 srcreg = REG_D0 + RM2 - 12;
2686 srcreg = REG_E0 + RM2;
2688 if (RN0 > 7 && RN0 < 12)
2689 dstreg = REG_A0 + RN0 - 8;
2690 else if (RN0 > 11 && RN0 < 16)
2691 dstreg = REG_D0 + RN0 - 12;
2693 dstreg = REG_E0 + RN0;
2695 store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2698 // 1111 1011 0110 1010 Rn Rm IMM8; mov (d8,Rm+),Rn
2699 8.0xfb+8.0x6a+4.RN2,4.RM0+8.IMM8:D2y:::mov
2707 if (RM0 > 7 && RM0 < 12)
2708 srcreg = REG_A0 + RM0 - 8;
2709 else if (RM0 > 11 && RM0 < 16)
2710 srcreg = REG_D0 + RM0 - 12;
2712 srcreg = REG_E0 + RM0;
2714 if (RN2 > 7 && RN2 < 12)
2715 dstreg = REG_A0 + RN2 - 8;
2716 else if (RN2 > 11 && RN2 < 16)
2717 dstreg = REG_D0 + RN2 - 12;
2719 dstreg = REG_E0 + RN2;
2721 State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
2722 State.regs[srcreg] += 4;
2725 // 1111 1011 0111 1010 Rn Rm IMM8; mov Rm,(d8,Rn+)
2726 8.0xfb+8.0x7a+4.RM2,4.RN0+8.IMM8:D2z:::mov
2733 if (RM2 > 7 && RM2 < 12)
2734 srcreg = REG_A0 + RM2 - 8;
2735 else if (RM2 > 11 && RM2 < 16)
2736 srcreg = REG_D0 + RM2 - 12;
2738 srcreg = REG_E0 + RM2;
2740 if (RN0 > 7 && RN0 < 12)
2741 dstreg = REG_A0 + RN0 - 8;
2742 else if (RN0 > 11 && RN0 < 16)
2743 dstreg = REG_D0 + RN0 - 12;
2745 dstreg = REG_E0 + RN0;
2747 store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2748 State.regs[dstreg] += 4;
2752 // 1111 1011 1000 1010 Rn 0000 IMM8; mov (d8,sp),Rn
2753 8.0xfb+8.0x8a+4.RN2,4.0x0+8.IMM8:D2n:::mov
2760 if (RN2 > 7 && RN2 < 12)
2761 dstreg = REG_A0 + RN2 - 8;
2762 else if (RN2 > 11 && RN2 < 16)
2763 dstreg = REG_D0 + RN2 - 12;
2765 dstreg = REG_E0 + RN2;
2767 State.regs[dstreg] = load_word (State.regs[REG_SP] + EXTEND8 (IMM8));
2770 // 1111 1011 1001 1010 Rm 0000 IMM8; mov Rm,(d8,Rn)
2771 8.0xfb+8.0x9a+4.RM2,4.0x0+8.IMM8:D2o:::mov
2778 if (RM2 > 7 && RM2 < 12)
2779 srcreg = REG_A0 + RM2 - 8;
2780 else if (RM2 > 11 && RM2 < 16)
2781 srcreg = REG_D0 + RM2 - 12;
2783 srcreg = REG_E0 + RM2;
2785 store_word (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2788 // 1111 1011 1010 1010 Rn Rm IMM8; movbu (d8,sp),Rn
2789 8.0xfb+8.0xaa+4.RN2,4.0x0+8.IMM8:D2n:::movbu
2796 if (RN2 > 7 && RN2 < 12)
2797 dstreg = REG_A0 + RN2 - 8;
2798 else if (RN2 > 11 && RN2 < 16)
2799 dstreg = REG_D0 + RN2 - 12;
2801 dstreg = REG_E0 + RN2;
2803 State.regs[dstreg] = load_byte (State.regs[REG_SP] + EXTEND8 (IMM8));
2806 // 1111 1011 1011 1010 Rn Rm IMM8; movbu Rm,(sp,Rn)
2807 8.0xfb+8.0xba+4.RM2,4.0x0+8.IMM8:D2o:::movbu
2814 if (RM2 > 7 && RM2 < 12)
2815 srcreg = REG_A0 + RM2 - 8;
2816 else if (RM2 > 11 && RM2 < 16)
2817 srcreg = REG_D0 + RM2 - 12;
2819 srcreg = REG_E0 + RM2;
2821 store_byte (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2824 // 1111 1011 1100 1010 Rn Rm IMM8; movhu (d8,sp),Rn
2825 8.0xfb+8.0xca+4.RN2,4.0x0+8.IMM8:D2n:::movhu
2832 if (RN2 > 7 && RN2 < 12)
2833 dstreg = REG_A0 + RN2 - 8;
2834 else if (RN2 > 11 && RN2 < 16)
2835 dstreg = REG_D0 + RN2 - 12;
2837 dstreg = REG_E0 + RN2;
2839 State.regs[dstreg] = load_half (State.regs[REG_SP] + EXTEND8 (IMM8));
2842 // 1111 1011 1101 1010 Rn Rm IMM8; movhu Rm,(d8,sp)
2843 8.0xfb+8.0xda+4.RM2,4.0x0+8.IMM8:D2o:::movhu
2850 if (RM2 > 7 && RM2 < 12)
2851 srcreg = REG_A0 + RM2 - 8;
2852 else if (RM2 > 11 && RM2 < 16)
2853 srcreg = REG_D0 + RM2 - 12;
2855 srcreg = REG_E0 + RM2;
2857 store_half (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2860 // 1111 1011 1110 1010 Rn Rm IMM8; movhu (d8,Rm+),Rn
2861 8.0xfb+8.0xea+4.RN2,4.RM0+8.IMM8:D2y:::movhu
2869 if (RM0 > 7 && RM0 < 12)
2870 srcreg = REG_A0 + RM0 - 8;
2871 else if (RM0 > 11 && RM0 < 16)
2872 srcreg = REG_D0 + RM0 - 12;
2874 srcreg = REG_E0 + RM0;
2876 if (RN2 > 7 && RN2 < 12)
2877 dstreg = REG_A0 + RN2 - 8;
2878 else if (RN2 > 11 && RN2 < 16)
2879 dstreg = REG_D0 + RN2 - 12;
2881 dstreg = REG_E0 + RN2;
2883 State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
2884 State.regs[srcreg] += 2;
2887 // 1111 1011 1111 1010 Rn Rm IMM8; movhu Rm,(d8,Rn+)
2888 8.0xfb+8.0xfa+4.RM2,4.RN0+8.IMM8:D2z:::movhu
2895 if (RM2 > 7 && RM2 < 12)
2896 srcreg = REG_A0 + RM2 - 8;
2897 else if (RM2 > 11 && RM2 < 16)
2898 srcreg = REG_D0 + RM2 - 12;
2900 srcreg = REG_E0 + RM2;
2902 if (RN0 > 7 && RN0 < 12)
2903 dstreg = REG_A0 + RN0 - 8;
2904 else if (RN0 > 11 && RN0 < 16)
2905 dstreg = REG_D0 + RN0 - 12;
2907 dstreg = REG_E0 + RN0;
2909 store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2910 State.regs[dstreg] += 2;
2914 // 1111 1011 0000 1011 Rn Rn IMM8; mac imm8,Rn
2915 8.0xfb+8.0x0b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mac
2918 int srcreg1, srcreg2;
2919 long long temp, sum;
2924 if (RN2 > 7 && RN2 < 12)
2925 srcreg1 = REG_A0 + RN2 - 8;
2926 else if (RN2 > 11 && RN2 < 16)
2927 srcreg1 = REG_D0 + RN2 - 12;
2929 srcreg1 = REG_E0 + RN2;
2931 temp = ((signed64)EXTEND8 (IMM8)
2932 * (signed64)State.regs[srcreg1]);
2933 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2934 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2935 State.regs[REG_MCRL] = sum;
2938 sum = State.regs[REG_MCRH] + temp + c;
2939 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2940 && (temp & 0x80000000) != (sum & 0x80000000));
2941 State.regs[REG_MCRH] = sum;
2943 State.regs[REG_MCVF] = 1;
2946 // 1111 1011 0001 1011 Rn Rn IMM8; macu imm8,Rn
2947 8.0xfb+8.0x1b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macu
2950 int srcreg1, srcreg2;
2951 long long temp, sum;
2956 if (RN2 > 7 && RN2 < 12)
2957 srcreg1 = REG_A0 + RN2 - 8;
2958 else if (RN2 > 11 && RN2 < 16)
2959 srcreg1 = REG_D0 + RN2 - 12;
2961 srcreg1 = REG_E0 + RN2;
2963 temp = ((unsigned64) (IMM8)
2964 * (unsigned64)State.regs[srcreg1]);
2965 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2966 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2967 State.regs[REG_MCRL] = sum;
2970 sum = State.regs[REG_MCRH] + temp + c;
2971 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2972 && (temp & 0x80000000) != (sum & 0x80000000));
2973 State.regs[REG_MCRH] = sum;
2975 State.regs[REG_MCVF] = 1;
2978 // 1111 1011 0010 1011 Rn Rn IMM8; macb imm8,Rn
2979 8.0xfb+8.0x2b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macb
2982 int srcreg1, srcreg2;
2983 long long temp, sum;
2988 if (RN2 > 7 && RN2 < 12)
2989 srcreg1 = REG_A0 + RN2 - 8;
2990 else if (RN2 > 11 && RN2 < 16)
2991 srcreg1 = REG_D0 + RN2 - 12;
2993 srcreg1 = REG_E0 + RN2;
2995 temp = ((signed64)EXTEND8 (IMM8)
2996 * (signed64)State.regs[srcreg1] & 0xff);
2997 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2998 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2999 State.regs[REG_MCRL] = sum;
3002 sum = State.regs[REG_MCRH] + temp + c;
3003 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3004 && (temp & 0x80000000) != (sum & 0x80000000));
3005 State.regs[REG_MCRH] = sum;
3007 State.regs[REG_MCVF] = 1;
3010 // 1111 1011 0011 1011 Rn Rn IMM8; macbu imm8,Rn
3011 8.0xfb+8.0x3b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macbu
3014 int srcreg1, srcreg2;
3015 long long temp, sum;
3020 if (RN2 > 7 && RN2 < 12)
3021 srcreg1 = REG_A0 + RN2 - 8;
3022 else if (RN2 > 11 && RN2 < 16)
3023 srcreg1 = REG_D0 + RN2 - 12;
3025 srcreg1 = REG_E0 + RN2;
3027 temp = ((unsigned64) (IMM8)
3028 * (unsigned64)State.regs[srcreg1] & 0xff);
3029 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3030 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3031 State.regs[REG_MCRL] = sum;
3034 sum = State.regs[REG_MCRH] + temp + c;
3035 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3036 && (temp & 0x80000000) != (sum & 0x80000000));
3037 State.regs[REG_MCRH] = sum;
3039 State.regs[REG_MCVF] = 1;
3042 // 1111 1011 0100 1011 Rn Rn IMM8; mach imm8,Rn
3043 8.0xfb+8.0x4b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mach
3046 int srcreg1, srcreg2;
3047 long long temp, sum;
3052 if (RN2 > 7 && RN2 < 12)
3053 srcreg1 = REG_A0 + RN2 - 8;
3054 else if (RN2 > 11 && RN2 < 16)
3055 srcreg1 = REG_D0 + RN2 - 12;
3057 srcreg1 = REG_E0 + RN2;
3059 temp = ((signed64)EXTEND8 (IMM8)
3060 * (signed64)State.regs[srcreg1] & 0xffff);
3061 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3062 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3063 State.regs[REG_MCRL] = sum;
3066 sum = State.regs[REG_MCRH] + temp + c;
3067 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3068 && (temp & 0x80000000) != (sum & 0x80000000));
3069 State.regs[REG_MCRH] = sum;
3071 State.regs[REG_MCVF] = 1;
3074 // 1111 1011 0101 1011 Rn Rn IMM8; machu imm8,Rn
3075 8.0xfb+8.0x5b+4.RN2,4.RN0=RN2+8.IMM8:D2:::machu
3078 int srcreg1, srcreg2;
3079 long long temp, sum;
3084 if (RN2 > 7 && RN2 < 12)
3085 srcreg1 = REG_A0 + RN2 - 8;
3086 else if (RN2 > 11 && RN2 < 16)
3087 srcreg1 = REG_D0 + RN2 - 12;
3089 srcreg1 = REG_E0 + RN2;
3091 temp = ((unsigned64) (IMM8)
3092 * (unsigned64)State.regs[srcreg1] & 0xffff);
3093 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3094 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3095 State.regs[REG_MCRL] = sum;
3098 sum = State.regs[REG_MCRH] + temp + c;
3099 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3100 && (temp & 0x80000000) != (sum & 0x80000000));
3101 State.regs[REG_MCRH] = sum;
3103 State.regs[REG_MCVF] = 1;
3108 // 1111 1011 0111 1100 Rm Rn Rd; add Rm,Rn,Rd
3109 8.0xfb+8.0x7c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::add
3114 unsigned long sum, source1, source2;
3115 int srcreg1, srcreg2, dstreg;
3119 if (RM2 > 7 && RM2 < 12)
3120 srcreg1 = REG_A0 + RM2 - 8;
3121 else if (RM2 > 11 && RM2 < 16)
3122 srcreg1 = REG_D0 + RM2 - 12;
3124 srcreg1 = REG_E0 + RM2;
3126 if (RN0 > 7 && RN0 < 12)
3127 srcreg2 = REG_A0 + RN0 - 8;
3128 else if (RN0 > 11 && RN0 < 16)
3129 srcreg2 = REG_D0 + RN0 - 12;
3131 srcreg2 = REG_E0 + RN0;
3133 if (RD0 > 7 && RD0 < 12)
3134 dstreg = REG_A0 + RD0 - 8;
3135 else if (RD0 > 11 && RD0 < 16)
3136 dstreg = REG_D0 + RD0 - 12;
3138 dstreg = REG_E0 + RD0;
3140 source1 = State.regs[srcreg1];
3141 source2 = State.regs[srcreg2];
3142 sum = source1 + source2;
3143 State.regs[dstreg] = sum;
3146 n = (sum & 0x80000000);
3147 c = (sum < source1) || (sum < source2);
3148 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
3149 && (source1 & 0x80000000) != (sum & 0x80000000));
3151 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3152 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3153 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3156 // 1111 1011 1000 1100 Rm Rn Rd; addc Rm,Rn,Rd
3157 8.0xfb+8.0x8c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::addc
3162 unsigned long sum, source1, source2;
3163 int srcreg1, srcreg2, dstreg;
3167 if (RM2 > 7 && RM2 < 12)
3168 srcreg1 = REG_A0 + RM2 - 8;
3169 else if (RM2 > 11 && RM2 < 16)
3170 srcreg1 = REG_D0 + RM2 - 12;
3172 srcreg1 = REG_E0 + RM2;
3174 if (RN0 > 7 && RN0 < 12)
3175 srcreg2 = REG_A0 + RN0 - 8;
3176 else if (RN0 > 11 && RN0 < 16)
3177 srcreg2 = REG_D0 + RN0 - 12;
3179 srcreg2 = REG_E0 + RN0;
3181 if (RD0 > 7 && RD0 < 12)
3182 dstreg = REG_A0 + RD0 - 8;
3183 else if (RD0 > 11 && RD0 < 16)
3184 dstreg = REG_D0 + RD0 - 12;
3186 dstreg = REG_E0 + RD0;
3188 source1 = State.regs[srcreg1];
3189 source2 = State.regs[srcreg2];
3190 sum = source1 + source2 + ((PSW & PSW_C) != 0);
3191 State.regs[dstreg] = sum;
3194 n = (sum & 0x80000000);
3195 c = (sum < source1) || (sum < source2);
3196 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
3197 && (source1 & 0x80000000) != (sum & 0x80000000));
3199 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3200 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3201 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3204 // 1111 1011 1001 1100 Rm Rn Rd; sub Rm,Rn,Rd
3205 8.0xfb+8.0x9c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::sub
3210 unsigned long difference, source1, source2;
3211 int srcreg1, srcreg2, dstreg;
3215 if (RM2 > 7 && RM2 < 12)
3216 srcreg1 = REG_A0 + RM2 - 8;
3217 else if (RM2 > 11 && RM2 < 16)
3218 srcreg1 = REG_D0 + RM2 - 12;
3220 srcreg1 = REG_E0 + RM2;
3222 if (RN0 > 7 && RN0 < 12)
3223 srcreg2 = REG_A0 + RN0 - 8;
3224 else if (RN0 > 11 && RN0 < 16)
3225 srcreg2 = REG_D0 + RN0 - 12;
3227 srcreg2 = REG_E0 + RN0;
3229 if (RD0 > 7 && RD0 < 12)
3230 dstreg = REG_A0 + RD0 - 8;
3231 else if (RD0 > 11 && RD0 < 16)
3232 dstreg = REG_D0 + RD0 - 12;
3234 dstreg = REG_E0 + RD0;
3236 source1 = State.regs[srcreg1];
3237 source2 = State.regs[srcreg2];
3238 difference = source2 - source1;
3239 State.regs[dstreg] = difference;
3241 z = (difference == 0);
3242 n = (difference & 0x80000000);
3243 c = (source1 > source1);
3244 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
3245 && (source1 & 0x80000000) != (difference & 0x80000000));
3247 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3248 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3249 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3252 // 1111 1011 1010 1100 Rm Rn Rd; subc Rm,Rn,Rd
3253 8.0xfb+8.0xac+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::subc
3258 unsigned long difference, source1, source2;
3259 int srcreg1, srcreg2, dstreg;
3263 if (RM2 > 7 && RM2 < 12)
3264 srcreg1 = REG_A0 + RM2 - 8;
3265 else if (RM2 > 11 && RM2 < 16)
3266 srcreg1 = REG_D0 + RM2 - 12;
3268 srcreg1 = REG_E0 + RM2;
3270 if (RN0 > 7 && RN0 < 12)
3271 srcreg2 = REG_A0 + RN0 - 8;
3272 else if (RN0 > 11 && RN0 < 16)
3273 srcreg2 = REG_D0 + RN0 - 12;
3275 srcreg2 = REG_E0 + RN0;
3277 if (RD0 > 7 && RD0 < 12)
3278 dstreg = REG_A0 + RD0 - 8;
3279 else if (RD0 > 11 && RD0 < 16)
3280 dstreg = REG_D0 + RD0 - 12;
3282 dstreg = REG_E0 + RD0;
3284 source1 = State.regs[srcreg1];
3285 source2 = State.regs[srcreg2];
3286 difference = source2 - source1 - ((PSW & PSW_C) != 0);
3287 State.regs[dstreg] = difference;
3289 z = (difference == 0);
3290 n = (difference & 0x80000000);
3291 c = (source1 > source2);
3292 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
3293 && (source1 & 0x80000000) != (difference & 0x80000000));
3295 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3296 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3297 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3300 // 1111 1011 0000 1101 Rm Rn Rd; and Rm,Rn,Rd
3301 8.0xfb+8.0x0d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::and
3306 int srcreg1, srcreg2, dstreg;
3310 if (RM2 > 7 && RM2 < 12)
3311 srcreg1 = REG_A0 + RM2 - 8;
3312 else if (RM2 > 11 && RM2 < 16)
3313 srcreg1 = REG_D0 + RM2 - 12;
3315 srcreg1 = REG_E0 + RM2;
3317 if (RN0 > 7 && RN0 < 12)
3318 srcreg2 = REG_A0 + RN0 - 8;
3319 else if (RN0 > 11 && RN0 < 16)
3320 srcreg2 = REG_D0 + RN0 - 12;
3322 srcreg2 = REG_E0 + RN0;
3324 if (RD0 > 7 && RD0 < 12)
3325 dstreg = REG_A0 + RD0 - 8;
3326 else if (RD0 > 11 && RD0 < 16)
3327 dstreg = REG_D0 + RD0 - 12;
3329 dstreg = REG_E0 + RD0;
3331 State.regs[dstreg] = State.regs[srcreg1] & State.regs[srcreg2];
3333 z = (State.regs[dstreg] == 0);
3334 n = (State.regs[dstreg] & 0x80000000);
3336 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3337 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
3340 // 1111 1011 0001 1101 Rm Rn Rd; or Rm,Rn,Rd
3341 8.0xfb+8.0x1d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::or
3346 int srcreg1, srcreg2, dstreg;
3350 if (RM2 > 7 && RM2 < 12)
3351 srcreg1 = REG_A0 + RM2 - 8;
3352 else if (RM2 > 11 && RM2 < 16)
3353 srcreg1 = REG_D0 + RM2 - 12;
3355 srcreg1 = REG_E0 + RM2;
3357 if (RN0 > 7 && RN0 < 12)
3358 srcreg2 = REG_A0 + RN0 - 8;
3359 else if (RN0 > 11 && RN0 < 16)
3360 srcreg2 = REG_D0 + RN0 - 12;
3362 srcreg2 = REG_E0 + RN0;
3364 if (RD0 > 7 && RD0 < 12)
3365 dstreg = REG_A0 + RD0 - 8;
3366 else if (RD0 > 11 && RD0 < 16)
3367 dstreg = REG_D0 + RD0 - 12;
3369 dstreg = REG_E0 + RD0;
3371 State.regs[dstreg] = State.regs[srcreg1] | State.regs[srcreg2];
3373 z = (State.regs[dstreg] == 0);
3374 n = (State.regs[dstreg] & 0x80000000);
3376 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3377 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
3380 // 1111 1011 0010 1101 Rm Rn Rd; xor Rm,Rn,Rd
3381 8.0xfb+8.0x2d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::xor
3386 int srcreg1, srcreg2, dstreg;
3390 if (RM2 > 7 && RM2 < 12)
3391 srcreg1 = REG_A0 + RM2 - 8;
3392 else if (RM2 > 11 && RM2 < 16)
3393 srcreg1 = REG_D0 + RM2 - 12;
3395 srcreg1 = REG_E0 + RM2;
3397 if (RN0 > 7 && RN0 < 12)
3398 srcreg2 = REG_A0 + RN0 - 8;
3399 else if (RN0 > 11 && RN0 < 16)
3400 srcreg2 = REG_D0 + RN0 - 12;
3402 srcreg2 = REG_E0 + RN0;
3404 if (RD0 > 7 && RD0 < 12)
3405 dstreg = REG_A0 + RD0 - 8;
3406 else if (RD0 > 11 && RD0 < 16)
3407 dstreg = REG_D0 + RD0 - 12;
3409 dstreg = REG_E0 + RD0;
3411 State.regs[dstreg] = State.regs[srcreg1] ^ State.regs[srcreg2];
3413 z = (State.regs[dstreg] == 0);
3414 n = (State.regs[dstreg] & 0x80000000);
3416 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3417 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
3420 // 1111 1011 0100 1101 Rm Rn Rd; asr Rm,Rn,Rd
3421 8.0xfb+8.0x4d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asr
3427 int srcreg1, srcreg2, dstreg;
3431 if (RM2 > 7 && RM2 < 12)
3432 srcreg1 = REG_A0 + RM2 - 8;
3433 else if (RM2 > 11 && RM2 < 16)
3434 srcreg1 = REG_D0 + RM2 - 12;
3436 srcreg1 = REG_E0 + RM2;
3438 if (RN0 > 7 && RN0 < 12)
3439 srcreg2 = REG_A0 + RN0 - 8;
3440 else if (RN0 > 11 && RN0 < 16)
3441 srcreg2 = REG_D0 + RN0 - 12;
3443 srcreg2 = REG_E0 + RN0;
3445 if (RD0 > 7 && RD0 < 12)
3446 dstreg = REG_A0 + RD0 - 8;
3447 else if (RD0 > 11 && RD0 < 16)
3448 dstreg = REG_D0 + RD0 - 12;
3450 dstreg = REG_E0 + RD0;
3452 temp = State.regs[srcreg2];
3454 temp >>= State.regs[srcreg1];
3455 State.regs[dstreg] = temp;
3457 z = (State.regs[dstreg] == 0);
3458 n = (State.regs[dstreg] & 0x80000000);
3460 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3461 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
3464 // 1111 1011 0101 1101 Rm Rn Rd; lsr Rm,Rn,Rd
3465 8.0xfb+8.0x5d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::lsr
3470 int srcreg1, srcreg2, dstreg;
3474 if (RM2 > 7 && RM2 < 12)
3475 srcreg1 = REG_A0 + RM2 - 8;
3476 else if (RM2 > 11 && RM2 < 16)
3477 srcreg1 = REG_D0 + RM2 - 12;
3479 srcreg1 = REG_E0 + RM2;
3481 if (RN0 > 7 && RN0 < 12)
3482 srcreg2 = REG_A0 + RN0 - 8;
3483 else if (RN0 > 11 && RN0 < 16)
3484 srcreg2 = REG_D0 + RN0 - 12;
3486 srcreg2 = REG_E0 + RN0;
3488 if (RD0 > 7 && RD0 < 12)
3489 dstreg = REG_A0 + RD0 - 8;
3490 else if (RD0 > 11 && RD0 < 16)
3491 dstreg = REG_D0 + RD0 - 12;
3493 dstreg = REG_E0 + RD0;
3495 c = State.regs[srcreg2] & 1;
3496 State.regs[dstreg] = State.regs[srcreg2] >> State.regs[srcreg1];
3498 z = (State.regs[dstreg] == 0);
3499 n = (State.regs[dstreg] & 0x80000000);
3501 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3502 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
3505 // 1111 1011 0110 1101 Rm Rn Rd; asl Rm,Rn,Rd
3506 8.0xfb+8.0x6d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asl
3511 int srcreg1, srcreg2, dstreg;
3515 if (RM2 > 7 && RM2 < 12)
3516 srcreg1 = REG_A0 + RM2 - 8;
3517 else if (RM2 > 11 && RM2 < 16)
3518 srcreg1 = REG_D0 + RM2 - 12;
3520 srcreg1 = REG_E0 + RM2;
3522 if (RN0 > 7 && RN0 < 12)
3523 srcreg2 = REG_A0 + RN0 - 8;
3524 else if (RN0 > 11 && RN0 < 16)
3525 srcreg2 = REG_D0 + RN0 - 12;
3527 srcreg2 = REG_E0 + RN0;
3529 if (RD0 > 7 && RD0 < 12)
3530 dstreg = REG_A0 + RD0 - 8;
3531 else if (RD0 > 11 && RD0 < 16)
3532 dstreg = REG_D0 + RD0 - 12;
3534 dstreg = REG_E0 + RD0;
3536 State.regs[dstreg] = State.regs[srcreg2] << State.regs[srcreg1];;
3538 z = (State.regs[dstreg] == 0);
3539 n = (State.regs[dstreg] & 0x80000000);
3541 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3542 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
3545 // 1111 1011 1010 1101 Rm Rn Rd1 Rd2; mul Rm,Rn,Rd1,Rd2
3546 8.0xfb+8.0xad+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mul
3550 int srcreg1, srcreg2, dstreg1, dstreg2;
3551 signed long long temp;
3555 if (RM2 > 7 && RM2 < 12)
3556 srcreg1 = REG_A0 + RM2 - 8;
3557 else if (RM2 > 11 && RM2 < 16)
3558 srcreg1 = REG_D0 + RM2 - 12;
3560 srcreg1 = REG_E0 + RM2;
3562 if (RN0 > 7 && RN0 < 12)
3563 srcreg2 = REG_A0 + RN0 - 8;
3564 else if (RN0 > 11 && RN0 < 16)
3565 srcreg2 = REG_D0 + RN0 - 12;
3567 srcreg2 = REG_E0 + RN0;
3569 if (RD0 > 7 && RD0 < 12)
3570 dstreg1 = REG_A0 + RD0 - 8;
3571 else if (RD0 > 11 && RD0 < 16)
3572 dstreg1 = REG_D0 + RD0 - 12;
3574 dstreg1 = REG_E0 + RD0;
3576 if (RD2 > 7 && RD2 < 12)
3577 dstreg2 = REG_A0 + RD2 - 8;
3578 else if (RD2 > 11 && RD2 < 16)
3579 dstreg2 = REG_D0 + RD2 - 12;
3581 dstreg2 = REG_E0 + RD2;
3583 temp = ((signed64)(signed32)State.regs[srcreg1]
3584 * (signed64)(signed32)State.regs[srcreg2]);
3585 State.regs[dstreg1] = temp & 0xffffffff;
3586 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
3589 // 1111 1011 1011 1101 Rm Rn Rd1 Rd2; mulu Rm,Rn,Rd1,Rd2
3590 8.0xfb+8.0xbd+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mulu
3594 int srcreg1, srcreg2, dstreg1, dstreg2;
3595 signed long long temp;
3599 if (RM2 > 7 && RM2 < 12)
3600 srcreg1 = REG_A0 + RM2 - 8;
3601 else if (RM2 > 11 && RM2 < 16)
3602 srcreg1 = REG_D0 + RM2 - 12;
3604 srcreg1 = REG_E0 + RM2;
3606 if (RN0 > 7 && RN0 < 12)
3607 srcreg2 = REG_A0 + RN0 - 8;
3608 else if (RN0 > 11 && RN0 < 16)
3609 srcreg2 = REG_D0 + RN0 - 12;
3611 srcreg2 = REG_E0 + RN0;
3613 if (RD0 > 7 && RD0 < 12)
3614 dstreg1 = REG_A0 + RD0 - 8;
3615 else if (RD0 > 11 && RD0 < 16)
3616 dstreg1 = REG_D0 + RD0 - 12;
3618 dstreg1 = REG_E0 + RD0;
3620 if (RD2 > 7 && RD2 < 12)
3621 dstreg2 = REG_A0 + RD2 - 8;
3622 else if (RD2 > 11 && RD2 < 16)
3623 dstreg2 = REG_D0 + RD2 - 12;
3625 dstreg2 = REG_E0 + RD2;
3627 temp = ((unsigned64)(unsigned32)State.regs[srcreg1]
3628 * (unsigned64)(unsigned32)State.regs[srcreg2]);
3629 State.regs[dstreg1] = temp & 0xffffffff;
3630 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
3633 // 1111 1011 0000 1110 Rn 0000 abs8 ; mov (abs8),Rn
3634 8.0xfb+8.0x0e+4.RN2,4.0x0+8.IMM8:D2p:::mov
3641 if (RN2 > 7 && RN2 < 12)
3642 dstreg = REG_A0 + RN2 - 8;
3643 else if (RN2 > 11 && RN2 < 16)
3644 dstreg = REG_D0 + RN2 - 12;
3646 dstreg = REG_E0 + RN2;
3648 State.regs[dstreg] = load_word (IMM8);
3651 // 1111 1011 0001 1110 Rm 0000 abs8 ; mov Rn,(abs8)
3652 8.0xfb+8.0x1e+4.RM2,4.0x0+8.IMM8:D2q:::mov
3658 if (RM2 > 7 && RM2 < 12)
3659 srcreg = REG_A0 + RM2 - 8;
3660 else if (RM2 > 11 && RM2 < 16)
3661 srcreg = REG_D0 + RM2 - 12;
3663 srcreg = REG_E0 + RM2;
3665 store_word (IMM8, State.regs[srcreg]);
3668 // 1111 1011 0010 1110 Rn 0000 abs8 ; movbu (abs8),Rn
3669 8.0xfb+8.0x2e+4.RN2,4.0x0+8.IMM8:D2p:::movbu
3676 if (RN2 > 7 && RN2 < 12)
3677 dstreg = REG_A0 + RN2 - 8;
3678 else if (RN2 > 11 && RN2 < 16)
3679 dstreg = REG_D0 + RN2 - 12;
3681 dstreg = REG_E0 + RN2;
3683 State.regs[dstreg] = load_byte (IMM8);
3686 // 1111 1011 0011 1110 Rm 0000 abs8 ; movbu Rn,(abs8)
3687 8.0xfb+8.0x3e+4.RM2,4.0x0+8.IMM8:D2q:::movbu
3694 if (RM2 > 7 && RM2 < 12)
3695 srcreg = REG_A0 + RM2 - 8;
3696 else if (RM2 > 11 && RM2 < 16)
3697 srcreg = REG_D0 + RM2 - 12;
3699 srcreg = REG_E0 + RM2;
3701 store_byte (IMM8, State.regs[srcreg]);
3704 // 1111 1011 0100 1110 Rn 0000 abs8 ; movhu (abs8),Rn
3705 8.0xfb+8.0x4e+4.RN2,4.0x0+8.IMM8:D2p:::movhu
3712 if (RN2 > 7 && RN2 < 12)
3713 dstreg = REG_A0 + RN2 - 8;
3714 else if (RN2 > 11 && RN2 < 16)
3715 dstreg = REG_D0 + RN2 - 12;
3717 dstreg = REG_E0 + RN2;
3719 State.regs[dstreg] = load_half (IMM8);
3722 // 1111 1011 0101 1110 Rm 0000 abs8 ; movhu Rn,(abs8)
3723 8.0xfb+8.0x5e+4.RM2,4.0x0+8.IMM8:D2q:::movhu
3730 if (RM2 > 7 && RM2 < 12)
3731 srcreg = REG_A0 + RM2 - 8;
3732 else if (RM2 > 11 && RM2 < 16)
3733 srcreg = REG_D0 + RM2 - 12;
3735 srcreg = REG_E0 + RM2;
3737 store_half (IMM8, State.regs[srcreg]);
3740 // 1111 1011 1000 1110 Ri Rm Rn; mov (Ri,Rm),Rn
3741 8.0xfb+8.0x8e+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::mov
3745 int srcreg1, srcreg2, dstreg;
3749 if (RM0 > 7 && RM0 < 12)
3750 srcreg1 = REG_A0 + RM0 - 8;
3751 else if (RM0 > 11 && RM0 < 16)
3752 srcreg1 = REG_D0 + RM0 - 12;
3754 srcreg1 = REG_E0 + RM0;
3756 if (RI0 > 7 && RI0 < 12)
3757 srcreg2 = REG_A0 + RI0 - 8;
3758 else if (RI0 > 11 && RI0 < 16)
3759 srcreg2 = REG_D0 + RI0 - 12;
3761 srcreg2 = REG_E0 + RI0;
3763 if (RN0 > 7 && RN0 < 12)
3764 dstreg = REG_A0 + RN0 - 8;
3765 else if (RN0 > 11 && RN0 < 16)
3766 dstreg = REG_D0 + RN0 - 12;
3768 dstreg = REG_E0 + RN0;
3770 State.regs[dstreg] = load_word (State.regs[srcreg1] + State.regs[srcreg2]);
3773 // 1111 1011 1001 1110 Ri Rm Rn; mov Rn,(Ri,Rm)
3774 8.0xfb+8.0x9e+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::mov
3778 int srcreg, dstreg1, dstreg2;
3782 if (RM0 > 7 && RM0 < 12)
3783 srcreg = REG_A0 + RM0 - 8;
3784 else if (RM0 > 11 && RM0 < 16)
3785 srcreg = REG_D0 + RM0 - 12;
3787 srcreg = REG_E0 + RM0;
3789 if (RI0 > 7 && RI0 < 12)
3790 dstreg1 = REG_A0 + RI0 - 8;
3791 else if (RI0 > 11 && RI0 < 16)
3792 dstreg1 = REG_D0 + RI0 - 12;
3794 dstreg1 = REG_E0 + RI0;
3796 if (RN0 > 7 && RN0 < 12)
3797 dstreg2 = REG_A0 + RN0 - 8;
3798 else if (RN0 > 11 && RN0 < 16)
3799 dstreg2 = REG_D0 + RN0 - 12;
3801 dstreg2 = REG_E0 + RN0;
3803 store_word (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
3806 // 1111 1011 1010 1110 Ri Rm Rn; movbu (Ri,Rm),Rn
3807 8.0xfb+8.0xae+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movbu
3811 int srcreg1, srcreg2, dstreg;
3815 if (RM0 > 7 && RM0 < 12)
3816 srcreg1 = REG_A0 + RM0 - 8;
3817 else if (RM0 > 11 && RM0 < 16)
3818 srcreg1 = REG_D0 + RM0 - 12;
3820 srcreg1 = REG_E0 + RM0;
3822 if (RI0 > 7 && RI0 < 12)
3823 srcreg2 = REG_A0 + RI0 - 8;
3824 else if (RI0 > 11 && RI0 < 16)
3825 srcreg2 = REG_D0 + RI0 - 12;
3827 srcreg2 = REG_E0 + RI0;
3829 if (RN0 > 7 && RN0 < 12)
3830 dstreg = REG_A0 + RN0 - 8;
3831 else if (RN0 > 11 && RN0 < 16)
3832 dstreg = REG_D0 + RN0 - 12;
3834 dstreg = REG_E0 + RN0;
3836 State.regs[dstreg] = load_byte (State.regs[srcreg1] + State.regs[srcreg2]);
3839 // 1111 1011 1011 1110 Ri Rm Rn; movbu Rn,(Ri,Rm)
3840 8.0xfb+8.0xbe+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movbu
3844 int srcreg, dstreg1, dstreg2;
3848 if (RM0 > 7 && RM0 < 12)
3849 srcreg = REG_A0 + RM0 - 8;
3850 else if (RM0 > 11 && RM0 < 16)
3851 srcreg = REG_D0 + RM0 - 12;
3853 srcreg = REG_E0 + RM0;
3855 if (RI0 > 7 && RI0 < 12)
3856 dstreg1 = REG_A0 + RI0 - 8;
3857 else if (RI0 > 11 && RI0 < 16)
3858 dstreg1 = REG_D0 + RI0 - 12;
3860 dstreg1 = REG_E0 + RI0;
3862 if (RN0 > 7 && RN0 < 12)
3863 dstreg2 = REG_A0 + RN0 - 8;
3864 else if (RN0 > 11 && RN0 < 16)
3865 dstreg2 = REG_D0 + RN0 - 12;
3867 dstreg2 = REG_E0 + RN0;
3869 store_byte (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
3872 // 1111 1011 1100 1110 Ri Rm Rn; movhu (Ri,Rm),Rn
3873 8.0xfb+8.0xce+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movhu
3877 int srcreg1, srcreg2, dstreg;
3881 if (RM0 > 7 && RM0 < 12)
3882 srcreg1 = REG_A0 + RM0 - 8;
3883 else if (RM0 > 11 && RM0 < 16)
3884 srcreg1 = REG_D0 + RM0 - 12;
3886 srcreg1 = REG_E0 + RM0;
3888 if (RI0 > 7 && RI0 < 12)
3889 srcreg2 = REG_A0 + RI0 - 8;
3890 else if (RI0 > 11 && RI0 < 16)
3891 srcreg2 = REG_D0 + RI0 - 12;
3893 srcreg2 = REG_E0 + RI0;
3895 if (RN0 > 7 && RN0 < 12)
3896 dstreg = REG_A0 + RN0 - 8;
3897 else if (RN0 > 11 && RN0 < 16)
3898 dstreg = REG_D0 + RN0 - 12;
3900 dstreg = REG_E0 + RN0;
3902 State.regs[dstreg] = load_half (State.regs[srcreg1] + State.regs[srcreg2]);
3905 // 1111 1011 1101 1110 Ri Rm Rn; movhu Rn,(Ri,Rm)
3906 8.0xfb+8.0xde+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movhu
3910 int srcreg, dstreg1, dstreg2;
3914 if (RM0 > 7 && RM0 < 12)
3915 srcreg = REG_A0 + RM0 - 8;
3916 else if (RM0 > 11 && RM0 < 16)
3917 srcreg = REG_D0 + RM0 - 12;
3919 srcreg = REG_E0 + RM0;
3921 if (RI0 > 7 && RI0 < 12)
3922 dstreg1 = REG_A0 + RI0 - 8;
3923 else if (RI0 > 11 && RI0 < 16)
3924 dstreg1 = REG_D0 + RI0 - 12;
3926 dstreg1 = REG_E0 + RI0;
3928 if (RN0 > 7 && RN0 < 12)
3929 dstreg2 = REG_A0 + RN0 - 8;
3930 else if (RN0 > 11 && RN0 < 16)
3931 dstreg2 = REG_D0 + RN0 - 12;
3933 dstreg2 = REG_E0 + RN0;
3935 store_half (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
3949 // 1111 1011 1010 1111 Rm Rn; sat24 Rm,Rn
3950 8.0xfb+8.0xaf+4.RM2,4.RN0+8.0x0:D2:::sat24
3959 if (RM2 > 7 && RM2 < 12)
3960 srcreg = REG_A0 + RM2 - 8;
3961 else if (RM2 > 11 && RM2 < 16)
3962 srcreg = REG_D0 + RM2 - 12;
3964 srcreg = REG_E0 + RM2;
3966 if (RN0 > 7 && RN0 < 12)
3967 dstreg = REG_A0 + RN0 - 8;
3968 else if (RN0 > 11 && RN0 < 16)
3969 dstreg = REG_D0 + RN0 - 12;
3971 dstreg = REG_E0 + RN0;
3973 value = State.regs[srcreg];
3975 if (value >= 0x7fffff)
3976 State.regs[dstreg] = 0x7fffff;
3977 else if (value <= 0xff800000)
3978 State.regs[dstreg] = 0xff800000;
3980 State.regs[dstreg] = value;
3985 // 1111 1101 0000 1000 Rn Rn IMM32; mov imm24,Rn
3986 8.0xfd+8.0x08+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::mov
3994 if (RN0 > 7 && RN0 < 12)
3995 dstreg = REG_A0 + RN0 - 8;
3996 else if (RN0 > 11 && RN0 < 16)
3997 dstreg = REG_D0 + RN0 - 12;
3999 dstreg = REG_E0 + RN0;
4001 State.regs[dstreg] = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
4004 // 1111 1101 0001 1000 Rn Rn IMM32; movu imm24,Rn
4005 8.0xfd+8.0x18+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4k:::movu
4013 if (RN0 > 7 && RN0 < 12)
4014 dstreg = REG_A0 + RN0 - 8;
4015 else if (RN0 > 11 && RN0 < 16)
4016 dstreg = REG_D0 + RN0 - 12;
4018 dstreg = REG_E0 + RN0;
4020 State.regs[dstreg] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
4023 // 1111 1101 0111 1000 Rn Rn IMM32; add imm24,Rn
4024 8.0xfd+8.0x78+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4c:::add
4032 if (RN0 > 7 && RN0 < 12)
4033 dstreg = REG_A0 + RN0 - 8;
4034 else if (RN0 > 11 && RN0 < 16)
4035 dstreg = REG_D0 + RN0 - 12;
4037 dstreg = REG_E0 + RN0;
4039 genericAdd (FETCH24 (IMM24A, IMM24B, IMM24C), dstreg);
4042 // 1111 1101 1000 1000 Rn Rn IMM32; addc imm24,Rn
4043 8.0xfd+8.0x88+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::addc
4047 int dstreg, z, n, c, v;
4048 unsigned long sum, imm, reg2;
4052 if (RN0 > 7 && RN0 < 12)
4053 dstreg = REG_A0 + RN0 - 8;
4054 else if (RN0 > 11 && RN0 < 16)
4055 dstreg = REG_D0 + RN0 - 12;
4057 dstreg = REG_E0 + RN0;
4059 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
4060 reg2 = State.regs[dstreg];
4061 sum = imm + reg2 + ((PSW & PSW_C) != 0);
4062 State.regs[dstreg] = sum;
4065 n = (sum & 0x80000000);
4066 c = (sum < imm) || (sum < reg2);
4067 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
4068 && (reg2 & 0x80000000) != (sum & 0x80000000));
4070 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4071 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
4072 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
4075 // 1111 1101 1001 1000 Rn Rn IMM32; sub imm24,Rn
4076 8.0xfd+8.0x98+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::sub
4084 if (RN0 > 7 && RN0 < 12)
4085 dstreg = REG_A0 + RN0 - 8;
4086 else if (RN0 > 11 && RN0 < 16)
4087 dstreg = REG_D0 + RN0 - 12;
4089 dstreg = REG_E0 + RN0;
4091 genericSub (FETCH24 (IMM24A, IMM24B, IMM24C), dstreg);
4094 // 1111 1101 1010 1000 Rn Rn IMM32; subc imm24,Rn
4095 8.0xfd+8.0xa8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::subc
4099 int dstreg, z, n, c, v;
4100 unsigned long difference, imm, reg2;
4104 if (RN0 > 7 && RN0 < 12)
4105 dstreg = REG_A0 + RN0 - 8;
4106 else if (RN0 > 11 && RN0 < 16)
4107 dstreg = REG_D0 + RN0 - 12;
4109 dstreg = REG_E0 + RN0;
4111 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
4112 reg2 = State.regs[dstreg];
4113 difference = reg2 - imm - ((PSW & PSW_C) != 0);
4114 State.regs[dstreg] = difference;
4116 z = (difference == 0);
4117 n = (difference & 0x80000000);
4119 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
4120 && (reg2 & 0x80000000) != (difference & 0x80000000));
4122 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4123 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
4124 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
4127 // 1111 1101 1101 1000 Rn Rn IMM32; cmp imm24,Rn
4128 8.0xfd+8.0xd8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::cmp
4136 if (RN0 > 7 && RN0 < 12)
4137 srcreg = REG_A0 + RN0 - 8;
4138 else if (RN0 > 11 && RN0 < 16)
4139 srcreg = REG_D0 + RN0 - 12;
4141 srcreg = REG_E0 + RN0;
4143 genericCmp (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), State.regs[srcreg]);
4146 // 1111 1101 1111 1000 XRn XRn IMM32; mov imm24,XRn
4147 8.0xfd+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM24A+8.IMM24B+8.IMM24C:D4o:::mov
4157 State.regs[REG_SP] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
4163 // 1111 1101 0000 1001 Rn Rn IMM24; and imm24,Rn
4164 8.0xfd+8.0x09+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::and
4173 if (RN0 > 7 && RN0 < 12)
4174 dstreg = REG_A0 + RN0 - 8;
4175 else if (RN0 > 11 && RN0 < 16)
4176 dstreg = REG_D0 + RN0 - 12;
4178 dstreg = REG_E0 + RN0;
4180 State.regs[dstreg] &= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
4181 z = (State.regs[dstreg] == 0);
4182 n = (State.regs[dstreg] & 0x80000000) != 0;
4183 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4184 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4187 // 1111 1101 0001 1001 Rn Rn IMM24; or imm24,Rn
4188 8.0xfd+8.0x19+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::or
4197 if (RN0 > 7 && RN0 < 12)
4198 dstreg = REG_A0 + RN0 - 8;
4199 else if (RN0 > 11 && RN0 < 16)
4200 dstreg = REG_D0 + RN0 - 12;
4202 dstreg = REG_E0 + RN0;
4204 State.regs[dstreg] |= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
4205 z = (State.regs[dstreg] == 0);
4206 n = (State.regs[dstreg] & 0x80000000) != 0;
4207 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4208 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4211 // 1111 1101 0010 1001 Rn Rn IMM24; xor imm24,Rn
4212 8.0xfd+8.0x29+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::xor
4221 if (RN0 > 7 && RN0 < 12)
4222 dstreg = REG_A0 + RN0 - 8;
4223 else if (RN0 > 11 && RN0 < 16)
4224 dstreg = REG_D0 + RN0 - 12;
4226 dstreg = REG_E0 + RN0;
4228 State.regs[dstreg] ^= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
4229 z = (State.regs[dstreg] == 0);
4230 n = (State.regs[dstreg] & 0x80000000) != 0;
4231 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4232 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4235 // 1111 1101 0100 1001 Rn Rn IMM24; asr imm24,Rn
4236 8.0xfd+8.0x49+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asr
4246 if (RN0 > 7 && RN0 < 12)
4247 dstreg = REG_A0 + RN0 - 8;
4248 else if (RN0 > 11 && RN0 < 16)
4249 dstreg = REG_D0 + RN0 - 12;
4251 dstreg = REG_E0 + RN0;
4253 temp = State.regs[dstreg];
4255 temp >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
4256 State.regs[dstreg] = temp;
4257 z = (State.regs[dstreg] == 0);
4258 n = (State.regs[dstreg] & 0x80000000) != 0;
4259 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4260 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4264 // 1111 1101 0101 1001 Rn Rn IMM24; lsr imm24,Rn
4265 8.0xfd+8.0x59+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::lsr
4274 if (RN0 > 7 && RN0 < 12)
4275 dstreg = REG_A0 + RN0 - 8;
4276 else if (RN0 > 11 && RN0 < 16)
4277 dstreg = REG_D0 + RN0 - 12;
4279 dstreg = REG_E0 + RN0;
4281 c = State.regs[dstreg] & 1;
4282 State.regs[dstreg] >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
4283 z = (State.regs[dstreg] == 0);
4284 n = (State.regs[dstreg] & 0x80000000) != 0;
4285 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4286 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4289 // 1111 1101 0110 1001 Rn Rn IMM24; asl imm24,Rn
4290 8.0xfd+8.0x69+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asl
4299 if (RN0 > 7 && RN0 < 12)
4300 dstreg = REG_A0 + RN0 - 8;
4301 else if (RN0 > 11 && RN0 < 16)
4302 dstreg = REG_D0 + RN0 - 12;
4304 dstreg = REG_E0 + RN0;
4306 State.regs[dstreg] <<= (FETCH24 (IMM24A, IMM24B, IMM24C));
4307 z = (State.regs[dstreg] == 0);
4308 n = (State.regs[dstreg] & 0x80000000) != 0;
4309 PSW &= ~(PSW_Z | PSW_N);
4310 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4316 // 1111 1101 1110 1001 Rn Rn IMM24; btst imm24,,Rn
4317 8.0xfd+8.0xe9+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::btst
4325 if (RN0 > 7 && RN0 < 12)
4326 srcreg = REG_A0 + RN0 - 8;
4327 else if (RN0 > 11 && RN0 < 16)
4328 srcreg = REG_D0 + RN0 - 12;
4330 srcreg = REG_E0 + RN0;
4332 genericBtst (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
4335 // 1111 1101 0000 1010 Rn Rm IMM24; mov (d24,Rm),Rn
4336 8.0xfd+8.0x0a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::mov
4344 if (RM0 > 7 && RM0 < 12)
4345 srcreg = REG_A0 + RM0 - 8;
4346 else if (RM0 > 11 && RM0 < 16)
4347 srcreg = REG_D0 + RM0 - 12;
4349 srcreg = REG_E0 + RM0;
4351 if (RN2 > 7 && RN2 < 12)
4352 dstreg = REG_A0 + RN2 - 8;
4353 else if (RN2 > 11 && RN2 < 16)
4354 dstreg = REG_D0 + RN2 - 12;
4356 dstreg = REG_E0 + RN2;
4358 State.regs[dstreg] = load_word (State.regs[srcreg]
4359 + FETCH24 (IMM24A, IMM24B, IMM24C));
4362 // 1111 1101 0001 1010 Rm Rn IMM24; mov Rm,(d24,Rn)
4363 8.0xfd+8.0x1a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::mov
4371 if (RM2 > 7 && RM2 < 12)
4372 srcreg = REG_A0 + RM2 - 8;
4373 else if (RM2 > 11 && RM2 < 16)
4374 srcreg = REG_D0 + RM2 - 12;
4376 srcreg = REG_E0 + RM2;
4378 if (RN0 > 7 && RN0 < 12)
4379 dstreg = REG_A0 + RN0 - 8;
4380 else if (RN0 > 11 && RN0 < 16)
4381 dstreg = REG_D0 + RN0 - 12;
4383 dstreg = REG_E0 + RN0;
4385 store_word (State.regs[dstreg] + FETCH24 (IMM24A, IMM24B, IMM24C),
4386 State.regs[srcreg]);
4389 // 1111 1101 0010 1010 Rn Rm IMM24; movbu (d24,Rm),Rn
4390 8.0xfd+8.0x2a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movbu
4398 if (RM0 > 7 && RM0 < 12)
4399 srcreg = REG_A0 + RM0 - 8;
4400 else if (RM0 > 11 && RM0 < 16)
4401 srcreg = REG_D0 + RM0 - 12;
4403 srcreg = REG_E0 + RM0;
4405 if (RN2 > 7 && RN2 < 12)
4406 dstreg = REG_A0 + RN2 - 8;
4407 else if (RN2 > 11 && RN2 < 16)
4408 dstreg = REG_D0 + RN2 - 12;
4410 dstreg = REG_E0 + RN2;
4412 State.regs[dstreg] = load_byte (State.regs[srcreg]
4413 + FETCH24 (IMM24A, IMM24B, IMM24C));
4416 // 1111 1101 0011 1010 Rm Rn IMM24; movbu Rm,(d24,Rn)
4417 8.0xfd+8.0x3a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movbu
4425 if (RM2 > 7 && RM2 < 12)
4426 srcreg = REG_A0 + RM2 - 8;
4427 else if (RM2 > 11 && RM2 < 16)
4428 srcreg = REG_D0 + RM2 - 12;
4430 srcreg = REG_E0 + RM2;
4432 if (RN0 > 7 && RN0 < 12)
4433 dstreg = REG_A0 + RN0 - 8;
4434 else if (RN0 > 11 && RN0 < 16)
4435 dstreg = REG_D0 + RN0 - 12;
4437 dstreg = REG_E0 + RN0;
4439 store_byte (State.regs[dstreg] + FETCH24 (IMM24A, IMM24B, IMM24C),
4440 State.regs[srcreg]);
4443 // 1111 1101 0100 1010 Rn Rm IMM24; movhu (d24,Rm),Rn
4444 8.0xfd+8.0x4a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movhu
4452 if (RM0 > 7 && RM0 < 12)
4453 srcreg = REG_A0 + RM0 - 8;
4454 else if (RM0 > 11 && RM0 < 16)
4455 srcreg = REG_D0 + RM0 - 12;
4457 srcreg = REG_E0 + RM0;
4459 if (RN2 > 7 && RN2 < 12)
4460 dstreg = REG_A0 + RN2 - 8;
4461 else if (RN2 > 11 && RN2 < 16)
4462 dstreg = REG_D0 + RN2 - 12;
4464 dstreg = REG_E0 + RN2;
4466 State.regs[dstreg] = load_half (State.regs[srcreg]
4467 + FETCH24 (IMM24A, IMM24B, IMM24C));
4470 // 1111 1101 0101 1010 Rm Rn IMM24; movhu Rm,(d24,Rn)
4471 8.0xfd+8.0x5a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movhu
4479 if (RM2 > 7 && RM2 < 12)
4480 srcreg = REG_A0 + RM2 - 8;
4481 else if (RM2 > 11 && RM2 < 16)
4482 srcreg = REG_D0 + RM2 - 12;
4484 srcreg = REG_E0 + RM2;
4486 if (RN0 > 7 && RN0 < 12)
4487 dstreg = REG_A0 + RN0 - 8;
4488 else if (RN0 > 11 && RN0 < 16)
4489 dstreg = REG_D0 + RN0 - 12;
4491 dstreg = REG_E0 + RN0;
4493 store_half (State.regs[dstreg] + FETCH24 (IMM24A, IMM24B, IMM24C),
4494 State.regs[srcreg]);
4497 // 1111 1101 0110 1010 Rn Rm IMM24; mov (d24,Rm+),Rn
4498 8.0xfd+8.0x6a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::mov
4506 if (RM0 > 7 && RM0 < 12)
4507 srcreg = REG_A0 + RM0 - 8;
4508 else if (RM0 > 11 && RM0 < 16)
4509 srcreg = REG_D0 + RM0 - 12;
4511 srcreg = REG_E0 + RM0;
4513 if (RN2 > 7 && RN2 < 12)
4514 dstreg = REG_A0 + RN2 - 8;
4515 else if (RN2 > 11 && RN2 < 16)
4516 dstreg = REG_D0 + RN2 - 12;
4518 dstreg = REG_E0 + RN2;
4520 State.regs[dstreg] = load_word (State.regs[srcreg]
4521 + FETCH24 (IMM24A, IMM24B, IMM24C));
4522 State.regs[srcreg] += 4;
4525 // 1111 1101 0111 1010 Rm Rn IMM24; mov Rm,(d24,Rn+)
4526 8.0xfd+8.0x7a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mov
4534 if (RM2 > 7 && RM2 < 12)
4535 srcreg = REG_A0 + RM2 - 8;
4536 else if (RM2 > 11 && RM2 < 16)
4537 srcreg = REG_D0 + RM2 - 12;
4539 srcreg = REG_E0 + RM2;
4541 if (RN0 > 7 && RN0 < 12)
4542 dstreg = REG_A0 + RN0 - 8;
4543 else if (RN0 > 11 && RN0 < 16)
4544 dstreg = REG_D0 + RN0 - 12;
4546 dstreg = REG_E0 + RN0;
4548 store_word (State.regs[dstreg] + FETCH24 (IMM24A, IMM24B, IMM24C),
4549 State.regs[srcreg]);
4550 State.regs[dstreg] += 4;
4554 // 1111 1101 1000 1010 Rn 0000 IMM24; mov (d24,sp),Rn
4555 8.0xfd+8.0x8a+4.RN2,4.0x0+IMM24A+8.IMM24B+8.IMM24C:D4r:::mov
4563 if (RN2 > 7 && RN2 < 12)
4564 dstreg = REG_A0 + RN2 - 8;
4565 else if (RN2 > 11 && RN2 < 16)
4566 dstreg = REG_D0 + RN2 - 12;
4568 dstreg = REG_E0 + RN2;
4570 State.regs[dstreg] = load_word (State.regs[REG_SP]
4571 + FETCH24 (IMM24A, IMM24B, IMM24C));
4574 // 1111 1101 1001 1010 Rm 0000 IMM24; mov Rm,(d24,sp)
4575 8.0xfd+8.0x9a+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::mov
4583 if (RM2 > 7 && RM2 < 12)
4584 srcreg = REG_A0 + RM2 - 8;
4585 else if (RM2 > 11 && RM2 < 16)
4586 srcreg = REG_D0 + RM2 - 12;
4588 srcreg = REG_E0 + RM2;
4590 store_word (State.regs[REG_SP] + FETCH24 (IMM24A, IMM24B, IMM24C),
4591 State.regs[srcreg]);
4594 // 1111 1101 1010 1010 Rn 0000 IMM24; movbu (d24,Rm),Rn
4595 8.0xfd+8.0xaa+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movbu
4603 if (RN2 > 7 && RN2 < 12)
4604 dstreg = REG_A0 + RN2 - 8;
4605 else if (RN2 > 11 && RN2 < 16)
4606 dstreg = REG_D0 + RN2 - 12;
4608 dstreg = REG_E0 + RN2;
4610 State.regs[dstreg] = load_byte (State.regs[REG_SP]
4611 + FETCH24 (IMM24A, IMM24B, IMM24C));
4614 // 1111 1101 1011 1010 Rm 0000 IMM24; movbu Rm,(d24,sp)
4615 8.0xfd+8.0xba+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movbu
4623 if (RM2 > 7 && RM2 < 12)
4624 srcreg = REG_A0 + RM2 - 8;
4625 else if (RM2 > 11 && RM2 < 16)
4626 srcreg = REG_D0 + RM2 - 12;
4628 srcreg = REG_E0 + RM2;
4630 store_byte (State.regs[REG_SP] + FETCH24 (IMM24A, IMM24B, IMM24C),
4631 State.regs[srcreg]);
4634 // 1111 1101 1100 1010 Rn 0000 IMM24; movhu (d24,sp),Rn
4635 8.0xfd+8.0xca+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movhu
4643 if (RN2 > 7 && RN2 < 12)
4644 dstreg = REG_A0 + RN2 - 8;
4645 else if (RN2 > 11 && RN2 < 16)
4646 dstreg = REG_D0 + RN2 - 12;
4648 dstreg = REG_E0 + RN2;
4650 State.regs[dstreg] = load_half (State.regs[REG_SP]
4651 + FETCH24 (IMM24A, IMM24B, IMM24C));
4654 // 1111 1101 1101 1010 Rm Rn IMM24; movhu Rm,(d24,sp)
4655 8.0xfd+8.0xda+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movhu
4663 if (RM2 > 7 && RM2 < 12)
4664 srcreg = REG_A0 + RM2 - 8;
4665 else if (RM2 > 11 && RM2 < 16)
4666 srcreg = REG_D0 + RM2 - 12;
4668 srcreg = REG_E0 + RM2;
4670 store_half (State.regs[REG_SP] + FETCH24 (IMM24A, IMM24B, IMM24C),
4671 State.regs[srcreg]);
4674 // 1111 1101 1110 1010 Rn Rm IMM24; movhu (d24,Rm+),Rn
4675 8.0xfd+8.0xea+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::movhu
4683 if (RM0 > 7 && RM0 < 12)
4684 srcreg = REG_A0 + RM0 - 8;
4685 else if (RM0 > 11 && RM0 < 16)
4686 srcreg = REG_D0 + RM0 - 12;
4688 srcreg = REG_E0 + RM0;
4690 if (RN2 > 7 && RN2 < 12)
4691 dstreg = REG_A0 + RN2 - 8;
4692 else if (RN2 > 11 && RN2 < 16)
4693 dstreg = REG_D0 + RN2 - 12;
4695 dstreg = REG_E0 + RN2;
4697 State.regs[dstreg] = load_half (State.regs[srcreg]
4698 + FETCH24 (IMM24A, IMM24B, IMM24C));
4699 State.regs[dstreg] += 2;
4702 // 1111 1101 1111 1010 Rm Rn IMM24; movhu Rm,(d24,Rn+)
4703 8.0xfd+8.0xfa+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::movhu
4711 if (RM2 > 7 && RM2 < 12)
4712 srcreg = REG_A0 + RM2 - 8;
4713 else if (RM2 > 11 && RM2 < 16)
4714 srcreg = REG_D0 + RM2 - 12;
4716 srcreg = REG_E0 + RM2;
4718 if (RN0 > 7 && RN0 < 12)
4719 dstreg = REG_A0 + RN0 - 8;
4720 else if (RN0 > 11 && RN0 < 16)
4721 dstreg = REG_D0 + RN0 - 12;
4723 dstreg = REG_E0 + RN0;
4725 store_half (State.regs[dstreg] + FETCH24 (IMM24A, IMM24B, IMM24C),
4726 State.regs[srcreg]);
4727 State.regs[srcreg] += 2;
4736 // 1111 1101 0000 1110 Rn 0000 ABS24; mov (abs24),Rn
4737 8.0xfd+8.0x0e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::mov
4745 if (RN2 > 7 && RN2 < 12)
4746 dstreg = REG_A0 + RN2 - 8;
4747 else if (RN2 > 11 && RN2 < 16)
4748 dstreg = REG_D0 + RN2 - 12;
4750 dstreg = REG_E0 + RN2;
4752 State.regs[dstreg] = load_word (FETCH24 (IMM24A, IMM24B, IMM24C));
4755 // 1111 1101 0001 1110 Rm 0000 ABS24; mov Rm,(abs24)
4756 8.0xfd+8.0x1e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4v:::mov
4764 if (RM2 > 7 && RM2 < 12)
4765 srcreg = REG_A0 + RM2 - 8;
4766 else if (RM2 > 11 && RM2 < 16)
4767 srcreg = REG_D0 + RM2 - 12;
4769 srcreg = REG_E0 + RM2;
4771 store_word (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
4775 // 1111 1101 0010 1110 Rn 0000 ABS24; movbu (abs24),Rn
4776 8.0xfd+8.0x2e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movbu
4784 if (RN2 > 7 && RN2 < 12)
4785 dstreg = REG_A0 + RN2 - 8;
4786 else if (RN2 > 11 && RN2 < 16)
4787 dstreg = REG_D0 + RN2 - 12;
4789 dstreg = REG_E0 + RN2;
4791 State.regs[dstreg] = load_byte (FETCH24 (IMM24A, IMM24B, IMM24C));
4794 // 1111 1101 0011 1110 Rm 0000 ABS24; movbu Rm,(abs24)
4795 8.0xfd+8.0x3e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movbu
4803 if (RM2 > 7 && RM2 < 12)
4804 srcreg = REG_A0 + RM2 - 8;
4805 else if (RM2 > 11 && RM2 < 16)
4806 srcreg = REG_D0 + RM2 - 12;
4808 srcreg = REG_E0 + RM2;
4810 store_byte (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
4814 // 1111 1101 0100 1110 Rn 0000 ABS24; movhu (abs24),Rn
4815 8.0xfd+8.0x4e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movhu
4823 if (RN2 > 7 && RN2 < 12)
4824 dstreg = REG_A0 + RN2 - 8;
4825 else if (RN2 > 11 && RN2 < 16)
4826 dstreg = REG_D0 + RN2 - 12;
4828 dstreg = REG_E0 + RN2;
4830 State.regs[dstreg] = load_half (FETCH24 (IMM24A, IMM24B, IMM24C));
4833 // 1111 1101 0101 1110 Rm 0000 ABS24; movhu Rm,(abs24)
4834 8.0xfd+8.0x5e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movhu
4842 if (RM2 > 7 && RM2 < 12)
4843 srcreg = REG_A0 + RM2 - 8;
4844 else if (RM2 > 11 && RM2 < 16)
4845 srcreg = REG_D0 + RM2 - 12;
4847 srcreg = REG_E0 + RM2;
4849 store_half (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
4853 // 1111 1110 0000 1000 Rn Rn IMM32; mov imm32,Rn
4854 8.0xfe+8.0x08+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mov
4862 if (RN0 > 7 && RN0 < 12)
4863 dstreg = REG_A0 + RN0 - 8;
4864 else if (RN0 > 11 && RN0 < 16)
4865 dstreg = REG_D0 + RN0 - 12;
4867 dstreg = REG_E0 + RN0;
4869 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
4872 // 1111 1110 0001 1000 Rn Rn IMM32; movu imm32,Rn
4873 8.0xfe+8.0x18+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movu
4881 if (RN0 > 7 && RN0 < 12)
4882 dstreg = REG_A0 + RN0 - 8;
4883 else if (RN0 > 11 && RN0 < 16)
4884 dstreg = REG_D0 + RN0 - 12;
4886 dstreg = REG_E0 + RN0;
4888 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
4891 // 1111 1110 0111 1000 Rn Rn IMM32; add imm32,Rn
4892 8.0xfe+8.0x78+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::add
4900 if (RN0 > 7 && RN0 < 12)
4901 dstreg = REG_A0 + RN0 - 8;
4902 else if (RN0 > 11 && RN0 < 16)
4903 dstreg = REG_D0 + RN0 - 12;
4905 dstreg = REG_E0 + RN0;
4907 genericAdd (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
4910 // 1111 1110 1000 1000 Rn Rn IMM32; addc imm32,Rn
4911 8.0xfe+8.0x88+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::addc
4916 unsigned int imm, reg2, sum;
4921 if (RN0 > 7 && RN0 < 12)
4922 dstreg = REG_A0 + RN0 - 8;
4923 else if (RN0 > 11 && RN0 < 16)
4924 dstreg = REG_D0 + RN0 - 12;
4926 dstreg = REG_E0 + RN0;
4928 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4929 reg2 = State.regs[dstreg];
4930 sum = imm + reg2 + ((PSW & PSW_C) != 0);
4931 State.regs[dstreg] = sum;
4934 n = (sum & 0x80000000);
4935 c = (sum < imm) || (sum < reg2);
4936 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
4937 && (reg2 & 0x80000000) != (sum & 0x80000000));
4939 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4940 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
4941 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
4944 // 1111 1110 1001 1000 Rn Rn IMM32; sub imm32,Rn
4945 8.0xfe+8.0x98+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::sub
4953 if (RN0 > 7 && RN0 < 12)
4954 dstreg = REG_A0 + RN0 - 8;
4955 else if (RN0 > 11 && RN0 < 16)
4956 dstreg = REG_D0 + RN0 - 12;
4958 dstreg = REG_E0 + RN0;
4960 genericSub (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
4963 // 1111 1110 1010 1000 Rn Rn IMM32; subc imm32,Rn
4964 8.0xfe+8.0xa8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::subc
4969 unsigned int imm, reg2, difference;
4974 if (RN0 > 7 && RN0 < 12)
4975 dstreg = REG_A0 + RN0 - 8;
4976 else if (RN0 > 11 && RN0 < 16)
4977 dstreg = REG_D0 + RN0 - 12;
4979 dstreg = REG_E0 + RN0;
4981 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4982 reg2 = State.regs[dstreg];
4983 difference = reg2 - imm - ((PSW & PSW_C) != 0);
4984 State.regs[dstreg] = difference;
4986 z = (difference == 0);
4987 n = (difference & 0x80000000);
4989 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
4990 && (reg2 & 0x80000000) != (difference & 0x80000000));
4992 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4993 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
4994 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
4997 // 1111 1110 0111 1000 Rn Rn IMM32; cmp imm32,Rn
4998 8.0xfe+8.0xd8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::cmp
5006 if (RN0 > 7 && RN0 < 12)
5007 srcreg = REG_A0 + RN0 - 8;
5008 else if (RN0 > 11 && RN0 < 16)
5009 srcreg = REG_D0 + RN0 - 12;
5011 srcreg = REG_E0 + RN0;
5013 genericCmp (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
5016 // 1111 1110 1111 1000 XRn XRn IMM32; mov imm32,XRn
5017 8.0xfe+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::mov
5026 State.regs[REG_SP] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
5031 // 1111 1110 0000 1001 Rn Rn IMM32; and imm32,Rn
5032 8.0xfe+8.0x09+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::and
5041 if (RN0 > 7 && RN0 < 12)
5042 dstreg = REG_A0 + RN0 - 8;
5043 else if (RN0 > 11 && RN0 < 16)
5044 dstreg = REG_D0 + RN0 - 12;
5046 dstreg = REG_E0 + RN0;
5048 State.regs[dstreg] &= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5049 z = (State.regs[dstreg] == 0);
5050 n = (State.regs[dstreg] & 0x80000000) != 0;
5051 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
5052 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
5055 // 1111 1110 0001 1001 Rn Rn IMM32; or imm32,Rn
5056 8.0xfe+8.0x19+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::or
5065 if (RN0 > 7 && RN0 < 12)
5066 dstreg = REG_A0 + RN0 - 8;
5067 else if (RN0 > 11 && RN0 < 16)
5068 dstreg = REG_D0 + RN0 - 12;
5070 dstreg = REG_E0 + RN0;
5072 State.regs[dstreg] |= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5073 z = (State.regs[dstreg] == 0);
5074 n = (State.regs[dstreg] & 0x80000000) != 0;
5075 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
5076 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
5079 // 1111 1110 0010 1001 Rn Rn IMM32; xor imm32,Rn
5080 8.0xfe+8.0x29+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::xor
5089 if (RN0 > 7 && RN0 < 12)
5090 dstreg = REG_A0 + RN0 - 8;
5091 else if (RN0 > 11 && RN0 < 16)
5092 dstreg = REG_D0 + RN0 - 12;
5094 dstreg = REG_E0 + RN0;
5096 State.regs[dstreg] ^= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5097 z = (State.regs[dstreg] == 0);
5098 n = (State.regs[dstreg] & 0x80000000) != 0;
5099 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
5100 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
5103 // 1111 1110 0100 1001 Rn Rn IMM32; asr imm32,Rn
5104 8.0xfe+8.0x49+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asr
5114 if (RN0 > 7 && RN0 < 12)
5115 dstreg = REG_A0 + RN0 - 8;
5116 else if (RN0 > 11 && RN0 < 16)
5117 dstreg = REG_D0 + RN0 - 12;
5119 dstreg = REG_E0 + RN0;
5121 temp = State.regs[dstreg];
5123 temp >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5124 State.regs[dstreg] = temp;
5125 z = (State.regs[dstreg] == 0);
5126 n = (State.regs[dstreg] & 0x80000000) != 0;
5127 PSW &= ~(PSW_Z | PSW_N | PSW_C);
5128 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
5131 // 1111 1110 0101 1001 Rn Rn IMM32; lsr imm32,Rn
5132 8.0xfe+8.0x59+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::lsr
5141 if (RN0 > 7 && RN0 < 12)
5142 dstreg = REG_A0 + RN0 - 8;
5143 else if (RN0 > 11 && RN0 < 16)
5144 dstreg = REG_D0 + RN0 - 12;
5146 dstreg = REG_E0 + RN0;
5148 c = State.regs[dstreg] & 1;
5149 State.regs[dstreg] >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5150 z = (State.regs[dstreg] == 0);
5151 n = (State.regs[dstreg] & 0x80000000) != 0;
5152 PSW &= ~(PSW_Z | PSW_N | PSW_C);
5153 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
5156 // 1111 1110 0110 1001 Rn Rn IMM32; asl imm32,Rn
5157 8.0xfe+8.0x69+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asl
5166 if (RN0 > 7 && RN0 < 12)
5167 dstreg = REG_A0 + RN0 - 8;
5168 else if (RN0 > 11 && RN0 < 16)
5169 dstreg = REG_D0 + RN0 - 12;
5171 dstreg = REG_E0 + RN0;
5173 State.regs[dstreg] <<= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5174 z = (State.regs[dstreg] == 0);
5175 n = (State.regs[dstreg] & 0x80000000) != 0;
5176 PSW &= ~(PSW_Z | PSW_N);
5177 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
5183 // 1111 1110 1110 1001 Rn Rn IMM32; btst imm32,Rn
5184 8.0xfe+8.0xe9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5a:::btst
5192 if (RN0 > 7 && RN0 < 12)
5193 srcreg = REG_A0 + RN0 - 8;
5194 else if (RN0 > 11 && RN0 < 16)
5195 srcreg = REG_D0 + RN0 - 12;
5197 srcreg = REG_E0 + RN0;
5199 genericBtst (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
5202 // 1111 1110 0000 1010 Rn Rm IMM32; mov (d32,Rm),Rn
5203 8.0xfe+8.0x0a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::mov
5211 if (RM0 > 7 && RM0 < 12)
5212 srcreg = REG_A0 + RM0 - 8;
5213 else if (RM0 > 11 && RM0 < 16)
5214 srcreg = REG_D0 + RM0 - 12;
5216 srcreg = REG_E0 + RM0;
5218 if (RN2 > 7 && RN2 < 12)
5219 dstreg = REG_A0 + RN2 - 8;
5220 else if (RN2 > 11 && RN2 < 16)
5221 dstreg = REG_D0 + RN2 - 12;
5223 dstreg = REG_E0 + RN2;
5225 State.regs[dstreg] = load_word (State.regs[srcreg]
5226 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5229 // 1111 1110 0001 1010 Rm Rn IMM32; mov Rm,(d32,Rn)
5230 8.0xfe+8.0x1a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5g:::mov
5238 if (RM2 > 7 && RM2 < 12)
5239 srcreg = REG_A0 + RM2 - 8;
5240 else if (RM2 > 11 && RM2 < 16)
5241 srcreg = REG_D0 + RM2 - 12;
5243 srcreg = REG_E0 + RM2;
5245 if (RN0 > 7 && RN0 < 12)
5246 dstreg = REG_A0 + RN0 - 8;
5247 else if (RN0 > 11 && RN0 < 16)
5248 dstreg = REG_D0 + RN0 - 12;
5250 dstreg = REG_E0 + RN0;
5252 store_word (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5253 State.regs[srcreg]);
5256 // 1111 1110 0010 1010 Rn Rm IMM32; movbu (d32,Rm),Rn
5257 8.0xfe+8.0x2a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movbu
5265 if (RM0 > 7 && RM0 < 12)
5266 srcreg = REG_A0 + RM0 - 8;
5267 else if (RM0 > 11 && RM0 < 16)
5268 srcreg = REG_D0 + RM0 - 12;
5270 srcreg = REG_E0 + RM0;
5272 if (RN2 > 7 && RN2 < 12)
5273 dstreg = REG_A0 + RN2 - 8;
5274 else if (RN2 > 11 && RN2 < 16)
5275 dstreg = REG_D0 + RN2 - 12;
5277 dstreg = REG_E0 + RN2;
5279 State.regs[dstreg] = load_byte (State.regs[srcreg]
5280 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5283 // 1111 1110 0011 1010 Rm Rn IMM32; movbu Rm,(d32,Rn)
5284 8.0xfe+8.0x3a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movbu
5292 if (RM2 > 7 && RM2 < 12)
5293 srcreg = REG_A0 + RM2 - 8;
5294 else if (RM2 > 11 && RM2 < 16)
5295 srcreg = REG_D0 + RM2 - 12;
5297 srcreg = REG_E0 + RM2;
5299 if (RN0 > 7 && RN0 < 12)
5300 dstreg = REG_A0 + RN0 - 8;
5301 else if (RN0 > 11 && RN0 < 16)
5302 dstreg = REG_D0 + RN0 - 12;
5304 dstreg = REG_E0 + RN0;
5306 store_byte (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5307 State.regs[srcreg]);
5310 // 1111 1110 0100 1010 Rn Rm IMM32; movhu (d32,Rm),Rn
5311 8.0xfe+8.0x4a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movhu
5319 if (RM0 > 7 && RM0 < 12)
5320 srcreg = REG_A0 + RM0 - 8;
5321 else if (RM0 > 11 && RM0 < 16)
5322 srcreg = REG_D0 + RM0 - 12;
5324 srcreg = REG_E0 + RM0;
5326 if (RN2 > 7 && RN2 < 12)
5327 dstreg = REG_A0 + RN2 - 8;
5328 else if (RN2 > 11 && RN2 < 16)
5329 dstreg = REG_D0 + RN2 - 12;
5331 dstreg = REG_E0 + RN2;
5333 State.regs[dstreg] = load_half (State.regs[srcreg]
5334 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5337 // 1111 1110 0101 1010 Rm Rn IMM32; movhu Rm,(d32,Rn)
5338 8.0xfe+8.0x5a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movhu
5346 if (RM2 > 7 && RM2 < 12)
5347 srcreg = REG_A0 + RM2 - 8;
5348 else if (RM2 > 11 && RM2 < 16)
5349 srcreg = REG_D0 + RM2 - 12;
5351 srcreg = REG_E0 + RM2;
5353 if (RN0 > 7 && RN0 < 12)
5354 dstreg = REG_A0 + RN0 - 8;
5355 else if (RN0 > 11 && RN0 < 16)
5356 dstreg = REG_D0 + RN0 - 12;
5358 dstreg = REG_E0 + RN0;
5360 store_half (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5361 State.regs[srcreg]);
5364 // 1111 1110 0110 1010 Rn Rm IMM32; mov (d32,Rm+),Rn
5365 8.0xfe+8.0x6a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::mov
5373 if (RM0 > 7 && RM0 < 12)
5374 srcreg = REG_A0 + RM0 - 8;
5375 else if (RM0 > 11 && RM0 < 16)
5376 srcreg = REG_D0 + RM0 - 12;
5378 srcreg = REG_E0 + RM0;
5380 if (RN2 > 7 && RN2 < 12)
5381 dstreg = REG_A0 + RN2 - 8;
5382 else if (RN2 > 11 && RN2 < 16)
5383 dstreg = REG_D0 + RN2 - 12;
5385 dstreg = REG_E0 + RN2;
5387 State.regs[dstreg] = load_word (State.regs[srcreg]
5388 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5389 State.regs[srcreg] += 4;
5392 // 1111 1110 0111 1010 Rm Rn IMM32; mov Rm,(d32,Rn+)
5393 8.0xfe+8.0x7a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5z:::mov
5401 if (RM2 > 7 && RM2 < 12)
5402 srcreg = REG_A0 + RM2 - 8;
5403 else if (RM2 > 11 && RM2 < 16)
5404 srcreg = REG_D0 + RM2 - 12;
5406 srcreg = REG_E0 + RM2;
5408 if (RN0 > 7 && RN0 < 12)
5409 dstreg = REG_A0 + RN0 - 8;
5410 else if (RN0 > 11 && RN0 < 16)
5411 dstreg = REG_D0 + RN0 - 12;
5413 dstreg = REG_E0 + RN0;
5415 store_word (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5416 State.regs[srcreg]);
5417 State.regs[dstreg] += 4;
5421 // 1111 1110 1000 1010 Rn 0000 IMM32; mov (d32,sp),Rn
5422 8.0xfe+8.0x8a+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::mov
5430 if (RN2 > 7 && RN2 < 12)
5431 dstreg = REG_A0 + RN2 - 8;
5432 else if (RN2 > 11 && RN2 < 16)
5433 dstreg = REG_D0 + RN2 - 12;
5435 dstreg = REG_E0 + RN2;
5437 State.regs[dstreg] = load_word (State.regs[REG_SP]
5438 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5441 // 1111 1110 1001 1010 Rm 0000 IMM32; mov Rm,(d32,sp)
5442 8.0xfe+8.0x9a+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::mov
5450 if (RM2 > 7 && RM2 < 12)
5451 srcreg = REG_A0 + RM2 - 8;
5452 else if (RM2 > 11 && RM2 < 16)
5453 srcreg = REG_D0 + RM2 - 12;
5455 srcreg = REG_E0 + RM2;
5457 store_word (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5458 State.regs[srcreg]);
5461 // 1111 1110 1010 1010 Rn 0000 IMM32; movbu (d32,sp),Rn
5462 8.0xfe+8.0xaa+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movbu
5470 if (RN2 > 7 && RN2 < 12)
5471 dstreg = REG_A0 + RN2 - 8;
5472 else if (RN2 > 11 && RN2 < 16)
5473 dstreg = REG_D0 + RN2 - 12;
5475 dstreg = REG_E0 + RN2;
5477 State.regs[dstreg] = load_byte (State.regs[REG_SP]
5478 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5481 // 1111 1110 1011 1010 Rm 0000 IMM32; movbu Rm,(d32,sp)
5482 8.0xfe+8.0xba+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movbu
5490 if (RM2 > 7 && RM2 < 12)
5491 srcreg = REG_A0 + RM2 - 8;
5492 else if (RM2 > 11 && RM2 < 16)
5493 srcreg = REG_D0 + RM2 - 12;
5495 srcreg = REG_E0 + RM2;
5497 store_byte (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5498 State.regs[srcreg]);
5501 // 1111 1110 1100 1010 Rn 0000 IMM32; movhu (d32,sp),Rn
5502 8.0xfe+8.0xca+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movhu
5510 if (RN2 > 7 && RN2 < 12)
5511 dstreg = REG_A0 + RN2 - 8;
5512 else if (RN2 > 11 && RN2 < 16)
5513 dstreg = REG_D0 + RN2 - 12;
5515 dstreg = REG_E0 + RN2;
5517 State.regs[dstreg] = load_half (State.regs[REG_SP]
5518 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5521 // 1111 1110 1101 1010 Rm 0000 IMM32; movhu Rm,(d32,sp)
5522 8.0xfe+8.0xda+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movhu
5530 if (RM2 > 7 && RM2 < 12)
5531 srcreg = REG_A0 + RM2 - 8;
5532 else if (RM2 > 11 && RM2 < 16)
5533 srcreg = REG_D0 + RM2 - 12;
5535 srcreg = REG_E0 + RM2;
5537 store_half (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5538 State.regs[srcreg]);
5542 // 1111 1110 1110 1010 Rn Rm IMM32; movhu (d32,Rm+),Rn
5543 8.0xfe+8.0xea+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::movhu
5551 if (RM0 > 7 && RM0 < 12)
5552 srcreg = REG_A0 + RM0 - 8;
5553 else if (RM0 > 11 && RM0 < 16)
5554 srcreg = REG_D0 + RM0 - 12;
5556 srcreg = REG_E0 + RM0;
5558 if (RN2 > 7 && RN2 < 12)
5559 dstreg = REG_A0 + RN2 - 8;
5560 else if (RN2 > 11 && RN2 < 16)
5561 dstreg = REG_D0 + RN2 - 12;
5563 dstreg = REG_E0 + RN2;
5565 State.regs[dstreg] = load_half (State.regs[srcreg]
5566 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5567 State.regs[srcreg] += 2;
5570 // 1111 1110 1111 1010 Rm Rn IMM32; movhu Rm,(d32,Rn+)
5571 8.0xfe+8.0xfa+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::movhu
5579 if (RM2 > 7 && RM2 < 12)
5580 srcreg = REG_A0 + RM2 - 8;
5581 else if (RM2 > 11 && RM2 < 16)
5582 srcreg = REG_D0 + RM2 - 12;
5584 srcreg = REG_E0 + RM2;
5586 if (RN0 > 7 && RN0 < 12)
5587 dstreg = REG_A0 + RN0 - 8;
5588 else if (RN0 > 11 && RN0 < 16)
5589 dstreg = REG_D0 + RN0 - 12;
5591 dstreg = REG_E0 + RN0;
5593 store_half (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
5594 State.regs[srcreg]);
5595 State.regs[dstreg] += 2;
5610 // 1111 1110 0000 1110 Rn 0000 IMM32; mov (abs32),Rn
5611 8.0xfe+8.0x0e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5h:::mov
5619 if (RN2 > 7 && RN2 < 12)
5620 dstreg = REG_A0 + RN2 - 8;
5621 else if (RN2 > 11 && RN2 < 16)
5622 dstreg = REG_D0 + RN2 - 12;
5624 dstreg = REG_E0 + RN2;
5626 State.regs[dstreg] = load_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5629 // 1111 1110 0001 1110 Rm 0000 IMM32; mov Rn,(abs32)
5630 8.0xfe+8.0x1e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::mov
5638 if (RM2 > 7 && RM2 < 12)
5639 srcreg = REG_A0 + RM2 - 8;
5640 else if (RM2 > 11 && RM2 < 16)
5641 srcreg = REG_D0 + RM2 - 12;
5643 srcreg = REG_E0 + RM2;
5645 store_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
5648 // 1111 1110 0020 1110 Rn 0000 IMM32; movbu (abs32),Rn
5649 8.0xfe+8.0x2e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5i:::movbu
5657 if (RN2 > 7 && RN2 < 12)
5658 dstreg = REG_A0 + RN2 - 8;
5659 else if (RN2 > 11 && RN2 < 16)
5660 dstreg = REG_D0 + RN2 - 12;
5662 dstreg = REG_E0 + RN2;
5664 State.regs[dstreg] = load_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5667 // 1111 1110 0011 1110 Rm 0000 IMM32; movbu Rn,(abs32)
5668 8.0xfe+8.0x3e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movbu
5676 if (RM2 > 7 && RM2 < 12)
5677 srcreg = REG_A0 + RM2 - 8;
5678 else if (RM2 > 11 && RM2 < 16)
5679 srcreg = REG_D0 + RM2 - 12;
5681 srcreg = REG_E0 + RM2;
5683 store_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
5686 // 1111 1110 0100 1110 Rn 0000 IMM32; movhu (abs32),Rn
5687 8.0xfe+8.0x4e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5j:::movhu
5695 if (RN2 > 7 && RN2 < 12)
5696 dstreg = REG_A0 + RN2 - 8;
5697 else if (RN2 > 11 && RN2 < 16)
5698 dstreg = REG_D0 + RN2 - 12;
5700 dstreg = REG_E0 + RN2;
5702 State.regs[dstreg] = load_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
5705 // 1111 1110 0101 1110 Rm 0000 IMM32; movhu Rn,(abs32)
5706 8.0xfe+8.0x5e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movhu
5714 if (RM2 > 7 && RM2 < 12)
5715 srcreg = REG_A0 + RM2 - 8;
5716 else if (RM2 > 11 && RM2 < 16)
5717 srcreg = REG_D0 + RM2 - 12;
5719 srcreg = REG_E0 + RM2;
5721 store_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);