[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 64/72] softfloat: Convert floatx80_round_to_int to FloatParts
From: |
Richard Henderson |
Subject: |
[PATCH 64/72] softfloat: Convert floatx80_round_to_int to FloatParts |
Date: |
Fri, 7 May 2021 18:47:54 -0700 |
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
fpu/softfloat.c | 116 ++++++------------------------------------------
1 file changed, 13 insertions(+), 103 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index faccc8df41..914cf2688c 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -2609,6 +2609,19 @@ float128 float128_round_to_int(float128 a, float_status
*s)
return float128_round_pack_canonical(&p, s);
}
+floatx80 floatx80_round_to_int(floatx80 a, float_status *status)
+{
+ FloatParts128 p;
+
+ if (!floatx80_unpack_canonical(&p, a, status)) {
+ return floatx80_default_nan(status);
+ }
+
+ parts_round_to_int(&p, status->float_rounding_mode, 0, status,
+ &floatx80_params[status->floatx80_rounding_precision]);
+ return floatx80_round_pack_canonical(&p, status);
+}
+
/*
* Floating-point to signed integer conversions
*/
@@ -5802,109 +5815,6 @@ floatx80 floatx80_round(floatx80 a, float_status
*status)
return floatx80_round_pack_canonical(&p, status);
}
-/*----------------------------------------------------------------------------
-| Rounds the extended double-precision floating-point value `a' to an integer,
-| and returns the result as an extended quadruple-precision floating-point
-| value. The operation is performed according to the IEC/IEEE Standard for
-| Binary Floating-Point Arithmetic.
-*----------------------------------------------------------------------------*/
-
-floatx80 floatx80_round_to_int(floatx80 a, float_status *status)
-{
- bool aSign;
- int32_t aExp;
- uint64_t lastBitMask, roundBitsMask;
- floatx80 z;
-
- if (floatx80_invalid_encoding(a)) {
- float_raise(float_flag_invalid, status);
- return floatx80_default_nan(status);
- }
- aExp = extractFloatx80Exp( a );
- if ( 0x403E <= aExp ) {
- if ( ( aExp == 0x7FFF ) && (uint64_t) ( extractFloatx80Frac( a )<<1 )
) {
- return propagateFloatx80NaN(a, a, status);
- }
- return a;
- }
- if ( aExp < 0x3FFF ) {
- if ( ( aExp == 0 )
- && ( (uint64_t) ( extractFloatx80Frac( a ) ) == 0 ) ) {
- return a;
- }
- float_raise(float_flag_inexact, status);
- aSign = extractFloatx80Sign( a );
- switch (status->float_rounding_mode) {
- case float_round_nearest_even:
- if ( ( aExp == 0x3FFE ) && (uint64_t) ( extractFloatx80Frac( a
)<<1 )
- ) {
- return
- packFloatx80( aSign, 0x3FFF, UINT64_C(0x8000000000000000));
- }
- break;
- case float_round_ties_away:
- if (aExp == 0x3FFE) {
- return packFloatx80(aSign, 0x3FFF,
UINT64_C(0x8000000000000000));
- }
- break;
- case float_round_down:
- return
- aSign ?
- packFloatx80( 1, 0x3FFF, UINT64_C(0x8000000000000000))
- : packFloatx80( 0, 0, 0 );
- case float_round_up:
- return
- aSign ? packFloatx80( 1, 0, 0 )
- : packFloatx80( 0, 0x3FFF, UINT64_C(0x8000000000000000));
-
- case float_round_to_zero:
- break;
- default:
- g_assert_not_reached();
- }
- return packFloatx80( aSign, 0, 0 );
- }
- lastBitMask = 1;
- lastBitMask <<= 0x403E - aExp;
- roundBitsMask = lastBitMask - 1;
- z = a;
- switch (status->float_rounding_mode) {
- case float_round_nearest_even:
- z.low += lastBitMask>>1;
- if ((z.low & roundBitsMask) == 0) {
- z.low &= ~lastBitMask;
- }
- break;
- case float_round_ties_away:
- z.low += lastBitMask >> 1;
- break;
- case float_round_to_zero:
- break;
- case float_round_up:
- if (!extractFloatx80Sign(z)) {
- z.low += roundBitsMask;
- }
- break;
- case float_round_down:
- if (extractFloatx80Sign(z)) {
- z.low += roundBitsMask;
- }
- break;
- default:
- abort();
- }
- z.low &= ~ roundBitsMask;
- if ( z.low == 0 ) {
- ++z.high;
- z.low = UINT64_C(0x8000000000000000);
- }
- if (z.low != a.low) {
- float_raise(float_flag_inexact, status);
- }
- return z;
-
-}
-
/*----------------------------------------------------------------------------
| Returns the remainder of the extended double-precision floating-point value
| `a' with respect to the corresponding value `b'. The operation is performed
--
2.25.1
- [PATCH 66/72] softfloat: Convert floatx80 float conversions to FloatParts, (continued)
- [PATCH 66/72] softfloat: Convert floatx80 float conversions to FloatParts, Richard Henderson, 2021/05/07
- [PATCH 70/72] softfloat: Convert float32_exp2 to FloatParts, Richard Henderson, 2021/05/07
- [PATCH 55/72] softfloat: Reduce FloatFmt, Richard Henderson, 2021/05/07
- [PATCH 58/72] tests/fp/fp-test: Reverse order of floatx80 precision tests, Richard Henderson, 2021/05/07
- [PATCH 61/72] softfloat: Convert floatx80_div to FloatParts, Richard Henderson, 2021/05/07
- [PATCH 59/72] softfloat: Convert floatx80_add/sub to FloatParts, Richard Henderson, 2021/05/07
- [PATCH 71/72] softfloat: Move floatN_log2 to softfloat-parts.c.inc, Richard Henderson, 2021/05/07
- [PATCH 56/72] softfloat: Introduce Floatx80RoundPrec, Richard Henderson, 2021/05/07
- [PATCH 63/72] softfloat: Convert floatx80_round to FloatParts, Richard Henderson, 2021/05/07
- [PATCH 64/72] softfloat: Convert floatx80_round_to_int to FloatParts,
Richard Henderson <=
- [PATCH 69/72] softfloat: Convert floatx80 compare to FloatParts, Richard Henderson, 2021/05/07
- [PATCH 67/72] softfloat: Convert floatx80 to integer to FloatParts, Richard Henderson, 2021/05/07
- [PATCH 72/72] softfloat: Convert modrem operations to FloatParts, Richard Henderson, 2021/05/07
- Re: [PATCH 00/72] Convert floatx80 and float128 to FloatParts, no-reply, 2021/05/07
- Re: [PATCH 00/72] Convert floatx80 and float128 to FloatParts, Alex Bennée, 2021/05/10
- Re: [PATCH 00/72] Convert floatx80 and float128 to FloatParts, Alex Bennée, 2021/05/12
- Re: [PATCH 00/72] Convert floatx80 and float128 to FloatParts, Alex Bennée, 2021/05/12