The way cmpsf.c currently works seems incorrect to me.  According to 

http://gcc.gnu.org/onlinedocs/gccint/Soft-float-library-routines.html#Soft%2
0float%20library%20routines

the behavior of __cmpsf2 is as follows:

"These functions calculate a <=> b. That is, if a is less than b, they
return -1; if a is greater than b, they return 1; and if a and b are equal
they return 0. If either argument is NaN they return 1, but you should not
rely on this; if NaN is a possibility, use one of the higher-level
comparison functions. "

from this it seems that one of two comparisons should be preformed:

1) a1>a2
2) -a1<-a2

In this implementation a1>a2 and -a1>-a2 seem to be used rather than the
former; -a1>-a2 is used when a1 and a2 are negative rather than -a1<-a2.

Attached is a patch with a fix.

-Chris Takahashi

DIFF:
--- msp430-libc/src/libm/cmpsf.c        2002-10-24 05:08:28.000000000 -0700
+++ msp430-libc-local/src/libm/cmpsf.c  2003-08-05 14:01:18.000000000 -0700
@@ -37,6 +37,9 @@
        {
                a1 ^= 0x80000000;
                a2 ^= 0x80000000;
+               if(a1<a2)
+                       return 1;
+               return -1;
        }

        if(a1>a2)       return 1;

Attachment: cmpsf.diff
Description: Binary data

Reply via email to