[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 06/20] softfloat: add floatx80_compare*() functio
From: |
Aurelien Jarno |
Subject: |
[Qemu-devel] [PATCH v2 06/20] softfloat: add floatx80_compare*() functions |
Date: |
Wed, 20 Apr 2011 12:11:55 +0200 |
Add floatx80_compare() and floatx80_compare_quiet() functions to match
the softfloat-native ones.
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Aurelien Jarno <address@hidden>
---
fpu/softfloat.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
fpu/softfloat.h | 2 ++
2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index 6ce0b61..4368069 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -6190,6 +6190,52 @@ int float ## s ## _compare_quiet( float ## s a, float ##
s b STATUS_PARAM ) \
COMPARE(32, 0xff)
COMPARE(64, 0x7ff)
+INLINE int floatx80_compare_internal( floatx80 a, floatx80 b,
+ int is_quiet STATUS_PARAM )
+{
+ flag aSign, bSign;
+
+ if (( ( extractFloatx80Exp( a ) == 0x7fff ) &&
+ ( extractFloatx80Frac( a )<<1 ) ) ||
+ ( ( extractFloatx80Exp( b ) == 0x7fff ) &&
+ ( extractFloatx80Frac( b )<<1 ) )) {
+ if (!is_quiet ||
+ floatx80_is_signaling_nan( a ) ||
+ floatx80_is_signaling_nan( b ) ) {
+ float_raise( float_flag_invalid STATUS_VAR);
+ }
+ return float_relation_unordered;
+ }
+ aSign = extractFloatx80Sign( a );
+ bSign = extractFloatx80Sign( b );
+ if ( aSign != bSign ) {
+
+ if ( ( ( (uint16_t) ( ( a.high | b.high ) << 1 ) ) == 0) &&
+ ( ( a.low | b.low ) == 0 ) ) {
+ /* zero case */
+ return float_relation_equal;
+ } else {
+ return 1 - (2 * aSign);
+ }
+ } else {
+ if (a.low == b.low && a.high == b.high) {
+ return float_relation_equal;
+ } else {
+ return 1 - 2 * (aSign ^ ( lt128( a.high, a.low, b.high, b.low ) ));
+ }
+ }
+}
+
+int floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM )
+{
+ return floatx80_compare_internal(a, b, 0 STATUS_VAR);
+}
+
+int floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM )
+{
+ return floatx80_compare_internal(a, b, 1 STATUS_VAR);
+}
+
INLINE int float128_compare_internal( float128 a, float128 b,
int is_quiet STATUS_PARAM )
{
diff --git a/fpu/softfloat.h b/fpu/softfloat.h
index 7b3b88f..5eff085 100644
--- a/fpu/softfloat.h
+++ b/fpu/softfloat.h
@@ -550,6 +550,8 @@ int floatx80_eq_quiet( floatx80, floatx80 STATUS_PARAM );
int floatx80_le_quiet( floatx80, floatx80 STATUS_PARAM );
int floatx80_lt_quiet( floatx80, floatx80 STATUS_PARAM );
int floatx80_unordered_quiet( floatx80, floatx80 STATUS_PARAM );
+int floatx80_compare( floatx80, floatx80 STATUS_PARAM );
+int floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM );
int floatx80_is_quiet_nan( floatx80 );
int floatx80_is_signaling_nan( floatx80 );
floatx80 floatx80_maybe_silence_nan( floatx80 );
--
1.7.2.3
- Re: [Qemu-devel] [PATCH v2 01/20] softfloat: fix floatx80 handling of NaN, (continued)
[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 <=
[Qemu-devel] [PATCH v2 20/20] target-i386: switch to softfloat, Aurelien Jarno, 2011/04/20
[Qemu-devel] [PATCH v2 19/20] target-i386: fix constants wrt softfloat, Aurelien Jarno, 2011/04/20
[Qemu-devel] [PATCH v2 09/20] softfloat-native: add float*_is_any_nan() functions, Aurelien Jarno, 2011/04/20
[Qemu-devel] [PATCH v2 12/20] target-i386: fix helper_fxtract() wrt softfloat, Aurelien Jarno, 2011/04/20
[Qemu-devel] [PATCH v2 16/20] target-i386: add CPU86_LDouble <-> double conversion functions, Aurelien Jarno, 2011/04/20
[Qemu-devel] [PATCH v2 03/20] softfloat: add floatx80 constants, Aurelien Jarno, 2011/04/20
[Qemu-devel] [PATCH v2 05/20] softfloat-native: add a few constant values, Aurelien Jarno, 2011/04/20
[Qemu-devel] [PATCH v2 07/20] softfloat: fix float*_scalnb() corner cases, Aurelien Jarno, 2011/04/20