diff options
| author | Yong He <yonghe@outlook.com> | 2024-05-14 18:01:31 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-14 18:01:31 -0700 |
| commit | 4edc72e4dea47cf549b4e28940e3509a5ab61439 (patch) | |
| tree | 10475236b4a0e1f8a7a0bafdaa05a09d26f9412f /source/slang/slang-emit-c-like.cpp | |
| parent | d76bed6c1b03e5d7ef19c947fdd5fcaf33b595f7 (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.cpp | 25 |
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) |
