diff --git a/Source/Interface/Core/OpcodeDispatcher.h b/Source/Interface/Core/OpcodeDispatcher.h index 9aab9a093..ace9622f4 100644 --- a/Source/Interface/Core/OpcodeDispatcher.h +++ b/Source/Interface/Core/OpcodeDispatcher.h @@ -338,6 +338,30 @@ public: return _CondJump(ssa0, InvalidNode, InvalidNode); } + IRPair _Phi() { + return _Phi(InvalidNode, InvalidNode, 0); + } + + IRPair _PhiValue(OrderedNode *Value, OrderedNode *Block) { + return _PhiValue(Value, Block, InvalidNode); + } + + void AddPhiValue(IR::IROp_Phi *Phi, OrderedNode *Value) { + // Got to do some bookkeeping first + Value->AddUse(); + auto ValueIROp = Value->Op(Data.Begin())->C()->Value.GetNode(ListData.Begin())->Op(Data.Begin()); + Phi->Header.Size = ValueIROp->Size; + Phi->Header.Elements = ValueIROp->Elements; + + if (!Phi->PhiBegin.ID()) { + Phi->PhiBegin = Phi->PhiEnd = Value->Wrapped(ListData.Begin()); + return; + } + auto PhiValueEndNode = Phi->PhiEnd.GetNode(ListData.Begin()); + auto PhiValueEndOp = PhiValueEndNode->Op(Data.Begin())->CW(); + PhiValueEndOp->Next = Value->Wrapped(ListData.Begin()); + } + void SetJumpTarget(IR::IROp_Jump *Op, OrderedNode *Target) { LogMan::Throw::A(Target->Op(Data.Begin())->Op == OP_CODEBLOCK, "Tried setting Jump target to %%ssa%d %s",