From e5a75563a1ba2e378353af8b937b8b7bb0fe2c2b Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 21 Jun 2022 14:55:59 -0700 Subject: Lower throwing COM interface method. (#2282) * Lower throwing COM interface method. * Fix. * Fix warnings. Co-authored-by: Yong He --- source/slang/slang-ir.cpp | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'source/slang/slang-ir.cpp') 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 argList; + argList.add(block); + for (Int i = 0; i < argCount; ++i) + argList.add(args[i]); + auto inst = + createInst(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(this, kIROp_Less, getBoolType(), left, right); + addInst(inst); + return inst; + } + IRInst* IRBuilder::emitMul(IRType* type, IRInst* left, IRInst* right) { auto inst = createInst( @@ -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: -- cgit v1.2.3