| 550 | } |
| 551 | |
| 552 | void OpDispatchBuilder::CALLAbsoluteOp(OpcodeArgs) { |
| 553 | BlockSetRIP = true; |
| 554 | |
| 555 | const auto Size = OpSizeFromSrc(Op); |
| 556 | Ref JMPPCOffset = LoadSource(GPRClass, Op, Op->Src[0], Op->Flags); |
| 557 | |
| 558 | // Push the return address. |
| 559 | auto ConstantPC = GetRelocatedPC(Op); |
| 560 | Push(Size, ConstantPC); |
| 561 | |
| 562 | // Store the RIP |
| 563 | const uint64_t NextRIP = Op->PC + Op->InstSize; |
| 564 | ExitFunction(JMPPCOffset, BranchHint::Call, ConstantPC, [&]() { |
| 565 | auto CallReturnJumpTarget = JumpTargets.find(NextRIP); |
| 566 | if (CallReturnJumpTarget != JumpTargets.end() && CallReturnJumpTarget->second.IsEntryPoint) { |
| 567 | return CallReturnJumpTarget->second.BlockEntry; |
| 568 | } |
| 569 | return InvalidNode; |
| 570 | }()); |
| 571 | } |
| 572 | |
| 573 | std::optional<CondClassType> OpDispatchBuilder::DecodeNZCVCondition(uint8_t OP) { |
| 574 | switch (OP) { |