qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Fix broken fp comparison on PPC host


From: Marcus Comstedt
Subject: [Qemu-devel] [PATCH] Fix broken fp comparison on PPC host
Date: Sun, 07 Aug 2005 15:06:01 +0200
User-agent: Gnus/5.1006 (Gnus v5.10.6) XEmacs/21.5 (chestnut, linux)

Hi.

In QEMU 0.7.1, floating point comparisons do not work properly when
the host is PPC.  The reason being that the floatXX_compare functions
are declared as returning "char", which is an unsigned type on PPC,
even though "-1" is one of the possible return values.  This means
that r3 will be set to 0x000000ff, but the translated code expects
0xffffffff.  Changing the return type to "signed char" fixes the
problem (patch attached), although I honsestly don't see a reason for
returning char sized types from a function in the first place.
Returning "int" will give identical or better code on all modern
architectures...

Anyway, thanks for QEMU, it's a great program.  :-)


  // Marcus


--- fpu/softfloat.h.orig        2005-08-07 14:45:44.000000000 +0200
+++ fpu/softfloat.h     2005-08-07 14:48:11.000000000 +0200
@@ -234,8 +234,8 @@
 char float32_eq_signaling( float32, float32 STATUS_PARAM );
 char float32_le_quiet( float32, float32 STATUS_PARAM );
 char float32_lt_quiet( float32, float32 STATUS_PARAM );
-char float32_compare( float32, float32 STATUS_PARAM );
-char float32_compare_quiet( float32, float32 STATUS_PARAM );
+signed char float32_compare( float32, float32 STATUS_PARAM );
+signed char float32_compare_quiet( float32, float32 STATUS_PARAM );
 char float32_is_signaling_nan( float32 );
 
 INLINE float32 float32_abs(float32 a)
@@ -281,8 +281,8 @@
 char float64_eq_signaling( float64, float64 STATUS_PARAM );
 char float64_le_quiet( float64, float64 STATUS_PARAM );
 char float64_lt_quiet( float64, float64 STATUS_PARAM );
-char float64_compare( float64, float64 STATUS_PARAM );
-char float64_compare_quiet( float64, float64 STATUS_PARAM );
+signed char float64_compare( float64, float64 STATUS_PARAM );
+signed char float64_compare_quiet( float64, float64 STATUS_PARAM );
 char float64_is_signaling_nan( float64 );
 
 INLINE float64 float64_abs(float64 a)
--- fpu/softfloat.c.orig        2005-08-07 14:45:48.000000000 +0200
+++ fpu/softfloat.c     2005-08-07 14:48:31.000000000 +0200
@@ -5306,12 +5306,12 @@
     }                                                                        \
 }                                                                            \
                                                                              \
-char float ## s ## _compare( float ## s a, float ## s b STATUS_PARAM )       \
+signed char float ## s ## _compare( float ## s a, float ## s b STATUS_PARAM )  
     \
 {                                                                            \
     return float ## s ## _compare_internal(a, b, 0 STATUS_VAR);              \
 }                                                                            \
                                                                              \
-char float ## s ## _compare_quiet( float ## s a, float ## s b STATUS_PARAM ) \
+signed char float ## s ## _compare_quiet( float ## s a, float ## s b 
STATUS_PARAM ) \
 {                                                                            \
     return float ## s ## _compare_internal(a, b, 1 STATUS_VAR);              \
 }
--- fpu/softfloat-native.h.orig 2005-08-07 14:52:56.000000000 +0200
+++ fpu/softfloat-native.h      2005-08-07 14:53:15.000000000 +0200
@@ -154,8 +154,8 @@
     return isunordered(a, b);
 
 }
-char float32_compare( float32, float32 STATUS_PARAM );
-char float32_compare_quiet( float32, float32 STATUS_PARAM );
+signed char float32_compare( float32, float32 STATUS_PARAM );
+signed char float32_compare_quiet( float32, float32 STATUS_PARAM );
 char float32_is_signaling_nan( float32 );
 
 INLINE float32 float32_abs(float32 a)
@@ -235,8 +235,8 @@
     return isunordered(a, b);
 
 }
-char float64_compare( float64, float64 STATUS_PARAM );
-char float64_compare_quiet( float64, float64 STATUS_PARAM );
+signed char float64_compare( float64, float64 STATUS_PARAM );
+signed char float64_compare_quiet( float64, float64 STATUS_PARAM );
 char float64_is_signaling_nan( float64 );
 
 INLINE float64 float64_abs(float64 a)
@@ -316,8 +316,8 @@
     return isunordered(a, b);
 
 }
-char floatx80_compare( floatx80, floatx80 STATUS_PARAM );
-char floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM );
+signed char floatx80_compare( floatx80, floatx80 STATUS_PARAM );
+signed char floatx80_compare_quiet( floatx80, floatx80 STATUS_PARAM );
 char floatx80_is_signaling_nan( floatx80 );
 
 INLINE floatx80 floatx80_abs(floatx80 a)
--- fpu/softfloat-native.c.orig 2005-08-07 14:52:13.000000000 +0200
+++ fpu/softfloat-native.c      2005-08-07 14:52:35.000000000 +0200
@@ -129,7 +129,7 @@
 {
     return sqrtf(a);
 }
-char float32_compare( float32 a, float32 b STATUS_PARAM )
+signed char float32_compare( float32 a, float32 b STATUS_PARAM )
 {
     if (a < b) {
         return -1;
@@ -141,7 +141,7 @@
         return 2;
     }
 }
-char float32_compare_quiet( float32 a, float32 b STATUS_PARAM )
+signed char float32_compare_quiet( float32 a, float32 b STATUS_PARAM )
 {
     if (isless(a, b)) {
         return -1;
@@ -233,7 +233,7 @@
 {
     return sqrt(a);
 }
-char float64_compare( float64 a, float64 b STATUS_PARAM )
+signed char float64_compare( float64 a, float64 b STATUS_PARAM )
 {
     if (a < b) {
         return -1;
@@ -245,7 +245,7 @@
         return 2;
     }
 }
-char float64_compare_quiet( float64 a, float64 b STATUS_PARAM )
+signed char float64_compare_quiet( float64 a, float64 b STATUS_PARAM )
 {
     if (isless(a, b)) {
         return -1;
@@ -314,7 +314,7 @@
 {
     return sqrtl(a);
 }
-char floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM )
+signed char floatx80_compare( floatx80 a, floatx80 b STATUS_PARAM )
 {
     if (a < b) {
         return -1;
@@ -326,7 +326,7 @@
         return 2;
     }
 }
-char floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM )
+signed char floatx80_compare_quiet( floatx80 a, floatx80 b STATUS_PARAM )
 {
     if (isless(a, b)) {
         return -1;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]