diff options
author | Richard Henderson | 2020-11-14 23:40:27 +0100 |
---|---|---|
committer | Richard Henderson | 2021-06-03 22:59:34 +0200 |
commit | e368951998ca6ffb0a1812af9beef916125dd769 (patch) | |
tree | 222c592c1371024dc89843143ef4d8752db14718 /fpu/softfloat-parts.c.inc | |
parent | softfloat: Move round_to_uint_and_pack to softfloat-parts.c.inc (diff) | |
download | qemu-e368951998ca6ffb0a1812af9beef916125dd769.tar.gz qemu-e368951998ca6ffb0a1812af9beef916125dd769.tar.xz qemu-e368951998ca6ffb0a1812af9beef916125dd769.zip |
softfloat: Move int_to_float to softfloat-parts.c.inc
Rename to parts$N_sint_to_float.
Reimplement int{32,64}_to_float128 with FloatParts128.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'fpu/softfloat-parts.c.inc')
-rw-r--r-- | fpu/softfloat-parts.c.inc | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc index 483bdc0e21..b7486f02db 100644 --- a/fpu/softfloat-parts.c.inc +++ b/fpu/softfloat-parts.c.inc @@ -883,3 +883,35 @@ static uint64_t partsN(float_to_uint)(FloatPartsN *p, FloatRoundMode rmode, float_raise(flags, s); return r; } + +/* + * Integer to float conversions + * + * Returns the result of converting the two's complement integer `a' + * to the floating-point format. The conversion is performed according + * to the IEC/IEEE Standard for Binary Floating-Point Arithmetic. + */ +static void partsN(sint_to_float)(FloatPartsN *p, int64_t a, + int scale, float_status *s) +{ + uint64_t f = a; + int shift; + + memset(p, 0, sizeof(*p)); + + if (a == 0) { + p->cls = float_class_zero; + return; + } + + p->cls = float_class_normal; + if (a < 0) { + f = -f; + p->sign = true; + } + shift = clz64(f); + scale = MIN(MAX(scale, -0x10000), 0x10000); + + p->exp = DECOMPOSED_BINARY_POINT - shift + scale; + p->frac_hi = f << shift; +} |