diff options
| author | Tim Foley <tfoleyNV@users.noreply.github.com> | 2017-09-07 10:31:37 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2017-09-07 10:31:37 -0700 |
| commit | 0e566a63f0bafb7def65521315e9f19a2bc79e34 (patch) | |
| tree | 470c20f7948693f39b7603645ad9d09fb693c459 /source/slang/lower-to-ir.cpp | |
| parent | ca16ede67d3fc34ec1cc81b8f835199c5ef1ab9a (diff) | |
| parent | ced92a047e510480cff15be1a1cd102abffa3f82 (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.cpp | 23 |
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... |
