Changeset feef1cd in mainline for softfloat/generic/conversion.c


Ignore:
Timestamp:
2006-01-08T19:39:07Z (19 years ago)
Author:
Josef Cejka <malyzelenyhnus@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
56a39dde
Parents:
3af72dc
Message:

Added new function for testint 64 bit floats and functions for 32↔64 bit conversion.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • softfloat/generic/conversion.c

    r3af72dc rfeef1cd  
    2727 */
    2828
     29#include "sftypes.h"
     30#include "conversion.h"
     31
     32float64 convertFloat32ToFloat64(float32 a)
     33{
     34        float64 result;
     35        __u64 mant;
     36       
     37        result.parts.sign = a.parts.sign;
     38        result.parts.mantisa = a.parts.mantisa;
     39        result.parts.mantisa <<= (FLOAT64_MANTISA_SIZE - FLOAT32_MANTISA_SIZE );
     40       
     41        if ((isFloat32Infinity(a))||(isFloat32NaN(a))) {
     42                result.parts.exp = 0x7FF;
     43                /* TODO; check if its correct for SigNaNs*/
     44                return result;
     45        };
     46       
     47        result.parts.exp = a.parts.exp + ( (int)FLOAT64_BIAS - FLOAT32_BIAS );
     48        if (a.parts.exp == 0) {
     49                /* normalize denormalized numbers */
     50
     51                if (result.parts.mantisa == 0ll) { /* fix zero */
     52                        result.parts.exp = 0ll;
     53                        return result;
     54                }
     55                       
     56                mant = result.parts.mantisa;
     57               
     58                while (!(mant & (0x10000000000000ll))) {
     59                        mant <<= 1;
     60                        --result.parts.exp;
     61                };
     62                result.parts.mantisa = mant;
     63        };
     64       
     65        return result;
     66       
     67};
     68
     69float32 convertFloat64ToFloat32(float64 a)
     70{
     71        float32 result;
     72        __s32 exp;
     73        __u64 mant;
     74       
     75        result.parts.sign = a.parts.sign;
     76       
     77        if (isFloat64NaN(a)) {
     78               
     79                result.parts.exp = 0xFF;
     80               
     81                if (isFloat64SigNaN(a)) {
     82                        result.parts.mantisa = 0x800000; /* set first bit of mantisa nonzero */
     83                        return result;
     84                }
     85       
     86                result.parts.mantisa = 0x1; /* mantisa nonzero but its first bit is zero */
     87                return result;
     88        };
     89
     90        if (isFloat64Infinity(a)) {
     91                result.parts.mantisa = 0;
     92                result.parts.exp = 0xFF;
     93                return result;
     94        };
     95
     96        exp = (int)a.parts.exp - FLOAT64_BIAS + FLOAT32_BIAS;
     97       
     98        if (exp >= 0xFF) {
     99                /*FIXME: overflow*/
     100                result.parts.mantisa = 0;
     101                result.parts.exp = 0xFF;
     102                return result;
     103               
     104        } else if (exp <= 0 ) {
     105               
     106                /* underflow or denormalized */
     107               
     108                result.parts.exp = 0;
     109               
     110                exp *= -1;     
     111               
     112                if (exp > FLOAT32_MANTISA_SIZE ) {
     113                        /* FIXME: underflow */
     114                        result.parts.mantisa = 0;
     115                        return result;
     116                };
     117               
     118                /* denormalized */
     119               
     120                mant = result.parts.mantisa >> 1;
     121                mant |= 0x10000000000000ll; /* denormalize and set hidden bit */
     122               
     123                while (exp > 0) {
     124                        --exp;
     125                        mant >>= 1;
     126                };
     127                result.parts.mantisa = mant;
     128               
     129                return result;
     130        };
     131
     132        result.parts.exp = exp;
     133        result.parts.mantisa = a.parts.mantisa >> (FLOAT64_MANTISA_SIZE - FLOAT32_MANTISA_SIZE);
     134        return result;
     135};
     136
Note: See TracChangeset for help on using the changeset viewer.