Pass Context to the OpDispatcher

This commit is contained in:
Ryan Houdek committed 2020-04-04 23:05:03 -07:00
1 parent 33a4ff061d
commit 3e398a1b9b
4 files changed
+25 -7

No files matched your search

+1 -1
View File
@@ -424,7 +424,7 @@ namespace FEXCore::Context {
Thread->State.ThreadManager.TID = ++ThreadID;
}
Thread->OpDispatcher = std::make_unique<FEXCore::IR::OpDispatchBuilder>();
Thread->OpDispatcher = std::make_unique<FEXCore::IR::OpDispatchBuilder>(this);
Thread->OpDispatcher->SetMultiblock(Config.Multiblock);
Thread->BlockCache = std::make_unique<FEXCore::BlockCache>(this);
Thread->CTX = this;
+15 -2
View File
@@ -3383,8 +3383,9 @@ void OpDispatchBuilder::StoreResult(FEXCore::IR::RegisterClassType Class, FEXCor
StoreResult(Class, Op, Op->Dest, Src, Align);
}
OpDispatchBuilder::OpDispatchBuilder()
: Data {8 * 1024 * 1024}
OpDispatchBuilder::OpDispatchBuilder(FEXCore::Context::Context *ctx)
: CTX {ctx}
, Data {8 * 1024 * 1024}
, ListData {8 * 1024 * 1024} {
ResetWorkingList();
}
@@ -5091,6 +5092,18 @@ void OpDispatchBuilder::ReplaceAllUsesWithInclusive(OrderedNode *Node, OrderedNo
}
}
void OpDispatchBuilder::ReplaceNodeArgument(OrderedNode *Node, uint8_t Arg, OrderedNode *NewArg) {
uintptr_t ListBegin = ListData.Begin();
uintptr_t DataBegin = Data.Begin();
FEXCore::IR::IROp_Header *IROp = Node->Op(DataBegin);
OrderedNodeWrapper OldArgWrapper = IROp->Args[Arg];
OrderedNode *OldArg = OldArgWrapper.GetNode(ListBegin);
OldArg->RemoveUse();
NewArg->AddUse();
IROp->Args[Arg].NodeOffset = NewArg->Wrapped(ListBegin).NodeOffset;
}
void OpDispatchBuilder::RemoveArgUses(OrderedNode *Node) {
uintptr_t ListBegin = ListData.Begin();
uintptr_t DataBegin = Data.Begin();
+7 -3
View File
@@ -22,7 +22,7 @@ class OpDispatchBuilder final {
friend class FEXCore::IR::Pass;
friend class FEXCore::IR::PassManager;
public:
FEXCore::Context::Context *CTX{};
bool ShouldDump {false};
struct JumpTargetInfo {
@@ -81,7 +81,7 @@ public:
return false;
}
OpDispatchBuilder();
OpDispatchBuilder(FEXCore::Context::Context *ctx);
IRListView<false> ViewIR() { return IRListView<false>(&Data, &ListData); }
IRListView<true> *CreateIRCopy() { return new IRListView<true>(&Data, &ListData); }
@@ -544,6 +544,10 @@ public:
return _PhiValue(Value, Block, InvalidNode);
}
OrderedNode *Invalid() {
return InvalidNode;
}
void AddPhiValue(IR::IROp_Phi *Phi, OrderedNode *Value) {
// Got to do some bookkeeping first
Value->AddUse();
@@ -640,10 +644,10 @@ public:
}
void ReplaceAllUsesWithInclusive(OrderedNode *Node, OrderedNode *NewNode, IR::NodeWrapperIterator After, IR::NodeWrapperIterator End);
void ReplaceNodeArgument(OrderedNode *Node, uint8_t Arg, OrderedNode *NewArg);
void Remove(OrderedNode *Node);
void SetPackedRFLAG(bool Lower8, OrderedNode *Src);
OrderedNode *GetPackedRFLAG(bool Lower8);
@@ -15,7 +15,8 @@ private:
std::vector<IR::OrderedNodeWrapper::NodeOffsetType> OldToNewRemap;
};
IRCompaction::IRCompaction() {
IRCompaction::IRCompaction()
: LocalBuilder {nullptr} {
OldToNewRemap.resize(9000);
}