mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-10-15 23:43:55 +00:00
softfloat: Use hard-float for {u}int64_to_float{32,64}
For the normal case of no additional scaling, this reduces the profile contribution of int64_to_float64 to the testcase in the linked issue from 0.81% to 0.04%. Resolves: https://gitlab.com/qemu-project/qemu/-/issues/134 Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
90d004524e
commit
5d0204b82a
|
@ -3559,6 +3559,13 @@ float32 int64_to_float32_scalbn(int64_t a, int scale, float_status *status)
|
||||||
{
|
{
|
||||||
FloatParts64 p;
|
FloatParts64 p;
|
||||||
|
|
||||||
|
/* Without scaling, there are no overflow concerns. */
|
||||||
|
if (likely(scale == 0) && can_use_fpu(status)) {
|
||||||
|
union_float32 ur;
|
||||||
|
ur.h = a;
|
||||||
|
return ur.s;
|
||||||
|
}
|
||||||
|
|
||||||
parts64_sint_to_float(&p, a, scale, status);
|
parts64_sint_to_float(&p, a, scale, status);
|
||||||
return float32_round_pack_canonical(&p, status);
|
return float32_round_pack_canonical(&p, status);
|
||||||
}
|
}
|
||||||
|
@ -3592,6 +3599,13 @@ float64 int64_to_float64_scalbn(int64_t a, int scale, float_status *status)
|
||||||
{
|
{
|
||||||
FloatParts64 p;
|
FloatParts64 p;
|
||||||
|
|
||||||
|
/* Without scaling, there are no overflow concerns. */
|
||||||
|
if (likely(scale == 0) && can_use_fpu(status)) {
|
||||||
|
union_float64 ur;
|
||||||
|
ur.h = a;
|
||||||
|
return ur.s;
|
||||||
|
}
|
||||||
|
|
||||||
parts_sint_to_float(&p, a, scale, status);
|
parts_sint_to_float(&p, a, scale, status);
|
||||||
return float64_round_pack_canonical(&p, status);
|
return float64_round_pack_canonical(&p, status);
|
||||||
}
|
}
|
||||||
|
@ -3726,6 +3740,13 @@ float32 uint64_to_float32_scalbn(uint64_t a, int scale, float_status *status)
|
||||||
{
|
{
|
||||||
FloatParts64 p;
|
FloatParts64 p;
|
||||||
|
|
||||||
|
/* Without scaling, there are no overflow concerns. */
|
||||||
|
if (likely(scale == 0) && can_use_fpu(status)) {
|
||||||
|
union_float32 ur;
|
||||||
|
ur.h = a;
|
||||||
|
return ur.s;
|
||||||
|
}
|
||||||
|
|
||||||
parts_uint_to_float(&p, a, scale, status);
|
parts_uint_to_float(&p, a, scale, status);
|
||||||
return float32_round_pack_canonical(&p, status);
|
return float32_round_pack_canonical(&p, status);
|
||||||
}
|
}
|
||||||
|
@ -3759,6 +3780,13 @@ float64 uint64_to_float64_scalbn(uint64_t a, int scale, float_status *status)
|
||||||
{
|
{
|
||||||
FloatParts64 p;
|
FloatParts64 p;
|
||||||
|
|
||||||
|
/* Without scaling, there are no overflow concerns. */
|
||||||
|
if (likely(scale == 0) && can_use_fpu(status)) {
|
||||||
|
union_float64 ur;
|
||||||
|
ur.h = a;
|
||||||
|
return ur.s;
|
||||||
|
}
|
||||||
|
|
||||||
parts_uint_to_float(&p, a, scale, status);
|
parts_uint_to_float(&p, a, scale, status);
|
||||||
return float64_round_pack_canonical(&p, status);
|
return float64_round_pack_canonical(&p, status);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue