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 :function:::int:translate_xreg:int xreg
41 // 1111 0000 0010 00An; mov USP,An
42 8.0xf0+4.0x2,00,2.AN0:D0m:::mov
47 State.regs[REG_A0 + AN0] = State.regs[REG_USP];
51 // 1111 0000 0010 01An; mov SSP,An
52 8.0xf0+4.0x2,01,2.AN0:D0n:::mov
57 State.regs[REG_A0 + AN0] = State.regs[REG_SSP];
61 // 1111 0000 0010 10An; mov MSP,An
62 8.0xf0+4.0x2,10,2.AN0:D0o:::mov
67 State.regs[REG_A0 + AN0] = State.regs[REG_MSP];
71 // 1111 0000 0010 11An; mov PC,An
72 8.0xf0+4.0x2,11,2.AN0:D0p:::mov
77 State.regs[REG_A0 + AN0] = PC;
81 // 1111 0000 0011 Am00; mov Am,USP
82 8.0xf0+4.0x3,2.AM1,00:D0q:::mov
87 State.regs[REG_USP] = State.regs[REG_A0 + AM1];
90 // 1111 0000 0011 Am01; mov Am,SSP
91 8.0xf0+4.0x3,2.AM1,01:D0r:::mov
96 State.regs[REG_SSP] = State.regs[REG_A0 + AM1];
99 // 1111 0000 0011 Am10; mov Am,MSP
100 8.0xf0+4.0x3,2.AM1,10:D0s:::mov
105 State.regs[REG_MSP] = State.regs[REG_A0 + AM1];
109 // 1111 0000 1110 imm4; syscall
110 8.0xf0+4.0xe,IMM4:D0t:::syscall
114 unsigned int sp, next_pc;
117 sp = State.regs[REG_SP];
118 next_pc = State.regs[REG_PC] + 2;
119 store_word (sp - 4, next_pc);
120 store_word (sp - 8, PSW);
121 State.regs[REG_PC] = 0x40000000 + IMM4 * 8;
126 // 1111 0010 1110 11Dn; mov EPSW,Dn
127 8.0xf2+4.0xe,11,2.DN0:D0u:::mov
132 State.regs[REG_D0 + DN0] = PSW;
136 // 1111 0010 1111 Dm01; mov Dm,EPSW
137 8.0xf2+4.0xf,2.DM1,01:D0v:::mov
142 PSW = State.regs[REG_D0 + DM1];
145 // 1111 0101 00Am Rn; mov Am,Rn
146 8.0xf5+00,2.AM1,4.RN0:D0w:::mov
150 int destreg = translate_rreg (SD_, RN0);
153 State.regs[destreg] = State.regs[REG_A0 + AM1];
156 // 1111 0101 01Dm Rn; mov Dm,Rn
157 8.0xf5+01,2.DM1,4.RN0:D0x:::mov
161 int destreg = translate_rreg (SD_, RN0);
164 State.regs[destreg] = State.regs[REG_D0 + DM1];
167 // 1111 0101 10Rm An; mov Rm,An
168 8.0xf5+10,4.RM1,2.AN0:D0y:::mov
172 int destreg = translate_rreg (SD_, RM1);
175 State.regs[REG_A0 + AN0] = State.regs[destreg];
178 // 1111 0101 11Rm Dn; mov Rm,Dn
179 8.0xf5+11,4.RM1,2.DN0:D0z:::mov
183 int destreg = translate_rreg (SD_, RM1);
186 State.regs[REG_D0 + DN0] = State.regs[destreg];
190 // 1111 1000 1100 1110 regs....; movm (USP),regs
191 8.0xf8+8.0xce+8.REGS:D1a:::movm
195 unsigned long usp = State.regs[REG_USP];
204 State.regs[REG_LAR] = load_word (usp);
206 State.regs[REG_LIR] = load_word (usp);
208 State.regs[REG_MDR] = load_word (usp);
210 State.regs[REG_A0 + 1] = load_word (usp);
212 State.regs[REG_A0] = load_word (usp);
214 State.regs[REG_D0 + 1] = load_word (usp);
216 State.regs[REG_D0] = load_word (usp);
222 State.regs[REG_A0 + 3] = load_word (usp);
228 State.regs[REG_A0 + 2] = load_word (usp);
234 State.regs[REG_D0 + 3] = load_word (usp);
240 State.regs[REG_D0 + 2] = load_word (usp);
244 /* start-sanitize-am33 */
245 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
249 /* Need to restore MDQR, MCRH, MCRL, and MCVF */
251 State.regs[REG_E0 + 1] = load_word (usp);
253 State.regs[REG_E0 + 0] = load_word (usp);
259 State.regs[REG_E0 + 7] = load_word (usp);
261 State.regs[REG_E0 + 6] = load_word (usp);
263 State.regs[REG_E0 + 5] = load_word (usp);
265 State.regs[REG_E0 + 4] = load_word (usp);
271 State.regs[REG_E0 + 3] = load_word (usp);
273 State.regs[REG_E0 + 2] = load_word (usp);
277 /* end-sanitize-am33 */
279 /* And make sure to update the stack pointer. */
280 State.regs[REG_USP] = usp;
283 // 1111 1000 1100 1111 regs....; movm (USP),regs
284 8.0xf8+8.0xcf+8.REGS:D1b:::movm
288 unsigned long usp = State.regs[REG_USP];
291 if (STATE_ARCHITECTURE (sd)->mach == bfd_mach_am33)
296 store_word (usp, State.regs[REG_E0 + 2]);
298 store_word (usp, State.regs[REG_E0 + 3]);
304 store_word (usp, State.regs[REG_E0 + 4]);
306 store_word (usp, State.regs[REG_E0 + 5]);
308 store_word (usp, State.regs[REG_E0 + 6]);
310 store_word (usp, State.regs[REG_E0 + 7]);
316 store_word (usp, State.regs[REG_E0 + 0]);
318 store_word (usp, State.regs[REG_E0 + 1]);
320 /* Need to save MDQR, MCRH, MCRL, and MCVF */
323 /* end-sanitize-am33 */
328 store_word (usp, State.regs[REG_D0 + 2]);
334 store_word (usp, State.regs[REG_D0 + 3]);
340 store_word (usp, State.regs[REG_A0 + 2]);
346 store_word (usp, State.regs[REG_A0 + 3]);
352 store_word (usp, State.regs[REG_D0]);
354 store_word (usp, State.regs[REG_D0 + 1]);
356 store_word (usp, State.regs[REG_A0]);
358 store_word (usp, State.regs[REG_A0 + 1]);
360 store_word (usp, State.regs[REG_MDR]);
362 store_word (usp, State.regs[REG_LIR]);
364 store_word (usp, State.regs[REG_LAR]);
368 /* And make sure to update the stack pointer. */
369 State.regs[REG_USP] = usp;
372 // 1111 1100 1111 1100 imm32...; and imm32,EPSW
373 8.0xfc+8.0xfc+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:4a:::and
378 PSW &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
381 // 1111 1100 1111 1101 imm32...; or imm32,EPSW
382 8.0xfc+8.0xfd+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::or
387 PSW |= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
390 // 1111 1001 0000 1000 Rm Rn; mov Rm,Rn (Rm != Rn)
391 8.0xf9+8.0x08+4.RM2,4.RN0!RM2:D1g:::mov
399 srcreg = translate_rreg (SD_, RM2);
400 dstreg = translate_rreg (SD_, RN0);
401 State.regs[dstreg] = State.regs[srcreg];
404 // 1111 1001 0001 1000 Rn Rn; ext Rn
405 8.0xf9+8.0x18+4.RN0,4.RN2=RN0:D1:::ext
412 srcreg = translate_rreg (SD_, RN0);
413 if (State.regs[srcreg] & 0x80000000)
414 State.regs[REG_MDR] = -1;
416 State.regs[REG_MDR] = 0;
419 // 1111 1001 0010 1000 Rm Rn; extb Rm,Rn
420 8.0xf9+8.0x28+4.RM2,4.RN0!RM2:D1:::extb
427 srcreg = translate_rreg (SD_, RM2);
428 dstreg = translate_rreg (SD_, RN0);
429 State.regs[dstreg] = EXTEND8 (State.regs[srcreg]);
432 // 1111 1001 0011 1000 Rm Rn; extbu Rm,Rn
433 8.0xf9+8.0x38+4.RM2,4.RN0!RM2:D1:::extbu
440 srcreg = translate_rreg (SD_, RM2);
441 dstreg = translate_rreg (SD_, RN0);
442 State.regs[dstreg] = State.regs[srcreg] & 0xff;
445 // 1111 1001 0100 1000 Rm Rn; exth Rm,Rn
446 8.0xf9+8.0x48+4.RM2,4.RN0!RM2:D1:::exth
453 srcreg = translate_rreg (SD_, RM2);
454 dstreg = translate_rreg (SD_, RN0);
455 State.regs[dstreg] = EXTEND16 (State.regs[srcreg]);
458 // 1111 1001 0101 1000 Rm Rn; exthu Rm,Rn
459 8.0xf9+8.0x58+4.RM2,4.RN0!RM2:D1:::exthu
466 srcreg = translate_rreg (SD_, RM2);
467 dstreg = translate_rreg (SD_, RN0);
468 State.regs[dstreg] = State.regs[srcreg] & 0xffff;
471 // 1111 1001 0110 1000 Rn Rn; clr Rn
472 8.0xf9+8.0x68+4.RM2,4.RN0=RM2:D1:::clr
479 dstreg = translate_rreg (SD_, RN0);
480 State.regs[dstreg] = 0;
482 PSW &= ~(PSW_V | PSW_C | PSW_N);
485 // 1111 1001 0111 1000 Rm Rn; add Rm,Rn
486 8.0xf9+8.0x78+4.RM2,4.RN0:D1b:::add
493 srcreg = translate_rreg (SD_, RM2);
494 dstreg = translate_rreg (SD_, RN0);
495 genericAdd (State.regs[srcreg], dstreg);
498 // 1111 1001 1000 1000 Rm Rn; addc Rm,Rn
499 8.0xf9+8.0x88+4.RM2,4.RN0:D1b:::addc
505 unsigned long reg1, reg2, sum;
508 srcreg = translate_rreg (SD_, RM2);
509 dstreg = translate_rreg (SD_, RN0);
511 reg1 = State.regs[srcreg];
512 reg2 = State.regs[dstreg];
513 sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
514 State.regs[dstreg] = sum;
516 z = ((PSW & PSW_Z) != 0) && (sum == 0);
517 n = (sum & 0x80000000);
518 c = (sum < reg1) || (sum < reg2);
519 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
520 && (reg2 & 0x80000000) != (sum & 0x80000000));
522 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
523 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
524 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
527 // 1111 1001 1001 1000 Rm Rn; sub Rm,Rn
528 8.0xf9+8.0x98+4.RM2,4.RN0:D1b:::sub
535 srcreg = translate_rreg (SD_, RM2);
536 dstreg = translate_rreg (SD_, RN0);
537 genericSub (State.regs[srcreg], dstreg);
540 // 1111 1001 1010 1000 Rm Rn; subc Rm,Rn
541 8.0xf9+8.0xa8+4.RM2,4.RN0:D1b:::subc
547 unsigned long reg1, reg2, difference;
550 srcreg = translate_rreg (SD_, RM2);
551 dstreg = translate_rreg (SD_, RN0);
553 reg1 = State.regs[srcreg];
554 reg2 = State.regs[dstreg];
555 difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
556 State.regs[dstreg] = difference;
558 z = ((PSW & PSW_Z) != 0) && (difference == 0);
559 n = (difference & 0x80000000);
561 v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
562 && (reg2 & 0x80000000) != (difference & 0x80000000));
564 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
565 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
566 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
569 // 1111 1001 1011 1000 Rn Rn; inc Rn
570 8.0xf9+8.0xb8+4.RN0,4.RN2=RN0:D1:::inc
577 dstreg = translate_rreg (SD_, RN0);
578 genericAdd (1, dstreg);
581 // 1111 1001 1101 1000 Rn Rn; inc Rn
582 8.0xf9+8.0xc8+4.RN0,4.RN2=RN0:D1:::inc4
589 dstreg = translate_rreg (SD_, RN0);
590 State.regs[dstreg] += 4;
593 // 1111 1001 1101 1000 Rm Rn; cmp Rm,Rn
594 8.0xf9+8.0xd8+4.RM2,4.RN0:D1:::cmp
598 int srcreg1, srcreg2;
601 srcreg1 = translate_rreg (SD_, RN0);
602 srcreg2 = translate_rreg (SD_, RM2);
603 genericCmp (State.regs[srcreg2], State.regs[srcreg1]);
606 // 1111 1001 1110 1000 XRm Rn; mov XRm,Rn
607 8.0xf9+8.0xe8+4.XRM2,4.RN0:D1l:::mov
614 dstreg = translate_rreg (SD_, RN0);
615 srcreg = translate_xreg (SD_, XRM2);
617 State.regs[dstreg] = State.regs[srcreg];
620 // 1111 1001 1111 1000 Rm XRn; mov Rm,XRn
621 8.0xf9+8.0xf8+4.RM2,4.XRN0:D1m:::mov
628 srcreg = translate_rreg (SD_, RM2);
629 dstreg = translate_xreg (SD_, XRN0);
631 State.regs[dstreg] = State.regs[srcreg];
634 // 1111 1001 0000 1001 Rm Rn; and Rm,Rn
635 8.0xf9+8.0x09+4.RM2,4.RN0:D1a:::and
644 srcreg = translate_rreg (SD_, RM2);
645 dstreg = translate_rreg (SD_, RN0);
647 State.regs[dstreg] &= State.regs[srcreg];
648 z = (State.regs[dstreg] == 0);
649 n = (State.regs[dstreg] & 0x80000000) != 0;
650 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
651 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
654 // 1111 1001 0001 1001 Rm Rn; or Rm,Rn
655 8.0xf9+8.0x19+4.RM2,4.RN0:D1a:::or
663 srcreg = translate_rreg (SD_, RM2);
664 dstreg = translate_rreg (SD_, RN0);
666 State.regs[dstreg] |= State.regs[srcreg];
667 z = (State.regs[dstreg] == 0);
668 n = (State.regs[dstreg] & 0x80000000) != 0;
669 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
670 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
673 // 1111 1001 0010 1001 Rm Rn; xor Rm,Rn
674 8.0xf9+8.0x29+4.RM2,4.RN0:D1a:::xor
682 srcreg = translate_rreg (SD_, RM2);
683 dstreg = translate_rreg (SD_, RN0);
685 State.regs[dstreg] ^= State.regs[srcreg];
686 z = (State.regs[dstreg] == 0);
687 n = (State.regs[dstreg] & 0x80000000) != 0;
688 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
689 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
692 // 1111 1001 0011 1001 Rn Rn; not Rn
693 8.0xf9+8.0x39+4.RM2,4.RN0=RM2:D1:::not
701 dstreg = translate_rreg (SD_, RN0);
703 State.regs[dstreg] = ~State.regs[dstreg];
704 z = (State.regs[dstreg] == 0);
705 n = (State.regs[dstreg] & 0x80000000) != 0;
706 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
707 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
710 // 1111 1001 0100 1001 Rm Rn; asr Rm,Rn
711 8.0xf9+8.0x49+4.RM2,4.RN0:D1a:::asr
720 srcreg = translate_rreg (SD_, RM2);
721 dstreg = translate_rreg (SD_, RN0);
723 temp = State.regs[dstreg];
725 temp >>= State.regs[srcreg];
726 State.regs[dstreg] = temp;
727 z = (State.regs[dstreg] == 0);
728 n = (State.regs[dstreg] & 0x80000000) != 0;
729 PSW &= ~(PSW_Z | PSW_N | PSW_C);
730 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
733 // 1111 1001 0101 1001 Rm Rn; lsr Rm,Rn
734 8.0xf9+8.0x59+4.RM2,4.RN0:D1a:::lsr
743 srcreg = translate_rreg (SD_, RM2);
744 dstreg = translate_rreg (SD_, RN0);
746 c = State.regs[dstreg] & 1;
747 State.regs[dstreg] >>= State.regs[srcreg];
748 z = (State.regs[dstreg] == 0);
749 n = (State.regs[dstreg] & 0x80000000) != 0;
750 PSW &= ~(PSW_Z | PSW_N | PSW_C);
751 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
754 // 1111 1001 0110 1001 Rm Rn; asl Rm,Rn
755 8.0xf9+8.0x69+4.RM2,4.RN0:D1a:::asl
763 srcreg = translate_rreg (SD_, RM2);
764 dstreg = translate_rreg (SD_, RN0);
766 State.regs[dstreg] <<= State.regs[srcreg];
767 z = (State.regs[dstreg] == 0);
768 n = (State.regs[dstreg] & 0x80000000) != 0;
769 PSW &= ~(PSW_Z | PSW_N);
770 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
773 // 1111 1001 0111 1001 Rn Rn; asl2 Rn
774 8.0xf9+8.0x79+4.RM2,4.RN0=RM2:D1:::asl2
782 dstreg = translate_rreg (SD_, RN0);
784 State.regs[dstreg] <<= 2;
785 z = (State.regs[dstreg] == 0);
786 n = (State.regs[dstreg] & 0x80000000) != 0;
787 PSW &= ~(PSW_Z | PSW_N);
788 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
791 // 1111 1001 1000 1001 Rn Rn; ror Rn
792 8.0xf9+8.0x89+4.RM2,4.RN0=RM2:D1:::ror
801 dstreg = translate_rreg (SD_, RN0);
803 value = State.regs[dstreg];
807 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
808 State.regs[dstreg] = value;
810 n = (value & 0x80000000) != 0;
811 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
812 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
815 // 1111 1001 1001 1001 Rn Rn; rol Rn
816 8.0xf9+8.0x99+4.RM2,4.RN0=RM2:D1:::rol
825 dstreg = translate_rreg (SD_, RN0);
827 value = State.regs[dstreg];
828 c = (value & 0x80000000) ? 1 : 0;
831 value |= ((PSW & PSW_C) != 0);
832 State.regs[dstreg] = value;
834 n = (value & 0x80000000) != 0;
835 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
836 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
839 // 1111 1001 1010 1001 Rm Rn; mul Rm,Rn
840 8.0xf9+8.0xa9+4.RM2,4.RN0:D1b:::mul
845 unsigned long long temp;
849 srcreg = translate_rreg (SD_, RM2);
850 dstreg = translate_rreg (SD_, RN0);
852 temp = ((signed64)(signed32)State.regs[dstreg]
853 * (signed64)(signed32)State.regs[srcreg]);
854 State.regs[dstreg] = temp & 0xffffffff;
855 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
856 z = (State.regs[dstreg] == 0);
857 n = (State.regs[dstreg] & 0x80000000) != 0;
858 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
859 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
862 // 1111 1001 1011 1001 Rm Rn; mulu Rm,Rn
863 8.0xf9+8.0xb9+4.RM2,4.RN0:D1b:::mulu
868 unsigned long long temp;
872 srcreg = translate_rreg (SD_, RM2);
873 dstreg = translate_rreg (SD_, RN0);
875 temp = ((unsigned64)State.regs[dstreg]
876 * (unsigned64)State.regs[srcreg]);
877 State.regs[dstreg] = temp & 0xffffffff;
878 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
879 z = (State.regs[dstreg] == 0);
880 n = (State.regs[dstreg] & 0x80000000) != 0;
881 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
882 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
885 // 1111 1001 1100 1001 Rm Rn; div Rm,Rn
886 8.0xf9+8.0xc9+4.RM2,4.RN0:D1b:::div
895 srcreg = translate_rreg (SD_, RM2);
896 dstreg = translate_rreg (SD_, RN0);
898 temp = State.regs[REG_MDR];
900 temp |= State.regs[dstreg];
901 State.regs[REG_MDR] = temp % (signed32)State.regs[srcreg];
902 temp /= (signed32)State.regs[srcreg];
903 State.regs[dstreg] = temp & 0xffffffff;
904 z = (State.regs[dstreg] == 0);
905 n = (State.regs[dstreg] & 0x80000000) != 0;
906 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
907 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
910 // 1111 1001 1101 1001 Rm Rn; divu Rm,Rn
911 8.0xf9+8.0xd9+4.RM2,4.RN0:D1b:::divu
916 unsigned long long temp;
920 srcreg = translate_rreg (SD_, RM2);
921 dstreg = translate_rreg (SD_, RN0);
923 temp = State.regs[REG_MDR];
925 temp |= State.regs[dstreg];
926 State.regs[REG_MDR] = temp % State.regs[srcreg];
927 temp /= State.regs[srcreg];
928 State.regs[dstreg] = temp & 0xffffffff;
929 z = (State.regs[dstreg] == 0);
930 n = (State.regs[dstreg] & 0x80000000) != 0;
931 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
932 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
936 // 1111 1001 0000 1010 Rm Rn; mov (Rm),Rn
937 8.0xf9+8.0x0a+4.RN2,4.RM0:D1h:::mov
944 srcreg = translate_rreg (SD_, RM0);
945 dstreg = translate_rreg (SD_, RN2);
946 State.regs[dstreg] = load_word (State.regs[srcreg]);
949 // 1111 1001 0001 1010 Rm Rn; mov Rm,(Rn)
950 8.0xf9+8.0x1a+4.RM2,4.RN0:D1i:::mov
957 srcreg = translate_rreg (SD_, RM2);
958 dstreg = translate_rreg (SD_, RN0);
959 store_word (State.regs[dstreg], State.regs[srcreg]);
962 // 1111 1001 0010 1010 Rm Rn; movbu (Rm),Rn
963 8.0xf9+8.0x2a+4.RN2,4.RM0:D1g:::movbu
970 srcreg = translate_rreg (SD_, RM0);
971 dstreg = translate_rreg (SD_, RN2);
972 State.regs[dstreg] = load_byte (State.regs[srcreg]);
975 // 1111 1001 0011 1010 Rm Rn; movbu Rm,(Rn)
976 8.0xf9+8.0x3a+4.RM2,4.RN0:D1i:::movbu
983 srcreg = translate_rreg (SD_, RM2);
984 dstreg = translate_rreg (SD_, RN0);
985 store_byte (State.regs[dstreg], State.regs[srcreg]);
988 // 1111 1001 0100 1010 Rm Rn; movhu (Rm),Rn
989 8.0xf9+8.0x4a+4.RN2,4.RM0:D1g:::movhu
996 srcreg = translate_rreg (SD_, RM0);
997 dstreg = translate_rreg (SD_, RN2);
998 State.regs[dstreg] = load_half (State.regs[srcreg]);
1001 // 1111 1001 0101 1010 Rm Rn; movhu Rm,(Rn)
1002 8.0xf9+8.0x5a+4.RM2,4.RN0:D1i:::movhu
1009 srcreg = translate_rreg (SD_, RM2);
1010 dstreg = translate_rreg (SD_, RN0);
1011 store_half (State.regs[dstreg], State.regs[srcreg]);
1014 // 1111 1001 0110 1010 Rm Rn; mov (Rm+),Rn
1015 8.0xf9+8.0x6a+4.RN2,4.RM0:D1y:::mov
1022 srcreg = translate_rreg (SD_, RM0);
1023 dstreg = translate_rreg (SD_, RN2);
1024 State.regs[dstreg] = load_word (State.regs[srcreg]);
1025 State.regs[srcreg] += 4;
1028 // 1111 1001 0111 1010 Rm Rn; mov Rm,(Rn+)
1029 8.0xf9+8.0x7a+4.RM2,4.RN0:D1z:::mov
1036 srcreg = translate_rreg (SD_, RM2);
1037 dstreg = translate_rreg (SD_, RN0);
1038 store_word (State.regs[dstreg], State.regs[srcreg]);
1039 State.regs[dstreg] += 4;
1042 // 1111 1001 1000 1010 Rn 0000; mov (sp),Rn
1043 8.0xf9+8.0x8a+4.RN2,4.0000:D1j:::mov
1050 dstreg = translate_rreg (SD_, RN2);
1051 State.regs[dstreg] = load_word (State.regs[REG_SP]);
1054 // 1111 1001 1001 1010 Rm 0000; mov Rm, (sp)
1055 8.0xf9+8.0x9a+4.RM2,4.0000:D1k:::mov
1062 srcreg = translate_rreg (SD_, RM2);
1063 store_word (State.regs[REG_SP], State.regs[srcreg]);
1066 // 1111 1001 1010 1010 Rn 0000; mobvu (sp),Rn
1067 8.0xf9+8.0xaa+4.RN2,4.0000:D1j:::movbu
1074 dstreg = translate_rreg (SD_, RN2);
1075 State.regs[dstreg] = load_byte (State.regs[REG_SP]);
1078 // 1111 1001 1011 1010 Rm 0000; movbu Rm, (sp)
1079 8.0xf9+8.0xba+4.RM2,4.0000:D1k:::movbu
1086 srcreg = translate_rreg (SD_, RM2);
1087 store_byte (State.regs[REG_SP], State.regs[srcreg]);
1090 // 1111 1001 1000 1100 Rn 0000; movhu (sp),Rn
1091 8.0xf9+8.0xca+4.RN2,4.0000:D1j:::movhu
1098 dstreg = translate_rreg (SD_, RN2);
1099 State.regs[dstreg] = load_half (State.regs[REG_SP]);
1102 // 1111 1001 1001 1101 Rm 0000; movhu Rm, (sp)
1103 8.0xf9+8.0xda+4.RM2,4.0000:D1k:::movhu
1110 srcreg = translate_rreg (SD_, RM2);
1111 store_half (State.regs[REG_SP], State.regs[srcreg]);
1114 // 1111 1001 1110 1010 Rm Rn; movhu (Rm+),Rn
1115 8.0xf9+8.0xea+4.RN2,4.RM0:D1y:::movhu
1122 srcreg = translate_rreg (SD_, RM0);
1123 dstreg = translate_rreg (SD_, RN2);
1124 State.regs[dstreg] = load_half (State.regs[srcreg]);
1125 State.regs[srcreg] += 2;
1128 // 1111 1001 1111 1010 Rm Rn; movhu Rm,(Rn+)
1129 8.0xf9+8.0xfa+4.RM2,4.RN0:D1z:::movhu
1136 srcreg = translate_rreg (SD_, RM2);
1137 dstreg = translate_rreg (SD_, RN0);
1138 store_half (State.regs[dstreg], State.regs[srcreg]);
1139 State.regs[dstreg] += 2;
1143 // 1111 1001 0000 1011 Rm Rn; mac Rm,Rn
1144 8.0xf9+8.0x0b+4.RM2,4.RN0:D1:::mac
1148 int srcreg1, srcreg2;
1149 long long temp, sum;
1153 srcreg1 = translate_rreg (SD_, RM2);
1154 srcreg2 = translate_rreg (SD_, RN0);
1156 temp = ((signed64)(signed32)State.regs[srcreg2]
1157 * (signed64)(signed32)State.regs[srcreg1]);
1158 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1159 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1160 State.regs[REG_MCRL] = sum;
1163 sum = State.regs[REG_MCRH] + temp + c;
1164 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1165 && (temp & 0x80000000) != (sum & 0x80000000));
1166 State.regs[REG_MCRH] = sum;
1168 State.regs[REG_MCVF] = 1;
1171 // 1111 1001 0001 1011 Rm Rn; macu Rm,Rn
1172 8.0xf9+8.0x1b+4.RM2,4.RN0:D1:::macu
1176 int srcreg1, srcreg2;
1177 unsigned long long temp, sum;
1181 srcreg1 = translate_rreg (SD_, RM2);
1182 srcreg2 = translate_rreg (SD_, RN0);
1184 temp = ((unsigned64)State.regs[srcreg2]
1185 * (unsigned64)State.regs[srcreg1]);
1186 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1187 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1188 State.regs[REG_MCRL] = sum;
1191 sum = State.regs[REG_MCRH] + temp + c;
1192 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1193 && (temp & 0x80000000) != (sum & 0x80000000));
1194 State.regs[REG_MCRH] = sum;
1196 State.regs[REG_MCVF] = 1;
1199 // 1111 1001 0010 1011 Rm Rn; macb Rm,Rn
1200 8.0xf9+8.0x2b+4.RM2,4.RN0:D1:::macb
1204 int srcreg1, srcreg2;
1209 srcreg1 = translate_rreg (SD_, RM2);
1210 srcreg2 = translate_rreg (SD_, RN0);
1212 temp = ((signed32)(signed8)(State.regs[srcreg2] & 0xff)
1213 * (signed32)(signed8)(State.regs[srcreg1] & 0xff));
1214 sum = State.regs[REG_MCRL] + temp;
1215 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1216 && (temp & 0x80000000) != (sum & 0x80000000));
1217 State.regs[REG_MCRL] = sum;
1219 State.regs[REG_MCVF] = 1;
1222 // 1111 1001 0011 1011 Rm Rn; macbu Rm,Rn
1223 8.0xf9+8.0x3b+4.RM2,4.RN0:D1:::macbu
1227 int srcreg1, srcreg2;
1228 long long temp, sum;
1232 srcreg1 = translate_rreg (SD_, RM2);
1233 srcreg2 = translate_rreg (SD_, RN0);
1235 temp = ((unsigned32)(State.regs[srcreg2] & 0xff)
1236 * (unsigned32)(State.regs[srcreg1] & 0xff));
1237 sum = State.regs[REG_MCRL] + temp;
1238 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1239 && (temp & 0x80000000) != (sum & 0x80000000));
1240 State.regs[REG_MCRL] = sum;
1242 State.regs[REG_MCVF] = 1;
1245 // 1111 1001 0100 1011 Rm Rn; mach Rm,Rn
1246 8.0xf9+8.0x4b+4.RM2,4.RN0:D1:::mach
1250 int srcreg1, srcreg2;
1251 long long temp, sum;
1255 srcreg1 = translate_rreg (SD_, RM2);
1256 srcreg2 = translate_rreg (SD_, RN0);
1258 temp = ((unsigned64)(signed16)(State.regs[srcreg2] & 0xffff)
1259 * (unsigned64)(signed16)(State.regs[srcreg1] & 0xffff));
1260 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1261 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1262 State.regs[REG_MCRL] = sum;
1265 sum = State.regs[REG_MCRH] + temp + c;
1266 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1267 && (temp & 0x80000000) != (sum & 0x80000000));
1268 State.regs[REG_MCRH] = sum;
1270 State.regs[REG_MCVF] = 1;
1273 // 1111 1001 0101 1011 Rm Rn; machu Rm,Rn
1274 8.0xf9+8.0x5b+4.RM2,4.RN0:D1:::machu
1278 int srcreg1, srcreg2;
1279 long long temp, sum;
1283 srcreg1 = translate_rreg (SD_, RM2);
1284 srcreg2 = translate_rreg (SD_, RN0);
1286 temp = ((unsigned64)(State.regs[srcreg2] & 0xffff)
1287 * (unsigned64)(State.regs[srcreg1] & 0xffff));
1288 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
1289 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
1290 State.regs[REG_MCRL] = sum;
1293 sum = State.regs[REG_MCRH] + temp + c;
1294 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
1295 && (temp & 0x80000000) != (sum & 0x80000000));
1296 State.regs[REG_MCRH] = sum;
1298 State.regs[REG_MCVF] = 1;
1301 // 1111 1001 0110 1011 Rm Rn; dmach Rm,Rn
1302 8.0xf9+8.0x6b+4.RM2,4.RN0:D1:::dmach
1306 int srcreg1, srcreg2;
1307 long temp, temp2, sum;
1311 srcreg1 = translate_rreg (SD_, RM2);
1312 srcreg2 = translate_rreg (SD_, RN0);
1314 temp = ((signed32)(signed16)(State.regs[srcreg2] & 0xffff)
1315 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
1316 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
1317 * (signed32)(signed16)((State.regs[srcreg2] >> 16) & 0xffff));
1318 sum = temp + temp2 + State.regs[REG_MCRL];
1319 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1320 && (temp & 0x80000000) != (sum & 0x80000000));
1321 State.regs[REG_MCRL] = sum;
1323 State.regs[REG_MCVF] = 1;
1326 // 1111 1001 0111 1011 Rm Rn; dmachu Rm,Rn
1327 8.0xf9+8.0x7b+4.RM2,4.RN0:D1:::dmachu
1331 int srcreg1, srcreg2;
1332 unsigned long temp, temp2, sum;
1336 srcreg1 = translate_rreg (SD_, RM2);
1337 srcreg2 = translate_rreg (SD_, RN0);
1339 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
1340 * (unsigned32)(State.regs[srcreg1] & 0xffff));
1341 temp2 = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
1342 * (unsigned32)((State.regs[srcreg2] >> 16) & 0xffff));
1343 sum = temp + temp2 + State.regs[REG_MCRL];
1344 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
1345 && (temp & 0x80000000) != (sum & 0x80000000));
1346 State.regs[REG_MCRL] = sum;
1348 State.regs[REG_MCVF] = 1;
1351 // 1111 1001 1000 1011 Rm Rn; dmulh Rm,Rn
1352 8.0xf9+8.0x8b+4.RM2,4.RN0:D1:::dmulh
1360 srcreg = translate_rreg (SD_, RM2);
1361 dstreg = translate_rreg (SD_, RN0);
1363 temp = ((signed32)(signed16)(State.regs[dstreg] & 0xffff)
1364 * (signed32)(signed16)(State.regs[srcreg] & 0xffff));
1365 State.regs[REG_MDRQ] = temp;
1366 temp = ((signed32)(signed16)((State.regs[dstreg] >> 16) & 0xffff)
1367 * (signed32)(signed16)((State.regs[srcreg] >>16) & 0xffff));
1368 State.regs[dstreg] = temp;
1371 // 1111 1001 1001 1011 Rm Rn; dmulhu Rm,Rn
1372 8.0xf9+8.0x9b+4.RM2,4.RN0:D1:::dumachu
1380 srcreg = translate_rreg (SD_, RM2);
1381 dstreg = translate_rreg (SD_, RN0);
1383 temp = ((unsigned32)(State.regs[dstreg] & 0xffff)
1384 * (unsigned32)(State.regs[srcreg] & 0xffff));
1385 State.regs[REG_MDRQ] = temp;
1386 temp = ((unsigned32)((State.regs[dstreg] >> 16) & 0xffff)
1387 * (unsigned32)((State.regs[srcreg] >>16) & 0xffff));
1388 State.regs[dstreg] = temp;
1391 // 1111 1001 1010 1011 Rm Rn; sat16 Rm,Rn
1392 8.0xf9+8.0xab+4.RM2,4.RN0:D1:::sat16
1400 srcreg = translate_rreg (SD_, RM2);
1401 dstreg = translate_rreg (SD_, RN0);
1403 value = State.regs[srcreg];
1405 if (value >= 0x7fff)
1406 State.regs[dstreg] = 0x7fff;
1407 else if (value <= 0xffff8000)
1408 State.regs[dstreg] = 0xffff8000;
1410 State.regs[dstreg] = value;
1412 n = (State.regs[dstreg] & 0x8000) != 0;
1413 z = (State.regs[dstreg] == 0);
1414 PSW &= ~(PSW_Z | PSW_N);
1415 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1418 // 1111 1001 1011 1011 Rm Rn; mcste Rm,Rn
1419 8.0xf9+8.0xbb+4.RM2,4.RN0:D1:::mcste
1426 srcreg = translate_rreg (SD_, RM2);
1427 dstreg = translate_rreg (SD_, RN0);
1429 PSW &= ~(PSW_V | PSW_C);
1430 PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
1432 /* 32bit saturation. */
1433 if (State.regs[srcreg] == 0x20)
1437 tmp = State.regs[REG_MCRH];
1439 tmp += State.regs[REG_MCRL];
1441 if (tmp > 0x7fffffff)
1442 State.regs[dstreg] = 0x7fffffff;
1443 else if (tmp < 0xffffffff80000000LL)
1444 State.regs[dstreg] = 0x80000000;
1446 State.regs[dstreg] = tmp;
1448 /* 16bit saturation */
1449 else if (State.regs[srcreg] == 0x10)
1453 tmp = State.regs[REG_MCRH];
1455 tmp += State.regs[REG_MCRL];
1458 State.regs[dstreg] = 0x7fff;
1459 else if (tmp < 0xffffffffffff8000LL)
1460 State.regs[dstreg] = 0x8000;
1462 State.regs[dstreg] = tmp;
1464 /* 8 bit saturation */
1465 else if (State.regs[srcreg] == 0x8)
1469 tmp = State.regs[REG_MCRH];
1471 tmp += State.regs[REG_MCRL];
1474 State.regs[dstreg] = 0x7f;
1475 else if (tmp < 0xffffffffffffff80LL)
1476 State.regs[dstreg] = 0x80;
1478 State.regs[dstreg] = tmp;
1480 /* 9 bit saturation */
1481 else if (State.regs[srcreg] == 0x9)
1485 tmp = State.regs[REG_MCRH];
1487 tmp += State.regs[REG_MCRL];
1490 State.regs[dstreg] = 0x80;
1491 else if (tmp < 0xffffffffffffff81LL)
1492 State.regs[dstreg] = 0x81;
1494 State.regs[dstreg] = tmp;
1496 /* 9 bit saturation */
1497 else if (State.regs[srcreg] == 0x30)
1501 tmp = State.regs[REG_MCRH];
1503 tmp += State.regs[REG_MCRL];
1505 if (tmp > 0x7fffffffffffLL)
1506 tmp = 0x7fffffffffffLL;
1507 else if (tmp < 0xffff800000000000LL)
1508 tmp = 0xffff800000000000LL;
1511 State.regs[dstreg] = tmp;
1515 // 1111 1001 1100 1011 Rm Rn; swap Rm,Rn
1516 8.0xf9+8.0xcb+4.RM2,4.RN0:D1:::swap
1523 srcreg = translate_rreg (SD_, RM2);
1524 dstreg = translate_rreg (SD_, RN0);
1526 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 24)
1527 | (((State.regs[srcreg] >> 8) & 0xff) << 16)
1528 | (((State.regs[srcreg] >> 16) & 0xff) << 8)
1529 | ((State.regs[srcreg] >> 24) & 0xff));
1532 // 1111 1101 1101 1011 Rm Rn; swaph Rm,Rn
1533 8.0xf9+8.0xdb+4.RM2,4.RN0:D1:::swaph
1540 srcreg = translate_rreg (SD_, RM2);
1541 dstreg = translate_rreg (SD_, RN0);
1543 State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 8)
1544 | ((State.regs[srcreg] >> 8) & 0xff)
1545 | (((State.regs[srcreg] >> 16) & 0xff) << 24)
1546 | (((State.regs[srcreg] >> 24) & 0xff) << 16));
1549 // 1111 1001 1110 1011 Rm Rn; swhw Rm,Rn
1550 8.0xf9+8.0xeb+4.RM2,4.RN0:D1:::swhw
1557 srcreg = translate_rreg (SD_, RM2);
1558 dstreg = translate_rreg (SD_, RN0);
1560 State.regs[dstreg] = (((State.regs[srcreg] & 0xffff) << 16)
1561 | ((State.regs[srcreg] >> 16) & 0xffff));
1564 // 1111 1001 1111 1011 Rm Rn; bsch Rm,Rn
1565 8.0xf9+8.0xfb+4.RM2,4.RN0:D1:::bsch
1574 srcreg = translate_rreg (SD_, RM2);
1575 dstreg = translate_rreg (SD_, RN0);
1577 temp = State.regs[srcreg];
1578 start = (State.regs[dstreg] & 0x1f) - 1;
1582 for (i = start; i >= 0; i--)
1584 if (temp & (1 << i))
1587 State.regs[dstreg] = i;
1595 State.regs[dstreg] = 0;
1598 PSW |= (c ? PSW_C : 0);
1602 // 1111 1011 0000 1000 Rn Rn IMM8; mov IMM8,Rn
1603 8.0xfb+8.0x08+4.RM2,4.RN0=RM2+8.IMM8:D2j:::mov
1610 dstreg = translate_rreg (SD_, RN0);
1611 State.regs[dstreg] = EXTEND8 (IMM8);
1614 // 1111 1011 0001 1000 Rn Rn IMM8; movu IMM8,Rn
1615 8.0xfb+8.0x18+4.RM2,4.RN0=RM2+8.IMM8:D2:::movu
1622 dstreg = translate_rreg (SD_, RN0);
1623 State.regs[dstreg] = IMM8 & 0xff;
1626 // 1111 1011 0111 1000 Rn Rn IMM8; add IMM8,Rn
1627 8.0xfb+8.0x78+4.RM2,4.RN0=RM2+8.IMM8:D2d:::add
1634 dstreg = translate_rreg (SD_, RN0);
1635 genericAdd (EXTEND8 (IMM8), dstreg);
1638 // 1111 1011 1000 1000 Rn Rn IMM8; addc IMM8,Rn
1639 8.0xfb+8.0x88+4.RM2,4.RN0=RM2+8.IMM8:D2d:::addc
1645 unsigned long reg1, reg2, sum;
1648 dstreg = translate_rreg (SD_, RN0);
1650 imm = EXTEND8 (IMM8);
1651 reg2 = State.regs[dstreg];
1652 sum = imm + reg2 + ((PSW & PSW_C) != 0);
1653 State.regs[dstreg] = sum;
1655 z = ((PSW & PSW_Z) != 0) && (sum == 0);
1656 n = (sum & 0x80000000);
1657 c = (sum < imm) || (sum < reg2);
1658 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1659 && (reg2 & 0x80000000) != (sum & 0x80000000));
1661 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1662 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1663 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1666 // 1111 1011 1001 1000 Rn Rn IMM8; sub IMM8,Rn
1667 8.0xfb+8.0x98+4.RM2,4.RN0=RM2+8.IMM8:D2d:::sub
1674 dstreg = translate_rreg (SD_, RN0);
1676 genericSub (EXTEND8 (IMM8), dstreg);
1679 // 1111 1011 1010 1000 Rn Rn IMM8; subc IMM8,Rn
1680 8.0xfb+8.0xa8+4.RM2,4.RN0=RM2+8.IMM8:D2d:::subc
1686 unsigned long reg1, reg2, difference;
1689 dstreg = translate_rreg (SD_, RN0);
1691 imm = EXTEND8 (IMM8);
1692 reg2 = State.regs[dstreg];
1693 difference = reg2 - imm - ((PSW & PSW_C) != 0);
1694 State.regs[dstreg] = difference;
1696 z = ((PSW & PSW_Z) != 0) && (difference == 0);
1697 n = (difference & 0x80000000);
1699 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
1700 && (reg2 & 0x80000000) != (difference & 0x80000000));
1702 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1703 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1704 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
1707 // 1111 1011 1101 1000 Rn Rn IMM8; cmp IMM8,Rn
1708 8.0xfb+8.0xd8+4.RM2,4.RN0=RM2+8.IMM8:D2b:::cmp
1715 srcreg = translate_rreg (SD_, RN0);
1716 genericCmp (EXTEND8 (IMM8), State.regs[srcreg]);
1719 // 1111 1011 1111 1000 XRn XRn IMM8; mov IMM8,XRn
1720 8.0xfb+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM8:D2k:::mov
1727 dstreg = translate_xreg (SD_, XRN0);
1729 State.regs[dstreg] = IMM8;
1732 // 1111 1011 0000 1001 Rn Rn IMM8; and IMM8,Rn
1733 8.0xfb+8.0x09+4.RM2,4.RN0=RM2+8.IMM8:D2d:::and
1741 dstreg = translate_rreg (SD_, RN0);
1743 State.regs[dstreg] &= (IMM8 & 0xff);
1744 z = (State.regs[dstreg] == 0);
1745 n = (State.regs[dstreg] & 0x80000000) != 0;
1746 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1747 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1750 // 1111 1011 0001 1001 Rn Rn IMM8; or IMM8,Rn
1751 8.0xfb+8.0x19+4.RM2,4.RN0=RM2+8.IMM8:D2d:::or
1759 dstreg = translate_rreg (SD_, RN0);
1761 State.regs[dstreg] |= (IMM8 & 0xff);
1762 z = (State.regs[dstreg] == 0);
1763 n = (State.regs[dstreg] & 0x80000000) != 0;
1764 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1765 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1768 // 1111 1011 0010 1001 Rn Rn IMM8; xor IMM8,Rn
1769 8.0xfb+8.0x29+4.RM2,4.RN0=RM2+8.IMM8:D2d:::xor
1777 dstreg = translate_rreg (SD_, RN0);
1779 State.regs[dstreg] ^= (IMM8 & 0xff);
1780 z = (State.regs[dstreg] == 0);
1781 n = (State.regs[dstreg] & 0x80000000) != 0;
1782 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1783 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1786 // 1111 1011 0100 1001 Rn Rn IMM8; asr IMM8,Rn
1787 8.0xfb+8.0x49+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asr
1796 dstreg = translate_rreg (SD_, RN0);
1798 temp = State.regs[dstreg];
1800 temp >>= (IMM8 & 0xff);
1801 State.regs[dstreg] = temp;
1802 z = (State.regs[dstreg] == 0);
1803 n = (State.regs[dstreg] & 0x80000000) != 0;
1804 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1805 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1808 // 1111 1011 0101 1001 Rn Rn IMM8; lsr IMM8,Rn
1809 8.0xfb+8.0x59+4.RM2,4.RN0=RM2+8.IMM8:D2a:::lsr
1817 dstreg = translate_rreg (SD_, RN0);
1819 c = State.regs[dstreg] & 1;
1820 State.regs[dstreg] >>= (IMM8 & 0xff);
1821 z = (State.regs[dstreg] == 0);
1822 n = (State.regs[dstreg] & 0x80000000) != 0;
1823 PSW &= ~(PSW_Z | PSW_N | PSW_C);
1824 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
1827 // 1111 1011 0110 1001 Rn Rn IMM8; asl IMM8,Rn
1828 8.0xfb+8.0x69+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asl
1836 dstreg = translate_rreg (SD_, RN0);
1838 State.regs[dstreg] <<= (IMM8 & 0xff);
1839 z = (State.regs[dstreg] == 0);
1840 n = (State.regs[dstreg] & 0x80000000) != 0;
1841 PSW &= ~(PSW_Z | PSW_N);
1842 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1845 // 1111 1011 1010 1001 Rn Rn IMM8; mul IMM8,Rn
1846 8.0xfb+8.0xa9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mul
1851 unsigned long long temp;
1855 dstreg = translate_rreg (SD_, RN0);
1857 temp = ((signed64)(signed32)State.regs[dstreg]
1858 * (signed64)(signed32)EXTEND8 (IMM8));
1859 State.regs[dstreg] = temp & 0xffffffff;
1860 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
1861 z = (State.regs[dstreg] == 0);
1862 n = (State.regs[dstreg] & 0x80000000) != 0;
1863 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1864 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1867 // 1111 1011 1011 1001 Rn Rn IMM8; mulu IMM8,Rn
1868 8.0xfb+8.0xb9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mulu
1873 unsigned long long temp;
1877 dstreg = translate_rreg (SD_, RN0);
1879 temp = ((unsigned64)State.regs[dstreg]
1880 * (unsigned64)(IMM8 & 0xff));
1881 State.regs[dstreg] = temp & 0xffffffff;
1882 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
1883 z = (State.regs[dstreg] == 0);
1884 n = (State.regs[dstreg] & 0x80000000) != 0;
1885 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1886 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
1889 // 1111 1011 1110 1001 Rn Rn IMM8; btst imm8,Rn
1890 8.0xfb+8.0xe9+4.RN2,4.RM0=RN2+8.IMM8:D2l:::btst
1897 srcreg = translate_rreg (SD_, RM0);
1898 genericBtst(IMM8, State.regs[srcreg]);
1901 // 1111 1011 0000 1010 Rn Rm IMM8; mov (d8,Rm),Rn
1902 8.0xfb+8.0x0a+4.RN2,4.RM0+8.IMM8:D2l:::mov
1909 srcreg = translate_rreg (SD_, RM0);
1910 dstreg = translate_rreg (SD_, RN2);
1911 State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
1914 // 1111 1011 0001 1010 Rn Rm IMM8; mov Rm,(d8,Rn)
1915 8.0xfb+8.0x1a+4.RM2,4.RN0+8.IMM8:D2m:::mov
1921 srcreg = translate_rreg (SD_, RM2);
1922 dstreg = translate_rreg (SD_, RN0);
1923 store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1926 // 1111 1011 0010 1010 Rn Rm IMM8; movbu (d8,Rm),Rn
1927 8.0xfb+8.0x2a+4.RN2,4.RM0+8.IMM8:D2l:::movbu
1933 srcreg = translate_rreg (SD_, RM0);
1934 dstreg = translate_rreg (SD_, RN2);
1935 State.regs[dstreg] = load_byte (State.regs[srcreg] + EXTEND8 (IMM8));
1938 // 1111 1011 0011 1010 Rn Rm IMM8; movbu Rm,(d8,Rn)
1939 8.0xfb+8.0x3a+4.RM2,4.RN0+8.IMM8:D2m:::movbu
1945 srcreg = translate_rreg (SD_, RM2);
1946 dstreg = translate_rreg (SD_, RN0);
1947 store_byte (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1950 // 1111 1011 0100 1010 Rn Rm IMM8; movhu (d8,Rm),Rn
1951 8.0xfb+8.0x4a+4.RN2,4.RM0+8.IMM8:D2l:::movhu
1957 srcreg = translate_rreg (SD_, RM0);
1958 dstreg = translate_rreg (SD_, RN2);
1959 State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
1962 // 1111 1011 0101 1010 Rn Rm IMM8; movhu Rm,(d8,Rn)
1963 8.0xfb+8.0x5a+4.RM2,4.RN0+8.IMM8:D2m:::movhu
1969 srcreg = translate_rreg (SD_, RM2);
1970 dstreg = translate_rreg (SD_, RN0);
1971 store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
1974 // 1111 1011 0110 1010 Rn Rm IMM8; mov (d8,Rm+),Rn
1975 8.0xfb+8.0x6a+4.RN2,4.RM0+8.IMM8:D2y:::mov
1982 srcreg = translate_rreg (SD_, RM0);
1983 dstreg = translate_rreg (SD_, RN2);
1984 State.regs[dstreg] = load_word (State.regs[srcreg]);
1985 State.regs[srcreg] += EXTEND8 (IMM8);
1988 // 1111 1011 0111 1010 Rn Rm IMM8; mov Rm,(d8,Rn+)
1989 8.0xfb+8.0x7a+4.RM2,4.RN0+8.IMM8:D2z:::mov
1995 srcreg = translate_rreg (SD_, RM2);
1996 dstreg = translate_rreg (SD_, RN0);
1997 store_word (State.regs[dstreg], State.regs[srcreg]);
1998 State.regs[dstreg] += EXTEND8 (IMM8);
2002 // 1111 1011 1000 1010 Rn 0000 IMM8; mov (d8,sp),Rn
2003 8.0xfb+8.0x8a+4.RN2,4.0x0+8.IMM8:D2n:::mov
2009 dstreg = translate_rreg (SD_, RN2);
2010 State.regs[dstreg] = load_word (State.regs[REG_SP] + EXTEND8 (IMM8));
2013 // 1111 1011 1001 1010 Rm 0000 IMM8; mov Rm,(d8,Rn)
2014 8.0xfb+8.0x9a+4.RM2,4.0x0+8.IMM8:D2o:::mov
2020 srcreg = translate_rreg (SD_, RM2);
2021 store_word (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2024 // 1111 1011 1010 1010 Rn Rm IMM8; movbu (d8,sp),Rn
2025 8.0xfb+8.0xaa+4.RN2,4.0x0+8.IMM8:D2n:::movbu
2031 dstreg = translate_rreg (SD_, RN2);
2032 State.regs[dstreg] = load_byte (State.regs[REG_SP] + EXTEND8 (IMM8));
2035 // 1111 1011 1011 1010 Rn Rm IMM8; movbu Rm,(sp,Rn)
2036 8.0xfb+8.0xba+4.RM2,4.0x0+8.IMM8:D2o:::movbu
2042 srcreg = translate_rreg (SD_, RM2);
2043 store_byte (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2046 // 1111 1011 1100 1010 Rn Rm IMM8; movhu (d8,sp),Rn
2047 8.0xfb+8.0xca+4.RN2,4.0x0+8.IMM8:D2n:::movhu
2053 dstreg = translate_rreg (SD_, RN2);
2054 State.regs[dstreg] = load_half (State.regs[REG_SP] + EXTEND8 (IMM8));
2057 // 1111 1011 1101 1010 Rn Rm IMM8; movhu Rm,(d8,sp)
2058 8.0xfb+8.0xda+4.RM2,4.0x0+8.IMM8:D2o:::movhu
2064 srcreg = translate_rreg (SD_, RM2);
2065 store_half (State.regs[REG_SP] + EXTEND8 (IMM8), State.regs[srcreg]);
2068 // 1111 1011 1110 1010 Rn Rm IMM8; movhu (d8,Rm+),Rn
2069 8.0xfb+8.0xea+4.RN2,4.RM0+8.IMM8:D2y:::movhu
2076 srcreg = translate_rreg (SD_, RM0);
2077 dstreg = translate_rreg (SD_, RN2);
2078 State.regs[dstreg] = load_half (State.regs[srcreg]);
2079 State.regs[srcreg] += EXTEND8 (IMM8);
2082 // 1111 1011 1111 1010 Rn Rm IMM8; movhu Rm,(d8,Rn+)
2083 8.0xfb+8.0xfa+4.RM2,4.RN0+8.IMM8:D2z:::movhu
2089 srcreg = translate_rreg (SD_, RM2);
2090 dstreg = translate_rreg (SD_, RN0);
2091 store_half (State.regs[dstreg], State.regs[srcreg]);
2092 State.regs[dstreg] += EXTEND8 (IMM8);
2096 // 1111 1011 0000 1011 Rn Rn IMM8; mac imm8,Rn
2097 8.0xfb+8.0x0b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mac
2101 long long temp, sum;
2105 srcreg = translate_rreg (SD_, RN2);
2107 temp = ((signed64)(signed32)EXTEND8 (IMM8)
2108 * (signed64)(signed32)State.regs[srcreg]);
2109 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2110 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2111 State.regs[REG_MCRL] = sum;
2114 sum = State.regs[REG_MCRH] + temp + c;
2115 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2116 && (temp & 0x80000000) != (sum & 0x80000000));
2117 State.regs[REG_MCRH] = sum;
2119 State.regs[REG_MCVF] = 1;
2122 // 1111 1011 0001 1011 Rn Rn IMM8; macu imm8,Rn
2123 8.0xfb+8.0x1b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macu
2127 long long temp, sum;
2131 srcreg = translate_rreg (SD_, RN2);
2133 temp = ((unsigned64) (IMM8)
2134 * (unsigned64)State.regs[srcreg]);
2135 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2136 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2137 State.regs[REG_MCRL] = sum;
2140 sum = State.regs[REG_MCRH] + temp + c;
2141 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2142 && (temp & 0x80000000) != (sum & 0x80000000));
2143 State.regs[REG_MCRH] = sum;
2145 State.regs[REG_MCVF] = 1;
2148 // 1111 1011 0010 1011 Rn Rn IMM8; macb imm8,Rn
2149 8.0xfb+8.0x2b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macb
2153 long long temp, sum;
2157 srcreg = translate_rreg (SD_, RN2);
2159 temp = ((signed64)(signed8)EXTEND8 (IMM8)
2160 * (signed64)(signed8)State.regs[srcreg] & 0xff);
2161 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2162 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2163 State.regs[REG_MCRL] = sum;
2166 sum = State.regs[REG_MCRH] + temp + c;
2167 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2168 && (temp & 0x80000000) != (sum & 0x80000000));
2169 State.regs[REG_MCRH] = sum;
2171 State.regs[REG_MCVF] = 1;
2174 // 1111 1011 0011 1011 Rn Rn IMM8; macbu imm8,Rn
2175 8.0xfb+8.0x3b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macbu
2179 long long temp, sum;
2183 srcreg = translate_rreg (SD_, RN2);
2185 temp = ((unsigned64) (IMM8)
2186 * (unsigned64)State.regs[srcreg] & 0xff);
2187 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2188 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2189 State.regs[REG_MCRL] = sum;
2192 sum = State.regs[REG_MCRH] + temp + c;
2193 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2194 && (temp & 0x80000000) != (sum & 0x80000000));
2195 State.regs[REG_MCRH] = sum;
2197 State.regs[REG_MCVF] = 1;
2200 // 1111 1011 0100 1011 Rn Rn IMM8; mach imm8,Rn
2201 8.0xfb+8.0x4b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mach
2205 long long temp, sum;
2209 srcreg = translate_rreg (SD_, RN2);
2211 temp = ((signed64)(signed16)EXTEND8 (IMM8)
2212 * (signed64)(signed16)State.regs[srcreg] & 0xffff);
2213 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2214 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2215 State.regs[REG_MCRL] = sum;
2218 sum = State.regs[REG_MCRH] + temp + c;
2219 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2220 && (temp & 0x80000000) != (sum & 0x80000000));
2221 State.regs[REG_MCRH] = sum;
2223 State.regs[REG_MCVF] = 1;
2226 // 1111 1011 0101 1011 Rn Rn IMM8; machu imm8,Rn
2227 8.0xfb+8.0x5b+4.RN2,4.RN0=RN2+8.IMM8:D2:::machu
2231 long long temp, sum;
2235 srcreg = translate_rreg (SD_, RN2);
2237 temp = ((unsigned64) (IMM8)
2238 * (unsigned64)State.regs[srcreg] & 0xffff);
2239 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
2240 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
2241 State.regs[REG_MCRL] = sum;
2244 sum = State.regs[REG_MCRH] + temp + c;
2245 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
2246 && (temp & 0x80000000) != (sum & 0x80000000));
2247 State.regs[REG_MCRH] = sum;
2249 State.regs[REG_MCVF] = 1;
2252 // 1111 1011 1011 1011 Rn Rn IMM8; mcste imm8,Rn
2253 8.0xfb+8.0xbb+4.RN2,4.RN0=RN2+8.IMM8:D2:::mcste
2259 dstreg = translate_rreg (SD_, RN0);
2261 PSW &= ~(PSW_V | PSW_C);
2262 PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
2264 /* 32bit saturation. */
2269 tmp = State.regs[REG_MCRH];
2271 tmp += State.regs[REG_MCRL];
2273 if (tmp > 0x7fffffff)
2274 State.regs[dstreg] = 0x7fffffff;
2275 else if (tmp < 0xffffffff80000000LL)
2276 State.regs[dstreg] = 0x80000000;
2278 State.regs[dstreg] = tmp;
2280 /* 16bit saturation */
2281 else if (IMM8 == 0x10)
2285 tmp = State.regs[REG_MCRH];
2287 tmp += State.regs[REG_MCRL];
2290 State.regs[dstreg] = 0x7fff;
2291 else if (tmp < 0xffffffffffff8000LL)
2292 State.regs[dstreg] = 0x8000;
2294 State.regs[dstreg] = tmp;
2296 /* 8 bit saturation */
2297 else if (IMM8 == 0x8)
2301 tmp = State.regs[REG_MCRH];
2303 tmp += State.regs[REG_MCRL];
2306 State.regs[dstreg] = 0x7f;
2307 else if (tmp < 0xffffffffffffff80LL)
2308 State.regs[dstreg] = 0x80;
2310 State.regs[dstreg] = tmp;
2312 /* 9 bit saturation */
2313 else if (IMM8 == 0x9)
2317 tmp = State.regs[REG_MCRH];
2319 tmp += State.regs[REG_MCRL];
2322 State.regs[dstreg] = 0x80;
2323 else if (tmp < 0xffffffffffffff81LL)
2324 State.regs[dstreg] = 0x81;
2326 State.regs[dstreg] = tmp;
2328 /* 9 bit saturation */
2329 else if (IMM8 == 0x30)
2333 tmp = State.regs[REG_MCRH];
2335 tmp += State.regs[REG_MCRL];
2337 if (tmp > 0x7fffffffffffLL)
2338 tmp = 0x7fffffffffffLL;
2339 else if (tmp < 0xffff800000000000LL)
2340 tmp = 0xffff800000000000LL;
2343 State.regs[dstreg] = tmp;
2347 // 1111 1011 0111 1100 Rm Rn Rd; add Rm,Rn,Rd
2348 8.0xfb+8.0x7c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::add
2353 unsigned long sum, source1, source2;
2354 int srcreg1, srcreg2, dstreg;
2357 srcreg1 = translate_rreg (SD_, RM2);
2358 srcreg2 = translate_rreg (SD_, RN0);
2359 dstreg = translate_rreg (SD_, RD0);
2361 source1 = State.regs[srcreg1];
2362 source2 = State.regs[srcreg2];
2363 sum = source1 + source2;
2364 State.regs[dstreg] = sum;
2367 n = (sum & 0x80000000);
2368 c = (sum < source1) || (sum < source2);
2369 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2370 && (source1 & 0x80000000) != (sum & 0x80000000));
2372 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2373 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2374 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2377 // 1111 1011 1000 1100 Rm Rn Rd; addc Rm,Rn,Rd
2378 8.0xfb+8.0x8c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::addc
2383 unsigned long sum, source1, source2;
2384 int srcreg1, srcreg2, dstreg;
2387 srcreg1 = translate_rreg (SD_, RM2);
2388 srcreg2 = translate_rreg (SD_, RN0);
2389 dstreg = translate_rreg (SD_, RD0);
2391 source1 = State.regs[srcreg1];
2392 source2 = State.regs[srcreg2];
2393 sum = source1 + source2 + ((PSW & PSW_C) != 0);
2394 State.regs[dstreg] = sum;
2396 z = ((PSW & PSW_Z) != 0) && (sum == 0);
2397 n = (sum & 0x80000000);
2398 c = (sum < source1) || (sum < source2);
2399 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2400 && (source1 & 0x80000000) != (sum & 0x80000000));
2402 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2403 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2404 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2407 // 1111 1011 1001 1100 Rm Rn Rd; sub Rm,Rn,Rd
2408 8.0xfb+8.0x9c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::sub
2413 unsigned long difference, source1, source2;
2414 int srcreg1, srcreg2, dstreg;
2417 srcreg1 = translate_rreg (SD_, RM2);
2418 srcreg2 = translate_rreg (SD_, RN0);
2419 dstreg = translate_rreg (SD_, RD0);
2421 source1 = State.regs[srcreg1];
2422 source2 = State.regs[srcreg2];
2423 difference = source2 - source1;
2424 State.regs[dstreg] = difference;
2426 z = (difference == 0);
2427 n = (difference & 0x80000000);
2428 c = (source1 > source1);
2429 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2430 && (source1 & 0x80000000) != (difference & 0x80000000));
2432 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2433 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2434 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2437 // 1111 1011 1010 1100 Rm Rn Rd; subc Rm,Rn,Rd
2438 8.0xfb+8.0xac+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::subc
2443 unsigned long difference, source1, source2;
2444 int srcreg1, srcreg2, dstreg;
2447 srcreg1 = translate_rreg (SD_, RM2);
2448 srcreg2 = translate_rreg (SD_, RN0);
2449 dstreg = translate_rreg (SD_, RD0);
2451 source1 = State.regs[srcreg1];
2452 source2 = State.regs[srcreg2];
2453 difference = source2 - source1 - ((PSW & PSW_C) != 0);
2454 State.regs[dstreg] = difference;
2456 z = ((PSW & PSW_Z) != 0) && (difference == 0);
2457 n = (difference & 0x80000000);
2458 c = (source1 > source2);
2459 v = ((source1 & 0x80000000) == (source2 & 0x80000000)
2460 && (source1 & 0x80000000) != (difference & 0x80000000));
2462 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2463 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
2464 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
2467 // 1111 1011 0000 1101 Rm Rn Rd; and Rm,Rn,Rd
2468 8.0xfb+8.0x0d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::and
2473 int srcreg1, srcreg2, dstreg;
2476 srcreg1 = translate_rreg (SD_, RM2);
2477 srcreg2 = translate_rreg (SD_, RN0);
2478 dstreg = translate_rreg (SD_, RD0);
2480 State.regs[dstreg] = State.regs[srcreg1] & State.regs[srcreg2];
2482 z = (State.regs[dstreg] == 0);
2483 n = (State.regs[dstreg] & 0x80000000);
2485 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2486 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2489 // 1111 1011 0001 1101 Rm Rn Rd; or Rm,Rn,Rd
2490 8.0xfb+8.0x1d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::or
2495 int srcreg1, srcreg2, dstreg;
2498 srcreg1 = translate_rreg (SD_, RM2);
2499 srcreg2 = translate_rreg (SD_, RN0);
2500 dstreg = translate_rreg (SD_, RD0);
2502 State.regs[dstreg] = State.regs[srcreg1] | State.regs[srcreg2];
2504 z = (State.regs[dstreg] == 0);
2505 n = (State.regs[dstreg] & 0x80000000);
2507 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2508 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2511 // 1111 1011 0010 1101 Rm Rn Rd; xor Rm,Rn,Rd
2512 8.0xfb+8.0x2d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::xor
2517 int srcreg1, srcreg2, dstreg;
2520 srcreg1 = translate_rreg (SD_, RM2);
2521 srcreg2 = translate_rreg (SD_, RN0);
2522 dstreg = translate_rreg (SD_, RD0);
2524 State.regs[dstreg] = State.regs[srcreg1] ^ State.regs[srcreg2];
2526 z = (State.regs[dstreg] == 0);
2527 n = (State.regs[dstreg] & 0x80000000);
2529 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2530 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2533 // 1111 1011 0100 1101 Rm Rn Rd; asr Rm,Rn,Rd
2534 8.0xfb+8.0x4d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asr
2540 int srcreg1, srcreg2, dstreg;
2543 srcreg1 = translate_rreg (SD_, RM2);
2544 srcreg2 = translate_rreg (SD_, RN0);
2545 dstreg = translate_rreg (SD_, RD0);
2547 temp = State.regs[srcreg2];
2549 temp >>= State.regs[srcreg1];
2550 State.regs[dstreg] = temp;
2552 z = (State.regs[dstreg] == 0);
2553 n = (State.regs[dstreg] & 0x80000000);
2555 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2556 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2559 // 1111 1011 0101 1101 Rm Rn Rd; lsr Rm,Rn,Rd
2560 8.0xfb+8.0x5d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::lsr
2565 int srcreg1, srcreg2, dstreg;
2568 srcreg1 = translate_rreg (SD_, RM2);
2569 srcreg2 = translate_rreg (SD_, RN0);
2570 dstreg = translate_rreg (SD_, RD0);
2572 c = State.regs[srcreg2] & 1;
2573 State.regs[dstreg] = State.regs[srcreg2] >> State.regs[srcreg1];
2575 z = (State.regs[dstreg] == 0);
2576 n = (State.regs[dstreg] & 0x80000000);
2578 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2579 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2582 // 1111 1011 0110 1101 Rm Rn Rd; asl Rm,Rn,Rd
2583 8.0xfb+8.0x6d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asl
2588 int srcreg1, srcreg2, dstreg;
2591 srcreg1 = translate_rreg (SD_, RM2);
2592 srcreg2 = translate_rreg (SD_, RN0);
2593 dstreg = translate_rreg (SD_, RD0);
2595 State.regs[dstreg] = State.regs[srcreg2] << State.regs[srcreg1];;
2597 z = (State.regs[dstreg] == 0);
2598 n = (State.regs[dstreg] & 0x80000000);
2600 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2601 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2604 // 1111 1011 1010 1101 Rm Rn Rd1 Rd2; mul Rm,Rn,Rd1,Rd2
2605 8.0xfb+8.0xad+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mul
2609 int srcreg1, srcreg2, dstreg1, dstreg2;
2610 signed long long temp;
2614 srcreg1 = translate_rreg (SD_, RM2);
2615 srcreg2 = translate_rreg (SD_, RN0);
2616 dstreg1 = translate_rreg (SD_, RD0);
2617 dstreg2 = translate_rreg (SD_, RD2);
2619 temp = ((signed64)(signed32)State.regs[srcreg1]
2620 * (signed64)(signed32)State.regs[srcreg2]);
2621 State.regs[dstreg1] = temp & 0xffffffff;
2622 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
2624 z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
2625 n = (State.regs[dstreg2] & 0x80000000);
2627 PSW &= ~(PSW_Z | PSW_N);
2628 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2631 // 1111 1011 1011 1101 Rm Rn Rd1 Rd2; mulu Rm,Rn,Rd1,Rd2
2632 8.0xfb+8.0xbd+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mulu
2636 int srcreg1, srcreg2, dstreg1, dstreg2;
2637 signed long long temp;
2641 srcreg1 = translate_rreg (SD_, RM2);
2642 srcreg2 = translate_rreg (SD_, RN0);
2643 dstreg1 = translate_rreg (SD_, RD0);
2644 dstreg2 = translate_rreg (SD_, RD2);
2646 temp = ((unsigned64)State.regs[srcreg1]
2647 * (unsigned64)State.regs[srcreg2]);
2648 State.regs[dstreg1] = temp & 0xffffffff;
2649 State.regs[dstreg2] = (temp & 0xffffffff00000000LL) >> 32;;
2651 z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
2652 n = (State.regs[dstreg2] & 0x80000000);
2654 PSW &= ~(PSW_Z | PSW_N);
2655 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
2658 // 1111 1011 0000 1110 Rn 0000 abs8 ; mov (abs8),Rn
2659 8.0xfb+8.0x0e+4.RN2,4.0x0+8.IMM8:D2p:::mov
2666 dstreg = translate_rreg (SD_, RN2);
2667 State.regs[dstreg] = load_word (IMM8);
2670 // 1111 1011 0001 1110 Rm 0000 abs8 ; mov Rn,(abs8)
2671 8.0xfb+8.0x1e+4.RM2,4.0x0+8.IMM8:D2q:::mov
2678 srcreg = translate_rreg (SD_, RM2);
2679 store_word (IMM8, State.regs[srcreg]);
2682 // 1111 1011 0010 1110 Rn 0000 abs8 ; movbu (abs8),Rn
2683 8.0xfb+8.0x2e+4.RN2,4.0x0+8.IMM8:D2p:::movbu
2690 dstreg = translate_rreg (SD_, RN2);
2691 State.regs[dstreg] = load_byte (IMM8);
2694 // 1111 1011 0011 1110 Rm 0000 abs8 ; movbu Rn,(abs8)
2695 8.0xfb+8.0x3e+4.RM2,4.0x0+8.IMM8:D2q:::movbu
2702 srcreg = translate_rreg (SD_, RM2);
2703 store_byte (IMM8, State.regs[srcreg]);
2706 // 1111 1011 0100 1110 Rn 0000 abs8 ; movhu (abs8),Rn
2707 8.0xfb+8.0x4e+4.RN2,4.0x0+8.IMM8:D2p:::movhu
2714 dstreg = translate_rreg (SD_, RN2);
2715 State.regs[dstreg] = load_half (IMM8);
2718 // 1111 1011 0101 1110 Rm 0000 abs8 ; movhu Rn,(abs8)
2719 8.0xfb+8.0x5e+4.RM2,4.0x0+8.IMM8:D2q:::movhu
2726 srcreg = translate_rreg (SD_, RM2);
2727 store_half (IMM8, State.regs[srcreg]);
2730 // 1111 1011 1000 1110 Ri Rm Rn; mov (Ri,Rm),Rn
2731 8.0xfb+8.0x8e+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::mov
2735 int srcreg1, srcreg2, dstreg;
2738 srcreg1 = translate_rreg (SD_, RM0);
2739 srcreg1 = translate_rreg (SD_, RI0);
2740 dstreg = translate_rreg (SD_, RN0);
2741 State.regs[dstreg] = load_word (State.regs[srcreg1] + State.regs[srcreg2]);
2744 // 1111 1011 1001 1110 Ri Rm Rn; mov Rn,(Ri,Rm)
2745 8.0xfb+8.0x9e+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::mov
2749 int srcreg, dstreg1, dstreg2;
2752 srcreg = translate_rreg (SD_, RM0);
2753 dstreg1 = translate_rreg (SD_, RI0);
2754 dstreg2 = translate_rreg (SD_, RN0);
2755 store_word (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2758 // 1111 1011 1010 1110 Ri Rm Rn; movbu (Ri,Rm),Rn
2759 8.0xfb+8.0xae+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movbu
2763 int srcreg1, srcreg2, dstreg;
2766 srcreg1 = translate_rreg (SD_, RM0);
2767 srcreg1 = translate_rreg (SD_, RI0);
2768 dstreg = translate_rreg (SD_, RN0);
2769 State.regs[dstreg] = load_byte (State.regs[srcreg1] + State.regs[srcreg2]);
2772 // 1111 1011 1011 1110 Ri Rm Rn; movbu Rn,(Ri,Rm)
2773 8.0xfb+8.0xbe+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movbu
2777 int srcreg, dstreg1, dstreg2;
2780 srcreg = translate_rreg (SD_, RM0);
2781 dstreg1 = translate_rreg (SD_, RI0);
2782 dstreg2 = translate_rreg (SD_, RN0);
2783 store_byte (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2786 // 1111 1011 1100 1110 Ri Rm Rn; movhu (Ri,Rm),Rn
2787 8.0xfb+8.0xce+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movhu
2791 int srcreg1, srcreg2, dstreg;
2794 srcreg1 = translate_rreg (SD_, RM0);
2795 srcreg1 = translate_rreg (SD_, RI0);
2796 dstreg = translate_rreg (SD_, RN0);
2797 State.regs[dstreg] = load_half (State.regs[srcreg1] + State.regs[srcreg2]);
2800 // 1111 1011 1101 1110 Ri Rm Rn; movhu Rn,(Ri,Rm)
2801 8.0xfb+8.0xde+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movhu
2805 int srcreg, dstreg1, dstreg2;
2808 srcreg = translate_rreg (SD_, RM0);
2809 dstreg1 = translate_rreg (SD_, RI0);
2810 dstreg2 = translate_rreg (SD_, RN0);
2811 store_half (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
2814 // 1111 1011 0000 1111 Rm Rn Rd1 Rd2; mac Rm,Rn,Rd1,Rd2
2815 8.0xfb+8.0x0f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::mac
2819 int srcreg1, srcreg2, dstreg1, dstreg2;
2820 signed long long temp;
2825 srcreg1 = translate_rreg (SD_, RM2);
2826 srcreg2 = translate_rreg (SD_, RN0);
2827 dstreg1 = translate_rreg (SD_, RD0);
2828 dstreg2 = translate_rreg (SD_, RD2);
2830 temp = ((signed64)(signed32)State.regs[srcreg1]
2831 * (signed64)(signed32)State.regs[srcreg2]);
2833 sum = State.regs[dstreg2] + (temp & 0xffffffff);
2834 c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
2835 State.regs[dstreg2] = sum;
2838 sum = State.regs[dstreg1] + temp + c;
2839 v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
2840 && (temp & 0x80000000) != (sum & 0x80000000));
2841 State.regs[dstreg1] = sum;
2844 State.regs[REG_MCVF] = 1;
2846 PSW |= (( v ? PSW_V : 0));
2850 // 1111 1011 0001 1111 Rm Rn Rd1 Rd2; macu Rm,Rn,Rd1,Rd2
2851 8.0xfb+8.0x1f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::macu
2855 int srcreg1, srcreg2, dstreg1, dstreg2;
2856 signed long long temp;
2861 srcreg1 = translate_rreg (SD_, RM2);
2862 srcreg2 = translate_rreg (SD_, RN0);
2863 dstreg1 = translate_rreg (SD_, RD0);
2864 dstreg2 = translate_rreg (SD_, RD2);
2866 temp = ((unsigned64)State.regs[srcreg1]
2867 * (unsigned64)State.regs[srcreg2]);
2869 sum = State.regs[dstreg2] + (temp & 0xffffffff);
2870 c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
2871 State.regs[dstreg2] = sum;
2874 sum = State.regs[dstreg1] + temp + c;
2875 v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
2876 && (temp & 0x80000000) != (sum & 0x80000000));
2877 State.regs[dstreg1] = sum;
2880 State.regs[REG_MCVF] = 1;
2882 PSW |= (( v ? PSW_V : 0));
2886 // 1111 1011 0010 1111 Rm Rn Rd1; macb Rm,Rn,Rd1
2887 8.0xfb+8.0x2f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macb
2891 int srcreg1, srcreg2, dstreg;
2896 srcreg1 = translate_rreg (SD_, RM2);
2897 srcreg2 = translate_rreg (SD_, RN0);
2898 dstreg = translate_rreg (SD_, RD0);
2900 temp = ((signed32)(State.regs[srcreg2] & 0xff)
2901 * (signed32)(State.regs[srcreg1] & 0xff));
2902 sum = State.regs[dstreg] + temp;
2903 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2904 && (temp & 0x80000000) != (sum & 0x80000000));
2905 State.regs[dstreg] = sum;
2908 State.regs[REG_MCVF] = 1;
2910 PSW |= ((v ? PSW_V : 0));
2914 // 1111 1011 0011 1111 Rm Rn Rd1; macbu Rm,Rn,Rd1
2915 8.0xfb+8.0x3f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macbu
2919 int srcreg1, srcreg2, dstreg;
2924 srcreg1 = translate_rreg (SD_, RM2);
2925 srcreg2 = translate_rreg (SD_, RN0);
2926 dstreg = translate_rreg (SD_, RD0);
2928 temp = ((unsigned32)(State.regs[srcreg2] & 0xff)
2929 * (unsigned32)(State.regs[srcreg1] & 0xff));
2930 sum = State.regs[dstreg] + temp;
2931 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2932 && (temp & 0x80000000) != (sum & 0x80000000));
2933 State.regs[dstreg] = sum;
2936 State.regs[REG_MCVF] = 1;
2938 PSW |= ((v ? PSW_V : 0));
2942 // 1111 1011 0100 1111 Rm Rn Rd1; mach Rm,Rn,Rd1
2943 8.0xfb+8.0x4f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::mach
2947 int srcreg1, srcreg2, dstreg;
2952 srcreg1 = translate_rreg (SD_, RM2);
2953 srcreg2 = translate_rreg (SD_, RN0);
2954 dstreg = translate_rreg (SD_, RD0);
2956 temp = ((signed32)(State.regs[srcreg2] & 0xffff)
2957 * (signed32)(State.regs[srcreg1] & 0xffff));
2958 sum = State.regs[dstreg] + temp;
2959 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2960 && (temp & 0x80000000) != (sum & 0x80000000));
2961 State.regs[dstreg] = sum;
2964 State.regs[REG_MCVF] = 1;
2966 PSW |= ((v ? PSW_V : 0));
2970 // 1111 1011 0101 1111 Rm Rn Rd1; machu Rm,Rn,Rd1
2971 8.0xfb+8.0x5f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::machu
2975 int srcreg1, srcreg2, dstreg;
2980 srcreg1 = translate_rreg (SD_, RM2);
2981 srcreg2 = translate_rreg (SD_, RN0);
2982 dstreg = translate_rreg (SD_, RD0);
2984 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
2985 * (unsigned32)(State.regs[srcreg1] & 0xffff));
2986 sum = State.regs[dstreg] + temp;
2987 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
2988 && (temp & 0x80000000) != (sum & 0x80000000));
2989 State.regs[dstreg] = sum;
2992 State.regs[REG_MCVF] = 1;
2994 PSW |= ((v ? PSW_V : 0));
2998 // 1111 1011 0110 1111 Rm Rn Rd1; dmach Rm,Rn,Rd1
2999 8.0xfb+8.0x6f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmach
3003 int srcreg1, srcreg2, dstreg;
3004 long temp, temp2, sum;
3008 srcreg1 = translate_rreg (SD_, RM2);
3009 srcreg2 = translate_rreg (SD_, RN0);
3010 dstreg = translate_rreg (SD_, RD0);
3012 temp = ((signed32)(State.regs[srcreg2] & 0xffff)
3013 * (signed32)(State.regs[srcreg1] & 0xffff));
3014 temp2 = ((signed32)((State.regs[srcreg1] >> 16) & 0xffff)
3015 * (signed32)((State.regs[srcreg2] >> 16) & 0xffff));
3016 sum = temp + temp2 + State.regs[dstreg];
3017 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
3018 && (temp & 0x80000000) != (sum & 0x80000000));
3019 State.regs[dstreg] = sum;
3022 State.regs[REG_MCVF] = 1;
3024 PSW |= ((v ? PSW_V : 0));
3028 // 1111 1011 0111 1111 Rm Rn Rd1; dmachu Rm,Rn,Rd1
3029 8.0xfb+8.0x7f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmachu
3033 int srcreg1, srcreg2, dstreg;
3034 long temp, temp2, sum;
3038 srcreg1 = translate_rreg (SD_, RM2);
3039 srcreg2 = translate_rreg (SD_, RN0);
3040 dstreg = translate_rreg (SD_, RD0);
3042 temp = ((unsigned32)(State.regs[srcreg2] & 0xffff)
3043 * (unsigned32)(State.regs[srcreg1] & 0xffff));
3044 temp2 = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
3045 * (unsigned32)((State.regs[srcreg2] >> 16) & 0xffff));
3046 sum = temp + temp2 + State.regs[dstreg];
3047 v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
3048 && (temp & 0x80000000) != (sum & 0x80000000));
3049 State.regs[dstreg] = sum;
3052 State.regs[REG_MCVF] = 1;
3054 PSW |= ((v ? PSW_V : 0));
3058 // 1111 1011 1000 1111 Rm Rn Rd1 Rd2; dmulh Rm,Rn,Rd1,Rd2
3059 8.0xfb+8.0x8f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::dmulh
3063 int srcreg1, srcreg2, dstreg1, dstreg2;
3064 signed long long temp;
3067 srcreg1 = translate_rreg (SD_, RM2);
3068 srcreg2 = translate_rreg (SD_, RN0);
3069 dstreg1 = translate_rreg (SD_, RD0);
3070 dstreg2 = translate_rreg (SD_, RD2);
3072 temp = ((signed32)(State.regs[srcreg1] & 0xffff)
3073 * (signed32)(State.regs[srcreg1] & 0xffff));
3074 State.regs[dstreg2] = temp;
3075 temp = ((signed32)((State.regs[srcreg1] >> 16) & 0xffff)
3076 * (signed32)((State.regs[srcreg1] >>16) & 0xffff));
3077 State.regs[dstreg1] = temp;
3080 // 1111 1011 1001 1111 Rm Rn Rd1 Rd2; dmulhu Rm,Rn,Rd1,Rd2
3081 8.0xfb+8.0x9f+4.RM2,4.RN0+4.RD0,4.RD2:D2c:::dmulhu
3085 int srcreg1, srcreg2, dstreg1, dstreg2;
3086 signed long long temp;
3089 srcreg1 = translate_rreg (SD_, RM2);
3090 srcreg2 = translate_rreg (SD_, RN0);
3091 dstreg1 = translate_rreg (SD_, RD0);
3092 dstreg2 = translate_rreg (SD_, RD2);
3094 temp = ((unsigned32)(State.regs[srcreg1] & 0xffff)
3095 * (unsigned32)(State.regs[srcreg1] & 0xffff));
3096 State.regs[dstreg2] = temp;
3097 temp = ((unsigned32)((State.regs[srcreg1] >> 16) & 0xffff)
3098 * (unsigned32)((State.regs[srcreg1] >>16) & 0xffff));
3099 State.regs[dstreg1] = temp;
3102 // 1111 1011 1010 1111 Rm Rn; sat24 Rm,Rn
3103 8.0xfb+8.0xaf+4.RM2,4.RN0+8.0x0:D2:::sat24
3111 srcreg = translate_rreg (SD_, RM2);
3112 dstreg = translate_rreg (SD_, RN0);
3114 value = State.regs[srcreg];
3116 if (value >= 0x7fffff)
3117 State.regs[dstreg] = 0x7fffff;
3118 else if (value <= 0xff800000)
3119 State.regs[dstreg] = 0xff800000;
3121 State.regs[dstreg] = value;
3123 n = (State.regs[dstreg] & 0x800000) != 0;
3124 z = (State.regs[dstreg] == 0);
3125 PSW &= ~(PSW_Z | PSW_N);
3126 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3129 // 1111 1011 1111 1111 Rm Rn Rd1; bsch Rm,Rn,Rd1
3130 8.0xfb+8.0xff+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::bsch
3135 int srcreg1, srcreg2, dstreg;
3139 srcreg1 = translate_rreg (SD_, RM2);
3140 srcreg2 = translate_rreg (SD_, RN0);
3141 dstreg = translate_rreg (SD_, RD0);
3143 temp = State.regs[srcreg1];
3144 start = (State.regs[srcreg2] & 0x1f) - 1;
3148 for (i = start; i >= 0; i--)
3150 if (temp & (1 << i))
3153 State.regs[dstreg] = i;
3161 State.regs[dstreg] = 0;
3164 PSW |= (c ? PSW_C : 0);
3167 // 1111 1101 0000 1000 Rn Rn IMM32; mov imm24,Rn
3168 8.0xfd+8.0x08+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::mov
3175 dstreg = translate_rreg (SD_, RN0);
3176 State.regs[dstreg] = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3179 // 1111 1101 0001 1000 Rn Rn IMM32; movu imm24,Rn
3180 8.0xfd+8.0x18+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4k:::movu
3187 dstreg = translate_rreg (SD_, RN0);
3188 State.regs[dstreg] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
3191 // 1111 1101 0111 1000 Rn Rn IMM32; add imm24,Rn
3192 8.0xfd+8.0x78+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4c:::add
3199 dstreg = translate_rreg (SD_, RN0);
3200 genericAdd (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
3203 // 1111 1101 1000 1000 Rn Rn IMM32; addc imm24,Rn
3204 8.0xfd+8.0x88+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::addc
3208 int dstreg, z, n, c, v;
3209 unsigned long sum, imm, reg2;
3212 dstreg = translate_rreg (SD_, RN0);
3214 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3215 reg2 = State.regs[dstreg];
3216 sum = imm + reg2 + ((PSW & PSW_C) != 0);
3217 State.regs[dstreg] = sum;
3219 z = ((PSW & PSW_Z) != 0) && (sum == 0);
3220 n = (sum & 0x80000000);
3221 c = (sum < imm) || (sum < reg2);
3222 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3223 && (reg2 & 0x80000000) != (sum & 0x80000000));
3225 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3226 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3227 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3230 // 1111 1101 1001 1000 Rn Rn IMM32; sub imm24,Rn
3231 8.0xfd+8.0x98+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::sub
3238 dstreg = translate_rreg (SD_, RN0);
3239 genericSub (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
3242 // 1111 1101 1010 1000 Rn Rn IMM32; subc imm24,Rn
3243 8.0xfd+8.0xa8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::subc
3247 int dstreg, z, n, c, v;
3248 unsigned long difference, imm, reg2;
3251 dstreg = translate_rreg (SD_, RN0);
3253 imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3254 reg2 = State.regs[dstreg];
3255 difference = reg2 - imm - ((PSW & PSW_C) != 0);
3256 State.regs[dstreg] = difference;
3258 z = ((PSW & PSW_Z) != 0) && (difference == 0);
3259 n = (difference & 0x80000000);
3261 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3262 && (reg2 & 0x80000000) != (difference & 0x80000000));
3264 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3265 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3266 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3269 // 1111 1101 1101 1000 Rn Rn IMM32; cmp imm24,Rn
3270 8.0xfd+8.0xd8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::cmp
3277 srcreg = translate_rreg (SD_, RN0);
3278 genericCmp (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), State.regs[srcreg]);
3281 // 1111 1101 1111 1000 XRn XRn IMM32; mov imm24,XRn
3282 8.0xfd+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM24A+8.IMM24B+8.IMM24C:D4o:::mov
3289 dstreg = translate_xreg (SD_, XRN0);
3291 State.regs[dstreg] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
3294 // 1111 1101 0000 1001 Rn Rn IMM24; and imm24,Rn
3295 8.0xfd+8.0x09+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::and
3303 dstreg = translate_rreg (SD_, RN0);
3305 State.regs[dstreg] &= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3306 z = (State.regs[dstreg] == 0);
3307 n = (State.regs[dstreg] & 0x80000000) != 0;
3308 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3309 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3312 // 1111 1101 0001 1001 Rn Rn IMM24; or imm24,Rn
3313 8.0xfd+8.0x19+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::or
3321 dstreg = translate_rreg (SD_, RN0);
3323 State.regs[dstreg] |= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3324 z = (State.regs[dstreg] == 0);
3325 n = (State.regs[dstreg] & 0x80000000) != 0;
3326 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3327 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3330 // 1111 1101 0010 1001 Rn Rn IMM24; xor imm24,Rn
3331 8.0xfd+8.0x29+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::xor
3339 dstreg = translate_rreg (SD_, RN0);
3341 State.regs[dstreg] ^= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
3342 z = (State.regs[dstreg] == 0);
3343 n = (State.regs[dstreg] & 0x80000000) != 0;
3344 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3345 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3348 // 1111 1101 0100 1001 Rn Rn IMM24; asr imm24,Rn
3349 8.0xfd+8.0x49+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asr
3358 dstreg = translate_rreg (SD_, RN0);
3360 temp = State.regs[dstreg];
3362 temp >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
3363 State.regs[dstreg] = temp;
3364 z = (State.regs[dstreg] == 0);
3365 n = (State.regs[dstreg] & 0x80000000) != 0;
3366 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3367 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
3371 // 1111 1101 0101 1001 Rn Rn IMM24; lsr imm24,Rn
3372 8.0xfd+8.0x59+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::lsr
3380 dstreg = translate_rreg (SD_, RN0);
3382 c = State.regs[dstreg] & 1;
3383 State.regs[dstreg] >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
3384 z = (State.regs[dstreg] == 0);
3385 n = (State.regs[dstreg] & 0x80000000) != 0;
3386 PSW &= ~(PSW_Z | PSW_N | PSW_C);
3387 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
3390 // 1111 1101 0110 1001 Rn Rn IMM24; asl imm24,Rn
3391 8.0xfd+8.0x69+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asl
3399 dstreg = translate_rreg (SD_, RN0);
3401 State.regs[dstreg] <<= (FETCH24 (IMM24A, IMM24B, IMM24C));
3402 z = (State.regs[dstreg] == 0);
3403 n = (State.regs[dstreg] & 0x80000000) != 0;
3404 PSW &= ~(PSW_Z | PSW_N);
3405 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3408 // 1111 1101 1010 1001 Rn Rn IMM24; mul imm24,Rn
3409 8.0xfd+8.0xa9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mul
3414 unsigned long long temp;
3418 dstreg = translate_rreg (SD_, RN0);
3420 temp = ((signed64)(signed32)State.regs[dstreg]
3421 * (signed64)(signed32)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
3422 State.regs[dstreg] = temp & 0xffffffff;
3423 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
3424 z = (State.regs[dstreg] == 0);
3425 n = (State.regs[dstreg] & 0x80000000) != 0;
3426 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3427 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3430 // 1111 1101 1011 1001 Rn Rn IMM24; mulu imm24,Rn
3431 8.0xfd+8.0xb9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mulu
3436 unsigned long long temp;
3440 dstreg = translate_rreg (SD_, RN0);
3442 temp = ((unsigned64)State.regs[dstreg]
3443 * (unsigned64)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
3444 State.regs[dstreg] = temp & 0xffffffff;
3445 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
3446 z = (State.regs[dstreg] == 0);
3447 n = (State.regs[dstreg] & 0x80000000) != 0;
3448 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3449 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
3452 // 1111 1101 1110 1001 Rn Rn IMM24; btst imm24,,Rn
3453 8.0xfd+8.0xe9+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::btst
3460 srcreg = translate_rreg (SD_, RN0);
3461 genericBtst (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3464 // 1111 1101 0000 1010 Rn Rm IMM24; mov (d24,Rm),Rn
3465 8.0xfd+8.0x0a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::mov
3472 srcreg = translate_rreg (SD_, RM0);
3473 dstreg = translate_rreg (SD_, RN2);
3474 State.regs[dstreg] = load_word (State.regs[srcreg]
3475 + EXTEND24 (FETCH24 (IMM24A,
3479 // 1111 1101 0001 1010 Rm Rn IMM24; mov Rm,(d24,Rn)
3480 8.0xfd+8.0x1a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::mov
3487 srcreg = translate_rreg (SD_, RM2);
3488 dstreg = translate_rreg (SD_, RN0);
3489 store_word (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3490 State.regs[srcreg]);
3493 // 1111 1101 0010 1010 Rn Rm IMM24; movbu (d24,Rm),Rn
3494 8.0xfd+8.0x2a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movbu
3501 srcreg = translate_rreg (SD_, RM0);
3502 dstreg = translate_rreg (SD_, RN2);
3503 State.regs[dstreg] = load_byte (State.regs[srcreg]
3504 + EXTEND24 (FETCH24 (IMM24A,
3508 // 1111 1101 0011 1010 Rm Rn IMM24; movbu Rm,(d24,Rn)
3509 8.0xfd+8.0x3a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movbu
3516 srcreg = translate_rreg (SD_, RM2);
3517 dstreg = translate_rreg (SD_, RN0);
3518 store_byte (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3519 State.regs[srcreg]);
3522 // 1111 1101 0100 1010 Rn Rm IMM24; movhu (d24,Rm),Rn
3523 8.0xfd+8.0x4a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movhu
3530 srcreg = translate_rreg (SD_, RM0);
3531 dstreg = translate_rreg (SD_, RN2);
3532 State.regs[dstreg] = load_half (State.regs[srcreg]
3533 + EXTEND24 (FETCH24 (IMM24A,
3537 // 1111 1101 0101 1010 Rm Rn IMM24; movhu Rm,(d24,Rn)
3538 8.0xfd+8.0x5a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movhu
3545 srcreg = translate_rreg (SD_, RM2);
3546 dstreg = translate_rreg (SD_, RN0);
3547 store_half (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3548 State.regs[srcreg]);
3551 // 1111 1101 0110 1010 Rn Rm IMM24; mov (d24,Rm+),Rn
3552 8.0xfd+8.0x6a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::mov
3559 srcreg = translate_rreg (SD_, RM0);
3560 dstreg = translate_rreg (SD_, RN2);
3561 State.regs[dstreg] = load_word (State.regs[srcreg]);
3562 State.regs[srcreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3565 // 1111 1101 0111 1010 Rm Rn IMM24; mov Rm,(d24,Rn+)
3566 8.0xfd+8.0x7a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mov
3573 srcreg = translate_rreg (SD_, RM2);
3574 dstreg = translate_rreg (SD_, RN0);
3575 store_word (State.regs[dstreg], State.regs[srcreg]);
3576 State.regs[dstreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3580 // 1111 1101 1000 1010 Rn 0000 IMM24; mov (d24,sp),Rn
3581 8.0xfd+8.0x8a+4.RN2,4.0x0+IMM24A+8.IMM24B+8.IMM24C:D4r:::mov
3588 dstreg = translate_rreg (SD_, RN2);
3589 State.regs[dstreg] = load_word (State.regs[REG_SP]
3590 + EXTEND24 (FETCH24 (IMM24A,
3594 // 1111 1101 1001 1010 Rm 0000 IMM24; mov Rm,(d24,sp)
3595 8.0xfd+8.0x9a+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::mov
3602 srcreg = translate_rreg (SD_, RM2);
3603 store_word (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3604 State.regs[srcreg]);
3607 // 1111 1101 1010 1010 Rn 0000 IMM24; movbu (d24,Rm),Rn
3608 8.0xfd+8.0xaa+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movbu
3615 dstreg = translate_rreg (SD_, RN2);
3616 State.regs[dstreg] = load_byte (State.regs[REG_SP]
3617 + EXTEND24 (FETCH24 (IMM24A,
3621 // 1111 1101 1011 1010 Rm 0000 IMM24; movbu Rm,(d24,sp)
3622 8.0xfd+8.0xba+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movbu
3629 srcreg = translate_rreg (SD_, RM2);
3630 store_byte (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3631 State.regs[srcreg]);
3634 // 1111 1101 1100 1010 Rn 0000 IMM24; movhu (d24,sp),Rn
3635 8.0xfd+8.0xca+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movhu
3642 dstreg = translate_rreg (SD_, RN2);
3643 State.regs[dstreg] = load_half (State.regs[REG_SP]
3644 + EXTEND24 (FETCH24 (IMM24A,
3648 // 1111 1101 1101 1010 Rm Rn IMM24; movhu Rm,(d24,sp)
3649 8.0xfd+8.0xda+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movhu
3656 srcreg = translate_rreg (SD_, RM2);
3657 store_half (State.regs[REG_SP] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
3658 State.regs[srcreg]);
3661 // 1111 1101 1110 1010 Rn Rm IMM24; movhu (d24,Rm+),Rn
3662 8.0xfd+8.0xea+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::movhu
3669 srcreg = translate_rreg (SD_, RM0);
3670 dstreg = translate_rreg (SD_, RN2);
3671 State.regs[dstreg] = load_half (State.regs[srcreg]);
3672 State.regs[dstreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3675 // 1111 1101 1111 1010 Rm Rn IMM24; movhu Rm,(d24,Rn+)
3676 8.0xfd+8.0xfa+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::movhu
3683 srcreg = translate_rreg (SD_, RM2);
3684 dstreg = translate_rreg (SD_, RN0);
3685 store_half (State.regs[dstreg], State.regs[srcreg]);
3686 State.regs[srcreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
3689 // 1111 1101 0000 1011 Rn IMM24; mac imm24,Rn
3690 8.0xfd+8.0x0b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mac
3695 long long temp, sum;
3699 srcreg = translate_rreg (SD_, RN2);
3701 temp = ((signed64)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C))
3702 * (signed64)State.regs[srcreg]);
3703 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3704 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3705 State.regs[REG_MCRL] = sum;
3708 sum = State.regs[REG_MCRH] + temp + c;
3709 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3710 && (temp & 0x80000000) != (sum & 0x80000000));
3711 State.regs[REG_MCRH] = sum;
3713 State.regs[REG_MCVF] = 1;
3716 // 1111 1101 0001 1011 Rn IMM24; macu imm24,Rn
3717 8.0xfd+8.0x1b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macu
3722 long long temp, sum;
3726 srcreg = translate_rreg (SD_, RN2);
3728 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C))
3729 * (unsigned64)State.regs[srcreg]);
3730 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3731 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3732 State.regs[REG_MCRL] = sum;
3735 sum = State.regs[REG_MCRH] + temp + c;
3736 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3737 && (temp & 0x80000000) != (sum & 0x80000000));
3738 State.regs[REG_MCRH] = sum;
3740 State.regs[REG_MCVF] = 1;
3743 // 1111 1101 0010 1011 Rn IMM24; macb imm24,Rn
3744 8.0xfd+8.0x2b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macb
3749 long long temp, sum;
3753 srcreg = translate_rreg (SD_, RN2);
3755 temp = ((signed64)EXTEND8 (FETCH24 (IMM24A, IMM24B, IMM24C))
3756 * (signed64)State.regs[srcreg] & 0xff);
3757 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3758 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3759 State.regs[REG_MCRL] = sum;
3762 sum = State.regs[REG_MCRH] + temp + c;
3763 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3764 && (temp & 0x80000000) != (sum & 0x80000000));
3765 State.regs[REG_MCRH] = sum;
3767 State.regs[REG_MCVF] = 1;
3770 // 1111 1101 0011 1011 Rn IMM24; macbu imm24,Rn
3771 8.0xfd+8.0x3b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macbu
3776 long long temp, sum;
3780 srcreg = translate_rreg (SD_, RN2);
3782 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C))
3783 * (unsigned64)State.regs[srcreg] & 0xff);
3784 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3785 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3786 State.regs[REG_MCRL] = sum;
3789 sum = State.regs[REG_MCRH] + temp + c;
3790 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3791 && (temp & 0x80000000) != (sum & 0x80000000));
3792 State.regs[REG_MCRH] = sum;
3794 State.regs[REG_MCVF] = 1;
3797 // 1111 1101 0100 1011 Rn IMM24; mach imm24,Rn
3798 8.0xfd+8.0x4b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mach
3803 long long temp, sum;
3807 srcreg = translate_rreg (SD_, RN2);
3809 temp = ((signed64)EXTEND16 (FETCH24 (IMM24A, IMM24B, IMM24C))
3810 * (signed64)State.regs[srcreg] & 0xffff);
3811 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3812 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3813 State.regs[REG_MCRL] = sum;
3816 sum = State.regs[REG_MCRH] + temp + c;
3817 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3818 && (temp & 0x80000000) != (sum & 0x80000000));
3819 State.regs[REG_MCRH] = sum;
3821 State.regs[REG_MCVF] = 1;
3824 // 1111 1101 0101 1011 Rn IMM24; machu imm24,Rn
3825 8.0xfd+8.0x5b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::machu
3830 long long temp, sum;
3834 srcreg = translate_rreg (SD_, RN2);
3836 temp = ((unsigned64) (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffff)
3837 * (unsigned64)State.regs[srcreg] & 0xffff);
3838 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
3839 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
3840 State.regs[REG_MCRL] = sum;
3843 sum = State.regs[REG_MCRH] + temp + c;
3844 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
3845 && (temp & 0x80000000) != (sum & 0x80000000));
3846 State.regs[REG_MCRH] = sum;
3848 State.regs[REG_MCVF] = 1;
3851 // 1111 1101 0000 1110 Rn 0000 ABS24; mov (abs24),Rn
3852 8.0xfd+8.0x0e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::mov
3859 dstreg = translate_rreg (SD_, RN2);
3860 State.regs[dstreg] = load_word (FETCH24 (IMM24A, IMM24B, IMM24C));
3863 // 1111 1101 0001 1110 Rm 0000 ABS24; mov Rm,(abs24)
3864 8.0xfd+8.0x1e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4v:::mov
3871 srcreg = translate_rreg (SD_, RM2);
3872 store_word (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3876 // 1111 1101 0010 1110 Rn 0000 ABS24; movbu (abs24),Rn
3877 8.0xfd+8.0x2e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movbu
3884 dstreg = translate_rreg (SD_, RN2);
3885 State.regs[dstreg] = load_byte (FETCH24 (IMM24A, IMM24B, IMM24C));
3888 // 1111 1101 0011 1110 Rm 0000 ABS24; movbu Rm,(abs24)
3889 8.0xfd+8.0x3e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movbu
3896 srcreg = translate_rreg (SD_, RM2);
3897 store_byte (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3901 // 1111 1101 0100 1110 Rn 0000 ABS24; movhu (abs24),Rn
3902 8.0xfd+8.0x4e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movhu
3909 dstreg = translate_rreg (SD_, RN2);
3910 State.regs[dstreg] = load_half (FETCH24 (IMM24A, IMM24B, IMM24C));
3913 // 1111 1101 0101 1110 Rm 0000 ABS24; movhu Rm,(abs24)
3914 8.0xfd+8.0x5e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movhu
3921 srcreg = translate_rreg (SD_, RM2);
3922 store_half (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
3926 // 1111 1110 0000 1000 Rn Rn IMM32; mov imm32,Rn
3927 8.0xfe+8.0x08+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mov
3934 dstreg = translate_rreg (SD_, RN0);
3935 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
3938 // 1111 1110 0001 1000 Rn Rn IMM32; movu imm32,Rn
3939 8.0xfe+8.0x18+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movu
3946 dstreg = translate_rreg (SD_, RN0);
3947 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
3950 // 1111 1110 0111 1000 Rn Rn IMM32; add imm32,Rn
3951 8.0xfe+8.0x78+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::add
3958 dstreg = translate_rreg (SD_, RN0);
3959 genericAdd (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
3962 // 1111 1110 1000 1000 Rn Rn IMM32; addc imm32,Rn
3963 8.0xfe+8.0x88+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::addc
3968 unsigned int imm, reg2, sum;
3972 dstreg = translate_rreg (SD_, RN0);
3974 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
3975 reg2 = State.regs[dstreg];
3976 sum = imm + reg2 + ((PSW & PSW_C) != 0);
3977 State.regs[dstreg] = sum;
3979 z = ((PSW & PSW_Z) != 0) && (sum == 0);
3980 n = (sum & 0x80000000);
3981 c = (sum < imm) || (sum < reg2);
3982 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
3983 && (reg2 & 0x80000000) != (sum & 0x80000000));
3985 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
3986 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
3987 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
3990 // 1111 1110 1001 1000 Rn Rn IMM32; sub imm32,Rn
3991 8.0xfe+8.0x98+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::sub
3998 dstreg = translate_rreg (SD_, RN0);
3999 genericSub (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
4002 // 1111 1110 1010 1000 Rn Rn IMM32; subc imm32,Rn
4003 8.0xfe+8.0xa8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::subc
4008 unsigned int imm, reg2, difference;
4012 dstreg = translate_rreg (SD_, RN0);
4014 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4015 reg2 = State.regs[dstreg];
4016 difference = reg2 - imm - ((PSW & PSW_C) != 0);
4017 State.regs[dstreg] = difference;
4019 z = ((PSW & PSW_Z) != 0) && (difference == 0);
4020 n = (difference & 0x80000000);
4022 v = ((reg2 & 0x80000000) == (imm & 0x80000000)
4023 && (reg2 & 0x80000000) != (difference & 0x80000000));
4025 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4026 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
4027 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
4030 // 1111 1110 0111 1000 Rn Rn IMM32; cmp imm32,Rn
4031 8.0xfe+8.0xd8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::cmp
4038 srcreg = translate_rreg (SD_, RN0);
4039 genericCmp (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4042 // 1111 1110 1111 1000 XRn XRn IMM32; mov imm32,XRn
4043 8.0xfe+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::mov
4050 dstreg = translate_xreg (SD_, XRN0);
4052 State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
4055 // 1111 1110 0000 1001 Rn Rn IMM32; and imm32,Rn
4056 8.0xfe+8.0x09+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::and
4064 dstreg = translate_rreg (SD_, RN0);
4066 State.regs[dstreg] &= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4067 z = (State.regs[dstreg] == 0);
4068 n = (State.regs[dstreg] & 0x80000000) != 0;
4069 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4070 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4073 // 1111 1110 0001 1001 Rn Rn IMM32; or imm32,Rn
4074 8.0xfe+8.0x19+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::or
4082 dstreg = translate_rreg (SD_, RN0);
4084 State.regs[dstreg] |= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4085 z = (State.regs[dstreg] == 0);
4086 n = (State.regs[dstreg] & 0x80000000) != 0;
4087 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4088 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4091 // 1111 1110 0010 1001 Rn Rn IMM32; xor imm32,Rn
4092 8.0xfe+8.0x29+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::xor
4100 dstreg = translate_rreg (SD_, RN0);
4102 State.regs[dstreg] ^= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4103 z = (State.regs[dstreg] == 0);
4104 n = (State.regs[dstreg] & 0x80000000) != 0;
4105 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4106 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4109 // 1111 1110 0100 1001 Rn Rn IMM32; asr imm32,Rn
4110 8.0xfe+8.0x49+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asr
4119 dstreg = translate_rreg (SD_, RN0);
4121 temp = State.regs[dstreg];
4123 temp >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4124 State.regs[dstreg] = temp;
4125 z = (State.regs[dstreg] == 0);
4126 n = (State.regs[dstreg] & 0x80000000) != 0;
4127 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4128 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4131 // 1111 1110 0101 1001 Rn Rn IMM32; lsr imm32,Rn
4132 8.0xfe+8.0x59+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::lsr
4140 dstreg = translate_rreg (SD_, RN0);
4142 c = State.regs[dstreg] & 1;
4143 State.regs[dstreg] >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4144 z = (State.regs[dstreg] == 0);
4145 n = (State.regs[dstreg] & 0x80000000) != 0;
4146 PSW &= ~(PSW_Z | PSW_N | PSW_C);
4147 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
4150 // 1111 1110 0110 1001 Rn Rn IMM32; asl imm32,Rn
4151 8.0xfe+8.0x69+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asl
4159 dstreg = translate_rreg (SD_, RN0);
4161 State.regs[dstreg] <<= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4162 z = (State.regs[dstreg] == 0);
4163 n = (State.regs[dstreg] & 0x80000000) != 0;
4164 PSW &= ~(PSW_Z | PSW_N);
4165 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4168 // 1111 1110 1010 1001 Rn Rn IMM32; mul imm32,Rn
4169 8.0xfe+8.0xa9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mul
4174 unsigned long long temp;
4178 dstreg = translate_rreg (SD_, RN0);
4180 temp = ((signed64)(signed32)State.regs[dstreg]
4181 * (signed64)(signed32)(FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
4182 State.regs[dstreg] = temp & 0xffffffff;
4183 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
4184 z = (State.regs[dstreg] == 0);
4185 n = (State.regs[dstreg] & 0x80000000) != 0;
4186 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4187 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4190 // 1111 1110 1011 1001 Rn Rn IMM32; mulu imm32,Rn
4191 8.0xfe+8.0xb9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mulu
4196 unsigned long long temp;
4200 dstreg = translate_rreg (SD_, RN0);
4202 temp = ((unsigned64)State.regs[dstreg]
4203 * (unsigned64) (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
4204 State.regs[dstreg] = temp & 0xffffffff;
4205 State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;;
4206 z = (State.regs[dstreg] == 0);
4207 n = (State.regs[dstreg] & 0x80000000) != 0;
4208 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
4209 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
4212 // 1111 1110 1110 1001 Rn Rn IMM32; btst imm32,Rn
4213 8.0xfe+8.0xe9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5a:::btst
4220 srcreg = translate_rreg (SD_, RN0);
4221 genericBtst (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4224 // 1111 1110 0000 1010 Rn Rm IMM32; mov (d32,Rm),Rn
4225 8.0xfe+8.0x0a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::mov
4232 srcreg = translate_rreg (SD_, RM0);
4233 dstreg = translate_rreg (SD_, RN2);
4234 State.regs[dstreg] = load_word (State.regs[srcreg]
4235 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4238 // 1111 1110 0001 1010 Rm Rn IMM32; mov Rm,(d32,Rn)
4239 8.0xfe+8.0x1a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5g:::mov
4246 srcreg = translate_rreg (SD_, RM2);
4247 dstreg = translate_rreg (SD_, RN0);
4248 store_word (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4249 State.regs[srcreg]);
4252 // 1111 1110 0010 1010 Rn Rm IMM32; movbu (d32,Rm),Rn
4253 8.0xfe+8.0x2a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movbu
4260 srcreg = translate_rreg (SD_, RM0);
4261 dstreg = translate_rreg (SD_, RN2);
4262 State.regs[dstreg] = load_byte (State.regs[srcreg]
4263 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4266 // 1111 1110 0011 1010 Rm Rn IMM32; movbu Rm,(d32,Rn)
4267 8.0xfe+8.0x3a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movbu
4274 srcreg = translate_rreg (SD_, RM2);
4275 dstreg = translate_rreg (SD_, RN0);
4276 store_byte (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4277 State.regs[srcreg]);
4280 // 1111 1110 0100 1010 Rn Rm IMM32; movhu (d32,Rm),Rn
4281 8.0xfe+8.0x4a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movhu
4288 srcreg = translate_rreg (SD_, RM0);
4289 dstreg = translate_rreg (SD_, RN2);
4290 State.regs[dstreg] = load_half (State.regs[srcreg]
4291 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4294 // 1111 1110 0101 1010 Rm Rn IMM32; movhu Rm,(d32,Rn)
4295 8.0xfe+8.0x5a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movhu
4302 srcreg = translate_rreg (SD_, RM2);
4303 dstreg = translate_rreg (SD_, RN0);
4304 store_half (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4305 State.regs[srcreg]);
4308 // 1111 1110 0110 1010 Rn Rm IMM32; mov (d32,Rm+),Rn
4309 8.0xfe+8.0x6a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::mov
4316 srcreg = translate_rreg (SD_, RM0);
4317 dstreg = translate_rreg (SD_, RN2);
4318 State.regs[dstreg] = load_word (State.regs[srcreg]);
4319 State.regs[srcreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
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], State.regs[srcreg]);
4333 State.regs[dstreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4337 // 1111 1110 1000 1010 Rn 0000 IMM32; mov (d32,sp),Rn
4338 8.0xfe+8.0x8a+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::mov
4345 dstreg = translate_rreg (SD_, RN2);
4346 State.regs[dstreg] = load_word (State.regs[REG_SP]
4347 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4350 // 1111 1110 1001 1010 Rm 0000 IMM32; mov Rm,(d32,sp)
4351 8.0xfe+8.0x9a+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::mov
4358 srcreg = translate_rreg (SD_, RM2);
4359 store_word (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4360 State.regs[srcreg]);
4363 // 1111 1110 1010 1010 Rn 0000 IMM32; movbu (d32,sp),Rn
4364 8.0xfe+8.0xaa+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movbu
4371 dstreg = translate_rreg (SD_, RN2);
4372 State.regs[dstreg] = load_byte (State.regs[REG_SP]
4373 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4376 // 1111 1110 1011 1010 Rm 0000 IMM32; movbu Rm,(d32,sp)
4377 8.0xfe+8.0xba+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movbu
4384 srcreg = translate_rreg (SD_, RM2);
4385 store_byte (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4386 State.regs[srcreg]);
4389 // 1111 1110 1100 1010 Rn 0000 IMM32; movhu (d32,sp),Rn
4390 8.0xfe+8.0xca+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movhu
4397 dstreg = translate_rreg (SD_, RN2);
4398 State.regs[dstreg] = load_half (State.regs[REG_SP]
4399 + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4402 // 1111 1110 1101 1010 Rm 0000 IMM32; movhu Rm,(d32,sp)
4403 8.0xfe+8.0xda+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movhu
4410 srcreg = translate_rreg (SD_, RM2);
4411 store_half (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
4412 State.regs[srcreg]);
4416 // 1111 1110 1110 1010 Rn Rm IMM32; movhu (d32,Rm+),Rn
4417 8.0xfe+8.0xea+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::movhu
4424 srcreg = translate_rreg (SD_, RM0);
4425 dstreg = translate_rreg (SD_, RN2);
4426 State.regs[dstreg] = load_half (State.regs[srcreg]);
4427 State.regs[srcreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4430 // 1111 1110 1111 1010 Rm Rn IMM32; movhu Rm,(d32,Rn+)
4431 8.0xfe+8.0xfa+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::movhu
4438 srcreg = translate_rreg (SD_, RM2);
4439 dstreg = translate_rreg (SD_, RN0);
4440 store_half (State.regs[dstreg], State.regs[srcreg]);
4441 State.regs[dstreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4445 // 1111 1110 0000 1011 Rn Rn IMM32; mac imm32,Rn
4446 8.0xfe+8.0x0b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mac
4451 long long temp, sum;
4455 srcreg = translate_rreg (SD_, RN0);
4456 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4458 temp = ((signed64)(signed32)State.regs[srcreg]
4459 * (signed64)(signed32)imm);
4460 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
4461 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
4462 State.regs[REG_MCRL] = sum;
4465 sum = State.regs[REG_MCRH] + temp + c;
4466 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
4467 && (temp & 0x80000000) != (sum & 0x80000000));
4468 State.regs[REG_MCRH] = sum;
4470 State.regs[REG_MCVF] = 1;
4473 // 1111 1110 0001 1011 Rn Rn IMM32; macu imm32,Rn
4474 8.0xfe+8.0x1b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macu
4479 long long temp, sum;
4483 srcreg = translate_rreg (SD_, RN0);
4484 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4486 temp = ((unsigned64)State.regs[srcreg]
4488 sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
4489 c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
4490 State.regs[REG_MCRL] = sum;
4493 sum = State.regs[REG_MCRH] + temp + c;
4494 v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
4495 && (temp & 0x80000000) != (sum & 0x80000000));
4496 State.regs[REG_MCRH] = sum;
4498 State.regs[REG_MCVF] = 1;
4501 // 1111 1110 0010 1011 Rn Rn IMM32; macb imm32,Rn
4502 8.0xfe+8.0x2b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macb
4511 srcreg = translate_rreg (SD_, RN0);
4512 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4514 temp = ((signed32)(signed8)(State.regs[srcreg] & 0xff)
4515 * (signed32)(signed8)(imm & 0xff));
4516 sum = State.regs[REG_MCRL] + temp;
4517 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4518 && (temp & 0x80000000) != (sum & 0x80000000));
4519 State.regs[REG_MCRL] = sum;
4521 State.regs[REG_MCVF] = 1;
4524 // 1111 1110 0011 1011 Rn Rn IMM32; macbu imm32,Rn
4525 8.0xfe+8.0x3b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macbu
4534 srcreg = translate_rreg (SD_, RN0);
4535 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4537 temp = ((unsigned32)(State.regs[srcreg] & 0xff)
4538 * (unsigned32)(imm & 0xff));
4539 sum = State.regs[REG_MCRL] + temp;
4540 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4541 && (temp & 0x80000000) != (sum & 0x80000000));
4542 State.regs[REG_MCRL] = sum;
4544 State.regs[REG_MCVF] = 1;
4547 // 1111 1110 0100 1011 Rn Rn IMM32; mach imm32,Rn
4548 8.0xfe+8.0x4b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mach
4557 srcreg = translate_rreg (SD_, RN0);
4558 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4560 temp = ((signed32)(signed16)(State.regs[srcreg] & 0xffff)
4561 * (signed32)(signed16)(imm & 0xffff));
4562 sum = State.regs[REG_MCRL] + temp;
4563 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4564 && (temp & 0x80000000) != (sum & 0x80000000));
4565 State.regs[REG_MCRL] = sum;
4567 State.regs[REG_MCVF] = 1;
4570 // 1111 1110 0101 1011 Rn Rn IMM32; machu imm32,Rn
4571 8.0xfe+8.0x5b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::machu
4580 srcreg = translate_rreg (SD_, RN0);
4581 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4583 temp = ((unsigned32)(State.regs[srcreg] & 0xffff)
4584 * (unsigned32)(imm & 0xffff));
4585 sum = State.regs[REG_MCRL] + temp;
4586 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4587 && (temp & 0x80000000) != (sum & 0x80000000));
4588 State.regs[REG_MCRL] = sum;
4590 State.regs[REG_MCVF] = 1;
4593 // 1111 1110 0110 1011 Rn Rn IMM32; dmach imm32,Rn
4594 8.0xfe+8.0x6b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmach
4599 long temp, temp2, sum;
4603 srcreg = translate_rreg (SD_, RN0);
4604 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4606 temp = ((signed32)(signed16)(State.regs[srcreg] & 0xffff)
4607 * (signed32)(signed16)(imm & 0xffff));
4608 temp2 = ((signed32)(signed16)((State.regs[srcreg] >> 16) & 0xffff)
4609 * (signed32)(signed16)((imm >> 16) & 0xffff));
4610 sum = temp + temp2 + State.regs[REG_MCRL];
4611 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4612 && (temp & 0x80000000) != (sum & 0x80000000));
4613 State.regs[REG_MCRL] = sum;
4615 State.regs[REG_MCVF] = 1;
4618 // 1111 1110 0111 1011 Rn Rn IMM32; dmachu imm32,Rn
4619 8.0xfe+8.0x7b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmachu
4624 long temp, temp2, sum;
4628 srcreg = translate_rreg (SD_, RN0);
4629 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4631 temp = ((unsigned32)(State.regs[srcreg] & 0xffff)
4632 * (unsigned32)(imm & 0xffff));
4633 temp2 = ((unsigned32)((State.regs[srcreg] >> 16) & 0xffff)
4634 * (unsigned32)((imm >> 16) & 0xffff));
4635 sum = temp + temp2 + State.regs[REG_MCRL];
4636 v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
4637 && (temp & 0x80000000) != (sum & 0x80000000));
4638 State.regs[REG_MCRL] = sum;
4640 State.regs[REG_MCVF] = 1;
4643 // 1111 1110 1000 1011 Rn Rn IMM32; dmulh imm32,Rn
4644 8.0xfe+8.0x8b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmulh
4652 dstreg = translate_rreg (SD_, RN0);
4653 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4655 temp = ((signed32)(signed16)(State.regs[dstreg] & 0xffff)
4656 * (signed32)(signed16)(imm & 0xffff));
4657 State.regs[REG_MDRQ] = temp;
4658 temp = ((signed32)(signed16)((State.regs[dstreg] >> 16) & 0xffff)
4659 * (signed32)(signed16)((imm>>16) & 0xffff));
4660 State.regs[dstreg] = temp;
4663 // 1111 1110 1001 1011 Rn Rn IMM32; dmulhu imm32,Rn
4664 8.0xfe+8.0x9b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmulhu
4672 dstreg = translate_rreg (SD_, RN0);
4673 imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
4675 temp = ((unsigned32)(State.regs[dstreg] & 0xffff)
4676 * (unsigned32)(imm & 0xffff));
4677 State.regs[REG_MDRQ] = temp;
4678 temp = ((unsigned32)((State.regs[dstreg] >> 16) & 0xffff)
4679 * (unsigned32)((imm >>16) & 0xffff));
4680 State.regs[dstreg] = temp;
4683 // 1111 1110 0000 1110 Rn 0000 IMM32; mov (abs32),Rn
4684 8.0xfe+8.0x0e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5h:::mov
4691 dstreg = translate_rreg (SD_, RN2);
4692 State.regs[dstreg] = load_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4695 // 1111 1110 0001 1110 Rm 0000 IMM32; mov Rn,(abs32)
4696 8.0xfe+8.0x1e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::mov
4703 srcreg = translate_rreg (SD_, RM2);
4704 store_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4707 // 1111 1110 0020 1110 Rn 0000 IMM32; movbu (abs32),Rn
4708 8.0xfe+8.0x2e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5i:::movbu
4715 dstreg = translate_rreg (SD_, RN2);
4716 State.regs[dstreg] = load_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4719 // 1111 1110 0011 1110 Rm 0000 IMM32; movbu Rn,(abs32)
4720 8.0xfe+8.0x3e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movbu
4727 srcreg = translate_rreg (SD_, RM2);
4728 store_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4731 // 1111 1110 0100 1110 Rn 0000 IMM32; movhu (abs32),Rn
4732 8.0xfe+8.0x4e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5j:::movhu
4739 dstreg = translate_rreg (SD_, RN2);
4740 State.regs[dstreg] = load_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
4743 // 1111 1110 0101 1110 Rm 0000 IMM32; movhu Rn,(abs32)
4744 8.0xfe+8.0x5e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movhu
4751 srcreg = translate_rreg (SD_, RM2);
4752 store_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
4755 // 1111 0111 0000 0000 Rm1 Rn1 Rm2 Rn2; add_add Rm1, Rn1, Rm2, Rn2
4756 8.0xf7+8.0x00+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_add
4760 int srcreg1, srcreg2, dstreg1, dstreg2;
4763 srcreg1 = translate_rreg (SD_, RM1);
4764 srcreg2 = translate_rreg (SD_, RM2);
4765 dstreg1 = translate_rreg (SD_, RN1);
4766 dstreg2 = translate_rreg (SD_, RN2);
4768 State.regs[dstreg1] += State.regs[srcreg1];
4769 State.regs[dstreg2] += State.regs[srcreg2];
4772 // 1111 0111 0001 0000 Rm1 Rn1 imm4 Rn2; add_add Rm1, Rn1, imm4, Rn2
4773 8.0xf7+8.0x10+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_add
4777 int srcreg1, dstreg1, dstreg2;
4780 srcreg1 = translate_rreg (SD_, RM1);
4781 dstreg1 = translate_rreg (SD_, RN1);
4782 dstreg2 = translate_rreg (SD_, RN2);
4784 State.regs[dstreg1] += State.regs[srcreg1];
4785 State.regs[dstreg2] += EXTEND4 (IMM4);
4788 // 1111 0111 0010 0000 Rm1 Rn1 Rm2 Rn2; add_sub Rm1, Rn1, Rm2, Rn2
4789 8.0xf7+8.0x20+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_sub
4793 int srcreg1, srcreg2, dstreg1, dstreg2;
4796 srcreg1 = translate_rreg (SD_, RM1);
4797 srcreg2 = translate_rreg (SD_, RM2);
4798 dstreg1 = translate_rreg (SD_, RN1);
4799 dstreg2 = translate_rreg (SD_, RN2);
4801 State.regs[dstreg1] += State.regs[srcreg1];
4802 State.regs[dstreg2] -= State.regs[srcreg2];
4805 // 1111 0111 0011 0000 Rm1 Rn1 imm4 Rn2; add_sub Rm1, Rn1, imm4, Rn2
4806 8.0xf7+8.0x30+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_sub
4810 int srcreg1, dstreg1, dstreg2;
4813 srcreg1 = translate_rreg (SD_, RM1);
4814 dstreg1 = translate_rreg (SD_, RN1);
4815 dstreg2 = translate_rreg (SD_, RN2);
4817 State.regs[dstreg1] += State.regs[srcreg1];
4818 State.regs[dstreg2] -= EXTEND4 (IMM4);
4821 // 1111 0111 0100 0000 Rm1 Rn1 Rm2 Rn2; add_cmp Rm1, Rn1, Rm2, Rn2
4822 8.0xf7+8.0x40+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_cmp
4826 int srcreg1, srcreg2, dstreg1, dstreg2;
4829 srcreg1 = translate_rreg (SD_, RM1);
4830 srcreg2 = translate_rreg (SD_, RM2);
4831 dstreg1 = translate_rreg (SD_, RN1);
4832 dstreg2 = translate_rreg (SD_, RN2);
4834 State.regs[dstreg1] += State.regs[srcreg1];
4835 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
4838 // 1111 0111 0101 0000 Rm1 Rn1 imm4 Rn2; add_cmp Rm1, Rn1, imm4, Rn2
4839 8.0xf7+8.0x50+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_cmp
4843 int srcreg1, dstreg1, dstreg2;
4846 srcreg1 = translate_rreg (SD_, RM1);
4847 dstreg1 = translate_rreg (SD_, RN1);
4848 dstreg2 = translate_rreg (SD_, RN2);
4850 State.regs[dstreg1] += State.regs[srcreg1];
4851 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
4854 // 1111 0111 0110 0000 Rm1 Rn1 Rm2 Rn2; add_mov Rm1, Rn1, Rm2, Rn2
4855 8.0xf7+8.0x60+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_mov
4859 int srcreg1, srcreg2, dstreg1, dstreg2;
4862 srcreg1 = translate_rreg (SD_, RM1);
4863 srcreg2 = translate_rreg (SD_, RM2);
4864 dstreg1 = translate_rreg (SD_, RN1);
4865 dstreg2 = translate_rreg (SD_, RN2);
4867 State.regs[dstreg1] += State.regs[srcreg1];
4868 State.regs[dstreg2] = State.regs[srcreg2];
4871 // 1111 0111 0111 0000 Rm1 Rn1 imm4 Rn2; add_mov Rm1, Rn1, imm4, Rn2
4872 8.0xf7+8.0x70+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_mov
4876 int srcreg1, dstreg1, dstreg2;
4879 srcreg1 = translate_rreg (SD_, RM1);
4880 dstreg1 = translate_rreg (SD_, RN1);
4881 dstreg2 = translate_rreg (SD_, RN2);
4883 State.regs[dstreg1] += State.regs[srcreg1];
4884 State.regs[dstreg2] = EXTEND4 (IMM4);
4887 // 1111 0111 1000 0000 Rm1 Rn1 Rm2 Rn2; add_asr Rm1, Rn1, Rm2, Rn2
4888 8.0xf7+8.0x80+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_asr
4892 int srcreg1, srcreg2, dstreg1, dstreg2;
4896 srcreg1 = translate_rreg (SD_, RM1);
4897 srcreg2 = translate_rreg (SD_, RM2);
4898 dstreg1 = translate_rreg (SD_, RN1);
4899 dstreg2 = translate_rreg (SD_, RN2);
4901 State.regs[dstreg1] += State.regs[srcreg1];
4902 temp = State.regs[dstreg2];
4903 temp >>= State.regs[srcreg2];
4904 State.regs[dstreg2] = temp;
4907 // 1111 0111 1001 0000 Rm1 Rn1 imm4 Rn2; add_asr Rm1, Rn1, imm4, Rn2
4908 8.0xf7+8.0x90+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_asr
4912 int srcreg1, dstreg1, dstreg2;
4916 srcreg1 = translate_rreg (SD_, RM1);
4917 dstreg1 = translate_rreg (SD_, RN1);
4918 dstreg2 = translate_rreg (SD_, RN2);
4920 State.regs[dstreg1] += State.regs[srcreg1];
4921 temp = State.regs[dstreg2];
4923 State.regs[dstreg2] = temp;
4926 // 1111 0111 1010 0000 Rm1 Rn1 Rm2 Rn2; add_lsr Rm1, Rn1, Rm2, Rn2
4927 8.0xf7+8.0xa0+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_lsr
4931 int srcreg1, srcreg2, dstreg1, dstreg2;
4934 srcreg1 = translate_rreg (SD_, RM1);
4935 srcreg2 = translate_rreg (SD_, RM2);
4936 dstreg1 = translate_rreg (SD_, RN1);
4937 dstreg2 = translate_rreg (SD_, RN2);
4939 State.regs[dstreg1] += State.regs[srcreg1];
4940 State.regs[dstreg2] >>= State.regs[srcreg2];
4943 // 1111 0111 1011 0000 Rm1 Rn1 imm4 Rn2; add_lsr Rm1, Rn1, imm4, Rn2
4944 8.0xf7+8.0xb0+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_lsr
4948 int srcreg1, dstreg1, dstreg2;
4952 srcreg1 = translate_rreg (SD_, RM1);
4953 dstreg1 = translate_rreg (SD_, RN1);
4954 dstreg2 = translate_rreg (SD_, RN2);
4956 State.regs[dstreg1] += State.regs[srcreg1];
4957 State.regs[dstreg2] >>= IMM4;
4961 // 1111 0111 1100 0000 Rm1 Rn1 Rm2 Rn2; add_asl Rm1, Rn1, Rm2, Rn2
4962 8.0xf7+8.0xc0+4.RM1,4.RN1+4.RM2,4.RN2:D2:::add_asl
4966 int srcreg1, srcreg2, dstreg1, dstreg2;
4969 srcreg1 = translate_rreg (SD_, RM1);
4970 srcreg2 = translate_rreg (SD_, RM2);
4971 dstreg1 = translate_rreg (SD_, RN1);
4972 dstreg2 = translate_rreg (SD_, RN2);
4974 State.regs[dstreg1] += State.regs[srcreg1];
4975 State.regs[dstreg2] <<= State.regs[srcreg2];
4978 // 1111 0111 1101 0000 Rm1 Rn1 imm4 Rn2; add_asl Rm1, Rn1, imm4, Rn2
4979 8.0xf7+8.0xd0+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::add_asl
4983 int srcreg1, dstreg1, dstreg2;
4987 srcreg1 = translate_rreg (SD_, RM1);
4988 dstreg1 = translate_rreg (SD_, RN1);
4989 dstreg2 = translate_rreg (SD_, RN2);
4991 State.regs[dstreg1] += State.regs[srcreg1];
4992 State.regs[dstreg2] <<= IMM4;
4995 // 1111 0111 0000 0001 Rm1 Rn1 Rm2 Rn2; cmp_add Rm1, Rn1, Rm2, Rn2
4996 8.0xf7+8.0x01+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_add
5000 int srcreg1, srcreg2, dstreg1, dstreg2;
5003 srcreg1 = translate_rreg (SD_, RM1);
5004 srcreg2 = translate_rreg (SD_, RM2);
5005 dstreg1 = translate_rreg (SD_, RN1);
5006 dstreg2 = translate_rreg (SD_, RN2);
5008 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5009 State.regs[dstreg2] += State.regs[srcreg2];
5012 // 1111 0111 0001 0001 Rm1 Rn1 imm4 Rn2; cmp_add Rm1, Rn1, imm4, Rn2
5013 8.0xf7+8.0x11+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_add
5017 int srcreg1, dstreg1, dstreg2;
5020 srcreg1 = translate_rreg (SD_, RM1);
5021 dstreg1 = translate_rreg (SD_, RN1);
5022 dstreg2 = translate_rreg (SD_, RN2);
5024 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5025 State.regs[dstreg2] += EXTEND4 (IMM4);
5028 // 1111 0111 0010 0001 Rm1 Rn1 Rm2 Rn2; cmp_sub Rm1, Rn1, Rm2, Rn2
5029 8.0xf7+8.0x21+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_sub
5033 int srcreg1, srcreg2, dstreg1, dstreg2;
5036 srcreg1 = translate_rreg (SD_, RM1);
5037 srcreg2 = translate_rreg (SD_, RM2);
5038 dstreg1 = translate_rreg (SD_, RN1);
5039 dstreg2 = translate_rreg (SD_, RN2);
5041 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5042 State.regs[dstreg2] -= State.regs[srcreg2];
5045 // 1111 0111 0011 0001 Rm1 Rn1 imm4 Rn2; cmp_sub Rm1, Rn1, imm4, Rn2
5046 8.0xf7+8.0x31+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_sub
5050 int srcreg1, dstreg1, dstreg2;
5053 srcreg1 = translate_rreg (SD_, RM1);
5054 dstreg1 = translate_rreg (SD_, RN1);
5055 dstreg2 = translate_rreg (SD_, RN2);
5057 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5058 State.regs[dstreg2] -= EXTEND4 (IMM4);
5061 // 1111 0111 0110 0001 Rm1 Rn1 Rm2 Rn2; cmp_mov Rm1, Rn1, Rm2, Rn2
5062 8.0xf7+8.0x61+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_mov
5066 int srcreg1, srcreg2, dstreg1, dstreg2;
5069 srcreg1 = translate_rreg (SD_, RM1);
5070 srcreg2 = translate_rreg (SD_, RM2);
5071 dstreg1 = translate_rreg (SD_, RN1);
5072 dstreg2 = translate_rreg (SD_, RN2);
5074 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5075 State.regs[dstreg2] = State.regs[srcreg2];
5078 // 1111 0111 0111 0001 Rm1 Rn1 imm4 Rn2; cmp_mov Rm1, Rn1, imm4, Rn2
5079 8.0xf7+8.0x71+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_mov
5083 int srcreg1, dstreg1, dstreg2;
5086 srcreg1 = translate_rreg (SD_, RM1);
5087 dstreg1 = translate_rreg (SD_, RN1);
5088 dstreg2 = translate_rreg (SD_, RN2);
5090 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5091 State.regs[dstreg2] = EXTEND4 (IMM4);
5094 // 1111 0111 1000 0001 Rm1 Rn1 Rm2 Rn2; cmp_asr Rm1, Rn1, Rm2, Rn2
5095 8.0xf7+8.0x81+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_asr
5099 int srcreg1, srcreg2, dstreg1, dstreg2;
5103 srcreg1 = translate_rreg (SD_, RM1);
5104 srcreg2 = translate_rreg (SD_, RM2);
5105 dstreg1 = translate_rreg (SD_, RN1);
5106 dstreg2 = translate_rreg (SD_, RN2);
5108 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5109 temp = State.regs[dstreg2];
5110 temp >>= State.regs[srcreg2];
5111 State.regs[dstreg2] = temp;
5114 // 1111 0111 1001 0001 Rm1 Rn1 imm4 Rn2; cmp_asr Rm1, Rn1, imm4, Rn2
5115 8.0xf7+8.0x91+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_asr
5119 int srcreg1, dstreg1, dstreg2;
5123 srcreg1 = translate_rreg (SD_, RM1);
5124 dstreg1 = translate_rreg (SD_, RN1);
5125 dstreg2 = translate_rreg (SD_, RN2);
5127 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5128 temp = State.regs[dstreg2];
5130 State.regs[dstreg2] = temp;
5133 // 1111 0111 1010 0001 Rm1 Rn1 Rm2 Rn2; cmp_lsr Rm1, Rn1, Rm2, Rn2
5134 8.0xf7+8.0xa1+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_lsr
5138 int srcreg1, srcreg2, dstreg1, dstreg2;
5141 srcreg1 = translate_rreg (SD_, RM1);
5142 srcreg2 = translate_rreg (SD_, RM2);
5143 dstreg1 = translate_rreg (SD_, RN1);
5144 dstreg2 = translate_rreg (SD_, RN2);
5146 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5147 State.regs[dstreg2] >>= State.regs[srcreg2];
5150 // 1111 0111 1011 0001 Rm1 Rn1 imm4 Rn2; cmp_lsr Rm1, Rn1, imm4, Rn2
5151 8.0xf7+8.0xb1+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_lsr
5155 int srcreg1, dstreg1, dstreg2;
5159 srcreg1 = translate_rreg (SD_, RM1);
5160 dstreg1 = translate_rreg (SD_, RN1);
5161 dstreg2 = translate_rreg (SD_, RN2);
5163 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5164 State.regs[dstreg2] >>= IMM4;
5168 // 1111 0111 1100 0001 Rm1 Rn1 Rm2 Rn2; cmp_asl Rm1, Rn1, Rm2, Rn2
5169 8.0xf7+8.0xc1+4.RM1,4.RN1+4.RM2,4.RN2:D2:::cmp_asl
5173 int srcreg1, srcreg2, dstreg1, dstreg2;
5176 srcreg1 = translate_rreg (SD_, RM1);
5177 srcreg2 = translate_rreg (SD_, RM2);
5178 dstreg1 = translate_rreg (SD_, RN1);
5179 dstreg2 = translate_rreg (SD_, RN2);
5181 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5182 State.regs[dstreg2] <<= State.regs[srcreg2];
5185 // 1111 0111 1101 0001 Rm1 Rn1 imm4 Rn2; cmp_asl Rm1, Rn1, imm4, Rn2
5186 8.0xf7+8.0xd1+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::cmp_asl
5190 int srcreg1, dstreg1, dstreg2;
5194 srcreg1 = translate_rreg (SD_, RM1);
5195 dstreg1 = translate_rreg (SD_, RN1);
5196 dstreg2 = translate_rreg (SD_, RN2);
5198 genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
5199 State.regs[dstreg2] <<= IMM4;
5202 // 1111 0111 0000 0010 Rm1 Rn1 Rm2 Rn2; sub_add Rm1, Rn1, Rm2, Rn2
5203 8.0xf7+8.0x02+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_add
5207 int srcreg1, srcreg2, dstreg1, dstreg2;
5210 srcreg1 = translate_rreg (SD_, RM1);
5211 srcreg2 = translate_rreg (SD_, RM2);
5212 dstreg1 = translate_rreg (SD_, RN1);
5213 dstreg2 = translate_rreg (SD_, RN2);
5215 State.regs[dstreg1] -= State.regs[srcreg1];
5216 State.regs[dstreg2] += State.regs[srcreg2];
5219 // 1111 0111 0001 0010 Rm1 Rn1 imm4 Rn2; sub_add Rm1, Rn1, imm4, Rn2
5220 8.0xf7+8.0x12+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_add
5224 int srcreg1, dstreg1, dstreg2;
5227 srcreg1 = translate_rreg (SD_, RM1);
5228 dstreg1 = translate_rreg (SD_, RN1);
5229 dstreg2 = translate_rreg (SD_, RN2);
5231 State.regs[dstreg1] -= State.regs[srcreg1];
5232 State.regs[dstreg2] += EXTEND4 (IMM4);
5235 // 1111 0111 0010 0010 Rm1 Rn1 Rm2 Rn2; sub_sub Rm1, Rn1, Rm2, Rn2
5236 8.0xf7+8.0x22+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_sub
5240 int srcreg1, srcreg2, dstreg1, dstreg2;
5243 srcreg1 = translate_rreg (SD_, RM1);
5244 srcreg2 = translate_rreg (SD_, RM2);
5245 dstreg1 = translate_rreg (SD_, RN1);
5246 dstreg2 = translate_rreg (SD_, RN2);
5248 State.regs[dstreg1] -= State.regs[srcreg1];
5249 State.regs[dstreg2] -= State.regs[srcreg2];
5252 // 1111 0111 0011 0010 Rm1 Rn1 imm4 Rn2; sub_sub Rm1, Rn1, imm4, Rn2
5253 8.0xf7+8.0x32+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_sub
5257 int srcreg1, dstreg1, dstreg2;
5260 srcreg1 = translate_rreg (SD_, RM1);
5261 dstreg1 = translate_rreg (SD_, RN1);
5262 dstreg2 = translate_rreg (SD_, RN2);
5264 State.regs[dstreg1] -= State.regs[srcreg1];
5265 State.regs[dstreg2] -= EXTEND4 (IMM4);
5268 // 1111 0111 0100 0010 Rm1 Rn1 Rm2 Rn2; sub_cmp Rm1, Rn1, Rm2, Rn2
5269 8.0xf7+8.0x42+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_cmp
5273 int srcreg1, srcreg2, dstreg1, dstreg2;
5276 srcreg1 = translate_rreg (SD_, RM1);
5277 srcreg2 = translate_rreg (SD_, RM2);
5278 dstreg1 = translate_rreg (SD_, RN1);
5279 dstreg2 = translate_rreg (SD_, RN2);
5281 State.regs[dstreg1] -= State.regs[srcreg1];
5282 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5285 // 1111 0111 0101 0010 Rm1 Rn1 imm4 Rn2; sub_cmp Rm1, Rn1, imm4, Rn2
5286 8.0xf7+8.0x52+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_cmp
5290 int srcreg1, dstreg1, dstreg2;
5293 srcreg1 = translate_rreg (SD_, RM1);
5294 dstreg1 = translate_rreg (SD_, RN1);
5295 dstreg2 = translate_rreg (SD_, RN2);
5297 State.regs[dstreg1] -= State.regs[srcreg1];
5298 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5301 // 1111 0111 0110 0010 Rm1 Rn1 Rm2 Rn2; sub_mov Rm1, Rn1, Rm2, Rn2
5302 8.0xf7+8.0x62+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_mov
5306 int srcreg1, srcreg2, dstreg1, dstreg2;
5309 srcreg1 = translate_rreg (SD_, RM1);
5310 srcreg2 = translate_rreg (SD_, RM2);
5311 dstreg1 = translate_rreg (SD_, RN1);
5312 dstreg2 = translate_rreg (SD_, RN2);
5314 State.regs[dstreg1] -= State.regs[srcreg1];
5315 State.regs[dstreg2] = State.regs[srcreg2];
5318 // 1111 0111 0111 0010 Rm1 Rn1 imm4 Rn2; sub_mov Rm1, Rn1, imm4, Rn2
5319 8.0xf7+8.0x72+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_mov
5323 int srcreg1, dstreg1, dstreg2;
5326 srcreg1 = translate_rreg (SD_, RM1);
5327 dstreg1 = translate_rreg (SD_, RN1);
5328 dstreg2 = translate_rreg (SD_, RN2);
5330 State.regs[dstreg1] -= State.regs[srcreg1];
5331 State.regs[dstreg2] = EXTEND4 (IMM4);
5334 // 1111 0111 1000 0010 Rm1 Rn1 Rm2 Rn2; sub_asr Rm1, Rn1, Rm2, Rn2
5335 8.0xf7+8.0x82+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_asr
5339 int srcreg1, srcreg2, dstreg1, dstreg2;
5343 srcreg1 = translate_rreg (SD_, RM1);
5344 srcreg2 = translate_rreg (SD_, RM2);
5345 dstreg1 = translate_rreg (SD_, RN1);
5346 dstreg2 = translate_rreg (SD_, RN2);
5348 State.regs[dstreg1] -= State.regs[srcreg1];
5349 temp = State.regs[dstreg2];
5350 temp >>= State.regs[srcreg2];
5351 State.regs[dstreg2] = temp;
5354 // 1111 0111 1001 0010 Rm1 Rn1 imm4 Rn2; sub_asr Rm1, Rn1, imm4, Rn2
5355 8.0xf7+8.0x92+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_asr
5359 int srcreg1, dstreg1, dstreg2;
5363 srcreg1 = translate_rreg (SD_, RM1);
5364 dstreg1 = translate_rreg (SD_, RN1);
5365 dstreg2 = translate_rreg (SD_, RN2);
5367 State.regs[dstreg1] -= State.regs[srcreg1];
5368 temp = State.regs[dstreg2];
5370 State.regs[dstreg2] = temp;
5373 // 1111 0111 1010 0010 Rm1 Rn1 Rm2 Rn2; sub_lsr Rm1, Rn1, Rm2, Rn2
5374 8.0xf7+8.0xa2+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_lsr
5378 int srcreg1, srcreg2, dstreg1, dstreg2;
5381 srcreg1 = translate_rreg (SD_, RM1);
5382 srcreg2 = translate_rreg (SD_, RM2);
5383 dstreg1 = translate_rreg (SD_, RN1);
5384 dstreg2 = translate_rreg (SD_, RN2);
5386 State.regs[dstreg1] -= State.regs[srcreg1];
5387 State.regs[dstreg2] >>= State.regs[srcreg2];
5390 // 1111 0111 1011 0010 Rm1 Rn1 imm4 Rn2; sub_lsr Rm1, Rn1, imm4, Rn2
5391 8.0xf7+8.0xb2+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_lsr
5395 int srcreg1, dstreg1, dstreg2;
5399 srcreg1 = translate_rreg (SD_, RM1);
5400 dstreg1 = translate_rreg (SD_, RN1);
5401 dstreg2 = translate_rreg (SD_, RN2);
5403 State.regs[dstreg1] -= State.regs[srcreg1];
5404 State.regs[dstreg2] >>= IMM4;
5408 // 1111 0111 1100 0010 Rm1 Rn1 Rm2 Rn2; sub_asl Rm1, Rn1, Rm2, Rn2
5409 8.0xf7+8.0xc2+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sub_asl
5413 int srcreg1, srcreg2, dstreg1, dstreg2;
5416 srcreg1 = translate_rreg (SD_, RM1);
5417 srcreg2 = translate_rreg (SD_, RM2);
5418 dstreg1 = translate_rreg (SD_, RN1);
5419 dstreg2 = translate_rreg (SD_, RN2);
5421 State.regs[dstreg1] -= State.regs[srcreg1];
5422 State.regs[dstreg2] <<= State.regs[srcreg2];
5425 // 1111 0111 1101 0010 Rm1 Rn1 imm4 Rn2; sub_asl Rm1, Rn1, imm4, Rn2
5426 8.0xf7+8.0xd2+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sub_asl
5430 int srcreg1, dstreg1, dstreg2;
5434 srcreg1 = translate_rreg (SD_, RM1);
5435 dstreg1 = translate_rreg (SD_, RN1);
5436 dstreg2 = translate_rreg (SD_, RN2);
5438 State.regs[dstreg1] -= State.regs[srcreg1];
5439 State.regs[dstreg2] <<= IMM4;
5442 // 1111 0111 0000 0011 Rm1 Rn1 Rm2 Rn2; mov_add Rm1, Rn1, Rm2, Rn2
5443 8.0xf7+8.0x03+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_add
5447 int srcreg1, srcreg2, dstreg1, dstreg2;
5450 srcreg1 = translate_rreg (SD_, RM1);
5451 srcreg2 = translate_rreg (SD_, RM2);
5452 dstreg1 = translate_rreg (SD_, RN1);
5453 dstreg2 = translate_rreg (SD_, RN2);
5455 State.regs[dstreg1] = State.regs[srcreg1];
5456 State.regs[dstreg2] += State.regs[srcreg2];
5459 // 1111 0111 0001 0011 Rm1 Rn1 imm4 Rn2; mov_add Rm1, Rn1, imm4, Rn2
5460 8.0xf7+8.0x13+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_add
5464 int srcreg1, dstreg1, dstreg2;
5467 srcreg1 = translate_rreg (SD_, RM1);
5468 dstreg1 = translate_rreg (SD_, RN1);
5469 dstreg2 = translate_rreg (SD_, RN2);
5471 State.regs[dstreg1] = State.regs[srcreg1];
5472 State.regs[dstreg2] += EXTEND4 (IMM4);
5475 // 1111 0111 0010 0011 Rm1 Rn1 Rm2 Rn2; mov_sub Rm1, Rn1, Rm2, Rn2
5476 8.0xf7+8.0x23+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_sub
5480 int srcreg1, srcreg2, dstreg1, dstreg2;
5483 srcreg1 = translate_rreg (SD_, RM1);
5484 srcreg2 = translate_rreg (SD_, RM2);
5485 dstreg1 = translate_rreg (SD_, RN1);
5486 dstreg2 = translate_rreg (SD_, RN2);
5488 State.regs[dstreg1] = State.regs[srcreg1];
5489 State.regs[dstreg2] -= State.regs[srcreg2];
5492 // 1111 0111 0011 0011 Rm1 Rn1 imm4 Rn2; mov_sub Rm1, Rn1, imm4, Rn2
5493 8.0xf7+8.0x33+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_sub
5497 int srcreg1, dstreg1, dstreg2;
5500 srcreg1 = translate_rreg (SD_, RM1);
5501 dstreg1 = translate_rreg (SD_, RN1);
5502 dstreg2 = translate_rreg (SD_, RN2);
5504 State.regs[dstreg1] = State.regs[srcreg1];
5505 State.regs[dstreg2] -= EXTEND4 (IMM4);
5508 // 1111 0111 0100 0011 Rm1 Rn1 Rm2 Rn2; mov_cmp Rm1, Rn1, Rm2, Rn2
5509 8.0xf7+8.0x43+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_cmp
5513 int srcreg1, srcreg2, dstreg1, dstreg2;
5516 srcreg1 = translate_rreg (SD_, RM1);
5517 srcreg2 = translate_rreg (SD_, RM2);
5518 dstreg1 = translate_rreg (SD_, RN1);
5519 dstreg2 = translate_rreg (SD_, RN2);
5521 State.regs[dstreg1] = State.regs[srcreg1];
5522 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5525 // 1111 0111 0101 0011 Rm1 Rn1 imm4 Rn2; mov_cmp Rm1, Rn1, imm4, Rn2
5526 8.0xf7+8.0x53+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_cmp
5530 int srcreg1, dstreg1, dstreg2;
5533 srcreg1 = translate_rreg (SD_, RM1);
5534 dstreg1 = translate_rreg (SD_, RN1);
5535 dstreg2 = translate_rreg (SD_, RN2);
5537 State.regs[dstreg1] = State.regs[srcreg1];
5538 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5541 // 1111 0111 0110 0011 Rm1 Rn1 Rm2 Rn2; mov_mov Rm1, Rn1, Rm2, Rn2
5542 8.0xf7+8.0x63+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_mov
5546 int srcreg1, srcreg2, dstreg1, dstreg2;
5549 srcreg1 = translate_rreg (SD_, RM1);
5550 srcreg2 = translate_rreg (SD_, RM2);
5551 dstreg1 = translate_rreg (SD_, RN1);
5552 dstreg2 = translate_rreg (SD_, RN2);
5554 State.regs[dstreg1] = State.regs[srcreg1];
5555 State.regs[dstreg2] = State.regs[srcreg2];
5558 // 1111 0111 0111 0011 Rm1 Rn1 imm4 Rn2; mov_mov Rm1, Rn1, imm4, Rn2
5559 8.0xf7+8.0x73+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_mov
5563 int srcreg1, dstreg1, dstreg2;
5566 srcreg1 = translate_rreg (SD_, RM1);
5567 dstreg1 = translate_rreg (SD_, RN1);
5568 dstreg2 = translate_rreg (SD_, RN2);
5570 State.regs[dstreg1] = State.regs[srcreg1];
5571 State.regs[dstreg2] = EXTEND4 (IMM4);
5574 // 1111 0111 1000 0011 Rm1 Rn1 Rm2 Rn2; mov_asr Rm1, Rn1, Rm2, Rn2
5575 8.0xf7+8.0x83+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_asr
5579 int srcreg1, srcreg2, dstreg1, dstreg2;
5583 srcreg1 = translate_rreg (SD_, RM1);
5584 srcreg2 = translate_rreg (SD_, RM2);
5585 dstreg1 = translate_rreg (SD_, RN1);
5586 dstreg2 = translate_rreg (SD_, RN2);
5588 State.regs[dstreg1] = State.regs[srcreg1];
5589 temp = State.regs[dstreg2];
5590 temp >>= State.regs[srcreg2];
5591 State.regs[dstreg2] = temp;
5594 // 1111 0111 1001 0011 Rm1 Rn1 imm4 Rn2; mov_asr Rm1, Rn1, imm4, Rn2
5595 8.0xf7+8.0x93+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_asr
5599 int srcreg1, dstreg1, dstreg2;
5603 srcreg1 = translate_rreg (SD_, RM1);
5604 dstreg1 = translate_rreg (SD_, RN1);
5605 dstreg2 = translate_rreg (SD_, RN2);
5607 State.regs[dstreg1] = State.regs[srcreg1];
5608 temp = State.regs[dstreg2];
5610 State.regs[dstreg2] = temp;
5613 // 1111 0111 1010 0011 Rm1 Rn1 Rm2 Rn2; mov_lsr Rm1, Rn1, Rm2, Rn2
5614 8.0xf7+8.0xa3+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_lsr
5618 int srcreg1, srcreg2, dstreg1, dstreg2;
5621 srcreg1 = translate_rreg (SD_, RM1);
5622 srcreg2 = translate_rreg (SD_, RM2);
5623 dstreg1 = translate_rreg (SD_, RN1);
5624 dstreg2 = translate_rreg (SD_, RN2);
5626 State.regs[dstreg1] = State.regs[srcreg1];
5627 State.regs[dstreg2] >>= State.regs[srcreg2];
5630 // 1111 0111 1011 0011 Rm1 Rn1 imm4 Rn2; mov_lsr Rm1, Rn1, imm4, Rn2
5631 8.0xf7+8.0xb3+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_lsr
5635 int srcreg1, dstreg1, dstreg2;
5639 srcreg1 = translate_rreg (SD_, RM1);
5640 dstreg1 = translate_rreg (SD_, RN1);
5641 dstreg2 = translate_rreg (SD_, RN2);
5643 State.regs[dstreg1] = State.regs[srcreg1];
5644 State.regs[dstreg2] >>= IMM4;
5648 // 1111 0111 1100 0011 Rm1 Rn1 Rm2 Rn2; mov_asl Rm1, Rn1, Rm2, Rn2
5649 8.0xf7+8.0xc3+4.RM1,4.RN1+4.RM2,4.RN2:D2:::mov_asl
5653 int srcreg1, srcreg2, dstreg1, dstreg2;
5656 srcreg1 = translate_rreg (SD_, RM1);
5657 srcreg2 = translate_rreg (SD_, RM2);
5658 dstreg1 = translate_rreg (SD_, RN1);
5659 dstreg2 = translate_rreg (SD_, RN2);
5661 State.regs[dstreg1] = State.regs[srcreg1];
5662 State.regs[dstreg2] <<= State.regs[srcreg2];
5665 // 1111 0111 1101 0011 Rm1 Rn1 imm4 Rn2; mov_asl Rm1, Rn1, imm4, Rn2
5666 8.0xf7+8.0xd3+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::mov_asl
5670 int srcreg1, dstreg1, dstreg2;
5674 srcreg1 = translate_rreg (SD_, RM1);
5675 dstreg1 = translate_rreg (SD_, RN1);
5676 dstreg2 = translate_rreg (SD_, RN2);
5678 State.regs[dstreg1] = State.regs[srcreg1];
5679 State.regs[dstreg2] <<= IMM4;
5682 // 1111 0111 0000 0100 imm4 Rn1 Rm2 Rn2; add_add imm4, Rn1, Rm2, Rn2
5683 8.0xf7+8.0x04+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_add
5687 int srcreg2, dstreg1, dstreg2;
5690 srcreg2 = translate_rreg (SD_, RM2);
5691 dstreg1 = translate_rreg (SD_, RN1);
5692 dstreg2 = translate_rreg (SD_, RN2);
5694 State.regs[dstreg1] += EXTEND4 (IMM4A);
5695 State.regs[dstreg2] += State.regs[srcreg2];
5698 // 1111 0111 0001 0100 imm4 Rn1 imm4 Rn2; add_add imm4, Rn1, imm4, Rn2
5699 8.0xf7+8.0x14+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_add
5703 int dstreg1, dstreg2;
5706 dstreg1 = translate_rreg (SD_, RN1);
5707 dstreg2 = translate_rreg (SD_, RN2);
5709 State.regs[dstreg1] += EXTEND4 (IMM4A);
5710 State.regs[dstreg2] += EXTEND4 (IMM4);
5713 // 1111 0111 0010 0100 imm4 Rn1 Rm2 Rn2; add_sub imm4, Rn1, Rm2, Rn2
5714 8.0xf7+8.0x24+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_sub
5718 int srcreg2, dstreg1, dstreg2;
5721 srcreg2 = translate_rreg (SD_, RM2);
5722 dstreg1 = translate_rreg (SD_, RN1);
5723 dstreg2 = translate_rreg (SD_, RN2);
5725 State.regs[dstreg1] += EXTEND4 (IMM4A);
5726 State.regs[dstreg2] -= State.regs[srcreg2];
5729 // 1111 0111 0011 0100 imm4 Rn1 imm4 Rn2; add_sub imm4, Rn1, imm4, Rn2
5730 8.0xf7+8.0x34+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_sub
5734 int dstreg1, dstreg2;
5737 dstreg1 = translate_rreg (SD_, RN1);
5738 dstreg2 = translate_rreg (SD_, RN2);
5740 State.regs[dstreg1] += EXTEND4 (IMM4A);
5741 State.regs[dstreg2] -= EXTEND4 (IMM4);
5744 // 1111 0111 0100 0100 imm4 Rn1 Rm2 Rn2; add_cmp imm4, Rn1, Rm2, Rn2
5745 8.0xf7+8.0x44+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_cmp
5749 int srcreg2, dstreg1, dstreg2;
5752 srcreg2 = translate_rreg (SD_, RM2);
5753 dstreg1 = translate_rreg (SD_, RN1);
5754 dstreg2 = translate_rreg (SD_, RN2);
5756 State.regs[dstreg1] += EXTEND4 (IMM4A);
5757 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
5760 // 1111 0111 0101 0100 imm4 Rn1 imm4 Rn2; add_cmp imm4, Rn1, imm4, Rn2
5761 8.0xf7+8.0x54+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_cmp
5765 int dstreg1, dstreg2;
5768 dstreg1 = translate_rreg (SD_, RN1);
5769 dstreg2 = translate_rreg (SD_, RN2);
5771 State.regs[dstreg1] += EXTEND4 (IMM4A);
5772 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
5775 // 1111 0111 0110 0100 imm4 Rn1 Rm2 Rn2; add_mov imm4, Rn1, Rm2, Rn2
5776 8.0xf7+8.0x64+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_mov
5780 int srcreg2, dstreg1, dstreg2;
5783 srcreg2 = translate_rreg (SD_, RM2);
5784 dstreg1 = translate_rreg (SD_, RN1);
5785 dstreg2 = translate_rreg (SD_, RN2);
5787 State.regs[dstreg1] += EXTEND4 (IMM4A);
5788 State.regs[dstreg2] = State.regs[srcreg2];
5791 // 1111 0111 0111 0100 imm4 Rn1 imm4 Rn2; add_mov imm4, Rn1, imm4, Rn2
5792 8.0xf7+8.0x74+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_mov
5796 int dstreg1, dstreg2;
5799 dstreg1 = translate_rreg (SD_, RN1);
5800 dstreg2 = translate_rreg (SD_, RN2);
5802 State.regs[dstreg1] += EXTEND4 (IMM4A);
5803 State.regs[dstreg2] = EXTEND4 (IMM4);
5806 // 1111 0111 1000 0100 imm4 Rn1 Rm2 Rn2; add_asr imm4, Rn1, Rm2, Rn2
5807 8.0xf7+8.0x84+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_asr
5811 int srcreg2, dstreg1, dstreg2;
5815 srcreg2 = translate_rreg (SD_, RM2);
5816 dstreg1 = translate_rreg (SD_, RN1);
5817 dstreg2 = translate_rreg (SD_, RN2);
5819 State.regs[dstreg1] += EXTEND4 (IMM4A);
5820 temp = State.regs[dstreg2];
5821 temp >>= State.regs[srcreg2];
5822 State.regs[dstreg2] = temp;
5825 // 1111 0111 1001 0100 imm4 Rn1 imm4 Rn2; add_asr imm4, Rn1, imm4, Rn2
5826 8.0xf7+8.0x94+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_asr
5830 int dstreg1, dstreg2;
5834 dstreg1 = translate_rreg (SD_, RN1);
5835 dstreg2 = translate_rreg (SD_, RN2);
5837 State.regs[dstreg1] += EXTEND4 (IMM4A);
5838 temp = State.regs[dstreg2];
5840 State.regs[dstreg2] = temp;
5843 // 1111 0111 1010 0100 imm4 Rn1 Rm2 Rn2; add_lsr imm4, Rn1, Rm2, Rn2
5844 8.0xf7+8.0xa4+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_lsr
5848 int srcreg2, dstreg1, dstreg2;
5851 srcreg2 = translate_rreg (SD_, RM2);
5852 dstreg1 = translate_rreg (SD_, RN1);
5853 dstreg2 = translate_rreg (SD_, RN2);
5855 State.regs[dstreg1] += EXTEND4 (IMM4A);
5856 State.regs[dstreg2] >>= State.regs[srcreg2];
5859 // 1111 0111 1011 0100 imm4 Rn1 imm4 Rn2; add_lsr imm4, Rn1, imm4, Rn2
5860 8.0xf7+8.0xb4+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_lsr
5864 int dstreg1, dstreg2;
5868 dstreg1 = translate_rreg (SD_, RN1);
5869 dstreg2 = translate_rreg (SD_, RN2);
5871 State.regs[dstreg1] += EXTEND4 (IMM4A);
5872 State.regs[dstreg2] >>= IMM4;
5876 // 1111 0111 1100 0100 imm4 Rn1 Rm2 Rn2; add_asl imm4, Rn1, Rm2, Rn2
5877 8.0xf7+8.0xc4+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::add_asl
5881 int srcreg2, dstreg1, dstreg2;
5884 srcreg2 = translate_rreg (SD_, RM2);
5885 dstreg1 = translate_rreg (SD_, RN1);
5886 dstreg2 = translate_rreg (SD_, RN2);
5888 State.regs[dstreg1] += EXTEND4 (IMM4A);
5889 State.regs[dstreg2] <<= State.regs[srcreg2];
5892 // 1111 0111 1101 0100 imm4 Rn1 imm4 Rn2; add_asl imm4, Rn1, imm4, Rn2
5893 8.0xf7+8.0xd4+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::add_asl
5897 int dstreg1, dstreg2;
5901 dstreg1 = translate_rreg (SD_, RN1);
5902 dstreg2 = translate_rreg (SD_, RN2);
5904 State.regs[dstreg1] += EXTEND4 (IMM4A);
5905 State.regs[dstreg2] <<= IMM4;
5908 // 1111 0111 0000 0101 imm4 Rn1 Rm2 Rn2; cmp_add imm4, Rn1, Rm2, Rn2
5909 8.0xf7+8.0x05+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_add
5913 int srcreg2, dstreg1, dstreg2;
5916 srcreg2 = translate_rreg (SD_, RM2);
5917 dstreg1 = translate_rreg (SD_, RN1);
5918 dstreg2 = translate_rreg (SD_, RN2);
5920 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5921 State.regs[dstreg2] += State.regs[srcreg2];
5924 // 1111 0111 0001 0101 imm4 Rn1 imm4 Rn2; cmp_add imm4, Rn1, imm4, Rn2
5925 8.0xf7+8.0x15+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_add
5929 int dstreg1, dstreg2;
5932 dstreg1 = translate_rreg (SD_, RN1);
5933 dstreg2 = translate_rreg (SD_, RN2);
5935 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5936 State.regs[dstreg2] += EXTEND4 (IMM4);
5939 // 1111 0111 0010 0101 imm4 Rn1 Rm2 Rn2; cmp_sub imm4, Rn1, Rm2, Rn2
5940 8.0xf7+8.0x25+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_sub
5944 int srcreg2, dstreg1, dstreg2;
5947 srcreg2 = translate_rreg (SD_, RM2);
5948 dstreg1 = translate_rreg (SD_, RN1);
5949 dstreg2 = translate_rreg (SD_, RN2);
5951 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5952 State.regs[dstreg2] -= State.regs[srcreg2];
5955 // 1111 0111 0011 0101 imm4 Rn1 imm4 Rn2; cmp_sub imm4, Rn1, imm4, Rn2
5956 8.0xf7+8.0x35+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_sub
5960 int dstreg1, dstreg2;
5963 dstreg1 = translate_rreg (SD_, RN1);
5964 dstreg2 = translate_rreg (SD_, RN2);
5966 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5967 State.regs[dstreg2] -= EXTEND4 (IMM4);
5970 // 1111 0111 0110 0101 imm4 Rn1 Rm2 Rn2; cmp_mov imm4, Rn1, Rm2, Rn2
5971 8.0xf7+8.0x65+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_mov
5975 int srcreg2, dstreg1, dstreg2;
5978 srcreg2 = translate_rreg (SD_, RM2);
5979 dstreg1 = translate_rreg (SD_, RN1);
5980 dstreg2 = translate_rreg (SD_, RN2);
5982 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5983 State.regs[dstreg2] = State.regs[srcreg2];
5986 // 1111 0111 0111 0101 imm4 Rn1 imm4 Rn2; cmp_mov imm4, Rn1, imm4, Rn2
5987 8.0xf7+8.0x75+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_mov
5991 int dstreg1, dstreg2;
5994 dstreg1 = translate_rreg (SD_, RN1);
5995 dstreg2 = translate_rreg (SD_, RN2);
5997 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
5998 State.regs[dstreg2] = EXTEND4 (IMM4);
6001 // 1111 0111 1000 0101 imm4 Rn1 Rm2 Rn2; cmp_asr imm4, Rn1, Rm2, Rn2
6002 8.0xf7+8.0x85+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_asr
6006 int srcreg2, dstreg1, dstreg2;
6010 srcreg2 = translate_rreg (SD_, RM2);
6011 dstreg1 = translate_rreg (SD_, RN1);
6012 dstreg2 = translate_rreg (SD_, RN2);
6014 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6015 temp = State.regs[dstreg2];
6016 temp >>= State.regs[srcreg2];
6017 State.regs[dstreg2] = temp;
6020 // 1111 0111 1001 0101 imm4 Rn1 imm4 Rn2; cmp_asr imm4, Rn1, imm4, Rn2
6021 8.0xf7+8.0x95+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_asr
6025 int dstreg1, dstreg2;
6029 dstreg1 = translate_rreg (SD_, RN1);
6030 dstreg2 = translate_rreg (SD_, RN2);
6032 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6033 temp = State.regs[dstreg2];
6035 State.regs[dstreg2] = temp;
6038 // 1111 0111 1010 0101 imm4 Rn1 Rm2 Rn2; cmp_lsr imm4, Rn1, Rm2, Rn2
6039 8.0xf7+8.0xa5+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_lsr
6043 int srcreg2, dstreg1, dstreg2;
6046 srcreg2 = translate_rreg (SD_, RM2);
6047 dstreg1 = translate_rreg (SD_, RN1);
6048 dstreg2 = translate_rreg (SD_, RN2);
6050 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6051 State.regs[dstreg2] >>= State.regs[srcreg2];
6054 // 1111 0111 1011 0101 imm4 Rn1 imm4 Rn2; cmp_lsr imm4, Rn1, imm4, Rn2
6055 8.0xf7+8.0xb5+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_lsr
6059 int dstreg1, dstreg2;
6063 dstreg1 = translate_rreg (SD_, RN1);
6064 dstreg2 = translate_rreg (SD_, RN2);
6066 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6067 State.regs[dstreg2] >>= IMM4;
6071 // 1111 0111 1100 0101 imm4 Rn1 Rm2 Rn2; cmp_asl imm4, Rn1, Rm2, Rn2
6072 8.0xf7+8.0xc5+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::cmp_asl
6076 int srcreg2, dstreg1, dstreg2;
6079 srcreg2 = translate_rreg (SD_, RM2);
6080 dstreg1 = translate_rreg (SD_, RN1);
6081 dstreg2 = translate_rreg (SD_, RN2);
6083 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6084 State.regs[dstreg2] <<= State.regs[srcreg2];
6087 // 1111 0111 1101 0101 imm4 Rn1 imm4 Rn2; cmp_asl imm4, Rn1, imm4, Rn2
6088 8.0xf7+8.0xd5+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::cmp_asl
6092 int dstreg1, dstreg2;
6096 dstreg1 = translate_rreg (SD_, RN1);
6097 dstreg2 = translate_rreg (SD_, RN2);
6099 genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
6100 State.regs[dstreg2] <<= IMM4;
6103 // 1111 0111 0000 0110 imm4 Rn1 Rm2 Rn2; sub_add imm4, Rn1, Rm2, Rn2
6104 8.0xf7+8.0x06+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_add
6108 int srcreg2, dstreg1, dstreg2;
6111 srcreg2 = translate_rreg (SD_, RM2);
6112 dstreg1 = translate_rreg (SD_, RN1);
6113 dstreg2 = translate_rreg (SD_, RN2);
6115 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6116 State.regs[dstreg2] += State.regs[srcreg2];
6119 // 1111 0111 0001 0110 imm4 Rn1 imm4 Rn2; sub_add imm4, Rn1, imm4, Rn2
6120 8.0xf7+8.0x16+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_add
6124 int dstreg1, dstreg2;
6127 dstreg1 = translate_rreg (SD_, RN1);
6128 dstreg2 = translate_rreg (SD_, RN2);
6130 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6131 State.regs[dstreg2] += EXTEND4 (IMM4);
6134 // 1111 0111 0010 0110 imm4 Rn1 Rm2 Rn2; sub_sub imm4, Rn1, Rm2, Rn2
6135 8.0xf7+8.0x26+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_sub
6139 int srcreg2, dstreg1, dstreg2;
6142 srcreg2 = translate_rreg (SD_, RM2);
6143 dstreg1 = translate_rreg (SD_, RN1);
6144 dstreg2 = translate_rreg (SD_, RN2);
6146 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6147 State.regs[dstreg2] -= State.regs[srcreg2];
6150 // 1111 0111 0011 0110 imm4 Rn1 imm4 Rn2; sub_sub imm4, Rn1, imm4, Rn2
6151 8.0xf7+8.0x36+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_sub
6155 int dstreg1, dstreg2;
6158 dstreg1 = translate_rreg (SD_, RN1);
6159 dstreg2 = translate_rreg (SD_, RN2);
6161 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6162 State.regs[dstreg2] -= EXTEND4 (IMM4);
6165 // 1111 0111 0100 0110 imm4 Rn1 Rm2 Rn2; sub_cmp imm4, Rn1, Rm2, Rn2
6166 8.0xf7+8.0x46+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_cmp
6170 int srcreg2, dstreg1, dstreg2;
6173 srcreg2 = translate_rreg (SD_, RM2);
6174 dstreg1 = translate_rreg (SD_, RN1);
6175 dstreg2 = translate_rreg (SD_, RN2);
6177 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6178 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6181 // 1111 0111 0101 0110 imm4 Rn1 imm4 Rn2; sub_cmp imm4, Rn1, imm4, Rn2
6182 8.0xf7+8.0x56+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_cmp
6186 int dstreg1, dstreg2;
6189 dstreg1 = translate_rreg (SD_, RN1);
6190 dstreg2 = translate_rreg (SD_, RN2);
6192 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6193 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6196 // 1111 0111 0110 0110 imm4 Rn1 Rm2 Rn2; sub_mov imm4, Rn1, Rm2, Rn2
6197 8.0xf7+8.0x66+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_mov
6201 int srcreg2, dstreg1, dstreg2;
6204 srcreg2 = translate_rreg (SD_, RM2);
6205 dstreg1 = translate_rreg (SD_, RN1);
6206 dstreg2 = translate_rreg (SD_, RN2);
6208 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6209 State.regs[dstreg2] = State.regs[srcreg2];
6212 // 1111 0111 0111 0110 imm4 Rn1 imm4 Rn2; sub_mov imm4, Rn1, imm4, Rn2
6213 8.0xf7+8.0x76+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_mov
6217 int dstreg1, dstreg2;
6220 dstreg1 = translate_rreg (SD_, RN1);
6221 dstreg2 = translate_rreg (SD_, RN2);
6223 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6224 State.regs[dstreg2] = EXTEND4 (IMM4);
6227 // 1111 0111 1000 0110 imm4 Rn1 Rm2 Rn2; sub_asr imm4, Rn1, Rm2, Rn2
6228 8.0xf7+8.0x86+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_asr
6232 int srcreg2, dstreg1, dstreg2;
6236 srcreg2 = translate_rreg (SD_, RM2);
6237 dstreg1 = translate_rreg (SD_, RN1);
6238 dstreg2 = translate_rreg (SD_, RN2);
6240 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6241 temp = State.regs[dstreg2];
6242 temp >>= State.regs[srcreg2];
6243 State.regs[dstreg2] = temp;
6246 // 1111 0111 1001 0110 imm4 Rn1 imm4 Rn2; sub_asr imm4, Rn1, imm4, Rn2
6247 8.0xf7+8.0x96+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_asr
6251 int dstreg1, dstreg2;
6255 dstreg1 = translate_rreg (SD_, RN1);
6256 dstreg2 = translate_rreg (SD_, RN2);
6258 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6259 temp = State.regs[dstreg2];
6261 State.regs[dstreg2] = temp;
6264 // 1111 0111 1010 0110 imm4 Rn1 Rm2 Rn2; sub_lsr imm4, Rn1, Rm2, Rn2
6265 8.0xf7+8.0xa6+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_lsr
6269 int srcreg2, dstreg1, dstreg2;
6272 srcreg2 = translate_rreg (SD_, RM2);
6273 dstreg1 = translate_rreg (SD_, RN1);
6274 dstreg2 = translate_rreg (SD_, RN2);
6276 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6277 State.regs[dstreg2] >>= State.regs[srcreg2];
6280 // 1111 0111 1011 0110 imm4 Rn1 imm4 Rn2; sub_lsr imm4, Rn1, imm4, Rn2
6281 8.0xf7+8.0xb6+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_lsr
6285 int dstreg1, dstreg2;
6289 dstreg1 = translate_rreg (SD_, RN1);
6290 dstreg2 = translate_rreg (SD_, RN2);
6292 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6293 State.regs[dstreg2] >>= IMM4;
6297 // 1111 0111 1100 0110 imm4 Rn1 Rm2 Rn2; sub_asl imm4, Rn1, Rm2, Rn2
6298 8.0xf7+8.0xc6+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::sub_asl
6302 int srcreg2, dstreg1, dstreg2;
6305 srcreg2 = translate_rreg (SD_, RM2);
6306 dstreg1 = translate_rreg (SD_, RN1);
6307 dstreg2 = translate_rreg (SD_, RN2);
6309 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6310 State.regs[dstreg2] <<= State.regs[srcreg2];
6313 // 1111 0111 1101 0110 imm4 Rn1 imm4 Rn2; sub_asl imm4, Rn1, imm4, Rn2
6314 8.0xf7+8.0xd6+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::sub_asl
6318 int dstreg1, dstreg2;
6322 dstreg1 = translate_rreg (SD_, RN1);
6323 dstreg2 = translate_rreg (SD_, RN2);
6325 State.regs[dstreg1] -= EXTEND4 (IMM4A);
6326 State.regs[dstreg2] <<= IMM4;
6329 // 1111 0111 0000 0111 imm4 Rn1 Rm2 Rn2; mov_add imm4, Rn1, Rm2, Rn2
6330 8.0xf7+8.0x07+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_add
6334 int srcreg2, dstreg1, dstreg2;
6337 srcreg2 = translate_rreg (SD_, RM2);
6338 dstreg1 = translate_rreg (SD_, RN1);
6339 dstreg2 = translate_rreg (SD_, RN2);
6341 State.regs[dstreg1] = EXTEND4 (IMM4A);
6342 State.regs[dstreg2] += State.regs[srcreg2];
6345 // 1111 0111 0001 0111 imm4 Rn1 imm4 Rn2; mov_add imm4, Rn1, imm4, Rn2
6346 8.0xf7+8.0x17+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_add
6350 int dstreg1, dstreg2;
6353 dstreg1 = translate_rreg (SD_, RN1);
6354 dstreg2 = translate_rreg (SD_, RN2);
6356 State.regs[dstreg1] = EXTEND4 (IMM4A);
6357 State.regs[dstreg2] += EXTEND4 (IMM4);
6360 // 1111 0111 0010 0111 imm4 Rn1 Rm2 Rn2; mov_sub imm4, Rn1, Rm2, Rn2
6361 8.0xf7+8.0x27+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_sub
6365 int srcreg2, dstreg1, dstreg2;
6368 srcreg2 = translate_rreg (SD_, RM2);
6369 dstreg1 = translate_rreg (SD_, RN1);
6370 dstreg2 = translate_rreg (SD_, RN2);
6372 State.regs[dstreg1] = EXTEND4 (IMM4A);
6373 State.regs[dstreg2] -= State.regs[srcreg2];
6376 // 1111 0111 0011 0111 imm4 Rn1 imm4 Rn2; mov_sub imm4, Rn1, imm4, Rn2
6377 8.0xf7+8.0x37+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_sub
6381 int dstreg1, dstreg2;
6384 dstreg1 = translate_rreg (SD_, RN1);
6385 dstreg2 = translate_rreg (SD_, RN2);
6387 State.regs[dstreg1] = EXTEND4 (IMM4A);
6388 State.regs[dstreg2] -= EXTEND4 (IMM4);
6391 // 1111 0111 0100 0111 imm4 Rn1 Rm2 Rn2; mov_cmp imm4, Rn1, Rm2, Rn2
6392 8.0xf7+8.0x47+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_cmp
6396 int srcreg2, dstreg1, dstreg2;
6399 srcreg2 = translate_rreg (SD_, RM2);
6400 dstreg1 = translate_rreg (SD_, RN1);
6401 dstreg2 = translate_rreg (SD_, RN2);
6403 State.regs[dstreg1] = EXTEND4 (IMM4A);
6404 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6407 // 1111 0111 0101 0111 imm4 Rn1 imm4 Rn2; mov_cmp imm4, Rn1, imm4, Rn2
6408 8.0xf7+8.0x57+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_cmp
6412 int dstreg1, dstreg2;
6415 dstreg1 = translate_rreg (SD_, RN1);
6416 dstreg2 = translate_rreg (SD_, RN2);
6418 State.regs[dstreg1] = EXTEND4 (IMM4A);
6419 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6422 // 1111 0111 0110 0111 imm4 Rn1 Rm2 Rn2; mov_mov imm4, Rn1, Rm2, Rn2
6423 8.0xf7+8.0x67+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_mov
6427 int srcreg2, dstreg1, dstreg2;
6430 srcreg2 = translate_rreg (SD_, RM2);
6431 dstreg1 = translate_rreg (SD_, RN1);
6432 dstreg2 = translate_rreg (SD_, RN2);
6434 State.regs[dstreg1] = EXTEND4 (IMM4A);
6435 State.regs[dstreg2] = State.regs[srcreg2];
6438 // 1111 0111 0111 0111 imm4 Rn1 imm4 Rn2; mov_mov imm4, Rn1, imm4, Rn2
6439 8.0xf7+8.0x77+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_mov
6443 int dstreg1, dstreg2;
6446 dstreg1 = translate_rreg (SD_, RN1);
6447 dstreg2 = translate_rreg (SD_, RN2);
6449 State.regs[dstreg1] = EXTEND4 (IMM4A);
6450 State.regs[dstreg2] = EXTEND4 (IMM4);
6453 // 1111 0111 1000 0111 imm4 Rn1 Rm2 Rn2; mov_asr imm4, Rn1, Rm2, Rn2
6454 8.0xf7+8.0x87+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_asr
6458 int srcreg2, dstreg1, dstreg2;
6462 srcreg2 = translate_rreg (SD_, RM2);
6463 dstreg1 = translate_rreg (SD_, RN1);
6464 dstreg2 = translate_rreg (SD_, RN2);
6466 State.regs[dstreg1] = EXTEND4 (IMM4A);
6467 temp = State.regs[dstreg2];
6468 temp >>= State.regs[srcreg2];
6469 State.regs[dstreg2] = temp;
6472 // 1111 0111 1001 0111 imm4 Rn1 imm4 Rn2; mov_asr imm4, Rn1, imm4, Rn2
6473 8.0xf7+8.0x97+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_asr
6477 int dstreg1, dstreg2;
6481 dstreg1 = translate_rreg (SD_, RN1);
6482 dstreg2 = translate_rreg (SD_, RN2);
6484 State.regs[dstreg1] = EXTEND4 (IMM4A);
6485 temp = State.regs[dstreg2];
6487 State.regs[dstreg2] = temp;
6490 // 1111 0111 1010 0111 imm4 Rn1 Rm2 Rn2; mov_lsr imm4, Rn1, Rm2, Rn2
6491 8.0xf7+8.0xa7+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_lsr
6495 int srcreg2, dstreg1, dstreg2;
6498 srcreg2 = translate_rreg (SD_, RM2);
6499 dstreg1 = translate_rreg (SD_, RN1);
6500 dstreg2 = translate_rreg (SD_, RN2);
6502 State.regs[dstreg1] = EXTEND4 (IMM4A);
6503 State.regs[dstreg2] >>= State.regs[srcreg2];
6506 // 1111 0111 1011 0111 imm4 Rn1 imm4 Rn2; mov_lsr imm4, Rn1, imm4, Rn2
6507 8.0xf7+8.0xb7+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_lsr
6511 int dstreg1, dstreg2;
6515 dstreg1 = translate_rreg (SD_, RN1);
6516 dstreg2 = translate_rreg (SD_, RN2);
6518 State.regs[dstreg1] = EXTEND4 (IMM4A);
6519 State.regs[dstreg2] >>= IMM4;
6523 // 1111 0111 1100 0111 imm4 Rn1 Rm2 Rn2; mov_asl imm4, Rn1, Rm2, Rn2
6524 8.0xf7+8.0xc7+4.IMM4A,4.RN1+4.RM2,4.RN2:D2c:::mov_asl
6528 int srcreg2, dstreg1, dstreg2;
6531 srcreg2 = translate_rreg (SD_, RM2);
6532 dstreg1 = translate_rreg (SD_, RN1);
6533 dstreg2 = translate_rreg (SD_, RN2);
6535 State.regs[dstreg1] = EXTEND4 (IMM4A);
6536 State.regs[dstreg2] <<= State.regs[srcreg2];
6539 // 1111 0111 1101 0111 imm4 Rn1 imm4 Rn2; mov_asl imm4, Rn1, imm4, Rn2
6540 8.0xf7+8.0xd7+4.IMM4A,4.RN1+4.IMM4,4.RN2:D2d:::mov_asl
6544 int dstreg1, dstreg2;
6548 dstreg1 = translate_rreg (SD_, RN1);
6549 dstreg2 = translate_rreg (SD_, RN2);
6551 State.regs[dstreg1] = EXTEND4 (IMM4A);
6552 State.regs[dstreg2] <<= IMM4;
6555 // 1111 0111 0000 1000 Rm1 Rn1 Rm2 Rn2; and_add Rm1, Rn1, Rm2, Rn2
6556 8.0xf7+8.0x08+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_add
6560 int srcreg1, srcreg2, dstreg1, dstreg2;
6563 srcreg1 = translate_rreg (SD_, RM1);
6564 srcreg2 = translate_rreg (SD_, RM2);
6565 dstreg1 = translate_rreg (SD_, RN1);
6566 dstreg2 = translate_rreg (SD_, RN2);
6568 State.regs[dstreg1] &= State.regs[srcreg1];
6569 State.regs[dstreg2] += State.regs[srcreg2];
6572 // 1111 0111 0001 1000 Rm1 Rn1 imm4 Rn2; and_add Rm1, Rn1, imm4, Rn2
6573 8.0xf7+8.0x18+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_add
6577 int srcreg1, dstreg1, dstreg2;
6580 srcreg1 = translate_rreg (SD_, RM1);
6581 dstreg1 = translate_rreg (SD_, RN1);
6582 dstreg2 = translate_rreg (SD_, RN2);
6584 State.regs[dstreg1] &= State.regs[srcreg1];
6585 State.regs[dstreg2] += EXTEND4 (IMM4);
6588 // 1111 0111 0010 1000 Rm1 Rn1 Rm2 Rn2; and_sub Rm1, Rn1, Rm2, Rn2
6589 8.0xf7+8.0x28+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_sub
6593 int srcreg1, srcreg2, dstreg1, dstreg2;
6596 srcreg1 = translate_rreg (SD_, RM1);
6597 srcreg2 = translate_rreg (SD_, RM2);
6598 dstreg1 = translate_rreg (SD_, RN1);
6599 dstreg2 = translate_rreg (SD_, RN2);
6601 State.regs[dstreg1] &= State.regs[srcreg1];
6602 State.regs[dstreg2] -= State.regs[srcreg2];
6605 // 1111 0111 0011 1000 Rm1 Rn1 imm4 Rn2; and_sub Rm1, Rn1, imm4, Rn2
6606 8.0xf7+8.0x38+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_sub
6610 int srcreg1, dstreg1, dstreg2;
6613 srcreg1 = translate_rreg (SD_, RM1);
6614 dstreg1 = translate_rreg (SD_, RN1);
6615 dstreg2 = translate_rreg (SD_, RN2);
6617 State.regs[dstreg1] &= State.regs[srcreg1];
6618 State.regs[dstreg2] -= EXTEND4 (IMM4);
6621 // 1111 0111 0100 1000 Rm1 Rn1 Rm2 Rn2; and_cmp Rm1, Rn1, Rm2, Rn2
6622 8.0xf7+8.0x48+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_cmp
6626 int srcreg1, srcreg2, dstreg1, dstreg2;
6629 srcreg1 = translate_rreg (SD_, RM1);
6630 srcreg2 = translate_rreg (SD_, RM2);
6631 dstreg1 = translate_rreg (SD_, RN1);
6632 dstreg2 = translate_rreg (SD_, RN2);
6634 State.regs[dstreg1] &= State.regs[srcreg1];
6635 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6638 // 1111 0111 0101 1000 Rm1 Rn1 imm4 Rn2; and_cmp Rm1, Rn1, imm4, Rn2
6639 8.0xf7+8.0x58+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_cmp
6643 int srcreg1, dstreg1, dstreg2;
6646 srcreg1 = translate_rreg (SD_, RM1);
6647 dstreg1 = translate_rreg (SD_, RN1);
6648 dstreg2 = translate_rreg (SD_, RN2);
6650 State.regs[dstreg1] &= State.regs[srcreg1];
6651 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6654 // 1111 0111 0110 1000 Rm1 Rn1 Rm2 Rn2; and_mov Rm1, Rn1, Rm2, Rn2
6655 8.0xf7+8.0x68+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_mov
6659 int srcreg1, srcreg2, dstreg1, dstreg2;
6662 srcreg1 = translate_rreg (SD_, RM1);
6663 srcreg2 = translate_rreg (SD_, RM2);
6664 dstreg1 = translate_rreg (SD_, RN1);
6665 dstreg2 = translate_rreg (SD_, RN2);
6667 State.regs[dstreg1] &= State.regs[srcreg1];
6668 State.regs[dstreg2] = State.regs[srcreg2];
6671 // 1111 0111 0111 1000 Rm1 Rn1 imm4 Rn2; and_mov Rm1, Rn1, imm4, Rn2
6672 8.0xf7+8.0x78+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_mov
6676 int srcreg1, dstreg1, dstreg2;
6679 srcreg1 = translate_rreg (SD_, RM1);
6680 dstreg1 = translate_rreg (SD_, RN1);
6681 dstreg2 = translate_rreg (SD_, RN2);
6683 State.regs[dstreg1] &= State.regs[srcreg1];
6684 State.regs[dstreg2] = EXTEND4 (IMM4);
6687 // 1111 0111 1000 1000 Rm1 Rn1 Rm2 Rn2; and_asr Rm1, Rn1, Rm2, Rn2
6688 8.0xf7+8.0x88+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_asr
6692 int srcreg1, srcreg2, dstreg1, dstreg2;
6696 srcreg1 = translate_rreg (SD_, RM1);
6697 srcreg2 = translate_rreg (SD_, RM2);
6698 dstreg1 = translate_rreg (SD_, RN1);
6699 dstreg2 = translate_rreg (SD_, RN2);
6701 State.regs[dstreg1] &= State.regs[srcreg1];
6702 temp = State.regs[dstreg2];
6703 temp >>= State.regs[srcreg2];
6704 State.regs[dstreg2] = temp;
6707 // 1111 0111 1001 1000 Rm1 Rn1 imm4 Rn2; and_asr Rm1, Rn1, imm4, Rn2
6708 8.0xf7+8.0x98+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_asr
6712 int srcreg1, dstreg1, dstreg2;
6716 srcreg1 = translate_rreg (SD_, RM1);
6717 dstreg1 = translate_rreg (SD_, RN1);
6718 dstreg2 = translate_rreg (SD_, RN2);
6720 State.regs[dstreg1] &= State.regs[srcreg1];
6721 temp = State.regs[dstreg2];
6723 State.regs[dstreg2] = temp;
6726 // 1111 0111 1010 1000 Rm1 Rn1 Rm2 Rn2; and_lsr Rm1, Rn1, Rm2, Rn2
6727 8.0xf7+8.0xa8+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_lsr
6731 int srcreg1, srcreg2, dstreg1, dstreg2;
6734 srcreg1 = translate_rreg (SD_, RM1);
6735 srcreg2 = translate_rreg (SD_, RM2);
6736 dstreg1 = translate_rreg (SD_, RN1);
6737 dstreg2 = translate_rreg (SD_, RN2);
6739 State.regs[dstreg1] &= State.regs[srcreg1];
6740 State.regs[dstreg2] >>= State.regs[srcreg2];
6743 // 1111 0111 1011 1000 Rm1 Rn1 imm4 Rn2; and_lsr Rm1, Rn1, imm4, Rn2
6744 8.0xf7+8.0xb8+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_lsr
6748 int srcreg1, dstreg1, dstreg2;
6752 srcreg1 = translate_rreg (SD_, RM1);
6753 dstreg1 = translate_rreg (SD_, RN1);
6754 dstreg2 = translate_rreg (SD_, RN2);
6756 State.regs[dstreg1] &= State.regs[srcreg1];
6757 State.regs[dstreg2] >>= IMM4;
6761 // 1111 0111 1100 1000 Rm1 Rn1 Rm2 Rn2; and_asl Rm1, Rn1, Rm2, Rn2
6762 8.0xf7+8.0xc8+4.RM1,4.RN1+4.RM2,4.RN2:D2:::and_asl
6766 int srcreg1, srcreg2, dstreg1, dstreg2;
6769 srcreg1 = translate_rreg (SD_, RM1);
6770 srcreg2 = translate_rreg (SD_, RM2);
6771 dstreg1 = translate_rreg (SD_, RN1);
6772 dstreg2 = translate_rreg (SD_, RN2);
6774 State.regs[dstreg1] &= State.regs[srcreg1];
6775 State.regs[dstreg2] <<= State.regs[srcreg2];
6778 // 1111 0111 1101 1000 Rm1 Rn1 imm4 Rn2; and_asl Rm1, Rn1, imm4, Rn2
6779 8.0xf7+8.0xd8+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::and_asl
6783 int srcreg1, dstreg1, dstreg2;
6787 srcreg1 = translate_rreg (SD_, RM1);
6788 dstreg1 = translate_rreg (SD_, RN1);
6789 dstreg2 = translate_rreg (SD_, RN2);
6791 State.regs[dstreg1] &= State.regs[srcreg1];
6792 State.regs[dstreg2] <<= IMM4;
6795 // 1111 0111 0000 1001 Rm1 Rn1 Rm2 Rn2; dmach_add Rm1, Rn1, Rm2, Rn2
6796 8.0xf7+8.0x09+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_add
6800 int srcreg1, srcreg2, dstreg1, dstreg2;
6801 long temp, temp2, sum;
6804 srcreg1 = translate_rreg (SD_, RM1);
6805 srcreg2 = translate_rreg (SD_, RM2);
6806 dstreg1 = translate_rreg (SD_, RN1);
6807 dstreg2 = translate_rreg (SD_, RN2);
6809 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6810 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6811 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6812 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6813 sum = temp + temp2 + State.regs[REG_MCRL];
6815 State.regs[dstreg1] = sum;
6816 State.regs[dstreg2] += State.regs[srcreg2];
6819 // 1111 0111 0001 1001 Rm1 Rn1 imm4 Rn2; dmach_add Rm1, Rn1, imm4, Rn2
6820 8.0xf7+8.0x19+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_add
6824 int srcreg1, dstreg1, dstreg2;
6825 long temp, temp2, sum;
6828 srcreg1 = translate_rreg (SD_, RM1);
6829 dstreg1 = translate_rreg (SD_, RN1);
6830 dstreg2 = translate_rreg (SD_, RN2);
6832 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6833 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6834 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6835 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6836 sum = temp + temp2 + State.regs[REG_MCRL];
6838 State.regs[dstreg1] = sum;
6839 State.regs[dstreg2] += EXTEND4 (IMM4);
6842 // 1111 0111 0010 1001 Rm1 Rn1 Rm2 Rn2; dmach_sub Rm1, Rn1, Rm2, Rn2
6843 8.0xf7+8.0x29+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_sub
6847 int srcreg1, srcreg2, dstreg1, dstreg2;
6848 long temp, temp2, sum;
6851 srcreg1 = translate_rreg (SD_, RM1);
6852 srcreg2 = translate_rreg (SD_, RM2);
6853 dstreg1 = translate_rreg (SD_, RN1);
6854 dstreg2 = translate_rreg (SD_, RN2);
6856 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6857 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6858 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6859 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6860 sum = temp + temp2 + State.regs[REG_MCRL];
6862 State.regs[dstreg1] = sum;
6863 State.regs[dstreg2] -= State.regs[srcreg2];
6866 // 1111 0111 0011 1001 Rm1 Rn1 imm4 Rn2; dmach_sub Rm1, Rn1, imm4, Rn2
6867 8.0xf7+8.0x39+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_sub
6871 int srcreg1, dstreg1, dstreg2;
6872 long temp, temp2, sum;
6875 srcreg1 = translate_rreg (SD_, RM1);
6876 dstreg1 = translate_rreg (SD_, RN1);
6877 dstreg2 = translate_rreg (SD_, RN2);
6879 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6880 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6881 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6882 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6883 sum = temp + temp2 + State.regs[REG_MCRL];
6885 State.regs[dstreg1] = sum;
6886 State.regs[dstreg2] -= EXTEND4 (IMM4);
6889 // 1111 0111 0100 1001 Rm1 Rn1 Rm2 Rn2; dmach_cmp Rm1, Rn1, Rm2, Rn2
6890 8.0xf7+8.0x49+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_cmp
6894 int srcreg1, srcreg2, dstreg1, dstreg2;
6895 long temp, temp2, sum;
6898 srcreg1 = translate_rreg (SD_, RM1);
6899 srcreg2 = translate_rreg (SD_, RM2);
6900 dstreg1 = translate_rreg (SD_, RN1);
6901 dstreg2 = translate_rreg (SD_, RN2);
6903 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6904 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6905 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6906 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6907 sum = temp + temp2 + State.regs[REG_MCRL];
6909 State.regs[dstreg1] = sum;
6910 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
6913 // 1111 0111 0101 1001 Rm1 Rn1 imm4 Rn2; dmach_cmp Rm1, Rn1, imm4, Rn2
6914 8.0xf7+8.0x59+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_cmp
6918 int srcreg1, dstreg1, dstreg2;
6919 long temp, temp2, sum;
6922 srcreg1 = translate_rreg (SD_, RM1);
6923 dstreg1 = translate_rreg (SD_, RN1);
6924 dstreg2 = translate_rreg (SD_, RN2);
6926 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6927 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6928 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6929 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6930 sum = temp + temp2 + State.regs[REG_MCRL];
6932 State.regs[dstreg1] = sum;
6933 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
6936 // 1111 0111 0110 1001 Rm1 Rn1 Rm2 Rn2; dmach_mov Rm1, Rn1, Rm2, Rn2
6937 8.0xf7+8.0x69+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_mov
6941 int srcreg1, srcreg2, dstreg1, dstreg2;
6942 long temp, temp2, sum;
6945 srcreg1 = translate_rreg (SD_, RM1);
6946 srcreg2 = translate_rreg (SD_, RM2);
6947 dstreg1 = translate_rreg (SD_, RN1);
6948 dstreg2 = translate_rreg (SD_, RN2);
6950 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6951 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6952 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6953 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6954 sum = temp + temp2 + State.regs[REG_MCRL];
6956 State.regs[dstreg1] = sum;
6957 State.regs[dstreg2] = State.regs[srcreg2];
6960 // 1111 0111 0111 1001 Rm1 Rn1 imm4 Rn2; dmach_mov Rm1, Rn1, imm4, Rn2
6961 8.0xf7+8.0x79+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_mov
6965 int srcreg1, dstreg1, dstreg2;
6966 long temp, temp2, sum;
6969 srcreg1 = translate_rreg (SD_, RM1);
6970 dstreg1 = translate_rreg (SD_, RN1);
6971 dstreg2 = translate_rreg (SD_, RN2);
6973 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6974 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6975 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
6976 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
6977 sum = temp + temp2 + State.regs[REG_MCRL];
6979 State.regs[dstreg1] = sum;
6980 State.regs[dstreg2] = EXTEND4 (IMM4);
6983 // 1111 0111 1000 1001 Rm1 Rn1 Rm2 Rn2; dmach_asr Rm1, Rn1, Rm2, Rn2
6984 8.0xf7+8.0x89+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_asr
6988 int srcreg1, srcreg2, dstreg1, dstreg2;
6989 long temp, temp2, sum;
6992 srcreg1 = translate_rreg (SD_, RM1);
6993 srcreg2 = translate_rreg (SD_, RM2);
6994 dstreg1 = translate_rreg (SD_, RN1);
6995 dstreg2 = translate_rreg (SD_, RN2);
6997 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
6998 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
6999 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7000 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7001 sum = temp + temp2 + State.regs[REG_MCRL];
7003 State.regs[dstreg1] = sum;
7004 temp = State.regs[dstreg2];
7005 temp >>= State.regs[srcreg2];
7006 State.regs[dstreg2] = temp;
7009 // 1111 0111 1001 1001 Rm1 Rn1 imm4 Rn2; dmach_asr Rm1, Rn1, imm4, Rn2
7010 8.0xf7+8.0x99+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_asr
7014 int srcreg1, dstreg1, dstreg2;
7015 long temp, temp2, sum;
7018 srcreg1 = translate_rreg (SD_, RM1);
7019 dstreg1 = translate_rreg (SD_, RN1);
7020 dstreg2 = translate_rreg (SD_, RN2);
7022 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7023 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7024 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7025 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7026 sum = temp + temp2 + State.regs[REG_MCRL];
7028 State.regs[dstreg1] = sum;
7029 temp = State.regs[dstreg2];
7031 State.regs[dstreg2] = temp;
7034 // 1111 0111 1010 1001 Rm1 Rn1 Rm2 Rn2; dmach_lsr Rm1, Rn1, Rm2, Rn2
7035 8.0xf7+8.0xa9+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_lsr
7039 int srcreg1, srcreg2, dstreg1, dstreg2;
7040 long temp, temp2, sum;
7043 srcreg1 = translate_rreg (SD_, RM1);
7044 srcreg2 = translate_rreg (SD_, RM2);
7045 dstreg1 = translate_rreg (SD_, RN1);
7046 dstreg2 = translate_rreg (SD_, RN2);
7048 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7049 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7050 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7051 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7052 sum = temp + temp2 + State.regs[REG_MCRL];
7054 State.regs[dstreg1] = sum;
7055 State.regs[dstreg2] >>= State.regs[srcreg2];
7058 // 1111 0111 1011 1001 Rm1 Rn1 imm4 Rn2; dmach_lsr Rm1, Rn1, imm4, Rn2
7059 8.0xf7+8.0xb9+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_lsr
7063 int srcreg1, dstreg1, dstreg2;
7064 long temp, temp2, sum;
7067 srcreg1 = translate_rreg (SD_, RM1);
7068 dstreg1 = translate_rreg (SD_, RN1);
7069 dstreg2 = translate_rreg (SD_, RN2);
7071 State.regs[dstreg2] >>= IMM4;
7075 // 1111 0111 1100 1001 Rm1 Rn1 Rm2 Rn2; dmach_asl Rm1, Rn1, Rm2, Rn2
7076 8.0xf7+8.0xc9+4.RM1,4.RN1+4.RM2,4.RN2:D2:::dmach_asl
7080 int srcreg1, srcreg2, dstreg1, dstreg2;
7081 long temp, temp2, sum;
7084 srcreg1 = translate_rreg (SD_, RM1);
7085 srcreg2 = translate_rreg (SD_, RM2);
7086 dstreg1 = translate_rreg (SD_, RN1);
7087 dstreg2 = translate_rreg (SD_, RN2);
7089 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7090 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7091 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7092 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7093 sum = temp + temp2 + State.regs[REG_MCRL];
7095 State.regs[dstreg1] = sum;
7096 State.regs[dstreg2] <<= State.regs[srcreg2];
7099 // 1111 0111 1101 1001 Rm1 Rn1 imm4 Rn2; dmach_asl Rm1, Rn1, imm4, Rn2
7100 8.0xf7+8.0xd9+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::dmach_asl
7104 int srcreg1, dstreg1, dstreg2;
7105 long temp, temp2, sum;
7108 srcreg1 = translate_rreg (SD_, RM1);
7109 dstreg1 = translate_rreg (SD_, RN1);
7110 dstreg2 = translate_rreg (SD_, RN2);
7112 temp = ((signed32)(signed16)(State.regs[dstreg1] & 0xffff)
7113 * (signed32)(signed16)(State.regs[srcreg1] & 0xffff));
7114 temp2 = ((signed32)(signed16)((State.regs[srcreg1] >> 16) & 0xffff)
7115 * (signed32)(signed16)((State.regs[dstreg1] >> 16) & 0xffff));
7116 sum = temp + temp2 + State.regs[REG_MCRL];
7118 State.regs[dstreg1] = sum;
7119 State.regs[dstreg2] <<= IMM4;
7122 // 1111 0111 0000 1010 Rm1 Rn1 Rm2 Rn2; xor_add Rm1, Rn1, Rm2, Rn2
7123 8.0xf7+8.0x0a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_add
7127 int srcreg1, srcreg2, dstreg1, dstreg2;
7130 srcreg1 = translate_rreg (SD_, RM1);
7131 srcreg2 = translate_rreg (SD_, RM2);
7132 dstreg1 = translate_rreg (SD_, RN1);
7133 dstreg2 = translate_rreg (SD_, RN2);
7135 State.regs[dstreg1] ^= State.regs[srcreg1];
7136 State.regs[dstreg2] += State.regs[srcreg2];
7139 // 1111 0111 0001 1010 Rm1 Rn1 imm4 Rn2; xor_add Rm1, Rn1, imm4, Rn2
7140 8.0xf7+8.0x1a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_add
7144 int srcreg1, dstreg1, dstreg2;
7147 srcreg1 = translate_rreg (SD_, RM1);
7148 dstreg1 = translate_rreg (SD_, RN1);
7149 dstreg2 = translate_rreg (SD_, RN2);
7151 State.regs[dstreg1] ^= State.regs[srcreg1];
7152 State.regs[dstreg2] += EXTEND4 (IMM4);
7155 // 1111 0111 0010 1010 Rm1 Rn1 Rm2 Rn2; xor_sub Rm1, Rn1, Rm2, Rn2
7156 8.0xf7+8.0x2a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_sub
7160 int srcreg1, srcreg2, dstreg1, dstreg2;
7163 srcreg1 = translate_rreg (SD_, RM1);
7164 srcreg2 = translate_rreg (SD_, RM2);
7165 dstreg1 = translate_rreg (SD_, RN1);
7166 dstreg2 = translate_rreg (SD_, RN2);
7168 State.regs[dstreg1] ^= State.regs[srcreg1];
7169 State.regs[dstreg2] -= State.regs[srcreg2];
7172 // 1111 0111 0011 1010 Rm1 Rn1 imm4 Rn2; xor_sub Rm1, Rn1, imm4, Rn2
7173 8.0xf7+8.0x3a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_sub
7177 int srcreg1, dstreg1, dstreg2;
7180 srcreg1 = translate_rreg (SD_, RM1);
7181 dstreg1 = translate_rreg (SD_, RN1);
7182 dstreg2 = translate_rreg (SD_, RN2);
7184 State.regs[dstreg1] ^= State.regs[srcreg1];
7185 State.regs[dstreg2] -= EXTEND4 (IMM4);
7188 // 1111 0111 0100 1010 Rm1 Rn1 Rm2 Rn2; xor_cmp Rm1, Rn1, Rm2, Rn2
7189 8.0xf7+8.0x4a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_cmp
7193 int srcreg1, srcreg2, dstreg1, dstreg2;
7196 srcreg1 = translate_rreg (SD_, RM1);
7197 srcreg2 = translate_rreg (SD_, RM2);
7198 dstreg1 = translate_rreg (SD_, RN1);
7199 dstreg2 = translate_rreg (SD_, RN2);
7201 State.regs[dstreg1] ^= State.regs[srcreg1];
7202 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7205 // 1111 0111 0101 1010 Rm1 Rn1 imm4 Rn2; xor_cmp Rm1, Rn1, imm4, Rn2
7206 8.0xf7+8.0x5a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_cmp
7210 int srcreg1, dstreg1, dstreg2;
7213 srcreg1 = translate_rreg (SD_, RM1);
7214 dstreg1 = translate_rreg (SD_, RN1);
7215 dstreg2 = translate_rreg (SD_, RN2);
7217 State.regs[dstreg1] ^= State.regs[srcreg1];
7218 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7221 // 1111 0111 0110 1010 Rm1 Rn1 Rm2 Rn2; xor_mov Rm1, Rn1, Rm2, Rn2
7222 8.0xf7+8.0x6a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_mov
7226 int srcreg1, srcreg2, dstreg1, dstreg2;
7229 srcreg1 = translate_rreg (SD_, RM1);
7230 srcreg2 = translate_rreg (SD_, RM2);
7231 dstreg1 = translate_rreg (SD_, RN1);
7232 dstreg2 = translate_rreg (SD_, RN2);
7234 State.regs[dstreg1] ^= State.regs[srcreg1];
7235 State.regs[dstreg2] = State.regs[srcreg2];
7238 // 1111 0111 0111 1010 Rm1 Rn1 imm4 Rn2; xor_mov Rm1, Rn1, imm4, Rn2
7239 8.0xf7+8.0x7a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_mov
7243 int srcreg1, dstreg1, dstreg2;
7246 srcreg1 = translate_rreg (SD_, RM1);
7247 dstreg1 = translate_rreg (SD_, RN1);
7248 dstreg2 = translate_rreg (SD_, RN2);
7250 State.regs[dstreg1] ^= State.regs[srcreg1];
7251 State.regs[dstreg2] = EXTEND4 (IMM4);
7254 // 1111 0111 1000 1010 Rm1 Rn1 Rm2 Rn2; xor_asr Rm1, Rn1, Rm2, Rn2
7255 8.0xf7+8.0x8a+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_asr
7259 int srcreg1, srcreg2, dstreg1, dstreg2;
7263 srcreg1 = translate_rreg (SD_, RM1);
7264 srcreg2 = translate_rreg (SD_, RM2);
7265 dstreg1 = translate_rreg (SD_, RN1);
7266 dstreg2 = translate_rreg (SD_, RN2);
7268 State.regs[dstreg1] ^= State.regs[srcreg1];
7269 temp = State.regs[dstreg2];
7270 temp >>= State.regs[srcreg2];
7271 State.regs[dstreg2] = temp;
7274 // 1111 0111 1001 1010 Rm1 Rn1 imm4 Rn2; xor_asr Rm1, Rn1, imm4, Rn2
7275 8.0xf7+8.0x9a+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_asr
7279 int srcreg1, dstreg1, dstreg2;
7283 srcreg1 = translate_rreg (SD_, RM1);
7284 dstreg1 = translate_rreg (SD_, RN1);
7285 dstreg2 = translate_rreg (SD_, RN2);
7287 State.regs[dstreg1] ^= State.regs[srcreg1];
7288 temp = State.regs[dstreg2];
7290 State.regs[dstreg2] = temp;
7293 // 1111 0111 1010 1010 Rm1 Rn1 Rm2 Rn2; xor_lsr Rm1, Rn1, Rm2, Rn2
7294 8.0xf7+8.0xaa+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_lsr
7298 int srcreg1, srcreg2, dstreg1, dstreg2;
7301 srcreg1 = translate_rreg (SD_, RM1);
7302 srcreg2 = translate_rreg (SD_, RM2);
7303 dstreg1 = translate_rreg (SD_, RN1);
7304 dstreg2 = translate_rreg (SD_, RN2);
7306 State.regs[dstreg1] ^= State.regs[srcreg1];
7307 State.regs[dstreg2] >>= State.regs[srcreg2];
7310 // 1111 0111 1011 1010 Rm1 Rn1 imm4 Rn2; xor_lsr Rm1, Rn1, imm4, Rn2
7311 8.0xf7+8.0xba+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_lsr
7315 int srcreg1, dstreg1, dstreg2;
7319 srcreg1 = translate_rreg (SD_, RM1);
7320 dstreg1 = translate_rreg (SD_, RN1);
7321 dstreg2 = translate_rreg (SD_, RN2);
7323 State.regs[dstreg1] ^= State.regs[srcreg1];
7324 State.regs[dstreg2] >>= IMM4;
7328 // 1111 0111 1100 1010 Rm1 Rn1 Rm2 Rn2; xor_asl Rm1, Rn1, Rm2, Rn2
7329 8.0xf7+8.0xca+4.RM1,4.RN1+4.RM2,4.RN2:D2:::xor_asl
7333 int srcreg1, srcreg2, dstreg1, dstreg2;
7336 srcreg1 = translate_rreg (SD_, RM1);
7337 srcreg2 = translate_rreg (SD_, RM2);
7338 dstreg1 = translate_rreg (SD_, RN1);
7339 dstreg2 = translate_rreg (SD_, RN2);
7341 State.regs[dstreg1] ^= State.regs[srcreg1];
7342 State.regs[dstreg2] <<= State.regs[srcreg2];
7345 // 1111 0111 1101 1010 Rm1 Rn1 imm4 Rn2; xor_asl Rm1, Rn1, imm4, Rn2
7346 8.0xf7+8.0xda+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::xor_asl
7350 int srcreg1, dstreg1, dstreg2;
7354 srcreg1 = translate_rreg (SD_, RM1);
7355 dstreg1 = translate_rreg (SD_, RN1);
7356 dstreg2 = translate_rreg (SD_, RN2);
7358 State.regs[dstreg1] ^= State.regs[srcreg1];
7359 State.regs[dstreg2] <<= IMM4;
7362 // 1111 0111 0000 1011 Rm1 Rn1 Rm2 Rn2; swhw_add Rm1, Rn1, Rm2, Rn2
7363 8.0xf7+8.0x0b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_add
7367 int srcreg1, srcreg2, dstreg1, dstreg2;
7370 srcreg1 = translate_rreg (SD_, RM1);
7371 srcreg2 = translate_rreg (SD_, RM2);
7372 dstreg1 = translate_rreg (SD_, RN1);
7373 dstreg2 = translate_rreg (SD_, RN2);
7375 State.regs[dstreg1] ^= State.regs[srcreg1];
7376 State.regs[dstreg2] += State.regs[srcreg2];
7379 // 1111 0111 0001 1011 Rm1 Rn1 imm4 Rn2; swhw_add Rm1, Rn1, imm4, Rn2
7380 8.0xf7+8.0x1b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_add
7384 int srcreg1, dstreg1, dstreg2;
7387 srcreg1 = translate_rreg (SD_, RM1);
7388 dstreg1 = translate_rreg (SD_, RN1);
7389 dstreg2 = translate_rreg (SD_, RN2);
7391 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7392 | ((State.regs[srcreg1] >> 16) & 0xffff));
7393 State.regs[dstreg2] += EXTEND4 (IMM4);
7396 // 1111 0111 0010 1011 Rm1 Rn1 Rm2 Rn2; swhw_sub Rm1, Rn1, Rm2, Rn2
7397 8.0xf7+8.0x2b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_sub
7401 int srcreg1, srcreg2, dstreg1, dstreg2;
7404 srcreg1 = translate_rreg (SD_, RM1);
7405 srcreg2 = translate_rreg (SD_, RM2);
7406 dstreg1 = translate_rreg (SD_, RN1);
7407 dstreg2 = translate_rreg (SD_, RN2);
7409 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7410 | ((State.regs[srcreg1] >> 16) & 0xffff));
7411 State.regs[dstreg2] -= State.regs[srcreg2];
7414 // 1111 0111 0011 1011 Rm1 Rn1 imm4 Rn2; swhw_sub Rm1, Rn1, imm4, Rn2
7415 8.0xf7+8.0x3b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_sub
7419 int srcreg1, dstreg1, dstreg2;
7422 srcreg1 = translate_rreg (SD_, RM1);
7423 dstreg1 = translate_rreg (SD_, RN1);
7424 dstreg2 = translate_rreg (SD_, RN2);
7426 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7427 | ((State.regs[srcreg1] >> 16) & 0xffff));
7428 State.regs[dstreg2] -= EXTEND4 (IMM4);
7431 // 1111 0111 0100 1011 Rm1 Rn1 Rm2 Rn2; swhw_cmp Rm1, Rn1, Rm2, Rn2
7432 8.0xf7+8.0x4b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_cmp
7436 int srcreg1, srcreg2, dstreg1, dstreg2;
7439 srcreg1 = translate_rreg (SD_, RM1);
7440 srcreg2 = translate_rreg (SD_, RM2);
7441 dstreg1 = translate_rreg (SD_, RN1);
7442 dstreg2 = translate_rreg (SD_, RN2);
7444 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7445 | ((State.regs[srcreg1] >> 16) & 0xffff));
7446 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7449 // 1111 0111 0101 1011 Rm1 Rn1 imm4 Rn2; swhw_cmp Rm1, Rn1, imm4, Rn2
7450 8.0xf7+8.0x5b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_cmp
7454 int srcreg1, dstreg1, dstreg2;
7457 srcreg1 = translate_rreg (SD_, RM1);
7458 dstreg1 = translate_rreg (SD_, RN1);
7459 dstreg2 = translate_rreg (SD_, RN2);
7461 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7462 | ((State.regs[srcreg1] >> 16) & 0xffff));
7463 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7466 // 1111 0111 0110 1011 Rm1 Rn1 Rm2 Rn2; swhw_mov Rm1, Rn1, Rm2, Rn2
7467 8.0xf7+8.0x6b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_mov
7471 int srcreg1, srcreg2, dstreg1, dstreg2;
7474 srcreg1 = translate_rreg (SD_, RM1);
7475 srcreg2 = translate_rreg (SD_, RM2);
7476 dstreg1 = translate_rreg (SD_, RN1);
7477 dstreg2 = translate_rreg (SD_, RN2);
7479 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7480 | ((State.regs[srcreg1] >> 16) & 0xffff));
7481 State.regs[dstreg2] = State.regs[srcreg2];
7484 // 1111 0111 0111 1011 Rm1 Rn1 imm4 Rn2; swhw_mov Rm1, Rn1, imm4, Rn2
7485 8.0xf7+8.0x7b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_mov
7489 int srcreg1, dstreg1, dstreg2;
7492 srcreg1 = translate_rreg (SD_, RM1);
7493 dstreg1 = translate_rreg (SD_, RN1);
7494 dstreg2 = translate_rreg (SD_, RN2);
7496 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7497 | ((State.regs[srcreg1] >> 16) & 0xffff));
7498 State.regs[dstreg2] = EXTEND4 (IMM4);
7501 // 1111 0111 1000 1011 Rm1 Rn1 Rm2 Rn2; swhw_asr Rm1, Rn1, Rm2, Rn2
7502 8.0xf7+8.0x8b+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_asr
7506 int srcreg1, srcreg2, dstreg1, dstreg2;
7510 srcreg1 = translate_rreg (SD_, RM1);
7511 srcreg2 = translate_rreg (SD_, RM2);
7512 dstreg1 = translate_rreg (SD_, RN1);
7513 dstreg2 = translate_rreg (SD_, RN2);
7515 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7516 | ((State.regs[srcreg1] >> 16) & 0xffff));
7517 temp = State.regs[dstreg2];
7518 temp >>= State.regs[srcreg2];
7519 State.regs[dstreg2] = temp;
7522 // 1111 0111 1001 1011 Rm1 Rn1 imm4 Rn2; swhw_asr Rm1, Rn1, imm4, Rn2
7523 8.0xf7+8.0x9b+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_asr
7527 int srcreg1, dstreg1, dstreg2;
7531 srcreg1 = translate_rreg (SD_, RM1);
7532 dstreg1 = translate_rreg (SD_, RN1);
7533 dstreg2 = translate_rreg (SD_, RN2);
7535 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7536 | ((State.regs[srcreg1] >> 16) & 0xffff));
7537 temp = State.regs[dstreg2];
7539 State.regs[dstreg2] = temp;
7542 // 1111 0111 1010 1011 Rm1 Rn1 Rm2 Rn2; swhw_lsr Rm1, Rn1, Rm2, Rn2
7543 8.0xf7+8.0xab+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_lsr
7547 int srcreg1, srcreg2, dstreg1, dstreg2;
7550 srcreg1 = translate_rreg (SD_, RM1);
7551 srcreg2 = translate_rreg (SD_, RM2);
7552 dstreg1 = translate_rreg (SD_, RN1);
7553 dstreg2 = translate_rreg (SD_, RN2);
7555 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7556 | ((State.regs[srcreg1] >> 16) & 0xffff));
7557 State.regs[dstreg2] >>= State.regs[srcreg2];
7560 // 1111 0111 1011 1011 Rm1 Rn1 imm4 Rn2; swhw_lsr Rm1, Rn1, imm4, Rn2
7561 8.0xf7+8.0xbb+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_lsr
7565 int srcreg1, dstreg1, dstreg2;
7569 srcreg1 = translate_rreg (SD_, RM1);
7570 dstreg1 = translate_rreg (SD_, RN1);
7571 dstreg2 = translate_rreg (SD_, RN2);
7573 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7574 | ((State.regs[srcreg1] >> 16) & 0xffff));
7575 State.regs[dstreg2] >>= IMM4;
7579 // 1111 0111 1100 1011 Rm1 Rn1 Rm2 Rn2; swhw_asl Rm1, Rn1, Rm2, Rn2
7580 8.0xf7+8.0xcb+4.RM1,4.RN1+4.RM2,4.RN2:D2:::swhw_asl
7584 int srcreg1, srcreg2, dstreg1, dstreg2;
7587 srcreg1 = translate_rreg (SD_, RM1);
7588 srcreg2 = translate_rreg (SD_, RM2);
7589 dstreg1 = translate_rreg (SD_, RN1);
7590 dstreg2 = translate_rreg (SD_, RN2);
7592 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7593 | ((State.regs[srcreg1] >> 16) & 0xffff));
7594 State.regs[dstreg2] <<= State.regs[srcreg2];
7597 // 1111 0111 1101 1011 Rm1 Rn1 imm4 Rn2; swhw_asl Rm1, Rn1, imm4, Rn2
7598 8.0xf7+8.0xdb+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::swhw_asl
7602 int srcreg1, dstreg1, dstreg2;
7606 srcreg1 = translate_rreg (SD_, RM1);
7607 dstreg1 = translate_rreg (SD_, RN1);
7608 dstreg2 = translate_rreg (SD_, RN2);
7610 State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
7611 | ((State.regs[srcreg1] >> 16) & 0xffff));
7612 State.regs[dstreg2] <<= IMM4;
7615 // 1111 0111 0000 1100 Rm1 Rn1 Rm2 Rn2; or_add Rm1, Rn1, Rm2, Rn2
7616 8.0xf7+8.0x0c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_add
7620 int srcreg1, srcreg2, dstreg1, dstreg2;
7623 srcreg1 = translate_rreg (SD_, RM1);
7624 srcreg2 = translate_rreg (SD_, RM2);
7625 dstreg1 = translate_rreg (SD_, RN1);
7626 dstreg2 = translate_rreg (SD_, RN2);
7628 State.regs[dstreg1] |= State.regs[srcreg1];
7629 State.regs[dstreg2] += State.regs[srcreg2];
7632 // 1111 0111 0001 1100 Rm1 Rn1 imm4 Rn2; or_add Rm1, Rn1, imm4, Rn2
7633 8.0xf7+8.0x1c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_add
7637 int srcreg1, dstreg1, dstreg2;
7640 srcreg1 = translate_rreg (SD_, RM1);
7641 dstreg1 = translate_rreg (SD_, RN1);
7642 dstreg2 = translate_rreg (SD_, RN2);
7644 State.regs[dstreg1] |= State.regs[srcreg1];
7645 State.regs[dstreg2] += EXTEND4 (IMM4);
7648 // 1111 0111 0010 1100 Rm1 Rn1 Rm2 Rn2; or_sub Rm1, Rn1, Rm2, Rn2
7649 8.0xf7+8.0x2c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_sub
7653 int srcreg1, srcreg2, dstreg1, dstreg2;
7656 srcreg1 = translate_rreg (SD_, RM1);
7657 srcreg2 = translate_rreg (SD_, RM2);
7658 dstreg1 = translate_rreg (SD_, RN1);
7659 dstreg2 = translate_rreg (SD_, RN2);
7661 State.regs[dstreg1] |= State.regs[srcreg1];
7662 State.regs[dstreg2] -= State.regs[srcreg2];
7665 // 1111 0111 0011 1100 Rm1 Rn1 imm4 Rn2; or_sub Rm1, Rn1, imm4, Rn2
7666 8.0xf7+8.0x3c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_sub
7670 int srcreg1, dstreg1, dstreg2;
7673 srcreg1 = translate_rreg (SD_, RM1);
7674 dstreg1 = translate_rreg (SD_, RN1);
7675 dstreg2 = translate_rreg (SD_, RN2);
7677 State.regs[dstreg1] |= State.regs[srcreg1];
7678 State.regs[dstreg2] -= EXTEND4 (IMM4);
7681 // 1111 0111 0100 1100 Rm1 Rn1 Rm2 Rn2; or_cmp Rm1, Rn1, Rm2, Rn2
7682 8.0xf7+8.0x4c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_cmp
7686 int srcreg1, srcreg2, dstreg1, dstreg2;
7689 srcreg1 = translate_rreg (SD_, RM1);
7690 srcreg2 = translate_rreg (SD_, RM2);
7691 dstreg1 = translate_rreg (SD_, RN1);
7692 dstreg2 = translate_rreg (SD_, RN2);
7694 State.regs[dstreg1] |= State.regs[srcreg1];
7695 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7698 // 1111 0111 0101 1100 Rm1 Rn1 imm4 Rn2; or_cmp Rm1, Rn1, imm4, Rn2
7699 8.0xf7+8.0x5c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_cmp
7703 int srcreg1, dstreg1, dstreg2;
7706 srcreg1 = translate_rreg (SD_, RM1);
7707 dstreg1 = translate_rreg (SD_, RN1);
7708 dstreg2 = translate_rreg (SD_, RN2);
7710 State.regs[dstreg1] |= State.regs[srcreg1];
7711 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7714 // 1111 0111 0110 1100 Rm1 Rn1 Rm2 Rn2; or_mov Rm1, Rn1, Rm2, Rn2
7715 8.0xf7+8.0x6c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_mov
7719 int srcreg1, srcreg2, dstreg1, dstreg2;
7722 srcreg1 = translate_rreg (SD_, RM1);
7723 srcreg2 = translate_rreg (SD_, RM2);
7724 dstreg1 = translate_rreg (SD_, RN1);
7725 dstreg2 = translate_rreg (SD_, RN2);
7727 State.regs[dstreg1] |= State.regs[srcreg1];
7728 State.regs[dstreg2] = State.regs[srcreg2];
7731 // 1111 0111 0111 1100 Rm1 Rn1 imm4 Rn2; or_mov Rm1, Rn1, imm4, Rn2
7732 8.0xf7+8.0x7c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_mov
7736 int srcreg1, dstreg1, dstreg2;
7739 srcreg1 = translate_rreg (SD_, RM1);
7740 dstreg1 = translate_rreg (SD_, RN1);
7741 dstreg2 = translate_rreg (SD_, RN2);
7743 State.regs[dstreg1] |= State.regs[srcreg1];
7744 State.regs[dstreg2] = EXTEND4 (IMM4);
7747 // 1111 0111 1000 1100 Rm1 Rn1 Rm2 Rn2; or_asr Rm1, Rn1, Rm2, Rn2
7748 8.0xf7+8.0x8c+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_asr
7752 int srcreg1, srcreg2, dstreg1, dstreg2;
7756 srcreg1 = translate_rreg (SD_, RM1);
7757 srcreg2 = translate_rreg (SD_, RM2);
7758 dstreg1 = translate_rreg (SD_, RN1);
7759 dstreg2 = translate_rreg (SD_, RN2);
7761 State.regs[dstreg1] |= State.regs[srcreg1];
7762 temp = State.regs[dstreg2];
7763 temp >>= State.regs[srcreg2];
7764 State.regs[dstreg2] = temp;
7767 // 1111 0111 1001 1100 Rm1 Rn1 imm4 Rn2; or_asr Rm1, Rn1, imm4, Rn2
7768 8.0xf7+8.0x9c+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_asr
7772 int srcreg1, dstreg1, dstreg2;
7776 srcreg1 = translate_rreg (SD_, RM1);
7777 dstreg1 = translate_rreg (SD_, RN1);
7778 dstreg2 = translate_rreg (SD_, RN2);
7780 State.regs[dstreg1] |= State.regs[srcreg1];
7781 temp = State.regs[dstreg2];
7783 State.regs[dstreg2] = temp;
7786 // 1111 0111 1010 1100 Rm1 Rn1 Rm2 Rn2; or_lsr Rm1, Rn1, Rm2, Rn2
7787 8.0xf7+8.0xac+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_lsr
7791 int srcreg1, srcreg2, dstreg1, dstreg2;
7794 srcreg1 = translate_rreg (SD_, RM1);
7795 srcreg2 = translate_rreg (SD_, RM2);
7796 dstreg1 = translate_rreg (SD_, RN1);
7797 dstreg2 = translate_rreg (SD_, RN2);
7799 State.regs[dstreg1] |= State.regs[srcreg1];
7800 State.regs[dstreg2] >>= State.regs[srcreg2];
7803 // 1111 0111 1011 1100 Rm1 Rn1 imm4 Rn2; or_lsr Rm1, Rn1, imm4, Rn2
7804 8.0xf7+8.0xbc+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_lsr
7808 int srcreg1, dstreg1, dstreg2;
7812 srcreg1 = translate_rreg (SD_, RM1);
7813 dstreg1 = translate_rreg (SD_, RN1);
7814 dstreg2 = translate_rreg (SD_, RN2);
7816 State.regs[dstreg1] |= State.regs[srcreg1];
7817 State.regs[dstreg2] >>= IMM4;
7821 // 1111 0111 1100 1100 Rm1 Rn1 Rm2 Rn2; or_asl Rm1, Rn1, Rm2, Rn2
7822 8.0xf7+8.0xcc+4.RM1,4.RN1+4.RM2,4.RN2:D2:::or_asl
7826 int srcreg1, srcreg2, dstreg1, dstreg2;
7829 srcreg1 = translate_rreg (SD_, RM1);
7830 srcreg2 = translate_rreg (SD_, RM2);
7831 dstreg1 = translate_rreg (SD_, RN1);
7832 dstreg2 = translate_rreg (SD_, RN2);
7834 State.regs[dstreg1] |= State.regs[srcreg1];
7835 State.regs[dstreg2] <<= State.regs[srcreg2];
7838 // 1111 0111 1101 1100 Rm1 Rn1 imm4 Rn2; or_asl Rm1, Rn1, imm4, Rn2
7839 8.0xf7+8.0xdc+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::or_asl
7843 int srcreg1, dstreg1, dstreg2;
7847 srcreg1 = translate_rreg (SD_, RM1);
7848 dstreg1 = translate_rreg (SD_, RN1);
7849 dstreg2 = translate_rreg (SD_, RN2);
7851 State.regs[dstreg1] |= State.regs[srcreg1];
7852 State.regs[dstreg2] <<= IMM4;
7855 // 1111 0111 0000 1101 Rm1 Rn1 Rm2 Rn2; sat16_add Rm1, Rn1, Rm2, Rn2
7856 8.0xf7+8.0x0d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_add
7860 int srcreg1, srcreg2, dstreg1, dstreg2;
7863 srcreg1 = translate_rreg (SD_, RM1);
7864 srcreg2 = translate_rreg (SD_, RM2);
7865 dstreg1 = translate_rreg (SD_, RN1);
7866 dstreg2 = translate_rreg (SD_, RN2);
7868 if (State.regs[srcreg1] >= 0x7fff)
7869 State.regs[dstreg1] = 0x7fff;
7870 else if (State.regs[srcreg1] <= 0xffff8000)
7871 State.regs[dstreg1] = 0xffff8000;
7873 State.regs[dstreg1] = State.regs[srcreg1];
7875 State.regs[dstreg2] += State.regs[srcreg2];
7878 // 1111 0111 0001 1101 Rm1 Rn1 imm4 Rn2; sat16_add Rm1, Rn1, imm4, Rn2
7879 8.0xf7+8.0x1d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_add
7883 int srcreg1, dstreg1, dstreg2;
7886 srcreg1 = translate_rreg (SD_, RM1);
7887 dstreg1 = translate_rreg (SD_, RN1);
7888 dstreg2 = translate_rreg (SD_, RN2);
7890 if (State.regs[srcreg1] >= 0x7fff)
7891 State.regs[dstreg1] = 0x7fff;
7892 else if (State.regs[srcreg1] <= 0xffff8000)
7893 State.regs[dstreg1] = 0xffff8000;
7895 State.regs[dstreg1] = State.regs[srcreg1];
7897 State.regs[dstreg2] += EXTEND4 (IMM4);
7900 // 1111 0111 0010 1101 Rm1 Rn1 Rm2 Rn2; sat16_sub Rm1, Rn1, Rm2, Rn2
7901 8.0xf7+8.0x2d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_sub
7905 int srcreg1, srcreg2, dstreg1, dstreg2;
7908 srcreg1 = translate_rreg (SD_, RM1);
7909 srcreg2 = translate_rreg (SD_, RM2);
7910 dstreg1 = translate_rreg (SD_, RN1);
7911 dstreg2 = translate_rreg (SD_, RN2);
7913 if (State.regs[srcreg1] >= 0x7fff)
7914 State.regs[dstreg1] = 0x7fff;
7915 else if (State.regs[srcreg1] <= 0xffff8000)
7916 State.regs[dstreg1] = 0xffff8000;
7918 State.regs[dstreg1] = State.regs[srcreg1];
7920 State.regs[dstreg2] -= State.regs[srcreg2];
7923 // 1111 0111 0011 1101 Rm1 Rn1 imm4 Rn2; sat16_sub Rm1, Rn1, imm4, Rn2
7924 8.0xf7+8.0x3d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_sub
7928 int srcreg1, dstreg1, dstreg2;
7931 srcreg1 = translate_rreg (SD_, RM1);
7932 dstreg1 = translate_rreg (SD_, RN1);
7933 dstreg2 = translate_rreg (SD_, RN2);
7935 if (State.regs[srcreg1] >= 0x7fff)
7936 State.regs[dstreg1] = 0x7fff;
7937 else if (State.regs[srcreg1] <= 0xffff8000)
7938 State.regs[dstreg1] = 0xffff8000;
7940 State.regs[dstreg1] = State.regs[srcreg1];
7942 State.regs[dstreg2] -= EXTEND4 (IMM4);
7945 // 1111 0111 0100 1101 Rm1 Rn1 Rm2 Rn2; sat16_cmp Rm1, Rn1, Rm2, Rn2
7946 8.0xf7+8.0x4d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_cmp
7950 int srcreg1, srcreg2, dstreg1, dstreg2;
7953 srcreg1 = translate_rreg (SD_, RM1);
7954 srcreg2 = translate_rreg (SD_, RM2);
7955 dstreg1 = translate_rreg (SD_, RN1);
7956 dstreg2 = translate_rreg (SD_, RN2);
7958 if (State.regs[srcreg1] >= 0x7fff)
7959 State.regs[dstreg1] = 0x7fff;
7960 else if (State.regs[srcreg1] <= 0xffff8000)
7961 State.regs[dstreg1] = 0xffff8000;
7963 State.regs[dstreg1] = State.regs[srcreg1];
7965 genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
7968 // 1111 0111 0101 1101 Rm1 Rn1 imm4 Rn2; sat16_cmp Rm1, Rn1, imm4, Rn2
7969 8.0xf7+8.0x5d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_cmp
7973 int srcreg1, dstreg1, dstreg2;
7976 srcreg1 = translate_rreg (SD_, RM1);
7977 dstreg1 = translate_rreg (SD_, RN1);
7978 dstreg2 = translate_rreg (SD_, RN2);
7980 if (State.regs[srcreg1] >= 0x7fff)
7981 State.regs[dstreg1] = 0x7fff;
7982 else if (State.regs[srcreg1] <= 0xffff8000)
7983 State.regs[dstreg1] = 0xffff8000;
7985 State.regs[dstreg1] = State.regs[srcreg1];
7987 genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
7990 // 1111 0111 0110 1101 Rm1 Rn1 Rm2 Rn2; sat16_mov Rm1, Rn1, Rm2, Rn2
7991 8.0xf7+8.0x6d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_mov
7995 int srcreg1, srcreg2, dstreg1, dstreg2;
7998 srcreg1 = translate_rreg (SD_, RM1);
7999 srcreg2 = translate_rreg (SD_, RM2);
8000 dstreg1 = translate_rreg (SD_, RN1);
8001 dstreg2 = translate_rreg (SD_, RN2);
8003 if (State.regs[srcreg1] >= 0x7fff)
8004 State.regs[dstreg1] = 0x7fff;
8005 else if (State.regs[srcreg1] <= 0xffff8000)
8006 State.regs[dstreg1] = 0xffff8000;
8008 State.regs[dstreg1] = State.regs[srcreg1];
8010 State.regs[dstreg2] = State.regs[srcreg2];
8013 // 1111 0111 0111 1101 Rm1 Rn1 imm4 Rn2; sat16_mov Rm1, Rn1, imm4, Rn2
8014 8.0xf7+8.0x7d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_mov
8018 int srcreg1, dstreg1, dstreg2;
8021 srcreg1 = translate_rreg (SD_, RM1);
8022 dstreg1 = translate_rreg (SD_, RN1);
8023 dstreg2 = translate_rreg (SD_, RN2);
8025 if (State.regs[srcreg1] >= 0x7fff)
8026 State.regs[dstreg1] = 0x7fff;
8027 else if (State.regs[srcreg1] <= 0xffff8000)
8028 State.regs[dstreg1] = 0xffff8000;
8030 State.regs[dstreg1] = State.regs[srcreg1];
8032 State.regs[dstreg2] = EXTEND4 (IMM4);
8035 // 1111 0111 1000 1101 Rm1 Rn1 Rm2 Rn2; sat16_asr Rm1, Rn1, Rm2, Rn2
8036 8.0xf7+8.0x8d+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_asr
8040 int srcreg1, srcreg2, dstreg1, dstreg2;
8044 srcreg1 = translate_rreg (SD_, RM1);
8045 srcreg2 = translate_rreg (SD_, RM2);
8046 dstreg1 = translate_rreg (SD_, RN1);
8047 dstreg2 = translate_rreg (SD_, RN2);
8049 if (State.regs[srcreg1] >= 0x7fff)
8050 State.regs[dstreg1] = 0x7fff;
8051 else if (State.regs[srcreg1] <= 0xffff8000)
8052 State.regs[dstreg1] = 0xffff8000;
8054 State.regs[dstreg1] = State.regs[srcreg1];
8056 temp = State.regs[dstreg2];
8057 temp >>= State.regs[srcreg2];
8058 State.regs[dstreg2] = temp;
8061 // 1111 0111 1001 1101 Rm1 Rn1 imm4 Rn2; sat16_asr Rm1, Rn1, imm4, Rn2
8062 8.0xf7+8.0x9d+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_asr
8066 int srcreg1, dstreg1, dstreg2;
8070 srcreg1 = translate_rreg (SD_, RM1);
8071 dstreg1 = translate_rreg (SD_, RN1);
8072 dstreg2 = translate_rreg (SD_, RN2);
8074 if (State.regs[srcreg1] >= 0x7fff)
8075 State.regs[dstreg1] = 0x7fff;
8076 else if (State.regs[srcreg1] <= 0xffff8000)
8077 State.regs[dstreg1] = 0xffff8000;
8079 State.regs[dstreg1] = State.regs[srcreg1];
8081 temp = State.regs[dstreg2];
8083 State.regs[dstreg2] = temp;
8086 // 1111 0111 1010 1101 Rm1 Rn1 Rm2 Rn2; sat16_lsr Rm1, Rn1, Rm2, Rn2
8087 8.0xf7+8.0xad+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_lsr
8091 int srcreg1, srcreg2, dstreg1, dstreg2;
8094 srcreg1 = translate_rreg (SD_, RM1);
8095 srcreg2 = translate_rreg (SD_, RM2);
8096 dstreg1 = translate_rreg (SD_, RN1);
8097 dstreg2 = translate_rreg (SD_, RN2);
8099 if (State.regs[srcreg1] >= 0x7fff)
8100 State.regs[dstreg1] = 0x7fff;
8101 else if (State.regs[srcreg1] <= 0xffff8000)
8102 State.regs[dstreg1] = 0xffff8000;
8104 State.regs[dstreg1] = State.regs[srcreg1];
8106 State.regs[dstreg2] >>= State.regs[srcreg2];
8109 // 1111 0111 1011 1101 Rm1 Rn1 imm4 Rn2; sat16_lsr Rm1, Rn1, imm4, Rn2
8110 8.0xf7+8.0xbd+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_lsr
8114 int srcreg1, dstreg1, dstreg2;
8118 srcreg1 = translate_rreg (SD_, RM1);
8119 dstreg1 = translate_rreg (SD_, RN1);
8120 dstreg2 = translate_rreg (SD_, RN2);
8122 if (State.regs[srcreg1] >= 0x7fff)
8123 State.regs[dstreg1] = 0x7fff;
8124 else if (State.regs[srcreg1] <= 0xffff8000)
8125 State.regs[dstreg1] = 0xffff8000;
8127 State.regs[dstreg1] = State.regs[srcreg1];
8129 State.regs[dstreg2] >>= IMM4;
8133 // 1111 0111 1100 1101 Rm1 Rn1 Rm2 Rn2; sat16_asl Rm1, Rn1, Rm2, Rn2
8134 8.0xf7+8.0xcd+4.RM1,4.RN1+4.RM2,4.RN2:D2:::sat16_asl
8138 int srcreg1, srcreg2, dstreg1, dstreg2;
8141 srcreg1 = translate_rreg (SD_, RM1);
8142 srcreg2 = translate_rreg (SD_, RM2);
8143 dstreg1 = translate_rreg (SD_, RN1);
8144 dstreg2 = translate_rreg (SD_, RN2);
8146 if (State.regs[srcreg1] >= 0x7fff)
8147 State.regs[dstreg1] = 0x7fff;
8148 else if (State.regs[srcreg1] <= 0xffff8000)
8149 State.regs[dstreg1] = 0xffff8000;
8151 State.regs[dstreg1] = State.regs[srcreg1];
8153 State.regs[dstreg2] <<= State.regs[srcreg2];
8156 // 1111 0111 1101 1101 Rm1 Rn1 imm4 Rn2; sat16_asl Rm1, Rn1, imm4, Rn2
8157 8.0xf7+8.0xdd+4.RM1,4.RN1+4.IMM4,4.RN2:D2b:::sat16_asl
8161 int srcreg1, dstreg1, dstreg2;
8165 srcreg1 = translate_rreg (SD_, RM1);
8166 dstreg1 = translate_rreg (SD_, RN1);
8167 dstreg2 = translate_rreg (SD_, RN2);
8169 if (State.regs[srcreg1] >= 0x7fff)
8170 State.regs[dstreg1] = 0x7fff;
8171 else if (State.regs[srcreg1] <= 0xffff8000)
8172 State.regs[dstreg1] = 0xffff8000;
8174 State.regs[dstreg1] = State.regs[srcreg1];
8176 State.regs[dstreg2] <<= IMM4;
8179 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0000; mov_llt (Rm+,imm4),Rn
8180 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x0:D2:::mov_llt
8187 srcreg = translate_rreg (SD_, RM);
8188 dstreg = translate_rreg (SD_, RN);
8190 State.regs[dstreg] = load_word (State.regs[srcreg]);
8191 State.regs[srcreg] += EXTEND4 (IMM4);
8193 if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
8195 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8200 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0001; mov_lgt (Rm+,imm4),Rn
8201 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x1:D2:::mov_lgt
8208 srcreg = translate_rreg (SD_, RM);
8209 dstreg = translate_rreg (SD_, RN);
8211 State.regs[dstreg] = load_word (State.regs[srcreg]);
8212 State.regs[srcreg] += EXTEND4 (IMM4);
8215 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
8217 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8222 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0010; mov_lge (Rm+,imm4),Rn
8223 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x2:D2:::mov_lge
8230 srcreg = translate_rreg (SD_, RM);
8231 dstreg = translate_rreg (SD_, RN);
8233 State.regs[dstreg] = load_word (State.regs[srcreg]);
8234 State.regs[srcreg] += EXTEND4 (IMM4);
8236 if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
8238 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8243 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0011; mov_lle (Rm+,imm4),Rn
8244 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x3:D2:::mov_lle
8251 srcreg = translate_rreg (SD_, RM);
8252 dstreg = translate_rreg (SD_, RN);
8254 State.regs[dstreg] = load_word (State.regs[srcreg]);
8255 State.regs[srcreg] += EXTEND4 (IMM4);
8258 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
8260 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8265 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0100; mov_lcs (Rm+,imm4),Rn
8266 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x4:D2:::mov_lcs
8273 srcreg = translate_rreg (SD_, RM);
8274 dstreg = translate_rreg (SD_, RN);
8276 State.regs[dstreg] = load_word (State.regs[srcreg]);
8277 State.regs[srcreg] += EXTEND4 (IMM4);
8281 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8286 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0101; mov_lhi (Rm+,imm4),Rn
8287 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x5:D2:::mov_lhi
8294 srcreg = translate_rreg (SD_, RM);
8295 dstreg = translate_rreg (SD_, RN);
8297 State.regs[dstreg] = load_word (State.regs[srcreg]);
8298 State.regs[srcreg] += EXTEND4 (IMM4);
8300 if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
8302 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8307 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0110; mov_lcc (Rm+,imm4),Rn
8308 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x6:D2:::mov_lcc
8315 srcreg = translate_rreg (SD_, RM);
8316 dstreg = translate_rreg (SD_, RN);
8318 State.regs[dstreg] = load_word (State.regs[srcreg]);
8319 State.regs[srcreg] += EXTEND4 (IMM4);
8323 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8328 // 1111 0111 1110 0000 Rm1 Rn1 imm4 0111; mov_lls (Rm+,imm4),Rn
8329 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x7:D2:::mov_lls
8336 srcreg = translate_rreg (SD_, RM);
8337 dstreg = translate_rreg (SD_, RN);
8339 State.regs[dstreg] = load_word (State.regs[srcreg]);
8340 State.regs[srcreg] += EXTEND4 (IMM4);
8342 if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
8344 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8349 // 1111 0111 1110 0000 Rm1 Rn1 imm4 1000; mov_leq (Rm+,imm4),Rn
8350 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x8:D2:::mov_leq
8357 srcreg = translate_rreg (SD_, RM);
8358 dstreg = translate_rreg (SD_, RN);
8360 State.regs[dstreg] = load_word (State.regs[srcreg]);
8361 State.regs[srcreg] += EXTEND4 (IMM4);
8365 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8370 // 1111 0111 1110 0000 Rm1 Rn1 imm4 1001; mov_lne (Rm+,imm4),Rn
8371 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0x9:D2:::mov_lne
8378 srcreg = translate_rreg (SD_, RM);
8379 dstreg = translate_rreg (SD_, RN);
8381 State.regs[dstreg] = load_word (State.regs[srcreg]);
8382 State.regs[srcreg] += EXTEND4 (IMM4);
8386 State.regs[REG_PC] = State.regs[REG_LAR] - 4;
8391 // 1111 0111 1110 0000 Rm1 Rn1 imm4 1010; mov_lra (Rm+,imm4),Rn
8392 8.0xf7+8.0xe0+4.RN,4.RM+4.IMM4,4.0xa:D2:::mov_lra
8399 srcreg = translate_rreg (SD_, RM);
8400 dstreg = translate_rreg (SD_, RN);
8402 State.regs[dstreg] = load_word (State.regs[srcreg]);
8403 State.regs[srcreg] += EXTEND4 (IMM4);
8405 State.regs[REG_PC] = State.regs[REG_LAR] - 4;