summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-05-14 18:01:31 -0700
committerGitHub <noreply@github.com>2024-05-14 18:01:31 -0700
commit4edc72e4dea47cf549b4e28940e3509a5ab61439 (patch)
tree10475236b4a0e1f8a7a0bafdaa05a09d26f9412f /source/slang/slang-emit-c-like.cpp
parentd76bed6c1b03e5d7ef19c947fdd5fcaf33b595f7 (diff)
Remove use of `G0` and `__target_intrinsic` in stdlib. (#4170)
* Remove use of `G0` and `__target_intrinsic` in stdlib. * Fix. * Fix calling intrinsic in global scope.
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
-rw-r--r--source/slang/slang-emit-c-like.cpp25
1 files changed, 15 insertions, 10 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index 19a7930f6..7551f4da9 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -1064,7 +1064,8 @@ String CLikeSourceEmitter::generateName(IRInst* inst)
// that should be emitted as a target intrinsic,
// then use that name instead.
UnownedStringSlice intrinsicDef;
- if(findTargetIntrinsicDefinition(inst, intrinsicDef))
+ IRInst* intrinsicInst = nullptr;
+ if(findTargetIntrinsicDefinition(inst, intrinsicDef, intrinsicInst))
{
return String(intrinsicDef);
}
@@ -1536,7 +1537,8 @@ bool CLikeSourceEmitter::shouldFoldInstIntoUseSites(IRInst* inst)
// parameter. This is not indicated into the call, and can lead to output code computes something multiple
// times as it is folding into the expression of the the target intrinsic, which we don't want.
UnownedStringSlice intrinsicDef;
- if (findTargetIntrinsicDefinition(funcValue, intrinsicDef))
+ IRInst* intrinsicInst;
+ if (findTargetIntrinsicDefinition(funcValue, intrinsicDef, intrinsicInst))
{
// Find the index of the original instruction, to see if it's multiply used.
IRUse* args = callInst->getArgs();
@@ -1854,14 +1856,15 @@ IRTargetIntrinsicDecoration* CLikeSourceEmitter::_findBestTargetIntrinsicDecorat
}
-void CLikeSourceEmitter::emitIntrinsicCallExpr(IRCall* inst, UnownedStringSlice intrinsicDefinition, EmitOpInfo const& inOuterPrec)
+void CLikeSourceEmitter::emitIntrinsicCallExpr(IRCall* inst, UnownedStringSlice intrinsicDefinition, IRInst* intrinsicInst, EmitOpInfo const& inOuterPrec)
{
- emitIntrinsicCallExprImpl(inst, intrinsicDefinition, inOuterPrec);
+ emitIntrinsicCallExprImpl(inst, intrinsicDefinition, intrinsicInst, inOuterPrec);
}
void CLikeSourceEmitter::emitIntrinsicCallExprImpl(
IRCall* inst,
UnownedStringSlice intrinsicDefinition,
+ IRInst* intrinsicInst,
EmitOpInfo const& inOuterPrec)
{
auto outerPrec = inOuterPrec;
@@ -1939,7 +1942,7 @@ void CLikeSourceEmitter::emitIntrinsicCallExprImpl(
else
{
IntrinsicExpandContext context(this);
- context.emit(inst, args, argCount, name);
+ context.emit(inst, args, argCount, name, intrinsicInst);
}
}
@@ -1985,9 +1988,9 @@ void CLikeSourceEmitter::emitComInterfaceCallExpr(IRCall* inst, EmitOpInfo const
maybeCloseParens(needClose);
}
-bool CLikeSourceEmitter::findTargetIntrinsicDefinition(IRInst* callee, UnownedStringSlice& outDefinition)
+bool CLikeSourceEmitter::findTargetIntrinsicDefinition(IRInst* callee, UnownedStringSlice& outDefinition, IRInst*& outInst)
{
- return Slang::findTargetIntrinsicDefinition(callee, getTargetCaps(), outDefinition);
+ return Slang::findTargetIntrinsicDefinition(callee, getTargetCaps(), outDefinition, outInst);
}
void CLikeSourceEmitter::emitCallExpr(IRCall* inst, EmitOpInfo outerPrec)
@@ -2024,8 +2027,9 @@ void CLikeSourceEmitter::emitCallExpr(IRCall* inst, EmitOpInfo outerPrec)
// We want to detect any call to an intrinsic operation,
// that we can emit it directly without mangling, etc.
UnownedStringSlice intrinsicDefinition;
+ IRInst* intrinsicInst;
auto resolvedFunc = getResolvedInstForDecorations(funcValue);
- if (findTargetIntrinsicDefinition(resolvedFunc, intrinsicDefinition))
+ if (findTargetIntrinsicDefinition(resolvedFunc, intrinsicDefinition, intrinsicInst))
{
// Make sure we register all required preludes for emit.
if (auto func = as<IRFunc>(resolvedFunc))
@@ -2043,7 +2047,7 @@ void CLikeSourceEmitter::emitCallExpr(IRCall* inst, EmitOpInfo outerPrec)
}
}
}
- emitIntrinsicCallExpr(inst, intrinsicDefinition, outerPrec);
+ emitIntrinsicCallExpr(inst, intrinsicDefinition, intrinsicInst, outerPrec);
}
else
{
@@ -3529,7 +3533,8 @@ bool CLikeSourceEmitter::isTargetIntrinsic(IRInst* inst)
// target intrinsic for the current compilation target.
//
UnownedStringSlice intrinsicDef;
- return findTargetIntrinsicDefinition(inst, intrinsicDef);
+ IRInst* intrinsicInst;
+ return findTargetIntrinsicDefinition(inst, intrinsicDef, intrinsicInst);
}
bool shouldWrapInExternCBlock(IRFunc* func)