soft-fp64: Pick a single idiom for treating sign value as a Boolean
authorIan Romanick <ian.d.romanick@intel.com>
Tue, 3 Mar 2020 00:33:16 +0000 (16:33 -0800)
committerMarge Bot <eric+marge@anholt.net>
Wed, 18 Mar 2020 20:36:29 +0000 (20:36 +0000)
Replace all of the bool(qSign) with qSign != 0u.  Remove unnecessary
parenthesis from around most of the existing qSign != 0u.

This dramatically simplifies the next commit.

Results on the 308 shaders extracted from the fp64 portion of the OpenGL
CTS:

Tiger Lake and Ice Lake had similar results. (Tiger Lake shown)
total instructions in shared programs: 848109 -> 848106 (<.01%)
instructions in affected programs: 53 -> 50 (-5.66%)
helped: 1
HURT: 0

total cycles in shared programs: 6969145 -> 6969125 (<.01%)
cycles in affected programs: 396 -> 376 (-5.05%)
helped: 1
HURT: 0

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4142>

src/compiler/glsl/float64.glsl

index f5dee00ae2bea7c2798131b43e5a129e22df0942..bc39be2aa50d007bcf275215b4de1df006e02e1e 100644 (file)
@@ -492,7 +492,7 @@ __roundAndPackUInt64(uint zSign, uint zFrac0, uint zFrac1, uint zFrac2)
          zFrac1 &= ~(1u) + uint(zFrac2 == 0u) & uint(roundNearestEven);
    }
    return mix(packUint2x32(uvec2(zFrac1, zFrac0)), default_nan,
-              (zSign !=0u && (zFrac0 | zFrac1) != 0u));
+              (zSign != 0u && (zFrac0 | zFrac1) != 0u));
 }
 
 int64_t
@@ -526,9 +526,9 @@ __roundAndPackInt64(uint zSign, uint zFrac0, uint zFrac1, uint zFrac2)
 
    int64_t absZ = mix(int64_t(packUint2x32(uvec2(zFrac1, zFrac0))),
                       -int64_t(packUint2x32(uvec2(zFrac1, zFrac0))),
-                      (zSign != 0u));
-   int64_t nan = mix(default_PosNaN, default_NegNaN, bool(zSign));
-   return mix(absZ, nan, bool(zSign ^ uint(absZ < 0)) && bool(absZ));
+                      zSign != 0u);
+   int64_t nan = mix(default_PosNaN, default_NegNaN, zSign != 0u);
+   return mix(absZ, nan, ((zSign != 0u) != (absZ < 0)) && bool(absZ));
 }
 
 /* Returns the number of leading 0 bits before the most-significant 1 bit of
@@ -908,13 +908,13 @@ __fp64_to_uint(uint64_t a)
       __shift64RightJamming(aFracHi, aFracLo, shiftDist, aFracHi, aFracLo);
 
    if ((aFracHi & 0xFFFFF000u) != 0u)
-      return mix(~0u, 0u, (aSign != 0u));
+      return mix(~0u, 0u, aSign != 0u);
 
    uint z = 0u;
    uint zero = 0u;
    __shift64Right(aFracHi, aFracLo, 12, zero, z);
 
-   uint expt = mix(~0u, 0u, (aSign != 0u));
+   uint expt = mix(~0u, 0u, aSign != 0u);
 
    return mix(z, expt, (aSign != 0u) && (z != 0u));
 }
@@ -1117,7 +1117,7 @@ __fp64_to_int(uint64_t a)
       if (0x41E < aExp) {
          if ((aExp == 0x7FF) && bool(aFracHi | aFracLo))
             aSign = 0u;
-         return mix(0x7FFFFFFF, 0x80000000, bool(aSign));
+         return mix(0x7FFFFFFF, 0x80000000, aSign != 0u);
       }
       __shortShift64Left(aFracHi | 0x00100000u, aFracLo, shiftCount, absZ, aFracExtra);
    } else {
@@ -1129,9 +1129,9 @@ __fp64_to_int(uint64_t a)
       absZ = aFracHi >> (- shiftCount);
    }
 
-   int z = mix(int(absZ), -int(absZ), (aSign != 0u));
-   int nan = mix(0x7FFFFFFF, 0x80000000, bool(aSign));
-   return mix(z, nan, bool(aSign ^ uint(z < 0)) && bool(z));
+   int z = mix(int(absZ), -int(absZ), aSign != 0u);
+   int nan = mix(0x7FFFFFFF, 0x80000000, aSign != 0u);
+   return mix(z, nan, ((aSign != 0u) != (z < 0)) && bool(z));
 }
 
 /* Returns the result of converting the 32-bit two's complement integer `a'