Add support for OpFMod
Bug: b/126873455
Test: dEQP-VK.glsl.operator.common_functions.mod.*
Change-Id: I7f261e7bd4dda72b18594cd7e2ee7044bc60466b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/27369
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
diff --git a/src/Pipeline/SpirvShader.cpp b/src/Pipeline/SpirvShader.cpp
index cb7645d..5d85906 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -329,6 +329,7 @@
case spv::OpFSub:
case spv::OpFMul:
case spv::OpFDiv:
+ case spv::OpFMod:
case spv::OpFOrdEqual:
case spv::OpFUnordEqual:
case spv::OpFOrdNotEqual:
@@ -1139,6 +1140,7 @@
case spv::OpFSub:
case spv::OpFMul:
case spv::OpFDiv:
+ case spv::OpFMod:
case spv::OpFOrdEqual:
case spv::OpFUnordEqual:
case spv::OpFOrdNotEqual:
@@ -1764,6 +1766,10 @@
case spv::OpFDiv:
dst.emplace(i, lhs.Float(i) / rhs.Float(i));
break;
+ case spv::OpFMod:
+ // TODO(b/126873455): inaccurate for values greater than 2^24
+ dst.emplace(i, lhs.Float(i) - rhs.Float(i) * Floor(lhs.Float(i) / rhs.Float(i)));
+ break;
case spv::OpFOrdEqual:
dst.emplace(i, CmpEQ(lhs.Float(i), rhs.Float(i)));
break;