diff --git a/Core/MIPS/x86/X64IRAsm.cpp b/Core/MIPS/x86/X64IRAsm.cpp index 7282bc68d4..cbbfff09dc 100644 --- a/Core/MIPS/x86/X64IRAsm.cpp +++ b/Core/MIPS/x86/X64IRAsm.cpp @@ -58,6 +58,7 @@ void X64JitBackend::GenerateFixedCode(MIPSState *mipsState) { //regs_.EmitSaveStaticRegisters(); RET(); + // Note: needs to not modify EAX, or to save it if it does. loadStaticRegisters_ = AlignCode16(); //regs_.EmitLoadStaticRegisters(); //MOV(32, R(DOWNCOUNTREG), MDisp(CTXREG, downcountOffset)); diff --git a/Core/MIPS/x86/X64IRCompSystem.cpp b/Core/MIPS/x86/X64IRCompSystem.cpp index 0c2f7ef66e..2d4f5db7f7 100644 --- a/Core/MIPS/x86/X64IRCompSystem.cpp +++ b/Core/MIPS/x86/X64IRCompSystem.cpp @@ -124,6 +124,14 @@ void X64JitBackend::CompIR_System(IRInst inst) { break; case IROp::CallReplacement: + FlushAll(); + SaveStaticRegisters(); + ABI_CallFunction(GetReplacementFunc(inst.constant)->replaceFunc); + LoadStaticRegisters(); + //SUB(32, R(DOWNCOUNTREG), R(DOWNCOUNTREG), R(EAX)); + SUB(32, MDisp(CTXREG, downcountOffset), R(EAX)); + break; + case IROp::Break: CompIR_Generic(inst); break;