From c787c4b82ba76f87069911f203eb192060b5264f Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 28 Aug 2023 21:24:49 -0700 Subject: Add `target_switch` and `intrinsic_asm` statement. (#3154) * Add `target_switch` and `__intrinsic_asm` statement. * Cleanup. * WaveGetActiveMask, WaveGetActiveMask, WaveCountBits. * WaveIsFirstLane. * More wave intrinsics. * wave intrinsics. * merge fix. * Fix. * Fix. * Update test. * update test. * Fix. --------- Co-authored-by: Yong He --- source/slang/slang-ir.cpp | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'source/slang/slang-ir.cpp') 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(callee); + if (!func) + return false; + auto block = func->getFirstBlock(); + if (!block) + return false; + if (auto genAsm = as(block->getTerminator())) + { + outDefinition = genAsm->getAsm(); + return true; + } + return false; + } #if 0 IRFunc* cloneSimpleFuncWithoutRegistering(IRSpecContextBase* context, IRFunc* originalFunc) -- cgit v1.2.3