mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:46:10 +00:00
fpu: Restrict parts_round_to_int_normal to target precision
Currently parts_round_to_int_normal() assumes that its input has just been unpacked and therefore doesn't expect non-zero fraction bits past target precision. The upcoming DIVIDE TO INTEGER use cases needs it to support calculations on intermediate values that utilize all fraction bits, while at the same time restricting the result's precision to frac_size. Delete the "All integral" check, because even though really large values are always integer, their low fraction bits still need to be truncated. For the same reason, make sure rnd_mask covers at least fraction bits past target precision. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Message-ID: <20260210214044.1174699-4-iii@linux.ibm.com> Signed-off-by: Thomas Huth <thuth@redhat.com>
This commit is contained in:
committed by
Thomas Huth
parent
f5682b9dee
commit
b4a85d8fe7
@@ -1118,11 +1118,6 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
|
||||
return true;
|
||||
}
|
||||
|
||||
if (a->exp >= frac_size) {
|
||||
/* All integral */
|
||||
return false;
|
||||
}
|
||||
|
||||
if (N > 64 && a->exp < N - 64) {
|
||||
/*
|
||||
* Rounding is not in the low word -- shift lsb to bit 2,
|
||||
@@ -1132,8 +1127,13 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
|
||||
frac_shrjam(a, shift_adj);
|
||||
frac_lsb = 1 << 2;
|
||||
} else {
|
||||
/*
|
||||
* Rounding is in the low word -- compute the lsb offset for rounding
|
||||
* and for clamping to the target precision, then map it to an offset
|
||||
* within frac_lo.
|
||||
*/
|
||||
shift_adj = 0;
|
||||
frac_lsb = DECOMPOSED_IMPLICIT_BIT >> (a->exp & 63);
|
||||
frac_lsb = DECOMPOSED_IMPLICIT_BIT >> (MIN(a->exp, frac_size) & 63);
|
||||
}
|
||||
|
||||
frac_lsbm1 = frac_lsb >> 1;
|
||||
|
||||
Reference in New Issue
Block a user