mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
fpu: Add float64_to_int{32,64}_modulo
Add versions of float64_to_int* which do not saturate the result. Reviewed-by: Christoph Muellner <christoph.muellner@vrull.eu> Tested-by: Christoph Muellner <christoph.muellner@vrull.eu> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20230527141910.1885950-2-richard.henderson@linaro.org>
This commit is contained in:
parent
e665cf72fe
commit
e2041f4d5d
3 changed files with 112 additions and 0 deletions
|
@ -852,11 +852,24 @@ static uint64_t parts128_float_to_uint(FloatParts128 *p, FloatRoundMode rmode,
|
|||
#define parts_float_to_uint(P, R, Z, M, S) \
|
||||
PARTS_GENERIC_64_128(float_to_uint, P)(P, R, Z, M, S)
|
||||
|
||||
static int64_t parts64_float_to_sint_modulo(FloatParts64 *p,
|
||||
FloatRoundMode rmode,
|
||||
int bitsm1, float_status *s);
|
||||
static int64_t parts128_float_to_sint_modulo(FloatParts128 *p,
|
||||
FloatRoundMode rmode,
|
||||
int bitsm1, float_status *s);
|
||||
|
||||
#define parts_float_to_sint_modulo(P, R, M, S) \
|
||||
PARTS_GENERIC_64_128(float_to_sint_modulo, P)(P, R, M, S)
|
||||
|
||||
static void parts64_sint_to_float(FloatParts64 *p, int64_t a,
|
||||
int scale, float_status *s);
|
||||
static void parts128_sint_to_float(FloatParts128 *p, int64_t a,
|
||||
int scale, float_status *s);
|
||||
|
||||
#define parts_float_to_sint(P, R, Z, MN, MX, S) \
|
||||
PARTS_GENERIC_64_128(float_to_sint, P)(P, R, Z, MN, MX, S)
|
||||
|
||||
#define parts_sint_to_float(P, I, Z, S) \
|
||||
PARTS_GENERIC_64_128(sint_to_float, P)(P, I, Z, S)
|
||||
|
||||
|
@ -3409,6 +3422,24 @@ int64_t bfloat16_to_int64_round_to_zero(bfloat16 a, float_status *s)
|
|||
return bfloat16_to_int64_scalbn(a, float_round_to_zero, 0, s);
|
||||
}
|
||||
|
||||
int32_t float64_to_int32_modulo(float64 a, FloatRoundMode rmode,
|
||||
float_status *s)
|
||||
{
|
||||
FloatParts64 p;
|
||||
|
||||
float64_unpack_canonical(&p, a, s);
|
||||
return parts_float_to_sint_modulo(&p, rmode, 31, s);
|
||||
}
|
||||
|
||||
int64_t float64_to_int64_modulo(float64 a, FloatRoundMode rmode,
|
||||
float_status *s)
|
||||
{
|
||||
FloatParts64 p;
|
||||
|
||||
float64_unpack_canonical(&p, a, s);
|
||||
return parts_float_to_sint_modulo(&p, rmode, 63, s);
|
||||
}
|
||||
|
||||
/*
|
||||
* Floating-point to unsigned integer conversions
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue