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.