Changeset 4a5abddd in mainline


Ignore:
Timestamp:
2006-01-22T14:37:54Z (19 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a96c570
Parents:
12c6f2d
Message:

Fixed bug in result shifting.
Some cryptic numbers replaced with constants.
Code cleaning.

Location:
softfloat
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • softfloat/generic/add.c

    r12c6f2d r4a5abddd  
    3838        __u32 exp1, exp2,mant1, mant2;
    3939       
    40         expdiff=a.parts.exp - b.parts.exp;
    41         if (expdiff<0) {
     40        expdiff = a.parts.exp - b.parts.exp;
     41        if (expdiff < 0) {
    4242                if (isFloat32NaN(b)) {
    4343                        //TODO: fix SigNaN
     
    4848                };
    4949               
    50                 if (b.parts.exp==0xFF) {
    51                         return b;
    52                 }
    53                
    54                 mant1=b.parts.mantisa;
    55                 exp1=b.parts.exp;
    56                 mant2=a.parts.mantisa;
    57                 exp2=a.parts.exp;
    58                 expdiff*=-1;
     50                if (b.parts.exp == FLOAT32_MAX_EXPONENT) {
     51                        return b;
     52                }
     53               
     54                mant1 = b.parts.mantisa;
     55                exp1 = b.parts.exp;
     56                mant2 = a.parts.mantisa;
     57                exp2 = a.parts.exp;
     58                expdiff *= -1;
    5959        } else {
    6060                if (isFloat32NaN(a)) {
    6161                        //TODO: fix SigNaN
    62                         if ((isFloat32SigNaN(a))||(isFloat32SigNaN(b))) {
    63                         };
    64                         return a;
    65                 };
    66                
    67                 if (a.parts.exp==0xFF) {
    68                         return a;
    69                 }
    70                
    71                 mant1=a.parts.mantisa;
    72                 exp1=a.parts.exp;
    73                 mant2=b.parts.mantisa;
    74                 exp2=b.parts.exp;
     62                        if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) {
     63                        };
     64                        return a;
     65                };
     66               
     67                if (a.parts.exp == FLOAT32_MAX_EXPONENT) {
     68                        return a;
     69                }
     70               
     71                mant1 = a.parts.mantisa;
     72                exp1 = a.parts.exp;
     73                mant2 = b.parts.mantisa;
     74                exp2 = b.parts.exp;
    7575        };
    7676       
     
    100100        mant2 <<= 6;
    101101       
    102         if (expdiff > 24) {
     102        if (expdiff > (FLOAT32_MANTISA_SIZE + 1) ) {
    103103             goto done;
    104104             };
    105105       
    106         mant2>>=expdiff;
    107         mant1+=mant2;
     106        mant2 >>= expdiff;
     107        mant1 += mant2;
    108108done:
    109         if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 6) ) {
     109        if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7) ) {
    110110                ++exp1;
    111111                mant1 >>= 1;
     
    115115        mant1 += (0x1 << 5);
    116116       
    117         if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 6)) {
    118                 ++exp1;
    119                 mant1 >> =1;
     117        if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) {
     118                ++exp1;
     119                mant1 >>= 1;
    120120        };
    121121       
     
    123123       
    124124        /*Clear hidden bit and shift */
    125         a.parts.mantisa = ((mant1>>6) & (~FLOAT32_HIDDEN_BIT_MASK)) ;
     125        a.parts.mantisa = ((mant1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)) ;
    126126        return a;
    127127}
     
    133133{
    134134        int expdiff;
    135         __u64 exp1,exp2,mant1,mant2;
    136        
    137         expdiff=a.parts.exp - b.parts.exp;
    138         if (expdiff<0) {
     135        __u64 exp1, exp2, mant1, mant2;
     136       
     137        expdiff = a.parts.exp - b.parts.exp;
     138        if (expdiff < 0) {
    139139                if (isFloat64NaN(b)) {
    140140                        //TODO: fix SigNaN
     
    146146               
    147147                /* b is infinity and a not */   
    148                 if (b.parts.exp==0x8FF) {
    149                         return b;
    150                 }
    151                
    152                 mant1=b.parts.mantisa;
    153                 exp1=b.parts.exp;
    154                 mant2=a.parts.mantisa;
    155                 exp2=a.parts.exp;
    156                 expdiff*=-1;
     148                if (b.parts.exp == FLOAT64_MAX_EXPONENT ) {
     149                        return b;
     150                }
     151               
     152                mant1 = b.parts.mantisa;
     153                exp1 = b.parts.exp;
     154                mant2 = a.parts.mantisa;
     155                exp2 = a.parts.exp;
     156                expdiff *= -1;
    157157        } else {
    158158                if (isFloat64NaN(a)) {
    159159                        //TODO: fix SigNaN
    160                         if ((isFloat64SigNaN(a))||(isFloat64SigNaN(b))) {
     160                        if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) {
    161161                        };
    162162                        return a;
     
    164164               
    165165                /* a is infinity and b not */
    166                 if (a.parts.exp == 0x8FF) {
     166                if (a.parts.exp == FLOAT64_MAX_EXPONENT ) {
    167167                        return a;
    168168                }
     
    201201        mant2 <<= 6;
    202202       
    203         if (expdiff > 53) {
     203        if (expdiff > (FLOAT64_MANTISA_SIZE + 1) ) {
    204204             goto done;
    205205             };
     
    208208        mant1 += mant2;
    209209done:
    210         if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 6) ) {
     210        if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7) ) {
    211211                ++exp1;
    212212                mant1 >>= 1;
     
    216216        mant1 += (0x1 << 5);
    217217       
    218         if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 6)) {
    219                 ++exp1;
    220                 mant1 >> =1;
     218        if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) {
     219                ++exp1;
     220                mant1 >>= 1;
    221221        };
    222222       
    223223        a.parts.exp = exp1;
    224224        /*Clear hidden bit and shift */
    225         a.parts.mantisa = ( (mant1 >>6 ) & (~ (FLOAT64_HIDDEN_BIT_MASK)));
     225        a.parts.mantisa = ( (mant1 >> 6 ) & (~FLOAT64_HIDDEN_BIT_MASK));
    226226        return a;
    227227}
  • softfloat/include/sftypes.h

    r12c6f2d r4a5abddd  
    8282
    8383#define FLOAT32_HIDDEN_BIT_MASK 0x800000
    84 #define FLOAT64_HIDDEN_BIT_MASK 0x10000000000000l
     84#define FLOAT64_HIDDEN_BIT_MASK 0x10000000000000ll
     85
     86#define FLOAT32_MAX_EXPONENT 0xFF
     87#define FLOAT64_MAX_EXPONENT 0x8FF
    8588
    8689#define FLOAT32_BIAS 0x7F
Note: See TracChangeset for help on using the changeset viewer.