| 3932 | } |
| 3933 | |
| 3934 | void OpDispatchBuilder::Finalize() { |
| 3935 | // This usually doesn't emit any IR but in the case of hitting the block instruction limit it will |
| 3936 | FlushRegisterCache(); |
| 3937 | const auto GPRSize = GetGPROpSize(); |
| 3938 | |
| 3939 | // Node 0 is invalid node |
| 3940 | Ref RealNode = reinterpret_cast<Ref>(GetNode(1)); |
| 3941 | |
| 3942 | const FEXCore::IR::IROp_Header* IROp = RealNode->Op(DualListData.DataBegin()); |
| 3943 | LOGMAN_THROW_A_FMT(IROp->Op == OP_IRHEADER, "First op in function must be our header"); |
| 3944 | |
| 3945 | // Let's walk the jump blocks and see if we have handled every block target |
| 3946 | for (auto& Handler : JumpTargets) { |
| 3947 | if (Handler.second.HaveEmitted) { |
| 3948 | continue; |
| 3949 | } |
| 3950 | |
| 3951 | // We haven't emitted. Dump out to the dispatcher |
| 3952 | SetCurrentCodeBlock(Handler.second.BlockEntry); |
| 3953 | ExitFunction(_InlineEntrypointOffset(GPRSize, Handler.first - Entry)); |
| 3954 | } |
| 3955 | } |
| 3956 | |
| 3957 | uint8_t OpDispatchBuilder::GetDstSize(X86Tables::DecodedOp Op) const { |
| 3958 | const uint32_t DstSizeFlag = X86Tables::DecodeFlags::GetSizeDstFlags(Op->Flags); |
no test coverage detected