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 <mattst88@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4142>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user