Changeset feef1cd in mainline


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.

Location:
softfloat
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • softfloat/generic/comparison.c

    r3af72dc rfeef1cd  
    3535};
    3636
     37inline int isFloat64NaN(float64 d)
     38{       /* NaN : exp = 0x7ff and nonzero mantisa */
     39        return ((d.parts.exp==0x7FF)&&(d.parts.mantisa));
     40};
     41
    3742inline int isFloat32SigNaN(float32 f)
    3843{       /* SigNaN : exp = 0xff mantisa = 1xxxxx..x (binary), where at least one x is nonzero */
    3944        return ((f.parts.exp==0xFF)&&(f.parts.mantisa>0x400000));
     45};
     46
     47inline int isFloat64SigNaN(float64 d)
     48{       /* SigNaN : exp = 0x7ff mantisa = 1xxxxx..x (binary), where at least one x is nonzero */
     49        return ((d.parts.exp==0x7FF)&&(d.parts.mantisa>0x8000000000000ll));
    4050};
    4151
     
    4555};
    4656
     57inline int isFloat64Infinity(float64 d)
     58{
     59        return ((d.parts.exp==0x7FF)&&(d.parts.mantisa==0x0));
     60};
     61
    4762inline int isFloat32Zero(float32 f)
    4863{
    4964        return (((f.binary) & 0x7FFFFFFF) == 0);
     65}
     66
     67inline int isFloat64Zero(float64 d)
     68{
     69        return (((d.binary) & 0x7FFFFFFFFFFFFFFFll) == 0);
    5070}
    5171
     
    101121
    102122
     123
  • 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
  • softfloat/generic/softfloat.c

    r3af72dc rfeef1cd  
    7272}
    7373
     74float __divsf3(float a, float b)
     75{
     76        float32 fa, fb;
     77        fa.f=a;
     78        fb.f=b;
     79//      return  divFloat32(fa, fb).f;
     80};
     81
    7482float __negsf2(float a)
    7583{
     
    9098/* Conversion functions */
    9199
     100double __extendsfdf2(float a)
     101{
     102        float32 fa;
     103        fa.f = a;
     104        return convertFloat32ToFloat64(fa).d;
     105};
     106
     107float __truncdfsf2(double a)
     108{
     109        float64 da;
     110        da.d = a;
     111        return convertFloat64ToFloat32(da).f;
     112}
    92113/* Comparison functions */
    93114
  • softfloat/include/comparison.h

    r3af72dc rfeef1cd  
    3636inline int isFloat32Zero(float32 f);
    3737
     38inline int isFloat64NaN(float64 d);
     39inline int isFloat64SigNaN(float64 d);
     40
     41inline int isFloat64Infinity(float64 d);
     42inline int isFloat64Zero(float64 d);
     43
    3844inline int isFloat32eq(float32 a, float32 b);
    3945inline int isFloat32lt(float32 a, float32 b);
  • softfloat/include/conversion.h

    r3af72dc rfeef1cd  
    3030#define __CONVERSION_H__
    3131
     32float64 convertFloat32ToFloat64(float32 a);
     33
     34float32 convertFloat64ToFloat32(float64 a);
     35
    3236#endif
    3337
  • softfloat/include/sftypes.h

    r3af72dc rfeef1cd  
    2929#ifndef __SFTYPES_H__
    3030#define __SFTYPES_H__
    31 
    3231
    3332typedef union {
     
    8079
    8180#define FLOAT32_MANTISA_SIZE 23
     81#define FLOAT64_MANTISA_SIZE 52
    8282
    8383#define FLOAT32_BIAS 0x7F
Note: See TracChangeset for help on using the changeset viewer.