From: Ian Romanick Date: Wed, 4 Mar 2020 03:51:16 +0000 (-0800) Subject: soft-fp64/fadd: Just let the subtraction happen when the result will be zero X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7078105592bf332e1080fbd7049c3a8dd9cde0cc;p=mesa.git soft-fp64/fadd: Just let the subtraction happen when the result will be zero The main purpose of this commit is to prepare for "soft-fp64/fadd: Move common code out of both branches of an if-statement". 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: 815717 -> 815491 (-0.03%) instructions in affected programs: 735489 -> 735263 (-0.03%) helped: 39 HURT: 34 helped stats (abs) min: 2 max: 192 x̄: 20.79 x̃: 12 helped stats (rel) min: 0.01% max: 0.46% x̄: 0.26% x̃: 0.28% HURT stats (abs) min: 1 max: 65 x̄: 17.21 x̃: 11 HURT stats (rel) min: <.01% max: 1.11% x̄: 0.35% x̃: 0.19% 95% mean confidence interval for instructions value: -10.40 4.21 95% mean confidence interval for instructions %-change: -0.07% 0.13% Inconclusive result (value mean confidence interval includes 0). total cycles in shared programs: 6820707 -> 6813681 (-0.10%) cycles in affected programs: 6388725 -> 6381699 (-0.11%) helped: 51 HURT: 23 helped stats (abs) min: 3 max: 1837 x̄: 184.76 x̃: 120 helped stats (rel) min: <.01% max: 0.48% x̄: 0.25% x̃: 0.25% HURT stats (abs) min: 18 max: 216 x̄: 104.22 x̃: 98 HURT stats (rel) min: 0.06% max: 0.73% x̄: 0.31% x̃: 0.11% 95% mean confidence interval for cycles value: -154.67 -35.22 95% mean confidence interval for cycles %-change: -0.15% <.01% Inconclusive result (%-change mean confidence interval includes 0). total spills in shared programs: 702 -> 703 (0.14%) spills in affected programs: 702 -> 703 (0.14%) helped: 0 HURT: 1 total fills in shared programs: 1497 -> 1499 (0.13%) fills in affected programs: 1497 -> 1499 (0.13%) helped: 0 HURT: 1 Reviewed-by: Matt Turner Part-of: --- diff --git a/src/compiler/glsl/float64.glsl b/src/compiler/glsl/float64.glsl index f26d5e29264..ea33cb1f992 100644 --- a/src/compiler/glsl/float64.glsl +++ b/src/compiler/glsl/float64.glsl @@ -777,8 +777,8 @@ __fadd64(uint64_t a, uint64_t b) bExp = mix(bExp, 1, aExp == 0); aExp = mix(aExp, 1, aExp == 0); - uint zFrac0 = 0; - uint zFrac1 = 0; + uint zFrac0; + uint zFrac1; uint sign_of_difference = 0; if (bFracHi < aFracHi) { __sub64(aFracHi, aFracLo, bFracHi, bFracLo, zFrac0, zFrac1); @@ -787,10 +787,11 @@ __fadd64(uint64_t a, uint64_t b) __sub64(bFracHi, bFracLo, aFracHi, aFracLo, zFrac0, zFrac1); sign_of_difference = 0x80000000; } - else if (bFracLo < aFracLo) { + else if (bFracLo <= aFracLo) { + /* It is possible that zFrac0 and zFrac1 may be zero after this. */ __sub64(aFracHi, aFracLo, bFracHi, bFracLo, zFrac0, zFrac1); } - else if (aFracLo < bFracLo) { + else { __sub64(bFracHi, bFracLo, aFracHi, aFracLo, zFrac0, zFrac1); sign_of_difference = 0x80000000; }