mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-15 23:43:55 +00:00
softfloat: Add flag specific to convert non-nan to int
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-7-richard.henderson@linaro.org> Signed-off-by: Cédric Le Goater <clg@kaod.org>
This commit is contained in:
parent
f8718aab89
commit
81254b02eb
|
@ -1055,7 +1055,7 @@ static int64_t partsN(float_to_sint)(FloatPartsN *p, FloatRoundMode rmode,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case float_class_inf:
|
case float_class_inf:
|
||||||
flags = float_flag_invalid;
|
flags = float_flag_invalid | float_flag_invalid_cvti;
|
||||||
r = p->sign ? min : max;
|
r = p->sign ? min : max;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1077,11 +1077,11 @@ static int64_t partsN(float_to_sint)(FloatPartsN *p, FloatRoundMode rmode,
|
||||||
if (r <= -(uint64_t)min) {
|
if (r <= -(uint64_t)min) {
|
||||||
r = -r;
|
r = -r;
|
||||||
} else {
|
} else {
|
||||||
flags = float_flag_invalid;
|
flags = float_flag_invalid | float_flag_invalid_cvti;
|
||||||
r = min;
|
r = min;
|
||||||
}
|
}
|
||||||
} else if (r > max) {
|
} else if (r > max) {
|
||||||
flags = float_flag_invalid;
|
flags = float_flag_invalid | float_flag_invalid_cvti;
|
||||||
r = max;
|
r = max;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1120,7 +1120,7 @@ static uint64_t partsN(float_to_uint)(FloatPartsN *p, FloatRoundMode rmode,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case float_class_inf:
|
case float_class_inf:
|
||||||
flags = float_flag_invalid;
|
flags = float_flag_invalid | float_flag_invalid_cvti;
|
||||||
r = p->sign ? 0 : max;
|
r = p->sign ? 0 : max;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1138,15 +1138,15 @@ static uint64_t partsN(float_to_uint)(FloatPartsN *p, FloatRoundMode rmode,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->sign) {
|
if (p->sign) {
|
||||||
flags = float_flag_invalid;
|
flags = float_flag_invalid | float_flag_invalid_cvti;
|
||||||
r = 0;
|
r = 0;
|
||||||
} else if (p->exp > DECOMPOSED_BINARY_POINT) {
|
} else if (p->exp > DECOMPOSED_BINARY_POINT) {
|
||||||
flags = float_flag_invalid;
|
flags = float_flag_invalid | float_flag_invalid_cvti;
|
||||||
r = max;
|
r = max;
|
||||||
} else {
|
} else {
|
||||||
r = p->frac_hi >> (DECOMPOSED_BINARY_POINT - p->exp);
|
r = p->frac_hi >> (DECOMPOSED_BINARY_POINT - p->exp);
|
||||||
if (r > max) {
|
if (r > max) {
|
||||||
flags = float_flag_invalid;
|
flags = float_flag_invalid | float_flag_invalid_cvti;
|
||||||
r = max;
|
r = max;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,6 +157,7 @@ enum {
|
||||||
float_flag_invalid_idi = 0x0200, /* inf / inf */
|
float_flag_invalid_idi = 0x0200, /* inf / inf */
|
||||||
float_flag_invalid_zdz = 0x0400, /* 0 / 0 */
|
float_flag_invalid_zdz = 0x0400, /* 0 / 0 */
|
||||||
float_flag_invalid_sqrt = 0x0800, /* sqrt(-x) */
|
float_flag_invalid_sqrt = 0x0800, /* sqrt(-x) */
|
||||||
|
float_flag_invalid_cvti = 0x1000, /* non-nan to integer */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue