Add subtraction context.

Add code to emulate SUB (SP minus register) ARM instruction.

Add stubs for other ARM emulation functions that need to be written.

llvm-svn: 128491
This commit is contained in:
Caroline Tice 2011-03-29 21:24:06 +00:00
parent e991f728d6
commit eba8f83479
3 changed files with 889 additions and 65 deletions

View File

@ -139,6 +139,8 @@ public:
eContextMultiplication,
eContextAddition,
eContextSubtraction,
eContextReturnFromException
};

View File

@ -9171,6 +9171,689 @@ EmulateInstructionARM::EmulateTSTReg (const uint32_t opcode, const ARMEncoding e
}
return true;
}
// A8.6.216 SUB (SP minus register)
bool
EmulateInstructionARM::EmulateSUBSPReg (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
if ConditionPassed() then
EncodingSpecificOperations();
shifted = Shift(R[m], shift_t, shift_n, APSR.C);
(result, carry, overflow) = AddWithCarry(SP, NOT(shifted), 1);
if d == 15 then // Can only occur for ARM encoding
ALUWritePC(result); // setflags is always FALSE here
else
R[d] = result;
if setflags then
APSR.N = result<31>;
APSR.Z = IsZeroBit(result);
APSR.C = carry;
APSR.V = overflow;
#endif
bool success = false;
if (ConditionPassed(opcode))
{
uint32_t d;
uint32_t m;
bool setflags;
ARM_ShifterType shift_t;
uint32_t shift_n;
switch (encoding)
{
case eEncodingT1:
// d = UInt(Rd); m = UInt(Rm); setflags = (S == 1);
d = Bits32 (opcode, 11, 8);
m = Bits32 (opcode, 3, 0);
setflags = BitIsSet (opcode, 20);
// (shift_t, shift_n) = DecodeImmShift(type, imm3:imm2);
shift_n = DecodeImmShiftThumb (opcode, shift_t);
// if d == 13 && (shift_t != SRType_LSL || shift_n > 3) then UNPREDICTABLE;
if ((d == 13) && ((shift_t != SRType_LSL) || (shift_n > 3)))
return false;
// if d == 15 || BadReg(m) then UNPREDICTABLE;
if ((d == 15) || BadReg (m))
return false;
break;
case eEncodingA1:
// if Rd == 1111 && S == 1 then SEE SUBS PC, LR and related instructions;
// d = UInt(Rd); m = UInt(Rm); setflags = (S == 1);
d = Bits32 (opcode, 15, 12);
m = Bits32 (opcode, 3, 0);
setflags = BitIsSet (opcode, 20);
// (shift_t, shift_n) = DecodeImmShift(type, imm5);
shift_n = DecodeImmShiftARM (opcode, shift_t);
break;
default:
return false;
}
// shifted = Shift(R[m], shift_t, shift_n, APSR.C);
uint32_t Rm = ReadCoreReg (m, &success);
if (!success)
return false;
uint32_t shifted = Shift (Rm, shift_t, shift_n, APSR_C);
// (result, carry, overflow) = AddWithCarry(SP, NOT(shifted), 1);
uint32_t sp_val = ReadCoreReg (SP_REG, &success);
if (!success)
return false;
AddWithCarryResult res = AddWithCarry (sp_val, ~shifted, 1);
EmulateInstruction::Context context;
context.type = eContextSubtraction;
Register sp_reg;
sp_reg.SetRegister (eRegisterKindDWARF, dwarf_sp);
Register dwarf_reg;
dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
context.SetRegisterRegisterOperands (sp_reg, dwarf_reg);
uint32_t regnum = dwarf_r0 + d;
if (!WriteCoreRegOptionalFlags(context, res.result, regnum, setflags, res.carry_out, res.overflow))
return false;
}
return true;
}
// A8.6.7 ADD (register-shifted register)
bool
EmulateInstructionARM::EmulateAddRegShift (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.213 SUB (register)
bool
EmulateInstructionARM::EmulateSUBReg (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.202 STREX
bool
EmulateInstructionARM::EmulateSTREX (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.197 STRB (immediate, ARM)
bool
EmulateInstructionARM::EmulateSTRBImmARM (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.194 STR (immediate, ARM)
bool
EmulateInstructionARM::EmulateSTRImmARM (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.74 LDRH (immediate, ARM)
bool
EmulateInstructionARM::EmulateLDRHImmediateARM (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.69 LDREX
bool
EmulateInstructionARM::EmulateLDREX (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.62 LDRB (immediate, ARM)
bool
EmulateInstructionARM::EmulateLDRBImmediateARM (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.59 LDR (literal)
bool
EmulateInstructionARM::EmulateLDRLiteral (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.65 LDRBT
bool
EmulateInstructionARM::EmulateLDRBT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.66 LDRD (immediate)
bool
EmulateInstructionARM::EmulateLDRDImmediate (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.67 LDRD (literal)
bool
EmulateInstructionARM::EmulateLDRDLiteral (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.68 LDRD (register)
bool
EmulateInstructionARM::EmulateLDRDRegister (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.70 LDREXB
bool
EmulateInstructionARM::EmulateLDREXB (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.71 LDREXD
bool
EmulateInstructionARM::EmulateLDREXD (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.72 LDREXH
bool
EmulateInstructionARM::EmulateLDREXH (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.77 LDRHT
bool
EmulateInstructionARM::EmulateLDRHT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.81 LDRSBT
bool
EmulateInstructionARM::EmulateLDRSBT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.85 LDRSHT
bool
EmulateInstructionARM::EmulateLDRSHT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.86 LDRT
bool
EmulateInstructionARM::EmulateLDRT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.198 STRB (register)
bool
EmulateInstructionARM::EmulateSTRBReg (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.199 STRBT
bool
EmulateInstructionARM::EmulateSTRBT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.200 STRD (immediate)
bool
EmulateInstructionARM::EmulateSTRDImm (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.201 STRD (register)
bool
EmulateInstructionARM::EmulateSTRDReg (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.203 STREXB
bool
EmulateInstructionARM::EmulateSTREXB (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.204 STREXD
bool
EmulateInstructionARM::EmulateSTREXD (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.205 STREXH
bool
EmulateInstructionARM::EmulateSTREXH (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.206 STRH (immediate, Thumb)
bool
EmulateInstructionARM::EmulateSTRHImmThumb (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.207 STRH (immediate, ARM)
bool
EmulateInstructionARM::EmulateSTRHImmARM (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.209 STRHT
bool
EmulateInstructionARM::EmulateSTRHT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
//bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
// A8.6.210 STRT
bool
EmulateInstructionARM::EmulateSTRT (const uint32_t opcode, const ARMEncoding encoding)
{
#if 0
#endif
// bool success = false;
if (ConditionPassed(opcode))
{
switch (encoding)
{
}
}
return true;
}
EmulateInstructionARM::ARMOpcode*
EmulateInstructionARM::GetARMOpcodeForInstruction (const uint32_t opcode)
@ -9196,6 +9879,7 @@ EmulateInstructionARM::GetARMOpcodeForInstruction (const uint32_t opcode)
// adjust the stack pointer
{ 0x0ffff000, 0x024dd000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateSUBSPImm, "sub sp, sp, #<const>"},
{ 0x0fef0010, 0x004d0000, ARMvAll, eEncodingA1, eSize32, &EmulateInstructionARM::EmulateSUBSPReg, "sub{s}<c> <Rd>, sp, <Rm>{,<shift>}" },
// push one register
// if Rn == '1101' && imm12 == '000000000100' then SEE PUSH;
@ -9407,6 +10091,7 @@ EmulateInstructionARM::GetThumbOpcodeForInstruction (const uint32_t opcode)
{ 0xffffff80, 0x0000b080, ARMvAll, eEncodingT1, eSize16, &EmulateInstructionARM::EmulateSUBSPImm, "sub sp, sp, #imm"},
{ 0xfbef8f00, 0xf1ad0d00, ARMV6T2_ABOVE, eEncodingT2, eSize32, &EmulateInstructionARM::EmulateSUBSPImm, "sub.w sp, sp, #<const>"},
{ 0xfbff8f00, 0xf2ad0d00, ARMV6T2_ABOVE, eEncodingT3, eSize32, &EmulateInstructionARM::EmulateSUBSPImm, "subw sp, sp, #imm12"},
{ 0xffef8000, 0xebad0000, ARMV6T2_ABOVE, eEncodingT1, eSize32, &EmulateInstructionARM::EmulateSUBSPReg, "sub{s}<c> <Rd>, sp, <Rm>{,<shift>}" },
// vector push consecutive extension register(s)
{ 0xffbf0f00, 0xed2d0b00, ARMV6T2_ABOVE, eEncodingT1, eSize32, &EmulateInstructionARM::EmulateVPUSH, "vpush.64 <list>"},

View File

@ -371,6 +371,10 @@ protected:
// A8.6.215 SUB (SP minus immediate)
bool
EmulateSUBSPImm (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.216 SUB (SP minus register)
bool
EmulateSUBSPReg (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.194 STR (immediate, ARM) -- Rn == sp
bool
@ -415,6 +419,10 @@ protected:
// A8.6.6 ADD (register)
bool
EmulateADDReg (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.7 ADD (register-shifted register)
bool
EmulateAddRegShift (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.97 MOV (register)
bool
@ -476,6 +484,8 @@ protected:
bool
EmulateShiftReg (const uint32_t opcode, const ARMEncoding encoding, ARM_ShifterType shift_type);
// LOAD FUNCTIONS
// A8.6.53 LDM/LDMIA/LDMFD
bool
EmulateLDM (const uint32_t opcode, const ARMEncoding encoding);
@ -496,37 +506,212 @@ protected:
bool
EmulateLDRRtRnImm (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.188 STM/STMIA/STMEA
// A8.6.58 LDR (immediate, ARM) - Encoding A1
bool
EmulateLDRImmediateARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.59 LDR (literal)
bool
EmulateLDRLiteral (const uint32_t, const ARMEncoding encoding);
// A8.6.60 LDR (register) - Encoding T1, T2, A1
bool
EmulateLDRRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.61 LDRB (immediate, Thumb) - Encoding T1, T2, T3
bool
EmulateLDRBImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.62 LDRB (immediate, ARM)
bool
EmulateLDRBImmediateARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.63 LDRB (literal) - Encoding T1, A1
bool
EmulateLDRBLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.64 LDRB (register) - Encoding T1, T2, A1
bool
EmulateLDRBRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.65 LDRBT
bool
EmulateLDRBT (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.66 LDRD (immediate)
bool
EmulateLDRDImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.67
bool
EmulateLDRDLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.68 LDRD (register)
bool
EmulateLDRDRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.69 LDREX
bool
EmulateLDREX (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.70 LDREXB
bool
EmulateLDREXB (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.71 LDREXD
bool
EmulateLDREXD (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.72 LDREXH
bool
EmulateLDREXH (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.73 LDRH (immediate, Thumb) - Encoding T1, T2, T3
bool
EmulateLDRHImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.74 LDRS (immediate, ARM)
bool
EmulateLDRHImmediateARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.75 LDRH (literal) - Encoding T1, A1
bool
EmulateLDRHLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.76 LDRH (register) - Encoding T1, T2, A1
bool
EmulateLDRHRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.77 LDRHT
bool
EmulateLDRHT (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.78 LDRSB (immediate) - Encoding T1, T2, A1
bool
EmulateLDRSBImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.79 LDRSB (literal) - Encoding T1, A1
bool
EmulateLDRSBLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.80 LDRSB (register) - Encoding T1, T2, A1
bool
EmulateLDRSBRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.81 LDRSBT
bool
EmulateLDRSBT (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.82 LDRSH (immediate) - Encoding T1, T2, A1
bool
EmulateLDRSHImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.83 LDRSH (literal) - Encoding T1, A1
bool
EmulateLDRSHLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.84 LDRSH (register) - Encoding T1, T2, A1
bool
EmulateLDRSHRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.85 LDRSHT
bool
EmulateLDRSHT (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.86
bool
EmulateLDRT (const uint32_t opcode, const ARMEncoding encoding);
// STORE FUNCTIONS
// A8.6.189 STM/STMIA/STMEA
bool
EmulateSTM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.189 STMDA/STMED
// A8.6.190 STMDA/STMED
bool
EmulateSTMDA (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.190 STMDB/STMFD
// A8.6.191 STMDB/STMFD
bool
EmulateSTMDB (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.191 STMIB/STMFA
// A8.6.192 STMIB/STMFA
bool
EmulateSTMIB (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.192 STR (immediate, Thumb)
// A8.6.193 STR (immediate, Thumb)
bool
EmulateSTRThumb(const uint32_t opcode, const ARMEncoding encoding);
// A8.6.194 STR (immediate, ARM)
bool
EmulateSTRImmARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.194 STR (register)
// A8.6.195 STR (register)
bool
EmulateSTRRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.195 STRB (immediate, Thumb)
// A8.6.196 STRB (immediate, Thumb)
bool
EmulateSTRBThumb (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.207 STRH (register)
// A8.6.197 STRB (immediate, ARM)
bool
EmulateSTRBImmARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.198 STRB (register)
bool
EmulateSTRBReg (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.199 STRBT
bool
EmulateSTRBT (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.200 STRD (immediate)
bool
EmulateSTRDImm (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.201 STRD (register)
bool
EmulateSTRDReg (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.202 STREX
bool
EmulateSTREX (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.203 STREXB
bool
EmulateSTREXB (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.204 STREXD
bool
EmulateSTREXD (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.205 STREXH
bool
EmulateSTREXH (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.206 STRH (immediate, Thumb)
bool
EmulateSTRHImmThumb (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.207 STRH (immediate, ARM)
bool
EmulateSTRHImmARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.208 STRH (register)
bool
EmulateSTRHRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.209 STRHT
bool
EmulateSTRHT (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.210 STRT
bool
EmulateSTRT (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.1 ADC (immediate)
bool
@ -576,62 +761,6 @@ protected:
bool
EmulateEORReg (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.58 LDR (immediate, ARM) - Encoding A1
bool
EmulateLDRImmediateARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.60 LDR (register) - Encoding T1, T2, A1
bool
EmulateLDRRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.61 LDRB (immediate, Thumb) - Encoding T1, T2
bool
EmulateLDRBImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.63 LDRB (literal) - Encoding T1
bool
EmulateLDRBLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.64 LDRB (register) - Encoding T1
bool
EmulateLDRBRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.73 LDRH (immediate, Thumb) - Encoding T1, T2
bool
EmulateLDRHImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.75 LDRH (literal) - Encoding T1
bool
EmulateLDRHLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.76 LDRH (register) - Encoding T1, T2
bool
EmulateLDRHRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.78 LDRSB (immediate) - Encoding T1
bool
EmulateLDRSBImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.79 LDRSB (literal) - Encoding T1
bool
EmulateLDRSBLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.80 LDRSB (register) - Encoding T1, T2
bool
EmulateLDRSBRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.82 LDRSH (immediate) - Encoding T1
bool
EmulateLDRSHImmediate (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.83 LDRSH (literal) - Encoding T1
bool
EmulateLDRSHLiteral (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.84 LDRSH (register) - Encoding T1, T2
bool
EmulateLDRSHRegister (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.105 MUL
bool
EmulateMUL (const uint32_t opcode, const ARMEncoding encoding);
@ -695,6 +824,14 @@ protected:
// A8.6.212 SUB (immediate, ARM)
bool
EmulateSUBImmARM (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.213 SUB (register)
bool
EmulateSUBReg (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.214 SUB (register-shifted register)
bool
EmulateSUBRegShift (const uint32_t opcode, const ARMEncoding encoding);
// A8.6.222 SXTB - Encoding T1
bool