mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-23 13:21:43 +08:00
The igen tool sets up the SD define for code fragments to use, but mn10300 was expecting "sd". Change all the igen related code to use SD so it actually compiles.
9133 lines
211 KiB
Plaintext
9133 lines
211 KiB
Plaintext
// Helper:
|
|
//
|
|
// Given an extended register number, translate it into an index into the
|
|
// register array. This is necessary as the upper 8 extended registers are
|
|
// actually synonyms for the d0-d3/a0-a3 registers.
|
|
//
|
|
//
|
|
|
|
:function:::int:translate_rreg:int rreg
|
|
{
|
|
|
|
/* The higher register numbers actually correspond to the
|
|
basic machine's address and data registers. */
|
|
if (rreg > 7 && rreg < 12)
|
|
return REG_A0 + rreg - 8;
|
|
else if (rreg > 11 && rreg < 16)
|
|
return REG_D0 + rreg - 12;
|
|
else
|
|
return REG_E0 + rreg;
|
|
}
|
|
|
|
:function:::int:translate_xreg:int xreg
|
|
{
|
|
switch (xreg)
|
|
{
|
|
case 0:
|
|
return REG_SP;
|
|
case 1:
|
|
return REG_MDRQ;
|
|
case 2:
|
|
return REG_MCRH;
|
|
case 3:
|
|
return REG_MCRL;
|
|
case 4:
|
|
return REG_MCVF;
|
|
default:
|
|
sim_engine_abort (SD, CPU, cia, "%s:%d: bad switch\n", __FILE__, __LINE__);
|
|
}
|
|
}
|
|
|
|
// 1111 0000 0010 00An; mov USP,An
|
|
8.0xf0+4.0x2,00,2.AN0:D0m:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_A0 + AN0] = State.regs[REG_USP];
|
|
}
|
|
|
|
|
|
// 1111 0000 0010 01An; mov SSP,An
|
|
8.0xf0+4.0x2,01,2.AN0:D0n:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_A0 + AN0] = State.regs[REG_SSP];
|
|
}
|
|
|
|
|
|
// 1111 0000 0010 10An; mov MSP,An
|
|
8.0xf0+4.0x2,10,2.AN0:D0o:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_A0 + AN0] = State.regs[REG_MSP];
|
|
}
|
|
|
|
|
|
// 1111 0000 0010 11An; mov PC,An
|
|
8.0xf0+4.0x2,11,2.AN0:D0p:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_A0 + AN0] = PC;
|
|
}
|
|
|
|
|
|
// 1111 0000 0011 Am00; mov Am,USP
|
|
8.0xf0+4.0x3,2.AM1,00:D0q:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_USP] = State.regs[REG_A0 + AM1];
|
|
}
|
|
|
|
// 1111 0000 0011 Am01; mov Am,SSP
|
|
8.0xf0+4.0x3,2.AM1,01:D0r:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_SSP] = State.regs[REG_A0 + AM1];
|
|
}
|
|
|
|
// 1111 0000 0011 Am10; mov Am,MSP
|
|
8.0xf0+4.0x3,2.AM1,10:D0s:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_MSP] = State.regs[REG_A0 + AM1];
|
|
}
|
|
|
|
|
|
// 1111 0000 1110 imm4; syscall
|
|
8.0xf0+4.0xe,IMM4:D0t:::syscall
|
|
"syscall"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
uint32_t sp, next_pc;
|
|
|
|
PC = cia;
|
|
sp = State.regs[REG_SP];
|
|
next_pc = State.regs[REG_PC] + 2;
|
|
store_word (sp - 4, next_pc);
|
|
store_word (sp - 8, PSW);
|
|
State.regs[REG_PC] = 0x40000000 + IMM4 * 8;
|
|
nia = PC;
|
|
}
|
|
|
|
|
|
// 1111 0010 1110 11Dn; mov EPSW,Dn
|
|
8.0xf2+4.0xe,11,2.DN0:D0u:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
State.regs[REG_D0 + DN0] = PSW;
|
|
}
|
|
|
|
|
|
// 1111 0010 1111 Dm01; mov Dm,EPSW
|
|
8.0xf2+4.0xf,2.DM1,01:D0v:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
PSW = State.regs[REG_D0 + DM1];
|
|
}
|
|
|
|
// 1111 0101 00Am Rn; mov Am,Rn
|
|
8.0xf5+00,2.AM1,4.RN0:D0w:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int destreg = translate_rreg (SD_, RN0);
|
|
|
|
PC = cia;
|
|
State.regs[destreg] = State.regs[REG_A0 + AM1];
|
|
}
|
|
|
|
// 1111 0101 01Dm Rn; mov Dm,Rn
|
|
8.0xf5+01,2.DM1,4.RN0:D0x:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int destreg = translate_rreg (SD_, RN0);
|
|
|
|
PC = cia;
|
|
State.regs[destreg] = State.regs[REG_D0 + DM1];
|
|
}
|
|
|
|
// 1111 0101 10Rm An; mov Rm,An
|
|
8.0xf5+10,4.RM1,2.AN0:D0y:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int destreg = translate_rreg (SD_, RM1);
|
|
|
|
PC = cia;
|
|
State.regs[REG_A0 + AN0] = State.regs[destreg];
|
|
}
|
|
|
|
// 1111 0101 11Rm Dn; mov Rm,Dn
|
|
8.0xf5+11,4.RM1,2.DN0:D0z:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int destreg = translate_rreg (SD_, RM1);
|
|
|
|
PC = cia;
|
|
State.regs[REG_D0 + DN0] = State.regs[destreg];
|
|
}
|
|
|
|
|
|
// 1111 1000 1100 1110 regs....; movm (USP),regs
|
|
8.0xf8+8.0xce+8.REGS:D1a:::movm
|
|
"movm"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
uint32_t usp = State.regs[REG_USP];
|
|
uint32_t mask;
|
|
|
|
PC = cia;
|
|
mask = REGS;
|
|
|
|
if (mask & 0x8)
|
|
{
|
|
usp += 4;
|
|
State.regs[REG_LAR] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_LIR] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_MDR] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_A0 + 1] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_A0] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_D0 + 1] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_D0] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
|
|
if (mask & 0x10)
|
|
{
|
|
State.regs[REG_A0 + 3] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
|
|
if (mask & 0x20)
|
|
{
|
|
State.regs[REG_A0 + 2] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
|
|
if (mask & 0x40)
|
|
{
|
|
State.regs[REG_D0 + 3] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
|
|
if (mask & 0x80)
|
|
{
|
|
State.regs[REG_D0 + 2] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
|
|
if (STATE_ARCHITECTURE (SD)->mach == bfd_mach_am33
|
|
|| STATE_ARCHITECTURE (SD)->mach == bfd_mach_am33_2
|
|
)
|
|
{
|
|
if (mask & 0x1)
|
|
{
|
|
/* Need to restore MDQR, MCRH, MCRL, and MCVF */
|
|
usp += 16;
|
|
State.regs[REG_E0 + 1] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_E0 + 0] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
|
|
if (mask & 0x2)
|
|
{
|
|
State.regs[REG_E0 + 7] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_E0 + 6] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_E0 + 5] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_E0 + 4] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
|
|
if (mask & 0x4)
|
|
{
|
|
State.regs[REG_E0 + 3] = load_word (usp);
|
|
usp += 4;
|
|
State.regs[REG_E0 + 2] = load_word (usp);
|
|
usp += 4;
|
|
}
|
|
}
|
|
|
|
/* And make sure to update the stack pointer. */
|
|
State.regs[REG_USP] = usp;
|
|
}
|
|
|
|
// 1111 1000 1100 1111 regs....; movm (USP),regs
|
|
8.0xf8+8.0xcf+8.REGS:D1b:::movm
|
|
"movm"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
uint32_t usp = State.regs[REG_USP];
|
|
uint32_t mask;
|
|
|
|
PC = cia;
|
|
mask = REGS;
|
|
|
|
if (STATE_ARCHITECTURE (SD)->mach == bfd_mach_am33
|
|
|| STATE_ARCHITECTURE (SD)->mach == bfd_mach_am33_2
|
|
)
|
|
{
|
|
if (mask & 0x4)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 2]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 3]);
|
|
}
|
|
|
|
if (mask & 0x2)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 4]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 5]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 6]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 7]);
|
|
}
|
|
|
|
if (mask & 0x1)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 0]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_E0 + 1]);
|
|
usp -= 16;
|
|
/* Need to save MDQR, MCRH, MCRL, and MCVF */
|
|
}
|
|
}
|
|
|
|
if (mask & 0x80)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_D0 + 2]);
|
|
}
|
|
|
|
if (mask & 0x40)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_D0 + 3]);
|
|
}
|
|
|
|
if (mask & 0x20)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_A0 + 2]);
|
|
}
|
|
|
|
if (mask & 0x10)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_A0 + 3]);
|
|
}
|
|
|
|
if (mask & 0x8)
|
|
{
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_D0]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_D0 + 1]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_A0]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_A0 + 1]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_MDR]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_LIR]);
|
|
usp -= 4;
|
|
store_word (usp, State.regs[REG_LAR]);
|
|
usp -= 4;
|
|
}
|
|
|
|
/* And make sure to update the stack pointer. */
|
|
State.regs[REG_USP] = usp;
|
|
}
|
|
|
|
// 1111 1100 1111 1100 imm32...; and imm32,EPSW
|
|
8.0xfc+8.0xfc+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:4a:::and
|
|
"and"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
PSW &= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
// 1111 1100 1111 1101 imm32...; or imm32,EPSW
|
|
8.0xfc+8.0xfd+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D4a:::or
|
|
"or"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
PC = cia;
|
|
PSW |= FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
// 1111 1001 0000 1000 Rm Rn; mov Rm,Rn (Rm != Rn)
|
|
8.0xf9+8.0x08+4.RM2,4.RN0!RM2:D1g:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = State.regs[srcreg];
|
|
}
|
|
|
|
// 1111 1001 0001 1000 Rn Rn; ext Rn
|
|
8.0xf9+8.0x18+4.RN0,4.RN2=RN0:D1:::ext
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
if (State.regs[srcreg] & 0x80000000)
|
|
State.regs[REG_MDR] = -1;
|
|
else
|
|
State.regs[REG_MDR] = 0;
|
|
}
|
|
|
|
// 1111 1001 0010 1000 Rm Rn; extb Rm,Rn
|
|
8.0xf9+8.0x28+4.RM2,4.RN0!RM2:D1:::extb
|
|
"extb"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = EXTEND8 (State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0011 1000 Rm Rn; extbu Rm,Rn
|
|
8.0xf9+8.0x38+4.RM2,4.RN0!RM2:D1:::extbu
|
|
"extbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = State.regs[srcreg] & 0xff;
|
|
}
|
|
|
|
// 1111 1001 0100 1000 Rm Rn; exth Rm,Rn
|
|
8.0xf9+8.0x48+4.RM2,4.RN0!RM2:D1:::exth
|
|
"exth"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = EXTEND16 (State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0101 1000 Rm Rn; exthu Rm,Rn
|
|
8.0xf9+8.0x58+4.RM2,4.RN0!RM2:D1:::exthu
|
|
"exthu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = State.regs[srcreg] & 0xffff;
|
|
}
|
|
|
|
// 1111 1001 0110 1000 Rn Rn; clr Rn
|
|
8.0xf9+8.0x68+4.RM2,4.RN0=RM2:D1:::clr
|
|
"clr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = 0;
|
|
PSW |= PSW_Z;
|
|
PSW &= ~(PSW_V | PSW_C | PSW_N);
|
|
}
|
|
|
|
// 1111 1001 0111 1000 Rm Rn; add Rm,Rn
|
|
8.0xf9+8.0x78+4.RM2,4.RN0:D1b:::add
|
|
"add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericAdd (State.regs[srcreg], dstreg);
|
|
}
|
|
|
|
// 1111 1001 1000 1000 Rm Rn; addc Rm,Rn
|
|
8.0xf9+8.0x88+4.RM2,4.RN0:D1b:::addc
|
|
"addc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int z, c, n, v;
|
|
uint32_t reg1, reg2, sum;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
reg1 = State.regs[srcreg];
|
|
reg2 = State.regs[dstreg];
|
|
sum = reg1 + reg2 + ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = sum;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (sum == 0);
|
|
n = (sum & 0x80000000);
|
|
c = (sum < reg1) || (sum < reg2);
|
|
v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (sum & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1001 1001 1000 Rm Rn; sub Rm,Rn
|
|
8.0xf9+8.0x98+4.RM2,4.RN0:D1b:::sub
|
|
"sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericSub (State.regs[srcreg], dstreg);
|
|
}
|
|
|
|
// 1111 1001 1010 1000 Rm Rn; subc Rm,Rn
|
|
8.0xf9+8.0xa8+4.RM2,4.RN0:D1b:::subc
|
|
"subc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int z, c, n, v;
|
|
uint32_t reg1, reg2, difference;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
reg1 = State.regs[srcreg];
|
|
reg2 = State.regs[dstreg];
|
|
difference = reg2 - reg1 - ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = difference;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (difference == 0);
|
|
n = (difference & 0x80000000);
|
|
c = (reg1 > reg2);
|
|
v = ((reg2 & 0x80000000) == (reg1 & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (difference & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1001 1011 1000 Rn Rn; inc Rn
|
|
8.0xf9+8.0xb8+4.RN0,4.RN2=RN0:D1:::inc
|
|
"inc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericAdd (1, dstreg);
|
|
}
|
|
|
|
// 1111 1001 1101 1000 Rn Rn; inc Rn
|
|
8.0xf9+8.0xc8+4.RN0,4.RN2=RN0:D1:::inc4
|
|
"inc4"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericAdd (4, dstreg);
|
|
}
|
|
|
|
// 1111 1001 1101 1000 Rm Rn; cmp Rm,Rn
|
|
8.0xf9+8.0xd8+4.RM2,4.RN0:D1:::cmp
|
|
"cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RN0);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
genericCmp (State.regs[srcreg2], State.regs[srcreg1]);
|
|
}
|
|
|
|
// 1111 1001 1110 1000 XRm Rn; mov XRm,Rn
|
|
8.0xf9+8.0xe8+4.XRM2,4.RN0:D1l:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg, srcreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
srcreg = translate_xreg (SD_, XRM2);
|
|
|
|
State.regs[dstreg] = State.regs[srcreg];
|
|
}
|
|
|
|
// 1111 1001 1111 1000 Rm XRn; mov Rm,XRn
|
|
8.0xf9+8.0xf8+4.RM2,4.XRN0:D1m:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_xreg (SD_, XRN0);
|
|
|
|
State.regs[dstreg] = State.regs[srcreg];
|
|
}
|
|
|
|
// 1111 1001 0000 1001 Rm Rn; and Rm,Rn
|
|
8.0xf9+8.0x09+4.RM2,4.RN0:D1a:::and
|
|
"and"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] &= State.regs[srcreg];
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 0001 1001 Rm Rn; or Rm,Rn
|
|
8.0xf9+8.0x19+4.RM2,4.RN0:D1a:::or
|
|
"or"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] |= State.regs[srcreg];
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 0010 1001 Rm Rn; xor Rm,Rn
|
|
8.0xf9+8.0x29+4.RM2,4.RN0:D1a:::xor
|
|
"xor"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] ^= State.regs[srcreg];
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 0011 1001 Rn Rn; not Rn
|
|
8.0xf9+8.0x39+4.RM2,4.RN0=RM2:D1:::not
|
|
"not"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] = ~State.regs[dstreg];
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 0100 1001 Rm Rn; asr Rm,Rn
|
|
8.0xf9+8.0x49+4.RM2,4.RN0:D1a:::asr
|
|
"asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int32_t temp;
|
|
int c, z, n;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = State.regs[dstreg];
|
|
c = temp & 1;
|
|
temp >>= State.regs[srcreg];
|
|
State.regs[dstreg] = temp;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1001 0101 1001 Rm Rn; lsr Rm,Rn
|
|
8.0xf9+8.0x59+4.RM2,4.RN0:D1a:::lsr
|
|
"lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int z, n, c;
|
|
|
|
PC = cia;
|
|
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
c = State.regs[dstreg] & 1;
|
|
State.regs[dstreg] >>= State.regs[srcreg];
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1001 0110 1001 Rm Rn; asl Rm,Rn
|
|
8.0xf9+8.0x69+4.RM2,4.RN0:D1a:::asl
|
|
"asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] <<= State.regs[srcreg];
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 0111 1001 Rn Rn; asl2 Rn
|
|
8.0xf9+8.0x79+4.RM2,4.RN0=RM2:D1:::asl2
|
|
"asl2"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int n, z;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] <<= 2;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 1000 1001 Rn Rn; ror Rn
|
|
8.0xf9+8.0x89+4.RM2,4.RN0=RM2:D1:::ror
|
|
"ror"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int c, n, z;
|
|
uint32_t value;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
value = State.regs[dstreg];
|
|
c = (value & 0x1);
|
|
|
|
value >>= 1;
|
|
value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
|
|
State.regs[dstreg] = value;
|
|
z = (value == 0);
|
|
n = (value & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1001 1001 1001 Rn Rn; rol Rn
|
|
8.0xf9+8.0x99+4.RM2,4.RN0=RM2:D1:::rol
|
|
"rol"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int c, n, z;
|
|
uint32_t value;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
value = State.regs[dstreg];
|
|
c = (value & 0x80000000) ? 1 : 0;
|
|
|
|
value <<= 1;
|
|
value |= ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = value;
|
|
z = (value == 0);
|
|
n = (value & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1001 1010 1001 Rm Rn; mul Rm,Rn
|
|
8.0xf9+8.0xa9+4.RM2,4.RN0:D1b:::mul
|
|
"mul"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
uint64_t temp;
|
|
int n, z;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[dstreg]
|
|
* (int64_t)(int32_t)State.regs[srcreg]);
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 1011 1001 Rm Rn; mulu Rm,Rn
|
|
8.0xf9+8.0xb9+4.RM2,4.RN0:D1b:::mulu
|
|
"mulu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
uint64_t temp;
|
|
int n, z;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint64_t)State.regs[dstreg]
|
|
* (uint64_t)State.regs[srcreg]);
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 1100 1001 Rm Rn; div Rm,Rn
|
|
8.0xf9+8.0xc9+4.RM2,4.RN0:D1b:::div
|
|
"div"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int64_t temp;
|
|
int n, z;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = State.regs[REG_MDR];
|
|
temp <<= 32;
|
|
temp |= State.regs[dstreg];
|
|
State.regs[REG_MDR] = temp % (int32_t)State.regs[srcreg];
|
|
temp /= (int32_t)State.regs[srcreg];
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 1101 1001 Rm Rn; divu Rm,Rn
|
|
8.0xf9+8.0xd9+4.RM2,4.RN0:D1b:::divu
|
|
"divu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
uint64_t temp;
|
|
int n, z;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = State.regs[REG_MDR];
|
|
temp <<= 32;
|
|
temp |= State.regs[dstreg];
|
|
State.regs[REG_MDR] = temp % State.regs[srcreg];
|
|
temp /= State.regs[srcreg];
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
|
|
// 1111 1001 0000 1010 Rm Rn; mov (Rm),Rn
|
|
8.0xf9+8.0x0a+4.RN2,4.RM0:D1h:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0001 1010 Rm Rn; mov Rm,(Rn)
|
|
8.0xf9+8.0x1a+4.RM2,4.RN0:D1i:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0010 1010 Rm Rn; movbu (Rm),Rn
|
|
8.0xf9+8.0x2a+4.RN2,4.RM0:D1g:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0011 1010 Rm Rn; movbu Rm,(Rn)
|
|
8.0xf9+8.0x3a+4.RM2,4.RN0:D1i:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_byte (State.regs[dstreg], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0100 1010 Rm Rn; movhu (Rm),Rn
|
|
8.0xf9+8.0x4a+4.RN2,4.RM0:D1g:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0101 1010 Rm Rn; movhu Rm,(Rn)
|
|
8.0xf9+8.0x5a+4.RM2,4.RN0:D1i:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 0110 1010 Rm Rn; mov (Rm+),Rn
|
|
8.0xf9+8.0x6a+4.RN2,4.RM0!RN2:D1y:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += 4;
|
|
}
|
|
|
|
// 1111 1001 0111 1010 Rm Rn; mov Rm,(Rn+)
|
|
8.0xf9+8.0x7a+4.RM2,4.RN0:D1z:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[dstreg] += 4;
|
|
}
|
|
|
|
// 1111 1001 1000 1010 Rn 0000; mov (sp),Rn
|
|
8.0xf9+8.0x8a+4.RN2,4.0000:D1j:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[REG_SP]);
|
|
}
|
|
|
|
// 1111 1001 1001 1010 Rm 0000; mov Rm, (sp)
|
|
8.0xf9+8.0x9a+4.RM2,4.0000:D1k:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_word (State.regs[REG_SP], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 1010 1010 Rn 0000; mobvu (sp),Rn
|
|
8.0xf9+8.0xaa+4.RN2,4.0000:D1j:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[REG_SP]);
|
|
}
|
|
|
|
// 1111 1001 1011 1010 Rm 0000; movbu Rm, (sp)
|
|
8.0xf9+8.0xba+4.RM2,4.0000:D1k:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_byte (State.regs[REG_SP], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 1000 1100 Rn 0000; movhu (sp),Rn
|
|
8.0xf9+8.0xca+4.RN2,4.0000:D1j:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[REG_SP]);
|
|
}
|
|
|
|
// 1111 1001 1001 1101 Rm 0000; movhu Rm, (sp)
|
|
8.0xf9+8.0xda+4.RM2,4.0000:D1k:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_half (State.regs[REG_SP], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1001 1110 1010 Rm Rn; movhu (Rm+),Rn
|
|
8.0xf9+8.0xea+4.RN2,4.RM0!RN2:D1y:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg]);
|
|
State.regs[srcreg] += 2;
|
|
}
|
|
|
|
// 1111 1001 1111 1010 Rm Rn; movhu Rm,(Rn+)
|
|
8.0xf9+8.0xfa+4.RM2,4.RN0:D1z:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[dstreg] += 2;
|
|
}
|
|
|
|
|
|
// 1111 1001 0000 1011 Rm Rn; mac Rm,Rn
|
|
8.0xf9+8.0x0b+4.RM2,4.RN0:D1:::mac
|
|
"mac"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[srcreg2]
|
|
* (int64_t)(int32_t)State.regs[srcreg1]);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 0001 1011 Rm Rn; macu Rm,Rn
|
|
8.0xf9+8.0x1b+4.RM2,4.RN0:D1:::macu
|
|
"macu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
uint64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint64_t)State.regs[srcreg2]
|
|
* (uint64_t)State.regs[srcreg1]);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 0010 1011 Rm Rn; macb Rm,Rn
|
|
8.0xf9+8.0x2b+4.RM2,4.RN0:D1:::macb
|
|
"macb"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
int32_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int32_t)(int8_t)(State.regs[srcreg2] & 0xff)
|
|
* (int32_t)(int8_t)(State.regs[srcreg1] & 0xff));
|
|
sum = State.regs[REG_MCRL] + temp;
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 0011 1011 Rm Rn; macbu Rm,Rn
|
|
8.0xf9+8.0x3b+4.RM2,4.RN0:D1:::macbu
|
|
"macbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
int64_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg2] & 0xff)
|
|
* (uint32_t)(State.regs[srcreg1] & 0xff));
|
|
sum = State.regs[REG_MCRL] + temp;
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 0100 1011 Rm Rn; mach Rm,Rn
|
|
8.0xf9+8.0x4b+4.RM2,4.RN0:D1:::mach
|
|
"mach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint64_t)(int16_t)(State.regs[srcreg2] & 0xffff)
|
|
* (uint64_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 0101 1011 Rm Rn; machu Rm,Rn
|
|
8.0xf9+8.0x5b+4.RM2,4.RN0:D1:::machu
|
|
"machu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint64_t)(State.regs[srcreg2] & 0xffff)
|
|
* (uint64_t)(State.regs[srcreg1] & 0xffff));
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 0110 1011 Rm Rn; dmach Rm,Rn
|
|
8.0xf9+8.0x6b+4.RM2,4.RN0:D1:::dmach
|
|
"dmach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
int32_t temp, temp2, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[srcreg2] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[srcreg2] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 0111 1011 Rm Rn; dmachu Rm,Rn
|
|
8.0xf9+8.0x7b+4.RM2,4.RN0:D1:::dmachu
|
|
"dmachu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2;
|
|
uint32_t temp, temp2, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg2] & 0xffff)
|
|
* (uint32_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((uint32_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (uint32_t)((State.regs[srcreg2] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1001 1000 1011 Rm Rn; dmulh Rm,Rn
|
|
8.0xf9+8.0x8b+4.RM2,4.RN0:D1:::dmulh
|
|
"dmulh"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int32_t temp;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg] & 0xffff));
|
|
State.regs[REG_MDRQ] = temp;
|
|
temp = ((int32_t)(int16_t)((State.regs[dstreg] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[srcreg] >>16) & 0xffff));
|
|
State.regs[dstreg] = temp;
|
|
}
|
|
|
|
// 1111 1001 1001 1011 Rm Rn; dmulhu Rm,Rn
|
|
8.0xf9+8.0x9b+4.RM2,4.RN0:D1:::dumachu
|
|
"dmachu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
uint32_t temp;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint32_t)(State.regs[dstreg] & 0xffff)
|
|
* (uint32_t)(State.regs[srcreg] & 0xffff));
|
|
State.regs[REG_MDRQ] = temp;
|
|
temp = ((uint32_t)((State.regs[dstreg] >> 16) & 0xffff)
|
|
* (uint32_t)((State.regs[srcreg] >>16) & 0xffff));
|
|
State.regs[dstreg] = temp;
|
|
}
|
|
|
|
// 1111 1001 1010 1011 Rm Rn; sat16 Rm,Rn
|
|
8.0xf9+8.0xab+4.RM2,4.RN0:D1:::sat16
|
|
"sat16"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int value, z, n;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
value = State.regs[srcreg];
|
|
|
|
if (value >= 0x7fff)
|
|
State.regs[dstreg] = 0x7fff;
|
|
else if (value <= 0xffff8000)
|
|
State.regs[dstreg] = 0xffff8000;
|
|
else
|
|
State.regs[dstreg] = value;
|
|
|
|
n = (State.regs[dstreg] & 0x8000) != 0;
|
|
z = (State.regs[dstreg] == 0);
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1001 1011 1011 Rm Rn; mcste Rm,Rn
|
|
8.0xf9+8.0xbb+4.RM2,4.RN0:D1:::mcste
|
|
"mcste"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
PSW &= ~(PSW_V | PSW_C);
|
|
PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
|
|
|
|
/* 32bit saturation. */
|
|
if (State.regs[srcreg] == 0x20)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7fffffff)
|
|
State.regs[dstreg] = 0x7fffffff;
|
|
else if (tmp < 0xffffffff80000000LL)
|
|
State.regs[dstreg] = 0x80000000;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 16bit saturation */
|
|
else if (State.regs[srcreg] == 0x10)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7fff)
|
|
State.regs[dstreg] = 0x7fff;
|
|
else if (tmp < 0xffffffffffff8000LL)
|
|
State.regs[dstreg] = 0x8000;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 8 bit saturation */
|
|
else if (State.regs[srcreg] == 0x8)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7f)
|
|
State.regs[dstreg] = 0x7f;
|
|
else if (tmp < 0xffffffffffffff80LL)
|
|
State.regs[dstreg] = 0x80;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 9 bit saturation */
|
|
else if (State.regs[srcreg] == 0x9)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x80)
|
|
State.regs[dstreg] = 0x80;
|
|
else if (tmp < 0xffffffffffffff81LL)
|
|
State.regs[dstreg] = 0x81;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 9 bit saturation */
|
|
else if (State.regs[srcreg] == 0x30)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7fffffffffffLL)
|
|
tmp = 0x7fffffffffffLL;
|
|
else if (tmp < 0xffff800000000000LL)
|
|
tmp = 0xffff800000000000LL;
|
|
|
|
tmp >>= 16;
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
}
|
|
|
|
// 1111 1001 1100 1011 Rm Rn; swap Rm,Rn
|
|
8.0xf9+8.0xcb+4.RM2,4.RN0:D1:::swap
|
|
"swap"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 24)
|
|
| (((State.regs[srcreg] >> 8) & 0xff) << 16)
|
|
| (((State.regs[srcreg] >> 16) & 0xff) << 8)
|
|
| ((State.regs[srcreg] >> 24) & 0xff));
|
|
}
|
|
|
|
// 1111 1101 1101 1011 Rm Rn; swaph Rm,Rn
|
|
8.0xf9+8.0xdb+4.RM2,4.RN0:D1:::swaph
|
|
"swaph"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] = (((State.regs[srcreg] & 0xff) << 8)
|
|
| ((State.regs[srcreg] >> 8) & 0xff)
|
|
| (((State.regs[srcreg] >> 16) & 0xff) << 24)
|
|
| (((State.regs[srcreg] >> 24) & 0xff) << 16));
|
|
}
|
|
|
|
// 1111 1001 1110 1011 Rm Rn; swhw Rm,Rn
|
|
8.0xf9+8.0xeb+4.RM2,4.RN0:D1:::swhw
|
|
"swhw"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] = (((State.regs[srcreg] & 0xffff) << 16)
|
|
| ((State.regs[srcreg] >> 16) & 0xffff));
|
|
}
|
|
|
|
// 1111 1001 1111 1011 Rm Rn; bsch Rm,Rn
|
|
8.0xf9+8.0xfb+4.RM2,4.RN0:D1:::bsch
|
|
"bsch"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int temp, c, i;
|
|
int srcreg, dstreg;
|
|
int start;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = State.regs[srcreg];
|
|
start = (State.regs[dstreg] & 0x1f) - 1;
|
|
if (start == -1)
|
|
start = 31;
|
|
|
|
c = 0;
|
|
for (i = start; i >= 0; i--)
|
|
{
|
|
if (temp & (1 << i))
|
|
{
|
|
c = 1;
|
|
State.regs[dstreg] = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i < 0)
|
|
{
|
|
c = 0;
|
|
State.regs[dstreg] = 0;
|
|
}
|
|
PSW &= ~(PSW_C);
|
|
PSW |= (c ? PSW_C : 0);
|
|
}
|
|
|
|
|
|
// 1111 1011 0000 1000 Rn Rn IMM8; mov IMM8,Rn
|
|
8.0xfb+8.0x08+4.RM2,4.RN0=RM2+8.IMM8:D2j:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = EXTEND8 (IMM8);
|
|
}
|
|
|
|
// 1111 1011 0001 1000 Rn Rn IMM8; movu IMM8,Rn
|
|
8.0xfb+8.0x18+4.RM2,4.RN0=RM2+8.IMM8:D2:::movu
|
|
"movu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = IMM8 & 0xff;
|
|
}
|
|
|
|
// 1111 1011 0111 1000 Rn Rn IMM8; add IMM8,Rn
|
|
8.0xfb+8.0x78+4.RM2,4.RN0=RM2+8.IMM8:D2d:::add
|
|
"add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericAdd (EXTEND8 (IMM8), dstreg);
|
|
}
|
|
|
|
// 1111 1011 1000 1000 Rn Rn IMM8; addc IMM8,Rn
|
|
8.0xfb+8.0x88+4.RM2,4.RN0=RM2+8.IMM8:D2d:::addc
|
|
"addc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg, imm;
|
|
int z, c, n, v;
|
|
uint32_t reg2, sum;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
imm = EXTEND8 (IMM8);
|
|
reg2 = State.regs[dstreg];
|
|
sum = imm + reg2 + ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = sum;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (sum == 0);
|
|
n = (sum & 0x80000000);
|
|
c = (sum < imm) || (sum < reg2);
|
|
v = ((reg2 & 0x80000000) == (imm & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (sum & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1011 1001 1000 Rn Rn IMM8; sub IMM8,Rn
|
|
8.0xfb+8.0x98+4.RM2,4.RN0=RM2+8.IMM8:D2d:::sub
|
|
"sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
genericSub (EXTEND8 (IMM8), dstreg);
|
|
}
|
|
|
|
// 1111 1011 1010 1000 Rn Rn IMM8; subc IMM8,Rn
|
|
8.0xfb+8.0xa8+4.RM2,4.RN0=RM2+8.IMM8:D2d:::subc
|
|
"subc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int imm, dstreg;
|
|
int z, c, n, v;
|
|
uint32_t reg2, difference;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
imm = EXTEND8 (IMM8);
|
|
reg2 = State.regs[dstreg];
|
|
difference = reg2 - imm - ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = difference;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (difference == 0);
|
|
n = (difference & 0x80000000);
|
|
c = (imm > reg2);
|
|
v = ((reg2 & 0x80000000) == (imm & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (difference & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1011 1101 1000 Rn Rn IMM8; cmp IMM8,Rn
|
|
8.0xfb+8.0xd8+4.RM2,4.RN0=RM2+8.IMM8:D2b:::cmp
|
|
"cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
genericCmp (EXTEND8 (IMM8), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 1111 1000 XRn XRn IMM8; mov IMM8,XRn
|
|
8.0xfb+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM8:D2k:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_xreg (SD_, XRN0);
|
|
|
|
State.regs[dstreg] = IMM8;
|
|
}
|
|
|
|
// 1111 1011 0000 1001 Rn Rn IMM8; and IMM8,Rn
|
|
8.0xfb+8.0x09+4.RM2,4.RN0=RM2+8.IMM8:D2d:::and
|
|
"and"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] &= (IMM8 & 0xff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0001 1001 Rn Rn IMM8; or IMM8,Rn
|
|
8.0xfb+8.0x19+4.RM2,4.RN0=RM2+8.IMM8:D2d:::or
|
|
"or"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] |= (IMM8 & 0xff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0010 1001 Rn Rn IMM8; xor IMM8,Rn
|
|
8.0xfb+8.0x29+4.RM2,4.RN0=RM2+8.IMM8:D2d:::xor
|
|
"xor"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] ^= (IMM8 & 0xff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0100 1001 Rn Rn IMM8; asr IMM8,Rn
|
|
8.0xfb+8.0x49+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asr
|
|
"asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int32_t temp;
|
|
int c, z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = State.regs[dstreg];
|
|
c = temp & 1;
|
|
temp >>= (IMM8 & 0xff);
|
|
State.regs[dstreg] = temp;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1011 0101 1001 Rn Rn IMM8; lsr IMM8,Rn
|
|
8.0xfb+8.0x59+4.RM2,4.RN0=RM2+8.IMM8:D2a:::lsr
|
|
"lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n, c;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
c = State.regs[dstreg] & 1;
|
|
State.regs[dstreg] >>= (IMM8 & 0xff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1011 0110 1001 Rn Rn IMM8; asl IMM8,Rn
|
|
8.0xfb+8.0x69+4.RM2,4.RN0=RM2+8.IMM8:D2a:::asl
|
|
"asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] <<= (IMM8 & 0xff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 1010 1001 Rn Rn IMM8; mul IMM8,Rn
|
|
8.0xfb+8.0xa9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mul
|
|
"mul"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint64_t temp;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[dstreg]
|
|
* (int64_t)(int32_t)EXTEND8 (IMM8));
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 1011 1001 Rn Rn IMM8; mulu IMM8,Rn
|
|
8.0xfb+8.0xb9+4.RM2,4.RN0=RM2+8.IMM8:D2a:::mulu
|
|
"mulu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint64_t temp;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint64_t)State.regs[dstreg]
|
|
* (uint64_t)(IMM8 & 0xff));
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 1110 1001 Rn Rn IMM8; btst imm8,Rn
|
|
8.0xfb+8.0xe9+4.RN2,4.RM0=RN2+8.IMM8:D2l:::btst
|
|
"btst"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
genericBtst(IMM8, State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 0000 1010 Rn Rm IMM8; mov (d8,Rm),Rn
|
|
8.0xfb+8.0x0a+4.RN2,4.RM0+8.IMM8:D2l:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg] + EXTEND8 (IMM8));
|
|
}
|
|
|
|
// 1111 1011 0001 1010 Rn Rm IMM8; mov Rm,(d8,Rn)
|
|
8.0xfb+8.0x1a+4.RM2,4.RN0+8.IMM8:D2m:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 0010 1010 Rn Rm IMM8; movbu (d8,Rm),Rn
|
|
8.0xfb+8.0x2a+4.RN2,4.RM0+8.IMM8:D2l:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[srcreg] + EXTEND8 (IMM8));
|
|
}
|
|
|
|
// 1111 1011 0011 1010 Rn Rm IMM8; movbu Rm,(d8,Rn)
|
|
8.0xfb+8.0x3a+4.RM2,4.RN0+8.IMM8:D2m:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_byte (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 0100 1010 Rn Rm IMM8; movhu (d8,Rm),Rn
|
|
8.0xfb+8.0x4a+4.RN2,4.RM0+8.IMM8:D2l:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg] + EXTEND8 (IMM8));
|
|
}
|
|
|
|
// 1111 1011 0101 1010 Rn Rm IMM8; movhu Rm,(d8,Rn)
|
|
8.0xfb+8.0x5a+4.RM2,4.RN0+8.IMM8:D2m:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg] + EXTEND8 (IMM8), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 0110 1010 Rn Rm IMM8; mov (d8,Rm+),Rn
|
|
8.0xfb+8.0x6a+4.RN2,4.RM0!RN2+8.IMM8:D2y:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND8 (IMM8);
|
|
}
|
|
|
|
// 1111 1011 0111 1010 Rn Rm IMM8; mov Rm,(d8,Rn+)
|
|
8.0xfb+8.0x7a+4.RM2,4.RN0+8.IMM8:D2z:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[dstreg] += EXTEND8 (IMM8);
|
|
}
|
|
|
|
|
|
// 1111 1011 1000 1010 Rn 0000 IMM8; mov (d8,sp),Rn
|
|
8.0xfb+8.0x8a+4.RN2,4.0x0+8.IMM8:D2n:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[REG_SP] + IMM8);
|
|
}
|
|
|
|
// 1111 1011 1001 1010 Rm 0000 IMM8; mov Rm,(d8,sp)
|
|
8.0xfb+8.0x9a+4.RM2,4.0x0+8.IMM8:D2o:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_word (State.regs[REG_SP] + IMM8, State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 1010 1010 Rn Rm IMM8; movbu (d8,sp),Rn
|
|
8.0xfb+8.0xaa+4.RN2,4.0x0+8.IMM8:D2n:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[REG_SP] + IMM8);
|
|
}
|
|
|
|
// 1111 1011 1011 1010 Rn Rm IMM8; movbu Rm,(d8,sp)
|
|
8.0xfb+8.0xba+4.RM2,4.0x0+8.IMM8:D2o:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_byte (State.regs[REG_SP] + IMM8, State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 1100 1010 Rn Rm IMM8; movhu (d8,sp),Rn
|
|
8.0xfb+8.0xca+4.RN2,4.0x0+8.IMM8:D2n:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[REG_SP] + IMM8);
|
|
}
|
|
|
|
// 1111 1011 1101 1010 Rn Rm IMM8; movhu Rm,(d8,sp)
|
|
8.0xfb+8.0xda+4.RM2,4.0x0+8.IMM8:D2o:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_half (State.regs[REG_SP] + IMM8, State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 1110 1010 Rn Rm IMM8; movhu (d8,Rm+),Rn
|
|
8.0xfb+8.0xea+4.RN2,4.RM0!RN2+8.IMM8:D2y:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND8 (IMM8);
|
|
}
|
|
|
|
// 1111 1011 1111 1010 Rn Rm IMM8; movhu Rm,(d8,Rn+)
|
|
8.0xfb+8.0xfa+4.RM2,4.RN0+8.IMM8:D2z:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[dstreg] += EXTEND8 (IMM8);
|
|
}
|
|
|
|
|
|
// 1111 1011 0000 1011 Rn Rn IMM8; mac imm8,Rn
|
|
8.0xfb+8.0x0b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mac
|
|
"mac"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int64_t)(int32_t)EXTEND8 (IMM8)
|
|
* (int64_t)(int32_t)State.regs[srcreg]);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1011 0001 1011 Rn Rn IMM8; macu imm8,Rn
|
|
8.0xfb+8.0x1b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macu
|
|
"macu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((uint64_t) (IMM8)
|
|
* (uint64_t)State.regs[srcreg]);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1011 0010 1011 Rn Rn IMM8; macb imm8,Rn
|
|
8.0xfb+8.0x2b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macb
|
|
"macb"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int64_t)(int8_t)EXTEND8 (IMM8)
|
|
* (int64_t)(int8_t)State.regs[srcreg] & 0xff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1011 0011 1011 Rn Rn IMM8; macbu imm8,Rn
|
|
8.0xfb+8.0x3b+4.RN2,4.RN0=RN2+8.IMM8:D2:::macbu
|
|
"macbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((uint64_t) (IMM8)
|
|
* (uint64_t)State.regs[srcreg] & 0xff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1011 0100 1011 Rn Rn IMM8; mach imm8,Rn
|
|
8.0xfb+8.0x4b+4.RN2,4.RN0=RN2+8.IMM8:D2:::mach
|
|
"mach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int64_t)(int16_t)EXTEND8 (IMM8)
|
|
* (int64_t)(int16_t)State.regs[srcreg] & 0xffff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1011 0101 1011 Rn Rn IMM8; machu imm8,Rn
|
|
8.0xfb+8.0x5b+4.RN2,4.RN0=RN2+8.IMM8:D2:::machu
|
|
"machu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((uint64_t) (IMM8)
|
|
* (uint64_t)State.regs[srcreg] & 0xffff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1011 1011 1011 Rn Rn IMM8; mcste imm8,Rn
|
|
8.0xfb+8.0xbb+4.RN2,4.RN0=RN2+8.IMM8:D2:::mcste
|
|
"mcste"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
PSW &= ~(PSW_V | PSW_C);
|
|
PSW |= (State.regs[REG_MCVF] ? PSW_V : 0);
|
|
|
|
/* 32bit saturation. */
|
|
if (IMM8 == 0x20)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7fffffff)
|
|
State.regs[dstreg] = 0x7fffffff;
|
|
else if (tmp < 0xffffffff80000000LL)
|
|
State.regs[dstreg] = 0x80000000;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 16bit saturation */
|
|
else if (IMM8 == 0x10)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7fff)
|
|
State.regs[dstreg] = 0x7fff;
|
|
else if (tmp < 0xffffffffffff8000LL)
|
|
State.regs[dstreg] = 0x8000;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 8 bit saturation */
|
|
else if (IMM8 == 0x8)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7f)
|
|
State.regs[dstreg] = 0x7f;
|
|
else if (tmp < 0xffffffffffffff80LL)
|
|
State.regs[dstreg] = 0x80;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 9 bit saturation */
|
|
else if (IMM8 == 0x9)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x80)
|
|
State.regs[dstreg] = 0x80;
|
|
else if (tmp < 0xffffffffffffff81LL)
|
|
State.regs[dstreg] = 0x81;
|
|
else
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
/* 9 bit saturation */
|
|
else if (IMM8 == 0x30)
|
|
{
|
|
int64_t tmp;
|
|
|
|
tmp = State.regs[REG_MCRH];
|
|
tmp <<= 32;
|
|
tmp += State.regs[REG_MCRL];
|
|
|
|
if (tmp > 0x7fffffffffffLL)
|
|
tmp = 0x7fffffffffffLL;
|
|
else if (tmp < 0xffff800000000000LL)
|
|
tmp = 0xffff800000000000LL;
|
|
|
|
tmp >>= 16;
|
|
State.regs[dstreg] = tmp;
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0111 1100 Rm Rn Rd; add Rm,Rn,Rd
|
|
8.0xfb+8.0x7c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::add
|
|
"add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, c, n, v;
|
|
uint32_t sum, source1, source2;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
source1 = State.regs[srcreg1];
|
|
source2 = State.regs[srcreg2];
|
|
sum = source1 + source2;
|
|
State.regs[dstreg] = sum;
|
|
|
|
z = (sum == 0);
|
|
n = (sum & 0x80000000);
|
|
c = (sum < source1) || (sum < source2);
|
|
v = ((source1 & 0x80000000) == (source2 & 0x80000000)
|
|
&& (source1 & 0x80000000) != (sum & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1011 1000 1100 Rm Rn Rd; addc Rm,Rn,Rd
|
|
8.0xfb+8.0x8c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::addc
|
|
"addc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, c, n, v;
|
|
uint32_t sum, source1, source2;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
source1 = State.regs[srcreg1];
|
|
source2 = State.regs[srcreg2];
|
|
sum = source1 + source2 + ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = sum;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (sum == 0);
|
|
n = (sum & 0x80000000);
|
|
c = (sum < source1) || (sum < source2);
|
|
v = ((source1 & 0x80000000) == (source2 & 0x80000000)
|
|
&& (source1 & 0x80000000) != (sum & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1011 1001 1100 Rm Rn Rd; sub Rm,Rn,Rd
|
|
8.0xfb+8.0x9c+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::sub
|
|
"sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, c, n, v;
|
|
uint32_t difference, source1, source2;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
source1 = State.regs[srcreg1];
|
|
source2 = State.regs[srcreg2];
|
|
difference = source2 - source1;
|
|
State.regs[dstreg] = difference;
|
|
|
|
z = (difference == 0);
|
|
n = (difference & 0x80000000);
|
|
c = (source1 > source2);
|
|
v = ((source1 & 0x80000000) == (source2 & 0x80000000)
|
|
&& (source1 & 0x80000000) != (difference & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1011 1010 1100 Rm Rn Rd; subc Rm,Rn,Rd
|
|
8.0xfb+8.0xac+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::subc
|
|
"subc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, c, n, v;
|
|
uint32_t difference, source1, source2;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
source1 = State.regs[srcreg1];
|
|
source2 = State.regs[srcreg2];
|
|
difference = source2 - source1 - ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = difference;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (difference == 0);
|
|
n = (difference & 0x80000000);
|
|
c = (source1 > source2);
|
|
v = ((source1 & 0x80000000) == (source2 & 0x80000000)
|
|
&& (source1 & 0x80000000) != (difference & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1011 0000 1101 Rm Rn Rd; and Rm,Rn,Rd
|
|
8.0xfb+8.0x0d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::and
|
|
"and"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, n;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
State.regs[dstreg] = State.regs[srcreg1] & State.regs[srcreg2];
|
|
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0001 1101 Rm Rn Rd; or Rm,Rn,Rd
|
|
8.0xfb+8.0x1d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::or
|
|
"or"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, n;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
State.regs[dstreg] = State.regs[srcreg1] | State.regs[srcreg2];
|
|
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0010 1101 Rm Rn Rd; xor Rm,Rn,Rd
|
|
8.0xfb+8.0x2d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::xor
|
|
"xor"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, n;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
State.regs[dstreg] = State.regs[srcreg1] ^ State.regs[srcreg2];
|
|
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0100 1101 Rm Rn Rd; asr Rm,Rn,Rd
|
|
8.0xfb+8.0x4d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asr
|
|
"asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, c, n;
|
|
int32_t temp;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
temp = State.regs[srcreg2];
|
|
c = temp & 1;
|
|
temp >>= State.regs[srcreg1];
|
|
State.regs[dstreg] = temp;
|
|
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0101 1101 Rm Rn Rd; lsr Rm,Rn,Rd
|
|
8.0xfb+8.0x5d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::lsr
|
|
"lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, c, n;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
c = State.regs[srcreg2] & 1;
|
|
State.regs[dstreg] = State.regs[srcreg2] >> State.regs[srcreg1];
|
|
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0110 1101 Rm Rn Rd; asl Rm,Rn,Rd
|
|
8.0xfb+8.0x6d+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::asl
|
|
"asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int z, n;
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
State.regs[dstreg] = State.regs[srcreg2] << State.regs[srcreg1];
|
|
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 1010 1101 Rm Rn Rd1 Rd2; mul Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0xad+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::mul
|
|
"mul"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp;
|
|
int n, z;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD2);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[srcreg1]
|
|
* (int64_t)(int32_t)State.regs[srcreg2]);
|
|
State.regs[dstreg2] = temp & 0xffffffff;
|
|
State.regs[dstreg1] = (temp & 0xffffffff00000000LL) >> 32;
|
|
|
|
z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
|
|
n = (State.regs[dstreg1] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 1011 1101 Rm Rn Rd1 Rd2; mulu Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0xbd+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::mulu
|
|
"mulu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp;
|
|
int n, z;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD2);
|
|
|
|
temp = ((uint64_t)State.regs[srcreg1]
|
|
* (uint64_t)State.regs[srcreg2]);
|
|
State.regs[dstreg2] = temp & 0xffffffff;
|
|
State.regs[dstreg1] = (temp & 0xffffffff00000000LL) >> 32;
|
|
|
|
z = (State.regs[dstreg1] == 0) && (State.regs[dstreg2] == 0);
|
|
n = (State.regs[dstreg1] & 0x80000000);
|
|
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 0000 1110 Rn 0000 abs8 ; mov (abs8),Rn
|
|
8.0xfb+8.0x0e+4.RN2,4.0x0+8.IMM8:D2p:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (IMM8);
|
|
}
|
|
|
|
// 1111 1011 0001 1110 Rm 0000 abs8 ; mov Rn,(abs8)
|
|
8.0xfb+8.0x1e+4.RM2,4.0x0+8.IMM8:D2q:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_word (IMM8, State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 0010 1110 Rn 0000 abs8 ; movbu (abs8),Rn
|
|
8.0xfb+8.0x2e+4.RN2,4.0x0+8.IMM8:D2p:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (IMM8);
|
|
}
|
|
|
|
// 1111 1011 0011 1110 Rm 0000 abs8 ; movbu Rn,(abs8)
|
|
8.0xfb+8.0x3e+4.RM2,4.0x0+8.IMM8:D2q:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_byte (IMM8, State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 0100 1110 Rn 0000 abs8 ; movhu (abs8),Rn
|
|
8.0xfb+8.0x4e+4.RN2,4.0x0+8.IMM8:D2p:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (IMM8);
|
|
}
|
|
|
|
// 1111 1011 0101 1110 Rm 0000 abs8 ; movhu Rn,(abs8)
|
|
8.0xfb+8.0x5e+4.RM2,4.0x0+8.IMM8:D2q:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_half (IMM8, State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 1000 1110 Ri Rm Rn; mov (Ri,Rm),Rn
|
|
8.0xfb+8.0x8e+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM0);
|
|
srcreg2 = translate_rreg (SD_, RI0);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg1] + State.regs[srcreg2]);
|
|
}
|
|
|
|
// 1111 1011 1001 1110 Ri Rm Rn; mov Rn,(Ri,Rm)
|
|
8.0xfb+8.0x9e+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg1 = translate_rreg (SD_, RI0);
|
|
dstreg2 = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 1010 1110 Ri Rm Rn; movbu (Ri,Rm),Rn
|
|
8.0xfb+8.0xae+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM0);
|
|
srcreg2 = translate_rreg (SD_, RI0);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = load_byte (State.regs[srcreg1] + State.regs[srcreg2]);
|
|
}
|
|
|
|
// 1111 1011 1011 1110 Ri Rm Rn; movbu Rn,(Ri,Rm)
|
|
8.0xfb+8.0xbe+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg1 = translate_rreg (SD_, RI0);
|
|
dstreg2 = translate_rreg (SD_, RN0);
|
|
store_byte (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 1100 1110 Ri Rm Rn; movhu (Ri,Rm),Rn
|
|
8.0xfb+8.0xce+4.RI0,4.RM0+4.RN0,4.0x0:D2r:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM0);
|
|
srcreg2 = translate_rreg (SD_, RI0);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg1] + State.regs[srcreg2]);
|
|
}
|
|
|
|
// 1111 1011 1101 1110 Ri Rm Rn; movhu Rn,(Ri,Rm)
|
|
8.0xfb+8.0xde+4.RI0,4.RN0+4.RM0,4.0x0:D2s:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg1 = translate_rreg (SD_, RI0);
|
|
dstreg2 = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg1] + State.regs[dstreg2], State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1011 0000 1111 Rm Rn Rd1 Rd2; mac Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0x0f+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::mac
|
|
"mac"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp;
|
|
uint32_t sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD2);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[srcreg1]
|
|
* (int64_t)(int32_t)State.regs[srcreg2]);
|
|
|
|
sum = State.regs[dstreg2] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
|
|
State.regs[dstreg2] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[dstreg1] + temp + c;
|
|
v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg1] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= (( v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0001 1111 Rm Rn Rd1 Rd2; macu Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0x1f+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::macu
|
|
"macu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp;
|
|
uint32_t sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD2);
|
|
|
|
temp = ((uint64_t)State.regs[srcreg1]
|
|
* (uint64_t)State.regs[srcreg2]);
|
|
|
|
sum = State.regs[dstreg2] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[dstreg2]) || (sum < (temp & 0xffffffff));
|
|
State.regs[dstreg2] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[dstreg1] + temp + c;
|
|
v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg1] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= (( v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0010 1111 Rm Rn Rd1; macb Rm,Rn,Rd1
|
|
8.0xfb+8.0x2f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macb
|
|
"macb"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg;
|
|
int32_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
temp = ((int32_t)(State.regs[srcreg2] & 0xff)
|
|
* (int32_t)(State.regs[srcreg1] & 0xff));
|
|
sum = State.regs[dstreg] + temp;
|
|
v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= ((v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0011 1111 Rm Rn Rd1; macbu Rm,Rn,Rd1
|
|
8.0xfb+8.0x3f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::macbu
|
|
"macbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg;
|
|
int32_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg2] & 0xff)
|
|
* (uint32_t)(State.regs[srcreg1] & 0xff));
|
|
sum = State.regs[dstreg] + temp;
|
|
v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= ((v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0100 1111 Rm Rn Rd1; mach Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0x4f+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::mach
|
|
"mach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD0);
|
|
|
|
temp = ((int32_t)(State.regs[srcreg2] & 0xffff)
|
|
* (int32_t)(State.regs[srcreg1] & 0xffff));
|
|
State.regs[dstreg2] += (temp & 0xffffffff);
|
|
sum = State.regs[dstreg1] + ((temp >> 32) & 0xffffffff);
|
|
v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg1] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= ((v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0101 1111 Rm Rn Rd1; machu Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0x5f+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::machu
|
|
"machu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD0);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg2] & 0xffff)
|
|
* (uint32_t)(State.regs[srcreg1] & 0xffff));
|
|
State.regs[dstreg2] += (temp & 0xffffffff);
|
|
sum = State.regs[dstreg1] + ((temp >> 32) & 0xffffffff);
|
|
v = ((State.regs[dstreg1] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg1] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= ((v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0110 1111 Rm Rn Rd1; dmach Rm,Rn,Rd1
|
|
8.0xfb+8.0x6f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmach
|
|
"dmach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg;
|
|
int32_t temp, temp2, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
temp = ((int32_t)(State.regs[srcreg2] & 0xffff)
|
|
* (int32_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)((State.regs[srcreg2] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[dstreg];
|
|
v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= ((v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 0111 1111 Rm Rn Rd1; dmachu Rm,Rn,Rd1
|
|
8.0xfb+8.0x7f+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::dmachu
|
|
"dmachu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg;
|
|
int32_t temp, temp2, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg2] & 0xffff)
|
|
* (uint32_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((uint32_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (uint32_t)((State.regs[srcreg2] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[dstreg];
|
|
v = ((State.regs[dstreg] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[dstreg] = sum;
|
|
if (v)
|
|
{
|
|
State.regs[REG_MCVF] = 1;
|
|
PSW &= ~(PSW_V);
|
|
PSW |= ((v ? PSW_V : 0));
|
|
}
|
|
}
|
|
|
|
// 1111 1011 1000 1111 Rm Rn Rd1 Rd2; dmulh Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0x8f+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::dmulh
|
|
"dmulh"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD2);
|
|
|
|
temp = ((int32_t)(State.regs[srcreg1] & 0xffff)
|
|
* (int32_t)(State.regs[srcreg1] & 0xffff));
|
|
State.regs[dstreg2] = temp;
|
|
temp = ((int32_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)((State.regs[srcreg1] >>16) & 0xffff));
|
|
State.regs[dstreg1] = temp;
|
|
}
|
|
|
|
// 1111 1011 1001 1111 Rm Rn Rd1 Rd2; dmulhu Rm,Rn,Rd1,Rd2
|
|
8.0xfb+8.0x9f+4.RM2,4.RN0+4.RD0,4.RD2!RD0:D2c:::dmulhu
|
|
"dmulhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int64_t temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg1 = translate_rreg (SD_, RD0);
|
|
dstreg2 = translate_rreg (SD_, RD2);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg1] & 0xffff)
|
|
* (uint32_t)(State.regs[srcreg1] & 0xffff));
|
|
State.regs[dstreg2] = temp;
|
|
temp = ((uint32_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (uint32_t)((State.regs[srcreg1] >>16) & 0xffff));
|
|
State.regs[dstreg1] = temp;
|
|
}
|
|
|
|
// 1111 1011 1010 1111 Rm Rn; sat24 Rm,Rn
|
|
8.0xfb+8.0xaf+4.RM2,4.RN0+8.0x0:D2:::sat24
|
|
"sat24"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
int value, n, z;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
value = State.regs[srcreg];
|
|
|
|
if (value >= 0x7fffff)
|
|
State.regs[dstreg] = 0x7fffff;
|
|
else if (value <= 0xff800000)
|
|
State.regs[dstreg] = 0xff800000;
|
|
else
|
|
State.regs[dstreg] = value;
|
|
|
|
n = (State.regs[dstreg] & 0x800000) != 0;
|
|
z = (State.regs[dstreg] == 0);
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1011 1111 1111 Rm Rn Rd1; bsch Rm,Rn,Rd1
|
|
8.0xfb+8.0xff+4.RM2,4.RN0+4.RD0,4.0x0:D2c:::bsch
|
|
"bsch"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int temp, c, i;
|
|
int srcreg1, srcreg2, dstreg;
|
|
int start;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM2);
|
|
srcreg2 = translate_rreg (SD_, RN0);
|
|
dstreg = translate_rreg (SD_, RD0);
|
|
|
|
temp = State.regs[srcreg1];
|
|
start = (State.regs[srcreg2] & 0x1f) - 1;
|
|
if (start == -1)
|
|
start = 31;
|
|
|
|
c = 0;
|
|
for (i = start; i >= 0; i--)
|
|
{
|
|
if (temp & (1 << i))
|
|
{
|
|
c = 1;
|
|
State.regs[dstreg] = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (i < 0)
|
|
{
|
|
c = 0;
|
|
State.regs[dstreg] = 0;
|
|
}
|
|
PSW &= ~(PSW_C);
|
|
PSW |= (c ? PSW_C : 0);
|
|
}
|
|
|
|
// 1111 1101 0000 1000 Rn Rn IMM32; mov imm24,Rn
|
|
8.0xfd+8.0x08+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 0001 1000 Rn Rn IMM32; movu imm24,Rn
|
|
8.0xfd+8.0x18+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4k:::movu
|
|
"movu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
|
|
}
|
|
|
|
// 1111 1101 0111 1000 Rn Rn IMM32; add imm24,Rn
|
|
8.0xfd+8.0x78+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4c:::add
|
|
"add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericAdd (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
|
|
}
|
|
|
|
// 1111 1101 1000 1000 Rn Rn IMM32; addc imm24,Rn
|
|
8.0xfd+8.0x88+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::addc
|
|
"addc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg, z, n, c, v;
|
|
uint32_t sum, imm, reg2;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
reg2 = State.regs[dstreg];
|
|
sum = imm + reg2 + ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = sum;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (sum == 0);
|
|
n = (sum & 0x80000000);
|
|
c = (sum < imm) || (sum < reg2);
|
|
v = ((reg2 & 0x80000000) == (imm & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (sum & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1101 1001 1000 Rn Rn IMM32; sub imm24,Rn
|
|
8.0xfd+8.0x98+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::sub
|
|
"sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericSub (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), dstreg);
|
|
}
|
|
|
|
// 1111 1101 1010 1000 Rn Rn IMM32; subc imm24,Rn
|
|
8.0xfd+8.0xa8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::subc
|
|
"subc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg, z, n, c, v;
|
|
uint32_t difference, imm, reg2;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
imm = EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
reg2 = State.regs[dstreg];
|
|
difference = reg2 - imm - ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = difference;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (difference == 0);
|
|
n = (difference & 0x80000000);
|
|
c = (imm > reg2);
|
|
v = ((reg2 & 0x80000000) == (imm & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (difference & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1101 1101 1000 Rn Rn IMM32; cmp imm24,Rn
|
|
8.0xfd+8.0xd8+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::cmp
|
|
"cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
genericCmp (EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 1111 1000 XRn XRn IMM32; mov imm24,XRn
|
|
8.0xfd+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM24A+8.IMM24B+8.IMM24C:D4o:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_xreg (SD_, XRN0);
|
|
|
|
State.regs[dstreg] = FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff;
|
|
}
|
|
|
|
// 1111 1101 0000 1001 Rn Rn IMM24; and imm24,Rn
|
|
8.0xfd+8.0x09+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::and
|
|
"and"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z,n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] &= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1101 0001 1001 Rn Rn IMM24; or imm24,Rn
|
|
8.0xfd+8.0x19+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::or
|
|
"or"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z,n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] |= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1101 0010 1001 Rn Rn IMM24; xor imm24,Rn
|
|
8.0xfd+8.0x29+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::xor
|
|
"xor"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z,n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] ^= (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffffff);
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1101 0100 1001 Rn Rn IMM24; asr imm24,Rn
|
|
8.0xfd+8.0x49+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asr
|
|
"asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int32_t temp;
|
|
int c, z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = State.regs[dstreg];
|
|
c = temp & 1;
|
|
temp >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
State.regs[dstreg] = temp;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
|
|
// 1111 1101 0101 1001 Rn Rn IMM24; lsr imm24,Rn
|
|
8.0xfd+8.0x59+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::lsr
|
|
"lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n, c;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
c = State.regs[dstreg] & 1;
|
|
State.regs[dstreg] >>= (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1101 0110 1001 Rn Rn IMM24; asl imm24,Rn
|
|
8.0xfd+8.0x69+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::asl
|
|
"asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] <<= (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1101 1010 1001 Rn Rn IMM24; mul imm24,Rn
|
|
8.0xfd+8.0xa9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mul
|
|
"mul"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint64_t temp;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[dstreg]
|
|
* (int64_t)(int32_t)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1101 1011 1001 Rn Rn IMM24; mulu imm24,Rn
|
|
8.0xfd+8.0xb9+4.RM2,4.RN0=RM2+8.IMM24A+8.IMM24B+8.IMM24C:D4b:::mulu
|
|
"mulu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint64_t temp;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint64_t)State.regs[dstreg]
|
|
* (uint64_t)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)));
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1101 1110 1001 Rn Rn IMM24; btst imm24,,Rn
|
|
8.0xfd+8.0xe9+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::btst
|
|
"btst"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
genericBtst (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 0000 1010 Rn Rm IMM24; mov (d24,Rm),Rn
|
|
8.0xfd+8.0x0a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]
|
|
+ EXTEND24 (FETCH24 (IMM24A,
|
|
IMM24B, IMM24C)));
|
|
}
|
|
|
|
// 1111 1101 0001 1010 Rm Rn IMM24; mov Rm,(d24,Rn)
|
|
8.0xfd+8.0x1a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 0010 1010 Rn Rm IMM24; movbu (d24,Rm),Rn
|
|
8.0xfd+8.0x2a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[srcreg]
|
|
+ EXTEND24 (FETCH24 (IMM24A,
|
|
IMM24B, IMM24C)));
|
|
}
|
|
|
|
// 1111 1101 0011 1010 Rm Rn IMM24; movbu Rm,(d24,Rn)
|
|
8.0xfd+8.0x3a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_byte (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 0100 1010 Rn Rm IMM24; movhu (d24,Rm),Rn
|
|
8.0xfd+8.0x4a+4.RN2,4.RM0+8.IMM24A+8.IMM24B+8.IMM24C:D4p:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg]
|
|
+ EXTEND24 (FETCH24 (IMM24A,
|
|
IMM24B, IMM24C)));
|
|
}
|
|
|
|
// 1111 1101 0101 1010 Rm Rn IMM24; movhu Rm,(d24,Rn)
|
|
8.0xfd+8.0x5a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4q:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg] + EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C)),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 0110 1010 Rn Rm IMM24; mov (d24,Rm+),Rn
|
|
8.0xfd+8.0x6a+4.RN2,4.RM0!RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 0111 1010 Rm Rn IMM24; mov Rm,(d24,Rn+)
|
|
8.0xfd+8.0x7a+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[dstreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
|
|
// 1111 1101 1000 1010 Rn 0000 IMM24; mov (d24,sp),Rn
|
|
8.0xfd+8.0x8a+4.RN2,4.0x0+IMM24A+8.IMM24B+8.IMM24C:D4r:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[REG_SP]
|
|
+ FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 1001 1010 Rm 0000 IMM24; mov Rm,(d24,sp)
|
|
8.0xfd+8.0x9a+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_word (State.regs[REG_SP] + FETCH24 (IMM24A, IMM24B, IMM24C),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 1010 1010 Rn 0000 IMM24; movbu (d24,sp),Rn
|
|
8.0xfd+8.0xaa+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[REG_SP]
|
|
+ FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 1011 1010 Rm 0000 IMM24; movbu Rm,(d24,sp)
|
|
8.0xfd+8.0xba+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_byte (State.regs[REG_SP] + FETCH24 (IMM24A, IMM24B, IMM24C),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 1100 1010 Rn 0000 IMM24; movhu (d24,sp),Rn
|
|
8.0xfd+8.0xca+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4r:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[REG_SP]
|
|
+ FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 1101 1010 Rm Rn IMM24; movhu Rm,(d24,sp)
|
|
8.0xfd+8.0xda+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4s:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_half (State.regs[REG_SP] + FETCH24 (IMM24A, IMM24B, IMM24C),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1101 1110 1010 Rn Rm IMM24; movhu (d24,Rm+),Rn
|
|
8.0xfd+8.0xea+4.RN2,4.RM0!RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4y:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg]);
|
|
State.regs[dstreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 1111 1010 Rm Rn IMM24; movhu Rm,(d24,Rn+)
|
|
8.0xfd+8.0xfa+4.RM2,4.RN0+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 0000 1011 Rn IMM24; mac imm24,Rn
|
|
8.0xfd+8.0x0b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mac
|
|
"mac"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int64_t)EXTEND24 (FETCH24 (IMM24A, IMM24B, IMM24C))
|
|
* (int64_t)State.regs[srcreg]);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1101 0001 1011 Rn IMM24; macu imm24,Rn
|
|
8.0xfd+8.0x1b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macu
|
|
"macu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((uint64_t) (FETCH24 (IMM24A, IMM24B, IMM24C))
|
|
* (uint64_t)State.regs[srcreg]);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1101 0010 1011 Rn IMM24; macb imm24,Rn
|
|
8.0xfd+8.0x2b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macb
|
|
"macb"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int64_t)EXTEND8 (FETCH24 (IMM24A, IMM24B, IMM24C))
|
|
* (int64_t)State.regs[srcreg] & 0xff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1101 0011 1011 Rn IMM24; macbu imm24,Rn
|
|
8.0xfd+8.0x3b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::macbu
|
|
"macbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((uint64_t) (FETCH24 (IMM24A, IMM24B, IMM24C))
|
|
* (uint64_t)State.regs[srcreg] & 0xff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1101 0100 1011 Rn IMM24; mach imm24,Rn
|
|
8.0xfd+8.0x4b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::mach
|
|
"mach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int64_t)EXTEND16 (FETCH24 (IMM24A, IMM24B, IMM24C))
|
|
* (int64_t)State.regs[srcreg] & 0xffff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1101 0101 1011 Rn IMM24; machu imm24,Rn
|
|
8.0xfd+8.0x5b+4.RN2,4.RN0=RN2+8.IMM24A+8.IMM24B+8.IMM24C:D4z:::machu
|
|
"machu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((uint64_t) (FETCH24 (IMM24A, IMM24B, IMM24C) & 0xffff)
|
|
* (uint64_t)State.regs[srcreg] & 0xffff);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1101 0000 1110 Rn 0000 ABS24; mov (abs24),Rn
|
|
8.0xfd+8.0x0e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 0001 1110 Rm 0000 ABS24; mov Rm,(abs24)
|
|
8.0xfd+8.0x1e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4v:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_word (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
|
|
}
|
|
|
|
|
|
// 1111 1101 0010 1110 Rn 0000 ABS24; movbu (abs24),Rn
|
|
8.0xfd+8.0x2e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 0011 1110 Rm 0000 ABS24; movbu Rm,(abs24)
|
|
8.0xfd+8.0x3e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_byte (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
|
|
}
|
|
|
|
|
|
// 1111 1101 0100 1110 Rn 0000 ABS24; movhu (abs24),Rn
|
|
8.0xfd+8.0x4e+4.RN2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4t:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (FETCH24 (IMM24A, IMM24B, IMM24C));
|
|
}
|
|
|
|
// 1111 1101 0101 1110 Rm 0000 ABS24; movhu Rm,(abs24)
|
|
8.0xfd+8.0x5e+4.RM2,4.0x0+8.IMM24A+8.IMM24B+8.IMM24C:D4u:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_half (FETCH24 (IMM24A, IMM24B, IMM24C), State.regs[srcreg]);
|
|
}
|
|
|
|
|
|
// 1111 1110 0000 1000 Rn Rn IMM32; mov imm32,Rn
|
|
8.0xfe+8.0x08+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
// 1111 1110 0001 1000 Rn Rn IMM32; movu imm32,Rn
|
|
8.0xfe+8.0x18+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movu
|
|
"movu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
// 1111 1110 0111 1000 Rn Rn IMM32; add imm32,Rn
|
|
8.0xfe+8.0x78+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::add
|
|
"add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericAdd (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
|
|
}
|
|
|
|
// 1111 1110 1000 1000 Rn Rn IMM32; addc imm32,Rn
|
|
8.0xfe+8.0x88+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::addc
|
|
"addc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint32_t imm, reg2, sum;
|
|
int z, n, c, v;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
reg2 = State.regs[dstreg];
|
|
sum = imm + reg2 + ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = sum;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (sum == 0);
|
|
n = (sum & 0x80000000);
|
|
c = (sum < imm) || (sum < reg2);
|
|
v = ((reg2 & 0x80000000) == (imm & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (sum & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1110 1001 1000 Rn Rn IMM32; sub imm32,Rn
|
|
8.0xfe+8.0x98+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::sub
|
|
"sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
genericSub (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), dstreg);
|
|
}
|
|
|
|
// 1111 1110 1010 1000 Rn Rn IMM32; subc imm32,Rn
|
|
8.0xfe+8.0xa8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::subc
|
|
"subc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint32_t imm, reg2, difference;
|
|
int z, n, c, v;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
reg2 = State.regs[dstreg];
|
|
difference = reg2 - imm - ((PSW & PSW_C) != 0);
|
|
State.regs[dstreg] = difference;
|
|
|
|
z = ((PSW & PSW_Z) != 0) && (difference == 0);
|
|
n = (difference & 0x80000000);
|
|
c = (imm > reg2);
|
|
v = ((reg2 & 0x80000000) == (imm & 0x80000000)
|
|
&& (reg2 & 0x80000000) != (difference & 0x80000000));
|
|
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
|
|
| (c ? PSW_C : 0) | (v ? PSW_V : 0));
|
|
}
|
|
|
|
// 1111 1110 0111 1000 Rn Rn IMM32; cmp imm32,Rn
|
|
8.0xfe+8.0xd8+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::cmp
|
|
"cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
genericCmp (FETCH32(IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 1111 1000 XRn XRn IMM32; mov imm32,XRn
|
|
8.0xfe+8.0xf8+4.XRM2,4.XRN0=XRM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_xreg (SD_, XRN0);
|
|
|
|
State.regs[dstreg] = FETCH32(IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
// 1111 1110 0000 1001 Rn Rn IMM32; and imm32,Rn
|
|
8.0xfe+8.0x09+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::and
|
|
"and"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z,n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] &= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1110 0001 1001 Rn Rn IMM32; or imm32,Rn
|
|
8.0xfe+8.0x19+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::or
|
|
"or"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z,n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] |= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1110 0010 1001 Rn Rn IMM32; xor imm32,Rn
|
|
8.0xfe+8.0x29+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::xor
|
|
"xor"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z,n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] ^= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1110 0100 1001 Rn Rn IMM32; asr imm32,Rn
|
|
8.0xfe+8.0x49+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asr
|
|
"asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int32_t temp;
|
|
int c, z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = State.regs[dstreg];
|
|
c = temp & 1;
|
|
temp >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
State.regs[dstreg] = temp;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1110 0101 1001 Rn Rn IMM32; lsr imm32,Rn
|
|
8.0xfe+8.0x59+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::lsr
|
|
"lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n, c;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
c = State.regs[dstreg] & 1;
|
|
State.regs[dstreg] >>= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
|
|
}
|
|
|
|
// 1111 1110 0110 1001 Rn Rn IMM32; asl imm32,Rn
|
|
8.0xfe+8.0x69+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::asl
|
|
"asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
State.regs[dstreg] <<= (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1110 1010 1001 Rn Rn IMM32; mul imm32,Rn
|
|
8.0xfe+8.0xa9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mul
|
|
"mul"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint64_t temp;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[dstreg]
|
|
* (int64_t)(int32_t)(FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1110 1011 1001 Rn Rn IMM32; mulu imm32,Rn
|
|
8.0xfe+8.0xb9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mulu
|
|
"mulu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
uint64_t temp;
|
|
int z, n;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
|
|
temp = ((uint64_t)State.regs[dstreg]
|
|
* (uint64_t) (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D)));
|
|
State.regs[dstreg] = temp & 0xffffffff;
|
|
State.regs[REG_MDR] = (temp & 0xffffffff00000000LL) >> 32;
|
|
z = (State.regs[dstreg] == 0);
|
|
n = (State.regs[dstreg] & 0x80000000) != 0;
|
|
PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
|
|
PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
|
|
}
|
|
|
|
// 1111 1110 1110 1001 Rn Rn IMM32; btst imm32,Rn
|
|
8.0xfe+8.0xe9+4.RM2,4.RN0=RM2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5a:::btst
|
|
"btst"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
genericBtst (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 0000 1010 Rn Rm IMM32; mov (d32,Rm),Rn
|
|
8.0xfe+8.0x0a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]
|
|
+ FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 0001 1010 Rm Rn IMM32; mov Rm,(d32,Rn)
|
|
8.0xfe+8.0x1a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5g:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 0010 1010 Rn Rm IMM32; movbu (d32,Rm),Rn
|
|
8.0xfe+8.0x2a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[srcreg]
|
|
+ FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 0011 1010 Rm Rn IMM32; movbu Rm,(d32,Rn)
|
|
8.0xfe+8.0x3a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_byte (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 0100 1010 Rn Rm IMM32; movhu (d32,Rm),Rn
|
|
8.0xfe+8.0x4a+4.RN2,4.RM0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg]
|
|
+ FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 0101 1010 Rm Rn IMM32; movhu Rm,(d32,Rn)
|
|
8.0xfe+8.0x5a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5b:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 0110 1010 Rn Rm IMM32; mov (d32,Rm+),Rn
|
|
8.0xfe+8.0x6a+4.RN2,4.RM0!RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
// 1111 1110 0111 1010 Rm Rn IMM32; mov Rm,(d32,Rn+)
|
|
8.0xfe+8.0x7a+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5z:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_word (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[dstreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
|
|
// 1111 1110 1000 1010 Rn 0000 IMM32; mov (d32,sp),Rn
|
|
8.0xfe+8.0x8a+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (State.regs[REG_SP]
|
|
+ FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 1001 1010 Rm 0000 IMM32; mov Rm,(d32,sp)
|
|
8.0xfe+8.0x9a+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_word (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 1010 1010 Rn 0000 IMM32; movbu (d32,sp),Rn
|
|
8.0xfe+8.0xaa+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (State.regs[REG_SP]
|
|
+ FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 1011 1010 Rm 0000 IMM32; movbu Rm,(d32,sp)
|
|
8.0xfe+8.0xba+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_byte (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 1100 1010 Rn 0000 IMM32; movhu (d32,sp),Rn
|
|
8.0xfe+8.0xca+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5c:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[REG_SP]
|
|
+ FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 1101 1010 Rm 0000 IMM32; movhu Rm,(d32,sp)
|
|
8.0xfe+8.0xda+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5d:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_half (State.regs[REG_SP] + FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D),
|
|
State.regs[srcreg]);
|
|
}
|
|
|
|
|
|
// 1111 1110 1110 1010 Rn Rm IMM32; movhu (d32,Rm+),Rn
|
|
8.0xfe+8.0xea+4.RN2,4.RM0!RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5y:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM0);
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (State.regs[srcreg]);
|
|
State.regs[srcreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
// 1111 1110 1111 1010 Rm Rn IMM32; movhu Rm,(d32,Rn+)
|
|
8.0xfe+8.0xfa+4.RM2,4.RN0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5f:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
store_half (State.regs[dstreg], State.regs[srcreg]);
|
|
State.regs[dstreg] += FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
}
|
|
|
|
|
|
// 1111 1110 0000 1011 Rn Rn IMM32; mac imm32,Rn
|
|
8.0xfe+8.0x0b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mac
|
|
"mac"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((int64_t)(int32_t)State.regs[srcreg]
|
|
* (int64_t)(int32_t)imm);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 0001 1011 Rn Rn IMM32; macu imm32,Rn
|
|
8.0xfe+8.0x1b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macu
|
|
"macu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int64_t temp, sum;
|
|
int c, v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((uint64_t)State.regs[srcreg]
|
|
* (uint64_t)imm);
|
|
sum = State.regs[REG_MCRL] + (temp & 0xffffffff);
|
|
c = (sum < State.regs[REG_MCRL]) || (sum < (temp & 0xffffffff));
|
|
State.regs[REG_MCRL] = sum;
|
|
temp >>= 32;
|
|
temp &= 0xffffffff;
|
|
sum = State.regs[REG_MCRH] + temp + c;
|
|
v = ((State.regs[REG_MCRH] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRH] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 0010 1011 Rn Rn IMM32; macb imm32,Rn
|
|
8.0xfe+8.0x2b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macb
|
|
"macb"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int32_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((int32_t)(int8_t)(State.regs[srcreg] & 0xff)
|
|
* (int32_t)(int8_t)(imm & 0xff));
|
|
sum = State.regs[REG_MCRL] + temp;
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 0011 1011 Rn Rn IMM32; macbu imm32,Rn
|
|
8.0xfe+8.0x3b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::macbu
|
|
"macbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int32_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg] & 0xff)
|
|
* (uint32_t)(imm & 0xff));
|
|
sum = State.regs[REG_MCRL] + temp;
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 0100 1011 Rn Rn IMM32; mach imm32,Rn
|
|
8.0xfe+8.0x4b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::mach
|
|
"mach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int32_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[srcreg] & 0xffff)
|
|
* (int32_t)(int16_t)(imm & 0xffff));
|
|
sum = State.regs[REG_MCRL] + temp;
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 0101 1011 Rn Rn IMM32; machu imm32,Rn
|
|
8.0xfe+8.0x5b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::machu
|
|
"machu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int32_t temp, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg] & 0xffff)
|
|
* (uint32_t)(imm & 0xffff));
|
|
sum = State.regs[REG_MCRL] + temp;
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 0110 1011 Rn Rn IMM32; dmach imm32,Rn
|
|
8.0xfe+8.0x6b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmach
|
|
"dmach"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int32_t temp, temp2, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[srcreg] & 0xffff)
|
|
* (int32_t)(int16_t)(imm & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((imm >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 0111 1011 Rn Rn IMM32; dmachu imm32,Rn
|
|
8.0xfe+8.0x7b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmachu
|
|
"dmachu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, imm;
|
|
int32_t temp, temp2, sum;
|
|
int v;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((uint32_t)(State.regs[srcreg] & 0xffff)
|
|
* (uint32_t)(imm & 0xffff));
|
|
temp2 = ((uint32_t)((State.regs[srcreg] >> 16) & 0xffff)
|
|
* (uint32_t)((imm >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
v = ((State.regs[REG_MCRL] & 0x80000000) == (temp & 0x80000000)
|
|
&& (temp & 0x80000000) != (sum & 0x80000000));
|
|
State.regs[REG_MCRL] = sum;
|
|
if (v)
|
|
State.regs[REG_MCVF] = 1;
|
|
}
|
|
|
|
// 1111 1110 1000 1011 Rn Rn IMM32; dmulh imm32,Rn
|
|
8.0xfe+8.0x8b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmulh
|
|
"dmulh"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int imm, dstreg;
|
|
int32_t temp;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg] & 0xffff)
|
|
* (int32_t)(int16_t)(imm & 0xffff));
|
|
State.regs[REG_MDRQ] = temp;
|
|
temp = ((int32_t)(int16_t)((State.regs[dstreg] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((imm>>16) & 0xffff));
|
|
State.regs[dstreg] = temp;
|
|
}
|
|
|
|
// 1111 1110 1001 1011 Rn Rn IMM32; dmulhu imm32,Rn
|
|
8.0xfe+8.0x9b+4.RN2,4.RN0=RN2+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5:::dmulhu
|
|
"dmulhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int imm, dstreg;
|
|
int32_t temp;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN0);
|
|
imm = FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D);
|
|
|
|
temp = ((uint32_t)(State.regs[dstreg] & 0xffff)
|
|
* (uint32_t)(imm & 0xffff));
|
|
State.regs[REG_MDRQ] = temp;
|
|
temp = ((uint32_t)((State.regs[dstreg] >> 16) & 0xffff)
|
|
* (uint32_t)((imm >>16) & 0xffff));
|
|
State.regs[dstreg] = temp;
|
|
}
|
|
|
|
// 1111 1110 0000 1110 Rn 0000 IMM32; mov (abs32),Rn
|
|
8.0xfe+8.0x0e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5h:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 0001 1110 Rm 0000 IMM32; mov Rn,(abs32)
|
|
8.0xfe+8.0x1e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::mov
|
|
"mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_word (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 0020 1110 Rn 0000 IMM32; movbu (abs32),Rn
|
|
8.0xfe+8.0x2e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5i:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 0011 1110 Rm 0000 IMM32; movbu Rn,(abs32)
|
|
8.0xfe+8.0x3e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movbu
|
|
"movbu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_byte (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 1110 0100 1110 Rn 0000 IMM32; movhu (abs32),Rn
|
|
8.0xfe+8.0x4e+4.RN2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5j:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg;
|
|
|
|
PC = cia;
|
|
dstreg = translate_rreg (SD_, RN2);
|
|
State.regs[dstreg] = load_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D));
|
|
}
|
|
|
|
// 1111 1110 0101 1110 Rm 0000 IMM32; movhu Rn,(abs32)
|
|
8.0xfe+8.0x5e+4.RM2,4.0x0+8.IMM32A+8.IMM32B+8.IMM32C+8.IMM32D:D5e:::movhu
|
|
"movhu"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM2);
|
|
store_half (FETCH32 (IMM32A, IMM32B, IMM32C, IMM32D), State.regs[srcreg]);
|
|
}
|
|
|
|
// 1111 0111 0000 0000 Rm1 Rn1 Rm2 Rn2; add_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x00+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::add_add
|
|
"add_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 0000 Rm1 Rn1 imm4 Rn2; add_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x10+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::add_add
|
|
"add_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 0000 Rm1 Rn1 Rm2 Rn2; add_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x20+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::add_sub
|
|
"add_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 0000 Rm1 Rn1 imm4 Rn2; add_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x30+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::add_sub
|
|
"add_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 0000 Rm1 Rn1 Rm2 Rn2; add_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x40+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::add_cmp
|
|
"add_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] += State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0101 0000 Rm1 Rn1 imm4 Rn2; add_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x50+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::add_cmp
|
|
"add_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] += State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0110 0000 Rm1 Rn1 Rm2 Rn2; add_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x60+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::add_mov
|
|
"add_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 0000 Rm1 Rn1 imm4 Rn2; add_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x70+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::add_mov
|
|
"add_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 0000 Rm1 Rn1 Rm2 Rn2; add_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x80+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::add_asr
|
|
"add_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 0000 Rm1 Rn1 imm4 Rn2; add_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x90+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::add_asr
|
|
"add_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 0000 Rm1 Rn1 Rm2 Rn2; add_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa0+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::add_lsr
|
|
"add_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 0000 Rm1 Rn1 imm4 Rn2; add_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb0+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::add_lsr
|
|
"add_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0000 Rm1 Rn1 Rm2 Rn2; add_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc0+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::add_asl
|
|
"add_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 0000 Rm1 Rn1 imm4 Rn2; add_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd0+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::add_asl
|
|
"add_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 0001 Rm1 Rn1 Rm2 Rn2; cmp_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x01+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::cmp_add
|
|
"cmp_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 0001 0001 Rm1 Rn1 imm4 Rn2; cmp_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x11+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::cmp_add
|
|
"cmp_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
}
|
|
|
|
// 1111 0111 0010 0001 Rm1 Rn1 Rm2 Rn2; cmp_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x21+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::cmp_sub
|
|
"cmp_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 0011 0001 Rm1 Rn1 imm4 Rn2; cmp_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x31+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::cmp_sub
|
|
"cmp_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
}
|
|
|
|
// 1111 0111 0110 0001 Rm1 Rn1 Rm2 Rn2; cmp_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x61+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::cmp_mov
|
|
"cmp_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 0111 0001 Rm1 Rn1 imm4 Rn2; cmp_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x71+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::cmp_mov
|
|
"cmp_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
}
|
|
|
|
// 1111 0111 1000 0001 Rm1 Rn1 Rm2 Rn2; cmp_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x81+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::cmp_asr
|
|
"cmp_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
}
|
|
|
|
// 1111 0111 1001 0001 Rm1 Rn1 imm4 Rn2; cmp_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x91+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::cmp_asr
|
|
"cmp_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
}
|
|
|
|
// 1111 0111 1010 0001 Rm1 Rn1 Rm2 Rn2; cmp_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa1+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::cmp_lsr
|
|
"cmp_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 1011 0001 Rm1 Rn1 imm4 Rn2; cmp_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb1+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::cmp_lsr
|
|
"cmp_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] >>= IMM4;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0001 Rm1 Rn1 Rm2 Rn2; cmp_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc1+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::cmp_asl
|
|
"cmp_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 1101 0001 Rm1 Rn1 imm4 Rn2; cmp_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd1+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::cmp_asl
|
|
"cmp_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg1], State.regs[dstreg1]);
|
|
State.regs[dstreg2] <<= IMM4;
|
|
}
|
|
|
|
// 1111 0111 0000 0010 Rm1 Rn1 Rm2 Rn2; sub_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x02+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sub_add
|
|
"sub_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 0010 Rm1 Rn1 imm4 Rn2; sub_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x12+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sub_add
|
|
"sub_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 0010 Rm1 Rn1 Rm2 Rn2; sub_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x22+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sub_sub
|
|
"sub_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 0010 Rm1 Rn1 imm4 Rn2; sub_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x32+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sub_sub
|
|
"sub_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 0010 Rm1 Rn1 Rm2 Rn2; sub_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x42+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sub_cmp
|
|
"sub_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] -= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0101 0010 Rm1 Rn1 imm4 Rn2; sub_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x52+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sub_cmp
|
|
"sub_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] -= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0110 0010 Rm1 Rn1 Rm2 Rn2; sub_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x62+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sub_mov
|
|
"sub_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 0010 Rm1 Rn1 imm4 Rn2; sub_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x72+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sub_mov
|
|
"sub_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 0010 Rm1 Rn1 Rm2 Rn2; sub_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x82+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sub_asr
|
|
"sub_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 0010 Rm1 Rn1 imm4 Rn2; sub_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x92+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sub_asr
|
|
"sub_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 0010 Rm1 Rn1 Rm2 Rn2; sub_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa2+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sub_lsr
|
|
"sub_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 0010 Rm1 Rn1 imm4 Rn2; sub_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb2+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sub_lsr
|
|
"sub_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0010 Rm1 Rn1 Rm2 Rn2; sub_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc2+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sub_asl
|
|
"sub_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 0010 Rm1 Rn1 imm4 Rn2; sub_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd2+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sub_asl
|
|
"sub_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 0011 Rm1 Rn1 Rm2 Rn2; mov_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x03+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::mov_add
|
|
"mov_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 0011 Rm1 Rn1 imm4 Rn2; mov_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x13+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::mov_add
|
|
"mov_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 0011 Rm1 Rn1 Rm2 Rn2; mov_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x23+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::mov_sub
|
|
"mov_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 0011 Rm1 Rn1 imm4 Rn2; mov_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x33+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::mov_sub
|
|
"mov_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 0011 Rm1 Rn1 Rm2 Rn2; mov_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x43+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::mov_cmp
|
|
"mov_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] = State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0101 0011 Rm1 Rn1 imm4 Rn2; mov_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x53+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::mov_cmp
|
|
"mov_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] = State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0110 0011 Rm1 Rn1 Rm2 Rn2; mov_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x63+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::mov_mov
|
|
"mov_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 0011 Rm1 Rn1 imm4 Rn2; mov_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x73+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::mov_mov
|
|
"mov_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 0011 Rm1 Rn1 Rm2 Rn2; mov_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x83+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::mov_asr
|
|
"mov_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 0011 Rm1 Rn1 imm4 Rn2; mov_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x93+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::mov_asr
|
|
"mov_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 0011 Rm1 Rn1 Rm2 Rn2; mov_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa3+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::mov_lsr
|
|
"mov_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 0011 Rm1 Rn1 imm4 Rn2; mov_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb3+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::mov_lsr
|
|
"mov_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0011 Rm1 Rn1 Rm2 Rn2; mov_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc3+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::mov_asl
|
|
"mov_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 0011 Rm1 Rn1 imm4 Rn2; mov_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd3+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::mov_asl
|
|
"mov_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 0100 imm4 Rn1 Rm2 Rn2; add_add imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x04+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::add_add
|
|
"add_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 0100 imm4 Rn1 imm4 Rn2; add_add imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x14+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::add_add
|
|
"add_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 0100 imm4 Rn1 Rm2 Rn2; add_sub imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x24+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::add_sub
|
|
"add_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 0100 imm4 Rn1 imm4 Rn2; add_sub imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x34+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::add_sub
|
|
"add_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 0100 imm4 Rn1 Rm2 Rn2; add_cmp imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x44+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::add_cmp
|
|
"add_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] += EXTEND4 (IMM4A);
|
|
}
|
|
|
|
// 1111 0111 0101 0100 imm4 Rn1 imm4 Rn2; add_cmp imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x54+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::add_cmp
|
|
"add_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] += EXTEND4 (IMM4A);
|
|
}
|
|
|
|
// 1111 0111 0110 0100 imm4 Rn1 Rm2 Rn2; add_mov imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x64+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::add_mov
|
|
"add_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 0100 imm4 Rn1 imm4 Rn2; add_mov imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x74+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::add_mov
|
|
"add_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 0100 imm4 Rn1 Rm2 Rn2; add_asr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x84+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::add_asr
|
|
"add_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 0100 imm4 Rn1 imm4 Rn2; add_asr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x94+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::add_asr
|
|
"add_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 0100 imm4 Rn1 Rm2 Rn2; add_lsr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa4+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::add_lsr
|
|
"add_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 0100 imm4 Rn1 imm4 Rn2; add_lsr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb4+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::add_lsr
|
|
"add_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0100 imm4 Rn1 Rm2 Rn2; add_asl imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc4+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::add_asl
|
|
"add_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 0100 imm4 Rn1 imm4 Rn2; add_asl imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd4+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::add_asl
|
|
"add_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] + EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 0101 imm4 Rn1 Rm2 Rn2; cmp_add imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x05+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::cmp_add
|
|
"cmp_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 0001 0101 imm4 Rn1 imm4 Rn2; cmp_add imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x15+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::cmp_add
|
|
"cmp_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
}
|
|
|
|
// 1111 0111 0010 0101 imm4 Rn1 Rm2 Rn2; cmp_sub imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x25+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::cmp_sub
|
|
"cmp_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 0011 0101 imm4 Rn1 imm4 Rn2; cmp_sub imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x35+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::cmp_sub
|
|
"cmp_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
}
|
|
|
|
// 1111 0111 0110 0101 imm4 Rn1 Rm2 Rn2; cmp_mov imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x65+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::cmp_mov
|
|
"cmp_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 0111 0101 imm4 Rn1 imm4 Rn2; cmp_mov imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x75+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::cmp_mov
|
|
"cmp_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
}
|
|
|
|
// 1111 0111 1000 0101 imm4 Rn1 Rm2 Rn2; cmp_asr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x85+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::cmp_asr
|
|
"cmp_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
}
|
|
|
|
// 1111 0111 1001 0101 imm4 Rn1 imm4 Rn2; cmp_asr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x95+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::cmp_asr
|
|
"cmp_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
}
|
|
|
|
// 1111 0111 1010 0101 imm4 Rn1 Rm2 Rn2; cmp_lsr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa5+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::cmp_lsr
|
|
"cmp_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 1011 0101 imm4 Rn1 imm4 Rn2; cmp_lsr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb5+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::cmp_lsr
|
|
"cmp_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] >>= IMM4;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0101 imm4 Rn1 Rm2 Rn2; cmp_asl imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc5+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::cmp_asl
|
|
"cmp_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
}
|
|
|
|
// 1111 0111 1101 0101 imm4 Rn1 imm4 Rn2; cmp_asl imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd5+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::cmp_asl
|
|
"cmp_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4A), State.regs[dstreg1]);
|
|
State.regs[dstreg2] <<= IMM4;
|
|
}
|
|
|
|
// 1111 0111 0000 0110 imm4 Rn1 Rm2 Rn2; sub_add imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x06+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::sub_add
|
|
"sub_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 0110 imm4 Rn1 imm4 Rn2; sub_add imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x16+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::sub_add
|
|
"sub_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 0110 imm4 Rn1 Rm2 Rn2; sub_sub imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x26+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::sub_sub
|
|
"sub_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 0110 imm4 Rn1 imm4 Rn2; sub_sub imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x36+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::sub_sub
|
|
"sub_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 0110 imm4 Rn1 Rm2 Rn2; sub_cmp imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x46+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::sub_cmp
|
|
"sub_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] -= EXTEND4 (IMM4A);
|
|
}
|
|
|
|
// 1111 0111 0101 0110 imm4 Rn1 imm4 Rn2; sub_cmp imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x56+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::sub_cmp
|
|
"sub_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] -= EXTEND4 (IMM4A);
|
|
}
|
|
|
|
// 1111 0111 0110 0110 imm4 Rn1 Rm2 Rn2; sub_mov imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x66+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::sub_mov
|
|
"sub_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 0110 imm4 Rn1 imm4 Rn2; sub_mov imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x76+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::sub_mov
|
|
"sub_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 0110 imm4 Rn1 Rm2 Rn2; sub_asr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x86+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::sub_asr
|
|
"sub_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 0110 imm4 Rn1 imm4 Rn2; sub_asr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x96+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::sub_asr
|
|
"sub_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 0110 imm4 Rn1 Rm2 Rn2; sub_lsr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa6+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::sub_lsr
|
|
"sub_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 0110 imm4 Rn1 imm4 Rn2; sub_lsr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb6+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::sub_lsr
|
|
"sub_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0110 imm4 Rn1 Rm2 Rn2; sub_asl imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc6+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::sub_asl
|
|
"sub_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 0110 imm4 Rn1 imm4 Rn2; sub_asl imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd6+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::sub_asl
|
|
"sub_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] - EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 0111 imm4 Rn1 Rm2 Rn2; mov_add imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x07+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::mov_add
|
|
"mov_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 0111 imm4 Rn1 imm4 Rn2; mov_add imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x17+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::mov_add
|
|
"mov_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 0111 imm4 Rn1 Rm2 Rn2; mov_sub imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x27+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::mov_sub
|
|
"mov_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 0111 imm4 Rn1 imm4 Rn2; mov_sub imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x37+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::mov_sub
|
|
"mov_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 0111 imm4 Rn1 Rm2 Rn2; mov_cmp imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x47+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::mov_cmp
|
|
"mov_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] = EXTEND4 (IMM4A);
|
|
}
|
|
|
|
// 1111 0111 0101 0111 imm4 Rn1 imm4 Rn2; mov_cmp imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x57+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::mov_cmp
|
|
"mov_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] = EXTEND4 (IMM4A);
|
|
}
|
|
|
|
// 1111 0111 0110 0111 imm4 Rn1 Rm2 Rn2; mov_mov imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x67+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::mov_mov
|
|
"mov_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 0111 imm4 Rn1 imm4 Rn2; mov_mov imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x77+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::mov_mov
|
|
"mov_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 0111 imm4 Rn1 Rm2 Rn2; mov_asr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x87+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::mov_asr
|
|
"mov_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 0111 imm4 Rn1 imm4 Rn2; mov_asr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x97+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::mov_asr
|
|
"mov_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 0111 imm4 Rn1 Rm2 Rn2; mov_lsr imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa7+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::mov_lsr
|
|
"mov_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 0111 imm4 Rn1 imm4 Rn2; mov_lsr imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb7+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::mov_lsr
|
|
"mov_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 0111 imm4 Rn1 Rm2 Rn2; mov_asl imm4, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc7+4.IMM4A,4.RN1+4.RM2,4.RN2!RN1:D2c:::mov_asl
|
|
"mov_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 0111 imm4 Rn1 imm4 Rn2; mov_asl imm4, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd7+4.IMM4A,4.RN1+4.IMM4,4.RN2!RN1:D2d:::mov_asl
|
|
"mov_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = EXTEND4 (IMM4A);
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 1000 Rm1 Rn1 Rm2 Rn2; and_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x08+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::and_add
|
|
"and_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 1000 Rm1 Rn1 imm4 Rn2; and_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x18+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::and_add
|
|
"and_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 1000 Rm1 Rn1 Rm2 Rn2; and_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x28+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::and_sub
|
|
"and_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 1000 Rm1 Rn1 imm4 Rn2; and_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x38+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::and_sub
|
|
"and_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 1000 Rm1 Rn1 Rm2 Rn2; and_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x48+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::and_cmp
|
|
"and_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] &= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0101 1000 Rm1 Rn1 imm4 Rn2; and_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x58+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::and_cmp
|
|
"and_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] &= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0110 1000 Rm1 Rn1 Rm2 Rn2; and_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x68+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::and_mov
|
|
"and_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 1000 Rm1 Rn1 imm4 Rn2; and_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x78+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::and_mov
|
|
"and_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 1000 Rm1 Rn1 Rm2 Rn2; and_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x88+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::and_asr
|
|
"and_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 1000 Rm1 Rn1 imm4 Rn2; and_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x98+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::and_asr
|
|
"and_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 1000 Rm1 Rn1 Rm2 Rn2; and_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa8+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::and_lsr
|
|
"and_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 1000 Rm1 Rn1 imm4 Rn2; and_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb8+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::and_lsr
|
|
"and_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 1000 Rm1 Rn1 Rm2 Rn2; and_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc8+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::and_asl
|
|
"and_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 1000 Rm1 Rn1 imm4 Rn2; and_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd8+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::and_asl
|
|
"and_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] & State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 1001 Rm1 Rn1 Rm2 Rn2; dmach_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x09+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::dmach_add
|
|
"dmach_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0001 1001 Rm1 Rn1 imm4 Rn2; dmach_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x19+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::dmach_add
|
|
"dmach_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0010 1001 Rm1 Rn1 Rm2 Rn2; dmach_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x29+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::dmach_sub
|
|
"dmach_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0011 1001 Rm1 Rn1 imm4 Rn2; dmach_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x39+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::dmach_sub
|
|
"dmach_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0100 1001 Rm1 Rn1 Rm2 Rn2; dmach_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x49+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::dmach_cmp
|
|
"dmach_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0101 1001 Rm1 Rn1 imm4 Rn2; dmach_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x59+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::dmach_cmp
|
|
"dmach_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0110 1001 Rm1 Rn1 Rm2 Rn2; dmach_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x69+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::dmach_mov
|
|
"dmach_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0111 1001 Rm1 Rn1 imm4 Rn2; dmach_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x79+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::dmach_mov
|
|
"dmach_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 1000 1001 Rm1 Rn1 Rm2 Rn2; dmach_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x89+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::dmach_asr
|
|
"dmach_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 1001 1001 Rm1 Rn1 imm4 Rn2; dmach_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x99+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::dmach_asr
|
|
"dmach_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 1010 1001 Rm1 Rn1 Rm2 Rn2; dmach_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xa9+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::dmach_lsr
|
|
"dmach_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 1011 1001 Rm1 Rn1 imm4 Rn2; dmach_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xb9+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::dmach_lsr
|
|
"dmach_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 1001 Rm1 Rn1 Rm2 Rn2; dmach_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xc9+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::dmach_asl
|
|
"dmach_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 1101 1001 Rm1 Rn1 imm4 Rn2; dmach_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xd9+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::dmach_asl
|
|
"dmach_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int32_t temp, temp2, sum;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
temp = ((int32_t)(int16_t)(State.regs[dstreg1] & 0xffff)
|
|
* (int32_t)(int16_t)(State.regs[srcreg1] & 0xffff));
|
|
temp2 = ((int32_t)(int16_t)((State.regs[srcreg1] >> 16) & 0xffff)
|
|
* (int32_t)(int16_t)((State.regs[dstreg1] >> 16) & 0xffff));
|
|
sum = temp + temp2 + State.regs[REG_MCRL];
|
|
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = sum;
|
|
}
|
|
|
|
// 1111 0111 0000 1010 Rm1 Rn1 Rm2 Rn2; xor_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x0a+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::xor_add
|
|
"xor_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 1010 Rm1 Rn1 imm4 Rn2; xor_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x1a+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::xor_add
|
|
"xor_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 1010 Rm1 Rn1 Rm2 Rn2; xor_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x2a+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::xor_sub
|
|
"xor_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 1010 Rm1 Rn1 imm4 Rn2; xor_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x3a+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::xor_sub
|
|
"xor_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 1010 Rm1 Rn1 Rm2 Rn2; xor_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x4a+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::xor_cmp
|
|
"xor_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] ^= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0101 1010 Rm1 Rn1 imm4 Rn2; xor_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x5a+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::xor_cmp
|
|
"xor_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] ^= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0110 1010 Rm1 Rn1 Rm2 Rn2; xor_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x6a+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::xor_mov
|
|
"xor_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 1010 Rm1 Rn1 imm4 Rn2; xor_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x7a+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::xor_mov
|
|
"xor_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 1010 Rm1 Rn1 Rm2 Rn2; xor_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x8a+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::xor_asr
|
|
"xor_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 1010 Rm1 Rn1 imm4 Rn2; xor_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x9a+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::xor_asr
|
|
"xor_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 1010 Rm1 Rn1 Rm2 Rn2; xor_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xaa+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::xor_lsr
|
|
"xor_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 1010 Rm1 Rn1 imm4 Rn2; xor_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xba+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::xor_lsr
|
|
"xor_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 1010 Rm1 Rn1 Rm2 Rn2; xor_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xca+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::xor_asl
|
|
"xor_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 1010 Rm1 Rn1 imm4 Rn2; xor_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xda+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::xor_asl
|
|
"xor_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 1011 Rm1 Rn1 Rm2 Rn2; swhw_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x0b+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::swhw_add
|
|
"swhw_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] ^ State.regs[srcreg1];
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 1011 Rm1 Rn1 imm4 Rn2; swhw_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x1b+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::swhw_add
|
|
"swhw_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 1011 Rm1 Rn1 Rm2 Rn2; swhw_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x2b+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::swhw_sub
|
|
"swhw_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 1011 Rm1 Rn1 imm4 Rn2; swhw_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x3b+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::swhw_sub
|
|
"swhw_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 1011 Rm1 Rn1 Rm2 Rn2; swhw_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x4b+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::swhw_cmp
|
|
"swhw_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
}
|
|
|
|
// 1111 0111 0101 1011 Rm1 Rn1 imm4 Rn2; swhw_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x5b+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::swhw_cmp
|
|
"swhw_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
}
|
|
|
|
// 1111 0111 0110 1011 Rm1 Rn1 Rm2 Rn2; swhw_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x6b+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::swhw_mov
|
|
"swhw_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 1011 Rm1 Rn1 imm4 Rn2; swhw_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x7b+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::swhw_mov
|
|
"swhw_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 1011 Rm1 Rn1 Rm2 Rn2; swhw_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x8b+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::swhw_asr
|
|
"swhw_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 1011 Rm1 Rn1 imm4 Rn2; swhw_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x9b+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::swhw_asr
|
|
"swhw_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 1011 Rm1 Rn1 Rm2 Rn2; swhw_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xab+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::swhw_lsr
|
|
"swhw_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 1011 Rm1 Rn1 imm4 Rn2; swhw_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xbb+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::swhw_lsr
|
|
"swhw_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 1011 Rm1 Rn1 Rm2 Rn2; swhw_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xcb+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::swhw_asl
|
|
"swhw_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 1011 Rm1 Rn1 imm4 Rn2; swhw_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xdb+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::swhw_asl
|
|
"swhw_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = (((State.regs[srcreg1] & 0xffff) << 16)
|
|
| ((State.regs[srcreg1] >> 16) & 0xffff));
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 1100 Rm1 Rn1 Rm2 Rn2; or_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x0c+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::or_add
|
|
"or_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 1100 Rm1 Rn1 imm4 Rn2; or_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x1c+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::or_add
|
|
"or_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 1100 Rm1 Rn1 Rm2 Rn2; or_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x2c+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::or_sub
|
|
"or_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 1100 Rm1 Rn1 imm4 Rn2; or_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x3c+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::or_sub
|
|
"or_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 1100 Rm1 Rn1 Rm2 Rn2; or_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x4c+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::or_cmp
|
|
"or_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[srcreg2], State.regs[dstreg2]);
|
|
State.regs[dstreg1] |= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0101 1100 Rm1 Rn1 imm4 Rn2; or_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x5c+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::or_cmp
|
|
"or_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
State.regs[dstreg1] |= State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0110 1100 Rm1 Rn1 Rm2 Rn2; or_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x6c+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::or_mov
|
|
"or_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 1100 Rm1 Rn1 imm4 Rn2; or_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x7c+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::or_mov
|
|
"or_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 1100 Rm1 Rn1 Rm2 Rn2; or_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x8c+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::or_asr
|
|
"or_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 1100 Rm1 Rn1 imm4 Rn2; or_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x9c+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::or_asr
|
|
"or_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 1100 Rm1 Rn1 Rm2 Rn2; or_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xac+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::or_lsr
|
|
"or_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 1100 Rm1 Rn1 imm4 Rn2; or_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xbc+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::or_lsr
|
|
"or_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 1100 Rm1 Rn1 Rm2 Rn2; or_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xcc+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::or_asl
|
|
"or_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 1100 Rm1 Rn1 imm4 Rn2; or_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xdc+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::or_asl
|
|
"or_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
result1 = State.regs[dstreg1] | State.regs[srcreg1];
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0000 1101 Rm1 Rn1 Rm2 Rn2; sat16_add Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x0d+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sat16_add
|
|
"sat16_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] += State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0001 1101 Rm1 Rn1 imm4 Rn2; sat16_add Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x1d+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sat16_add
|
|
"sat16_add"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] += EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0010 1101 Rm1 Rn1 Rm2 Rn2; sat16_sub Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x2d+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sat16_sub
|
|
"sat16_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] -= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0011 1101 Rm1 Rn1 imm4 Rn2; sat16_sub Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x3d+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sat16_sub
|
|
"sat16_sub"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] -= EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0100 1101 Rm1 Rn1 Rm2 Rn2; sat16_cmp Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x4d+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sat16_cmp
|
|
"sat16_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (State.regs[dstreg2], State.regs[dstreg1]);
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
State.regs[dstreg1] = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
State.regs[dstreg1] = 0xffff8000;
|
|
else
|
|
State.regs[dstreg1] = State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0101 1101 Rm1 Rn1 imm4 Rn2; sat16_cmp Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x5d+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sat16_cmp
|
|
"sat16_cmp"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
genericCmp (EXTEND4 (IMM4), State.regs[dstreg2]);
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
State.regs[dstreg1] = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
State.regs[dstreg1] = 0xffff8000;
|
|
else
|
|
State.regs[dstreg1] = State.regs[srcreg1];
|
|
}
|
|
|
|
// 1111 0111 0110 1101 Rm1 Rn1 Rm2 Rn2; sat16_mov Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x6d+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sat16_mov
|
|
"sat16_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] = State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 0111 1101 Rm1 Rn1 imm4 Rn2; sat16_mov Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x7d+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sat16_mov
|
|
"sat16_mov"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] = EXTEND4 (IMM4);
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1000 1101 Rm1 Rn1 Rm2 Rn2; sat16_asr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0x8d+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sat16_asr
|
|
"sat16_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
temp = State.regs[dstreg2];
|
|
temp >>= State.regs[srcreg2];
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1001 1101 Rm1 Rn1 imm4 Rn2; sat16_asr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0x9d+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sat16_asr
|
|
"sat16_asr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
signed int temp;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
temp = State.regs[dstreg2];
|
|
temp >>= IMM4;
|
|
State.regs[dstreg2] = temp;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1010 1101 Rm1 Rn1 Rm2 Rn2; sat16_lsr Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xad+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sat16_lsr
|
|
"sat16_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] >>= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1011 1101 Rm1 Rn1 imm4 Rn2; sat16_lsr Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xbd+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sat16_lsr
|
|
"sat16_lsr"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] >>= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
|
|
// 1111 0111 1100 1101 Rm1 Rn1 Rm2 Rn2; sat16_asl Rm1, Rn1, Rm2, Rn2
|
|
8.0xf7+8.0xcd+4.RM1,4.RN1+4.RM2,4.RN2!RN1:D2:::sat16_asl
|
|
"sat16_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, srcreg2, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
srcreg2 = translate_rreg (SD_, RM2);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] <<= State.regs[srcreg2];
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1101 1101 Rm1 Rn1 imm4 Rn2; sat16_asl Rm1, Rn1, imm4, Rn2
|
|
8.0xf7+8.0xdd+4.RM1,4.RN1+4.IMM4,4.RN2!RN1:D2b:::sat16_asl
|
|
"sat16_asl"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg1, dstreg1, dstreg2;
|
|
int result1;
|
|
|
|
PC = cia;
|
|
srcreg1 = translate_rreg (SD_, RM1);
|
|
dstreg1 = translate_rreg (SD_, RN1);
|
|
dstreg2 = translate_rreg (SD_, RN2);
|
|
|
|
if (State.regs[srcreg1] >= 0x7fff)
|
|
result1 = 0x7fff;
|
|
else if (State.regs[srcreg1] <= 0xffff8000)
|
|
result1 = 0xffff8000;
|
|
else
|
|
result1 = State.regs[srcreg1];
|
|
|
|
State.regs[dstreg2] <<= IMM4;
|
|
State.regs[dstreg1] = result1;
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0000; mov_llt (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x0:D2:::mov_llt
|
|
"mov_llt"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0001; mov_lgt (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x1:D2:::mov_lgt
|
|
"mov_lgt"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (!((PSW & PSW_Z)
|
|
|| (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0010; mov_lge (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x2:D2:::mov_lge
|
|
"mov_lge"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0011; mov_lle (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x3:D2:::mov_lle
|
|
"mov_lle"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if ((PSW & PSW_Z)
|
|
|| (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0100; mov_lcs (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x4:D2:::mov_lcs
|
|
"mov_lcs"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (PSW & PSW_C)
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0101; mov_lhi (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x5:D2:::mov_lhi
|
|
"mov_lhi"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0110; mov_lcc (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x6:D2:::mov_lcc
|
|
"mov_lcc"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (!(PSW & PSW_C))
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 0111; mov_lls (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x7:D2:::mov_lls
|
|
"mov_lls"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 1000; mov_leq (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x8:D2:::mov_leq
|
|
"mov_leq"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (PSW & PSW_Z)
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 1001; mov_lne (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0x9:D2:::mov_lne
|
|
"mov_lne"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
if (!(PSW & PSW_Z))
|
|
{
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
}
|
|
|
|
// 1111 0111 1110 0000 Rm1 Rn1 imm4 1010; mov_lra (Rm+,imm4),Rn
|
|
8.0xf7+8.0xe0+4.RN,4.RM!RN+4.IMM4,4.0xa:D2:::mov_lra
|
|
"mov_lra"
|
|
*am33
|
|
*am33_2
|
|
{
|
|
int srcreg, dstreg;
|
|
|
|
PC = cia;
|
|
srcreg = translate_rreg (SD_, RM);
|
|
dstreg = translate_rreg (SD_, RN);
|
|
|
|
State.regs[dstreg] = load_word (State.regs[srcreg]);
|
|
State.regs[srcreg] += EXTEND4 (IMM4);
|
|
|
|
State.regs[REG_PC] = State.regs[REG_LAR] - 4;
|
|
nia = PC;
|
|
}
|
|
|
|
:include::am33_2:am33-2.igen
|