mirror of https://gitee.com/openkylin/qemu.git
softfloat: fix {min, max}nummag for same-abs-value inputs
Before 8936006
("fpu/softfloat: re-factor minmax", 2018-02-21),
we used to return +Zero for maxnummag(-Zero,+Zero); after that
commit, we return -Zero.
Fix it by making {min,max}nummag consistent with {min,max}num,
deferring to the latter when the absolute value of the operands
is the same.
With this fix we now pass fp-test.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Emilio G. Cota <cota@braap.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-id: 20180413140334.26622-2-alex.bennee@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
38e83a71d0
commit
6245327a36
|
@ -1704,7 +1704,6 @@ static FloatParts minmax_floats(FloatParts a, FloatParts b, bool ismin,
|
|||
return pick_nan(a, b, s);
|
||||
} else {
|
||||
int a_exp, b_exp;
|
||||
bool a_sign, b_sign;
|
||||
|
||||
switch (a.cls) {
|
||||
case float_class_normal:
|
||||
|
@ -1735,20 +1734,22 @@ static FloatParts minmax_floats(FloatParts a, FloatParts b, bool ismin,
|
|||
break;
|
||||
}
|
||||
|
||||
a_sign = a.sign;
|
||||
b_sign = b.sign;
|
||||
if (ismag) {
|
||||
a_sign = b_sign = 0;
|
||||
}
|
||||
|
||||
if (a_sign == b_sign) {
|
||||
if (ismag && (a_exp != b_exp || a.frac != b.frac)) {
|
||||
bool a_less = a_exp < b_exp;
|
||||
if (a_exp == b_exp) {
|
||||
a_less = a.frac < b.frac;
|
||||
}
|
||||
return a_sign ^ a_less ^ ismin ? b : a;
|
||||
return a_less ^ ismin ? b : a;
|
||||
}
|
||||
|
||||
if (a.sign == b.sign) {
|
||||
bool a_less = a_exp < b_exp;
|
||||
if (a_exp == b_exp) {
|
||||
a_less = a.frac < b.frac;
|
||||
}
|
||||
return a.sign ^ a_less ^ ismin ? b : a;
|
||||
} else {
|
||||
return a_sign ^ ismin ? b : a;
|
||||
return a.sign ^ ismin ? b : a;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue