mirror of https://github.com/proxmox/mirror_qemu
fpu/softfloat: check for Inf / x or 0 / x before /0
The re-factoring of div_floats changed the order of checking meaning an operation like -inf/0 erroneously raises the divbyzero flag. IEEE-754 (2008) specifies this should only occur for operations on finite operands. We fix this by moving the check on the dividend being Inf/0 to before the divisor is zero check. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20180416135442.30606-1-alex.bennee@linaro.org Cc: Bastian Koppelmann <kbastian@mail.uni-paderborn.de> Reviewed-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de> Tested-by: Bastian Koppelmann <kbastian@mail.uni-paderborn.de> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>master
parent
2a6b5372d7
commit
9cb4e398c2
|
@ -1146,6 +1146,11 @@ static FloatParts div_floats(FloatParts a, FloatParts b, float_status *s)
|
||||||
a.cls = float_class_dnan;
|
a.cls = float_class_dnan;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
/* Inf / x or 0 / x */
|
||||||
|
if (a.cls == float_class_inf || a.cls == float_class_zero) {
|
||||||
|
a.sign = sign;
|
||||||
|
return a;
|
||||||
|
}
|
||||||
/* Div 0 => Inf */
|
/* Div 0 => Inf */
|
||||||
if (b.cls == float_class_zero) {
|
if (b.cls == float_class_zero) {
|
||||||
s->float_exception_flags |= float_flag_divbyzero;
|
s->float_exception_flags |= float_flag_divbyzero;
|
||||||
|
@ -1153,11 +1158,6 @@ static FloatParts div_floats(FloatParts a, FloatParts b, float_status *s)
|
||||||
a.sign = sign;
|
a.sign = sign;
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
/* Inf / x or 0 / x */
|
|
||||||
if (a.cls == float_class_inf || a.cls == float_class_zero) {
|
|
||||||
a.sign = sign;
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
/* Div by Inf */
|
/* Div by Inf */
|
||||||
if (b.cls == float_class_inf) {
|
if (b.cls == float_class_inf) {
|
||||||
a.cls = float_class_zero;
|
a.cls = float_class_zero;
|
||||||
|
|
Loading…
Reference in New Issue