diff options
| author | Yong He <yonghe@outlook.com> | 2024-06-12 13:48:40 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-06-12 13:48:40 -0700 |
| commit | 085d1a603eac69f66b5357276ea07d1978832030 (patch) | |
| tree | 6137f0fb92e86efbf60b8e0641eb51508338e103 /source/slang/slang-emit-c-like.cpp | |
| parent | 8813c610562b1c30222ec3ef0734ef601d43b617 (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.cpp | 60 |
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("]"); |
