Changeset 7afd2aca in mainline for softfloat/generic/softfloat.c


Ignore:
Timestamp:
2005-12-07T22:37:49Z (20 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
36aee474
Parents:
ebff5e8
Message:

Softfloat: 32 bit float addition completed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • softfloat/generic/softfloat.c

    rebff5e8 r7afd2aca  
    3030#include<softfloat.h>
    3131
     32float32 addFloat32(float32 a, float32 b);
     33float32 subFloat32(float32 a, float32 b);
     34inline int isFloat32NaN(float32 f);
     35inline int isFloat32SigNaN(float32 f);
    3236
    3337float __addsf3(float a, float b)
    3438{
    3539        float32 fa, fb;
    36         a.f=a;
    37         b.f=b;
    38         if (a.parts.sign!=b.parts.sign) return subFloat32(a,b).f;
    39         return addFloat32(a,b).f;
     40        fa.f=a;
     41        fb.f=b;
     42        if (fa.parts.sign!=fb.parts.sign) return subFloat32(fa,fb).f;
     43        return addFloat32(fa,fb).f;
    4044};
    4145
     
    4347{
    4448        float32 fa, fb;
    45         a.f=a;
    46         b.f=b;
    47         if (a.parts.sign!=b.parts.sign) return addFloat32(a,b).f;
    48         return subFloat32(a,b).f;
     49        fa.f=a;
     50        fb.f=b;
     51        if (fa.parts.sign!=fb.parts.sign) return addFloat32(fa,fb).f;
     52        return subFloat32(fa,fb).f;
    4953};
    5054
     
    6064{
    6165        float64 fa;
    62         fa.f=a;
     66        fa.d=a;
    6367        fa.parts.sign=!fa.parts.sign;
    64         return fa.f;
     68        return fa.d;
    6569};
    6670
     71/** Add two Float32 numbers with same signs
     72 */
    6773float32 addFloat32(float32 a, float32 b)
    6874{
    69         __u32 expdiff;
     75        int expdiff;
    7076        __u32 exp1,exp2,mant1,mant2;
    7177       
    7278        expdiff=a.parts.exp - b.parts.exp;
    7379        if (expdiff<0) {
    74                 if (isFloat32NaN(a)) {
    75                         //TODO: fix it
    76                         return a;
     80                if (isFloat32NaN(b)) {
     81                        //TODO: fix SigNaN
     82                        if (isFloat32SigNaN(b)) {
     83                        };
     84                        return b;
    7785                };
    78 
     86               
     87                if (b.parts.exp==0xFF) {
     88                        return b;
     89                }
     90               
    7991                mant1=b.parts.mantisa;
    8092                exp1=b.parts.exp;
     
    8395                expdiff*=-1;
    8496        } else {
    85                 if (isFloat32NaN(b)) {
    86                         //TODO: fix it
    87                         return b;
     97                if (isFloat32NaN(a)) {
     98                        //TODO: fix SigNaN
     99                        if ((isFloat32SigNaN(a))||(isFloat32SigNaN(b))) {
     100                        };
     101                        return a;
    88102                };
     103               
     104                if (a.parts.exp==0xFF) {
     105                        return a;
     106                }
     107               
    89108                mant1=a.parts.mantisa;
    90109                exp1=a.parts.exp;
     
    92111                exp2=b.parts.exp;
    93112        };
    94 
     113       
     114        if (exp1==0) {
     115                //both are denormalized
     116                mant1+=mant2;
     117                if (mant1&0xF00000) {
     118                        a.parts.exp=1;
     119                };
     120                a.parts.mantisa=mant1;
     121                return a;
     122        };
     123       
    95124        // create some space for rounding
    96125        mant1<<=6;
    97126        mant2<<=6;
    98127       
    99         if (exp1!=0) {
    100                 mant1|=0x20000000; //add hidden bit
    101         };
     128        mant1|=0x20000000; //add hidden bit
     129       
    102130       
    103131        if (exp2==0) {
     
    107135        };
    108136       
    109        
    110         if (expdiff>24) {
    111                 goto done;
    112         };
    113        
    114137        mant2>>=expdiff;
    115138        mant1+=mant2;
    116139done:
    117         //TODO: round mant1
     140        if (mant1&0x40000000) {
     141                ++exp1;
     142                mant1>>=1;
     143        };
     144       
     145        //rounding - if first bit after mantisa is set then round up
     146        mant1+=0x20;
     147       
    118148        a.parts.exp=exp1;
    119149        a.parts.mantisa=mant1>>6;
     
    121151};
    122152
     153/** Substract two float32 numbers with same signs
     154 */
    123155float32 subFloat32(float32 a, float32 b)
    124156{
     
    129161inline int isFloat32NaN(float32 f)
    130162{       /* NaN : exp = 0xff and nonzero mantisa */
    131         float32 fa;
    132         fa.f=f;
    133         return ((fa.parts.exp==0xFF)&&(fa.parts.mantisa));
     163        return ((f.parts.exp==0xFF)&&(f.parts.mantisa));
    134164};
    135165
    136166inline int isFloat32SigNaN(float32 f)
    137167{       /* SigNaN : exp = 0xff mantisa = 1xxxxx..x (binary), where at least one x is nonzero */
    138         float32 fa;
    139         fa.f=f;
    140         return ((fa.parts.exp==0xFF)&&(fa.parts.mantisa>0x400000));
     168        return ((f.parts.exp==0xFF)&&(f.parts.mantisa>0x400000));
    141169};
    142170
Note: See TracChangeset for help on using the changeset viewer.