summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-06-12 13:48:40 -0700
committerGitHub <noreply@github.com>2024-06-12 13:48:40 -0700
commit085d1a603eac69f66b5357276ea07d1978832030 (patch)
tree6137f0fb92e86efbf60b8e0641eb51508338e103 /source/slang/slang-emit-c-like.cpp
parent8813c610562b1c30222ec3ef0734ef601d43b617 (diff)
Fix emit logic for getElementPtr. (#4362)
* Fix emit logic for getElementPtr. * Legalize `getElementPtr(vector, id)` for metal. * Fix compiler error. * Fix warnings. * Fix test. * Fix.
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
-rw-r--r--source/slang/slang-emit-c-like.cpp60
1 files changed, 56 insertions, 4 deletions
diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp
index 6412ff730..81b68038e 100644
--- a/source/slang/slang-emit-c-like.cpp
+++ b/source/slang/slang-emit-c-like.cpp
@@ -1689,6 +1689,61 @@ void CLikeSourceEmitter::emitDereferenceOperand(IRInst* inst, EmitOpInfo const&
maybeCloseParens(innerNeedClose);
return;
}
+ case kIROp_GetElementPtr:
+ {
+ const auto info = getInfo(EmitOp::Prefix);
+ IRVectorType* vectorType = nullptr;
+ if (auto ptrType = as<IRPtrTypeBase>(inst->getOperand(0)->getDataType()))
+ {
+ vectorType = as<IRVectorType>(ptrType->getValueType());
+ }
+ if (vectorType)
+ {
+ // Can't use simplified emit logic for get vector element operations on CUDA targets.
+ if (isCUDATarget(m_codeGenContext->getTargetReq()))
+ break;
+ }
+
+ auto rightSidePrec = rightSide(outerPrec, info);
+ auto postfixInfo = getInfo(EmitOp::Postfix);
+ bool rightSideNeedClose = maybeEmitParens(rightSidePrec, postfixInfo);
+ emitDereferenceOperand(inst->getOperand(0), leftSide(rightSidePrec, postfixInfo));
+ bool emitBracketPostfix = true;
+ if (vectorType)
+ {
+ // Simplify the emitted code if we are referencing a known vector element.
+ if (auto intLit = as<IRIntLit>(inst->getOperand(1)))
+ {
+ emitBracketPostfix = false;
+ switch (intLit->getValue())
+ {
+ case 0:
+ m_writer->emit(".x");
+ break;
+ case 1:
+ m_writer->emit(".y");
+ break;
+ case 2:
+ m_writer->emit(".z");
+ break;
+ case 3:
+ m_writer->emit(".w");
+ break;
+ default:
+ emitBracketPostfix = true;
+ break;
+ }
+ }
+ }
+ if (emitBracketPostfix)
+ {
+ m_writer->emit("[");
+ emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
+ m_writer->emit("]");
+ }
+ maybeCloseParens(rightSideNeedClose);
+ return;
+ }
default:
break;
}
@@ -2538,10 +2593,7 @@ void CLikeSourceEmitter::defaultEmitInstExpr(IRInst* inst, const EmitOpInfo& inO
auto rightSidePrec = rightSide(outerPrec, info);
auto postfixInfo = getInfo(EmitOp::Postfix);
bool rightSideNeedClose = maybeEmitParens(rightSidePrec, postfixInfo);
- if (isPtrToArrayType(inst->getOperand(0)->getDataType()))
- emitDereferenceOperand(inst->getOperand(0), leftSide(rightSidePrec, postfixInfo));
- else
- emitOperand(inst->getOperand(0), leftSide(rightSidePrec, postfixInfo));
+ emitDereferenceOperand(inst->getOperand(0), leftSide(rightSidePrec, postfixInfo));
m_writer->emit("[");
emitOperand(inst->getOperand(1), getInfo(EmitOp::General));
m_writer->emit("]");