[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 01/20] softfloat: fix floatx80 handling of NaN
From: |
Aurelien Jarno |
Subject: |
[Qemu-devel] [PATCH v3 01/20] softfloat: fix floatx80 handling of NaN |
Date: |
Wed, 20 Apr 2011 13:24:20 +0200 |
User-agent: |
Mutt/1.5.20 (2009-06-14) |
The floatx80 format uses an explicit bit that should be taken into account
when converting to and from commonNaN format.
When converting to commonNaN, the explicit bit should be removed if it is
a 1, and a default NaN should be used if it is 0.
When converting from commonNan, the explicit bit should be added.
Signed-off-by: Aurelien Jarno <address@hidden>
---
fpu/softfloat-specialize.h | 23 ++++++++++++++++-------
1 files changed, 16 insertions(+), 7 deletions(-)
v1 -> v2: fix wrong condition that may create an infinity instead of a
NaN
v2 -> v3: don't change the sign of the default NaN.
diff --git a/fpu/softfloat-specialize.h b/fpu/softfloat-specialize.h
index b110187..9d68aae 100644
--- a/fpu/softfloat-specialize.h
+++ b/fpu/softfloat-specialize.h
@@ -603,9 +603,15 @@ static commonNaNT floatx80ToCommonNaN( floatx80 a
STATUS_PARAM)
commonNaNT z;
if ( floatx80_is_signaling_nan( a ) ) float_raise( float_flag_invalid
STATUS_VAR);
- z.sign = a.high>>15;
- z.low = 0;
- z.high = a.low;
+ if ( a.low >> 63 ) {
+ z.sign = a.high >> 15;
+ z.low = 0;
+ z.high = a.low << 1;
+ } else {
+ z.sign = floatx80_default_nan_high >> 15;
+ z.low = 0;
+ z.high = floatx80_default_nan_low << 1;
+ }
return z;
}
@@ -624,11 +630,14 @@ static floatx80 commonNaNToFloatx80( commonNaNT a
STATUS_PARAM)
return z;
}
- if (a.high)
- z.low = a.high;
- else
+ if (a.high >> 1) {
+ z.low = LIT64( 0x8000000000000000 ) | a.high >> 1;
+ z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF;
+ } else {
z.low = floatx80_default_nan_low;
- z.high = ( ( (uint16_t) a.sign )<<15 ) | 0x7FFF;
+ z.high = floatx80_default_nan_high;
+ }
+
return z;
}
--
1.7.2.3
- [Qemu-devel] [PATCH v2 00/20] *** SUBJECT HERE ***, Aurelien Jarno, 2011/04/20
- [Qemu-devel] [PATCH v2 14/20] target-i386: fix helper_fsqrt() wrt softfloat, Aurelien Jarno, 2011/04/20
- [Qemu-devel] [PATCH v2 11/20] target-i386: fix helper_fbld_ST0() wrt softfloat, Aurelien Jarno, 2011/04/20
- [Qemu-devel] [PATCH v2 04/20] softfloat: add pi constants, Aurelien Jarno, 2011/04/20
- [Qemu-devel] [PATCH v2 02/20] softfloat: fix floatx80_is_infinity(), Aurelien Jarno, 2011/04/20
- [Qemu-devel] [PATCH v2 15/20] target-i386: replace approx_rsqrt and approx_rcp by softfloat ops, Aurelien Jarno, 2011/04/20
- [Qemu-devel] [PATCH v2 06/20] softfloat: add floatx80_compare*() functions, Aurelien Jarno, 2011/04/20
- [Qemu-devel] [PATCH v2 20/20] target-i386: switch to softfloat, Aurelien Jarno, 2011/04/20