summaryrefslogtreecommitdiff
path: root/source/slang/slang-hlsl-intrinsic-set.cpp
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-02-04 15:19:48 -0500
committerGitHub <noreply@github.com>2020-02-04 15:19:48 -0500
commit17c6c6044965629a3ae7e8ef004cc0b2ca657c55 (patch)
tree5b78004808354b32d09ba13c0ec4e32a44f345ab /source/slang/slang-hlsl-intrinsic-set.cpp
parentb415760d7f166eaad7fa27daa09edc9a8964c37e (diff)
CUDA/C++ backend improvements (#1198)
* WIP with vector float test. * vector-float test working. * Fixed remaing tests broken with init changes. * Improve 64bit-type-support.md * Disable tests broken on CI system for Dx. * WIP: Make type available for comparison. * Moved type conversion into TypeTextUtil. * Add text/type conversions from DownstreamCompiler to TypeTextUtil. * Allow compaison taking into account type. * Removed quantize in vector-float.slang test.
Diffstat (limited to 'source/slang/slang-hlsl-intrinsic-set.cpp')
-rw-r--r--source/slang/slang-hlsl-intrinsic-set.cpp34
1 files changed, 30 insertions, 4 deletions
diff --git a/source/slang/slang-hlsl-intrinsic-set.cpp b/source/slang/slang-hlsl-intrinsic-set.cpp
index 1f42836f3..7500e799a 100644
--- a/source/slang/slang-hlsl-intrinsic-set.cpp
+++ b/source/slang/slang-hlsl-intrinsic-set.cpp
@@ -245,19 +245,37 @@ SlangResult HLSLIntrinsicSet::makeIntrinsic(IRInst* inst, HLSLIntrinsic& out)
// If it's constructed from a type conversion
calcIntrinsic(Op::ConstructConvert, inst, out);
}
+ return SLANG_OK;
}
else
{
- // We only emit as if it has one operand, but we can tell how many it actually has from the return type
- calcIntrinsic(Op::Init, inst, 1, out);
+ // If we are constructing a basic type, we don't need an Op::Init
+ if (!IRBasicType::isaImpl(dstType->op))
+ {
+ // Emit the 'init' intrinsic
+ calcIntrinsic(Op::Init, inst, inst->getOperandCount(), out);
+ return SLANG_OK;
+ }
}
- return SLANG_OK;
+ return SLANG_FAIL;
}
case kIROp_makeVector:
+ {
+ if (inst->getOperandCount() == 1 && as<IRBasicType>(inst->getOperand(0)->getDataType()))
+ {
+ // This is make from scalar
+ calcIntrinsic(Op::ConstructFromScalar, inst, out);
+ }
+ else
+ {
+ calcIntrinsic(Op::Init, inst, inst->getOperandCount(), out);
+ }
+ return SLANG_OK;
+ }
case kIROp_MakeMatrix:
{
// We only emit as if it has one operand, but we can tell how many it actually has from the return type
- calcIntrinsic(Op::Init, inst, 1, out);
+ calcIntrinsic(Op::Init, inst, inst->getOperandCount(), out);
return SLANG_OK;
}
case kIROp_swizzle:
@@ -346,6 +364,14 @@ SlangResult HLSLIntrinsicSet::makeIntrinsic(IRInst* inst, HLSLIntrinsic& out)
return SLANG_FAIL;
}
+void HLSLIntrinsicSet::getIntrinsics(List<const HLSLIntrinsic*>& out) const
+{
+ for (auto& pair : m_intrinsics)
+ {
+ out.add(pair.Value);
+ }
+}
+
HLSLIntrinsic* HLSLIntrinsicSet::add(const HLSLIntrinsic& intrinsic)
{
// Make sure it's valid(!)