summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-03-12 10:32:35 -0700
committerGitHub <noreply@github.com>2024-03-12 10:32:35 -0700
commit1c4e1acdd48779b94c1008ba2456c63975e5fb7d (patch)
tree8e3b870efe4fa9cc8bd7633d5b7f2885fe0568ad /source
parentd8eb701170bf6050718750e6a5e72aa55fb5bd45 (diff)
[SPIRV] Use VectorTimesScalar opcode. (#3737)
* [SPIRV] Use VectorTimesScalar opcode. * Fix.
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-emit-spirv.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp
index 8063975e2..252f0e917 100644
--- a/source/slang/slang-emit-spirv.cpp
+++ b/source/slang/slang-emit-spirv.cpp
@@ -4981,6 +4981,18 @@ struct SPIRVEmitContext
const auto lVec = as<IRVectorType>(l->getDataType());
auto r = operands[1];
const auto rVec = as<IRVectorType>(r->getDataType());
+ if (op == kIROp_Mul && isFloatingPoint)
+ {
+ if (lVec && !rVec)
+ {
+ return emitInst(parent, instToRegister, SpvOpVectorTimesScalar, type, kResultID, operands);
+ }
+ else if (!lVec && rVec)
+ {
+ IRInst* newOperands[2] = { operands[1], operands[0] };
+ return emitInst(parent, instToRegister, SpvOpVectorTimesScalar, type, kResultID, ArrayView<IRInst*>(newOperands, 2));
+ }
+ }
const auto go = [&](const auto l, const auto r) {
return emitInst(parent, instToRegister, opCode, type, kResultID, l, r);
};