summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-08-28 21:24:49 -0700
committerGitHub <noreply@github.com>2023-08-28 21:24:49 -0700
commitc787c4b82ba76f87069911f203eb192060b5264f (patch)
tree2aa98326ce8d4c9f2011d79ee9f6d34db14716e7 /source/slang/slang-ir.cpp
parentaf363c02bf0fa2502c14f454965adff87170ff15 (diff)
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 <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir.cpp')
-rw-r--r--source/slang/slang-ir.cpp33
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)