mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-11 03:24:58 -06:00
softfloat: Add float_muladd_suppress_add_product_zero
Certain Hexagon instructions suppress changes to the result when the product of fma() is a true zero. Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
72330260cd
commit
82f898f3b6
3 changed files with 11 additions and 1 deletions
|
@ -615,7 +615,9 @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
|
||||||
goto return_normal;
|
goto return_normal;
|
||||||
}
|
}
|
||||||
if (c->cls == float_class_zero) {
|
if (c->cls == float_class_zero) {
|
||||||
if (a->sign != c->sign) {
|
if (flags & float_muladd_suppress_add_product_zero) {
|
||||||
|
a->sign = c->sign;
|
||||||
|
} else if (a->sign != c->sign) {
|
||||||
goto return_sub_zero;
|
goto return_sub_zero;
|
||||||
}
|
}
|
||||||
goto return_zero;
|
goto return_zero;
|
||||||
|
|
|
@ -2274,6 +2274,9 @@ float32_muladd(float32 xa, float32 xb, float32 xc, int flags, float_status *s)
|
||||||
if (unlikely(!can_use_fpu(s))) {
|
if (unlikely(!can_use_fpu(s))) {
|
||||||
goto soft;
|
goto soft;
|
||||||
}
|
}
|
||||||
|
if (unlikely(flags & float_muladd_suppress_add_product_zero)) {
|
||||||
|
goto soft;
|
||||||
|
}
|
||||||
|
|
||||||
float32_input_flush3(&ua.s, &ub.s, &uc.s, s);
|
float32_input_flush3(&ua.s, &ub.s, &uc.s, s);
|
||||||
if (unlikely(!f32_is_zon3(ua, ub, uc))) {
|
if (unlikely(!f32_is_zon3(ua, ub, uc))) {
|
||||||
|
|
|
@ -120,11 +120,16 @@ bfloat16 bfloat16_squash_input_denormal(bfloat16 a, float_status *status);
|
||||||
| Using these differs from negating an input or output before calling
|
| Using these differs from negating an input or output before calling
|
||||||
| the muladd function in that this means that a NaN doesn't have its
|
| the muladd function in that this means that a NaN doesn't have its
|
||||||
| sign bit inverted before it is propagated.
|
| sign bit inverted before it is propagated.
|
||||||
|
|
|
||||||
|
| With float_muladd_suppress_add_product_zero, if A or B is zero
|
||||||
|
| such that the product is a true zero, then return C without addition.
|
||||||
|
| This preserves the sign of C when C is +/- 0. Used for Hexagon.
|
||||||
*----------------------------------------------------------------------------*/
|
*----------------------------------------------------------------------------*/
|
||||||
enum {
|
enum {
|
||||||
float_muladd_negate_c = 1,
|
float_muladd_negate_c = 1,
|
||||||
float_muladd_negate_product = 2,
|
float_muladd_negate_product = 2,
|
||||||
float_muladd_negate_result = 4,
|
float_muladd_negate_result = 4,
|
||||||
|
float_muladd_suppress_add_product_zero = 8,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------
|
/*----------------------------------------------------------------------------
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue