Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 803 → Rev 804

/uspace/trunk/softfloat/generic/add.c
35,12 → 35,12
float32 addFloat32(float32 a, float32 b)
{
int expdiff;
__u32 exp1, exp2,mant1, mant2;
__u32 exp1, exp2,frac1, frac2;
expdiff = a.parts.exp - b.parts.exp;
if (expdiff < 0) {
if (isFloat32NaN(b)) {
//TODO: fix SigNaN
/* TODO: fix SigNaN */
if (isFloat32SigNaN(b)) {
};
 
51,17 → 51,17
return b;
}
mant1 = b.parts.mantisa;
frac1 = b.parts.fraction;
exp1 = b.parts.exp;
mant2 = a.parts.mantisa;
frac2 = a.parts.fraction;
exp2 = a.parts.exp;
expdiff *= -1;
} else {
if (isFloat32NaN(a)) {
//TODO: fix SigNaN
if ((isFloat32NaN(a)) || (isFloat32NaN(b))) {
/* TODO: fix SigNaN */
if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) {
};
return a;
return (isFloat32NaN(a)?a:b);
};
if (a.parts.exp == FLOAT32_MAX_EXPONENT) {
68,24 → 68,24
return a;
}
mant1 = a.parts.mantisa;
frac1 = a.parts.fraction;
exp1 = a.parts.exp;
mant2 = b.parts.mantisa;
frac2 = b.parts.fraction;
exp2 = b.parts.exp;
};
if (exp1 == 0) {
/* both are denormalized */
mant1 += mant2;
if (mant1 & FLOAT32_HIDDEN_BIT_MASK ) {
frac1 += frac2;
if (frac1 & FLOAT32_HIDDEN_BIT_MASK ) {
/* result is not denormalized */
a.parts.exp = 1;
};
a.parts.mantisa = mant1;
a.parts.fraction = frac1;
return a;
};
mant1 |= FLOAT32_HIDDEN_BIT_MASK; //add hidden bit
frac1 |= FLOAT32_HIDDEN_BIT_MASK; /* add hidden bit */
 
if (exp2 == 0) {
/* second operand is denormalized */
92,37 → 92,43
--expdiff;
} else {
/* add hidden bit to second operand */
mant2 |= FLOAT32_HIDDEN_BIT_MASK;
frac2 |= FLOAT32_HIDDEN_BIT_MASK;
};
/* create some space for rounding */
mant1 <<= 6;
mant2 <<= 6;
frac1 <<= 6;
frac2 <<= 6;
if (expdiff > (FLOAT32_MANTISA_SIZE + 1) ) {
goto done;
};
if (expdiff < (FLOAT32_FRACTION_SIZE + 2) ) {
frac2 >>= expdiff;
frac1 += frac2;
};
mant2 >>= expdiff;
mant1 += mant2;
done:
if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7) ) {
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7) ) {
++exp1;
mant1 >>= 1;
frac1 >>= 1;
};
/* rounding - if first bit after mantisa is set then round up */
mant1 += (0x1 << 5);
/* rounding - if first bit after fraction is set then round up */
frac1 += (0x1 << 5);
if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) {
if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) {
/* rounding overflow */
++exp1;
mant1 >>= 1;
frac1 >>= 1;
};
if ((a.parts.exp == FLOAT32_MAX_EXPONENT ) || (a.parts.exp < exp1)) {
/* overflow - set infinity as result */
a.parts.exp = FLOAT32_MAX_EXPONENT;
a.parts.fraction = 0;
return a;
}
a.parts.exp = exp1;
/*Clear hidden bit and shift */
a.parts.mantisa = ((mant1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ;
a.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ;
return a;
}
 
133,12 → 139,12
{
int expdiff;
__u32 exp1, exp2;
__u64 mant1, mant2;
__u64 frac1, frac2;
expdiff = a.parts.exp - b.parts.exp;
if (expdiff < 0) {
if (isFloat64NaN(b)) {
//TODO: fix SigNaN
/* TODO: fix SigNaN */
if (isFloat64SigNaN(b)) {
};
 
150,14 → 156,14
return b;
}
mant1 = b.parts.mantisa;
frac1 = b.parts.fraction;
exp1 = b.parts.exp;
mant2 = a.parts.mantisa;
frac2 = a.parts.fraction;
exp2 = a.parts.exp;
expdiff *= -1;
} else {
if (isFloat64NaN(a)) {
//TODO: fix SigNaN
/* TODO: fix SigNaN */
if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) {
};
return a;
168,25 → 174,25
return a;
}
mant1 = a.parts.mantisa;
frac1 = a.parts.fraction;
exp1 = a.parts.exp;
mant2 = b.parts.mantisa;
frac2 = b.parts.fraction;
exp2 = b.parts.exp;
};
if (exp1 == 0) {
/* both are denormalized */
mant1 += mant2;
if (mant1 & FLOAT64_HIDDEN_BIT_MASK) {
frac1 += frac2;
if (frac1 & FLOAT64_HIDDEN_BIT_MASK) {
/* result is not denormalized */
a.parts.exp = 1;
};
a.parts.mantisa = mant1;
a.parts.fraction = frac1;
return a;
};
/* add hidden bit - mant1 is sure not denormalized */
mant1 |= FLOAT64_HIDDEN_BIT_MASK;
/* add hidden bit - frac1 is sure not denormalized */
frac1 |= FLOAT64_HIDDEN_BIT_MASK;
 
/* second operand ... */
if (exp2 == 0) {
194,36 → 200,42
--expdiff;
} else {
/* is not denormalized */
mant2 |= FLOAT64_HIDDEN_BIT_MASK;
frac2 |= FLOAT64_HIDDEN_BIT_MASK;
};
/* create some space for rounding */
mant1 <<= 6;
mant2 <<= 6;
frac1 <<= 6;
frac2 <<= 6;
if (expdiff > (FLOAT64_MANTISA_SIZE + 1) ) {
goto done;
};
if (expdiff < (FLOAT64_FRACTION_SIZE + 2) ) {
frac2 >>= expdiff;
frac1 += frac2;
};
mant2 >>= expdiff;
mant1 += mant2;
done:
if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7) ) {
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7) ) {
++exp1;
mant1 >>= 1;
frac1 >>= 1;
};
/* rounding - if first bit after mantisa is set then round up */
mant1 += (0x1 << 5);
/* rounding - if first bit after fraction is set then round up */
frac1 += (0x1 << 5);
if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) {
if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) {
/* rounding overflow */
++exp1;
mant1 >>= 1;
frac1 >>= 1;
};
if ((a.parts.exp == FLOAT64_MAX_EXPONENT ) || (a.parts.exp < exp1)) {
/* overflow - set infinity as result */
a.parts.exp = FLOAT64_MAX_EXPONENT;
a.parts.fraction = 0;
return a;
}
a.parts.exp = exp1;
/*Clear hidden bit and shift */
a.parts.mantisa = ( (mant1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK));
a.parts.fraction = ( (frac1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK));
return a;
}