summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-06-21 14:55:59 -0700
committerGitHub <noreply@github.com>2022-06-21 14:55:59 -0700
commite5a75563a1ba2e378353af8b937b8b7bb0fe2c2b (patch)
tree0f31040b408a66f49dc5cd2354c8424e5ff2e279 /source/slang/slang-ir.cpp
parentea3800e115d4ad1ce06ec07689152616f47a0e3d (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.cpp67
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: