diff options
| author | Yong He <yonghe@outlook.com> | 2022-06-21 14:55:59 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-06-21 14:55:59 -0700 |
| commit | e5a75563a1ba2e378353af8b937b8b7bb0fe2c2b (patch) | |
| tree | 0f31040b408a66f49dc5cd2354c8424e5ff2e279 /source/slang/slang-ir.cpp | |
| parent | ea3800e115d4ad1ce06ec07689152616f47a0e3d (diff) | |
Lower throwing COM interface method. (#2282)
* Lower throwing COM interface method.
* Fix.
* Fix warnings.
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir.cpp')
| -rw-r--r-- | source/slang/slang-ir.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index 562d0ea1a..42ff5823b 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -3224,6 +3224,16 @@ namespace Slang return emitMakeTuple(type, count, args); } + IRInst* IRBuilder::emitMakeString(IRInst* nativeStr) + { + return emitIntrinsicInst(getStringType(), kIROp_makeString, 1, &nativeStr); + } + + IRInst* IRBuilder::emitGetNativeString(IRInst* str) + { + return emitIntrinsicInst(getNativeStringType(), kIROp_getNativeStr, 1, &str); + } + IRInst* IRBuilder::emitGetTupleElement(IRType* type, IRInst* tuple, UInt element) { // As a quick simplification/optimization, if the user requests @@ -4022,6 +4032,18 @@ namespace Slang return inst; } + IRInst* IRBuilder::emitBranch(IRBlock* block, Int argCount, IRInst* const* args) + { + List<IRInst*> argList; + argList.add(block); + for (Int i = 0; i < argCount; ++i) + argList.add(args[i]); + auto inst = + createInst<IRUnconditionalBranch>(this, kIROp_unconditionalBranch, nullptr, argList.getCount(), argList.getBuffer()); + addInst(inst); + return inst; + } + IRInst* IRBuilder::emitBreak( IRBlock* target) { @@ -4089,6 +4111,25 @@ namespace Slang return inst; } + IRInst* IRBuilder::emitIfElseWithBlocks( + IRInst* val, IRBlock*& outTrueBlock, IRBlock*& outFalseBlock, IRBlock*& outAfterBlock) + { + outTrueBlock = createBlock(); + outAfterBlock = createBlock(); + outFalseBlock = createBlock(); + auto f = getFunc(); + SLANG_ASSERT(f); + if (f) + { + f->addBlock(outTrueBlock); + f->addBlock(outAfterBlock); + f->addBlock(outFalseBlock); + } + auto result = emitIfElse(val, outTrueBlock, outFalseBlock, outAfterBlock); + setInsertInto(outTrueBlock); + return result; + } + IRInst* IRBuilder::emitIf( IRInst* val, IRBlock* trueBlock, @@ -4097,6 +4138,18 @@ namespace Slang return emitIfElse(val, trueBlock, afterBlock, afterBlock); } + IRInst* IRBuilder::emitIfWithBlocks( + IRInst* val, IRBlock*& outTrueBlock, IRBlock*& outAfterBlock) + { + outTrueBlock = createBlock(); + outAfterBlock = createBlock(); + auto result = emitIf(val, outTrueBlock, outAfterBlock); + insertBlock(outTrueBlock); + insertBlock(outAfterBlock); + setInsertInto(outTrueBlock); + return result; + } + IRInst* IRBuilder::emitLoopTest( IRInst* val, IRBlock* bodyBlock, @@ -4320,6 +4373,13 @@ namespace Slang return inst; } + IRInst* IRBuilder::emitLess(IRInst* left, IRInst* right) + { + auto inst = createInst<IRInst>(this, kIROp_Less, getBoolType(), left, right); + addInst(inst); + return inst; + } + IRInst* IRBuilder::emitMul(IRType* type, IRInst* left, IRInst* right) { auto inst = createInst<IRInst>( @@ -5886,6 +5946,13 @@ namespace Slang case kIROp_MakeMatrix: case kIROp_makeArray: case kIROp_makeStruct: + case kIROp_makeString: + case kIROp_getNativeStr: + case kIROp_MakeResultError: + case kIROp_MakeResultValue: + case kIROp_GetResultError: + case kIROp_GetResultValue: + case kIROp_IsResultError: case kIROp_Load: // We are ignoring the possibility of loads from bad addresses, or `volatile` loads case kIROp_ImageSubscript: case kIROp_FieldExtract: |
