Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 651 → Rev 652

/uspace/trunk/softfloat/include/sftypes.h
32,6 → 32,8
 
typedef union {
float f;
__u32 binary;
 
struct {
#ifdef __BIG_ENDIAN__
__u32 sign:1;
49,6 → 51,8
typedef union {
double d;
__u64 binary;
struct {
#ifdef __BIG_ENDIAN__
__u64 sign:1;
/uspace/trunk/softfloat/generic/softfloat.c
83,5 → 83,58
 
/* Comparison functions */
 
/* a<b .. -1
* a=b .. 0
* a>b .. 1
* */
 
int __cmpsf2(double a, double b)
{
float32 fa,fb;
fa.f=a;
fb.f=b;
if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
return 1; /* no special constant for unordered - maybe signaled? */
};
 
if (isFloat32eq(fa,fb)) {
return 0;
};
if (isFloat32lt(fa,fb)) {
return -1;
};
return 1;
}
 
int __unordsf2(float a, float b)
{
float32 fa,fb;
fa.f=a;
fb.f=b;
return ((isFloat32NaN(fa))||(isFloat32NaN(fb)));
};
 
/**
* @return zero, if neither argument is a NaN and are equal
* */
int __eqsf2(float a, float b)
{
float32 fa,fb;
fa.f=a;
fb.f=b;
if ((isFloat32NaN(fa))||(isFloat32NaN(fb))) {
/* TODO: sigNaNs*/
return 1;
};
return isFloat32eq(fa,fb)-1;
};
 
/* strange behavior, but it was in gcc documentation */
int __nesf2(float a, float b)
{
return __eqsf2(a,b);
};
/* Other functions */
 
/uspace/trunk/softfloat/generic/comparison.c
39,3 → 39,31
return ((f.parts.exp==0xFF)&&(f.parts.mantisa>0x400000));
};
 
inline int isFloat32Infinity(float32 f)
{
return ((f.parts.exp==0xFF)&&(f.parts.mantisa==0x0));
};
 
/**
* @return 1, if both floats are equal - but NaNs are not recognized
*/
inline int isFloat32eq(float32 a, float32 b)
{
return ((a==b)||(((a.binary| b.binary)&0x7FFFFFFF)==0)); /* a equals to b or both are zeros (with any sign) */
}
 
/**
* @return 1, if a>b - but NaNs are not recognized
*/
inline int isFloat32lt(float32 a, float32 b)
{
if (((a.binary| b.binary)&0x7FFFFFFF)==0) {
return 0;
};
a.parts.sign^=a.parts.sign;
b.parts.sign^=b.parts.sign;
return (a.binary<b.binary);
}