softfloat: Add flag specific to Inf * 0
PowerPC has this flag, and it's easier to compute it here than after the fact. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20211119160502.17432-4-richard.henderson@linaro.org> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
ba11446c40
commit
bead3c9b0f
@ -423,7 +423,7 @@ static FloatPartsN *partsN(mul)(FloatPartsN *a, FloatPartsN *b,
|
|||||||
|
|
||||||
/* Inf * Zero == NaN */
|
/* Inf * Zero == NaN */
|
||||||
if (unlikely(ab_mask == float_cmask_infzero)) {
|
if (unlikely(ab_mask == float_cmask_infzero)) {
|
||||||
float_raise(float_flag_invalid, s);
|
float_raise(float_flag_invalid | float_flag_invalid_imz, s);
|
||||||
parts_default_nan(a, s);
|
parts_default_nan(a, s);
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
@ -489,6 +489,7 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, FloatPartsN *b,
|
|||||||
|
|
||||||
if (unlikely(ab_mask != float_cmask_normal)) {
|
if (unlikely(ab_mask != float_cmask_normal)) {
|
||||||
if (unlikely(ab_mask == float_cmask_infzero)) {
|
if (unlikely(ab_mask == float_cmask_infzero)) {
|
||||||
|
float_raise(float_flag_invalid | float_flag_invalid_imz, s);
|
||||||
goto d_nan;
|
goto d_nan;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -567,7 +568,6 @@ static FloatPartsN *partsN(muladd)(FloatPartsN *a, FloatPartsN *b,
|
|||||||
goto finish_sign;
|
goto finish_sign;
|
||||||
|
|
||||||
d_nan:
|
d_nan:
|
||||||
float_raise(float_flag_invalid, s);
|
|
||||||
parts_default_nan(a, s);
|
parts_default_nan(a, s);
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
@ -506,7 +506,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
|
|||||||
* the default NaN
|
* the default NaN
|
||||||
*/
|
*/
|
||||||
if (infzero && is_qnan(c_cls)) {
|
if (infzero && is_qnan(c_cls)) {
|
||||||
float_raise(float_flag_invalid, status);
|
float_raise(float_flag_invalid | float_flag_invalid_imz, status);
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,7 +533,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
|
|||||||
* case sets InvalidOp and returns the default NaN
|
* case sets InvalidOp and returns the default NaN
|
||||||
*/
|
*/
|
||||||
if (infzero) {
|
if (infzero) {
|
||||||
float_raise(float_flag_invalid, status);
|
float_raise(float_flag_invalid | float_flag_invalid_imz, status);
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
/* Prefer sNaN over qNaN, in the a, b, c order. */
|
/* Prefer sNaN over qNaN, in the a, b, c order. */
|
||||||
@ -556,7 +556,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
|
|||||||
* case sets InvalidOp and returns the input value 'c'
|
* case sets InvalidOp and returns the input value 'c'
|
||||||
*/
|
*/
|
||||||
if (infzero) {
|
if (infzero) {
|
||||||
float_raise(float_flag_invalid, status);
|
float_raise(float_flag_invalid | float_flag_invalid_imz, status);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
/* Prefer sNaN over qNaN, in the c, a, b order. */
|
/* Prefer sNaN over qNaN, in the c, a, b order. */
|
||||||
@ -580,7 +580,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
|
|||||||
* a default NaN
|
* a default NaN
|
||||||
*/
|
*/
|
||||||
if (infzero) {
|
if (infzero) {
|
||||||
float_raise(float_flag_invalid, status);
|
float_raise(float_flag_invalid | float_flag_invalid_imz, status);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,7 +597,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
|
|||||||
#elif defined(TARGET_RISCV)
|
#elif defined(TARGET_RISCV)
|
||||||
/* For RISC-V, InvalidOp is set when multiplicands are Inf and zero */
|
/* For RISC-V, InvalidOp is set when multiplicands are Inf and zero */
|
||||||
if (infzero) {
|
if (infzero) {
|
||||||
float_raise(float_flag_invalid, status);
|
float_raise(float_flag_invalid | float_flag_invalid_imz, status);
|
||||||
}
|
}
|
||||||
return 3; /* default NaN */
|
return 3; /* default NaN */
|
||||||
#elif defined(TARGET_XTENSA)
|
#elif defined(TARGET_XTENSA)
|
||||||
@ -606,7 +606,7 @@ static int pickNaNMulAdd(FloatClass a_cls, FloatClass b_cls, FloatClass c_cls,
|
|||||||
* an input NaN if we have one (ie c).
|
* an input NaN if we have one (ie c).
|
||||||
*/
|
*/
|
||||||
if (infzero) {
|
if (infzero) {
|
||||||
float_raise(float_flag_invalid, status);
|
float_raise(float_flag_invalid | float_flag_invalid_imz, status);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
if (status->use_first_nan) {
|
if (status->use_first_nan) {
|
||||||
|
@ -153,6 +153,7 @@ enum {
|
|||||||
float_flag_input_denormal = 0x0020,
|
float_flag_input_denormal = 0x0020,
|
||||||
float_flag_output_denormal = 0x0040,
|
float_flag_output_denormal = 0x0040,
|
||||||
float_flag_invalid_isi = 0x0080, /* inf - inf */
|
float_flag_invalid_isi = 0x0080, /* inf - inf */
|
||||||
|
float_flag_invalid_imz = 0x0100, /* inf * 0 */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user