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;