Subversion Repositories HelenOS-historic

Rev

Rev 572 | Rev 652 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 572 Rev 647
Line 1... Line -...
1
 
-
 
2
/*
1
/*
3
 * Copyright (C) 2005 Josef Cejka
2
 * Copyright (C) 2005 Josef Cejka
4
 * All rights reserved.
3
 * All rights reserved.
5
 *
4
 *
6
 * Redistribution and use in source and binary forms, with or without
5
 * Redistribution and use in source and binary forms, with or without
Line 26... Line 25...
26
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
 */
27
 */
29
 
28
 
30
#include<softfloat.h>
29
#include<softfloat.h>
-
 
30
#include<sftypes.h>
-
 
31
#include<arithmetic.h>
-
 
32
#include<conversion.h>
-
 
33
#include<comparison.h>
-
 
34
#include<other.h>
31
 
35
 
32
float32 addFloat32(float32 a, float32 b);
-
 
33
float32 subFloat32(float32 a, float32 b);
-
 
34
inline int isFloat32NaN(float32 f);
36
/* Arithmetic functions */
35
inline int isFloat32SigNaN(float32 f);
-
 
36
 
37
 
37
float __addsf3(float a, float b)
38
float __addsf3(float a, float b)
38
{
39
{
39
    float32 fa, fb;
40
    float32 fa, fb;
40
    fa.f=a;
41
    fa.f=a;
41
    fb.f=b;
42
    fb.f=b;
42
    if (fa.parts.sign!=fb.parts.sign) return subFloat32(fa,fb).f;
43
    if (fa.parts.sign!=fb.parts.sign) {
-
 
44
        if (fa.parts.sign) {
-
 
45
            fa.parts.sign=0;
-
 
46
            return subFloat32(fb,fa).f;
-
 
47
        };
-
 
48
        fb.parts.sign=0;
-
 
49
        return subFloat32(fa,fb).f;
-
 
50
    }
43
    return addFloat32(fa,fb).f;
51
    return addFloat32(fa,fb).f;
44
};
52
};
45
 
53
 
46
float __subsf3(float a, float b)
54
float __subsf3(float a, float b)
47
{
55
{
48
    float32 fa, fb;
56
    float32 fa, fb;
49
    fa.f=a;
57
    fa.f=a;
50
    fb.f=b;
58
    fb.f=b;
51
    if (fa.parts.sign!=fb.parts.sign) return addFloat32(fa,fb).f;
59
    if (fa.parts.sign!=fb.parts.sign) {
-
 
60
        fb.parts.sign!=fb.parts.sign;
-
 
61
        return addFloat32(fa,fb).f;
-
 
62
    }
52
    return subFloat32(fa,fb).f;
63
    return subFloat32(fa,fb).f;
53
};
64
};
54
 
65
 
55
float __negsf2(float a)
66
float __negsf2(float a)
56
{
67
{
Line 66... Line 77...
66
    fa.d=a;
77
    fa.d=a;
67
    fa.parts.sign=!fa.parts.sign;
78
    fa.parts.sign=!fa.parts.sign;
68
    return fa.d;
79
    return fa.d;
69
};
80
};
70
 
81
 
71
/** Add two Float32 numbers with same signs
-
 
72
 */
-
 
73
float32 addFloat32(float32 a, float32 b)
-
 
74
{
-
 
75
    int expdiff;
-
 
76
    __u32 exp1,exp2,mant1,mant2;
-
 
77
   
-
 
78
    expdiff=a.parts.exp - b.parts.exp;
-
 
79
    if (expdiff<0) {
-
 
80
        if (isFloat32NaN(b)) {
-
 
81
            //TODO: fix SigNaN
-
 
82
            if (isFloat32SigNaN(b)) {
-
 
83
            };
-
 
84
            return b;
-
 
85
        };
-
 
86
       
-
 
87
        if (b.parts.exp==0xFF) {
-
 
88
            return b;
-
 
89
        }
-
 
90
       
-
 
91
        mant1=b.parts.mantisa;
-
 
92
        exp1=b.parts.exp;
-
 
93
        mant2=a.parts.mantisa;
-
 
94
        exp2=a.parts.exp;
-
 
95
        expdiff*=-1;
-
 
96
    } else {
-
 
97
        if (isFloat32NaN(a)) {
-
 
98
            //TODO: fix SigNaN
-
 
99
            if ((isFloat32SigNaN(a))||(isFloat32SigNaN(b))) {
-
 
100
            };
-
 
101
            return a;
-
 
102
        };
-
 
103
       
-
 
104
        if (a.parts.exp==0xFF) {
-
 
105
            return a;
-
 
106
        }
-
 
107
       
-
 
108
        mant1=a.parts.mantisa;
-
 
109
        exp1=a.parts.exp;
-
 
110
        mant2=b.parts.mantisa;
-
 
111
        exp2=b.parts.exp;
-
 
112
    };
-
 
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
   
-
 
124
    // create some space for rounding
82
/* Conversion functions */
125
    mant1<<=6;
-
 
126
    mant2<<=6;
-
 
127
   
-
 
128
    mant1|=0x20000000; //add hidden bit
-
 
129
   
-
 
130
   
-
 
131
    if (exp2==0) {
-
 
132
        --expdiff; 
-
 
133
    } else {
-
 
134
        mant2|=0x20000000; //hidden bit
-
 
135
    };
-
 
136
   
-
 
137
    if (expdiff>24) {
-
 
138
         goto done;
-
 
139
         };
-
 
140
   
-
 
141
    mant2>>=expdiff;
-
 
142
    mant1+=mant2;
-
 
143
done:
-
 
144
    if (mant1&0x40000000) {
-
 
145
        ++exp1;
-
 
146
        mant1>>=1;
-
 
147
    };
-
 
148
   
-
 
149
    //rounding - if first bit after mantisa is set then round up
-
 
150
    mant1+=0x20;
-
 
151
   
-
 
152
    a.parts.exp=exp1;
-
 
153
    a.parts.mantisa=mant1>>6;
-
 
154
    return a;
-
 
155
};
-
 
156
 
-
 
157
/** Substract two float32 numbers with same signs
-
 
158
 */
-
 
159
float32 subFloat32(float32 a, float32 b)
-
 
160
{
-
 
161
   
-
 
162
   
-
 
163
};
-
 
164
 
83
 
165
inline int isFloat32NaN(float32 f)
-
 
166
{   /* NaN : exp = 0xff and nonzero mantisa */
84
/* Comparison functions */
167
    return ((f.parts.exp==0xFF)&&(f.parts.mantisa));
-
 
168
};
-
 
169
 
85
 
170
inline int isFloat32SigNaN(float32 f)
86
/* Other functions */
171
{   /* SigNaN : exp = 0xff mantisa = 1xxxxx..x (binary), where at least one x is nonzero */
-
 
172
    return ((f.parts.exp==0xFF)&&(f.parts.mantisa>0x400000));
-
 
173
};
-
 
174
 
87