mirror of
https://github.com/FEX-Emu/FEX.git
synced 2025-02-02 04:25:08 +00:00
OpcodeDispatcher: thunk through FlushRegisterCache
Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
This commit is contained in:
parent
5e0952159d
commit
2949bc211d
@ -113,7 +113,7 @@ void OpDispatchBuilder::SyscallOp(OpcodeArgs) {
|
||||
StoreGPRRegister(X86State::REG_RCX, RIPAfterInst, 8);
|
||||
}
|
||||
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
auto SyscallOp = _Syscall(Arguments[0], Arguments[1], Arguments[2], Arguments[3], Arguments[4], Arguments[5], Arguments[6], DefaultSyscallFlags);
|
||||
|
||||
if (OSABI != FEXCore::HLE::SyscallOSABI::OS_HANGOVER &&
|
||||
@ -395,7 +395,7 @@ void OpDispatchBuilder::PUSHOp(OpcodeArgs) {
|
||||
|
||||
// Store the new stack pointer
|
||||
StoreGPRRegister(X86State::REG_RSP, NewSP);
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::PUSHREGOp(OpcodeArgs) {
|
||||
@ -408,7 +408,7 @@ void OpDispatchBuilder::PUSHREGOp(OpcodeArgs) {
|
||||
auto NewSP = _Push(GPRSize, Size, Src, OldSP);
|
||||
// Store the new stack pointer
|
||||
StoreGPRRegister(X86State::REG_RSP, NewSP);
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
}
|
||||
|
||||
void OpDispatchBuilder::PUSHAOp(OpcodeArgs) {
|
||||
@ -458,7 +458,7 @@ void OpDispatchBuilder::PUSHAOp(OpcodeArgs) {
|
||||
|
||||
// Store the new stack pointer
|
||||
StoreGPRRegister(X86State::REG_RSP, NewSP, 4);
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
}
|
||||
|
||||
template<uint32_t SegmentReg>
|
||||
@ -843,7 +843,7 @@ void OpDispatchBuilder::CondJUMPOp(OpcodeArgs) {
|
||||
Target &= 0xFFFFFFFFU;
|
||||
}
|
||||
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
auto TrueBlock = JumpTargets.find(Target);
|
||||
auto FalseBlock = JumpTargets.find(Op->PC + Op->InstSize);
|
||||
|
||||
@ -4007,7 +4007,7 @@ void OpDispatchBuilder::BeginFunction(uint64_t RIP, const fextl::vector<FEXCore:
|
||||
|
||||
void OpDispatchBuilder::Finalize() {
|
||||
// This usually doesn't emit any IR but in the case of hitting the block instruction limit it will
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
const uint8_t GPRSize = CTX->GetGPRSize();
|
||||
|
||||
// Node 0 is invalid node
|
||||
@ -4716,7 +4716,7 @@ void OpDispatchBuilder::INTOp(OpcodeArgs) {
|
||||
}
|
||||
|
||||
// Calculate flags early.
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
|
||||
const uint8_t GPRSize = CTX->GetGPRSize();
|
||||
|
||||
|
@ -115,7 +115,7 @@ public:
|
||||
// Changes get stored out by CalculateDeferredFlags.
|
||||
CachedNZCV = nullptr;
|
||||
PossiblySetNZCVBits = ~0U;
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
|
||||
// New block needs to reset segment telemetry.
|
||||
SegmentsNeedReadCheck = ~0U;
|
||||
@ -125,28 +125,28 @@ public:
|
||||
}
|
||||
|
||||
IRPair<IROp_Jump> Jump() {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _Jump();
|
||||
}
|
||||
IRPair<IROp_Jump> Jump(Ref _TargetBlock) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _Jump(_TargetBlock);
|
||||
}
|
||||
IRPair<IROp_CondJump>
|
||||
CondJump(Ref _Cmp1, Ref _Cmp2, Ref _TrueBlock, Ref _FalseBlock, CondClassType _Cond = {COND_NEQ}, uint8_t _CompareSize = 0) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _CondJump(_Cmp1, _Cmp2, _TrueBlock, _FalseBlock, _Cond, _CompareSize);
|
||||
}
|
||||
IRPair<IROp_CondJump> CondJump(Ref ssa0, CondClassType cond = {COND_NEQ}) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _CondJump(ssa0, cond);
|
||||
}
|
||||
IRPair<IROp_CondJump> CondJump(Ref ssa0, Ref ssa1, Ref ssa2, CondClassType cond = {COND_NEQ}) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _CondJump(ssa0, ssa1, ssa2, cond);
|
||||
}
|
||||
IRPair<IROp_CondJump> CondJumpNZCV(CondClassType Cond) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
|
||||
// The jump will ignore the sources, so it doesn't matter what we put here.
|
||||
// Put an inline constant so RA+codegen will ignore altogether.
|
||||
@ -154,15 +154,15 @@ public:
|
||||
return _CondJump(Placeholder, Placeholder, InvalidNode, InvalidNode, Cond, 0, true);
|
||||
}
|
||||
IRPair<IROp_ExitFunction> ExitFunction(Ref NewRIP) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _ExitFunction(NewRIP);
|
||||
}
|
||||
IRPair<IROp_Break> Break(BreakDefinition Reason) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _Break(Reason);
|
||||
}
|
||||
IRPair<IROp_Thunk> Thunk(Ref ArgPtr, SHA256Sum ThunkNameHash) {
|
||||
CalculateDeferredFlags();
|
||||
FlushRegisterCache();
|
||||
return _Thunk(ArgPtr, ThunkNameHash);
|
||||
}
|
||||
|
||||
@ -1267,6 +1267,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void FlushRegisterCache(bool SRAOnly = false) {
|
||||
CalculateDeferredFlags();
|
||||
}
|
||||
|
||||
protected:
|
||||
void SaveNZCV(IROps Op = OP_DUMMY) override {
|
||||
/* Some opcodes are conservatively marked as clobbering flags, but in fact
|
||||
|
Loading…
x
Reference in New Issue
Block a user