From b68516e2c2e39af79dda2ec7871fe4d821ef67c4 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 3 Apr 2023 15:54:16 -0700 Subject: Emit simpler vector element access code. (#2770) * Emit simpler vector element access code * Fix. --------- Co-authored-by: Yong He --- source/slang/slang-emit-cpp.cpp | 56 ++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 15 deletions(-) (limited to 'source/slang/slang-emit-cpp.cpp') diff --git a/source/slang/slang-emit-cpp.cpp b/source/slang/slang-emit-cpp.cpp index a178dfe67..d6764ae06 100644 --- a/source/slang/slang-emit-cpp.cpp +++ b/source/slang/slang-emit-cpp.cpp @@ -1270,13 +1270,26 @@ bool CPPSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOut IRInst* baseInst = getElementInst->getBase(); IRType* baseType = baseInst->getDataType(); - if (as(baseType)) + if (auto vectorBaseType = as(baseType)) { - m_writer->emit("_slang_vector_get_element("); - emitOperand(baseInst, getInfo(EmitOp::General)); - m_writer->emit(", "); - emitOperand(getElementInst->getIndex(), getInfo(EmitOp::General)); - m_writer->emit(")"); + if (auto intLitIndex = as(getElementInst->getIndex())) + { + // For static index, we can emit simpler code using the `.x`, `.y` members. + auto outerPrec = getInfo(EmitOp::General); + auto prec = getInfo(EmitOp::Postfix); + emitOperand(baseInst, leftSide(outerPrec, prec)); + m_writer->emit("."); + m_writer->emit(getVectorElementNames(vectorBaseType)[intLitIndex->getValue()]); + } + else + { + // For dynamic index, we emit using `_slang_vector_get_element` intrinsics. + m_writer->emit("_slang_vector_get_element("); + emitOperand(baseInst, getInfo(EmitOp::General)); + m_writer->emit(", "); + emitOperand(getElementInst->getIndex(), getInfo(EmitOp::General)); + m_writer->emit(")"); + } return true; } else if (as(baseType)) @@ -1297,24 +1310,37 @@ bool CPPSourceEmitter::tryEmitInstExprImpl(IRInst* inst, const EmitOpInfo& inOut IRInst* baseInst = getElementInst->getBase(); IRType* baseType = as(baseInst->getDataType())->getValueType(); - if (as(baseType)) + if (auto vectorBaseType = as(baseType)) { - m_writer->emit("_slang_vector_get_element_ptr("); - emitOperand(baseInst, getInfo(EmitOp::General)); - m_writer->emit(", "); - emitOperand(getElementInst->getIndex(), getInfo(EmitOp::General)); - m_writer->emit(")"); + if (auto intLitIndex = as(getElementInst->getIndex())) + { + // For static index, we can emit simpler code using the `.x`, `.y` members. + m_writer->emit("&("); + auto outerPrec = getInfo(EmitOp::General); + auto prec = getInfo(EmitOp::Postfix); + emitOperand(baseInst, leftSide(outerPrec, prec)); + m_writer->emit("->"); + m_writer->emit(getVectorElementNames(vectorBaseType)[intLitIndex->getValue()]); + m_writer->emit(")"); + } + else + { + m_writer->emit("_slang_vector_get_element_ptr("); + emitOperand(baseInst, getInfo(EmitOp::General)); + m_writer->emit(", "); + emitOperand(getElementInst->getIndex(), getInfo(EmitOp::General)); + m_writer->emit(")"); + } return true; } else if (as(baseType)) { - m_writer->emit("&("); + m_writer->emit("("); auto outerPrec = getInfo(EmitOp::General); auto prec = getInfo(EmitOp::Postfix); emitOperand(baseInst, leftSide(outerPrec, prec)); - m_writer->emit("->rows["); + m_writer->emit("->rows + "); emitOperand(getElementInst->getIndex(), getInfo(EmitOp::General)); - m_writer->emit("]"); m_writer->emit(")"); return true; } -- cgit v1.2.3