3 // Given an extended register number, translate it into an index into the
4 // register array. This is necessary as the upper 8 extended registers are
5 // actually synonyms for the d0-d3/a0-a3 registers.
9 :function:::int:translate_rreg:int rreg
12 /* The higher register numbers actually correspond to the
13 basic machine's address and data registers. */
14 if (rreg > 7 && rreg < 12)
15 return REG_A0 + rreg - 8;
16 else if (rreg > 11 && rreg < 16)
17 return REG_D0 + rreg - 12;
22 // 1111 0000 0010 00An; mov USP,An
23 8.0xf0+4.0x2,00,2.AN0:D0m:::mov
28 State.regs[REG_A0 + AN0] = State.regs[REG_USP];
32 // 1111 0000 0010 01An; mov SSP,An
33 8.0xf0+4.0x2,01,2.AN0:D0n:::mov
38 State.regs[REG_A0 + AN0] = State.regs[REG_SSP];
42 // 1111 0000 0010 10An; mov MSP,An
43 8.0xf0+4.0x2,10,2.AN0:D0o:::mov
48 State.regs[REG_A0 + AN0] = State.regs[REG_MSP];
52 // 1111 0000 0010 11An; mov PC,An
53 8.0xf0+4.0x2,11,2.AN0:D0p:::mov
58 State.regs[REG_A0 + AN0] = PC;
62 // 1111 0000 0011 Am00; mov Am,USP
63 8.0xf0+4.0x3,2.AM1,00:D0q:::mov
68 State.regs[REG_USP] = State.regs[REG_A0 + AM1];
71 // 1111 0000 0011 Am01; mov Am,SSP
72 8.0xf0+4.0x3,2.AM1,01:D0r:::mov
77 State.regs[REG_SSP] = State.regs[REG_A0 + AM1];
80 // 1111 0000 0011 Am10; mov Am,MSP
81 8.0xf0+4.0x3,2.AM1,10:D0s:::mov
86 State.regs[REG_MSP] = State.regs[REG_A0 + AM1];
90 // 1111 0000 1110 imm4; syscall
91 8.0xf0+4.0xe,IMM4:D0t:::syscall
95 unsigned int sp, next_pc;
98 sp = State.regs[REG_SP];
99 next_pc = State.regs[REG_PC] + 2;
100 store_word (sp - 4, next_pc);
101 store_word (sp - 8, PSW);
102 State.regs[REG_PC] = 0x40000000 + IMM4 * 8;
107 // 1111 0010 1110 11Dn; mov EPSW,Dn
108 8.0xf2+4.0xe,11,2.DN0:D0u:::mov
113 State.regs[REG_D0 + DN0] = PSW;
117 // 1111 0010 1111 Dm01; mov Dm,EPSW
118 8.0xf2+4.0xf,2.DM1,01:D0v:::mov
123 PSW = State.regs[REG_D0 + DM1];
126 // 1111 0101 00Am Rn; mov Am,Rn
127 8.0xf5+00,2.AM1,4.RN0:D0w:::mov
131 int destreg = translate_rreg (SD_, RN0);
134 State.regs[destreg] = State.regs[REG_A0 + AM1];
137 // 1111 0101 01Dm Rn; mov Dm,Rn
138 8.0xf5+01,2.DM1,4.RN0:D0x:::mov
142 int destreg = translate_rreg (SD_, RN0);
145 State.regs[destreg] = State.regs[REG_D0 + DM1];
148 // 1111 0101 10Rm An; mov Rm,An
149 8.0xf5+10,4.RM1,2.AN0:D0y:::mov
153 int destreg = translate_rreg (SD_, RM1);
156 State.regs[REG_A0 + AN0] = State.regs[destreg];
159 // 1111 0101 11Rm Dn; mov Rm,Dn
160 8.0xf5+11,4.RM1,2.DN0:D0z:::mov
164 int destreg = translate_rreg (SD_, RM1);
167 State.regs[REG_D0 + DN0] = State.regs[destreg];
171 // 1111 1000 1100 1110 regs....; movm (USP),regs
172 8.0xf8+8.0xce+8.REGS:D1a:::movm
176 unsigned long usp = State.regs[REG_USP];
185 State.regs[REG_LAR] = load_word (usp);
187 State.regs[REG_LIR] = load_word (usp);
189 State.regs[REG_MDR] = load_word (usp);
191 State.regs[REG_A0 + 1] = load_word (usp);
193 State.regs[REG_A0] = load_word (usp);
195 State.regs[REG_D0 + 1] = load_word (usp);
197 State.regs[REG_D0] = load_word (usp);
203 State.regs[REG_A0 + 3] = load_word (usp);
209 State.regs[REG_A0 + 2] = load_word (usp);
215 State.regs[REG_D0 + 3] = load_word (usp);
221 State.regs[REG_D0 + 2] = load_word (usp);
225 /* start-sanitize-am33 */
226 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
230 /* Need to restore MDQR, MCRH, MCRL, and MCVF */
232 State.regs[REG_E0 + 1] = load_word (usp);
234 State.regs[REG_E0 + 0] = load_word (usp);
240 State.regs[REG_E0 + 7] = load_word (usp);
242 State.regs[REG_E0 + 6] = load_word (usp);
244 State.regs[REG_E0 + 5] = load_word (usp);
246 State.regs[REG_E0 + 4] = load_word (usp);
252 State.regs[REG_E0 + 3] = load_word (usp);
254 State.regs[REG_E0 + 2] = load_word (usp);
258 /* end-sanitize-am33 */
260 /* And make sure to update the stack pointer. */
261 State.regs[REG_USP] = usp;
264 // 1111 1000 1100 1111 regs....; movm (USP),regs
265 8.0xf8+8.0xcf+8.REGS:D1b:::movm
269 unsigned long usp = State.regs[REG_USP];
272 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
277 store_word (usp, State.regs[REG_E0 + 2]);
279 store_word (usp, State.regs[REG_E0 + 3]);
285 store_word (usp, State.regs[REG_E0 + 4]);
287 store_word (usp, State.regs[REG_E0 + 5]);
289 store_word (usp, State.regs[REG_E0 + 6]);
291 store_word (usp, State.regs[REG_E0 + 7]);
297 store_word (usp, State.regs[REG_E0 + 0]);
299 store_word (usp, State.regs[REG_E0 + 1]);
301 /* Need to save MDQR, MCRH, MCRL, and MCVF */
304 /* end-sanitize-am33 */
309 store_word (usp, State.regs[REG_D0 + 2]);
315 store_word (usp, State.regs[REG_D0 + 3]);
321 store_word (usp, State.regs[REG_A0 + 2]);
327 store_word (usp, State.regs[REG_A0 + 3]);
333 store_word (usp, State.regs[REG_D0]);
335 store_word (usp, State.regs[REG_D0 + 1]);
337 store_word (usp, State.regs[REG_A0]);
339 store_word (usp, State.regs[REG_A0 + 1]);
341 store_word (usp, State.regs[REG_MDR]);
343 store_word (usp, State.regs[REG_LIR]);
345 store_word (usp, State.regs[REG_LAR]);
349 /* And make sure to update the stack pointer. */
350 State.regs[REG_USP] = usp;
353 // 1111 1100 1111 1100 imm32...; and imm32,EPSW
354 8.0xfc+8.0xfc+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:4a:::and
359 PSW &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
362 // 1111 1100 1111 1101 imm32...; or imm32,EPSW
363 8.0xfc+8.0xfd+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::or
368 PSW |= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
371 // 1111 1001 0000 1000 Rm Rn; mov Rm,Rn (Rm != Rn)
372 8.0xf9+8.0x08+4.RM2,4.RN0!RM2:D1g:::mov
380 srcreg = translate_rreg (SD_, RM2);
381 dstreg = translate_rreg (SD_, RN0);
382 State.regs[dstreg] = State.regs[srcreg];
385 // 1111 1001 0001 1000 Rn Rn; ext Rn
386 8.0xf9+8.0x18+4.RN0,4.RN2=RN0:D1:::ext
393 srcreg = translate_rreg (SD_, RN0);
394 if (State.regs[srcreg] & 0x80000000)
395 State.regs[REG_MDR] = -1;
397 State.regs[REG_MDR] = 0;
400 // 1111 1001 0010 1000 Rm Rn; extb Rm,Rn
401 8.0xf9+8.0x28+4.RM2,4.RN0!RM2:D1:::extb
408 srcreg = translate_rreg (SD_, RM2);
409 dstreg = translate_rreg (SD_, RN0);
410 State.regs[dstreg] = EXTEND8 (State.regs[srcreg]);
413 // 1111 1001 0011 1000 Rm Rn; extbu Rm,Rn
414 8.0xf9+8.0x38+4.RM2,4.RN0!RM2:D1:::extbu
421 srcreg = translate_rreg (SD_, RM2);
422 dstreg = translate_rreg (SD_, RN0);
423 State.regs[dstreg] = State.regs[srcreg] & 0xff;
426 // 1111 1001 0100 1000 Rm Rn; exth Rm,Rn
427 8.0xf9+8.0x48+4.RM2,4.RN0!RM2:D1:::exth
434 srcreg = translate_rreg (SD_, RM2);
435 dstreg = translate_rreg (SD_, RN0);
436 State.regs[dstreg] = EXTEND16 (State.regs[srcreg]);
439 // 1111 1001 0101 1000 Rm Rn; exthu Rm,Rn
440 8.0xf9+8.0x58+4.RM2,4.RN0!RM2:D1:::exthu
447 srcreg = translate_rreg (SD_, RM2);
448 dstreg = translate_rreg (SD_, RN0);
449 State.regs[dstreg] = State.regs[srcreg] & 0xffff;
452 // 1111 1001 0110 1000 Rn Rn; clr Rn
453 8.0xf9+8.0x68+4.RM2,4.RN0=RM2:D1:::clr
460 dstreg = translate_rreg (SD_, RN0);
461 State.regs[dstreg] = 0;
463 PSW &= ~(PSW_V | PSW_C | PSW_N);
466 // 1111 1001 0111 1000 Rm Rn; add Rm,Rn
467 8.0xf9+8.0x78+4.RM2,4.RN0:D1b:::add
474 srcreg = translate_rreg (SD_, RM2);
475 dstreg = translate_rreg (SD_, RN0);
476 genericAdd (State.regs[srcreg], dstreg);
479 // 1111 1001 1000 1000 Rm Rn; addc Rm,Rn
480 8.0xf9+8.0x88+4.RM2,4.RN0:D1b:::addc
486 unsigned long reg1, reg2, sum;
489 srcreg = translate_rreg (SD_, RM2);
490 dstreg = translate_rreg (SD_, RN0);
492 reg1 = State.regs[srcreg];
493 reg2 = State.regs[dstreg];
494 sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
495 State.regs[dstreg] = sum;
497 z = ((PSW & PSW_Z) != 0) && (sum == 0);
498 n = (sum & 0x80000000);
499 c = (sum < reg1) || (sum < reg2);
500 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
501 && (reg2 & 0x80000000) != (sum & 0x80000000));
503 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
504 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
505 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
508 // 1111 1001 1001 1000 Rm Rn; sub Rm,Rn
509 8.0xf9+8.0x98+4.RM2,4.RN0:D1b:::sub
516 srcreg = translate_rreg (SD_, RM2);
517 dstreg = translate_rreg (SD_, RN0);
518 genericSub (State.regs[srcreg], dstreg);
521 // 1111 1001 1010 1000 Rm Rn; subc Rm,Rn
522 8.0xf9+8.0xa8+4.RM2,4.RN0:D1b:::subc
528 unsigned long reg1, reg2, difference;
531 srcreg = translate_rreg (SD_, RM2);
532 dstreg = translate_rreg (SD_, RN0);
534 reg1 = State.regs[srcreg];
535 reg2 = State.regs[dstreg];
536 difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
537 State.regs[dstreg] = difference;
539 z = ((PSW & PSW_Z) != 0) && (difference == 0);
540 n = (difference & 0x80000000);
542 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
543 && (reg2 & 0x80000000) != (difference & 0x80000000));
545 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
546 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
547 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
550 // 1111 1001 1011 1000 Rn Rn; inc Rn
551 8.0xf9+8.0xb8+4.RN0,4.RN2=RN0:D1:::inc
558 dstreg = translate_rreg (SD_, RN0);
559 genericAdd (1, dstreg);
562 // 1111 1001 1101 1000 Rn Rn; inc Rn
563 8.0xf9+8.0xc8+4.RN0,4.RN2=RN0:D1:::inc4
570 dstreg = translate_rreg (SD_, RN0);
571 State.regs[dstreg] += 4;
574 // 1111 1001 1101 1000 Rm Rn; cmp Rm,Rn
575 8.0xf9+8.0xd8+4.RM2,4.RN0:D1:::cmp
579 int srcreg1, srcreg2;
582 srcreg1 = translate_rreg (SD_, RN0);
583 srcreg2 = translate_rreg (SD_, RM2);
584 genericCmp (State.regs[srcreg2], State.regs[srcreg1]);
587 // 1111 1001 1110 1000 XRm Rn; mov XRm,Rn
588 8.0xf9+8.0xe8+4.XRM2,4.RN0:D1l:::mov
595 dstreg = translate_rreg (SD_, RN0);
599 State.regs[dstreg] = State.regs[REG_SP];
605 // 1111 1001 1111 1000 Rm XRn; mov Rm,XRn
606 8.0xf9+8.0xf8+4.RM2,4.XRN0:D1m:::mov
613 srcreg = translate_rreg (SD_, RM2);
617 State.regs[REG_SP] = State.regs[srcreg];
623 // 1111 1001 0000 1001 Rm Rn; and Rm,Rn
624 8.0xf9+8.0x09+4.RM2,4.RN0:D1a:::and
633 srcreg = translate_rreg (SD_, RM2);
634 dstreg = translate_rreg (SD_, RN0);
636 State.regs[dstreg] &= State.regs[srcreg];
637 z = (State.regs[dstreg] == 0);
638 n = (State.regs[dstreg] & 0x80000000) != 0;
639 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
640 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
643 // 1111 1001 0001 1001 Rm Rn; or Rm,Rn
644 8.0xf9+8.0x19+4.RM2,4.RN0:D1a:::or
652 srcreg = translate_rreg (SD_, RM2);
653 dstreg = translate_rreg (SD_, RN0);
655 State.regs[dstreg] |= State.regs[srcreg];
656 z = (State.regs[dstreg] == 0);
657 n = (State.regs[dstreg] & 0x80000000) != 0;
658 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
659 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
662 // 1111 1001 0010 1001 Rm Rn; xor Rm,Rn
663 8.0xf9+8.0x29+4.RM2,4.RN0:D1a:::xor
671 srcreg = translate_rreg (SD_, RM2);
672 dstreg = translate_rreg (SD_, RN0);
674 State.regs[dstreg] ^= State.regs[srcreg];
675 z = (State.regs[dstreg] == 0);
676 n = (State.regs[dstreg] & 0x80000000) != 0;
677 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
678 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
681 // 1111 1001 0011 1001 Rn Rn; not Rn
682 8.0xf9+8.0x39+4.RM2,4.RN0=RM2:D1:::not
690 dstreg = translate_rreg (SD_, RN0);
692 State.regs[dstreg] = ~State.regs[dstreg];
693 z = (State.regs[dstreg] == 0);
694 n = (State.regs[dstreg] & 0x80000000) != 0;
695 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
696 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
699 // 1111 1001 0100 1001 Rm Rn; asr Rm,Rn
700 8.0xf9+8.0x49+4.RM2,4.RN0:D1a:::asr
709 srcreg = translate_rreg (SD_, RM2);
710 dstreg = translate_rreg (SD_, RN0);
712 temp = State.regs[dstreg];
714 temp >>= State.regs[srcreg];
715 State.regs[dstreg] = temp;
716 z = (State.regs[dstreg] == 0);
717 n = (State.regs[dstreg] & 0x80000000) != 0;
718 PSW &= ~(PSW_Z | PSW_N | PSW_C);
719 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
722 // 1111 1001 0101 1001 Rm Rn; lsr Rm,Rn
723 8.0xf9+8.0x59+4.RM2,4.RN0:D1a:::lsr
732 srcreg = translate_rreg (SD_, RM2);
733 dstreg = translate_rreg (SD_, RN0);
735 c = State.regs[dstreg] & 1;
736 State.regs[dstreg] >>= State.regs[srcreg];
737 z = (State.regs[dstreg] == 0);
738 n = (State.regs[dstreg] & 0x80000000) != 0;
739 PSW &= ~(PSW_Z | PSW_N | PSW_C);
740 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
743 // 1111 1001 0110 1001 Rm Rn; asl Rm,Rn
744 8.0xf9+8.0x69+4.RM2,4.RN0:D1a:::asl
752 srcreg = translate_rreg (SD_, RM2);
753 dstreg = translate_rreg (SD_, RN0);
755 State.regs[dstreg] <<= State.regs[srcreg];
756 z = (State.regs[dstreg] == 0);
757 n = (State.regs[dstreg] & 0x80000000) != 0;
758 PSW &= ~(PSW_Z | PSW_N);
759 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
762 // 1111 1001 0111 1001 Rn Rn; asl2 Rn
763 8.0xf9+8.0x79+4.RM2,4.RN0=RM2:D1:::asl2
771 dstreg = translate_rreg (SD_, RN0);
773 State.regs[dstreg] <<= 2;
774 z = (State.regs[dstreg] == 0);
775 n = (State.regs[dstreg] & 0x80000000) != 0;
776 PSW &= ~(PSW_Z | PSW_N);
777 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
780 // 1111 1001 1000 1001 Rn Rn; ror Rn
781 8.0xf9+8.0x89+4.RM2,4.RN0=RM2:D1:::ror
790 dstreg = translate_rreg (SD_, RN0);
792 value = State.regs[dstreg];
796 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
797 State.regs[dstreg] = value;
799 n = (value & 0x80000000) != 0;
800 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
801 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
804 // 1111 1001 1001 1001 Rn Rn; rol Rn
805 8.0xf9+8.0x99+4.RM2,4.RN0=RM2:D1:::rol
814 dstreg = translate_rreg (SD_, RN0);
816 value = State.regs[dstreg];
817 c = (value & 0x80000000) ? 1 : 0;
820 value |= ((PSW & PSW_C) != 0);
821 State.regs[dstreg] = value;
823 n = (value & 0x80000000) != 0;
824 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
825 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
828 // 1111 1001 1010 1001 Rm Rn; mul Rm,Rn
829 8.0xf9+8.0xa9+4.RM2,4.RN0:D1b:::mul
834 unsigned long long temp;
838 srcreg = translate_rreg (SD_, RM2);
839 dstreg = translate_rreg (SD_, RN0);
841 temp = ((signed64)(signed32)State.regs[dstreg]
842 * (signed64)(signed32)State.regs[srcreg]);
843 State.regs[dstreg] = temp & 0xffffffff;
844 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
845 z = (State.regs[dstreg] == 0);
846 n = (State.regs[dstreg] & 0x80000000) != 0;
847 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
848 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
851 // 1111 1001 1011 1001 Rm Rn; mulu Rm,Rn
852 8.0xf9+8.0xb9+4.RM2,4.RN0:D1b:::mulu
857 unsigned long long temp;
861 srcreg = translate_rreg (SD_, RM2);
862 dstreg = translate_rreg (SD_, RN0);
864 temp = ((unsigned64)State.regs[dstreg]
865 * (unsigned64)State.regs[srcreg]);
866 State.regs[dstreg] = temp & 0xffffffff;
867 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
868 z = (State.regs[dstreg] == 0);
869 n = (State.regs[dstreg] & 0x80000000) != 0;
870 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
871 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
874 // 1111 1001 1100 1001 Rm Rn; div Rm,Rn
875 8.0xf9+8.0xc9+4.RM2,4.RN0:D1b:::div
884 srcreg = translate_rreg (SD_, RM2);
885 dstreg = translate_rreg (SD_, RN0);
887 temp = State.regs[REG_MDR];
889 temp |= State.regs[dstreg];
890 State.regs[REG_MDR] = temp % (signed32)State.regs[srcreg];
891 temp /= (signed32)State.regs[srcreg];
892 State.regs[dstreg] = temp & 0xffffffff;
893 z = (State.regs[dstreg] == 0);
894 n = (State.regs[dstreg] & 0x80000000) != 0;
895 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
896 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
899 // 1111 1001 1101 1001 Rm Rn; divu Rm,Rn
900 8.0xf9+8.0xd9+4.RM2,4.RN0:D1b:::divu
905 unsigned long long temp;
909 srcreg = translate_rreg (SD_, RM2);
910 dstreg = translate_rreg (SD_, RN0);
912 temp = State.regs[REG_MDR];
914 temp |= State.regs[dstreg];
915 State.regs[REG_MDR] = temp % State.regs[srcreg];
916 temp /= State.regs[srcreg];
917 State.regs[dstreg] = temp & 0xffffffff;
918 z = (State.regs[dstreg] == 0);
919 n = (State.regs[dstreg] & 0x80000000) != 0;
920 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
921 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
925 // 1111 1001 0000 1010 Rm Rn; mov (Rm),Rn
926 8.0xf9+8.0x0a+4.RN2,4.RM0:D1h:::mov
933 srcreg = translate_rreg (SD_, RM0);
934 dstreg = translate_rreg (SD_, RN2);
935 State.regs[dstreg] = load_word (State.regs[srcreg]);
938 // 1111 1001 0001 1010 Rm Rn; mov Rm,(Rn)
939 8.0xf9+8.0x1a+4.RM2,4.RN0:D1i:::mov
946 srcreg = translate_rreg (SD_, RM2);
947 dstreg = translate_rreg (SD_, RN0);
948 store_word (State.regs[dstreg], State.regs[srcreg]);
951 // 1111 1001 0010 1010 Rm Rn; movbu (Rm),Rn
952 8.0xf9+8.0x2a+4.RN2,4.RM0:D1g:::movbu
959 srcreg = translate_rreg (SD_, RM0);
960 dstreg = translate_rreg (SD_, RN2);
961 State.regs[dstreg] = load_byte (State.regs[srcreg]);
964 // 1111 1001 0011 1010 Rm Rn; movbu Rm,(Rn)
965 8.0xf9+8.0x3a+4.RM2,4.RN0:D1i:::movbu
972 srcreg = translate_rreg (SD_, RM2);
973 dstreg = translate_rreg (SD_, RN0);
974 store_byte (State.regs[dstreg], State.regs[srcreg]);
977 // 1111 1001 0100 1010 Rm Rn; movhu (Rm),Rn
978 8.0xf9+8.0x4a+4.RN2,4.RM0:D1g:::movhu
985 srcreg = translate_rreg (SD_, RM0);
986 dstreg = translate_rreg (SD_, RN2);
987 State.regs[dstreg] = load_half (State.regs[srcreg]);
990 // 1111 1001 0101 1010 Rm Rn; movhu Rm,(Rn)
991 8.0xf9+8.0x5a+4.RM2,4.RN0:D1i:::movhu
998 srcreg = translate_rreg (SD_, RM2);
999 dstreg = translate_rreg (SD_, RN0);
1000 store_half (State.regs[dstreg], State.regs[srcreg]);
1003 // 1111 1001 0110 1010 Rm Rn; mov (Rm+),Rn
1004 8.0xf9+8.0x6a+4.RN2,4.RM0:D1y:::mov
1011 srcreg = translate_rreg (SD_, RM0);
1012 dstreg = translate_rreg (SD_, RN2);
1013 State.regs[dstreg] = load_word (State.regs[srcreg]);
1014 State.regs[srcreg] += 4;
1017 // 1111 1001 0111 1010 Rm Rn; mov Rm,(Rn+)
1018 8.0xf9+8.0x7a+4.RM2,4.RN0:D1z:::mov
1025 srcreg = translate_rreg (SD_, RM2);
1026 dstreg = translate_rreg (SD_, RN0);
1027 store_word (State.regs[dstreg], State.regs[srcreg]);
1028 State.regs[dstreg] += 4;
1031 // 1111 1001 1000 1010 Rn 0000; mov (sp),Rn
1032 8.0xf9+8.0x8a+4.RN2,4.0000:D1j:::mov
1039 dstreg = translate_rreg (SD_, RN2);
1040 State.regs[dstreg] = load_word (State.regs[REG_SP]);
1043 // 1111 1001 1001 1010 Rm 0000; mov Rm, (sp)
1044 8.0xf9+8.0x9a+4.RM2,4.0000:D1k:::mov
1051 srcreg = translate_rreg (SD_, RM2);
1052 store_word (State.regs[REG_SP], State.regs[srcreg]);
1055 // 1111 1001 1010 1010 Rn 0000; mobvu (sp),Rn
1056 8.0xf9+8.0xaa+4.RN2,4.0000:D1j:::movbu
1063 dstreg = translate_rreg (SD_, RN2);
1064 State.regs[dstreg] = load_byte (State.regs[REG_SP]);
1067 // 1111 1001 1011 1010 Rm 0000; movbu Rm, (sp)
1068 8.0xf9+8.0xba+4.RM2,4.0000:D1k:::movbu
1075 srcreg = translate_rreg (SD_, RM2);
1076 store_byte (State.regs[REG_SP], State.regs[srcreg]);
1079 // 1111 1001 1000 1100 Rn 0000; movhu (sp),Rn
1080 8.0xf9+8.0xca+4.RN2,4.0000:D1j:::movhu
1087 dstreg = translate_rreg (SD_, RN2);
1088 State.regs[dstreg] = load_half (State.regs[REG_SP]);
1091 // 1111 1001 1001 1101 Rm 0000; movhu Rm, (sp)
1092 8.0xf9+8.0xda+4.RM2,4.0000:D1k:::movhu
1099 srcreg = translate_rreg (SD_, RM2);
1100 store_half (State.regs[REG_SP], State.regs[srcreg]);
1103 // 1111 1001 1110 1010 Rm Rn; movhu (Rm+),Rn
1104 8.0xf9+8.0xea+4.RN2,4.RM0:D1y:::movhu
1111 srcreg = translate_rreg (SD_, RM0);
1112 dstreg = translate_rreg (SD_, RN2);
1113 State.regs[dstreg] = load_half (State.regs[srcreg]);
1114 State.regs[srcreg] += 2;
1117 // 1111 1001 1111 1010 Rm Rn; movhu Rm,(Rn+)
1118 8.0xf9+8.0xfa+4.RM2,4.RN0:D1z:::movhu
1125 srcreg = translate_rreg (SD_, RM2);
1126 dstreg = translate_rreg (SD_, RN0);
1127 store_half (State.regs[dstreg], State.regs[srcreg]);
1128 State.regs[dstreg] += 2;
1132 // 1111 1001 0000 1011 Rm Rn; mac Rm,Rn
1133 8.0xf9+8.0x0b+4.RM2,4.RN0:D1:::mac
1137 int srcreg1, srcreg2;
1138 long long temp, sum;
1142 srcreg1 = translate_rreg (SD_, RM2);
1143 srcreg2 = translate_rreg (SD_, RN0);
1145 temp = ((signed64)(signed32)State.regs[srcreg2]
1146 * (signed64)(signed32)State.regs[srcreg1]);
1147 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1148 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1149 State.regs[REG_MCRL] = sum;
1152 sum = State.regs[REG_MCRH] + temp + c;
1153 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1154 && (temp & 0x80000000) != (sum & 0x80000000));
1155 State.regs[REG_MCRH] = sum;
1157 State.regs[REG_MCVF] = 1;
1160 // 1111 1001 0001 1011 Rm Rn; macu Rm,Rn
1161 8.0xf9+8.0x1b+4.RM2,4.RN0:D1:::macu
1165 int srcreg1, srcreg2;
1166 unsigned long long temp, sum;
1170 srcreg1 = translate_rreg (SD_, RM2);
1171 srcreg2 = translate_rreg (SD_, RN0);
1173 temp = ((unsigned64)State.regs[srcreg2]
1174 * (unsigned64)State.regs[srcreg1]);
1175 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1176 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1177 State.regs[REG_MCRL] = sum;
1180 sum = State.regs[REG_MCRH] + temp + c;
1181 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1182 && (temp & 0x80000000) != (sum & 0x80000000));
1183 State.regs[REG_MCRH] = sum;
1185 State.regs[REG_MCVF] = 1;
1188 // 1111 1001 0010 1011 Rm Rn; macb Rm,Rn
1189 8.0xf9+8.0x2b+4.RM2,4.RN0:D1:::macb
1193 int srcreg1, srcreg2;
1198 srcreg1 = translate_rreg (SD_, RM2);
1199 srcreg2 = translate_rreg (SD_, RN0);
1201 temp = ((signed32)(signed8)(State.regs[srcreg2] & 0xff)
1202 * (signed32)(signed8)(State.regs[srcreg1] & 0xff));
1203 sum = State.regs[REG_MCRL] + temp;
1204 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1205 && (temp & 0x80000000) != (sum & 0x80000000));
1206 State.regs[REG_MCRL] = sum;
1208 State.regs[REG_MCVF] = 1;
1211 // 1111 1001 0011 1011 Rm Rn; macbu Rm,Rn
1212 8.0xf9+8.0x3b+4.RM2,4.RN0:D1:::macbu
1216 int srcreg1, srcreg2;
1217 long long temp, sum;
1221 srcreg1 = translate_rreg (SD_, RM2);
1222 srcreg2 = translate_rreg (SD_, RN0);
1224 temp = ((unsigned32)(State.regs[srcreg2] & 0xff)
1225 * (unsigned32)(State.regs[srcreg1] & 0xff));
1226 sum = State.regs[REG_MCRL] + temp;
1227 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1228 && (temp & 0x80000000) != (sum & 0x80000000));
1229 State.regs[REG_MCRL] = sum;
1231 State.regs[REG_MCVF] = 1;
1234 // 1111 1001 0100 1011 Rm Rn; mach Rm,Rn
1235 8.0xf9+8.0x4b+4.RM2,4.RN0:D1:::mach
1239 int srcreg1, srcreg2;
1240 long long temp, sum;
1244 srcreg1 = translate_rreg (SD_, RM2);
1245 srcreg2 = translate_rreg (SD_, RN0);
1247 temp = ((unsigned64)(signed16)(State.regs[srcreg2] & 0xffff)
1248 * (unsigned64)(signed16)(State.regs[srcreg1] & 0xffff));
1249 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1250 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1251 State.regs[REG_MCRL] = sum;
1254 sum = State.regs[REG_MCRH] + temp + c;
1255 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1256 && (temp & 0x80000000) != (sum & 0x80000000));
1257 State.regs[REG_MCRH] = sum;
1259 State.regs[REG_MCVF] = 1;
1262 // 1111 1001 0101 1011 Rm Rn; machu Rm,Rn
1263 8.0xf9+8.0x5b+4.RM2,4.RN0:D1:::machu
1267 int srcreg1, srcreg2;
1268 long long temp, sum;
1272 srcreg1 = translate_rreg (SD_, RM2);
1273 srcreg2 = translate_rreg (SD_, RN0);
1275 temp = ((unsigned64)(State.regs[srcreg2] & 0xffff)
1276 * (unsigned64)(State.regs[srcreg1] & 0xffff));
1277 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1278 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1279 State.regs[REG_MCRL] = sum;
1282 sum = State.regs[REG_MCRH] + temp + c;
1283 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1284 && (temp & 0x80000000) != (sum & 0x80000000));
1285 State.regs[REG_MCRH] = sum;
1287 State.regs[REG_MCVF] = 1;
1290 // 1111 1001 0110 1011 Rm Rn; dmach Rm,Rn
1291 8.0xf9+8.0x6b+4.RM2,4.RN0:D1:::dmach
1295 int srcreg1, srcreg2;
1296 long temp, temp2, sum;
1300 srcreg1 = translate_rreg (SD_, RM2);
1301 srcreg2 = translate_rreg (SD_, RN0);
1303 temp = ((signed32)(signed16)(State.regs[srcreg2] & 0xffff)
1304 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
1305 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
1306 * (signed32)(signed16)((State.regs[srcreg2] >> 16) & 0xffff));
1307 sum = temp + temp2 + State.regs[REG_MCRL];
1308 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1309 && (temp & 0x80000000) != (sum & 0x80000000));
1310 State.regs[REG_MCRL] = sum;
1312 State.regs[REG_MCVF] = 1;
1315 // 1111 1001 0111 1011 Rm Rn; dmachu Rm,Rn
1316 8.0xf9+8.0x7b+4.RM2,4.RN0:D1:::dmachu
1320 int srcreg1, srcreg2;
1321 unsigned long temp, temp2, sum;
1325 srcreg1 = translate_rreg (SD_, RM2);
1326 srcreg2 = translate_rreg (SD_, RN0);
1328 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
1329 * (unsigned32)(State.regs[srcreg1] & 0xffff));
1330 temp2 = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
1331 * (unsigned32)((State.regs[srcreg2] >> 16) & 0xffff));
1332 sum = temp + temp2 + State.regs[REG_MCRL];
1333 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1334 && (temp & 0x80000000) != (sum & 0x80000000));
1335 State.regs[REG_MCRL] = sum;
1337 State.regs[REG_MCVF] = 1;
1340 // 1111 1001 1000 1011 Rm Rn; dmulh Rm,Rn
1341 8.0xf9+8.0x8b+4.RM2,4.RN0:D1:::dmulh
1349 srcreg = translate_rreg (SD_, RM2);
1350 dstreg = translate_rreg (SD_, RN0);
1352 temp = ((signed32)(signed16)(State.regs[dstreg] & 0xffff)
1353 * (signed32)(signed16)(State.regs[srcreg] & 0xffff));
1354 State.regs[REG_MDRQ] = temp;
1355 temp = ((signed32)(signed16)((State.regs[dstreg] >> 16) & 0xffff)
1356 * (signed32)(signed16)((State.regs[srcreg] >>16) & 0xffff));
1357 State.regs[dstreg] = temp;
1360 // 1111 1001 1001 1011 Rm Rn; dmulhu Rm,Rn
1361 8.0xf9+8.0x9b+4.RM2,4.RN0:D1:::dumachu
1369 srcreg = translate_rreg (SD_, RM2);
1370 dstreg = translate_rreg (SD_, RN0);
1372 temp = ((unsigned32)(State.regs[dstreg] & 0xffff)
1373 * (unsigned32)(State.regs[srcreg] & 0xffff));
1374 State.regs[REG_MDRQ] = temp;
1375 temp = ((unsigned32)((State.regs[dstreg] >> 16) & 0xffff)
1376 * (unsigned32)((State.regs[srcreg] >>16) & 0xffff));
1377 State.regs[dstreg] = temp;
1380 // 1111 1001 1010 1011 Rm Rn; sat16 Rm,Rn
1381 8.0xf9+8.0xab+4.RM2,4.RN0:D1:::sat16
1389 srcreg = translate_rreg (SD_, RM2);
1390 dstreg = translate_rreg (SD_, RN0);
1392 value = State.regs[srcreg];
1394 if (value >= 0x7fff)
1395 State.regs[dstreg] = 0x7fff;
1396 else if (value <= 0xffff8000)
1397 State.regs[dstreg] = 0xffff8000;
1399 State.regs[dstreg] = value;
1401 n = (State.regs[dstreg] & 0x8000) != 0;
1402 z = (State.regs[dstreg] == 0);
1403 PSW &= ~(PSW_Z | PSW_N);
1404 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1407 // 1111 1001 1011 1011 Rm Rn; mcste Rm,Rn
1408 8.0xf9+8.0xbb+4.RM2,4.RN0:D1:::mcste
1415 srcreg = translate_rreg (SD_, RM2);
1416 dstreg = translate_rreg (SD_, RN0);
1418 PSW &= ~(PSW_V | PSW_C);
1419 PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
1421 /* 32bit saturation. */
1422 if (State.regs[srcreg] == 0x20)
1426 tmp = State.regs[REG_MCRH];
1428 tmp += State.regs[REG_MCRL];
1430 if (tmp > 0x7fffffff)
1431 State.regs[dstreg] = 0x7fffffff;
1432 else if (tmp < 0xffffffff80000000LL)
1433 State.regs[dstreg] = 0x80000000;
1435 State.regs[dstreg] = tmp;
1437 /* 16bit saturation */
1438 else if (State.regs[srcreg] == 0x10)
1442 tmp = State.regs[REG_MCRH];
1444 tmp += State.regs[REG_MCRL];
1447 State.regs[dstreg] = 0x7fff;
1448 else if (tmp < 0xffffffffffff8000LL)
1449 State.regs[dstreg] = 0x8000;
1451 State.regs[dstreg] = tmp;
1453 /* 8 bit saturation */
1454 else if (State.regs[srcreg] == 0x8)
1458 tmp = State.regs[REG_MCRH];
1460 tmp += State.regs[REG_MCRL];
1463 State.regs[dstreg] = 0x7f;
1464 else if (tmp < 0xffffffffffffff80LL)
1465 State.regs[dstreg] = 0x80;
1467 State.regs[dstreg] = tmp;
1469 /* 9 bit saturation */
1470 else if (State.regs[srcreg] == 0x9)
1474 tmp = State.regs[REG_MCRH];
1476 tmp += State.regs[REG_MCRL];
1479 State.regs[dstreg] = 0x80;
1480 else if (tmp < 0xffffffffffffff81LL)
1481 State.regs[dstreg] = 0x81;
1483 State.regs[dstreg] = tmp;
1485 /* 9 bit saturation */
1486 else if (State.regs[srcreg] == 0x30)
1490 tmp = State.regs[REG_MCRH];
1492 tmp += State.regs[REG_MCRL];
1494 if (tmp > 0x7fffffffffffLL)
1495 tmp = 0x7fffffffffffLL;
1496 else if (tmp < 0xffff800000000000LL)
1497 tmp = 0xffff800000000000LL;
1500 State.regs[dstreg] = tmp;
1504 // 1111 1001 1100 1011 Rm Rn; swap Rm,Rn
1505 8.0xf9+8.0xcb+4.RM2,4.RN0:D1:::swap
1512 srcreg = translate_rreg (SD_, RM2);
1513 dstreg = translate_rreg (SD_, RN0);
1515 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 24)
1516 | (((State.regs[srcreg] >> 8) & 0xff) << 16)
1517 | (((State.regs[srcreg] >> 16) & 0xff) << 8)
1518 | ((State.regs[srcreg] >> 24) & 0xff));
1521 // 1111 1101 1101 1011 Rm Rn; swaph Rm,Rn
1522 8.0xf9+8.0xdb+4.RM2,4.RN0:D1:::swaph
1529 srcreg = translate_rreg (SD_, RM2);
1530 dstreg = translate_rreg (SD_, RN0);
1532 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 8)
1533 | ((State.regs[srcreg] >> 8) & 0xff)
1534 | (((State.regs[srcreg] >> 16) & 0xff) << 24)
1535 | (((State.regs[srcreg] >> 24) & 0xff) << 16));
1538 // 1111 1001 1110 1011 Rm Rn; swhw Rm,Rn
1539 8.0xf9+8.0xeb+4.RM2,4.RN0:D1:::swhw
1546 srcreg = translate_rreg (SD_, RM2);
1547 dstreg = translate_rreg (SD_, RN0);
1549 State.regs[dstreg] = (((State.regs[srcreg] & 0xffff) << 16)
1550 | ((State.regs[srcreg] >> 16) & 0xffff));
1553 // 1111 1001 1111 1011 Rm Rn; bsch Rm,Rn
1554 8.0xf9+8.0xfb+4.RM2,4.RN0:D1:::bsch
1563 srcreg = translate_rreg (SD_, RM2);
1564 dstreg = translate_rreg (SD_, RN0);
1566 temp = State.regs[srcreg];
1567 start = (State.regs[dstreg] & 0x1f) - 1;
1571 for (i = start; i >= 0; i--)
1573 if (temp & (1 << i))
1576 State.regs[dstreg] = i;
1584 State.regs[dstreg] = 0;
1587 PSW |= (c ? PSW_C : 0);
1591 // 1111 1011 0000 1000 Rn Rn IMM8; mov IMM8,Rn
1592 8.0xfb+8.0x08+4.RM2,4.RN0=RM2+8.IMM8:D2j:::mov
1599 dstreg = translate_rreg (SD_, RN0);
1600 State.regs[dstreg] = EXTEND8 (IMM8);
1603 // 1111 1011 0001 1000 Rn Rn IMM8; movu IMM8,Rn
1604 8.0xfb+8.0x18+4.RM2,4.RN0=RM2+8.IMM8:D2:::movu
1611 dstreg = translate_rreg (SD_, RN0);
1612 State.regs[dstreg] = IMM8 & 0xff;
1615 // 1111 1011 0111 1000 Rn Rn IMM8; add IMM8,Rn
1616 8.0xfb+8.0x78+4.RM2,4.RN0=RM2+8.IMM8:D2d:::add
1623 dstreg = translate_rreg (SD_, RN0);
1624 genericAdd (EXTEND8 (IMM8), dstreg);
1627 // 1111 1011 1000 1000 Rn Rn IMM8; addc IMM8,Rn
1628 8.0xfb+8.0x88+4.RM2,4.RN0=RM2+8.IMM8:D2d:::addc
1634 unsigned long reg1, reg2, sum;
1637 dstreg = translate_rreg (SD_, RN0);
1639 imm = EXTEND8 (IMM8);
1640 reg2 = State.regs[dstreg];
1641 sum = imm + reg2 + ((PSW & PSW_C) != 0);
1642 State.regs[dstreg] = sum;
1644 z = ((PSW & PSW_Z) != 0) && (sum == 0);
1645 n = (sum & 0x80000000);
1646 c = (sum < imm) || (sum < reg2);
1647 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1648 && (reg2 & 0x80000000) != (sum & 0x80000000));
1650 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1651 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1652 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1655 // 1111 1011 1001 1000 Rn Rn IMM8; sub IMM8,Rn
1656 8.0xfb+8.0x98+4.RM2,4.RN0=RM2+8.IMM8:D2d:::sub
1663 dstreg = translate_rreg (SD_, RN0);
1665 genericSub (EXTEND8 (IMM8), dstreg);
1668 // 1111 1011 1010 1000 Rn Rn IMM8; subc IMM8,Rn
1669 8.0xfb+8.0xa8+4.RM2,4.RN0=RM2+8.IMM8:D2d:::subc
1675 unsigned long reg1, reg2, difference;
1678 dstreg = translate_rreg (SD_, RN0);
1680 imm = EXTEND8 (IMM8);
1681 reg2 = State.regs[dstreg];
1682 difference = reg2 - imm - ((PSW & PSW_C) != 0);
1683 State.regs[dstreg] = difference;
1685 z = ((PSW & PSW_Z) != 0) && (difference == 0);
1686 n = (difference & 0x80000000);
1688 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1689 && (reg2 & 0x80000000) != (difference & 0x80000000));
1691 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1692 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1693 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1696 // 1111 1011 1101 1000 Rn Rn IMM8; cmp IMM8,Rn
1697 8.0xfb+8.0xd8+4.RM2,4.RN0=RM2+8.IMM8:D2b:::cmp
1704 srcreg = translate_rreg (SD_, RN0);
1705 genericCmp (EXTEND8 (IMM8), State.regs[srcreg]);
1708 // 1111 1011 1111 1000 XRn XRn IMM8; mov IMM8,XRn
1709 8.0xfb+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM8:D2k:::mov
1718 State.regs[REG_SP] = IMM8;
1723 // 1111 1011 0000 1001 Rn Rn IMM8; and IMM8,Rn
1724 8.0xfb+8.0x09+4.RM2,4.RN0=RM2+8.IMM8:D2d:::and
1732 dstreg = translate_rreg (SD_, RN0);
1734 State.regs[dstreg] &= (IMM8 & 0xff);
1735 z = (State.regs[dstreg] == 0);
1736 n = (State.regs[dstreg] & 0x80000000) != 0;
1737 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1738 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1741 // 1111 1011 0001 1001 Rn Rn IMM8; or IMM8,Rn
1742 8.0xfb+8.0x19+4.RM2,4.RN0=RM2+8.IMM8:D2d:::or
1750 dstreg = translate_rreg (SD_, RN0);
1752 State.regs[dstreg] |= (IMM8 & 0xff);
1753 z = (State.regs[dstreg] == 0);
1754 n = (State.regs[dstreg] & 0x80000000) != 0;
1755 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1756 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1759 // 1111 1011 0010 1001 Rn Rn IMM8; xor IMM8,Rn
1760 8.0xfb+8.0x29+4.RM2,4.RN0=RM2+8.IMM8:D2d:::xor
1768 dstreg = translate_rreg (SD_, RN0);
1770 State.regs[dstreg] ^= (IMM8 & 0xff);
1771 z = (State.regs[dstreg] == 0);
1772 n = (State.regs[dstreg] & 0x80000000) != 0;
1773 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1774 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1777 // 1111 1011 0100 1001 Rn Rn IMM8; asr IMM8,Rn
1778 8.0xfb+8.0x49+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asr
1787 dstreg = translate_rreg (SD_, RN0);
1789 temp = State.regs[dstreg];
1791 temp >>= (IMM8 & 0xff);
1792 State.regs[dstreg] = temp;
1793 z = (State.regs[dstreg] == 0);
1794 n = (State.regs[dstreg] & 0x80000000) != 0;
1795 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1796 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1799 // 1111 1011 0101 1001 Rn Rn IMM8; lsr IMM8,Rn
1800 8.0xfb+8.0x59+4.RM2,4.RN0=RM2+8.IMM8:D2a:::lsr
1808 dstreg = translate_rreg (SD_, RN0);
1810 c = State.regs[dstreg] & 1;
1811 State.regs[dstreg] >>= (IMM8 & 0xff);
1812 z = (State.regs[dstreg] == 0);
1813 n = (State.regs[dstreg] & 0x80000000) != 0;
1814 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1815 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1818 // 1111 1011 0110 1001 Rn Rn IMM8; asl IMM8,Rn
1819 8.0xfb+8.0x69+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asl
1827 dstreg = translate_rreg (SD_, RN0);
1829 State.regs[dstreg] <<= (IMM8 & 0xff);
1830 z = (State.regs[dstreg] == 0);
1831 n = (State.regs[dstreg] & 0x80000000) != 0;
1832 PSW &= ~(PSW_Z | PSW_N);
1833 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1836 // 1111 1011 1010 1001 Rn Rn IMM8; mul IMM8,Rn
1837 8.0xfb+8.0xa9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mul
1842 unsigned long long temp;
1846 dstreg = translate_rreg (SD_, RN0);
1848 temp = ((signed64)(signed32)State.regs[dstreg]
1849 * (signed64)(signed32)EXTEND8 (IMM8));
1850 State.regs[dstreg] = temp & 0xffffffff;
1851 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1852 z = (State.regs[dstreg] == 0);
1853 n = (State.regs[dstreg] & 0x80000000) != 0;
1854 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1855 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1858 // 1111 1011 1011 1001 Rn Rn IMM8; mulu IMM8,Rn
1859 8.0xfb+8.0xb9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mulu
1864 unsigned long long temp;
1868 dstreg = translate_rreg (SD_, RN0);
1870 temp = ((unsigned64)State.regs[dstreg]
1871 * (unsigned64)(IMM8 & 0xff));
1872 State.regs[dstreg] = temp & 0xffffffff;
1873 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1874 z = (State.regs[dstreg] == 0);
1875 n = (State.regs[dstreg] & 0x80000000) != 0;
1876 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1877 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1880 // 1111 1011 1110 1001 Rn Rn IMM8; btst imm8,Rn
1881 8.0xfb+8.0xe9+4.RN2,4.RM0=RN2+8.IMM8:D2l:::btst
1888 srcreg = translate_rreg (SD_, RM0);
1889 genericBtst(IMM8, State.regs[srcreg]);
1892 // 1111 1011 0000 1010 Rn Rm IMM8; mov (d8,Rm),Rn
1893 8.0xfb+8.0x0a+4.RN2,4.RM0+8.IMM8:D2l:::mov
1900 srcreg = translate_rreg (SD_, RM0);
1901 dstreg = translate_rreg (SD_, RN2);
1902 State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
1905 // 1111 1011 0001 1010 Rn Rm IMM8; mov Rm,(d8,Rn)
1906 8.0xfb+8.0x1a+4.RM2,4.RN0+8.IMM8:D2m:::mov
1912 srcreg = translate_rreg (SD_, RM2);
1913 dstreg = translate_rreg (SD_, RN0);
1914 store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1917 // 1111 1011 0010 1010 Rn Rm IMM8; movbu (d8,Rm),Rn
1918 8.0xfb+8.0x2a+4.RN2,4.RM0+8.IMM8:D2l:::movbu
1924 srcreg = translate_rreg (SD_, RM0);
1925 dstreg = translate_rreg (SD_, RN2);
1926 State.regs[dstreg] = load_byte (State.regs[srcreg] + EXTEND8 (IMM8));
1929 // 1111 1011 0011 1010 Rn Rm IMM8; movbu Rm,(d8,Rn)
1930 8.0xfb+8.0x3a+4.RM2,4.RN0+8.IMM8:D2m:::movbu
1936 srcreg = translate_rreg (SD_, RM2);
1937 dstreg = translate_rreg (SD_, RN0);
1938 store_byte (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1941 // 1111 1011 0100 1010 Rn Rm IMM8; movhu (d8,Rm),Rn
1942 8.0xfb+8.0x4a+4.RN2,4.RM0+8.IMM8:D2l:::movhu
1948 srcreg = translate_rreg (SD_, RM0);
1949 dstreg = translate_rreg (SD_, RN2);
1950 State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
1953 // 1111 1011 0101 1010 Rn Rm IMM8; movhu Rm,(d8,Rn)
1954 8.0xfb+8.0x5a+4.RM2,4.RN0+8.IMM8:D2m:::movhu
1960 srcreg = translate_rreg (SD_, RM2);
1961 dstreg = translate_rreg (SD_, RN0);
1962 store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1965 // 1111 1011 0110 1010 Rn Rm IMM8; mov (d8,Rm+),Rn
1966 8.0xfb+8.0x6a+4.RN2,4.RM0+8.IMM8:D2y:::mov
1973 srcreg = translate_rreg (SD_, RM0);
1974 dstreg = translate_rreg (SD_, RN2);
1975 State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
1976 State.regs[srcreg] += 4;
1979 // 1111 1011 0111 1010 Rn Rm IMM8; mov Rm,(d8,Rn+)
1980 8.0xfb+8.0x7a+4.RM2,4.RN0+8.IMM8:D2z:::mov
1986 srcreg = translate_rreg (SD_, RM2);
1987 dstreg = translate_rreg (SD_, RN0);
1988 store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1989 State.regs[dstreg] += 4;
1993 // 1111 1011 1000 1010 Rn 0000 IMM8; mov (d8,sp),Rn
1994 8.0xfb+8.0x8a+4.RN2,4.0x0+8.IMM8:D2n:::mov
2000 dstreg = translate_rreg (SD_, RN2);
2001 State.regs[dstreg] = load_word (State.regs[REG_SP] + EXTEND8 (IMM8));
2004 // 1111 1011 1001 1010 Rm 0000 IMM8; mov Rm,(d8,Rn)
2005 8.0xfb+8.0x9a+4.RM2,4.0x0+8.IMM8:D2o:::mov
2011 srcreg = translate_rreg (SD_, RM2);
2012 store_word (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2015 // 1111 1011 1010 1010 Rn Rm IMM8; movbu (d8,sp),Rn
2016 8.0xfb+8.0xaa+4.RN2,4.0x0+8.IMM8:D2n:::movbu
2022 dstreg = translate_rreg (SD_, RN2);
2023 State.regs[dstreg] = load_byte (State.regs[REG_SP] + EXTEND8 (IMM8));
2026 // 1111 1011 1011 1010 Rn Rm IMM8; movbu Rm,(sp,Rn)
2027 8.0xfb+8.0xba+4.RM2,4.0x0+8.IMM8:D2o:::movbu
2033 srcreg = translate_rreg (SD_, RM2);
2034 store_byte (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2037 // 1111 1011 1100 1010 Rn Rm IMM8; movhu (d8,sp),Rn
2038 8.0xfb+8.0xca+4.RN2,4.0x0+8.IMM8:D2n:::movhu
2044 dstreg = translate_rreg (SD_, RN2);
2045 State.regs[dstreg] = load_half (State.regs[REG_SP] + EXTEND8 (IMM8));
2048 // 1111 1011 1101 1010 Rn Rm IMM8; movhu Rm,(d8,sp)
2049 8.0xfb+8.0xda+4.RM2,4.0x0+8.IMM8:D2o:::movhu
2055 srcreg = translate_rreg (SD_, RM2);
2056 store_half (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2059 // 1111 1011 1110 1010 Rn Rm IMM8; movhu (d8,Rm+),Rn
2060 8.0xfb+8.0xea+4.RN2,4.RM0+8.IMM8:D2y:::movhu
2067 srcreg = translate_rreg (SD_, RM0);
2068 dstreg = translate_rreg (SD_, RN2);
2069 State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
2070 State.regs[srcreg] += 2;
2073 // 1111 1011 1111 1010 Rn Rm IMM8; movhu Rm,(d8,Rn+)
2074 8.0xfb+8.0xfa+4.RM2,4.RN0+8.IMM8:D2z:::movhu
2080 srcreg = translate_rreg (SD_, RM2);
2081 dstreg = translate_rreg (SD_, RN0);
2082 store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
2083 State.regs[dstreg] += 2;
2087 // 1111 1011 0000 1011 Rn Rn IMM8; mac imm8,Rn
2088 8.0xfb+8.0x0b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mac
2092 long long temp, sum;
2096 srcreg = translate_rreg (SD_, RN2);
2098 temp = ((signed64)(signed32)EXTEND8 (IMM8)
2099 * (signed64)(signed32)State.regs[srcreg]);
2100 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2101 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2102 State.regs[REG_MCRL] = sum;
2105 sum = State.regs[REG_MCRH] + temp + c;
2106 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2107 && (temp & 0x80000000) != (sum & 0x80000000));
2108 State.regs[REG_MCRH] = sum;
2110 State.regs[REG_MCVF] = 1;
2113 // 1111 1011 0001 1011 Rn Rn IMM8; macu imm8,Rn
2114 8.0xfb+8.0x1b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macu
2118 long long temp, sum;
2122 srcreg = translate_rreg (SD_, RN2);
2124 temp = ((unsigned64) (IMM8)
2125 * (unsigned64)State.regs[srcreg]);
2126 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2127 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2128 State.regs[REG_MCRL] = sum;
2131 sum = State.regs[REG_MCRH] + temp + c;
2132 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2133 && (temp & 0x80000000) != (sum & 0x80000000));
2134 State.regs[REG_MCRH] = sum;
2136 State.regs[REG_MCVF] = 1;
2139 // 1111 1011 0010 1011 Rn Rn IMM8; macb imm8,Rn
2140 8.0xfb+8.0x2b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macb
2144 long long temp, sum;
2148 srcreg = translate_rreg (SD_, RN2);
2150 temp = ((signed64)(signed8)EXTEND8 (IMM8)
2151 * (signed64)(signed8)State.regs[srcreg] & 0xff);
2152 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2153 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2154 State.regs[REG_MCRL] = sum;
2157 sum = State.regs[REG_MCRH] + temp + c;
2158 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2159 && (temp & 0x80000000) != (sum & 0x80000000));
2160 State.regs[REG_MCRH] = sum;
2162 State.regs[REG_MCVF] = 1;
2165 // 1111 1011 0011 1011 Rn Rn IMM8; macbu imm8,Rn
2166 8.0xfb+8.0x3b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macbu
2170 long long temp, sum;
2174 srcreg = translate_rreg (SD_, RN2);
2176 temp = ((unsigned64) (IMM8)
2177 * (unsigned64)State.regs[srcreg] & 0xff);
2178 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2179 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2180 State.regs[REG_MCRL] = sum;
2183 sum = State.regs[REG_MCRH] + temp + c;
2184 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2185 && (temp & 0x80000000) != (sum & 0x80000000));
2186 State.regs[REG_MCRH] = sum;
2188 State.regs[REG_MCVF] = 1;
2191 // 1111 1011 0100 1011 Rn Rn IMM8; mach imm8,Rn
2192 8.0xfb+8.0x4b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mach
2196 long long temp, sum;
2200 srcreg = translate_rreg (SD_, RN2);
2202 temp = ((signed64)(signed16)EXTEND8 (IMM8)
2203 * (signed64)(signed16)State.regs[srcreg] & 0xffff);
2204 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2205 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2206 State.regs[REG_MCRL] = sum;
2209 sum = State.regs[REG_MCRH] + temp + c;
2210 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2211 && (temp & 0x80000000) != (sum & 0x80000000));
2212 State.regs[REG_MCRH] = sum;
2214 State.regs[REG_MCVF] = 1;
2217 // 1111 1011 0101 1011 Rn Rn IMM8; machu imm8,Rn
2218 8.0xfb+8.0x5b+4.RN2,4.RN0=RN2+8.IMM8:D2:::machu
2222 long long temp, sum;
2226 srcreg = translate_rreg (SD_, RN2);
2228 temp = ((unsigned64) (IMM8)
2229 * (unsigned64)State.regs[srcreg] & 0xffff);
2230 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2231 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2232 State.regs[REG_MCRL] = sum;
2235 sum = State.regs[REG_MCRH] + temp + c;
2236 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2237 && (temp & 0x80000000) != (sum & 0x80000000));
2238 State.regs[REG_MCRH] = sum;
2240 State.regs[REG_MCVF] = 1;
2243 // 1111 1011 1011 1011 Rn Rn IMM8; mcste imm8,Rn
2244 8.0xfb+8.0xbb+4.RN2,4.RN0=RN2+8.IMM8:D2:::mcste
2250 dstreg = translate_rreg (SD_, RN0);
2252 PSW &= ~(PSW_V | PSW_C);
2253 PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
2255 /* 32bit saturation. */
2260 tmp = State.regs[REG_MCRH];
2262 tmp += State.regs[REG_MCRL];
2264 if (tmp > 0x7fffffff)
2265 State.regs[dstreg] = 0x7fffffff;
2266 else if (tmp < 0xffffffff80000000LL)
2267 State.regs[dstreg] = 0x80000000;
2269 State.regs[dstreg] = tmp;
2271 /* 16bit saturation */
2272 else if (IMM8 == 0x10)
2276 tmp = State.regs[REG_MCRH];
2278 tmp += State.regs[REG_MCRL];
2281 State.regs[dstreg] = 0x7fff;
2282 else if (tmp < 0xffffffffffff8000LL)
2283 State.regs[dstreg] = 0x8000;
2285 State.regs[dstreg] = tmp;
2287 /* 8 bit saturation */
2288 else if (IMM8 == 0x8)
2292 tmp = State.regs[REG_MCRH];
2294 tmp += State.regs[REG_MCRL];
2297 State.regs[dstreg] = 0x7f;
2298 else if (tmp < 0xffffffffffffff80LL)
2299 State.regs[dstreg] = 0x80;
2301 State.regs[dstreg] = tmp;
2303 /* 9 bit saturation */
2304 else if (IMM8 == 0x9)
2308 tmp = State.regs[REG_MCRH];
2310 tmp += State.regs[REG_MCRL];
2313 State.regs[dstreg] = 0x80;
2314 else if (tmp < 0xffffffffffffff81LL)
2315 State.regs[dstreg] = 0x81;
2317 State.regs[dstreg] = tmp;
2319 /* 9 bit saturation */
2320 else if (IMM8 == 0x30)
2324 tmp = State.regs[REG_MCRH];
2326 tmp += State.regs[REG_MCRL];
2328 if (tmp > 0x7fffffffffffLL)
2329 tmp = 0x7fffffffffffLL;
2330 else if (tmp < 0xffff800000000000LL)
2331 tmp = 0xffff800000000000LL;
2334 State.regs[dstreg] = tmp;
2338 // 1111 1011 0111 1100 Rm Rn Rd; add Rm,Rn,Rd
2339 8.0xfb+8.0x7c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::add
2344 unsigned long sum, source1, source2;
2345 int srcreg1, srcreg2, dstreg;
2348 srcreg1 = translate_rreg (SD_, RM2);
2349 srcreg2 = translate_rreg (SD_, RN0);
2350 dstreg = translate_rreg (SD_, RD0);
2352 source1 = State.regs[srcreg1];
2353 source2 = State.regs[srcreg2];
2354 sum = source1 + source2;
2355 State.regs[dstreg] = sum;
2358 n = (sum & 0x80000000);
2359 c = (sum < source1) || (sum < source2);
2360 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2361 && (source1 & 0x80000000) != (sum & 0x80000000));
2363 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2364 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2365 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2368 // 1111 1011 1000 1100 Rm Rn Rd; addc Rm,Rn,Rd
2369 8.0xfb+8.0x8c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::addc
2374 unsigned long sum, source1, source2;
2375 int srcreg1, srcreg2, dstreg;
2378 srcreg1 = translate_rreg (SD_, RM2);
2379 srcreg2 = translate_rreg (SD_, RN0);
2380 dstreg = translate_rreg (SD_, RD0);
2382 source1 = State.regs[srcreg1];
2383 source2 = State.regs[srcreg2];
2384 sum = source1 + source2 + ((PSW & PSW_C) != 0);
2385 State.regs[dstreg] = sum;
2387 z = ((PSW & PSW_Z) != 0) && (sum == 0);
2388 n = (sum & 0x80000000);
2389 c = (sum < source1) || (sum < source2);
2390 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2391 && (source1 & 0x80000000) != (sum & 0x80000000));
2393 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2394 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2395 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2398 // 1111 1011 1001 1100 Rm Rn Rd; sub Rm,Rn,Rd
2399 8.0xfb+8.0x9c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::sub
2404 unsigned long difference, source1, source2;
2405 int srcreg1, srcreg2, dstreg;
2408 srcreg1 = translate_rreg (SD_, RM2);
2409 srcreg2 = translate_rreg (SD_, RN0);
2410 dstreg = translate_rreg (SD_, RD0);
2412 source1 = State.regs[srcreg1];
2413 source2 = State.regs[srcreg2];
2414 difference = source2 - source1;
2415 State.regs[dstreg] = difference;
2417 z = (difference == 0);
2418 n = (difference & 0x80000000);
2419 c = (source1 > source1);
2420 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2421 && (source1 & 0x80000000) != (difference & 0x80000000));
2423 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2424 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2425 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2428 // 1111 1011 1010 1100 Rm Rn Rd; subc Rm,Rn,Rd
2429 8.0xfb+8.0xac+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::subc
2434 unsigned long difference, source1, source2;
2435 int srcreg1, srcreg2, dstreg;
2438 srcreg1 = translate_rreg (SD_, RM2);
2439 srcreg2 = translate_rreg (SD_, RN0);
2440 dstreg = translate_rreg (SD_, RD0);
2442 source1 = State.regs[srcreg1];
2443 source2 = State.regs[srcreg2];
2444 difference = source2 - source1 - ((PSW & PSW_C) != 0);
2445 State.regs[dstreg] = difference;
2447 z = ((PSW & PSW_Z) != 0) && (difference == 0);
2448 n = (difference & 0x80000000);
2449 c = (source1 > source2);
2450 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2451 && (source1 & 0x80000000) != (difference & 0x80000000));
2453 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2454 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2455 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2458 // 1111 1011 0000 1101 Rm Rn Rd; and Rm,Rn,Rd
2459 8.0xfb+8.0x0d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::and
2464 int srcreg1, srcreg2, dstreg;
2467 srcreg1 = translate_rreg (SD_, RM2);
2468 srcreg2 = translate_rreg (SD_, RN0);
2469 dstreg = translate_rreg (SD_, RD0);
2471 State.regs[dstreg] = State.regs[srcreg1] & State.regs[srcreg2];
2473 z = (State.regs[dstreg] == 0);
2474 n = (State.regs[dstreg] & 0x80000000);
2476 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2477 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2480 // 1111 1011 0001 1101 Rm Rn Rd; or Rm,Rn,Rd
2481 8.0xfb+8.0x1d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::or
2486 int srcreg1, srcreg2, dstreg;
2489 srcreg1 = translate_rreg (SD_, RM2);
2490 srcreg2 = translate_rreg (SD_, RN0);
2491 dstreg = translate_rreg (SD_, RD0);
2493 State.regs[dstreg] = State.regs[srcreg1] | State.regs[srcreg2];
2495 z = (State.regs[dstreg] == 0);
2496 n = (State.regs[dstreg] & 0x80000000);
2498 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2499 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2502 // 1111 1011 0010 1101 Rm Rn Rd; xor Rm,Rn,Rd
2503 8.0xfb+8.0x2d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::xor
2508 int srcreg1, srcreg2, dstreg;
2511 srcreg1 = translate_rreg (SD_, RM2);
2512 srcreg2 = translate_rreg (SD_, RN0);
2513 dstreg = translate_rreg (SD_, RD0);
2515 State.regs[dstreg] = State.regs[srcreg1] ^ State.regs[srcreg2];
2517 z = (State.regs[dstreg] == 0);
2518 n = (State.regs[dstreg] & 0x80000000);
2520 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2521 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2524 // 1111 1011 0100 1101 Rm Rn Rd; asr Rm,Rn,Rd
2525 8.0xfb+8.0x4d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asr
2531 int srcreg1, srcreg2, dstreg;
2534 srcreg1 = translate_rreg (SD_, RM2);
2535 srcreg2 = translate_rreg (SD_, RN0);
2536 dstreg = translate_rreg (SD_, RD0);
2538 temp = State.regs[srcreg2];
2540 temp >>= State.regs[srcreg1];
2541 State.regs[dstreg] = temp;
2543 z = (State.regs[dstreg] == 0);
2544 n = (State.regs[dstreg] & 0x80000000);
2546 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2547 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2550 // 1111 1011 0101 1101 Rm Rn Rd; lsr Rm,Rn,Rd
2551 8.0xfb+8.0x5d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::lsr
2556 int srcreg1, srcreg2, dstreg;
2559 srcreg1 = translate_rreg (SD_, RM2);
2560 srcreg2 = translate_rreg (SD_, RN0);
2561 dstreg = translate_rreg (SD_, RD0);
2563 c = State.regs[srcreg2] & 1;
2564 State.regs[dstreg] = State.regs[srcreg2] >> State.regs[srcreg1];
2566 z = (State.regs[dstreg] == 0);
2567 n = (State.regs[dstreg] & 0x80000000);
2569 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2570 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2573 // 1111 1011 0110 1101 Rm Rn Rd; asl Rm,Rn,Rd
2574 8.0xfb+8.0x6d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asl
2579 int srcreg1, srcreg2, dstreg;
2582 srcreg1 = translate_rreg (SD_, RM2);
2583 srcreg2 = translate_rreg (SD_, RN0);
2584 dstreg = translate_rreg (SD_, RD0);
2586 State.regs[dstreg] = State.regs[srcreg2] << State.regs[srcreg1];;
2588 z = (State.regs[dstreg] == 0);
2589 n = (State.regs[dstreg] & 0x80000000);
2591 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2592 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2595 // 1111 1011 1010 1101 Rm Rn Rd1 Rd2; mul Rm,Rn,Rd1,Rd2
2596 8.0xfb+8.0xad+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mul
2600 int srcreg1, srcreg2, dstreg1, dstreg2;
2601 signed long long temp;
2605 srcreg1 = translate_rreg (SD_, RM2);
2606 srcreg2 = translate_rreg (SD_, RN0);
2607 dstreg1 = translate_rreg (SD_, RD0);
2608 dstreg2 = translate_rreg (SD_, RD2);
2610 temp = ((signed64)(signed32)State.regs[srcreg1]
2611 * (signed64)(signed32)State.regs[srcreg2]);
2612 State.regs[dstreg1] = temp & 0xffffffff;
2613 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
2615 z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
2616 n = (State.regs[dstreg2] & 0x80000000);
2618 PSW &= ~(PSW_Z | PSW_N);
2619 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2622 // 1111 1011 1011 1101 Rm Rn Rd1 Rd2; mulu Rm,Rn,Rd1,Rd2
2623 8.0xfb+8.0xbd+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mulu
2627 int srcreg1, srcreg2, dstreg1, dstreg2;
2628 signed long long temp;
2632 srcreg1 = translate_rreg (SD_, RM2);
2633 srcreg2 = translate_rreg (SD_, RN0);
2634 dstreg1 = translate_rreg (SD_, RD0);
2635 dstreg2 = translate_rreg (SD_, RD2);
2637 temp = ((unsigned64)State.regs[srcreg1]
2638 * (unsigned64)State.regs[srcreg2]);
2639 State.regs[dstreg1] = temp & 0xffffffff;
2640 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
2642 z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
2643 n = (State.regs[dstreg2] & 0x80000000);
2645 PSW &= ~(PSW_Z | PSW_N);
2646 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2649 // 1111 1011 0000 1110 Rn 0000 abs8 ; mov (abs8),Rn
2650 8.0xfb+8.0x0e+4.RN2,4.0x0+8.IMM8:D2p:::mov
2657 dstreg = translate_rreg (SD_, RN2);
2658 State.regs[dstreg] = load_word (IMM8);
2661 // 1111 1011 0001 1110 Rm 0000 abs8 ; mov Rn,(abs8)
2662 8.0xfb+8.0x1e+4.RM2,4.0x0+8.IMM8:D2q:::mov
2669 srcreg = translate_rreg (SD_, RM2);
2670 store_word (IMM8, State.regs[srcreg]);
2673 // 1111 1011 0010 1110 Rn 0000 abs8 ; movbu (abs8),Rn
2674 8.0xfb+8.0x2e+4.RN2,4.0x0+8.IMM8:D2p:::movbu
2681 dstreg = translate_rreg (SD_, RN2);
2682 State.regs[dstreg] = load_byte (IMM8);
2685 // 1111 1011 0011 1110 Rm 0000 abs8 ; movbu Rn,(abs8)
2686 8.0xfb+8.0x3e+4.RM2,4.0x0+8.IMM8:D2q:::movbu
2693 srcreg = translate_rreg (SD_, RM2);
2694 store_byte (IMM8, State.regs[srcreg]);
2697 // 1111 1011 0100 1110 Rn 0000 abs8 ; movhu (abs8),Rn
2698 8.0xfb+8.0x4e+4.RN2,4.0x0+8.IMM8:D2p:::movhu
2705 dstreg = translate_rreg (SD_, RN2);
2706 State.regs[dstreg] = load_half (IMM8);
2709 // 1111 1011 0101 1110 Rm 0000 abs8 ; movhu Rn,(abs8)
2710 8.0xfb+8.0x5e+4.RM2,4.0x0+8.IMM8:D2q:::movhu
2717 srcreg = translate_rreg (SD_, RM2);
2718 store_half (IMM8, State.regs[srcreg]);
2721 // 1111 1011 1000 1110 Ri Rm Rn; mov (Ri,Rm),Rn
2722 8.0xfb+8.0x8e+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::mov
2726 int srcreg1, srcreg2, dstreg;
2729 srcreg1 = translate_rreg (SD_, RM0);
2730 srcreg1 = translate_rreg (SD_, RI0);
2731 dstreg = translate_rreg (SD_, RN0);
2732 State.regs[dstreg] = load_word (State.regs[srcreg1] + State.regs[srcreg2]);
2735 // 1111 1011 1001 1110 Ri Rm Rn; mov Rn,(Ri,Rm)
2736 8.0xfb+8.0x9e+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::mov
2740 int srcreg, dstreg1, dstreg2;
2743 srcreg = translate_rreg (SD_, RM0);
2744 dstreg1 = translate_rreg (SD_, RI0);
2745 dstreg2 = translate_rreg (SD_, RN0);
2746 store_word (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2749 // 1111 1011 1010 1110 Ri Rm Rn; movbu (Ri,Rm),Rn
2750 8.0xfb+8.0xae+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movbu
2754 int srcreg1, srcreg2, dstreg;
2757 srcreg1 = translate_rreg (SD_, RM0);
2758 srcreg1 = translate_rreg (SD_, RI0);
2759 dstreg = translate_rreg (SD_, RN0);
2760 State.regs[dstreg] = load_byte (State.regs[srcreg1] + State.regs[srcreg2]);
2763 // 1111 1011 1011 1110 Ri Rm Rn; movbu Rn,(Ri,Rm)
2764 8.0xfb+8.0xbe+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movbu
2768 int srcreg, dstreg1, dstreg2;
2771 srcreg = translate_rreg (SD_, RM0);
2772 dstreg1 = translate_rreg (SD_, RI0);
2773 dstreg2 = translate_rreg (SD_, RN0);
2774 store_byte (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2777 // 1111 1011 1100 1110 Ri Rm Rn; movhu (Ri,Rm),Rn
2778 8.0xfb+8.0xce+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movhu
2782 int srcreg1, srcreg2, dstreg;
2785 srcreg1 = translate_rreg (SD_, RM0);
2786 srcreg1 = translate_rreg (SD_, RI0);
2787 dstreg = translate_rreg (SD_, RN0);
2788 State.regs[dstreg] = load_half (State.regs[srcreg1] + State.regs[srcreg2]);
2791 // 1111 1011 1101 1110 Ri Rm Rn; movhu Rn,(Ri,Rm)
2792 8.0xfb+8.0xde+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movhu
2796 int srcreg, dstreg1, dstreg2;
2799 srcreg = translate_rreg (SD_, RM0);
2800 dstreg1 = translate_rreg (SD_, RI0);
2801 dstreg2 = translate_rreg (SD_, RN0);
2802 store_half (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2805 // 1111 1011 0000 1111 Rm Rn Rd1 Rd2; mac Rm,Rn,Rd1,Rd2
2806 8.0xfb+8.0x0f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mac
2810 int srcreg1, srcreg2, dstreg1, dstreg2;
2811 signed long long temp;
2816 srcreg1 = translate_rreg (SD_, RM2);
2817 srcreg2 = translate_rreg (SD_, RN0);
2818 dstreg1 = translate_rreg (SD_, RD0);
2819 dstreg2 = translate_rreg (SD_, RD2);
2821 temp = ((signed64)(signed32)State.regs[srcreg1]
2822 * (signed64)(signed32)State.regs[srcreg2]);
2824 sum = State.regs[dstreg2] + (temp & 0xffffffff);
2825 c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
2826 State.regs[dstreg2] = sum;
2829 sum = State.regs[dstreg1] + temp + c;
2830 v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
2831 && (temp & 0x80000000) != (sum & 0x80000000));
2832 State.regs[dstreg1] = sum;
2835 State.regs[REG_MCVF] = 1;
2837 PSW |= (( v ? PSW_V : 0));
2841 // 1111 1011 0001 1111 Rm Rn Rd1 Rd2; macu Rm,Rn,Rd1,Rd2
2842 8.0xfb+8.0x1f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::macu
2846 int srcreg1, srcreg2, dstreg1, dstreg2;
2847 signed long long temp;
2852 srcreg1 = translate_rreg (SD_, RM2);
2853 srcreg2 = translate_rreg (SD_, RN0);
2854 dstreg1 = translate_rreg (SD_, RD0);
2855 dstreg2 = translate_rreg (SD_, RD2);
2857 temp = ((unsigned64)State.regs[srcreg1]
2858 * (unsigned64)State.regs[srcreg2]);
2860 sum = State.regs[dstreg2] + (temp & 0xffffffff);
2861 c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
2862 State.regs[dstreg2] = sum;
2865 sum = State.regs[dstreg1] + temp + c;
2866 v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
2867 && (temp & 0x80000000) != (sum & 0x80000000));
2868 State.regs[dstreg1] = sum;
2871 State.regs[REG_MCVF] = 1;
2873 PSW |= (( v ? PSW_V : 0));
2877 // 1111 1011 0010 1111 Rm Rn Rd1; macb Rm,Rn,Rd1
2878 8.0xfb+8.0x2f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macb
2882 int srcreg1, srcreg2, dstreg;
2887 srcreg1 = translate_rreg (SD_, RM2);
2888 srcreg2 = translate_rreg (SD_, RN0);
2889 dstreg = translate_rreg (SD_, RD0);
2891 temp = ((signed32)(State.regs[srcreg2] & 0xff)
2892 * (signed32)(State.regs[srcreg1] & 0xff));
2893 sum = State.regs[dstreg] + temp;
2894 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2895 && (temp & 0x80000000) != (sum & 0x80000000));
2896 State.regs[dstreg] = sum;
2899 State.regs[REG_MCVF] = 1;
2901 PSW |= ((v ? PSW_V : 0));
2905 // 1111 1011 0011 1111 Rm Rn Rd1; macbu Rm,Rn,Rd1
2906 8.0xfb+8.0x3f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macbu
2910 int srcreg1, srcreg2, dstreg;
2915 srcreg1 = translate_rreg (SD_, RM2);
2916 srcreg2 = translate_rreg (SD_, RN0);
2917 dstreg = translate_rreg (SD_, RD0);
2919 temp = ((unsigned32)(State.regs[srcreg2] & 0xff)
2920 * (unsigned32)(State.regs[srcreg1] & 0xff));
2921 sum = State.regs[dstreg] + temp;
2922 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2923 && (temp & 0x80000000) != (sum & 0x80000000));
2924 State.regs[dstreg] = sum;
2927 State.regs[REG_MCVF] = 1;
2929 PSW |= ((v ? PSW_V : 0));
2933 // 1111 1011 0100 1111 Rm Rn Rd1; mach Rm,Rn,Rd1
2934 8.0xfb+8.0x4f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::mach
2938 int srcreg1, srcreg2, dstreg;
2943 srcreg1 = translate_rreg (SD_, RM2);
2944 srcreg2 = translate_rreg (SD_, RN0);
2945 dstreg = translate_rreg (SD_, RD0);
2947 temp = ((signed32)(State.regs[srcreg2] & 0xffff)
2948 * (signed32)(State.regs[srcreg1] & 0xffff));
2949 sum = State.regs[dstreg] + temp;
2950 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2951 && (temp & 0x80000000) != (sum & 0x80000000));
2952 State.regs[dstreg] = sum;
2955 State.regs[REG_MCVF] = 1;
2957 PSW |= ((v ? PSW_V : 0));
2961 // 1111 1011 0101 1111 Rm Rn Rd1; machu Rm,Rn,Rd1
2962 8.0xfb+8.0x5f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::machu
2966 int srcreg1, srcreg2, dstreg;
2971 srcreg1 = translate_rreg (SD_, RM2);
2972 srcreg2 = translate_rreg (SD_, RN0);
2973 dstreg = translate_rreg (SD_, RD0);
2975 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
2976 * (unsigned32)(State.regs[srcreg1] & 0xffff));
2977 sum = State.regs[dstreg] + temp;
2978 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2979 && (temp & 0x80000000) != (sum & 0x80000000));
2980 State.regs[dstreg] = sum;
2983 State.regs[REG_MCVF] = 1;
2985 PSW |= ((v ? PSW_V : 0));
2989 // 1111 1011 0110 1111 Rm Rn Rd1; dmach Rm,Rn,Rd1
2990 8.0xfb+8.0x6f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmach
2994 int srcreg1, srcreg2, dstreg;
2995 long temp, temp2, sum;
2999 srcreg1 = translate_rreg (SD_, RM2);
3000 srcreg2 = translate_rreg (SD_, RN0);
3001 dstreg = translate_rreg (SD_, RD0);
3003 temp = ((signed32)(State.regs[srcreg2] & 0xffff)
3004 * (signed32)(State.regs[srcreg1] & 0xffff));
3005 temp2 = ((signed32)((State.regs[srcreg1] >> 16) & 0xffff)
3006 * (signed32)((State.regs[srcreg2] >> 16) & 0xffff));
3007 sum = temp + temp2 + State.regs[dstreg];
3008 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
3009 && (temp & 0x80000000) != (sum & 0x80000000));
3010 State.regs[dstreg] = sum;
3013 State.regs[REG_MCVF] = 1;
3015 PSW |= ((v ? PSW_V : 0));
3019 // 1111 1011 0111 1111 Rm Rn Rd1; dmachu Rm,Rn,Rd1
3020 8.0xfb+8.0x7f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmachu
3024 int srcreg1, srcreg2, dstreg;
3025 long temp, temp2, sum;
3029 srcreg1 = translate_rreg (SD_, RM2);
3030 srcreg2 = translate_rreg (SD_, RN0);
3031 dstreg = translate_rreg (SD_, RD0);
3033 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
3034 * (unsigned32)(State.regs[srcreg1] & 0xffff));
3035 temp2 = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
3036 * (unsigned32)((State.regs[srcreg2] >> 16) & 0xffff));
3037 sum = temp + temp2 + State.regs[dstreg];
3038 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
3039 && (temp & 0x80000000) != (sum & 0x80000000));
3040 State.regs[dstreg] = sum;
3043 State.regs[REG_MCVF] = 1;
3045 PSW |= ((v ? PSW_V : 0));
3049 // 1111 1011 1000 1111 Rm Rn Rd1 Rd2; dmulh Rm,Rn,Rd1,Rd2
3050 8.0xfb+8.0x8f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::dmulh
3054 int srcreg1, srcreg2, dstreg1, dstreg2;
3055 signed long long temp;
3058 srcreg1 = translate_rreg (SD_, RM2);
3059 srcreg2 = translate_rreg (SD_, RN0);
3060 dstreg1 = translate_rreg (SD_, RD0);
3061 dstreg2 = translate_rreg (SD_, RD2);
3063 temp = ((signed32)(State.regs[srcreg1] & 0xffff)
3064 * (signed32)(State.regs[srcreg1] & 0xffff));
3065 State.regs[dstreg2] = temp;
3066 temp = ((signed32)((State.regs[srcreg1] >> 16) & 0xffff)
3067 * (signed32)((State.regs[srcreg1] >>16) & 0xffff));
3068 State.regs[dstreg1] = temp;
3071 // 1111 1011 1001 1111 Rm Rn Rd1 Rd2; dmulhu Rm,Rn,Rd1,Rd2
3072 8.0xfb+8.0x9f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::dmulhu
3076 int srcreg1, srcreg2, dstreg1, dstreg2;
3077 signed long long temp;
3080 srcreg1 = translate_rreg (SD_, RM2);
3081 srcreg2 = translate_rreg (SD_, RN0);
3082 dstreg1 = translate_rreg (SD_, RD0);
3083 dstreg2 = translate_rreg (SD_, RD2);
3085 temp = ((unsigned32)(State.regs[srcreg1] & 0xffff)
3086 * (unsigned32)(State.regs[srcreg1] & 0xffff));
3087 State.regs[dstreg2] = temp;
3088 temp = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
3089 * (unsigned32)((State.regs[srcreg1] >>16) & 0xffff));
3090 State.regs[dstreg1] = temp;
3093 // 1111 1011 1010 1111 Rm Rn; sat24 Rm,Rn
3094 8.0xfb+8.0xaf+4.RM2,4.RN0+8.0x0:D2:::sat24
3102 srcreg = translate_rreg (SD_, RM2);
3103 dstreg = translate_rreg (SD_, RN0);
3105 value = State.regs[srcreg];
3107 if (value >= 0x7fffff)
3108 State.regs[dstreg] = 0x7fffff;
3109 else if (value <= 0xff800000)
3110 State.regs[dstreg] = 0xff800000;
3112 State.regs[dstreg] = value;
3114 n = (State.regs[dstreg] & 0x800000) != 0;
3115 z = (State.regs[dstreg] == 0);
3116 PSW &= ~(PSW_Z | PSW_N);
3117 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3120 // 1111 1011 1111 1111 Rm Rn Rd1; bsch Rm,Rn,Rd1
3121 8.0xfb+8.0xff+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::bsch
3126 int srcreg1, srcreg2, dstreg;
3130 srcreg1 = translate_rreg (SD_, RM2);
3131 srcreg2 = translate_rreg (SD_, RN0);
3132 dstreg = translate_rreg (SD_, RD0);
3134 temp = State.regs[srcreg1];
3135 start = (State.regs[srcreg2] & 0x1f) - 1;
3139 for (i = start; i >= 0; i--)
3141 if (temp & (1 << i))
3144 State.regs[dstreg] = i;
3152 State.regs[dstreg] = 0;
3155 PSW |= (c ? PSW_C : 0);
3158 // 1111 1101 0000 1000 Rn Rn IMM32; mov imm24,Rn
3159 8.0xfd+8.0x08+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::mov
3166 dstreg = translate_rreg (SD_, RN0);
3167 State.regs[dstreg] = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3170 // 1111 1101 0001 1000 Rn Rn IMM32; movu imm24,Rn
3171 8.0xfd+8.0x18+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4k:::movu
3178 dstreg = translate_rreg (SD_, RN0);
3179 State.regs[dstreg] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
3182 // 1111 1101 0111 1000 Rn Rn IMM32; add imm24,Rn
3183 8.0xfd+8.0x78+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4c:::add
3190 dstreg = translate_rreg (SD_, RN0);
3191 genericAdd (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
3194 // 1111 1101 1000 1000 Rn Rn IMM32; addc imm24,Rn
3195 8.0xfd+8.0x88+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::addc
3199 int dstreg, z, n, c, v;
3200 unsigned long sum, imm, reg2;
3203 dstreg = translate_rreg (SD_, RN0);
3205 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3206 reg2 = State.regs[dstreg];
3207 sum = imm + reg2 + ((PSW & PSW_C) != 0);
3208 State.regs[dstreg] = sum;
3210 z = ((PSW & PSW_Z) != 0) && (sum == 0);
3211 n = (sum & 0x80000000);
3212 c = (sum < imm) || (sum < reg2);
3213 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3214 && (reg2 & 0x80000000) != (sum & 0x80000000));
3216 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3217 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3218 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3221 // 1111 1101 1001 1000 Rn Rn IMM32; sub imm24,Rn
3222 8.0xfd+8.0x98+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::sub
3229 dstreg = translate_rreg (SD_, RN0);
3230 genericSub (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
3233 // 1111 1101 1010 1000 Rn Rn IMM32; subc imm24,Rn
3234 8.0xfd+8.0xa8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::subc
3238 int dstreg, z, n, c, v;
3239 unsigned long difference, imm, reg2;
3242 dstreg = translate_rreg (SD_, RN0);
3244 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3245 reg2 = State.regs[dstreg];
3246 difference = reg2 - imm - ((PSW & PSW_C) != 0);
3247 State.regs[dstreg] = difference;
3249 z = ((PSW & PSW_Z) != 0) && (difference == 0);
3250 n = (difference & 0x80000000);
3252 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3253 && (reg2 & 0x80000000) != (difference & 0x80000000));
3255 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3256 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3257 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3260 // 1111 1101 1101 1000 Rn Rn IMM32; cmp imm24,Rn
3261 8.0xfd+8.0xd8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::cmp
3268 srcreg = translate_rreg (SD_, RN0);
3269 genericCmp (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), State.regs[srcreg]);
3272 // 1111 1101 1111 1000 XRn XRn IMM32; mov imm24,XRn
3273 8.0xfd+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM24A+8.IMM24B+8.IMM24C:D4o:::mov
3281 State.regs[REG_SP] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
3287 // 1111 1101 0000 1001 Rn Rn IMM24; and imm24,Rn
3288 8.0xfd+8.0x09+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::and
3296 dstreg = translate_rreg (SD_, RN0);
3298 State.regs[dstreg] &= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3299 z = (State.regs[dstreg] == 0);
3300 n = (State.regs[dstreg] & 0x80000000) != 0;
3301 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3302 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3305 // 1111 1101 0001 1001 Rn Rn IMM24; or imm24,Rn
3306 8.0xfd+8.0x19+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::or
3314 dstreg = translate_rreg (SD_, RN0);
3316 State.regs[dstreg] |= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3317 z = (State.regs[dstreg] == 0);
3318 n = (State.regs[dstreg] & 0x80000000) != 0;
3319 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3320 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3323 // 1111 1101 0010 1001 Rn Rn IMM24; xor imm24,Rn
3324 8.0xfd+8.0x29+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::xor
3332 dstreg = translate_rreg (SD_, RN0);
3334 State.regs[dstreg] ^= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3335 z = (State.regs[dstreg] == 0);
3336 n = (State.regs[dstreg] & 0x80000000) != 0;
3337 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3338 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3341 // 1111 1101 0100 1001 Rn Rn IMM24; asr imm24,Rn
3342 8.0xfd+8.0x49+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asr
3351 dstreg = translate_rreg (SD_, RN0);
3353 temp = State.regs[dstreg];
3355 temp >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
3356 State.regs[dstreg] = temp;
3357 z = (State.regs[dstreg] == 0);
3358 n = (State.regs[dstreg] & 0x80000000) != 0;
3359 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3360 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
3364 // 1111 1101 0101 1001 Rn Rn IMM24; lsr imm24,Rn
3365 8.0xfd+8.0x59+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::lsr
3373 dstreg = translate_rreg (SD_, RN0);
3375 c = State.regs[dstreg] & 1;
3376 State.regs[dstreg] >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
3377 z = (State.regs[dstreg] == 0);
3378 n = (State.regs[dstreg] & 0x80000000) != 0;
3379 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3380 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
3383 // 1111 1101 0110 1001 Rn Rn IMM24; asl imm24,Rn
3384 8.0xfd+8.0x69+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asl
3392 dstreg = translate_rreg (SD_, RN0);
3394 State.regs[dstreg] <<= (FETCH24 (IMM24A, IMM24B, IMM24C));
3395 z = (State.regs[dstreg] == 0);
3396 n = (State.regs[dstreg] & 0x80000000) != 0;
3397 PSW &= ~(PSW_Z | PSW_N);
3398 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3401 // 1111 1101 1010 1001 Rn Rn IMM24; mul imm24,Rn
3402 8.0xfd+8.0xa9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mul
3407 unsigned long long temp;
3411 dstreg = translate_rreg (SD_, RN0);
3413 temp = ((signed64)(signed32)State.regs[dstreg]
3414 * (signed64)(signed32)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
3415 State.regs[dstreg] = temp & 0xffffffff;
3416 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
3417 z = (State.regs[dstreg] == 0);
3418 n = (State.regs[dstreg] & 0x80000000) != 0;
3419 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3420 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3423 // 1111 1101 1011 1001 Rn Rn IMM24; mulu imm24,Rn
3424 8.0xfd+8.0xb9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mulu
3429 unsigned long long temp;
3433 dstreg = translate_rreg (SD_, RN0);
3435 temp = ((unsigned64)State.regs[dstreg]
3436 * (unsigned64)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
3437 State.regs[dstreg] = temp & 0xffffffff;
3438 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
3439 z = (State.regs[dstreg] == 0);
3440 n = (State.regs[dstreg] & 0x80000000) != 0;
3441 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3442 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3445 // 1111 1101 1110 1001 Rn Rn IMM24; btst imm24,,Rn
3446 8.0xfd+8.0xe9+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::btst
3453 srcreg = translate_rreg (SD_, RN0);
3454 genericBtst (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3457 // 1111 1101 0000 1010 Rn Rm IMM24; mov (d24,Rm),Rn
3458 8.0xfd+8.0x0a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::mov
3465 srcreg = translate_rreg (SD_, RM0);
3466 dstreg = translate_rreg (SD_, RN2);
3467 State.regs[dstreg] = load_word (State.regs[srcreg]
3468 + EXTEND24 (FETCH24 (IMM24A,
3472 // 1111 1101 0001 1010 Rm Rn IMM24; mov Rm,(d24,Rn)
3473 8.0xfd+8.0x1a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::mov
3480 srcreg = translate_rreg (SD_, RM2);
3481 dstreg = translate_rreg (SD_, RN0);
3482 store_word (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3483 State.regs[srcreg]);
3486 // 1111 1101 0010 1010 Rn Rm IMM24; movbu (d24,Rm),Rn
3487 8.0xfd+8.0x2a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movbu
3494 srcreg = translate_rreg (SD_, RM0);
3495 dstreg = translate_rreg (SD_, RN2);
3496 State.regs[dstreg] = load_byte (State.regs[srcreg]
3497 + EXTEND24 (FETCH24 (IMM24A,
3501 // 1111 1101 0011 1010 Rm Rn IMM24; movbu Rm,(d24,Rn)
3502 8.0xfd+8.0x3a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movbu
3509 srcreg = translate_rreg (SD_, RM2);
3510 dstreg = translate_rreg (SD_, RN0);
3511 store_byte (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3512 State.regs[srcreg]);
3515 // 1111 1101 0100 1010 Rn Rm IMM24; movhu (d24,Rm),Rn
3516 8.0xfd+8.0x4a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movhu
3523 srcreg = translate_rreg (SD_, RM0);
3524 dstreg = translate_rreg (SD_, RN2);
3525 State.regs[dstreg] = load_half (State.regs[srcreg]
3526 + EXTEND24 (FETCH24 (IMM24A,
3530 // 1111 1101 0101 1010 Rm Rn IMM24; movhu Rm,(d24,Rn)
3531 8.0xfd+8.0x5a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movhu
3538 srcreg = translate_rreg (SD_, RM2);
3539 dstreg = translate_rreg (SD_, RN0);
3540 store_half (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3541 State.regs[srcreg]);
3544 // 1111 1101 0110 1010 Rn Rm IMM24; mov (d24,Rm+),Rn
3545 8.0xfd+8.0x6a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::mov
3552 srcreg = translate_rreg (SD_, RM0);
3553 dstreg = translate_rreg (SD_, RN2);
3554 State.regs[dstreg] = load_word (State.regs[srcreg]
3555 + EXTEND24 (FETCH24 (IMM24A,
3557 State.regs[srcreg] += 4;
3560 // 1111 1101 0111 1010 Rm Rn IMM24; mov Rm,(d24,Rn+)
3561 8.0xfd+8.0x7a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mov
3568 srcreg = translate_rreg (SD_, RM2);
3569 dstreg = translate_rreg (SD_, RN0);
3570 store_word (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3571 State.regs[srcreg]);
3572 State.regs[dstreg] += 4;
3576 // 1111 1101 1000 1010 Rn 0000 IMM24; mov (d24,sp),Rn
3577 8.0xfd+8.0x8a+4.RN2,4.0x0+IMM24A+8.IMM24B+8.IMM24C:D4r:::mov
3584 dstreg = translate_rreg (SD_, RN2);
3585 State.regs[dstreg] = load_word (State.regs[REG_SP]
3586 + EXTEND24 (FETCH24 (IMM24A,
3590 // 1111 1101 1001 1010 Rm 0000 IMM24; mov Rm,(d24,sp)
3591 8.0xfd+8.0x9a+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::mov
3598 srcreg = translate_rreg (SD_, RM2);
3599 store_word (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3600 State.regs[srcreg]);
3603 // 1111 1101 1010 1010 Rn 0000 IMM24; movbu (d24,Rm),Rn
3604 8.0xfd+8.0xaa+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movbu
3611 dstreg = translate_rreg (SD_, RN2);
3612 State.regs[dstreg] = load_byte (State.regs[REG_SP]
3613 + EXTEND24 (FETCH24 (IMM24A,
3617 // 1111 1101 1011 1010 Rm 0000 IMM24; movbu Rm,(d24,sp)
3618 8.0xfd+8.0xba+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movbu
3625 srcreg = translate_rreg (SD_, RM2);
3626 store_byte (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3627 State.regs[srcreg]);
3630 // 1111 1101 1100 1010 Rn 0000 IMM24; movhu (d24,sp),Rn
3631 8.0xfd+8.0xca+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movhu
3638 dstreg = translate_rreg (SD_, RN2);
3639 State.regs[dstreg] = load_half (State.regs[REG_SP]
3640 + EXTEND24 (FETCH24 (IMM24A,
3644 // 1111 1101 1101 1010 Rm Rn IMM24; movhu Rm,(d24,sp)
3645 8.0xfd+8.0xda+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movhu
3652 srcreg = translate_rreg (SD_, RM2);
3653 store_half (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3654 State.regs[srcreg]);
3657 // 1111 1101 1110 1010 Rn Rm IMM24; movhu (d24,Rm+),Rn
3658 8.0xfd+8.0xea+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::movhu
3665 srcreg = translate_rreg (SD_, RM0);
3666 dstreg = translate_rreg (SD_, RN2);
3667 State.regs[dstreg] = load_half (State.regs[srcreg]
3668 + EXTEND24 (FETCH24 (IMM24A,
3670 State.regs[dstreg] += 2;
3673 // 1111 1101 1111 1010 Rm Rn IMM24; movhu Rm,(d24,Rn+)
3674 8.0xfd+8.0xfa+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::movhu
3681 srcreg = translate_rreg (SD_, RM2);
3682 dstreg = translate_rreg (SD_, RN0);
3683 store_half (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3684 State.regs[srcreg]);
3685 State.regs[srcreg] += 2;
3688 // 1111 1101 0000 1011 Rn IMM24; mac imm24,Rn
3689 8.0xfd+8.0x0b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mac
3694 long long temp, sum;
3698 srcreg = translate_rreg (SD_, RN2);
3700 temp = ((signed64)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C))
3701 * (signed64)State.regs[srcreg]);
3702 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3703 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3704 State.regs[REG_MCRL] = sum;
3707 sum = State.regs[REG_MCRH] + temp + c;
3708 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3709 && (temp & 0x80000000) != (sum & 0x80000000));
3710 State.regs[REG_MCRH] = sum;
3712 State.regs[REG_MCVF] = 1;
3715 // 1111 1101 0001 1011 Rn IMM24; macu imm24,Rn
3716 8.0xfd+8.0x1b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macu
3721 long long temp, sum;
3725 srcreg = translate_rreg (SD_, RN2);
3727 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C))
3728 * (unsigned64)State.regs[srcreg]);
3729 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3730 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3731 State.regs[REG_MCRL] = sum;
3734 sum = State.regs[REG_MCRH] + temp + c;
3735 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3736 && (temp & 0x80000000) != (sum & 0x80000000));
3737 State.regs[REG_MCRH] = sum;
3739 State.regs[REG_MCVF] = 1;
3742 // 1111 1101 0010 1011 Rn IMM24; macb imm24,Rn
3743 8.0xfd+8.0x2b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macb
3748 long long temp, sum;
3752 srcreg = translate_rreg (SD_, RN2);
3754 temp = ((signed64)EXTEND8 (FETCH24 (IMM24A, IMM24B, IMM24C))
3755 * (signed64)State.regs[srcreg] & 0xff);
3756 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3757 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3758 State.regs[REG_MCRL] = sum;
3761 sum = State.regs[REG_MCRH] + temp + c;
3762 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3763 && (temp & 0x80000000) != (sum & 0x80000000));
3764 State.regs[REG_MCRH] = sum;
3766 State.regs[REG_MCVF] = 1;
3769 // 1111 1101 0011 1011 Rn IMM24; macbu imm24,Rn
3770 8.0xfd+8.0x3b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macbu
3775 long long temp, sum;
3779 srcreg = translate_rreg (SD_, RN2);
3781 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C))
3782 * (unsigned64)State.regs[srcreg] & 0xff);
3783 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3784 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3785 State.regs[REG_MCRL] = sum;
3788 sum = State.regs[REG_MCRH] + temp + c;
3789 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3790 && (temp & 0x80000000) != (sum & 0x80000000));
3791 State.regs[REG_MCRH] = sum;
3793 State.regs[REG_MCVF] = 1;
3796 // 1111 1101 0100 1011 Rn IMM24; mach imm24,Rn
3797 8.0xfd+8.0x4b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mach
3802 long long temp, sum;
3806 srcreg = translate_rreg (SD_, RN2);
3808 temp = ((signed64)EXTEND16 (FETCH24 (IMM24A, IMM24B, IMM24C))
3809 * (signed64)State.regs[srcreg] & 0xffff);
3810 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3811 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3812 State.regs[REG_MCRL] = sum;
3815 sum = State.regs[REG_MCRH] + temp + c;
3816 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3817 && (temp & 0x80000000) != (sum & 0x80000000));
3818 State.regs[REG_MCRH] = sum;
3820 State.regs[REG_MCVF] = 1;
3823 // 1111 1101 0101 1011 Rn IMM24; machu imm24,Rn
3824 8.0xfd+8.0x5b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::machu
3829 long long temp, sum;
3833 srcreg = translate_rreg (SD_, RN2);
3835 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffff)
3836 * (unsigned64)State.regs[srcreg] & 0xffff);
3837 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3838 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3839 State.regs[REG_MCRL] = sum;
3842 sum = State.regs[REG_MCRH] + temp + c;
3843 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3844 && (temp & 0x80000000) != (sum & 0x80000000));
3845 State.regs[REG_MCRH] = sum;
3847 State.regs[REG_MCVF] = 1;
3850 // 1111 1101 0000 1110 Rn 0000 ABS24; mov (abs24),Rn
3851 8.0xfd+8.0x0e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::mov
3858 dstreg = translate_rreg (SD_, RN2);
3859 State.regs[dstreg] = load_word (FETCH24 (IMM24A, IMM24B, IMM24C));
3862 // 1111 1101 0001 1110 Rm 0000 ABS24; mov Rm,(abs24)
3863 8.0xfd+8.0x1e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4v:::mov
3870 srcreg = translate_rreg (SD_, RM2);
3871 store_word (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3875 // 1111 1101 0010 1110 Rn 0000 ABS24; movbu (abs24),Rn
3876 8.0xfd+8.0x2e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movbu
3883 dstreg = translate_rreg (SD_, RN2);
3884 State.regs[dstreg] = load_byte (FETCH24 (IMM24A, IMM24B, IMM24C));
3887 // 1111 1101 0011 1110 Rm 0000 ABS24; movbu Rm,(abs24)
3888 8.0xfd+8.0x3e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movbu
3895 srcreg = translate_rreg (SD_, RM2);
3896 store_byte (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3900 // 1111 1101 0100 1110 Rn 0000 ABS24; movhu (abs24),Rn
3901 8.0xfd+8.0x4e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movhu
3908 dstreg = translate_rreg (SD_, RN2);
3909 State.regs[dstreg] = load_half (FETCH24 (IMM24A, IMM24B, IMM24C));
3912 // 1111 1101 0101 1110 Rm 0000 ABS24; movhu Rm,(abs24)
3913 8.0xfd+8.0x5e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movhu
3920 srcreg = translate_rreg (SD_, RM2);
3921 store_half (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3925 // 1111 1110 0000 1000 Rn Rn IMM32; mov imm32,Rn
3926 8.0xfe+8.0x08+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mov
3933 dstreg = translate_rreg (SD_, RN0);
3934 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
3937 // 1111 1110 0001 1000 Rn Rn IMM32; movu imm32,Rn
3938 8.0xfe+8.0x18+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movu
3945 dstreg = translate_rreg (SD_, RN0);
3946 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
3949 // 1111 1110 0111 1000 Rn Rn IMM32; add imm32,Rn
3950 8.0xfe+8.0x78+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::add
3957 dstreg = translate_rreg (SD_, RN0);
3958 genericAdd (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
3961 // 1111 1110 1000 1000 Rn Rn IMM32; addc imm32,Rn
3962 8.0xfe+8.0x88+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::addc
3967 unsigned int imm, reg2, sum;
3971 dstreg = translate_rreg (SD_, RN0);
3973 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
3974 reg2 = State.regs[dstreg];
3975 sum = imm + reg2 + ((PSW & PSW_C) != 0);
3976 State.regs[dstreg] = sum;
3978 z = ((PSW & PSW_Z) != 0) && (sum == 0);
3979 n = (sum & 0x80000000);
3980 c = (sum < imm) || (sum < reg2);
3981 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3982 && (reg2 & 0x80000000) != (sum & 0x80000000));
3984 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3985 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3986 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3989 // 1111 1110 1001 1000 Rn Rn IMM32; sub imm32,Rn
3990 8.0xfe+8.0x98+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::sub
3997 dstreg = translate_rreg (SD_, RN0);
3998 genericSub (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
4001 // 1111 1110 1010 1000 Rn Rn IMM32; subc imm32,Rn
4002 8.0xfe+8.0xa8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::subc
4007 unsigned int imm, reg2, difference;
4011 dstreg = translate_rreg (SD_, RN0);
4013 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4014 reg2 = State.regs[dstreg];
4015 difference = reg2 - imm - ((PSW & PSW_C) != 0);
4016 State.regs[dstreg] = difference;
4018 z = ((PSW & PSW_Z) != 0) && (difference == 0);
4019 n = (difference & 0x80000000);
4021 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
4022 && (reg2 & 0x80000000) != (difference & 0x80000000));
4024 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4025 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
4026 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
4029 // 1111 1110 0111 1000 Rn Rn IMM32; cmp imm32,Rn
4030 8.0xfe+8.0xd8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::cmp
4037 srcreg = translate_rreg (SD_, RN0);
4038 genericCmp (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4041 // 1111 1110 1111 1000 XRn XRn IMM32; mov imm32,XRn
4042 8.0xfe+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::mov
4049 State.regs[REG_SP] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
4054 // 1111 1110 0000 1001 Rn Rn IMM32; and imm32,Rn
4055 8.0xfe+8.0x09+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::and
4063 dstreg = translate_rreg (SD_, RN0);
4065 State.regs[dstreg] &= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4066 z = (State.regs[dstreg] == 0);
4067 n = (State.regs[dstreg] & 0x80000000) != 0;
4068 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4069 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4072 // 1111 1110 0001 1001 Rn Rn IMM32; or imm32,Rn
4073 8.0xfe+8.0x19+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::or
4081 dstreg = translate_rreg (SD_, RN0);
4083 State.regs[dstreg] |= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4084 z = (State.regs[dstreg] == 0);
4085 n = (State.regs[dstreg] & 0x80000000) != 0;
4086 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4087 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4090 // 1111 1110 0010 1001 Rn Rn IMM32; xor imm32,Rn
4091 8.0xfe+8.0x29+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::xor
4099 dstreg = translate_rreg (SD_, RN0);
4101 State.regs[dstreg] ^= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4102 z = (State.regs[dstreg] == 0);
4103 n = (State.regs[dstreg] & 0x80000000) != 0;
4104 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4105 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4108 // 1111 1110 0100 1001 Rn Rn IMM32; asr imm32,Rn
4109 8.0xfe+8.0x49+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asr
4118 dstreg = translate_rreg (SD_, RN0);
4120 temp = State.regs[dstreg];
4122 temp >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4123 State.regs[dstreg] = temp;
4124 z = (State.regs[dstreg] == 0);
4125 n = (State.regs[dstreg] & 0x80000000) != 0;
4126 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4127 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4130 // 1111 1110 0101 1001 Rn Rn IMM32; lsr imm32,Rn
4131 8.0xfe+8.0x59+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::lsr
4139 dstreg = translate_rreg (SD_, RN0);
4141 c = State.regs[dstreg] & 1;
4142 State.regs[dstreg] >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4143 z = (State.regs[dstreg] == 0);
4144 n = (State.regs[dstreg] & 0x80000000) != 0;
4145 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4146 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4149 // 1111 1110 0110 1001 Rn Rn IMM32; asl imm32,Rn
4150 8.0xfe+8.0x69+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asl
4158 dstreg = translate_rreg (SD_, RN0);
4160 State.regs[dstreg] <<= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4161 z = (State.regs[dstreg] == 0);
4162 n = (State.regs[dstreg] & 0x80000000) != 0;
4163 PSW &= ~(PSW_Z | PSW_N);
4164 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4167 // 1111 1110 1010 1001 Rn Rn IMM32; mul imm32,Rn
4168 8.0xfe+8.0xa9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mul
4173 unsigned long long temp;
4177 dstreg = translate_rreg (SD_, RN0);
4179 temp = ((signed64)(signed32)State.regs[dstreg]
4180 * (signed64)(signed32)(FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
4181 State.regs[dstreg] = temp & 0xffffffff;
4182 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
4183 z = (State.regs[dstreg] == 0);
4184 n = (State.regs[dstreg] & 0x80000000) != 0;
4185 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4186 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4189 // 1111 1110 1011 1001 Rn Rn IMM32; mulu imm32,Rn
4190 8.0xfe+8.0xb9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mulu
4195 unsigned long long temp;
4199 dstreg = translate_rreg (SD_, RN0);
4201 temp = ((unsigned64)State.regs[dstreg]
4202 * (unsigned64) (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
4203 State.regs[dstreg] = temp & 0xffffffff;
4204 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
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 1110 1110 1001 Rn Rn IMM32; btst imm32,Rn
4212 8.0xfe+8.0xe9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5a:::btst
4219 srcreg = translate_rreg (SD_, RN0);
4220 genericBtst (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4223 // 1111 1110 0000 1010 Rn Rm IMM32; mov (d32,Rm),Rn
4224 8.0xfe+8.0x0a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::mov
4231 srcreg = translate_rreg (SD_, RM0);
4232 dstreg = translate_rreg (SD_, RN2);
4233 State.regs[dstreg] = load_word (State.regs[srcreg]
4234 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4237 // 1111 1110 0001 1010 Rm Rn IMM32; mov Rm,(d32,Rn)
4238 8.0xfe+8.0x1a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5g:::mov
4245 srcreg = translate_rreg (SD_, RM2);
4246 dstreg = translate_rreg (SD_, RN0);
4247 store_word (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4248 State.regs[srcreg]);
4251 // 1111 1110 0010 1010 Rn Rm IMM32; movbu (d32,Rm),Rn
4252 8.0xfe+8.0x2a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movbu
4259 srcreg = translate_rreg (SD_, RM0);
4260 dstreg = translate_rreg (SD_, RN2);
4261 State.regs[dstreg] = load_byte (State.regs[srcreg]
4262 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4265 // 1111 1110 0011 1010 Rm Rn IMM32; movbu Rm,(d32,Rn)
4266 8.0xfe+8.0x3a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movbu
4273 srcreg = translate_rreg (SD_, RM2);
4274 dstreg = translate_rreg (SD_, RN0);
4275 store_byte (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4276 State.regs[srcreg]);
4279 // 1111 1110 0100 1010 Rn Rm IMM32; movhu (d32,Rm),Rn
4280 8.0xfe+8.0x4a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movhu
4287 srcreg = translate_rreg (SD_, RM0);
4288 dstreg = translate_rreg (SD_, RN2);
4289 State.regs[dstreg] = load_half (State.regs[srcreg]
4290 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4293 // 1111 1110 0101 1010 Rm Rn IMM32; movhu Rm,(d32,Rn)
4294 8.0xfe+8.0x5a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movhu
4301 srcreg = translate_rreg (SD_, RM2);
4302 dstreg = translate_rreg (SD_, RN0);
4303 store_half (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4304 State.regs[srcreg]);
4307 // 1111 1110 0110 1010 Rn Rm IMM32; mov (d32,Rm+),Rn
4308 8.0xfe+8.0x6a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::mov
4315 srcreg = translate_rreg (SD_, RM0);
4316 dstreg = translate_rreg (SD_, RN2);
4317 State.regs[dstreg] = load_word (State.regs[srcreg]
4318 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4319 State.regs[srcreg] += 4;
4322 // 1111 1110 0111 1010 Rm Rn IMM32; mov Rm,(d32,Rn+)
4323 8.0xfe+8.0x7a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5z:::mov
4330 srcreg = translate_rreg (SD_, RM2);
4331 dstreg = translate_rreg (SD_, RN0);
4332 store_word (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4333 State.regs[srcreg]);
4334 State.regs[dstreg] += 4;
4338 // 1111 1110 1000 1010 Rn 0000 IMM32; mov (d32,sp),Rn
4339 8.0xfe+8.0x8a+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::mov
4346 dstreg = translate_rreg (SD_, RN2);
4347 State.regs[dstreg] = load_word (State.regs[REG_SP]
4348 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4351 // 1111 1110 1001 1010 Rm 0000 IMM32; mov Rm,(d32,sp)
4352 8.0xfe+8.0x9a+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::mov
4359 srcreg = translate_rreg (SD_, RM2);
4360 store_word (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4361 State.regs[srcreg]);
4364 // 1111 1110 1010 1010 Rn 0000 IMM32; movbu (d32,sp),Rn
4365 8.0xfe+8.0xaa+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movbu
4372 dstreg = translate_rreg (SD_, RN2);
4373 State.regs[dstreg] = load_byte (State.regs[REG_SP]
4374 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4377 // 1111 1110 1011 1010 Rm 0000 IMM32; movbu Rm,(d32,sp)
4378 8.0xfe+8.0xba+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movbu
4385 srcreg = translate_rreg (SD_, RM2);
4386 store_byte (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4387 State.regs[srcreg]);
4390 // 1111 1110 1100 1010 Rn 0000 IMM32; movhu (d32,sp),Rn
4391 8.0xfe+8.0xca+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movhu
4398 dstreg = translate_rreg (SD_, RN2);
4399 State.regs[dstreg] = load_half (State.regs[REG_SP]
4400 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4403 // 1111 1110 1101 1010 Rm 0000 IMM32; movhu Rm,(d32,sp)
4404 8.0xfe+8.0xda+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movhu
4411 srcreg = translate_rreg (SD_, RM2);
4412 store_half (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4413 State.regs[srcreg]);
4417 // 1111 1110 1110 1010 Rn Rm IMM32; movhu (d32,Rm+),Rn
4418 8.0xfe+8.0xea+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::movhu
4425 srcreg = translate_rreg (SD_, RM0);
4426 dstreg = translate_rreg (SD_, RN2);
4427 State.regs[dstreg] = load_half (State.regs[srcreg]
4428 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4429 State.regs[srcreg] += 2;
4432 // 1111 1110 1111 1010 Rm Rn IMM32; movhu Rm,(d32,Rn+)
4433 8.0xfe+8.0xfa+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::movhu
4440 srcreg = translate_rreg (SD_, RM2);
4441 dstreg = translate_rreg (SD_, RN0);
4442 store_half (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4443 State.regs[srcreg]);
4444 State.regs[dstreg] += 2;
4459 // 1111 1110 0000 1110 Rn 0000 IMM32; mov (abs32),Rn
4460 8.0xfe+8.0x0e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5h:::mov
4467 dstreg = translate_rreg (SD_, RN2);
4468 State.regs[dstreg] = load_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4471 // 1111 1110 0001 1110 Rm 0000 IMM32; mov Rn,(abs32)
4472 8.0xfe+8.0x1e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::mov
4479 srcreg = translate_rreg (SD_, RM2);
4480 store_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4483 // 1111 1110 0020 1110 Rn 0000 IMM32; movbu (abs32),Rn
4484 8.0xfe+8.0x2e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5i:::movbu
4491 dstreg = translate_rreg (SD_, RN2);
4492 State.regs[dstreg] = load_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4495 // 1111 1110 0011 1110 Rm 0000 IMM32; movbu Rn,(abs32)
4496 8.0xfe+8.0x3e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movbu
4503 srcreg = translate_rreg (SD_, RM2);
4504 store_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4507 // 1111 1110 0100 1110 Rn 0000 IMM32; movhu (abs32),Rn
4508 8.0xfe+8.0x4e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5j:::movhu
4515 dstreg = translate_rreg (SD_, RN2);
4516 State.regs[dstreg] = load_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4519 // 1111 1110 0101 1110 Rm 0000 IMM32; movhu Rn,(abs32)
4520 8.0xfe+8.0x5e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movhu
4527 srcreg = translate_rreg (SD_, RM2);
4528 store_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4531 // 1111 0111 0000 0000 Rm1 Rn1 Rm2 Rn2; add_add Rm1, Rn1, Rm2, Rn2
4532 8.0xf7+8.0x00+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_add
4536 int srcreg1, srcreg2, dstreg1, dstreg2;
4539 srcreg1 = translate_rreg (SD_, RM1);
4540 srcreg2 = translate_rreg (SD_, RM2);
4541 dstreg1 = translate_rreg (SD_, RN1);
4542 dstreg2 = translate_rreg (SD_, RN2);
4544 State.regs[dstreg1] += State.regs[srcreg1];
4545 State.regs[dstreg2] += State.regs[srcreg2];
4548 // 1111 0111 0001 0000 Rm1 Rn1 imm4 Rn2; add_add Rm1, Rn1, imm4, Rn2
4549 8.0xf7+8.0x10+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_add
4553 int srcreg1, dstreg1, dstreg2;
4556 srcreg1 = translate_rreg (SD_, RM1);
4557 dstreg1 = translate_rreg (SD_, RN1);
4558 dstreg2 = translate_rreg (SD_, RN2);
4560 State.regs[dstreg1] += State.regs[srcreg1];
4561 State.regs[dstreg2] += EXTEND4 (IMM4);
4564 // 1111 0111 0010 0000 Rm1 Rn1 Rm2 Rn2; add_sub Rm1, Rn1, Rm2, Rn2
4565 8.0xf7+8.0x20+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_sub
4569 int srcreg1, srcreg2, dstreg1, dstreg2;
4572 srcreg1 = translate_rreg (SD_, RM1);
4573 srcreg2 = translate_rreg (SD_, RM2);
4574 dstreg1 = translate_rreg (SD_, RN1);
4575 dstreg2 = translate_rreg (SD_, RN2);
4577 State.regs[dstreg1] += State.regs[srcreg1];
4578 State.regs[dstreg2] -= State.regs[srcreg2];
4581 // 1111 0111 0011 0000 Rm1 Rn1 imm4 Rn2; add_sub Rm1, Rn1, imm4, Rn2
4582 8.0xf7+8.0x30+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_sub
4586 int srcreg1, dstreg1, dstreg2;
4589 srcreg1 = translate_rreg (SD_, RM1);
4590 dstreg1 = translate_rreg (SD_, RN1);
4591 dstreg2 = translate_rreg (SD_, RN2);
4593 State.regs[dstreg1] += State.regs[srcreg1];
4594 State.regs[dstreg2] -= EXTEND4 (IMM4);
4597 // 1111 0111 0100 0000 Rm1 Rn1 Rm2 Rn2; add_cmp Rm1, Rn1, Rm2, Rn2
4598 8.0xf7+8.0x40+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_cmp
4602 int srcreg1, srcreg2, dstreg1, dstreg2;
4605 srcreg1 = translate_rreg (SD_, RM1);
4606 srcreg2 = translate_rreg (SD_, RM2);
4607 dstreg1 = translate_rreg (SD_, RN1);
4608 dstreg2 = translate_rreg (SD_, RN2);
4610 State.regs[dstreg1] += State.regs[srcreg1];
4611 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
4614 // 1111 0111 0101 0000 Rm1 Rn1 imm4 Rn2; add_cmp Rm1, Rn1, imm4, Rn2
4615 8.0xf7+8.0x50+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_cmp
4619 int srcreg1, dstreg1, dstreg2;
4622 srcreg1 = translate_rreg (SD_, RM1);
4623 dstreg1 = translate_rreg (SD_, RN1);
4624 dstreg2 = translate_rreg (SD_, RN2);
4626 State.regs[dstreg1] += State.regs[srcreg1];
4627 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
4630 // 1111 0111 0110 0000 Rm1 Rn1 Rm2 Rn2; add_mov Rm1, Rn1, Rm2, Rn2
4631 8.0xf7+8.0x60+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_mov
4635 int srcreg1, srcreg2, dstreg1, dstreg2;
4638 srcreg1 = translate_rreg (SD_, RM1);
4639 srcreg2 = translate_rreg (SD_, RM2);
4640 dstreg1 = translate_rreg (SD_, RN1);
4641 dstreg2 = translate_rreg (SD_, RN2);
4643 State.regs[dstreg1] += State.regs[srcreg1];
4644 State.regs[dstreg2] = State.regs[srcreg2];
4647 // 1111 0111 0111 0000 Rm1 Rn1 imm4 Rn2; add_mov Rm1, Rn1, imm4, Rn2
4648 8.0xf7+8.0x70+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_mov
4652 int srcreg1, dstreg1, dstreg2;
4655 srcreg1 = translate_rreg (SD_, RM1);
4656 dstreg1 = translate_rreg (SD_, RN1);
4657 dstreg2 = translate_rreg (SD_, RN2);
4659 State.regs[dstreg1] += State.regs[srcreg1];
4660 State.regs[dstreg2] = EXTEND4 (IMM4);
4663 // 1111 0111 1000 0000 Rm1 Rn1 Rm2 Rn2; add_asr Rm1, Rn1, Rm2, Rn2
4664 8.0xf7+8.0x80+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_asr
4668 int srcreg1, srcreg2, dstreg1, dstreg2;
4672 srcreg1 = translate_rreg (SD_, RM1);
4673 srcreg2 = translate_rreg (SD_, RM2);
4674 dstreg1 = translate_rreg (SD_, RN1);
4675 dstreg2 = translate_rreg (SD_, RN2);
4677 State.regs[dstreg1] += State.regs[srcreg1];
4678 temp = State.regs[dstreg2];
4679 temp >>= State.regs[srcreg2];
4680 State.regs[dstreg2] = temp;
4683 // 1111 0111 1001 0000 Rm1 Rn1 imm4 Rn2; add_asr Rm1, Rn1, imm4, Rn2
4684 8.0xf7+8.0x90+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_asr
4688 int srcreg1, dstreg1, dstreg2;
4692 srcreg1 = translate_rreg (SD_, RM1);
4693 dstreg1 = translate_rreg (SD_, RN1);
4694 dstreg2 = translate_rreg (SD_, RN2);
4696 State.regs[dstreg1] += State.regs[srcreg1];
4697 temp = State.regs[dstreg2];
4699 State.regs[dstreg2] = temp;
4702 // 1111 0111 1010 0000 Rm1 Rn1 Rm2 Rn2; add_lsr Rm1, Rn1, Rm2, Rn2
4703 8.0xf7+8.0xa0+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_lsr
4707 int srcreg1, srcreg2, dstreg1, dstreg2;
4710 srcreg1 = translate_rreg (SD_, RM1);
4711 srcreg2 = translate_rreg (SD_, RM2);
4712 dstreg1 = translate_rreg (SD_, RN1);
4713 dstreg2 = translate_rreg (SD_, RN2);
4715 State.regs[dstreg1] += State.regs[srcreg1];
4716 State.regs[dstreg2] >>= State.regs[srcreg2];
4719 // 1111 0111 1011 0000 Rm1 Rn1 imm4 Rn2; add_lsr Rm1, Rn1, imm4, Rn2
4720 8.0xf7+8.0xb0+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_lsr
4724 int srcreg1, dstreg1, dstreg2;
4728 srcreg1 = translate_rreg (SD_, RM1);
4729 dstreg1 = translate_rreg (SD_, RN1);
4730 dstreg2 = translate_rreg (SD_, RN2);
4732 State.regs[dstreg1] += State.regs[srcreg1];
4733 State.regs[dstreg2] >>= IMM4;
4737 // 1111 0111 1100 0000 Rm1 Rn1 Rm2 Rn2; add_asl Rm1, Rn1, Rm2, Rn2
4738 8.0xf7+8.0xc0+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_asl
4742 int srcreg1, srcreg2, dstreg1, dstreg2;
4745 srcreg1 = translate_rreg (SD_, RM1);
4746 srcreg2 = translate_rreg (SD_, RM2);
4747 dstreg1 = translate_rreg (SD_, RN1);
4748 dstreg2 = translate_rreg (SD_, RN2);
4750 State.regs[dstreg1] += State.regs[srcreg1];
4751 State.regs[dstreg2] <<= State.regs[srcreg2];
4754 // 1111 0111 1101 0000 Rm1 Rn1 imm4 Rn2; add_asl Rm1, Rn1, imm4, Rn2
4755 8.0xf7+8.0xd0+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_asl
4759 int srcreg1, dstreg1, dstreg2;
4763 srcreg1 = translate_rreg (SD_, RM1);
4764 dstreg1 = translate_rreg (SD_, RN1);
4765 dstreg2 = translate_rreg (SD_, RN2);
4767 State.regs[dstreg1] += State.regs[srcreg1];
4768 State.regs[dstreg2] <<= IMM4;
4771 // 1111 0111 0000 0001 Rm1 Rn1 Rm2 Rn2; cmp_add Rm1, Rn1, Rm2, Rn2
4772 8.0xf7+8.0x01+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_add
4776 int srcreg1, srcreg2, dstreg1, dstreg2;
4779 srcreg1 = translate_rreg (SD_, RM1);
4780 srcreg2 = translate_rreg (SD_, RM2);
4781 dstreg1 = translate_rreg (SD_, RN1);
4782 dstreg2 = translate_rreg (SD_, RN2);
4784 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4785 State.regs[dstreg2] += State.regs[srcreg2];
4788 // 1111 0111 0001 0001 Rm1 Rn1 imm4 Rn2; cmp_add Rm1, Rn1, imm4, Rn2
4789 8.0xf7+8.0x11+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_add
4793 int srcreg1, dstreg1, dstreg2;
4796 srcreg1 = translate_rreg (SD_, RM1);
4797 dstreg1 = translate_rreg (SD_, RN1);
4798 dstreg2 = translate_rreg (SD_, RN2);
4800 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4801 State.regs[dstreg2] += EXTEND4 (IMM4);
4804 // 1111 0111 0010 0001 Rm1 Rn1 Rm2 Rn2; cmp_sub Rm1, Rn1, Rm2, Rn2
4805 8.0xf7+8.0x21+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_sub
4809 int srcreg1, srcreg2, dstreg1, dstreg2;
4812 srcreg1 = translate_rreg (SD_, RM1);
4813 srcreg2 = translate_rreg (SD_, RM2);
4814 dstreg1 = translate_rreg (SD_, RN1);
4815 dstreg2 = translate_rreg (SD_, RN2);
4817 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4818 State.regs[dstreg2] -= State.regs[srcreg2];
4821 // 1111 0111 0011 0001 Rm1 Rn1 imm4 Rn2; cmp_sub Rm1, Rn1, imm4, Rn2
4822 8.0xf7+8.0x31+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_sub
4826 int srcreg1, dstreg1, dstreg2;
4829 srcreg1 = translate_rreg (SD_, RM1);
4830 dstreg1 = translate_rreg (SD_, RN1);
4831 dstreg2 = translate_rreg (SD_, RN2);
4833 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4834 State.regs[dstreg2] -= EXTEND4 (IMM4);
4837 // 1111 0111 0110 0001 Rm1 Rn1 Rm2 Rn2; cmp_mov Rm1, Rn1, Rm2, Rn2
4838 8.0xf7+8.0x61+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_mov
4842 int srcreg1, srcreg2, dstreg1, dstreg2;
4845 srcreg1 = translate_rreg (SD_, RM1);
4846 srcreg2 = translate_rreg (SD_, RM2);
4847 dstreg1 = translate_rreg (SD_, RN1);
4848 dstreg2 = translate_rreg (SD_, RN2);
4850 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4851 State.regs[dstreg2] = State.regs[srcreg2];
4854 // 1111 0111 0111 0001 Rm1 Rn1 imm4 Rn2; cmp_mov Rm1, Rn1, imm4, Rn2
4855 8.0xf7+8.0x71+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_mov
4859 int srcreg1, dstreg1, dstreg2;
4862 srcreg1 = translate_rreg (SD_, RM1);
4863 dstreg1 = translate_rreg (SD_, RN1);
4864 dstreg2 = translate_rreg (SD_, RN2);
4866 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4867 State.regs[dstreg2] = EXTEND4 (IMM4);
4870 // 1111 0111 1000 0001 Rm1 Rn1 Rm2 Rn2; cmp_asr Rm1, Rn1, Rm2, Rn2
4871 8.0xf7+8.0x81+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_asr
4875 int srcreg1, srcreg2, dstreg1, dstreg2;
4879 srcreg1 = translate_rreg (SD_, RM1);
4880 srcreg2 = translate_rreg (SD_, RM2);
4881 dstreg1 = translate_rreg (SD_, RN1);
4882 dstreg2 = translate_rreg (SD_, RN2);
4884 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4885 temp = State.regs[dstreg2];
4886 temp >>= State.regs[srcreg2];
4887 State.regs[dstreg2] = temp;
4890 // 1111 0111 1001 0001 Rm1 Rn1 imm4 Rn2; cmp_asr Rm1, Rn1, imm4, Rn2
4891 8.0xf7+8.0x91+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_asr
4895 int srcreg1, dstreg1, dstreg2;
4899 srcreg1 = translate_rreg (SD_, RM1);
4900 dstreg1 = translate_rreg (SD_, RN1);
4901 dstreg2 = translate_rreg (SD_, RN2);
4903 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4904 temp = State.regs[dstreg2];
4906 State.regs[dstreg2] = temp;
4909 // 1111 0111 1010 0001 Rm1 Rn1 Rm2 Rn2; cmp_lsr Rm1, Rn1, Rm2, Rn2
4910 8.0xf7+8.0xa1+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_lsr
4914 int srcreg1, srcreg2, dstreg1, dstreg2;
4917 srcreg1 = translate_rreg (SD_, RM1);
4918 srcreg2 = translate_rreg (SD_, RM2);
4919 dstreg1 = translate_rreg (SD_, RN1);
4920 dstreg2 = translate_rreg (SD_, RN2);
4922 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4923 State.regs[dstreg2] >>= State.regs[srcreg2];
4926 // 1111 0111 1011 0001 Rm1 Rn1 imm4 Rn2; cmp_lsr Rm1, Rn1, imm4, Rn2
4927 8.0xf7+8.0xb1+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_lsr
4931 int srcreg1, dstreg1, dstreg2;
4935 srcreg1 = translate_rreg (SD_, RM1);
4936 dstreg1 = translate_rreg (SD_, RN1);
4937 dstreg2 = translate_rreg (SD_, RN2);
4939 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4940 State.regs[dstreg2] >>= IMM4;
4944 // 1111 0111 1100 0001 Rm1 Rn1 Rm2 Rn2; cmp_asl Rm1, Rn1, Rm2, Rn2
4945 8.0xf7+8.0xc1+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_asl
4949 int srcreg1, srcreg2, dstreg1, dstreg2;
4952 srcreg1 = translate_rreg (SD_, RM1);
4953 srcreg2 = translate_rreg (SD_, RM2);
4954 dstreg1 = translate_rreg (SD_, RN1);
4955 dstreg2 = translate_rreg (SD_, RN2);
4957 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4958 State.regs[dstreg2] <<= State.regs[srcreg2];
4961 // 1111 0111 1101 0001 Rm1 Rn1 imm4 Rn2; cmp_asl Rm1, Rn1, imm4, Rn2
4962 8.0xf7+8.0xd1+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_asl
4966 int srcreg1, dstreg1, dstreg2;
4970 srcreg1 = translate_rreg (SD_, RM1);
4971 dstreg1 = translate_rreg (SD_, RN1);
4972 dstreg2 = translate_rreg (SD_, RN2);
4974 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
4975 State.regs[dstreg2] <<= IMM4;
4978 // 1111 0111 0000 0010 Rm1 Rn1 Rm2 Rn2; sub_add Rm1, Rn1, Rm2, Rn2
4979 8.0xf7+8.0x02+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_add
4983 int srcreg1, srcreg2, dstreg1, dstreg2;
4986 srcreg1 = translate_rreg (SD_, RM1);
4987 srcreg2 = translate_rreg (SD_, RM2);
4988 dstreg1 = translate_rreg (SD_, RN1);
4989 dstreg2 = translate_rreg (SD_, RN2);
4991 State.regs[dstreg1] -= State.regs[srcreg1];
4992 State.regs[dstreg2] += State.regs[srcreg2];
4995 // 1111 0111 0001 0010 Rm1 Rn1 imm4 Rn2; sub_add Rm1, Rn1, imm4, Rn2
4996 8.0xf7+8.0x12+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_add
5000 int srcreg1, dstreg1, dstreg2;
5003 srcreg1 = translate_rreg (SD_, RM1);
5004 dstreg1 = translate_rreg (SD_, RN1);
5005 dstreg2 = translate_rreg (SD_, RN2);
5007 State.regs[dstreg1] -= State.regs[srcreg1];
5008 State.regs[dstreg2] += EXTEND4 (IMM4);
5011 // 1111 0111 0010 0010 Rm1 Rn1 Rm2 Rn2; sub_sub Rm1, Rn1, Rm2, Rn2
5012 8.0xf7+8.0x22+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_sub
5016 int srcreg1, srcreg2, dstreg1, dstreg2;
5019 srcreg1 = translate_rreg (SD_, RM1);
5020 srcreg2 = translate_rreg (SD_, RM2);
5021 dstreg1 = translate_rreg (SD_, RN1);
5022 dstreg2 = translate_rreg (SD_, RN2);
5024 State.regs[dstreg1] -= State.regs[srcreg1];
5025 State.regs[dstreg2] -= State.regs[srcreg2];
5028 // 1111 0111 0011 0010 Rm1 Rn1 imm4 Rn2; sub_sub Rm1, Rn1, imm4, Rn2
5029 8.0xf7+8.0x32+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_sub
5033 int srcreg1, dstreg1, dstreg2;
5036 srcreg1 = translate_rreg (SD_, RM1);
5037 dstreg1 = translate_rreg (SD_, RN1);
5038 dstreg2 = translate_rreg (SD_, RN2);
5040 State.regs[dstreg1] -= State.regs[srcreg1];
5041 State.regs[dstreg2] -= EXTEND4 (IMM4);
5044 // 1111 0111 0100 0010 Rm1 Rn1 Rm2 Rn2; sub_cmp Rm1, Rn1, Rm2, Rn2
5045 8.0xf7+8.0x42+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_cmp
5049 int srcreg1, srcreg2, dstreg1, dstreg2;
5052 srcreg1 = translate_rreg (SD_, RM1);
5053 srcreg2 = translate_rreg (SD_, RM2);
5054 dstreg1 = translate_rreg (SD_, RN1);
5055 dstreg2 = translate_rreg (SD_, RN2);
5057 State.regs[dstreg1] -= State.regs[srcreg1];
5058 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5061 // 1111 0111 0101 0010 Rm1 Rn1 imm4 Rn2; sub_cmp Rm1, Rn1, imm4, Rn2
5062 8.0xf7+8.0x52+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_cmp
5066 int srcreg1, dstreg1, dstreg2;
5069 srcreg1 = translate_rreg (SD_, RM1);
5070 dstreg1 = translate_rreg (SD_, RN1);
5071 dstreg2 = translate_rreg (SD_, RN2);
5073 State.regs[dstreg1] -= State.regs[srcreg1];
5074 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5077 // 1111 0111 0110 0010 Rm1 Rn1 Rm2 Rn2; sub_mov Rm1, Rn1, Rm2, Rn2
5078 8.0xf7+8.0x62+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_mov
5082 int srcreg1, srcreg2, dstreg1, dstreg2;
5085 srcreg1 = translate_rreg (SD_, RM1);
5086 srcreg2 = translate_rreg (SD_, RM2);
5087 dstreg1 = translate_rreg (SD_, RN1);
5088 dstreg2 = translate_rreg (SD_, RN2);
5090 State.regs[dstreg1] -= State.regs[srcreg1];
5091 State.regs[dstreg2] = State.regs[srcreg2];
5094 // 1111 0111 0111 0010 Rm1 Rn1 imm4 Rn2; sub_mov Rm1, Rn1, imm4, Rn2
5095 8.0xf7+8.0x72+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_mov
5099 int srcreg1, dstreg1, dstreg2;
5102 srcreg1 = translate_rreg (SD_, RM1);
5103 dstreg1 = translate_rreg (SD_, RN1);
5104 dstreg2 = translate_rreg (SD_, RN2);
5106 State.regs[dstreg1] -= State.regs[srcreg1];
5107 State.regs[dstreg2] = EXTEND4 (IMM4);
5110 // 1111 0111 1000 0010 Rm1 Rn1 Rm2 Rn2; sub_asr Rm1, Rn1, Rm2, Rn2
5111 8.0xf7+8.0x82+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_asr
5115 int srcreg1, srcreg2, dstreg1, dstreg2;
5119 srcreg1 = translate_rreg (SD_, RM1);
5120 srcreg2 = translate_rreg (SD_, RM2);
5121 dstreg1 = translate_rreg (SD_, RN1);
5122 dstreg2 = translate_rreg (SD_, RN2);
5124 State.regs[dstreg1] -= State.regs[srcreg1];
5125 temp = State.regs[dstreg2];
5126 temp >>= State.regs[srcreg2];
5127 State.regs[dstreg2] = temp;
5130 // 1111 0111 1001 0010 Rm1 Rn1 imm4 Rn2; sub_asr Rm1, Rn1, imm4, Rn2
5131 8.0xf7+8.0x92+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_asr
5135 int srcreg1, dstreg1, dstreg2;
5139 srcreg1 = translate_rreg (SD_, RM1);
5140 dstreg1 = translate_rreg (SD_, RN1);
5141 dstreg2 = translate_rreg (SD_, RN2);
5143 State.regs[dstreg1] -= State.regs[srcreg1];
5144 temp = State.regs[dstreg2];
5146 State.regs[dstreg2] = temp;
5149 // 1111 0111 1010 0010 Rm1 Rn1 Rm2 Rn2; sub_lsr Rm1, Rn1, Rm2, Rn2
5150 8.0xf7+8.0xa2+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_lsr
5154 int srcreg1, srcreg2, dstreg1, dstreg2;
5157 srcreg1 = translate_rreg (SD_, RM1);
5158 srcreg2 = translate_rreg (SD_, RM2);
5159 dstreg1 = translate_rreg (SD_, RN1);
5160 dstreg2 = translate_rreg (SD_, RN2);
5162 State.regs[dstreg1] -= State.regs[srcreg1];
5163 State.regs[dstreg2] >>= State.regs[srcreg2];
5166 // 1111 0111 1011 0010 Rm1 Rn1 imm4 Rn2; sub_lsr Rm1, Rn1, imm4, Rn2
5167 8.0xf7+8.0xb2+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_lsr
5171 int srcreg1, dstreg1, dstreg2;
5175 srcreg1 = translate_rreg (SD_, RM1);
5176 dstreg1 = translate_rreg (SD_, RN1);
5177 dstreg2 = translate_rreg (SD_, RN2);
5179 State.regs[dstreg1] -= State.regs[srcreg1];
5180 State.regs[dstreg2] >>= IMM4;
5184 // 1111 0111 1100 0010 Rm1 Rn1 Rm2 Rn2; sub_asl Rm1, Rn1, Rm2, Rn2
5185 8.0xf7+8.0xc2+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_asl
5189 int srcreg1, srcreg2, dstreg1, dstreg2;
5192 srcreg1 = translate_rreg (SD_, RM1);
5193 srcreg2 = translate_rreg (SD_, RM2);
5194 dstreg1 = translate_rreg (SD_, RN1);
5195 dstreg2 = translate_rreg (SD_, RN2);
5197 State.regs[dstreg1] -= State.regs[srcreg1];
5198 State.regs[dstreg2] <<= State.regs[srcreg2];
5201 // 1111 0111 1101 0010 Rm1 Rn1 imm4 Rn2; sub_asl Rm1, Rn1, imm4, Rn2
5202 8.0xf7+8.0xd2+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_asl
5206 int srcreg1, dstreg1, dstreg2;
5210 srcreg1 = translate_rreg (SD_, RM1);
5211 dstreg1 = translate_rreg (SD_, RN1);
5212 dstreg2 = translate_rreg (SD_, RN2);
5214 State.regs[dstreg1] -= State.regs[srcreg1];
5215 State.regs[dstreg2] <<= IMM4;
5218 // 1111 0111 0000 0011 Rm1 Rn1 Rm2 Rn2; mov_add Rm1, Rn1, Rm2, Rn2
5219 8.0xf7+8.0x03+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_add
5223 int srcreg1, srcreg2, dstreg1, dstreg2;
5226 srcreg1 = translate_rreg (SD_, RM1);
5227 srcreg2 = translate_rreg (SD_, RM2);
5228 dstreg1 = translate_rreg (SD_, RN1);
5229 dstreg2 = translate_rreg (SD_, RN2);
5231 State.regs[dstreg1] = State.regs[srcreg1];
5232 State.regs[dstreg2] += State.regs[srcreg2];
5235 // 1111 0111 0001 0011 Rm1 Rn1 imm4 Rn2; mov_add Rm1, Rn1, imm4, Rn2
5236 8.0xf7+8.0x13+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_add
5240 int srcreg1, dstreg1, dstreg2;
5243 srcreg1 = translate_rreg (SD_, RM1);
5244 dstreg1 = translate_rreg (SD_, RN1);
5245 dstreg2 = translate_rreg (SD_, RN2);
5247 State.regs[dstreg1] = State.regs[srcreg1];
5248 State.regs[dstreg2] += EXTEND4 (IMM4);
5251 // 1111 0111 0010 0011 Rm1 Rn1 Rm2 Rn2; mov_sub Rm1, Rn1, Rm2, Rn2
5252 8.0xf7+8.0x23+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_sub
5256 int srcreg1, srcreg2, dstreg1, dstreg2;
5259 srcreg1 = translate_rreg (SD_, RM1);
5260 srcreg2 = translate_rreg (SD_, RM2);
5261 dstreg1 = translate_rreg (SD_, RN1);
5262 dstreg2 = translate_rreg (SD_, RN2);
5264 State.regs[dstreg1] = State.regs[srcreg1];
5265 State.regs[dstreg2] -= State.regs[srcreg2];
5268 // 1111 0111 0011 0011 Rm1 Rn1 imm4 Rn2; mov_sub Rm1, Rn1, imm4, Rn2
5269 8.0xf7+8.0x33+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_sub
5273 int srcreg1, dstreg1, dstreg2;
5276 srcreg1 = translate_rreg (SD_, RM1);
5277 dstreg1 = translate_rreg (SD_, RN1);
5278 dstreg2 = translate_rreg (SD_, RN2);
5280 State.regs[dstreg1] = State.regs[srcreg1];
5281 State.regs[dstreg2] -= EXTEND4 (IMM4);
5284 // 1111 0111 0100 0011 Rm1 Rn1 Rm2 Rn2; mov_cmp Rm1, Rn1, Rm2, Rn2
5285 8.0xf7+8.0x43+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_cmp
5289 int srcreg1, srcreg2, dstreg1, dstreg2;
5292 srcreg1 = translate_rreg (SD_, RM1);
5293 srcreg2 = translate_rreg (SD_, RM2);
5294 dstreg1 = translate_rreg (SD_, RN1);
5295 dstreg2 = translate_rreg (SD_, RN2);
5297 State.regs[dstreg1] = State.regs[srcreg1];
5298 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5301 // 1111 0111 0101 0011 Rm1 Rn1 imm4 Rn2; mov_cmp Rm1, Rn1, imm4, Rn2
5302 8.0xf7+8.0x53+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_cmp
5306 int srcreg1, dstreg1, dstreg2;
5309 srcreg1 = translate_rreg (SD_, RM1);
5310 dstreg1 = translate_rreg (SD_, RN1);
5311 dstreg2 = translate_rreg (SD_, RN2);
5313 State.regs[dstreg1] = State.regs[srcreg1];
5314 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5317 // 1111 0111 0110 0011 Rm1 Rn1 Rm2 Rn2; mov_mov Rm1, Rn1, Rm2, Rn2
5318 8.0xf7+8.0x63+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_mov
5322 int srcreg1, srcreg2, dstreg1, dstreg2;
5325 srcreg1 = translate_rreg (SD_, RM1);
5326 srcreg2 = translate_rreg (SD_, RM2);
5327 dstreg1 = translate_rreg (SD_, RN1);
5328 dstreg2 = translate_rreg (SD_, RN2);
5330 State.regs[dstreg1] = State.regs[srcreg1];
5331 State.regs[dstreg2] = State.regs[srcreg2];
5334 // 1111 0111 0111 0011 Rm1 Rn1 imm4 Rn2; mov_mov Rm1, Rn1, imm4, Rn2
5335 8.0xf7+8.0x73+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_mov
5339 int srcreg1, dstreg1, dstreg2;
5342 srcreg1 = translate_rreg (SD_, RM1);
5343 dstreg1 = translate_rreg (SD_, RN1);
5344 dstreg2 = translate_rreg (SD_, RN2);
5346 State.regs[dstreg1] = State.regs[srcreg1];
5347 State.regs[dstreg2] = EXTEND4 (IMM4);
5350 // 1111 0111 1000 0011 Rm1 Rn1 Rm2 Rn2; mov_asr Rm1, Rn1, Rm2, Rn2
5351 8.0xf7+8.0x83+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_asr
5355 int srcreg1, srcreg2, dstreg1, dstreg2;
5359 srcreg1 = translate_rreg (SD_, RM1);
5360 srcreg2 = translate_rreg (SD_, RM2);
5361 dstreg1 = translate_rreg (SD_, RN1);
5362 dstreg2 = translate_rreg (SD_, RN2);
5364 State.regs[dstreg1] = State.regs[srcreg1];
5365 temp = State.regs[dstreg2];
5366 temp >>= State.regs[srcreg2];
5367 State.regs[dstreg2] = temp;
5370 // 1111 0111 1001 0011 Rm1 Rn1 imm4 Rn2; mov_asr Rm1, Rn1, imm4, Rn2
5371 8.0xf7+8.0x93+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_asr
5375 int srcreg1, dstreg1, dstreg2;
5379 srcreg1 = translate_rreg (SD_, RM1);
5380 dstreg1 = translate_rreg (SD_, RN1);
5381 dstreg2 = translate_rreg (SD_, RN2);
5383 State.regs[dstreg1] = State.regs[srcreg1];
5384 temp = State.regs[dstreg2];
5386 State.regs[dstreg2] = temp;
5389 // 1111 0111 1010 0011 Rm1 Rn1 Rm2 Rn2; mov_lsr Rm1, Rn1, Rm2, Rn2
5390 8.0xf7+8.0xa3+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_lsr
5394 int srcreg1, srcreg2, dstreg1, dstreg2;
5397 srcreg1 = translate_rreg (SD_, RM1);
5398 srcreg2 = translate_rreg (SD_, RM2);
5399 dstreg1 = translate_rreg (SD_, RN1);
5400 dstreg2 = translate_rreg (SD_, RN2);
5402 State.regs[dstreg1] = State.regs[srcreg1];
5403 State.regs[dstreg2] >>= State.regs[srcreg2];
5406 // 1111 0111 1011 0011 Rm1 Rn1 imm4 Rn2; mov_lsr Rm1, Rn1, imm4, Rn2
5407 8.0xf7+8.0xb3+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_lsr
5411 int srcreg1, dstreg1, dstreg2;
5415 srcreg1 = translate_rreg (SD_, RM1);
5416 dstreg1 = translate_rreg (SD_, RN1);
5417 dstreg2 = translate_rreg (SD_, RN2);
5419 State.regs[dstreg1] = State.regs[srcreg1];
5420 State.regs[dstreg2] >>= IMM4;
5424 // 1111 0111 1100 0011 Rm1 Rn1 Rm2 Rn2; mov_asl Rm1, Rn1, Rm2, Rn2
5425 8.0xf7+8.0xc3+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_asl
5429 int srcreg1, srcreg2, dstreg1, dstreg2;
5432 srcreg1 = translate_rreg (SD_, RM1);
5433 srcreg2 = translate_rreg (SD_, RM2);
5434 dstreg1 = translate_rreg (SD_, RN1);
5435 dstreg2 = translate_rreg (SD_, RN2);
5437 State.regs[dstreg1] = State.regs[srcreg1];
5438 State.regs[dstreg2] <<= State.regs[srcreg2];
5441 // 1111 0111 1101 0011 Rm1 Rn1 imm4 Rn2; mov_asl Rm1, Rn1, imm4, Rn2
5442 8.0xf7+8.0xd3+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_asl
5446 int srcreg1, dstreg1, dstreg2;
5450 srcreg1 = translate_rreg (SD_, RM1);
5451 dstreg1 = translate_rreg (SD_, RN1);
5452 dstreg2 = translate_rreg (SD_, RN2);
5454 State.regs[dstreg1] = State.regs[srcreg1];
5455 State.regs[dstreg2] <<= IMM4;
5458 // 1111 0111 0000 0100 imm4 Rn1 Rm2 Rn2; add_add imm4, Rn1, Rm2, Rn2
5459 8.0xf7+8.0x04+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_add
5463 int srcreg2, dstreg1, dstreg2;
5466 srcreg2 = translate_rreg (SD_, RM2);
5467 dstreg1 = translate_rreg (SD_, RN1);
5468 dstreg2 = translate_rreg (SD_, RN2);
5470 State.regs[dstreg1] += EXTEND4 (IMM4A);
5471 State.regs[dstreg2] += State.regs[srcreg2];
5474 // 1111 0111 0001 0100 imm4 Rn1 imm4 Rn2; add_add imm4, Rn1, imm4, Rn2
5475 8.0xf7+8.0x14+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_add
5479 int dstreg1, dstreg2;
5482 dstreg1 = translate_rreg (SD_, RN1);
5483 dstreg2 = translate_rreg (SD_, RN2);
5485 State.regs[dstreg1] += EXTEND4 (IMM4A);
5486 State.regs[dstreg2] += EXTEND4 (IMM4);
5489 // 1111 0111 0010 0100 imm4 Rn1 Rm2 Rn2; add_sub imm4, Rn1, Rm2, Rn2
5490 8.0xf7+8.0x24+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_sub
5494 int srcreg2, dstreg1, dstreg2;
5497 srcreg2 = translate_rreg (SD_, RM2);
5498 dstreg1 = translate_rreg (SD_, RN1);
5499 dstreg2 = translate_rreg (SD_, RN2);
5501 State.regs[dstreg1] += EXTEND4 (IMM4A);
5502 State.regs[dstreg2] -= State.regs[srcreg2];
5505 // 1111 0111 0011 0100 imm4 Rn1 imm4 Rn2; add_sub imm4, Rn1, imm4, Rn2
5506 8.0xf7+8.0x34+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_sub
5510 int dstreg1, dstreg2;
5513 dstreg1 = translate_rreg (SD_, RN1);
5514 dstreg2 = translate_rreg (SD_, RN2);
5516 State.regs[dstreg1] += EXTEND4 (IMM4A);
5517 State.regs[dstreg2] -= EXTEND4 (IMM4);
5520 // 1111 0111 0100 0100 imm4 Rn1 Rm2 Rn2; add_cmp imm4, Rn1, Rm2, Rn2
5521 8.0xf7+8.0x44+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_cmp
5525 int srcreg2, dstreg1, dstreg2;
5528 srcreg2 = translate_rreg (SD_, RM2);
5529 dstreg1 = translate_rreg (SD_, RN1);
5530 dstreg2 = translate_rreg (SD_, RN2);
5532 State.regs[dstreg1] += EXTEND4 (IMM4A);
5533 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5536 // 1111 0111 0101 0100 imm4 Rn1 imm4 Rn2; add_cmp imm4, Rn1, imm4, Rn2
5537 8.0xf7+8.0x54+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_cmp
5541 int dstreg1, dstreg2;
5544 dstreg1 = translate_rreg (SD_, RN1);
5545 dstreg2 = translate_rreg (SD_, RN2);
5547 State.regs[dstreg1] += EXTEND4 (IMM4A);
5548 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5551 // 1111 0111 0110 0100 imm4 Rn1 Rm2 Rn2; add_mov imm4, Rn1, Rm2, Rn2
5552 8.0xf7+8.0x64+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_mov
5556 int srcreg2, dstreg1, dstreg2;
5559 srcreg2 = translate_rreg (SD_, RM2);
5560 dstreg1 = translate_rreg (SD_, RN1);
5561 dstreg2 = translate_rreg (SD_, RN2);
5563 State.regs[dstreg1] += EXTEND4 (IMM4A);
5564 State.regs[dstreg2] = State.regs[srcreg2];
5567 // 1111 0111 0111 0100 imm4 Rn1 imm4 Rn2; add_mov imm4, Rn1, imm4, Rn2
5568 8.0xf7+8.0x74+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_mov
5572 int dstreg1, dstreg2;
5575 dstreg1 = translate_rreg (SD_, RN1);
5576 dstreg2 = translate_rreg (SD_, RN2);
5578 State.regs[dstreg1] += EXTEND4 (IMM4A);
5579 State.regs[dstreg2] = EXTEND4 (IMM4);
5582 // 1111 0111 1000 0100 imm4 Rn1 Rm2 Rn2; add_asr imm4, Rn1, Rm2, Rn2
5583 8.0xf7+8.0x84+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_asr
5587 int srcreg2, dstreg1, dstreg2;
5591 srcreg2 = translate_rreg (SD_, RM2);
5592 dstreg1 = translate_rreg (SD_, RN1);
5593 dstreg2 = translate_rreg (SD_, RN2);
5595 State.regs[dstreg1] += EXTEND4 (IMM4A);
5596 temp = State.regs[dstreg2];
5597 temp >>= State.regs[srcreg2];
5598 State.regs[dstreg2] = temp;
5601 // 1111 0111 1001 0100 imm4 Rn1 imm4 Rn2; add_asr imm4, Rn1, imm4, Rn2
5602 8.0xf7+8.0x94+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_asr
5606 int dstreg1, dstreg2;
5610 dstreg1 = translate_rreg (SD_, RN1);
5611 dstreg2 = translate_rreg (SD_, RN2);
5613 State.regs[dstreg1] += EXTEND4 (IMM4A);
5614 temp = State.regs[dstreg2];
5616 State.regs[dstreg2] = temp;
5619 // 1111 0111 1010 0100 imm4 Rn1 Rm2 Rn2; add_lsr imm4, Rn1, Rm2, Rn2
5620 8.0xf7+8.0xa4+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_lsr
5624 int srcreg2, dstreg1, dstreg2;
5627 srcreg2 = translate_rreg (SD_, RM2);
5628 dstreg1 = translate_rreg (SD_, RN1);
5629 dstreg2 = translate_rreg (SD_, RN2);
5631 State.regs[dstreg1] += EXTEND4 (IMM4A);
5632 State.regs[dstreg2] >>= State.regs[srcreg2];
5635 // 1111 0111 1011 0100 imm4 Rn1 imm4 Rn2; add_lsr imm4, Rn1, imm4, Rn2
5636 8.0xf7+8.0xb4+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_lsr
5640 int dstreg1, dstreg2;
5644 dstreg1 = translate_rreg (SD_, RN1);
5645 dstreg2 = translate_rreg (SD_, RN2);
5647 State.regs[dstreg1] += EXTEND4 (IMM4A);
5648 State.regs[dstreg2] >>= IMM4;
5652 // 1111 0111 1100 0100 imm4 Rn1 Rm2 Rn2; add_asl imm4, Rn1, Rm2, Rn2
5653 8.0xf7+8.0xc4+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_asl
5657 int srcreg2, dstreg1, dstreg2;
5660 srcreg2 = translate_rreg (SD_, RM2);
5661 dstreg1 = translate_rreg (SD_, RN1);
5662 dstreg2 = translate_rreg (SD_, RN2);
5664 State.regs[dstreg1] += EXTEND4 (IMM4A);
5665 State.regs[dstreg2] <<= State.regs[srcreg2];
5668 // 1111 0111 1101 0100 imm4 Rn1 imm4 Rn2; add_asl imm4, Rn1, imm4, Rn2
5669 8.0xf7+8.0xd4+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_asl
5673 int dstreg1, dstreg2;
5677 dstreg1 = translate_rreg (SD_, RN1);
5678 dstreg2 = translate_rreg (SD_, RN2);
5680 State.regs[dstreg1] += EXTEND4 (IMM4A);
5681 State.regs[dstreg2] <<= IMM4;
5684 // 1111 0111 0000 0101 imm4 Rn1 Rm2 Rn2; cmp_add imm4, Rn1, Rm2, Rn2
5685 8.0xf7+8.0x05+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_add
5689 int srcreg2, dstreg1, dstreg2;
5692 srcreg2 = translate_rreg (SD_, RM2);
5693 dstreg1 = translate_rreg (SD_, RN1);
5694 dstreg2 = translate_rreg (SD_, RN2);
5696 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5697 State.regs[dstreg2] += State.regs[srcreg2];
5700 // 1111 0111 0001 0101 imm4 Rn1 imm4 Rn2; cmp_add imm4, Rn1, imm4, Rn2
5701 8.0xf7+8.0x15+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_add
5705 int dstreg1, dstreg2;
5708 dstreg1 = translate_rreg (SD_, RN1);
5709 dstreg2 = translate_rreg (SD_, RN2);
5711 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5712 State.regs[dstreg2] += EXTEND4 (IMM4);
5715 // 1111 0111 0010 0101 imm4 Rn1 Rm2 Rn2; cmp_sub imm4, Rn1, Rm2, Rn2
5716 8.0xf7+8.0x25+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_sub
5720 int srcreg2, dstreg1, dstreg2;
5723 srcreg2 = translate_rreg (SD_, RM2);
5724 dstreg1 = translate_rreg (SD_, RN1);
5725 dstreg2 = translate_rreg (SD_, RN2);
5727 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5728 State.regs[dstreg2] -= State.regs[srcreg2];
5731 // 1111 0111 0011 0101 imm4 Rn1 imm4 Rn2; cmp_sub imm4, Rn1, imm4, Rn2
5732 8.0xf7+8.0x35+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_sub
5736 int dstreg1, dstreg2;
5739 dstreg1 = translate_rreg (SD_, RN1);
5740 dstreg2 = translate_rreg (SD_, RN2);
5742 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5743 State.regs[dstreg2] -= EXTEND4 (IMM4);
5746 // 1111 0111 0110 0101 imm4 Rn1 Rm2 Rn2; cmp_mov imm4, Rn1, Rm2, Rn2
5747 8.0xf7+8.0x65+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_mov
5751 int srcreg2, dstreg1, dstreg2;
5754 srcreg2 = translate_rreg (SD_, RM2);
5755 dstreg1 = translate_rreg (SD_, RN1);
5756 dstreg2 = translate_rreg (SD_, RN2);
5758 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5759 State.regs[dstreg2] = State.regs[srcreg2];
5762 // 1111 0111 0111 0101 imm4 Rn1 imm4 Rn2; cmp_mov imm4, Rn1, imm4, Rn2
5763 8.0xf7+8.0x75+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_mov
5767 int dstreg1, dstreg2;
5770 dstreg1 = translate_rreg (SD_, RN1);
5771 dstreg2 = translate_rreg (SD_, RN2);
5773 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5774 State.regs[dstreg2] = EXTEND4 (IMM4);
5777 // 1111 0111 1000 0101 imm4 Rn1 Rm2 Rn2; cmp_asr imm4, Rn1, Rm2, Rn2
5778 8.0xf7+8.0x85+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_asr
5782 int srcreg2, dstreg1, dstreg2;
5786 srcreg2 = translate_rreg (SD_, RM2);
5787 dstreg1 = translate_rreg (SD_, RN1);
5788 dstreg2 = translate_rreg (SD_, RN2);
5790 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5791 temp = State.regs[dstreg2];
5792 temp >>= State.regs[srcreg2];
5793 State.regs[dstreg2] = temp;
5796 // 1111 0111 1001 0101 imm4 Rn1 imm4 Rn2; cmp_asr imm4, Rn1, imm4, Rn2
5797 8.0xf7+8.0x95+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_asr
5801 int dstreg1, dstreg2;
5805 dstreg1 = translate_rreg (SD_, RN1);
5806 dstreg2 = translate_rreg (SD_, RN2);
5808 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5809 temp = State.regs[dstreg2];
5811 State.regs[dstreg2] = temp;
5814 // 1111 0111 1010 0101 imm4 Rn1 Rm2 Rn2; cmp_lsr imm4, Rn1, Rm2, Rn2
5815 8.0xf7+8.0xa5+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_lsr
5819 int srcreg2, dstreg1, dstreg2;
5822 srcreg2 = translate_rreg (SD_, RM2);
5823 dstreg1 = translate_rreg (SD_, RN1);
5824 dstreg2 = translate_rreg (SD_, RN2);
5826 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5827 State.regs[dstreg2] >>= State.regs[srcreg2];
5830 // 1111 0111 1011 0101 imm4 Rn1 imm4 Rn2; cmp_lsr imm4, Rn1, imm4, Rn2
5831 8.0xf7+8.0xb5+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_lsr
5835 int dstreg1, dstreg2;
5839 dstreg1 = translate_rreg (SD_, RN1);
5840 dstreg2 = translate_rreg (SD_, RN2);
5842 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5843 State.regs[dstreg2] >>= IMM4;
5847 // 1111 0111 1100 0101 imm4 Rn1 Rm2 Rn2; cmp_asl imm4, Rn1, Rm2, Rn2
5848 8.0xf7+8.0xc5+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_asl
5852 int srcreg2, dstreg1, dstreg2;
5855 srcreg2 = translate_rreg (SD_, RM2);
5856 dstreg1 = translate_rreg (SD_, RN1);
5857 dstreg2 = translate_rreg (SD_, RN2);
5859 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5860 State.regs[dstreg2] <<= State.regs[srcreg2];
5863 // 1111 0111 1101 0101 imm4 Rn1 imm4 Rn2; cmp_asl imm4, Rn1, imm4, Rn2
5864 8.0xf7+8.0xd5+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_asl
5868 int dstreg1, dstreg2;
5872 dstreg1 = translate_rreg (SD_, RN1);
5873 dstreg2 = translate_rreg (SD_, RN2);
5875 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5876 State.regs[dstreg2] <<= IMM4;
5879 // 1111 0111 0000 0110 imm4 Rn1 Rm2 Rn2; sub_add imm4, Rn1, Rm2, Rn2
5880 8.0xf7+8.0x06+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_add
5884 int srcreg2, dstreg1, dstreg2;
5887 srcreg2 = translate_rreg (SD_, RM2);
5888 dstreg1 = translate_rreg (SD_, RN1);
5889 dstreg2 = translate_rreg (SD_, RN2);
5891 State.regs[dstreg1] -= EXTEND4 (IMM4A);
5892 State.regs[dstreg2] += State.regs[srcreg2];
5895 // 1111 0111 0001 0110 imm4 Rn1 imm4 Rn2; sub_add imm4, Rn1, imm4, Rn2
5896 8.0xf7+8.0x16+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_add
5900 int dstreg1, dstreg2;
5903 dstreg1 = translate_rreg (SD_, RN1);
5904 dstreg2 = translate_rreg (SD_, RN2);
5906 State.regs[dstreg1] -= EXTEND4 (IMM4A);
5907 State.regs[dstreg2] += EXTEND4 (IMM4);
5910 // 1111 0111 0010 0110 imm4 Rn1 Rm2 Rn2; sub_sub imm4, Rn1, Rm2, Rn2
5911 8.0xf7+8.0x26+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_sub
5915 int srcreg2, dstreg1, dstreg2;
5918 srcreg2 = translate_rreg (SD_, RM2);
5919 dstreg1 = translate_rreg (SD_, RN1);
5920 dstreg2 = translate_rreg (SD_, RN2);
5922 State.regs[dstreg1] -= EXTEND4 (IMM4A);
5923 State.regs[dstreg2] -= State.regs[srcreg2];
5926 // 1111 0111 0011 0110 imm4 Rn1 imm4 Rn2; sub_sub imm4, Rn1, imm4, Rn2
5927 8.0xf7+8.0x36+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_sub
5931 int dstreg1, dstreg2;
5934 dstreg1 = translate_rreg (SD_, RN1);
5935 dstreg2 = translate_rreg (SD_, RN2);
5937 State.regs[dstreg1] -= EXTEND4 (IMM4A);
5938 State.regs[dstreg2] -= EXTEND4 (IMM4);
5941 // 1111 0111 0100 0110 imm4 Rn1 Rm2 Rn2; sub_cmp imm4, Rn1, Rm2, Rn2
5942 8.0xf7+8.0x46+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_cmp
5946 int srcreg2, dstreg1, dstreg2;
5949 srcreg2 = translate_rreg (SD_, RM2);
5950 dstreg1 = translate_rreg (SD_, RN1);
5951 dstreg2 = translate_rreg (SD_, RN2);
5953 State.regs[dstreg1] -= EXTEND4 (IMM4A);
5954 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5957 // 1111 0111 0101 0110 imm4 Rn1 imm4 Rn2; sub_cmp imm4, Rn1, imm4, Rn2
5958 8.0xf7+8.0x56+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_cmp
5962 int dstreg1, dstreg2;
5965 dstreg1 = translate_rreg (SD_, RN1);
5966 dstreg2 = translate_rreg (SD_, RN2);
5968 State.regs[dstreg1] -= EXTEND4 (IMM4A);
5969 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5972 // 1111 0111 0110 0110 imm4 Rn1 Rm2 Rn2; sub_mov imm4, Rn1, Rm2, Rn2
5973 8.0xf7+8.0x66+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_mov
5977 int srcreg2, dstreg1, dstreg2;
5980 srcreg2 = translate_rreg (SD_, RM2);
5981 dstreg1 = translate_rreg (SD_, RN1);
5982 dstreg2 = translate_rreg (SD_, RN2);
5984 State.regs[dstreg1] -= EXTEND4 (IMM4A);
5985 State.regs[dstreg2] = State.regs[srcreg2];
5988 // 1111 0111 0111 0110 imm4 Rn1 imm4 Rn2; sub_mov imm4, Rn1, imm4, Rn2
5989 8.0xf7+8.0x76+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_mov
5993 int dstreg1, dstreg2;
5996 dstreg1 = translate_rreg (SD_, RN1);
5997 dstreg2 = translate_rreg (SD_, RN2);
5999 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6000 State.regs[dstreg2] = EXTEND4 (IMM4);
6003 // 1111 0111 1000 0110 imm4 Rn1 Rm2 Rn2; sub_asr imm4, Rn1, Rm2, Rn2
6004 8.0xf7+8.0x86+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_asr
6008 int srcreg2, dstreg1, dstreg2;
6012 srcreg2 = translate_rreg (SD_, RM2);
6013 dstreg1 = translate_rreg (SD_, RN1);
6014 dstreg2 = translate_rreg (SD_, RN2);
6016 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6017 temp = State.regs[dstreg2];
6018 temp >>= State.regs[srcreg2];
6019 State.regs[dstreg2] = temp;
6022 // 1111 0111 1001 0110 imm4 Rn1 imm4 Rn2; sub_asr imm4, Rn1, imm4, Rn2
6023 8.0xf7+8.0x96+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_asr
6027 int dstreg1, dstreg2;
6031 dstreg1 = translate_rreg (SD_, RN1);
6032 dstreg2 = translate_rreg (SD_, RN2);
6034 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6035 temp = State.regs[dstreg2];
6037 State.regs[dstreg2] = temp;
6040 // 1111 0111 1010 0110 imm4 Rn1 Rm2 Rn2; sub_lsr imm4, Rn1, Rm2, Rn2
6041 8.0xf7+8.0xa6+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_lsr
6045 int srcreg2, dstreg1, dstreg2;
6048 srcreg2 = translate_rreg (SD_, RM2);
6049 dstreg1 = translate_rreg (SD_, RN1);
6050 dstreg2 = translate_rreg (SD_, RN2);
6052 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6053 State.regs[dstreg2] >>= State.regs[srcreg2];
6056 // 1111 0111 1011 0110 imm4 Rn1 imm4 Rn2; sub_lsr imm4, Rn1, imm4, Rn2
6057 8.0xf7+8.0xb6+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_lsr
6061 int dstreg1, dstreg2;
6065 dstreg1 = translate_rreg (SD_, RN1);
6066 dstreg2 = translate_rreg (SD_, RN2);
6068 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6069 State.regs[dstreg2] >>= IMM4;
6073 // 1111 0111 1100 0110 imm4 Rn1 Rm2 Rn2; sub_asl imm4, Rn1, Rm2, Rn2
6074 8.0xf7+8.0xc6+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_asl
6078 int srcreg2, dstreg1, dstreg2;
6081 srcreg2 = translate_rreg (SD_, RM2);
6082 dstreg1 = translate_rreg (SD_, RN1);
6083 dstreg2 = translate_rreg (SD_, RN2);
6085 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6086 State.regs[dstreg2] <<= State.regs[srcreg2];
6089 // 1111 0111 1101 0110 imm4 Rn1 imm4 Rn2; sub_asl imm4, Rn1, imm4, Rn2
6090 8.0xf7+8.0xd6+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_asl
6094 int dstreg1, dstreg2;
6098 dstreg1 = translate_rreg (SD_, RN1);
6099 dstreg2 = translate_rreg (SD_, RN2);
6101 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6102 State.regs[dstreg2] <<= IMM4;
6105 // 1111 0111 0000 0111 imm4 Rn1 Rm2 Rn2; mov_add imm4, Rn1, Rm2, Rn2
6106 8.0xf7+8.0x07+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_add
6110 int srcreg2, dstreg1, dstreg2;
6113 srcreg2 = translate_rreg (SD_, RM2);
6114 dstreg1 = translate_rreg (SD_, RN1);
6115 dstreg2 = translate_rreg (SD_, RN2);
6117 State.regs[dstreg1] = EXTEND4 (IMM4A);
6118 State.regs[dstreg2] += State.regs[srcreg2];
6121 // 1111 0111 0001 0111 imm4 Rn1 imm4 Rn2; mov_add imm4, Rn1, imm4, Rn2
6122 8.0xf7+8.0x17+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_add
6126 int dstreg1, dstreg2;
6129 dstreg1 = translate_rreg (SD_, RN1);
6130 dstreg2 = translate_rreg (SD_, RN2);
6132 State.regs[dstreg1] = EXTEND4 (IMM4A);
6133 State.regs[dstreg2] += EXTEND4 (IMM4);
6136 // 1111 0111 0010 0111 imm4 Rn1 Rm2 Rn2; mov_sub imm4, Rn1, Rm2, Rn2
6137 8.0xf7+8.0x27+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_sub
6141 int srcreg2, dstreg1, dstreg2;
6144 srcreg2 = translate_rreg (SD_, RM2);
6145 dstreg1 = translate_rreg (SD_, RN1);
6146 dstreg2 = translate_rreg (SD_, RN2);
6148 State.regs[dstreg1] = EXTEND4 (IMM4A);
6149 State.regs[dstreg2] -= State.regs[srcreg2];
6152 // 1111 0111 0011 0111 imm4 Rn1 imm4 Rn2; mov_sub imm4, Rn1, imm4, Rn2
6153 8.0xf7+8.0x37+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_sub
6157 int dstreg1, dstreg2;
6160 dstreg1 = translate_rreg (SD_, RN1);
6161 dstreg2 = translate_rreg (SD_, RN2);
6163 State.regs[dstreg1] = EXTEND4 (IMM4A);
6164 State.regs[dstreg2] -= EXTEND4 (IMM4);
6167 // 1111 0111 0100 0111 imm4 Rn1 Rm2 Rn2; mov_cmp imm4, Rn1, Rm2, Rn2
6168 8.0xf7+8.0x47+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_cmp
6172 int srcreg2, dstreg1, dstreg2;
6175 srcreg2 = translate_rreg (SD_, RM2);
6176 dstreg1 = translate_rreg (SD_, RN1);
6177 dstreg2 = translate_rreg (SD_, RN2);
6179 State.regs[dstreg1] = EXTEND4 (IMM4A);
6180 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6183 // 1111 0111 0101 0111 imm4 Rn1 imm4 Rn2; mov_cmp imm4, Rn1, imm4, Rn2
6184 8.0xf7+8.0x57+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_cmp
6188 int dstreg1, dstreg2;
6191 dstreg1 = translate_rreg (SD_, RN1);
6192 dstreg2 = translate_rreg (SD_, RN2);
6194 State.regs[dstreg1] = EXTEND4 (IMM4A);
6195 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6198 // 1111 0111 0110 0111 imm4 Rn1 Rm2 Rn2; mov_mov imm4, Rn1, Rm2, Rn2
6199 8.0xf7+8.0x67+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_mov
6203 int srcreg2, dstreg1, dstreg2;
6206 srcreg2 = translate_rreg (SD_, RM2);
6207 dstreg1 = translate_rreg (SD_, RN1);
6208 dstreg2 = translate_rreg (SD_, RN2);
6210 State.regs[dstreg1] = EXTEND4 (IMM4A);
6211 State.regs[dstreg2] = State.regs[srcreg2];
6214 // 1111 0111 0111 0111 imm4 Rn1 imm4 Rn2; mov_mov imm4, Rn1, imm4, Rn2
6215 8.0xf7+8.0x77+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_mov
6219 int dstreg1, dstreg2;
6222 dstreg1 = translate_rreg (SD_, RN1);
6223 dstreg2 = translate_rreg (SD_, RN2);
6225 State.regs[dstreg1] = EXTEND4 (IMM4A);
6226 State.regs[dstreg2] = EXTEND4 (IMM4);
6229 // 1111 0111 1000 0111 imm4 Rn1 Rm2 Rn2; mov_asr imm4, Rn1, Rm2, Rn2
6230 8.0xf7+8.0x87+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_asr
6234 int srcreg2, dstreg1, dstreg2;
6238 srcreg2 = translate_rreg (SD_, RM2);
6239 dstreg1 = translate_rreg (SD_, RN1);
6240 dstreg2 = translate_rreg (SD_, RN2);
6242 State.regs[dstreg1] = EXTEND4 (IMM4A);
6243 temp = State.regs[dstreg2];
6244 temp >>= State.regs[srcreg2];
6245 State.regs[dstreg2] = temp;
6248 // 1111 0111 1001 0111 imm4 Rn1 imm4 Rn2; mov_asr imm4, Rn1, imm4, Rn2
6249 8.0xf7+8.0x97+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_asr
6253 int dstreg1, dstreg2;
6257 dstreg1 = translate_rreg (SD_, RN1);
6258 dstreg2 = translate_rreg (SD_, RN2);
6260 State.regs[dstreg1] = EXTEND4 (IMM4A);
6261 temp = State.regs[dstreg2];
6263 State.regs[dstreg2] = temp;
6266 // 1111 0111 1010 0111 imm4 Rn1 Rm2 Rn2; mov_lsr imm4, Rn1, Rm2, Rn2
6267 8.0xf7+8.0xa7+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_lsr
6271 int srcreg2, dstreg1, dstreg2;
6274 srcreg2 = translate_rreg (SD_, RM2);
6275 dstreg1 = translate_rreg (SD_, RN1);
6276 dstreg2 = translate_rreg (SD_, RN2);
6278 State.regs[dstreg1] = EXTEND4 (IMM4A);
6279 State.regs[dstreg2] >>= State.regs[srcreg2];
6282 // 1111 0111 1011 0111 imm4 Rn1 imm4 Rn2; mov_lsr imm4, Rn1, imm4, Rn2
6283 8.0xf7+8.0xb7+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_lsr
6287 int dstreg1, dstreg2;
6291 dstreg1 = translate_rreg (SD_, RN1);
6292 dstreg2 = translate_rreg (SD_, RN2);
6294 State.regs[dstreg1] = EXTEND4 (IMM4A);
6295 State.regs[dstreg2] >>= IMM4;
6299 // 1111 0111 1100 0111 imm4 Rn1 Rm2 Rn2; mov_asl imm4, Rn1, Rm2, Rn2
6300 8.0xf7+8.0xc7+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_asl
6304 int srcreg2, dstreg1, dstreg2;
6307 srcreg2 = translate_rreg (SD_, RM2);
6308 dstreg1 = translate_rreg (SD_, RN1);
6309 dstreg2 = translate_rreg (SD_, RN2);
6311 State.regs[dstreg1] = EXTEND4 (IMM4A);
6312 State.regs[dstreg2] <<= State.regs[srcreg2];
6315 // 1111 0111 1101 0111 imm4 Rn1 imm4 Rn2; mov_asl imm4, Rn1, imm4, Rn2
6316 8.0xf7+8.0xd7+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_asl
6320 int dstreg1, dstreg2;
6324 dstreg1 = translate_rreg (SD_, RN1);
6325 dstreg2 = translate_rreg (SD_, RN2);
6327 State.regs[dstreg1] = EXTEND4 (IMM4A);
6328 State.regs[dstreg2] <<= IMM4;
6331 // 1111 0111 0000 1000 Rm1 Rn1 Rm2 Rn2; and_add Rm1, Rn1, Rm2, Rn2
6332 8.0xf7+8.0x08+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_add
6336 int srcreg1, srcreg2, dstreg1, dstreg2;
6339 srcreg1 = translate_rreg (SD_, RM1);
6340 srcreg2 = translate_rreg (SD_, RM2);
6341 dstreg1 = translate_rreg (SD_, RN1);
6342 dstreg2 = translate_rreg (SD_, RN2);
6344 State.regs[dstreg1] &= State.regs[srcreg1];
6345 State.regs[dstreg2] += State.regs[srcreg2];
6348 // 1111 0111 0001 1000 Rm1 Rn1 imm4 Rn2; and_add Rm1, Rn1, imm4, Rn2
6349 8.0xf7+8.0x18+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_add
6353 int srcreg1, dstreg1, dstreg2;
6356 srcreg1 = translate_rreg (SD_, RM1);
6357 dstreg1 = translate_rreg (SD_, RN1);
6358 dstreg2 = translate_rreg (SD_, RN2);
6360 State.regs[dstreg1] &= State.regs[srcreg1];
6361 State.regs[dstreg2] += EXTEND4 (IMM4);
6364 // 1111 0111 0010 1000 Rm1 Rn1 Rm2 Rn2; and_sub Rm1, Rn1, Rm2, Rn2
6365 8.0xf7+8.0x28+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_sub
6369 int srcreg1, srcreg2, dstreg1, dstreg2;
6372 srcreg1 = translate_rreg (SD_, RM1);
6373 srcreg2 = translate_rreg (SD_, RM2);
6374 dstreg1 = translate_rreg (SD_, RN1);
6375 dstreg2 = translate_rreg (SD_, RN2);
6377 State.regs[dstreg1] &= State.regs[srcreg1];
6378 State.regs[dstreg2] -= State.regs[srcreg2];
6381 // 1111 0111 0011 1000 Rm1 Rn1 imm4 Rn2; and_sub Rm1, Rn1, imm4, Rn2
6382 8.0xf7+8.0x38+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_sub
6386 int srcreg1, dstreg1, dstreg2;
6389 srcreg1 = translate_rreg (SD_, RM1);
6390 dstreg1 = translate_rreg (SD_, RN1);
6391 dstreg2 = translate_rreg (SD_, RN2);
6393 State.regs[dstreg1] &= State.regs[srcreg1];
6394 State.regs[dstreg2] -= EXTEND4 (IMM4);
6397 // 1111 0111 0100 1000 Rm1 Rn1 Rm2 Rn2; and_cmp Rm1, Rn1, Rm2, Rn2
6398 8.0xf7+8.0x48+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_cmp
6402 int srcreg1, srcreg2, dstreg1, dstreg2;
6405 srcreg1 = translate_rreg (SD_, RM1);
6406 srcreg2 = translate_rreg (SD_, RM2);
6407 dstreg1 = translate_rreg (SD_, RN1);
6408 dstreg2 = translate_rreg (SD_, RN2);
6410 State.regs[dstreg1] &= State.regs[srcreg1];
6411 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6414 // 1111 0111 0101 1000 Rm1 Rn1 imm4 Rn2; and_cmp Rm1, Rn1, imm4, Rn2
6415 8.0xf7+8.0x58+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_cmp
6419 int srcreg1, dstreg1, dstreg2;
6422 srcreg1 = translate_rreg (SD_, RM1);
6423 dstreg1 = translate_rreg (SD_, RN1);
6424 dstreg2 = translate_rreg (SD_, RN2);
6426 State.regs[dstreg1] &= State.regs[srcreg1];
6427 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6430 // 1111 0111 0110 1000 Rm1 Rn1 Rm2 Rn2; and_mov Rm1, Rn1, Rm2, Rn2
6431 8.0xf7+8.0x68+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_mov
6435 int srcreg1, srcreg2, dstreg1, dstreg2;
6438 srcreg1 = translate_rreg (SD_, RM1);
6439 srcreg2 = translate_rreg (SD_, RM2);
6440 dstreg1 = translate_rreg (SD_, RN1);
6441 dstreg2 = translate_rreg (SD_, RN2);
6443 State.regs[dstreg1] &= State.regs[srcreg1];
6444 State.regs[dstreg2] = State.regs[srcreg2];
6447 // 1111 0111 0111 1000 Rm1 Rn1 imm4 Rn2; and_mov Rm1, Rn1, imm4, Rn2
6448 8.0xf7+8.0x78+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_mov
6452 int srcreg1, dstreg1, dstreg2;
6455 srcreg1 = translate_rreg (SD_, RM1);
6456 dstreg1 = translate_rreg (SD_, RN1);
6457 dstreg2 = translate_rreg (SD_, RN2);
6459 State.regs[dstreg1] &= State.regs[srcreg1];
6460 State.regs[dstreg2] = EXTEND4 (IMM4);
6463 // 1111 0111 1000 1000 Rm1 Rn1 Rm2 Rn2; and_asr Rm1, Rn1, Rm2, Rn2
6464 8.0xf7+8.0x88+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_asr
6468 int srcreg1, srcreg2, dstreg1, dstreg2;
6472 srcreg1 = translate_rreg (SD_, RM1);
6473 srcreg2 = translate_rreg (SD_, RM2);
6474 dstreg1 = translate_rreg (SD_, RN1);
6475 dstreg2 = translate_rreg (SD_, RN2);
6477 State.regs[dstreg1] &= State.regs[srcreg1];
6478 temp = State.regs[dstreg2];
6479 temp >>= State.regs[srcreg2];
6480 State.regs[dstreg2] = temp;
6483 // 1111 0111 1001 1000 Rm1 Rn1 imm4 Rn2; and_asr Rm1, Rn1, imm4, Rn2
6484 8.0xf7+8.0x98+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_asr
6488 int srcreg1, dstreg1, dstreg2;
6492 srcreg1 = translate_rreg (SD_, RM1);
6493 dstreg1 = translate_rreg (SD_, RN1);
6494 dstreg2 = translate_rreg (SD_, RN2);
6496 State.regs[dstreg1] &= State.regs[srcreg1];
6497 temp = State.regs[dstreg2];
6499 State.regs[dstreg2] = temp;
6502 // 1111 0111 1010 1000 Rm1 Rn1 Rm2 Rn2; and_lsr Rm1, Rn1, Rm2, Rn2
6503 8.0xf7+8.0xa8+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_lsr
6507 int srcreg1, srcreg2, dstreg1, dstreg2;
6510 srcreg1 = translate_rreg (SD_, RM1);
6511 srcreg2 = translate_rreg (SD_, RM2);
6512 dstreg1 = translate_rreg (SD_, RN1);
6513 dstreg2 = translate_rreg (SD_, RN2);
6515 State.regs[dstreg1] &= State.regs[srcreg1];
6516 State.regs[dstreg2] >>= State.regs[srcreg2];
6519 // 1111 0111 1011 1000 Rm1 Rn1 imm4 Rn2; and_lsr Rm1, Rn1, imm4, Rn2
6520 8.0xf7+8.0xb8+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_lsr
6524 int srcreg1, dstreg1, dstreg2;
6528 srcreg1 = translate_rreg (SD_, RM1);
6529 dstreg1 = translate_rreg (SD_, RN1);
6530 dstreg2 = translate_rreg (SD_, RN2);
6532 State.regs[dstreg1] &= State.regs[srcreg1];
6533 State.regs[dstreg2] >>= IMM4;
6537 // 1111 0111 1100 1000 Rm1 Rn1 Rm2 Rn2; and_asl Rm1, Rn1, Rm2, Rn2
6538 8.0xf7+8.0xc8+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_asl
6542 int srcreg1, srcreg2, dstreg1, dstreg2;
6545 srcreg1 = translate_rreg (SD_, RM1);
6546 srcreg2 = translate_rreg (SD_, RM2);
6547 dstreg1 = translate_rreg (SD_, RN1);
6548 dstreg2 = translate_rreg (SD_, RN2);
6550 State.regs[dstreg1] &= State.regs[srcreg1];
6551 State.regs[dstreg2] <<= State.regs[srcreg2];
6554 // 1111 0111 1101 1000 Rm1 Rn1 imm4 Rn2; and_asl Rm1, Rn1, imm4, Rn2
6555 8.0xf7+8.0xd8+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_asl
6559 int srcreg1, dstreg1, dstreg2;
6563 srcreg1 = translate_rreg (SD_, RM1);
6564 dstreg1 = translate_rreg (SD_, RN1);
6565 dstreg2 = translate_rreg (SD_, RN2);
6567 State.regs[dstreg1] &= State.regs[srcreg1];
6568 State.regs[dstreg2] <<= IMM4;
6571 // 1111 0111 0000 1001 Rm1 Rn1 Rm2 Rn2; dmach_add Rm1, Rn1, Rm2, Rn2
6572 8.0xf7+8.0x09+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_add
6576 int srcreg1, srcreg2, dstreg1, dstreg2;
6577 long temp, temp2, sum;
6580 srcreg1 = translate_rreg (SD_, RM1);
6581 srcreg2 = translate_rreg (SD_, RM2);
6582 dstreg1 = translate_rreg (SD_, RN1);
6583 dstreg2 = translate_rreg (SD_, RN2);
6585 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6586 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6587 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6588 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6589 sum = temp + temp2 + State.regs[REG_MCRL];
6591 State.regs[dstreg1] = sum;
6592 State.regs[dstreg2] += State.regs[srcreg2];
6595 // 1111 0111 0001 1001 Rm1 Rn1 imm4 Rn2; dmach_add Rm1, Rn1, imm4, Rn2
6596 8.0xf7+8.0x19+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_add
6600 int srcreg1, dstreg1, dstreg2;
6601 long temp, temp2, sum;
6604 srcreg1 = translate_rreg (SD_, RM1);
6605 dstreg1 = translate_rreg (SD_, RN1);
6606 dstreg2 = translate_rreg (SD_, RN2);
6608 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6609 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6610 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6611 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6612 sum = temp + temp2 + State.regs[REG_MCRL];
6614 State.regs[dstreg1] = sum;
6615 State.regs[dstreg2] += EXTEND4 (IMM4);
6618 // 1111 0111 0010 1001 Rm1 Rn1 Rm2 Rn2; dmach_sub Rm1, Rn1, Rm2, Rn2
6619 8.0xf7+8.0x29+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_sub
6623 int srcreg1, srcreg2, dstreg1, dstreg2;
6624 long temp, temp2, sum;
6627 srcreg1 = translate_rreg (SD_, RM1);
6628 srcreg2 = translate_rreg (SD_, RM2);
6629 dstreg1 = translate_rreg (SD_, RN1);
6630 dstreg2 = translate_rreg (SD_, RN2);
6632 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6633 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6634 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6635 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6636 sum = temp + temp2 + State.regs[REG_MCRL];
6638 State.regs[dstreg1] = sum;
6639 State.regs[dstreg2] -= State.regs[srcreg2];
6642 // 1111 0111 0011 1001 Rm1 Rn1 imm4 Rn2; dmach_sub Rm1, Rn1, imm4, Rn2
6643 8.0xf7+8.0x39+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_sub
6647 int srcreg1, dstreg1, dstreg2;
6648 long temp, temp2, sum;
6651 srcreg1 = translate_rreg (SD_, RM1);
6652 dstreg1 = translate_rreg (SD_, RN1);
6653 dstreg2 = translate_rreg (SD_, RN2);
6655 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6656 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6657 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6658 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6659 sum = temp + temp2 + State.regs[REG_MCRL];
6661 State.regs[dstreg1] = sum;
6662 State.regs[dstreg2] -= EXTEND4 (IMM4);
6665 // 1111 0111 0100 1001 Rm1 Rn1 Rm2 Rn2; dmach_cmp Rm1, Rn1, Rm2, Rn2
6666 8.0xf7+8.0x49+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_cmp
6670 int srcreg1, srcreg2, dstreg1, dstreg2;
6671 long temp, temp2, sum;
6674 srcreg1 = translate_rreg (SD_, RM1);
6675 srcreg2 = translate_rreg (SD_, RM2);
6676 dstreg1 = translate_rreg (SD_, RN1);
6677 dstreg2 = translate_rreg (SD_, RN2);
6679 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6680 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6681 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6682 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6683 sum = temp + temp2 + State.regs[REG_MCRL];
6685 State.regs[dstreg1] = sum;
6686 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6689 // 1111 0111 0101 1001 Rm1 Rn1 imm4 Rn2; dmach_cmp Rm1, Rn1, imm4, Rn2
6690 8.0xf7+8.0x59+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_cmp
6694 int srcreg1, dstreg1, dstreg2;
6695 long temp, temp2, sum;
6698 srcreg1 = translate_rreg (SD_, RM1);
6699 dstreg1 = translate_rreg (SD_, RN1);
6700 dstreg2 = translate_rreg (SD_, RN2);
6702 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6703 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6704 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6705 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6706 sum = temp + temp2 + State.regs[REG_MCRL];
6708 State.regs[dstreg1] = sum;
6709 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6712 // 1111 0111 0110 1001 Rm1 Rn1 Rm2 Rn2; dmach_mov Rm1, Rn1, Rm2, Rn2
6713 8.0xf7+8.0x69+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_mov
6717 int srcreg1, srcreg2, dstreg1, dstreg2;
6718 long temp, temp2, sum;
6721 srcreg1 = translate_rreg (SD_, RM1);
6722 srcreg2 = translate_rreg (SD_, RM2);
6723 dstreg1 = translate_rreg (SD_, RN1);
6724 dstreg2 = translate_rreg (SD_, RN2);
6726 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6727 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6728 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6729 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6730 sum = temp + temp2 + State.regs[REG_MCRL];
6732 State.regs[dstreg1] = sum;
6733 State.regs[dstreg2] = State.regs[srcreg2];
6736 // 1111 0111 0111 1001 Rm1 Rn1 imm4 Rn2; dmach_mov Rm1, Rn1, imm4, Rn2
6737 8.0xf7+8.0x79+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_mov
6741 int srcreg1, dstreg1, dstreg2;
6742 long temp, temp2, sum;
6745 srcreg1 = translate_rreg (SD_, RM1);
6746 dstreg1 = translate_rreg (SD_, RN1);
6747 dstreg2 = translate_rreg (SD_, RN2);
6749 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6750 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6751 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6752 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6753 sum = temp + temp2 + State.regs[REG_MCRL];
6755 State.regs[dstreg1] = sum;
6756 State.regs[dstreg2] = EXTEND4 (IMM4);
6759 // 1111 0111 1000 1001 Rm1 Rn1 Rm2 Rn2; dmach_asr Rm1, Rn1, Rm2, Rn2
6760 8.0xf7+8.0x89+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_asr
6764 int srcreg1, srcreg2, dstreg1, dstreg2;
6765 long temp, temp2, sum;
6768 srcreg1 = translate_rreg (SD_, RM1);
6769 srcreg2 = translate_rreg (SD_, RM2);
6770 dstreg1 = translate_rreg (SD_, RN1);
6771 dstreg2 = translate_rreg (SD_, RN2);
6773 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6774 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6775 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6776 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6777 sum = temp + temp2 + State.regs[REG_MCRL];
6779 State.regs[dstreg1] = sum;
6780 temp = State.regs[dstreg2];
6781 temp >>= State.regs[srcreg2];
6782 State.regs[dstreg2] = temp;
6785 // 1111 0111 1001 1001 Rm1 Rn1 imm4 Rn2; dmach_asr Rm1, Rn1, imm4, Rn2
6786 8.0xf7+8.0x99+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_asr
6790 int srcreg1, dstreg1, dstreg2;
6791 long temp, temp2, sum;
6794 srcreg1 = translate_rreg (SD_, RM1);
6795 dstreg1 = translate_rreg (SD_, RN1);
6796 dstreg2 = translate_rreg (SD_, RN2);
6798 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6799 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6800 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6801 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6802 sum = temp + temp2 + State.regs[REG_MCRL];
6804 State.regs[dstreg1] = sum;
6805 temp = State.regs[dstreg2];
6807 State.regs[dstreg2] = temp;
6810 // 1111 0111 1010 1001 Rm1 Rn1 Rm2 Rn2; dmach_lsr Rm1, Rn1, Rm2, Rn2
6811 8.0xf7+8.0xa9+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_lsr
6815 int srcreg1, srcreg2, dstreg1, dstreg2;
6816 long temp, temp2, sum;
6819 srcreg1 = translate_rreg (SD_, RM1);
6820 srcreg2 = translate_rreg (SD_, RM2);
6821 dstreg1 = translate_rreg (SD_, RN1);
6822 dstreg2 = translate_rreg (SD_, RN2);
6824 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6825 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6826 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6827 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6828 sum = temp + temp2 + State.regs[REG_MCRL];
6830 State.regs[dstreg1] = sum;
6831 State.regs[dstreg2] >>= State.regs[srcreg2];
6834 // 1111 0111 1011 1001 Rm1 Rn1 imm4 Rn2; dmach_lsr Rm1, Rn1, imm4, Rn2
6835 8.0xf7+8.0xb9+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_lsr
6839 int srcreg1, dstreg1, dstreg2;
6840 long temp, temp2, sum;
6843 srcreg1 = translate_rreg (SD_, RM1);
6844 dstreg1 = translate_rreg (SD_, RN1);
6845 dstreg2 = translate_rreg (SD_, RN2);
6847 State.regs[dstreg2] >>= IMM4;
6851 // 1111 0111 1100 1001 Rm1 Rn1 Rm2 Rn2; dmach_asl Rm1, Rn1, Rm2, Rn2
6852 8.0xf7+8.0xc9+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_asl
6856 int srcreg1, srcreg2, dstreg1, dstreg2;
6857 long temp, temp2, sum;
6860 srcreg1 = translate_rreg (SD_, RM1);
6861 srcreg2 = translate_rreg (SD_, RM2);
6862 dstreg1 = translate_rreg (SD_, RN1);
6863 dstreg2 = translate_rreg (SD_, RN2);
6865 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6866 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6867 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6868 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6869 sum = temp + temp2 + State.regs[REG_MCRL];
6871 State.regs[dstreg1] = sum;
6872 State.regs[dstreg2] <<= State.regs[srcreg2];
6875 // 1111 0111 1101 1001 Rm1 Rn1 imm4 Rn2; dmach_asl Rm1, Rn1, imm4, Rn2
6876 8.0xf7+8.0xd9+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_asl
6880 int srcreg1, dstreg1, dstreg2;
6881 long temp, temp2, sum;
6884 srcreg1 = translate_rreg (SD_, RM1);
6885 dstreg1 = translate_rreg (SD_, RN1);
6886 dstreg2 = translate_rreg (SD_, RN2);
6888 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6889 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6890 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6891 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6892 sum = temp + temp2 + State.regs[REG_MCRL];
6894 State.regs[dstreg1] = sum;
6895 State.regs[dstreg2] <<= IMM4;
6898 // 1111 0111 0000 1010 Rm1 Rn1 Rm2 Rn2; xor_add Rm1, Rn1, Rm2, Rn2
6899 8.0xf7+8.0x0a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_add
6903 int srcreg1, srcreg2, dstreg1, dstreg2;
6906 srcreg1 = translate_rreg (SD_, RM1);
6907 srcreg2 = translate_rreg (SD_, RM2);
6908 dstreg1 = translate_rreg (SD_, RN1);
6909 dstreg2 = translate_rreg (SD_, RN2);
6911 State.regs[dstreg1] ^= State.regs[srcreg1];
6912 State.regs[dstreg2] += State.regs[srcreg2];
6915 // 1111 0111 0001 1010 Rm1 Rn1 imm4 Rn2; xor_add Rm1, Rn1, imm4, Rn2
6916 8.0xf7+8.0x1a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_add
6920 int srcreg1, dstreg1, dstreg2;
6923 srcreg1 = translate_rreg (SD_, RM1);
6924 dstreg1 = translate_rreg (SD_, RN1);
6925 dstreg2 = translate_rreg (SD_, RN2);
6927 State.regs[dstreg1] ^= State.regs[srcreg1];
6928 State.regs[dstreg2] += EXTEND4 (IMM4);
6931 // 1111 0111 0010 1010 Rm1 Rn1 Rm2 Rn2; xor_sub Rm1, Rn1, Rm2, Rn2
6932 8.0xf7+8.0x2a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_sub
6936 int srcreg1, srcreg2, dstreg1, dstreg2;
6939 srcreg1 = translate_rreg (SD_, RM1);
6940 srcreg2 = translate_rreg (SD_, RM2);
6941 dstreg1 = translate_rreg (SD_, RN1);
6942 dstreg2 = translate_rreg (SD_, RN2);
6944 State.regs[dstreg1] ^= State.regs[srcreg1];
6945 State.regs[dstreg2] -= State.regs[srcreg2];
6948 // 1111 0111 0011 1010 Rm1 Rn1 imm4 Rn2; xor_sub Rm1, Rn1, imm4, Rn2
6949 8.0xf7+8.0x3a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_sub
6953 int srcreg1, dstreg1, dstreg2;
6956 srcreg1 = translate_rreg (SD_, RM1);
6957 dstreg1 = translate_rreg (SD_, RN1);
6958 dstreg2 = translate_rreg (SD_, RN2);
6960 State.regs[dstreg1] ^= State.regs[srcreg1];
6961 State.regs[dstreg2] -= EXTEND4 (IMM4);
6964 // 1111 0111 0100 1010 Rm1 Rn1 Rm2 Rn2; xor_cmp Rm1, Rn1, Rm2, Rn2
6965 8.0xf7+8.0x4a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_cmp
6969 int srcreg1, srcreg2, dstreg1, dstreg2;
6972 srcreg1 = translate_rreg (SD_, RM1);
6973 srcreg2 = translate_rreg (SD_, RM2);
6974 dstreg1 = translate_rreg (SD_, RN1);
6975 dstreg2 = translate_rreg (SD_, RN2);
6977 State.regs[dstreg1] ^= State.regs[srcreg1];
6978 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6981 // 1111 0111 0101 1010 Rm1 Rn1 imm4 Rn2; xor_cmp Rm1, Rn1, imm4, Rn2
6982 8.0xf7+8.0x5a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_cmp
6986 int srcreg1, dstreg1, dstreg2;
6989 srcreg1 = translate_rreg (SD_, RM1);
6990 dstreg1 = translate_rreg (SD_, RN1);
6991 dstreg2 = translate_rreg (SD_, RN2);
6993 State.regs[dstreg1] ^= State.regs[srcreg1];
6994 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6997 // 1111 0111 0110 1010 Rm1 Rn1 Rm2 Rn2; xor_mov Rm1, Rn1, Rm2, Rn2
6998 8.0xf7+8.0x6a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_mov
7002 int srcreg1, srcreg2, dstreg1, dstreg2;
7005 srcreg1 = translate_rreg (SD_, RM1);
7006 srcreg2 = translate_rreg (SD_, RM2);
7007 dstreg1 = translate_rreg (SD_, RN1);
7008 dstreg2 = translate_rreg (SD_, RN2);
7010 State.regs[dstreg1] ^= State.regs[srcreg1];
7011 State.regs[dstreg2] = State.regs[srcreg2];
7014 // 1111 0111 0111 1010 Rm1 Rn1 imm4 Rn2; xor_mov Rm1, Rn1, imm4, Rn2
7015 8.0xf7+8.0x7a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_mov
7019 int srcreg1, dstreg1, dstreg2;
7022 srcreg1 = translate_rreg (SD_, RM1);
7023 dstreg1 = translate_rreg (SD_, RN1);
7024 dstreg2 = translate_rreg (SD_, RN2);
7026 State.regs[dstreg1] ^= State.regs[srcreg1];
7027 State.regs[dstreg2] = EXTEND4 (IMM4);
7030 // 1111 0111 1000 1010 Rm1 Rn1 Rm2 Rn2; xor_asr Rm1, Rn1, Rm2, Rn2
7031 8.0xf7+8.0x8a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_asr
7035 int srcreg1, srcreg2, dstreg1, dstreg2;
7039 srcreg1 = translate_rreg (SD_, RM1);
7040 srcreg2 = translate_rreg (SD_, RM2);
7041 dstreg1 = translate_rreg (SD_, RN1);
7042 dstreg2 = translate_rreg (SD_, RN2);
7044 State.regs[dstreg1] ^= State.regs[srcreg1];
7045 temp = State.regs[dstreg2];
7046 temp >>= State.regs[srcreg2];
7047 State.regs[dstreg2] = temp;
7050 // 1111 0111 1001 1010 Rm1 Rn1 imm4 Rn2; xor_asr Rm1, Rn1, imm4, Rn2
7051 8.0xf7+8.0x9a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_asr
7055 int srcreg1, dstreg1, dstreg2;
7059 srcreg1 = translate_rreg (SD_, RM1);
7060 dstreg1 = translate_rreg (SD_, RN1);
7061 dstreg2 = translate_rreg (SD_, RN2);
7063 State.regs[dstreg1] ^= State.regs[srcreg1];
7064 temp = State.regs[dstreg2];
7066 State.regs[dstreg2] = temp;
7069 // 1111 0111 1010 1010 Rm1 Rn1 Rm2 Rn2; xor_lsr Rm1, Rn1, Rm2, Rn2
7070 8.0xf7+8.0xaa+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_lsr
7074 int srcreg1, srcreg2, dstreg1, dstreg2;
7077 srcreg1 = translate_rreg (SD_, RM1);
7078 srcreg2 = translate_rreg (SD_, RM2);
7079 dstreg1 = translate_rreg (SD_, RN1);
7080 dstreg2 = translate_rreg (SD_, RN2);
7082 State.regs[dstreg1] ^= State.regs[srcreg1];
7083 State.regs[dstreg2] >>= State.regs[srcreg2];
7086 // 1111 0111 1011 1010 Rm1 Rn1 imm4 Rn2; xor_lsr Rm1, Rn1, imm4, Rn2
7087 8.0xf7+8.0xba+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_lsr
7091 int srcreg1, dstreg1, dstreg2;
7095 srcreg1 = translate_rreg (SD_, RM1);
7096 dstreg1 = translate_rreg (SD_, RN1);
7097 dstreg2 = translate_rreg (SD_, RN2);
7099 State.regs[dstreg1] ^= State.regs[srcreg1];
7100 State.regs[dstreg2] >>= IMM4;
7104 // 1111 0111 1100 1010 Rm1 Rn1 Rm2 Rn2; xor_asl Rm1, Rn1, Rm2, Rn2
7105 8.0xf7+8.0xca+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_asl
7109 int srcreg1, srcreg2, dstreg1, dstreg2;
7112 srcreg1 = translate_rreg (SD_, RM1);
7113 srcreg2 = translate_rreg (SD_, RM2);
7114 dstreg1 = translate_rreg (SD_, RN1);
7115 dstreg2 = translate_rreg (SD_, RN2);
7117 State.regs[dstreg1] ^= State.regs[srcreg1];
7118 State.regs[dstreg2] <<= State.regs[srcreg2];
7121 // 1111 0111 1101 1010 Rm1 Rn1 imm4 Rn2; xor_asl Rm1, Rn1, imm4, Rn2
7122 8.0xf7+8.0xda+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_asl
7126 int srcreg1, dstreg1, dstreg2;
7130 srcreg1 = translate_rreg (SD_, RM1);
7131 dstreg1 = translate_rreg (SD_, RN1);
7132 dstreg2 = translate_rreg (SD_, RN2);
7134 State.regs[dstreg1] ^= State.regs[srcreg1];
7135 State.regs[dstreg2] <<= IMM4;
7138 // 1111 0111 0000 1011 Rm1 Rn1 Rm2 Rn2; swhw_add Rm1, Rn1, Rm2, Rn2
7139 8.0xf7+8.0x0b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_add
7143 int srcreg1, srcreg2, dstreg1, dstreg2;
7146 srcreg1 = translate_rreg (SD_, RM1);
7147 srcreg2 = translate_rreg (SD_, RM2);
7148 dstreg1 = translate_rreg (SD_, RN1);
7149 dstreg2 = translate_rreg (SD_, RN2);
7151 State.regs[dstreg1] ^= State.regs[srcreg1];
7152 State.regs[dstreg2] += State.regs[srcreg2];
7155 // 1111 0111 0001 1011 Rm1 Rn1 imm4 Rn2; swhw_add Rm1, Rn1, imm4, Rn2
7156 8.0xf7+8.0x1b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_add
7160 int srcreg1, dstreg1, dstreg2;
7163 srcreg1 = translate_rreg (SD_, RM1);
7164 dstreg1 = translate_rreg (SD_, RN1);
7165 dstreg2 = translate_rreg (SD_, RN2);
7167 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7168 | ((State.regs[srcreg1] >> 16) & 0xffff));
7169 State.regs[dstreg2] += EXTEND4 (IMM4);
7172 // 1111 0111 0010 1011 Rm1 Rn1 Rm2 Rn2; swhw_sub Rm1, Rn1, Rm2, Rn2
7173 8.0xf7+8.0x2b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_sub
7177 int srcreg1, srcreg2, dstreg1, dstreg2;
7180 srcreg1 = translate_rreg (SD_, RM1);
7181 srcreg2 = translate_rreg (SD_, RM2);
7182 dstreg1 = translate_rreg (SD_, RN1);
7183 dstreg2 = translate_rreg (SD_, RN2);
7185 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7186 | ((State.regs[srcreg1] >> 16) & 0xffff));
7187 State.regs[dstreg2] -= State.regs[srcreg2];
7190 // 1111 0111 0011 1011 Rm1 Rn1 imm4 Rn2; swhw_sub Rm1, Rn1, imm4, Rn2
7191 8.0xf7+8.0x3b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_sub
7195 int srcreg1, dstreg1, dstreg2;
7198 srcreg1 = translate_rreg (SD_, RM1);
7199 dstreg1 = translate_rreg (SD_, RN1);
7200 dstreg2 = translate_rreg (SD_, RN2);
7202 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7203 | ((State.regs[srcreg1] >> 16) & 0xffff));
7204 State.regs[dstreg2] -= EXTEND4 (IMM4);
7207 // 1111 0111 0100 1011 Rm1 Rn1 Rm2 Rn2; swhw_cmp Rm1, Rn1, Rm2, Rn2
7208 8.0xf7+8.0x4b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_cmp
7212 int srcreg1, srcreg2, dstreg1, dstreg2;
7215 srcreg1 = translate_rreg (SD_, RM1);
7216 srcreg2 = translate_rreg (SD_, RM2);
7217 dstreg1 = translate_rreg (SD_, RN1);
7218 dstreg2 = translate_rreg (SD_, RN2);
7220 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7221 | ((State.regs[srcreg1] >> 16) & 0xffff));
7222 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7225 // 1111 0111 0101 1011 Rm1 Rn1 imm4 Rn2; swhw_cmp Rm1, Rn1, imm4, Rn2
7226 8.0xf7+8.0x5b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_cmp
7230 int srcreg1, dstreg1, dstreg2;
7233 srcreg1 = translate_rreg (SD_, RM1);
7234 dstreg1 = translate_rreg (SD_, RN1);
7235 dstreg2 = translate_rreg (SD_, RN2);
7237 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7238 | ((State.regs[srcreg1] >> 16) & 0xffff));
7239 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7242 // 1111 0111 0110 1011 Rm1 Rn1 Rm2 Rn2; swhw_mov Rm1, Rn1, Rm2, Rn2
7243 8.0xf7+8.0x6b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_mov
7247 int srcreg1, srcreg2, dstreg1, dstreg2;
7250 srcreg1 = translate_rreg (SD_, RM1);
7251 srcreg2 = translate_rreg (SD_, RM2);
7252 dstreg1 = translate_rreg (SD_, RN1);
7253 dstreg2 = translate_rreg (SD_, RN2);
7255 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7256 | ((State.regs[srcreg1] >> 16) & 0xffff));
7257 State.regs[dstreg2] = State.regs[srcreg2];
7260 // 1111 0111 0111 1011 Rm1 Rn1 imm4 Rn2; swhw_mov Rm1, Rn1, imm4, Rn2
7261 8.0xf7+8.0x7b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_mov
7265 int srcreg1, dstreg1, dstreg2;
7268 srcreg1 = translate_rreg (SD_, RM1);
7269 dstreg1 = translate_rreg (SD_, RN1);
7270 dstreg2 = translate_rreg (SD_, RN2);
7272 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7273 | ((State.regs[srcreg1] >> 16) & 0xffff));
7274 State.regs[dstreg2] = EXTEND4 (IMM4);
7277 // 1111 0111 1000 1011 Rm1 Rn1 Rm2 Rn2; swhw_asr Rm1, Rn1, Rm2, Rn2
7278 8.0xf7+8.0x8b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_asr
7282 int srcreg1, srcreg2, dstreg1, dstreg2;
7286 srcreg1 = translate_rreg (SD_, RM1);
7287 srcreg2 = translate_rreg (SD_, RM2);
7288 dstreg1 = translate_rreg (SD_, RN1);
7289 dstreg2 = translate_rreg (SD_, RN2);
7291 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7292 | ((State.regs[srcreg1] >> 16) & 0xffff));
7293 temp = State.regs[dstreg2];
7294 temp >>= State.regs[srcreg2];
7295 State.regs[dstreg2] = temp;
7298 // 1111 0111 1001 1011 Rm1 Rn1 imm4 Rn2; swhw_asr Rm1, Rn1, imm4, Rn2
7299 8.0xf7+8.0x9b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_asr
7303 int srcreg1, dstreg1, dstreg2;
7307 srcreg1 = translate_rreg (SD_, RM1);
7308 dstreg1 = translate_rreg (SD_, RN1);
7309 dstreg2 = translate_rreg (SD_, RN2);
7311 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7312 | ((State.regs[srcreg1] >> 16) & 0xffff));
7313 temp = State.regs[dstreg2];
7315 State.regs[dstreg2] = temp;
7318 // 1111 0111 1010 1011 Rm1 Rn1 Rm2 Rn2; swhw_lsr Rm1, Rn1, Rm2, Rn2
7319 8.0xf7+8.0xab+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_lsr
7323 int srcreg1, srcreg2, dstreg1, dstreg2;
7326 srcreg1 = translate_rreg (SD_, RM1);
7327 srcreg2 = translate_rreg (SD_, RM2);
7328 dstreg1 = translate_rreg (SD_, RN1);
7329 dstreg2 = translate_rreg (SD_, RN2);
7331 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7332 | ((State.regs[srcreg1] >> 16) & 0xffff));
7333 State.regs[dstreg2] >>= State.regs[srcreg2];
7336 // 1111 0111 1011 1011 Rm1 Rn1 imm4 Rn2; swhw_lsr Rm1, Rn1, imm4, Rn2
7337 8.0xf7+8.0xbb+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_lsr
7341 int srcreg1, dstreg1, dstreg2;
7345 srcreg1 = translate_rreg (SD_, RM1);
7346 dstreg1 = translate_rreg (SD_, RN1);
7347 dstreg2 = translate_rreg (SD_, RN2);
7349 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7350 | ((State.regs[srcreg1] >> 16) & 0xffff));
7351 State.regs[dstreg2] >>= IMM4;
7355 // 1111 0111 1100 1011 Rm1 Rn1 Rm2 Rn2; swhw_asl Rm1, Rn1, Rm2, Rn2
7356 8.0xf7+8.0xcb+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_asl
7360 int srcreg1, srcreg2, dstreg1, dstreg2;
7363 srcreg1 = translate_rreg (SD_, RM1);
7364 srcreg2 = translate_rreg (SD_, RM2);
7365 dstreg1 = translate_rreg (SD_, RN1);
7366 dstreg2 = translate_rreg (SD_, RN2);
7368 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7369 | ((State.regs[srcreg1] >> 16) & 0xffff));
7370 State.regs[dstreg2] <<= State.regs[srcreg2];
7373 // 1111 0111 1101 1011 Rm1 Rn1 imm4 Rn2; swhw_asl Rm1, Rn1, imm4, Rn2
7374 8.0xf7+8.0xdb+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_asl
7378 int srcreg1, dstreg1, dstreg2;
7382 srcreg1 = translate_rreg (SD_, RM1);
7383 dstreg1 = translate_rreg (SD_, RN1);
7384 dstreg2 = translate_rreg (SD_, RN2);
7386 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7387 | ((State.regs[srcreg1] >> 16) & 0xffff));
7388 State.regs[dstreg2] <<= IMM4;
7391 // 1111 0111 0000 1100 Rm1 Rn1 Rm2 Rn2; or_add Rm1, Rn1, Rm2, Rn2
7392 8.0xf7+8.0x0c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_add
7396 int srcreg1, srcreg2, dstreg1, dstreg2;
7399 srcreg1 = translate_rreg (SD_, RM1);
7400 srcreg2 = translate_rreg (SD_, RM2);
7401 dstreg1 = translate_rreg (SD_, RN1);
7402 dstreg2 = translate_rreg (SD_, RN2);
7404 State.regs[dstreg1] |= State.regs[srcreg1];
7405 State.regs[dstreg2] += State.regs[srcreg2];
7408 // 1111 0111 0001 1100 Rm1 Rn1 imm4 Rn2; or_add Rm1, Rn1, imm4, Rn2
7409 8.0xf7+8.0x1c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_add
7413 int srcreg1, dstreg1, dstreg2;
7416 srcreg1 = translate_rreg (SD_, RM1);
7417 dstreg1 = translate_rreg (SD_, RN1);
7418 dstreg2 = translate_rreg (SD_, RN2);
7420 State.regs[dstreg1] |= State.regs[srcreg1];
7421 State.regs[dstreg2] += EXTEND4 (IMM4);
7424 // 1111 0111 0010 1100 Rm1 Rn1 Rm2 Rn2; or_sub Rm1, Rn1, Rm2, Rn2
7425 8.0xf7+8.0x2c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_sub
7429 int srcreg1, srcreg2, dstreg1, dstreg2;
7432 srcreg1 = translate_rreg (SD_, RM1);
7433 srcreg2 = translate_rreg (SD_, RM2);
7434 dstreg1 = translate_rreg (SD_, RN1);
7435 dstreg2 = translate_rreg (SD_, RN2);
7437 State.regs[dstreg1] |= State.regs[srcreg1];
7438 State.regs[dstreg2] -= State.regs[srcreg2];
7441 // 1111 0111 0011 1100 Rm1 Rn1 imm4 Rn2; or_sub Rm1, Rn1, imm4, Rn2
7442 8.0xf7+8.0x3c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_sub
7446 int srcreg1, dstreg1, dstreg2;
7449 srcreg1 = translate_rreg (SD_, RM1);
7450 dstreg1 = translate_rreg (SD_, RN1);
7451 dstreg2 = translate_rreg (SD_, RN2);
7453 State.regs[dstreg1] |= State.regs[srcreg1];
7454 State.regs[dstreg2] -= EXTEND4 (IMM4);
7457 // 1111 0111 0100 1100 Rm1 Rn1 Rm2 Rn2; or_cmp Rm1, Rn1, Rm2, Rn2
7458 8.0xf7+8.0x4c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_cmp
7462 int srcreg1, srcreg2, dstreg1, dstreg2;
7465 srcreg1 = translate_rreg (SD_, RM1);
7466 srcreg2 = translate_rreg (SD_, RM2);
7467 dstreg1 = translate_rreg (SD_, RN1);
7468 dstreg2 = translate_rreg (SD_, RN2);
7470 State.regs[dstreg1] |= State.regs[srcreg1];
7471 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7474 // 1111 0111 0101 1100 Rm1 Rn1 imm4 Rn2; or_cmp Rm1, Rn1, imm4, Rn2
7475 8.0xf7+8.0x5c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_cmp
7479 int srcreg1, dstreg1, dstreg2;
7482 srcreg1 = translate_rreg (SD_, RM1);
7483 dstreg1 = translate_rreg (SD_, RN1);
7484 dstreg2 = translate_rreg (SD_, RN2);
7486 State.regs[dstreg1] |= State.regs[srcreg1];
7487 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7490 // 1111 0111 0110 1100 Rm1 Rn1 Rm2 Rn2; or_mov Rm1, Rn1, Rm2, Rn2
7491 8.0xf7+8.0x6c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_mov
7495 int srcreg1, srcreg2, dstreg1, dstreg2;
7498 srcreg1 = translate_rreg (SD_, RM1);
7499 srcreg2 = translate_rreg (SD_, RM2);
7500 dstreg1 = translate_rreg (SD_, RN1);
7501 dstreg2 = translate_rreg (SD_, RN2);
7503 State.regs[dstreg1] |= State.regs[srcreg1];
7504 State.regs[dstreg2] = State.regs[srcreg2];
7507 // 1111 0111 0111 1100 Rm1 Rn1 imm4 Rn2; or_mov Rm1, Rn1, imm4, Rn2
7508 8.0xf7+8.0x7c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_mov
7512 int srcreg1, dstreg1, dstreg2;
7515 srcreg1 = translate_rreg (SD_, RM1);
7516 dstreg1 = translate_rreg (SD_, RN1);
7517 dstreg2 = translate_rreg (SD_, RN2);
7519 State.regs[dstreg1] |= State.regs[srcreg1];
7520 State.regs[dstreg2] = EXTEND4 (IMM4);
7523 // 1111 0111 1000 1100 Rm1 Rn1 Rm2 Rn2; or_asr Rm1, Rn1, Rm2, Rn2
7524 8.0xf7+8.0x8c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_asr
7528 int srcreg1, srcreg2, dstreg1, dstreg2;
7532 srcreg1 = translate_rreg (SD_, RM1);
7533 srcreg2 = translate_rreg (SD_, RM2);
7534 dstreg1 = translate_rreg (SD_, RN1);
7535 dstreg2 = translate_rreg (SD_, RN2);
7537 State.regs[dstreg1] |= State.regs[srcreg1];
7538 temp = State.regs[dstreg2];
7539 temp >>= State.regs[srcreg2];
7540 State.regs[dstreg2] = temp;
7543 // 1111 0111 1001 1100 Rm1 Rn1 imm4 Rn2; or_asr Rm1, Rn1, imm4, Rn2
7544 8.0xf7+8.0x9c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_asr
7548 int srcreg1, dstreg1, dstreg2;
7552 srcreg1 = translate_rreg (SD_, RM1);
7553 dstreg1 = translate_rreg (SD_, RN1);
7554 dstreg2 = translate_rreg (SD_, RN2);
7556 State.regs[dstreg1] |= State.regs[srcreg1];
7557 temp = State.regs[dstreg2];
7559 State.regs[dstreg2] = temp;
7562 // 1111 0111 1010 1100 Rm1 Rn1 Rm2 Rn2; or_lsr Rm1, Rn1, Rm2, Rn2
7563 8.0xf7+8.0xac+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_lsr
7567 int srcreg1, srcreg2, dstreg1, dstreg2;
7570 srcreg1 = translate_rreg (SD_, RM1);
7571 srcreg2 = translate_rreg (SD_, RM2);
7572 dstreg1 = translate_rreg (SD_, RN1);
7573 dstreg2 = translate_rreg (SD_, RN2);
7575 State.regs[dstreg1] |= State.regs[srcreg1];
7576 State.regs[dstreg2] >>= State.regs[srcreg2];
7579 // 1111 0111 1011 1100 Rm1 Rn1 imm4 Rn2; or_lsr Rm1, Rn1, imm4, Rn2
7580 8.0xf7+8.0xbc+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_lsr
7584 int srcreg1, dstreg1, dstreg2;
7588 srcreg1 = translate_rreg (SD_, RM1);
7589 dstreg1 = translate_rreg (SD_, RN1);
7590 dstreg2 = translate_rreg (SD_, RN2);
7592 State.regs[dstreg1] |= State.regs[srcreg1];
7593 State.regs[dstreg2] >>= IMM4;
7597 // 1111 0111 1100 1100 Rm1 Rn1 Rm2 Rn2; or_asl Rm1, Rn1, Rm2, Rn2
7598 8.0xf7+8.0xcc+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_asl
7602 int srcreg1, srcreg2, dstreg1, dstreg2;
7605 srcreg1 = translate_rreg (SD_, RM1);
7606 srcreg2 = translate_rreg (SD_, RM2);
7607 dstreg1 = translate_rreg (SD_, RN1);
7608 dstreg2 = translate_rreg (SD_, RN2);
7610 State.regs[dstreg1] |= State.regs[srcreg1];
7611 State.regs[dstreg2] <<= State.regs[srcreg2];
7614 // 1111 0111 1101 1100 Rm1 Rn1 imm4 Rn2; or_asl Rm1, Rn1, imm4, Rn2
7615 8.0xf7+8.0xdc+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_asl
7619 int srcreg1, dstreg1, dstreg2;
7623 srcreg1 = translate_rreg (SD_, RM1);
7624 dstreg1 = translate_rreg (SD_, RN1);
7625 dstreg2 = translate_rreg (SD_, RN2);
7627 State.regs[dstreg1] |= State.regs[srcreg1];
7628 State.regs[dstreg2] <<= IMM4;
7631 // 1111 0111 0000 1101 Rm1 Rn1 Rm2 Rn2; sat16_add Rm1, Rn1, Rm2, Rn2
7632 8.0xf7+8.0x0d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_add
7636 int srcreg1, srcreg2, dstreg1, dstreg2;
7639 srcreg1 = translate_rreg (SD_, RM1);
7640 srcreg2 = translate_rreg (SD_, RM2);
7641 dstreg1 = translate_rreg (SD_, RN1);
7642 dstreg2 = translate_rreg (SD_, RN2);
7644 if (State.regs[srcreg1] >= 0x7fff)
7645 State.regs[dstreg1] = 0x7fff;
7646 else if (State.regs[srcreg1] <= 0xffff8000)
7647 State.regs[dstreg1] = 0xffff8000;
7649 State.regs[dstreg1] = State.regs[srcreg1];
7651 State.regs[dstreg2] += State.regs[srcreg2];
7654 // 1111 0111 0001 1101 Rm1 Rn1 imm4 Rn2; sat16_add Rm1, Rn1, imm4, Rn2
7655 8.0xf7+8.0x1d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_add
7659 int srcreg1, dstreg1, dstreg2;
7662 srcreg1 = translate_rreg (SD_, RM1);
7663 dstreg1 = translate_rreg (SD_, RN1);
7664 dstreg2 = translate_rreg (SD_, RN2);
7666 if (State.regs[srcreg1] >= 0x7fff)
7667 State.regs[dstreg1] = 0x7fff;
7668 else if (State.regs[srcreg1] <= 0xffff8000)
7669 State.regs[dstreg1] = 0xffff8000;
7671 State.regs[dstreg1] = State.regs[srcreg1];
7673 State.regs[dstreg2] += EXTEND4 (IMM4);
7676 // 1111 0111 0010 1101 Rm1 Rn1 Rm2 Rn2; sat16_sub Rm1, Rn1, Rm2, Rn2
7677 8.0xf7+8.0x2d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_sub
7681 int srcreg1, srcreg2, dstreg1, dstreg2;
7684 srcreg1 = translate_rreg (SD_, RM1);
7685 srcreg2 = translate_rreg (SD_, RM2);
7686 dstreg1 = translate_rreg (SD_, RN1);
7687 dstreg2 = translate_rreg (SD_, RN2);
7689 if (State.regs[srcreg1] >= 0x7fff)
7690 State.regs[dstreg1] = 0x7fff;
7691 else if (State.regs[srcreg1] <= 0xffff8000)
7692 State.regs[dstreg1] = 0xffff8000;
7694 State.regs[dstreg1] = State.regs[srcreg1];
7696 State.regs[dstreg2] -= State.regs[srcreg2];
7699 // 1111 0111 0011 1101 Rm1 Rn1 imm4 Rn2; sat16_sub Rm1, Rn1, imm4, Rn2
7700 8.0xf7+8.0x3d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_sub
7704 int srcreg1, dstreg1, dstreg2;
7707 srcreg1 = translate_rreg (SD_, RM1);
7708 dstreg1 = translate_rreg (SD_, RN1);
7709 dstreg2 = translate_rreg (SD_, RN2);
7711 if (State.regs[srcreg1] >= 0x7fff)
7712 State.regs[dstreg1] = 0x7fff;
7713 else if (State.regs[srcreg1] <= 0xffff8000)
7714 State.regs[dstreg1] = 0xffff8000;
7716 State.regs[dstreg1] = State.regs[srcreg1];
7718 State.regs[dstreg2] -= EXTEND4 (IMM4);
7721 // 1111 0111 0100 1101 Rm1 Rn1 Rm2 Rn2; sat16_cmp Rm1, Rn1, Rm2, Rn2
7722 8.0xf7+8.0x4d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_cmp
7726 int srcreg1, srcreg2, dstreg1, dstreg2;
7729 srcreg1 = translate_rreg (SD_, RM1);
7730 srcreg2 = translate_rreg (SD_, RM2);
7731 dstreg1 = translate_rreg (SD_, RN1);
7732 dstreg2 = translate_rreg (SD_, RN2);
7734 if (State.regs[srcreg1] >= 0x7fff)
7735 State.regs[dstreg1] = 0x7fff;
7736 else if (State.regs[srcreg1] <= 0xffff8000)
7737 State.regs[dstreg1] = 0xffff8000;
7739 State.regs[dstreg1] = State.regs[srcreg1];
7741 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7744 // 1111 0111 0101 1101 Rm1 Rn1 imm4 Rn2; sat16_cmp Rm1, Rn1, imm4, Rn2
7745 8.0xf7+8.0x5d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_cmp
7749 int srcreg1, dstreg1, dstreg2;
7752 srcreg1 = translate_rreg (SD_, RM1);
7753 dstreg1 = translate_rreg (SD_, RN1);
7754 dstreg2 = translate_rreg (SD_, RN2);
7756 if (State.regs[srcreg1] >= 0x7fff)
7757 State.regs[dstreg1] = 0x7fff;
7758 else if (State.regs[srcreg1] <= 0xffff8000)
7759 State.regs[dstreg1] = 0xffff8000;
7761 State.regs[dstreg1] = State.regs[srcreg1];
7763 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7766 // 1111 0111 0110 1101 Rm1 Rn1 Rm2 Rn2; sat16_mov Rm1, Rn1, Rm2, Rn2
7767 8.0xf7+8.0x6d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_mov
7771 int srcreg1, srcreg2, dstreg1, dstreg2;
7774 srcreg1 = translate_rreg (SD_, RM1);
7775 srcreg2 = translate_rreg (SD_, RM2);
7776 dstreg1 = translate_rreg (SD_, RN1);
7777 dstreg2 = translate_rreg (SD_, RN2);
7779 if (State.regs[srcreg1] >= 0x7fff)
7780 State.regs[dstreg1] = 0x7fff;
7781 else if (State.regs[srcreg1] <= 0xffff8000)
7782 State.regs[dstreg1] = 0xffff8000;
7784 State.regs[dstreg1] = State.regs[srcreg1];
7786 State.regs[dstreg2] = State.regs[srcreg2];
7789 // 1111 0111 0111 1101 Rm1 Rn1 imm4 Rn2; sat16_mov Rm1, Rn1, imm4, Rn2
7790 8.0xf7+8.0x7d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_mov
7794 int srcreg1, dstreg1, dstreg2;
7797 srcreg1 = translate_rreg (SD_, RM1);
7798 dstreg1 = translate_rreg (SD_, RN1);
7799 dstreg2 = translate_rreg (SD_, RN2);
7801 if (State.regs[srcreg1] >= 0x7fff)
7802 State.regs[dstreg1] = 0x7fff;
7803 else if (State.regs[srcreg1] <= 0xffff8000)
7804 State.regs[dstreg1] = 0xffff8000;
7806 State.regs[dstreg1] = State.regs[srcreg1];
7808 State.regs[dstreg2] = EXTEND4 (IMM4);
7811 // 1111 0111 1000 1101 Rm1 Rn1 Rm2 Rn2; sat16_asr Rm1, Rn1, Rm2, Rn2
7812 8.0xf7+8.0x8d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_asr
7816 int srcreg1, srcreg2, dstreg1, dstreg2;
7820 srcreg1 = translate_rreg (SD_, RM1);
7821 srcreg2 = translate_rreg (SD_, RM2);
7822 dstreg1 = translate_rreg (SD_, RN1);
7823 dstreg2 = translate_rreg (SD_, RN2);
7825 if (State.regs[srcreg1] >= 0x7fff)
7826 State.regs[dstreg1] = 0x7fff;
7827 else if (State.regs[srcreg1] <= 0xffff8000)
7828 State.regs[dstreg1] = 0xffff8000;
7830 State.regs[dstreg1] = State.regs[srcreg1];
7832 temp = State.regs[dstreg2];
7833 temp >>= State.regs[srcreg2];
7834 State.regs[dstreg2] = temp;
7837 // 1111 0111 1001 1101 Rm1 Rn1 imm4 Rn2; sat16_asr Rm1, Rn1, imm4, Rn2
7838 8.0xf7+8.0x9d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_asr
7842 int srcreg1, dstreg1, dstreg2;
7846 srcreg1 = translate_rreg (SD_, RM1);
7847 dstreg1 = translate_rreg (SD_, RN1);
7848 dstreg2 = translate_rreg (SD_, RN2);
7850 if (State.regs[srcreg1] >= 0x7fff)
7851 State.regs[dstreg1] = 0x7fff;
7852 else if (State.regs[srcreg1] <= 0xffff8000)
7853 State.regs[dstreg1] = 0xffff8000;
7855 State.regs[dstreg1] = State.regs[srcreg1];
7857 temp = State.regs[dstreg2];
7859 State.regs[dstreg2] = temp;
7862 // 1111 0111 1010 1101 Rm1 Rn1 Rm2 Rn2; sat16_lsr Rm1, Rn1, Rm2, Rn2
7863 8.0xf7+8.0xad+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_lsr
7867 int srcreg1, srcreg2, dstreg1, dstreg2;
7870 srcreg1 = translate_rreg (SD_, RM1);
7871 srcreg2 = translate_rreg (SD_, RM2);
7872 dstreg1 = translate_rreg (SD_, RN1);
7873 dstreg2 = translate_rreg (SD_, RN2);
7875 if (State.regs[srcreg1] >= 0x7fff)
7876 State.regs[dstreg1] = 0x7fff;
7877 else if (State.regs[srcreg1] <= 0xffff8000)
7878 State.regs[dstreg1] = 0xffff8000;
7880 State.regs[dstreg1] = State.regs[srcreg1];
7882 State.regs[dstreg2] >>= State.regs[srcreg2];
7885 // 1111 0111 1011 1101 Rm1 Rn1 imm4 Rn2; sat16_lsr Rm1, Rn1, imm4, Rn2
7886 8.0xf7+8.0xbd+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_lsr
7890 int srcreg1, dstreg1, dstreg2;
7894 srcreg1 = translate_rreg (SD_, RM1);
7895 dstreg1 = translate_rreg (SD_, RN1);
7896 dstreg2 = translate_rreg (SD_, RN2);
7898 if (State.regs[srcreg1] >= 0x7fff)
7899 State.regs[dstreg1] = 0x7fff;
7900 else if (State.regs[srcreg1] <= 0xffff8000)
7901 State.regs[dstreg1] = 0xffff8000;
7903 State.regs[dstreg1] = State.regs[srcreg1];
7905 State.regs[dstreg2] >>= IMM4;
7909 // 1111 0111 1100 1101 Rm1 Rn1 Rm2 Rn2; sat16_asl Rm1, Rn1, Rm2, Rn2
7910 8.0xf7+8.0xcd+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_asl
7914 int srcreg1, srcreg2, dstreg1, dstreg2;
7917 srcreg1 = translate_rreg (SD_, RM1);
7918 srcreg2 = translate_rreg (SD_, RM2);
7919 dstreg1 = translate_rreg (SD_, RN1);
7920 dstreg2 = translate_rreg (SD_, RN2);
7922 if (State.regs[srcreg1] >= 0x7fff)
7923 State.regs[dstreg1] = 0x7fff;
7924 else if (State.regs[srcreg1] <= 0xffff8000)
7925 State.regs[dstreg1] = 0xffff8000;
7927 State.regs[dstreg1] = State.regs[srcreg1];
7929 State.regs[dstreg2] <<= State.regs[srcreg2];
7932 // 1111 0111 1101 1101 Rm1 Rn1 imm4 Rn2; sat16_asl Rm1, Rn1, imm4, Rn2
7933 8.0xf7+8.0xdd+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_asl
7937 int srcreg1, dstreg1, dstreg2;
7941 srcreg1 = translate_rreg (SD_, RM1);
7942 dstreg1 = translate_rreg (SD_, RN1);
7943 dstreg2 = translate_rreg (SD_, RN2);
7945 if (State.regs[srcreg1] >= 0x7fff)
7946 State.regs[dstreg1] = 0x7fff;
7947 else if (State.regs[srcreg1] <= 0xffff8000)
7948 State.regs[dstreg1] = 0xffff8000;
7950 State.regs[dstreg1] = State.regs[srcreg1];
7952 State.regs[dstreg2] <<= IMM4;