Optimize Frexp() zero handling Use of the zeroSign variable was eliminated by observing that we already obtained the sign bit but cleared it when isNotZero is false, which can be avoided by instead inserting the exponent for 0.5f only when the argument is not zero. Bug: b/243791551 Change-Id: I993cb41a94994a3033b08146f59660651380e716 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/67888 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Pipeline/ShaderCore.cpp b/src/Pipeline/ShaderCore.cpp index 66eaf79..8e42292 100644 --- a/src/Pipeline/ShaderCore.cpp +++ b/src/Pipeline/ShaderCore.cpp
@@ -518,8 +518,7 @@ // Assumes IEEE 754 auto isNotZero = CmpNEQ(val, 0.0f); auto v = As<SIMD::Int>(val); - auto zeroSign = v & 0x80000000 & ~isNotZero; - auto significand = As<SIMD::Float>((((v & 0x807FFFFF) | 0x3F000000) & isNotZero) | zeroSign); + auto significand = As<SIMD::Float>((v & 0x807FFFFF) | (0x3F000000 & isNotZero)); auto exponent = Exponent(val) & isNotZero;