Skip to content

Commit

Permalink
softfloat: fix {min, max}nummag for same-abs-value inputs
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Emilio G. Cota <[email protected]>
Signed-off-by: Alex Bennée <[email protected]>
Message-id: [email protected]
Signed-off-by: Peter Maydell <[email protected]>
  • Loading branch information
cota authored and pm215 committed Apr 13, 2018
1 parent 38e83a7 commit 6245327
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions fpu/softfloat.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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 (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_less ^ ismin ? b : a;
}

if (a_sign == b_sign) {
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;
return a.sign ^ a_less ^ ismin ? b : a;
} else {
return a_sign ^ ismin ? b : a;
return a.sign ^ ismin ? b : a;
}
}
}
Expand Down

0 comments on commit 6245327

Please sign in to comment.