diff options
Diffstat (limited to 'source/slang/slang-ir.cpp')
| -rw-r--r-- | source/slang/slang-ir.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index 0b1e9c342..cd49c6df5 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -512,6 +512,7 @@ namespace Slang case kIROp_Unreachable: case kIROp_MissingReturn: case kIROp_discard: + case kIROp_GenericAsm: break; case kIROp_unconditionalBranch: @@ -538,7 +539,11 @@ namespace Slang end = operands + terminator->getOperandCount() + 1; stride = 2; break; - + case kIROp_TargetSwitch: + begin = operands + 2; + end = operands + terminator->getOperandCount() + 1; + stride = 2; + break; default: SLANG_UNEXPECTED("unhandled terminator instruction"); UNREACHABLE_RETURN(IRBlock::SuccessorList(nullptr, nullptr)); @@ -5768,6 +5773,12 @@ namespace Slang return asmInst; } + IRInst* IRBuilder::emitGenericAsm(UnownedStringSlice asmText) + { + IRInst* arg = getStringValue(asmText); + return emitIntrinsicInst(nullptr, kIROp_GenericAsm, 1, &arg); + } + // // Decorations // @@ -7743,6 +7754,26 @@ namespace Slang return findBestTargetDecoration(val, CapabilitySet(targetCapabilityAtom)); } + bool findTargetIntrinsicDefinition(IRInst* callee, CapabilitySet const& targetCaps, UnownedStringSlice& outDefinition) + { + if (auto decor = findBestTargetIntrinsicDecoration(callee, targetCaps)) + { + outDefinition = decor->getDefinition(); + return true; + } + auto func = as<IRGlobalValueWithCode>(callee); + if (!func) + return false; + auto block = func->getFirstBlock(); + if (!block) + return false; + if (auto genAsm = as<IRGenericAsm>(block->getTerminator())) + { + outDefinition = genAsm->getAsm(); + return true; + } + return false; + } #if 0 IRFunc* cloneSimpleFuncWithoutRegistering(IRSpecContextBase* context, IRFunc* originalFunc) |
