From b109f9f867a793b66217d43ede10c7a47242e270 Mon Sep 17 00:00:00 2001 From: bellard Date: Sun, 20 Mar 2005 10:33:58 +0000 Subject: [PATCH] more native FPU comparison functions - native FPU remainder git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1339 c046a42c-6fe2-441c-8c8c-71466251a162 --- fpu/softfloat-native.c | 86 ++++++++++++++++++++++++++++++++++++++++++ fpu/softfloat-native.h | 28 ++++++++++++-- 2 files changed, 110 insertions(+), 4 deletions(-) diff --git a/fpu/softfloat-native.c b/fpu/softfloat-native.c index 8259a7c27c..89c0842af5 100644 --- a/fpu/softfloat-native.c +++ b/fpu/softfloat-native.c @@ -120,10 +120,39 @@ float32 float32_round_to_int( float32 a STATUS_PARAM) return rintf(a); } +float32 float32_rem( float32 a, float32 b STATUS_PARAM) +{ + return remainderf(a, b); +} + float32 float32_sqrt( float32 a STATUS_PARAM) { return sqrtf(a); } +char float32_compare( float32 a, float32 b STATUS_PARAM ) +{ + if (a < b) { + return -1; + } else if (a == b) { + return 0; + } else if (a > b) { + return 1; + } else { + return 2; + } +} +char float32_compare_quiet( float32 a, float32 b STATUS_PARAM ) +{ + if (isless(a, b)) { + return -1; + } else if (a == b) { + return 0; + } else if (isgreater(a, b)) { + return 1; + } else { + return 2; + } +} char float32_is_signaling_nan( float32 a1) { float32u u; @@ -195,10 +224,39 @@ float64 float64_round_to_int( float64 a STATUS_PARAM ) #endif } +float64 float64_rem( float64 a, float64 b STATUS_PARAM) +{ + return remainder(a, b); +} + float64 float64_sqrt( float64 a STATUS_PARAM) { return sqrt(a); } +char float64_compare( float64 a, float64 b STATUS_PARAM ) +{ + if (a < b) { + return -1; + } else if (a == b) { + return 0; + } else if (a > b) { + return 1; + } else { + return 2; + } +} +char float64_compare_quiet( float64 a, float64 b STATUS_PARAM ) +{ + if (isless(a, b)) { + return -1; + } else if (a == b) { + return 0; + } else if (isgreater(a, b)) { + return 1; + } else { + return 2; + } +} char float64_is_signaling_nan( float64 a1) { float64u u; @@ -248,10 +306,38 @@ floatx80 floatx80_round_to_int( floatx80 a STATUS_PARAM) { return rintl(a); } +floatx80 floatx80_rem( floatx80 a, floatx80 b STATUS_PARAM) +{ + return remainderl(a, b); +} floatx80 floatx80_sqrt( floatx80 a STATUS_PARAM) { return sqrtl(a); } +char floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM ) +{ + if (a < b) { + return -1; + } else if (a == b) { + return 0; + } else if (a > b) { + return 1; + } else { + return 2; + } +} +char floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM ) +{ + if (isless(a, b)) { + return -1; + } else if (a == b) { + return 0; + } else if (isgreater(a, b)) { + return 1; + } else { + return 2; + } +} char floatx80_is_signaling_nan( floatx80 a1) { floatx80u u; diff --git a/fpu/softfloat-native.h b/fpu/softfloat-native.h index 709df51bcf..9017ea582f 100644 --- a/fpu/softfloat-native.h +++ b/fpu/softfloat-native.h @@ -127,7 +127,6 @@ float32 float32_rem( float32, float32 STATUS_PARAM); float32 float32_sqrt( float32 STATUS_PARAM); INLINE char float32_eq( float32 a, float32 b STATUS_PARAM) { - /* XXX: incorrect because it can raise an exception */ return a == b; } INLINE char float32_le( float32 a, float32 b STATUS_PARAM) @@ -140,7 +139,7 @@ INLINE char float32_lt( float32 a, float32 b STATUS_PARAM) } INLINE char float32_eq_signaling( float32 a, float32 b STATUS_PARAM) { - return a == b; + return a <= b && a >= b; } INLINE char float32_le_quiet( float32 a, float32 b STATUS_PARAM) { @@ -150,6 +149,13 @@ INLINE char float32_lt_quiet( float32 a, float32 b STATUS_PARAM) { return isless(a, b); } +INLINE char float32_unordered( float32 a, float32 b STATUS_PARAM) +{ + return isunordered(a, b); + +} +char float32_compare( float32, float32 STATUS_PARAM ); +char float32_compare_quiet( float32, float32 STATUS_PARAM ); char float32_is_signaling_nan( float32 ); INLINE float32 float32_abs(float32 a) @@ -213,7 +219,7 @@ INLINE char float64_lt( float64 a, float64 b STATUS_PARAM) } INLINE char float64_eq_signaling( float64 a, float64 b STATUS_PARAM) { - return a == b; + return a <= b && a >= b; } INLINE char float64_le_quiet( float64 a, float64 b STATUS_PARAM) { @@ -224,6 +230,13 @@ INLINE char float64_lt_quiet( float64 a, float64 b STATUS_PARAM) return isless(a, b); } +INLINE char float64_unordered( float64 a, float64 b STATUS_PARAM) +{ + return isunordered(a, b); + +} +char float64_compare( float64, float64 STATUS_PARAM ); +char float64_compare_quiet( float64, float64 STATUS_PARAM ); char float64_is_signaling_nan( float64 ); INLINE float64 float64_abs(float64 a) @@ -287,7 +300,7 @@ INLINE char floatx80_lt( floatx80 a, floatx80 b STATUS_PARAM) } INLINE char floatx80_eq_signaling( floatx80 a, floatx80 b STATUS_PARAM) { - return a == b; + return a <= b && a >= b; } INLINE char floatx80_le_quiet( floatx80 a, floatx80 b STATUS_PARAM) { @@ -298,6 +311,13 @@ INLINE char floatx80_lt_quiet( floatx80 a, floatx80 b STATUS_PARAM) return isless(a, b); } +INLINE char floatx80_unordered( floatx80 a, floatx80 b STATUS_PARAM) +{ + return isunordered(a, b); + +} +char floatx80_compare( floatx80, floatx80 STATUS_PARAM ); +char floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM ); char floatx80_is_signaling_nan( floatx80 ); INLINE floatx80 floatx80_abs(floatx80 a)