summaryrefslogtreecommitdiff
path: root/source/slang/lower-to-ir.cpp
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2017-09-07 10:31:37 -0700
committerGitHub <noreply@github.com>2017-09-07 10:31:37 -0700
commit0e566a63f0bafb7def65521315e9f19a2bc79e34 (patch)
tree470c20f7948693f39b7603645ad9d09fb693c459 /source/slang/lower-to-ir.cpp
parentca16ede67d3fc34ec1cc81b8f835199c5ef1ab9a (diff)
parentced92a047e510480cff15be1a1cd102abffa3f82 (diff)
Merge pull request #177 from tfoleyNV/ir-work
Replace old notion of "intrinsic" operations
Diffstat (limited to 'source/slang/lower-to-ir.cpp')
-rw-r--r--source/slang/lower-to-ir.cpp23
1 files changed, 21 insertions, 2 deletions
diff --git a/source/slang/lower-to-ir.cpp b/source/slang/lower-to-ir.cpp
index d4cac0337..a8acadb59 100644
--- a/source/slang/lower-to-ir.cpp
+++ b/source/slang/lower-to-ir.cpp
@@ -407,7 +407,7 @@ struct ExprLoweringVisitor : ExprVisitor<ExprLoweringVisitor, LoweredValInfo>
LoweredValInfo lowerIntrinsicCall(
InvokeExpr* expr,
- IntrinsicOp intrinsicOp)
+ IROp intrinsicOp)
{
auto type = lowerSimpleType(context, expr->type);
@@ -431,6 +431,24 @@ struct ExprLoweringVisitor : ExprVisitor<ExprLoweringVisitor, LoweredValInfo>
return LoweredValInfo::simple(getBuilder()->emitCallInst(type, getSimpleVal(loweredFunc), argCount, irArgs.Buffer()));
}
+ IROp getIntrinsicOp(
+ Decl* decl,
+ IntrinsicOpModifier* intrinsicOpMod)
+ {
+ if (int(intrinsicOpMod->op) != 0)
+ return intrinsicOpMod->op;
+
+ // No specified modifier? Then we need to look it up
+ // based on the name of the declaration...
+
+ auto name = decl->getName();
+ auto nameText = getText(name);
+
+ IROp op = findIROp(nameText.Buffer());
+ assert(op != kIROp_Invalid);
+ return op;
+ }
+
LoweredValInfo visitInvokeExpr(InvokeExpr* expr)
{
// TODO: need to detect calls to builtins here, so that we can expand
@@ -443,7 +461,8 @@ struct ExprLoweringVisitor : ExprVisitor<ExprLoweringVisitor, LoweredValInfo>
auto funcDecl = funcDeclRef.getDecl();
if(auto intrinsicOpModifier = funcDecl->FindModifier<IntrinsicOpModifier>())
{
- return lowerIntrinsicCall(expr, intrinsicOpModifier->op);
+ auto op = getIntrinsicOp(funcDecl, intrinsicOpModifier);
+ return lowerIntrinsicCall(expr, op);
//
}
// TODO: handle target intrinsic modifier too...