mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-10 16:19:28 +01:00
Jit64: Always pass effective address to InvalidateICache() in dcbx.
This commit is contained in:
parent
5bd188d40d
commit
0e76dabbbb
@ -239,15 +239,17 @@ void Jit64::dcbx(UGeckoInstruction inst)
|
|||||||
RCOpArg Ra = inst.RA ? gpr.Use(inst.RA, RCMode::Read) : RCOpArg::Imm32(0);
|
RCOpArg Ra = inst.RA ? gpr.Use(inst.RA, RCMode::Read) : RCOpArg::Imm32(0);
|
||||||
RCOpArg Rb = gpr.Use(inst.RB, RCMode::Read);
|
RCOpArg Rb = gpr.Use(inst.RB, RCMode::Read);
|
||||||
RCX64Reg tmp = gpr.Scratch();
|
RCX64Reg tmp = gpr.Scratch();
|
||||||
RegCache::Realize(Ra, Rb, tmp);
|
RCX64Reg effective_address = gpr.Scratch();
|
||||||
|
RegCache::Realize(Ra, Rb, tmp, effective_address);
|
||||||
|
|
||||||
// Translate effective address to physical address.
|
// Translate effective address to physical address.
|
||||||
MOV_sum(32, value, Ra, Rb);
|
MOV_sum(32, value, Ra, Rb);
|
||||||
FixupBranch bat_lookup_failed;
|
FixupBranch bat_lookup_failed;
|
||||||
|
MOV(32, R(effective_address), R(value));
|
||||||
if (MSR.IR)
|
if (MSR.IR)
|
||||||
{
|
{
|
||||||
MOV(32, R(addr), R(value));
|
|
||||||
bat_lookup_failed = BATAddressLookup(value, tmp, PowerPC::ibat_table.data());
|
bat_lookup_failed = BATAddressLookup(value, tmp, PowerPC::ibat_table.data());
|
||||||
|
MOV(32, R(addr), R(effective_address));
|
||||||
AND(32, R(addr), Imm32(0x0001ffff));
|
AND(32, R(addr), Imm32(0x0001ffff));
|
||||||
AND(32, R(value), Imm32(0xfffe0000));
|
AND(32, R(value), Imm32(0xfffe0000));
|
||||||
OR(32, R(value), R(addr));
|
OR(32, R(value), R(addr));
|
||||||
@ -264,14 +266,14 @@ void Jit64::dcbx(UGeckoInstruction inst)
|
|||||||
|
|
||||||
SwitchToFarCode();
|
SwitchToFarCode();
|
||||||
SetJumpTarget(invalidate_needed);
|
SetJumpTarget(invalidate_needed);
|
||||||
SHL(32, R(addr), Imm8(5));
|
|
||||||
if (MSR.IR)
|
if (MSR.IR)
|
||||||
SetJumpTarget(bat_lookup_failed);
|
SetJumpTarget(bat_lookup_failed);
|
||||||
|
|
||||||
BitSet32 registersInUse = CallerSavedRegistersInUse();
|
BitSet32 registersInUse = CallerSavedRegistersInUse();
|
||||||
registersInUse[X64Reg(tmp)] = false;
|
registersInUse[X64Reg(tmp)] = false;
|
||||||
|
registersInUse[X64Reg(effective_address)] = false;
|
||||||
ABI_PushRegistersAndAdjustStack(registersInUse, 0);
|
ABI_PushRegistersAndAdjustStack(registersInUse, 0);
|
||||||
MOV(32, R(ABI_PARAM1), R(addr));
|
MOV(32, R(ABI_PARAM1), R(effective_address));
|
||||||
MOV(32, R(ABI_PARAM2), Imm32(32));
|
MOV(32, R(ABI_PARAM2), Imm32(32));
|
||||||
XOR(32, R(ABI_PARAM3), R(ABI_PARAM3));
|
XOR(32, R(ABI_PARAM3), R(ABI_PARAM3));
|
||||||
ABI_CallFunction(JitInterface::InvalidateICache);
|
ABI_CallFunction(JitInterface::InvalidateICache);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user