diff options
author | Richard Henderson | 2020-11-22 03:32:06 +0100 |
---|---|---|
committer | Richard Henderson | 2021-06-03 23:09:02 +0200 |
commit | 872e6991f01986ff6c7189cdf86f8fd719ff5f5c (patch) | |
tree | 2234b730964f8c3cc268bcc1f7bf49d2c90edc16 /fpu | |
parent | softfloat: Convert floatx80 to integer to FloatParts (diff) | |
download | qemu-872e6991f01986ff6c7189cdf86f8fd719ff5f5c.tar.gz qemu-872e6991f01986ff6c7189cdf86f8fd719ff5f5c.tar.xz qemu-872e6991f01986ff6c7189cdf86f8fd719ff5f5c.zip |
softfloat: Convert floatx80_scalbn to FloatParts
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'fpu')
-rw-r--r-- | fpu/softfloat.c | 50 |
1 files changed, 11 insertions, 39 deletions
diff --git a/fpu/softfloat.c b/fpu/softfloat.c index 5a2a872408..770badd447 100644 --- a/fpu/softfloat.c +++ b/fpu/softfloat.c @@ -3911,6 +3911,17 @@ float128 float128_scalbn(float128 a, int n, float_status *status) return float128_round_pack_canonical(&p, status); } +floatx80 floatx80_scalbn(floatx80 a, int n, float_status *status) +{ + FloatParts128 p; + + if (!floatx80_unpack_canonical(&p, a, status)) { + return floatx80_default_nan(status); + } + parts_scalbn(&p, n, status); + return floatx80_round_pack_canonical(&p, status); +} + /* * Square Root */ @@ -5745,45 +5756,6 @@ FloatRelation floatx80_compare_quiet(floatx80 a, floatx80 b, return floatx80_compare_internal(a, b, 1, status); } -floatx80 floatx80_scalbn(floatx80 a, int n, float_status *status) -{ - bool aSign; - int32_t aExp; - uint64_t aSig; - - if (floatx80_invalid_encoding(a)) { - float_raise(float_flag_invalid, status); - return floatx80_default_nan(status); - } - aSig = extractFloatx80Frac( a ); - aExp = extractFloatx80Exp( a ); - aSign = extractFloatx80Sign( a ); - - if ( aExp == 0x7FFF ) { - if ( aSig<<1 ) { - return propagateFloatx80NaN(a, a, status); - } - return a; - } - - if (aExp == 0) { - if (aSig == 0) { - return a; - } - aExp++; - } - - if (n > 0x10000) { - n = 0x10000; - } else if (n < -0x10000) { - n = -0x10000; - } - - aExp += n; - return normalizeRoundAndPackFloatx80(status->floatx80_rounding_precision, - aSign, aExp, aSig, 0, status); -} - static void __attribute__((constructor)) softfloat_init(void) { union_float64 ua, ub, uc, ur; |