Changeset 7afd2aca in mainline


Ignore:
Timestamp:
2005-12-07T22:37:49Z (19 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.

Location:
softfloat
Files:
2 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
  • softfloat/include/softfloat.h

    rebff5e8 r7afd2aca  
    3535        struct  {
    3636                #ifdef __BIG_ENDIAN__
    37                 __u8 sign:1;
    38                 __u8 exp:8;
     37                __u32 sign:1;
     38                __u32 exp:8;
    3939                __u32 mantisa:23;
    40                 #else
    41                 #ifdef __LITTLE_ENDIAN__
     40                #elif defined __LITTLE_ENDIAN__
    4241                __u32 mantisa:23;
    43                 __u8 exp:8;
    44                 __u8 sign:1;
     42                __u32 exp:8;
     43                __u32 sign:1;
    4544                #else
     45                #error "Unknown endians."
    4646                #endif
    4747                } parts __attribute__ ((packed));
    48         } float32_t;
     48        } float32;
    4949       
    5050typedef union {
     
    5252        struct  {
    5353                #ifdef __BIG_ENDIAN__
    54                 __u8 sign:1;
    55                 __u8 exp:11;
    56                 __u32 mantisa:52;
    57                 #else
    58                 #ifdef __LITTLE_ENDIAN__
    59                 __u32 mantisa:52;
    60                 __u8 exp:11;
    61                 __u8 sign:1;
     54                __u64 sign:1;
     55                __u64 exp:11;
     56                __u64 mantisa:52;
     57                #elif defined __LITTLE_ENDIAN__
     58                __u64 mantisa:52;
     59                __u64 exp:11;
     60                __u64 sign:1;
    6261                #else
     62                #error "Unknown endians."
    6363                #endif
    6464                } parts __attribute__ ((packed));
    65         } float64_t;
     65        } float64;
    6666
    6767#define FLOAT32_MAX 0x7f800000
Note: See TracChangeset for help on using the changeset viewer.