Protect against DBZ in OpUMod also
Bug: b/127962486
Test: dEQP-VK.glsl.operator.binary_operator.mod.*
Change-Id: I6aee79c99b50f936512e9d9b4b51a07006445694
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/27208
Tested-by: Chris Forbes <chrisforbes@google.com>
Presubmit-Ready: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Ben Clayton <bclayton@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 86394ae..b27f061 100644
--- a/src/Pipeline/SpirvShader.cpp
+++ b/src/Pipeline/SpirvShader.cpp
@@ -1566,8 +1566,11 @@
break;
}
case spv::OpUMod:
- dst.emplace(i, lhs.UInt(i) % rhs.UInt(i));
+ {
+ auto zeroMask = As<SIMD::UInt>(CmpEQ(rhs.Int(i), SIMD::Int(0)));
+ dst.emplace(i, lhs.UInt(i) % (rhs.UInt(i) | zeroMask));
break;
+ }
case spv::OpIEqual:
case spv::OpLogicalEqual:
dst.emplace(i, CmpEQ(lhs.Int(i), rhs.Int(i)));