JitArm64: Don't hardcode exception constants
Unlike most constants we emit in JitArm64, these constants are *not* inherent to the CPU we're emulating, and can have whatever values we want. Let's handle them more robustly, in case we decide to change their values in the future.
This commit is contained in:
parent
2409d30f5c
commit
58698b8380
|
@ -748,7 +748,7 @@ void JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||||
|
|
||||||
// Inline exception check
|
// Inline exception check
|
||||||
LDR(IndexType::Unsigned, ARM64Reg::W30, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, ARM64Reg::W30, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
TBZ(ARM64Reg::W30, 3, done_here); // EXCEPTION_EXTERNAL_INT
|
TBZ(ARM64Reg::W30, IntLog2(EXCEPTION_EXTERNAL_INT), done_here);
|
||||||
LDR(IndexType::Unsigned, ARM64Reg::W30, PPC_REG, PPCSTATE_OFF(msr));
|
LDR(IndexType::Unsigned, ARM64Reg::W30, PPC_REG, PPCSTATE_OFF(msr));
|
||||||
TBZ(ARM64Reg::W30, 11, done_here);
|
TBZ(ARM64Reg::W30, 11, done_here);
|
||||||
MOVP2R(ARM64Reg::X30, &ProcessorInterface::m_InterruptCause);
|
MOVP2R(ARM64Reg::X30, &ProcessorInterface::m_InterruptCause);
|
||||||
|
@ -774,7 +774,7 @@ void JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||||
ARM64Reg WA = gpr.GetReg();
|
ARM64Reg WA = gpr.GetReg();
|
||||||
ARM64Reg XA = EncodeRegTo64(WA);
|
ARM64Reg XA = EncodeRegTo64(WA);
|
||||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
FixupBranch NoExtException = TBZ(WA, 3); // EXCEPTION_EXTERNAL_INT
|
FixupBranch NoExtException = TBZ(WA, IntLog2(EXCEPTION_EXTERNAL_INT));
|
||||||
FixupBranch Exception = B();
|
FixupBranch Exception = B();
|
||||||
SwitchToFarCode();
|
SwitchToFarCode();
|
||||||
const u8* done_here = GetCodePtr();
|
const u8* done_here = GetCodePtr();
|
||||||
|
@ -816,7 +816,7 @@ void JitArm64::DoJit(u32 em_address, JitBlock* b, u32 nextPC)
|
||||||
fpr.Flush(FlushMode::MaintainState);
|
fpr.Flush(FlushMode::MaintainState);
|
||||||
|
|
||||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
ORR(WA, WA, 26, 0); // EXCEPTION_FPU_UNAVAILABLE
|
ORRI2R(WA, WA, EXCEPTION_FPU_UNAVAILABLE);
|
||||||
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
|
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
|
|
|
@ -25,7 +25,7 @@ void JitArm64::sc(UGeckoInstruction inst)
|
||||||
ARM64Reg WA = gpr.GetReg();
|
ARM64Reg WA = gpr.GetReg();
|
||||||
|
|
||||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
ORR(WA, WA, 31, 0); // Same as WA | EXCEPTION_SYSCALL
|
ORRI2R(WA, WA, EXCEPTION_SYSCALL);
|
||||||
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
|
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
|
|
|
@ -218,7 +218,7 @@ void JitArm64::twx(UGeckoInstruction inst)
|
||||||
fpr.Flush(FlushMode::MaintainState);
|
fpr.Flush(FlushMode::MaintainState);
|
||||||
|
|
||||||
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
LDR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
ORR(WA, WA, 24, 0); // Same as WA | EXCEPTION_PROGRAM
|
ORRI2R(WA, WA, EXCEPTION_PROGRAM);
|
||||||
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
STR(IndexType::Unsigned, WA, PPC_REG, PPCSTATE_OFF(Exceptions));
|
||||||
gpr.Unlock(WA);
|
gpr.Unlock(WA);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue