1
From 0f42c3554641a1b3cfffc71f5a5e6e6f56ac1bcb Mon Sep 17 00:00:00 2001
2
From: Tom Musta <tommusta@gmail.com>
3
Date: Tue, 7 Jan 2014 17:17:51 +0000
4
Subject: [PATCH 095/158] softfloat: Fix float64_to_uint32
6
The float64_to_uint32 has several flaws:
8
- for numbers between 2**32 and 2**64, the inexact exception flag
9
may get incorrectly set. In this case, only the invalid flag
12
test pattern: 425F81378DC0CD1F / 0x1.f81378dc0cd1fp+38
14
- for numbers between 2**63 and 2**64, incorrect results may
17
test pattern: 43EAAF73F1F0B8BD / 0x1.aaf73f1f0b8bdp+63
19
This patch re-implements float64_to_uint32 to re-use the
20
float64_to_uint64 routine (instead of float64_to_int64). For the
21
saturation case, we ignore any flags which the conversion routine
22
has set and raise only the invalid flag.
24
This contribution can be licensed under either the softfloat-2a or -2b
27
Signed-off-by: Tom Musta <tommusta@gmail.com>
28
Message-id: 1387397961-4894-5-git-send-email-tommusta@gmail.com
29
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
30
Reviewed-by: Richard Henderson <rth@twiddle.net>
32
fpu/softfloat.c | 15 +++++++--------
33
1 file changed, 7 insertions(+), 8 deletions(-)
35
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
36
index 141e7fd..ba476a8 100644
39
@@ -6650,19 +6650,18 @@ uint_fast16_t float32_to_uint16_round_to_zero(float32 a STATUS_PARAM)
41
uint32 float64_to_uint32( float64 a STATUS_PARAM )
46
+ int old_exc_flags = get_float_exception_flags(status);
48
- v = float64_to_int64(a STATUS_VAR);
51
- float_raise( float_flag_invalid STATUS_VAR);
52
- } else if (v > 0xffffffff) {
53
+ v = float64_to_uint64(a STATUS_VAR);
54
+ if (v > 0xffffffff) {
56
- float_raise( float_flag_invalid STATUS_VAR);
61
+ set_float_exception_flags(old_exc_flags, status);
62
+ float_raise(float_flag_invalid STATUS_VAR);