|
|
|
@@ -277,7 +277,7 @@ void JitX64::LDR_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ImmediatePostIndexed,
|
|
|
|
|
U, Rn_index, imm12);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load32LE : &Load32BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load32LE : &Load32BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -301,7 +301,7 @@ void JitX64::LDR_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ScaledRegisterPostIndexed,
|
|
|
|
|
U, Rn_index, imm5, shift, Rm_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load32LE : &Load32BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load32LE : &Load32BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -325,7 +325,7 @@ void JitX64::LDRB_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ImmediatePostIndexed,
|
|
|
|
|
U, Rn_index, imm12);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(&Load8);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(&Load8));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -349,7 +349,7 @@ void JitX64::LDRB_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ScaledRegisterPostIndexed,
|
|
|
|
|
U, Rn_index, imm5, shift, Rm_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(&Load8);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(&Load8));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -378,7 +378,7 @@ void JitX64::STR_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Store32LE : &Store32BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Store32LE : &Store32BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -400,7 +400,7 @@ void JitX64::STR_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Store32LE : &Store32BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Store32LE : &Store32BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -422,7 +422,7 @@ void JitX64::STRB_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(&Store8);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(&Store8));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -444,7 +444,7 @@ void JitX64::STRB_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(&Store8);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(&Store8));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -492,7 +492,7 @@ void JitX64::LDRD_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ImmediatePostIndexed,
|
|
|
|
|
U, Rn_index, CombineImm8ab(imm8a, imm8b));
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load64LE : &Load64BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load64LE : &Load64BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -521,7 +521,7 @@ void JitX64::LDRD_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ScaledRegisterPostIndexed,
|
|
|
|
|
U, Rn_index, 0, 0, Rm_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load64LE : &Load64BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load64LE : &Load64BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -550,7 +550,7 @@ void JitX64::LDRH_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ImmediatePostIndexed,
|
|
|
|
|
U, Rn_index, CombineImm8ab(imm8a, imm8b));
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load16LE : &Load16BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load16LE : &Load16BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -575,7 +575,7 @@ void JitX64::LDRH_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ScaledRegisterPostIndexed,
|
|
|
|
|
U, Rn_index, 0, 0, Rm_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load16LE : &Load16BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load16LE : &Load16BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -600,7 +600,7 @@ void JitX64::LDRSB_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmRe
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ImmediatePostIndexed,
|
|
|
|
|
U, Rn_index, CombineImm8ab(imm8a, imm8b));
|
|
|
|
|
|
|
|
|
|
CompileCallHost(&Load8);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(&Load8));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -625,7 +625,7 @@ void JitX64::LDRSB_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmRe
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ScaledRegisterPostIndexed,
|
|
|
|
|
U, Rn_index, 0, 0, Rm_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(&Load8);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(&Load8));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -650,7 +650,7 @@ void JitX64::LDRSH_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmRe
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ImmediatePostIndexed,
|
|
|
|
|
U, Rn_index, CombineImm8ab(imm8a, imm8b));
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load16LE : &Load16BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load16LE : &Load16BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -675,7 +675,7 @@ void JitX64::LDRSH_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmRe
|
|
|
|
|
&JitX64::LoadAndStoreWordOrUnsignedByte_ScaledRegisterPostIndexed,
|
|
|
|
|
U, Rn_index, 0, 0, Rm_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Load16LE : &Load16BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Load16LE : &Load16BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.LockX64(ABI_RETURN);
|
|
|
|
@@ -710,7 +710,7 @@ void JitX64::STRD_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index + 0);
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM3, Rd_index + 1);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Store64LE : &Store64BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Store64LE : &Store64BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -738,7 +738,7 @@ void JitX64::STRD_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index + 0);
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM3, Rd_index + 1);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Store64LE : &Store64BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Store64LE : &Store64BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -761,7 +761,7 @@ void JitX64::STRH_imm(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Store16LE : &Store16BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Store16LE : &Store16BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -783,7 +783,7 @@ void JitX64::STRH_reg(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmReg
|
|
|
|
|
|
|
|
|
|
GetValueOfRegister(code, reg_alloc, GetReg15Value(), ABI_PARAM2, Rd_index);
|
|
|
|
|
|
|
|
|
|
CompileCallHost(!current.EFlag ? &Store16LE : &Store16BE);
|
|
|
|
|
CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &Store16LE : &Store16BE));
|
|
|
|
|
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM1);
|
|
|
|
|
reg_alloc.UnlockX64(ABI_PARAM2);
|
|
|
|
@@ -949,7 +949,7 @@ void JitX64::LDM(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmRegList
|
|
|
|
|
// TODO: Optimize
|
|
|
|
|
|
|
|
|
|
LoadAndStoreMultiple_Helper(code, reg_alloc, P, U, W, Rn_index, list,
|
|
|
|
|
[this](){ CompileCallHost(!current.EFlag ? &ExecuteLDMLE : &ExecuteLDMBE); });
|
|
|
|
|
[this](){ CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &ExecuteLDMLE : &ExecuteLDMBE)); });
|
|
|
|
|
|
|
|
|
|
current.arm_pc += GetInstSize();
|
|
|
|
|
if (list & (1 << 15)) {
|
|
|
|
@@ -1006,7 +1006,7 @@ void JitX64::STM(Cond cond, bool P, bool U, bool W, ArmReg Rn_index, ArmRegList
|
|
|
|
|
// TODO: Optimize
|
|
|
|
|
|
|
|
|
|
LoadAndStoreMultiple_Helper(code, reg_alloc, P, U, W, Rn_index, list,
|
|
|
|
|
[this](){ CompileCallHost(!current.EFlag ? &ExecuteSTMLE : &ExecuteSTMBE); });
|
|
|
|
|
[this](){ CompileCallHost(reinterpret_cast<const void* const>(!current.EFlag ? &ExecuteSTMLE : &ExecuteSTMBE)); });
|
|
|
|
|
|
|
|
|
|
current.arm_pc += GetInstSize();
|
|
|
|
|
}
|
|
|
|
|