Reactor: Fix Frac generic code generation

This commit fixes `Frac(Float)` and `Frac(Float4)` generic LLVM code
generation.

See also: https://bugs.chromium.org/p/swiftshader/issues/detail?id=74

Bug: b/115344057
Test: functional.shaders.builtin_functions.precision.fract.highp_vertex
Test: functional.shaders.builtin_functions.precision.fract.highp_fragment
Change-Id: I027b7ab44ba3060dc100a220ba19e5275f41d4c9
Reviewed-on: https://swiftshader-review.googlesource.com/20933
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Chris Forbes <chrisforbes@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index cfecb4f..a69c794 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -6288,10 +6288,14 @@
 			return x - x86::floorss(x);
 		}
 		else
-#endif
 		{
 			return Float4(Frac(Float4(x))).x;
 		}
+#else
+		// x - floor(x) can be 1.0 for very small negative x.
+		// Clamp against the value just below 1.0.
+		return Min(x - Floor(x), As<Float>(Int(0x3F7FFFFF)));
+#endif
 	}
 
 	RValue<Float> Floor(RValue<Float> x)
@@ -6757,12 +6761,14 @@
 			frc = x - Floor(x);
 		}
 		else
-#endif
 		{
 			frc = x - Float4(Int4(x));   // Signed fractional part.
 
 			frc += As<Float4>(As<Int4>(CmpNLE(Float4(0.0f), frc)) & As<Int4>(Float4(1.0f)));   // Add 1.0 if negative.
 		}
+#else
+		frc = x - Floor(x);
+#endif
 
 		// x - floor(x) can be 1.0 for very small negative x.
 		// Clamp against the value just below 1.0.