Skip to contentSkip to conversation

Fix broken fp comparison on PPC host

PATCH In review Marcus Comstedt 2 participants 2 messages Aug 7, 2005 – Aug 10, 2005

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Fix broken fp comparison on PPC host

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

softfloat.h renamed from softfloat.h.orig +4 -4
@@ -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)
softfloat.c renamed from softfloat.c.orig +2 -2
@@ -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);              \
 }
softfloat-native.h renamed from softfloat-native.h.orig +6 -6
@@ -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)
softfloat-native.c renamed from softfloat-native.c.orig +6 -6
@@ -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;
#1 lore raw

[Qemu-devel] Default BIOS path for win32

Hi,

A default BIOS path isn't set properly for win32 when a slash is used to set a drive letter. Attached patch is a workaround for it. It's OK when a path is set manually by -L option.

Regards,
Kazu

configure +2 -2
@@ -356,10 +356,10 @@
 
 if test "$mingw32" = "yes" ; then
 if test -z "$prefix" ; then
-    prefix="/c/Program Files/Qemu"
+    prefix="c:/Program Files/Qemu"
 fi
 mandir="$prefix"
-datadir="$prefix"
+datadir="$prefix/bios"
 docdir="$prefix"
 bindir="$prefix"
 else