Changeset 75a23abf in mainline


Ignore:
Timestamp:
2005-12-23T17:44:31Z (19 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3af72dc
Parents:
cf4a823
Message:

Softfloat - function for float subtraction added.

Location:
softfloat
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • softfloat/generic/arithmetic.c

    rcf4a823 r75a23abf  
    112112        mant1+=0x20;
    113113       
     114        if (mant1&0x40000000) {
     115                ++exp1;
     116                mant1>>=1;
     117        };
     118       
    114119        a.parts.exp=exp1;
    115         a.parts.mantisa=mant1>>6;
     120        a.parts.mantisa = ((mant1&(~0x20000000))>>6); /*Clear hidden bit and shift */
    116121        return a;
    117122};
    118123
    119 /** Substract two float32 numbers with same signs
     124/** Subtract two float32 numbers with same signs
    120125 */
    121126float32 subFloat32(float32 a, float32 b)
    122127{
    123        
    124        
     128        int expdiff;
     129        __u32 exp1,exp2,mant1,mant2;
     130        float32 result;
     131
     132        result.f = 0;
     133       
     134        expdiff=a.parts.exp - b.parts.exp;
     135        if ((expdiff<0)||((expdiff==0)&&(a.parts.mantisa<b.parts.mantisa))) {
     136                if (isFloat32NaN(b)) {
     137                        //TODO: fix SigNaN
     138                        if (isFloat32SigNaN(b)) {
     139                        };
     140                        return b;
     141                };
     142               
     143                if (b.parts.exp==0xFF) {
     144                        b.parts.sign=!b.parts.sign; /* num -(+-inf) = -+inf */
     145                        return b;
     146                }
     147               
     148                result.parts.sign = !a.parts.sign;
     149               
     150                mant1=b.parts.mantisa;
     151                exp1=b.parts.exp;
     152                mant2=a.parts.mantisa;
     153                exp2=a.parts.exp;
     154                expdiff*=-1;
     155        } else {
     156                if (isFloat32NaN(a)) {
     157                        //TODO: fix SigNaN
     158                        if ((isFloat32SigNaN(a))||(isFloat32SigNaN(b))) {
     159                        };
     160                        return a;
     161                };
     162               
     163                if (a.parts.exp==0xFF) {
     164                        if (b.parts.exp==0xFF) {
     165                                /* inf - inf => nan */
     166                                //TODO: fix exception
     167                                result.binary = FLOAT32_NAN;
     168                                return result;
     169                        };
     170                        return a;
     171                }
     172               
     173                result.parts.sign = a.parts.sign;
     174               
     175                mant1=a.parts.mantisa;
     176                exp1=a.parts.exp;
     177                mant2=b.parts.mantisa;
     178                exp2=b.parts.exp;
     179               
     180
     181               
     182        };
     183       
     184        if (exp1==0) {
     185                //both are denormalized
     186                result.parts.mantisa=mant1-mant2;
     187                if (result.parts.mantisa>mant1) {
     188                        //TODO: underflow exception
     189                        return result;
     190                };
     191                result.parts.exp=0;
     192                return result;
     193        };
     194       
     195        // create some space for rounding
     196        mant1<<=6;
     197        mant2<<=6;
     198       
     199        mant1|=0x20000000; //add hidden bit
     200       
     201       
     202        if (exp2==0) {
     203                --expdiff;     
     204        } else {
     205                mant2|=0x20000000; //hidden bit
     206        };
     207       
     208        if (expdiff>24) {
     209             goto done;
     210             };
     211       
     212        mant1 = mant1-(mant2>>expdiff);
     213done:
     214       
     215        //TODO: find first nonzero digit and shift result and detect possibly underflow
     216        while ((exp1>0)&&(!(mant1&0x20000000))) {
     217                exp1--;
     218                mant1 <<= 1;
     219                if(mant1 == 0) {
     220                        /* Realy is it an underflow? ... */
     221                        //TODO: fix underflow
     222                };
     223        };
     224       
     225        //rounding - if first bit after mantisa is set then round up   
     226        mant1 += 0x20;
     227
     228        if (mant1&0x40000000) {
     229                ++exp1;
     230                mant1>>=1;
     231        };
     232       
     233        result.parts.mantisa = ((mant1&(~0x20000000))>>6); /*Clear hidden bit and shift */
     234        result.parts.exp = exp1;
     235       
     236        return result;
    125237};
    126238
  • softfloat/include/sftypes.h

    rcf4a823 r75a23abf  
    7474#define FLOAT64_MIN
    7575
     76/* For recognizing NaNs or infinity use isFloat32NaN and is Float32Inf, comparing with this constants is not sufficient */
     77#define FLOAT32_NAN 0x7F800001
     78#define FLOAT32_SIGNAN 0x7FC00000
     79#define FLOAT32_INF 0x7F800000
     80
    7681#define FLOAT32_BIAS 0xF7
    7782#define FLOAT64_BIAS 0x3FF
Note: See TracChangeset for help on using the changeset viewer.