Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/softfloat/generic/sub.c

    r88d5c1e r9d58539  
    3939#include <common.h>
    4040
    41 /** Subtract two single-precision floats with the same sign.
     41/**
     42 * Subtract two single-precision floats with the same signs.
    4243 *
    4344 * @param a First input operand.
    4445 * @param b Second input operand.
    45  *
    4646 * @return Result of substraction.
    47  *
    48  */
    49 float32 sub_float32(float32 a, float32 b)
     47 */
     48float32 subFloat32(float32 a, float32 b)
    5049{
    5150        int expdiff;
    5251        uint32_t exp1, exp2, frac1, frac2;
    5352        float32 result;
    54        
    55         result.bin = 0;
     53
     54        result.f = 0;
    5655       
    5756        expdiff = a.parts.exp - b.parts.exp;
    58         if ((expdiff < 0 ) || ((expdiff == 0) &&
    59             (a.parts.fraction < b.parts.fraction))) {
    60                 if (is_float32_nan(b)) {
    61                         if (is_float32_signan(b)) {
    62                                 // TODO: fix SigNaN
    63                         }
    64                        
    65                         return b;
    66                 }
    67                
    68                 if (b.parts.exp == FLOAT32_MAX_EXPONENT) {
    69                         /* num -(+-inf) = -+inf */
    70                         b.parts.sign = !b.parts.sign;
    71                         return b;
    72                 }
    73                
    74                 result.parts.sign = !a.parts.sign;
     57        if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) {
     58                if (isFloat32NaN(b)) {
     59                        /* TODO: fix SigNaN */
     60                        if (isFloat32SigNaN(b)) {
     61                        }
     62                        return b;
     63                }
     64               
     65                if (b.parts.exp == FLOAT32_MAX_EXPONENT) {
     66                        b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */
     67                        return b;
     68                }
     69               
     70                result.parts.sign = !a.parts.sign;
    7571               
    7672                frac1 = b.parts.fraction;
     
    8076                expdiff *= -1;
    8177        } else {
    82                 if (is_float32_nan(a)) {
    83                         if ((is_float32_signan(a)) || (is_float32_signan(b))) {
    84                                 // TODO: fix SigNaN
    85                         }
    86                        
    87                         return a;
    88                 }
    89                
    90                 if (a.parts.exp == FLOAT32_MAX_EXPONENT) {
     78                if (isFloat32NaN(a)) {
     79                        /* TODO: fix SigNaN */
     80                        if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) {
     81                        }
     82                        return a;
     83                }
     84               
     85                if (a.parts.exp == FLOAT32_MAX_EXPONENT) {
    9186                        if (b.parts.exp == FLOAT32_MAX_EXPONENT) {
    9287                                /* inf - inf => nan */
    93                                 // TODO: fix exception
    94                                 result.bin = FLOAT32_NAN;
     88                                /* TODO: fix exception */
     89                                result.binary = FLOAT32_NAN;
    9590                                return result;
    9691                        }
    97                        
    9892                        return a;
    9993                }
     
    10498                exp1 = a.parts.exp;
    10599                frac2 = b.parts.fraction;
    106                 exp2 = b.parts.exp;
     100                exp2 = b.parts.exp;     
    107101        }
    108102       
     
    111105                result.parts.fraction = frac1 - frac2;
    112106                if (result.parts.fraction > frac1) {
    113                         // TODO: underflow exception
     107                        /* TODO: underflow exception */
    114108                        return result;
    115109                }
    116                
    117110                result.parts.exp = 0;
    118111                return result;
    119112        }
    120        
     113
    121114        /* add hidden bit */
    122         frac1 |= FLOAT32_HIDDEN_BIT_MASK;
     115        frac1 |= FLOAT32_HIDDEN_BIT_MASK; 
    123116       
    124117        if (exp2 == 0) {
    125118                /* denormalized */
    126                 --expdiff;
     119                --expdiff;     
    127120        } else {
    128121                /* normalized */
     
    134127        frac2 <<= 6;
    135128       
    136         if (expdiff > FLOAT32_FRACTION_SIZE + 1)
     129        if (expdiff > FLOAT32_FRACTION_SIZE + 1) {
    137130                goto done;
     131        }
    138132       
    139133        frac1 = frac1 - (frac2 >> expdiff);
    140        
     134
    141135done:
    142136        /* TODO: find first nonzero digit and shift result and detect possibly underflow */
     
    149143        /* rounding - if first bit after fraction is set then round up */
    150144        frac1 += 0x20;
    151        
     145
    152146        if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) {
    153147                ++exp1;
     
    156150       
    157151        /* Clear hidden bit and shift */
    158         result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK));
     152        result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); 
    159153        result.parts.exp = exp1;
    160154       
     
    162156}
    163157
    164 /** Subtract two double-precision floats with the same sign.
     158/**
     159 * Subtract two double-precision floats with the same signs.
    165160 *
    166161 * @param a First input operand.
    167162 * @param b Second input operand.
    168  *
    169163 * @return Result of substraction.
    170  *
    171  */
    172 float64 sub_float64(float64 a, float64 b)
     164 */
     165float64 subFloat64(float64 a, float64 b)
    173166{
    174167        int expdiff;
     
    176169        uint64_t frac1, frac2;
    177170        float64 result;
    178        
    179         result.bin = 0;
     171
     172        result.d = 0;
    180173       
    181174        expdiff = a.parts.exp - b.parts.exp;
    182         if ((expdiff < 0 ) ||
    183             ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) {
    184                 if (is_float64_nan(b)) {
    185                         if (is_float64_signan(b)) {
    186                                 // TODO: fix SigNaN
    187                         }
    188                        
    189                         return b;
    190                 }
    191                
    192                 if (b.parts.exp == FLOAT64_MAX_EXPONENT) {
    193                         /* num -(+-inf) = -+inf */
    194                         b.parts.sign = !b.parts.sign;
    195                         return b;
    196                 }
    197                
    198                 result.parts.sign = !a.parts.sign;
     175        if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) {
     176                if (isFloat64NaN(b)) {
     177                        /* TODO: fix SigNaN */
     178                        if (isFloat64SigNaN(b)) {
     179                        }
     180                        return b;
     181                }
     182               
     183                if (b.parts.exp == FLOAT64_MAX_EXPONENT) {
     184                        b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */
     185                        return b;
     186                }
     187               
     188                result.parts.sign = !a.parts.sign;
    199189               
    200190                frac1 = b.parts.fraction;
     
    204194                expdiff *= -1;
    205195        } else {
    206                 if (is_float64_nan(a)) {
    207                         if (is_float64_signan(a) || is_float64_signan(b)) {
    208                                 // TODO: fix SigNaN
    209                         }
    210                        
    211                         return a;
    212                 }
    213                
    214                 if (a.parts.exp == FLOAT64_MAX_EXPONENT) {
     196                if (isFloat64NaN(a)) {
     197                        /* TODO: fix SigNaN */
     198                        if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) {
     199                        }
     200                        return a;
     201                }
     202               
     203                if (a.parts.exp == FLOAT64_MAX_EXPONENT) {
    215204                        if (b.parts.exp == FLOAT64_MAX_EXPONENT) {
    216205                                /* inf - inf => nan */
    217                                 // TODO: fix exception
    218                                 result.bin = FLOAT64_NAN;
     206                                /* TODO: fix exception */
     207                                result.binary = FLOAT64_NAN;
    219208                                return result;
    220209                        }
    221                        
    222210                        return a;
    223211                }
     
    228216                exp1 = a.parts.exp;
    229217                frac2 = b.parts.fraction;
    230                 exp2 = b.parts.exp;
     218                exp2 = b.parts.exp;     
    231219        }
    232220       
     
    235223                result.parts.fraction = frac1 - frac2;
    236224                if (result.parts.fraction > frac1) {
    237                         // TODO: underflow exception
     225                        /* TODO: underflow exception */
    238226                        return result;
    239227                }
    240                
    241228                result.parts.exp = 0;
    242229                return result;
    243230        }
    244        
     231
    245232        /* add hidden bit */
    246         frac1 |= FLOAT64_HIDDEN_BIT_MASK;
     233        frac1 |= FLOAT64_HIDDEN_BIT_MASK; 
    247234       
    248235        if (exp2 == 0) {
    249236                /* denormalized */
    250                 --expdiff;
     237                --expdiff;     
    251238        } else {
    252239                /* normalized */
     
    258245        frac2 <<= 6;
    259246       
    260         if (expdiff > FLOAT64_FRACTION_SIZE + 1)
     247        if (expdiff > FLOAT64_FRACTION_SIZE + 1) {
    261248                goto done;
     249        }
    262250       
    263251        frac1 = frac1 - (frac2 >> expdiff);
    264        
     252
    265253done:
    266254        /* TODO: find first nonzero digit and shift result and detect possibly underflow */
     
    273261        /* rounding - if first bit after fraction is set then round up */
    274262        frac1 += 0x20;
    275        
     263
    276264        if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) {
    277265                ++exp1;
     
    280268       
    281269        /* Clear hidden bit and shift */
    282         result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK));
     270        result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); 
    283271        result.parts.exp = exp1;
    284272       
     
    286274}
    287275
    288 /** Subtract two quadruple-precision floats with the same sign.
     276/**
     277 * Subtract two quadruple-precision floats with the same signs.
    289278 *
    290279 * @param a First input operand.
    291280 * @param b Second input operand.
    292  *
    293281 * @return Result of substraction.
    294  *
    295  */
    296 float128 sub_float128(float128 a, float128 b)
     282 */
     283float128 subFloat128(float128 a, float128 b)
    297284{
    298285        int expdiff;
     
    300287        uint64_t frac1_hi, frac1_lo, frac2_hi, frac2_lo, tmp_hi, tmp_lo;
    301288        float128 result;
    302        
    303         result.bin.hi = 0;
    304         result.bin.lo = 0;
    305        
     289
     290        result.binary.hi = 0;
     291        result.binary.lo = 0;
     292
    306293        expdiff = a.parts.exp - b.parts.exp;
    307294        if ((expdiff < 0 ) || ((expdiff == 0) &&
    308295            lt128(a.parts.frac_hi, a.parts.frac_lo, b.parts.frac_hi, b.parts.frac_lo))) {
    309                 if (is_float128_nan(b)) {
    310                         if (is_float128_signan(b)) {
    311                                 // TODO: fix SigNaN
    312                         }
    313                        
    314                         return b;
    315                 }
    316                
     296                if (isFloat128NaN(b)) {
     297                        /* TODO: fix SigNaN */
     298                        if (isFloat128SigNaN(b)) {
     299                        }
     300                        return b;
     301                }
     302
    317303                if (b.parts.exp == FLOAT128_MAX_EXPONENT) {
    318                         /* num -(+-inf) = -+inf */
    319                         b.parts.sign = !b.parts.sign;
    320                         return b;
    321                 }
    322                
     304                        b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */
     305                        return b;
     306                }
     307
    323308                result.parts.sign = !a.parts.sign;
    324                
     309
    325310                frac1_hi = b.parts.frac_hi;
    326311                frac1_lo = b.parts.frac_lo;
     
    331316                expdiff *= -1;
    332317        } else {
    333                 if (is_float128_nan(a)) {
    334                         if (is_float128_signan(a) || is_float128_signan(b)) {
    335                                 // TODO: fix SigNaN
    336                         }
    337                        
    338                         return a;
    339                 }
    340                
     318                if (isFloat128NaN(a)) {
     319                        /* TODO: fix SigNaN */
     320                        if (isFloat128SigNaN(a) || isFloat128SigNaN(b)) {
     321                        }
     322                        return a;
     323                }
     324
    341325                if (a.parts.exp == FLOAT128_MAX_EXPONENT) {
    342326                        if (b.parts.exp == FLOAT128_MAX_EXPONENT) {
    343327                                /* inf - inf => nan */
    344                                 // TODO: fix exception
    345                                 result.bin.hi = FLOAT128_NAN_HI;
    346                                 result.bin.lo = FLOAT128_NAN_LO;
     328                                /* TODO: fix exception */
     329                                result.binary.hi = FLOAT128_NAN_HI;
     330                                result.binary.lo = FLOAT128_NAN_LO;
    347331                                return result;
    348332                        }
    349333                        return a;
    350334                }
    351                
     335
    352336                result.parts.sign = a.parts.sign;
    353                
     337
    354338                frac1_hi = a.parts.frac_hi;
    355339                frac1_lo = a.parts.frac_lo;
     
    359343                exp2 = b.parts.exp;
    360344        }
    361        
     345
    362346        if (exp1 == 0) {
    363347                /* both are denormalized */
     
    366350                result.parts.frac_lo = tmp_lo;
    367351                if (lt128(frac1_hi, frac1_lo, result.parts.frac_hi, result.parts.frac_lo)) {
    368                         // TODO: underflow exception
     352                        /* TODO: underflow exception */
    369353                        return result;
    370354                }
    371                
    372355                result.parts.exp = 0;
    373356                return result;
    374357        }
    375        
     358
    376359        /* add hidden bit */
    377360        or128(frac1_hi, frac1_lo,
    378361            FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO,
    379362            &frac1_hi, &frac1_lo);
    380        
     363
    381364        if (exp2 == 0) {
    382365                /* denormalized */
     
    388371                    &frac2_hi, &frac2_lo);
    389372        }
    390        
     373
    391374        /* create some space for rounding */
    392375        lshift128(frac1_hi, frac1_lo, 6, &frac1_hi, &frac1_lo);
    393376        lshift128(frac2_hi, frac2_lo, 6, &frac2_hi, &frac2_lo);
    394        
    395         if (expdiff > FLOAT128_FRACTION_SIZE + 1)
     377
     378        if (expdiff > FLOAT128_FRACTION_SIZE + 1) {
    396379                goto done;
    397        
     380        }
     381
    398382        rshift128(frac2_hi, frac2_lo, expdiff, &tmp_hi, &tmp_lo);
    399383        sub128(frac1_hi, frac1_lo, tmp_hi, tmp_lo, &frac1_hi, &frac1_lo);
    400        
     384
    401385done:
    402386        /* TODO: find first nonzero digit and shift result and detect possibly underflow */
     
    408392                lshift128(frac1_hi, frac1_lo, 1, &frac1_hi, &frac1_lo);
    409393                /* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */
    410                
     394
    411395                lshift128(FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 6,
    412396                    &tmp_hi, &tmp_lo);
    413397                and128(frac1_hi, frac1_lo, tmp_hi, tmp_lo, &tmp_hi, &tmp_lo);
    414398        }
    415        
     399
    416400        /* rounding - if first bit after fraction is set then round up */
    417401        add128(frac1_hi, frac1_lo, 0x0ll, 0x20ll, &frac1_hi, &frac1_lo);
    418        
     402
    419403        lshift128(FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 7,
    420404           &tmp_hi, &tmp_lo);
     
    424408                rshift128(frac1_hi, frac1_lo, 1, &frac1_hi, &frac1_lo);
    425409        }
    426        
     410
    427411        /* Clear hidden bit and shift */
    428412        rshift128(frac1_hi, frac1_lo, 6, &frac1_hi, &frac1_lo);
     
    432416        result.parts.frac_hi = tmp_hi;
    433417        result.parts.frac_lo = tmp_lo;
    434        
     418
    435419        result.parts.exp = exp1;
    436        
     420
    437421        return result;
    438422}
Note: See TracChangeset for help on using the changeset viewer.