diff options
| author | Yong He <yonghe@outlook.com> | 2023-08-28 21:24:49 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-28 21:24:49 -0700 |
| commit | c787c4b82ba76f87069911f203eb192060b5264f (patch) | |
| tree | 2aa98326ce8d4c9f2011d79ee9f6d34db14716e7 /source/slang/slang-ir.cpp | |
| parent | af363c02bf0fa2502c14f454965adff87170ff15 (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.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) |
