/uspace/trunk/softfloat/generic/softfloat.c |
---|
38,6 → 38,10 |
#include<comparison.h> |
#include<other.h> |
#include<arch.h> |
#include<types.h> |
#include<functions.h> |
/* Arithmetic functions */ |
float __addsf3(float a, float b) |
160,7 → 164,108 |
return convertFloat64ToFloat32(da).f; |
} |
int __fixsfsi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_int(fa); |
} |
int __fixdfsi(double a) |
{ |
} |
long __fixsfdi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_long(fa); |
} |
long __fixdfdi(double a) |
{ |
} |
long long __fixsfti(float a) |
{ |
} |
long long __fixdfti(double a) |
{ |
} |
unsigned int __fixunssfsi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_uint(fa); |
} |
unsigned int __fixunsdfsi(double a) |
{ |
} |
unsigned long __fixunssfdi(float a) |
{ |
float32 fa; |
fa.f = a; |
return float32_to_long(fa); |
} |
unsigned long __fixunsdfdi(double a) |
{ |
} |
unsigned long long __fixunssfti(float a) |
{ |
} |
unsigned long long __fixunsdfti(double a) |
{ |
} |
float __floatsisf(int i) |
{ |
} |
double __floatsidf(int i) |
{ |
} |
float __floatdisf(long i) |
{ |
} |
double __floatdidf(long i) |
{ |
} |
float __floattisf(long long i) |
{ |
} |
double __floattidf(long long i) |
{ |
} |
float __floatunsisf(unsigned int i) |
{ |
} |
double __floatunsidf(unsigned int i) |
{ |
} |
float __floatundisf(unsigned long i) |
{ |
} |
double __floatundidf(unsigned long i) |
{ |
} |
float __floatuntisf(unsigned long long i) |
{ |
} |
double __floatuntidf(unsigned long long i) |
{ |
} |
/* Comparison functions */ |
/* Comparison functions */ |
/* a<b .. -1 |
* a=b .. 0 |
/uspace/trunk/softfloat/generic/conversion.c |
---|
28,6 → 28,7 |
#include "sftypes.h" |
#include "conversion.h" |
#include "comparison.h" |
float64 convertFloat32ToFloat64(float32 a) |
{ |
66,7 → 67,7 |
return result; |
}; |
} |
float32 convertFloat64ToFloat32(float64 a) |
{ |
135,5 → 136,75 |
result.parts.exp = exp; |
result.parts.fraction = a.parts.fraction >> (FLOAT64_FRACTION_SIZE - FLOAT32_FRACTION_SIZE); |
return result; |
}; |
} |
/** Helping procedure for converting float32 to uint32 |
* @param a floating point number in normalized form (no NaNs or Inf are checked ) |
* @return unsigned integer |
*/ |
static __u32 _float32_to_uint32_helper(float32 a) |
{ |
__u32 frac; |
if (a.parts.exp < FLOAT32_BIAS) { |
/*TODO: rounding*/ |
return 0; |
} |
frac = a.parts.fraction; |
frac |= FLOAT32_HIDDEN_BIT_MASK; |
/* shift fraction to left so hidden bit will be the most significant bit */ |
frac <<= 32 - FLOAT32_FRACTION_SIZE - 1; |
frac >>= 32 - (a.parts.exp - FLOAT32_BIAS) - 1; |
if ((a.parts.sign == 1) && (frac != 0)) { |
frac = ~frac; |
++frac; |
} |
return frac; |
} |
/* Convert float to unsigned int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
__u32 float32_to_uint32(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_UINT32; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (32 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_UINT32; |
} |
return MAX_UINT32; |
} |
return _float32_to_uint32_helper(a); |
} |
/* Convert float to signed int32 |
* FIXME: Im not sure what to return if overflow/underflow happens |
* - now its the biggest or the smallest int |
*/ |
__s32 float32_to_int32(float32 a) |
{ |
if (isFloat32NaN(a)) { |
return MAX_INT32; |
} |
if (isFloat32Infinity(a) || (a.parts.exp >= (32 + FLOAT32_BIAS))) { |
if (a.parts.sign) { |
return MIN_INT32; |
} |
return MAX_INT32; |
} |
return _float32_to_uint32_helper(a); |
} |