mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-31 00:32:53 +00:00
Merge pull request #12122 from JosJuice/jit-imm-msr
Jit: Handle imm msr in EmitStoreMembase
This commit is contained in:
commit
95f06ef231
@ -499,10 +499,18 @@ void Jit64::EmitUpdateMembase()
|
||||
void Jit64::EmitStoreMembase(const OpArg& msr, X64Reg scratch_reg)
|
||||
{
|
||||
auto& memory = m_system.GetMemory();
|
||||
MOV(64, R(RMEM), ImmPtr(memory.GetLogicalBase()));
|
||||
MOV(64, R(scratch_reg), ImmPtr(memory.GetPhysicalBase()));
|
||||
TEST(32, msr, Imm32(1 << (31 - 27)));
|
||||
CMOVcc(64, RMEM, R(scratch_reg), CC_Z);
|
||||
if (msr.IsImm())
|
||||
{
|
||||
MOV(64, R(RMEM),
|
||||
ImmPtr(UReg_MSR(msr.Imm32()).DR ? memory.GetLogicalBase() : memory.GetPhysicalBase()));
|
||||
}
|
||||
else
|
||||
{
|
||||
MOV(64, R(RMEM), ImmPtr(memory.GetLogicalBase()));
|
||||
MOV(64, R(scratch_reg), ImmPtr(memory.GetPhysicalBase()));
|
||||
TEST(32, msr, Imm32(1 << (31 - 27)));
|
||||
CMOVcc(64, RMEM, R(scratch_reg), CC_Z);
|
||||
}
|
||||
MOV(64, PPCSTATE(mem_ptr), R(RMEM));
|
||||
}
|
||||
|
||||
|
@ -439,7 +439,7 @@ void Jit64::mtmsr(UGeckoInstruction inst)
|
||||
RegCache::Realize(Rs);
|
||||
MOV(32, PPCSTATE(msr), Rs);
|
||||
|
||||
EmitStoreMembase(PPCSTATE(msr), RSCRATCH2);
|
||||
EmitStoreMembase(Rs, RSCRATCH2);
|
||||
}
|
||||
|
||||
gpr.Flush();
|
||||
|
@ -347,6 +347,16 @@ void JitArm64::EmitUpdateMembase()
|
||||
LDR(IndexType::Unsigned, MEM_REG, PPC_REG, PPCSTATE_OFF(mem_ptr));
|
||||
}
|
||||
|
||||
void JitArm64::EmitStoreMembase(u32 msr)
|
||||
{
|
||||
auto& memory = m_system.GetMemory();
|
||||
MOVP2R(MEM_REG,
|
||||
UReg_MSR(msr).DR ?
|
||||
(jo.fastmem_arena ? memory.GetLogicalBase() : memory.GetLogicalPageMappingsBase()) :
|
||||
(jo.fastmem_arena ? memory.GetPhysicalBase() : memory.GetPhysicalPageMappingsBase()));
|
||||
STR(IndexType::Unsigned, MEM_REG, PPC_REG, PPCSTATE_OFF(mem_ptr));
|
||||
}
|
||||
|
||||
void JitArm64::EmitStoreMembase(const ARM64Reg& msr)
|
||||
{
|
||||
auto& memory = m_system.GetMemory();
|
||||
|
@ -308,6 +308,7 @@ protected:
|
||||
void EndTimeProfile(JitBlock* b);
|
||||
|
||||
void EmitUpdateMembase();
|
||||
void EmitStoreMembase(u32 msr);
|
||||
void EmitStoreMembase(const Arm64Gen::ARM64Reg& msr);
|
||||
|
||||
// Exits
|
||||
|
@ -92,10 +92,14 @@ void JitArm64::mtmsr(UGeckoInstruction inst)
|
||||
JITDISABLE(bJITSystemRegistersOff);
|
||||
FALLBACK_IF(jo.fp_exceptions);
|
||||
|
||||
gpr.BindToRegister(inst.RS, true);
|
||||
const bool imm_value = gpr.IsImm(inst.RS);
|
||||
if (imm_value)
|
||||
EmitStoreMembase(gpr.GetImm(inst.RS));
|
||||
|
||||
STR(IndexType::Unsigned, gpr.R(inst.RS), PPC_REG, PPCSTATE_OFF(msr));
|
||||
|
||||
EmitStoreMembase(gpr.R(inst.RS));
|
||||
if (!imm_value)
|
||||
EmitStoreMembase(gpr.R(inst.RS));
|
||||
|
||||
gpr.Flush(FlushMode::All, ARM64Reg::INVALID_REG);
|
||||
fpr.Flush(FlushMode::All, ARM64Reg::INVALID_REG);
|
||||
@ -172,7 +176,6 @@ void JitArm64::mtsr(UGeckoInstruction inst)
|
||||
INSTRUCTION_START
|
||||
JITDISABLE(bJITSystemRegistersOff);
|
||||
|
||||
gpr.BindToRegister(inst.RS, true);
|
||||
STR(IndexType::Unsigned, gpr.R(inst.RS), PPC_REG, PPCSTATE_OFF_SR(inst.SR));
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user