Changeset a96c570 in mainline
- Timestamp:
- 2006-01-22T15:51:00Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- bff16dd
- Parents:
- 4a5abddd
- Location:
- softfloat
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
softfloat/generic/add.c
r4a5abddd ra96c570 133 133 { 134 134 int expdiff; 135 __u64 exp1, exp2, mant1, mant2; 135 __u32 exp1, exp2; 136 __u64 mant1, mant2; 136 137 137 138 expdiff = a.parts.exp - b.parts.exp; -
softfloat/generic/comparison.c
r4a5abddd ra96c570 41 41 42 42 inline int isFloat32SigNaN(float32 f) 43 { /* SigNaN : exp = 0xff mantisa = 1xxxxx..x (binary), where at least one x is nonzero */44 return ((f.parts.exp==0xFF)&&(f.parts.mantisa >0x400000));43 { /* SigNaN : exp = 0xff mantisa = 0xxxxx..x (binary), where at least one x is nonzero */ 44 return ((f.parts.exp==0xFF)&&(f.parts.mantisa<0x400000)&&(f.parts.mantisa)); 45 45 }; 46 46 47 47 inline 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));48 { /* SigNaN : exp = 0x7ff mantisa = 0xxxxx..x (binary), where at least one x is nonzero */ 49 return ((d.parts.exp==0x7FF)&&(d.parts.mantisa)&&(d.parts.mantisa<0x8000000000000ll)); 50 50 }; 51 51 -
softfloat/generic/softfloat.c
r4a5abddd ra96c570 57 57 } 58 58 59 double __adddf3(double a, double b) 60 { 61 float64 da, db; 62 da.d=a; 63 db.d=b; 64 if (da.parts.sign!=db.parts.sign) { 65 if (da.parts.sign) { 66 da.parts.sign=0; 67 return subFloat64(db,da).d; 68 }; 69 db.parts.sign=0; 70 return subFloat64(da,db).d; 71 } 72 return addFloat64(da,db).d; 73 } 74 59 75 float __subsf3(float a, float b) 60 76 { … … 67 83 } 68 84 return subFloat32(fa,fb).f; 85 } 86 87 double __subdf3(double a, double b) 88 { 89 float64 da, db; 90 da.d = a; 91 db.d = b; 92 if (da.parts.sign != db.parts.sign) { 93 db.parts.sign = !db.parts.sign; 94 return addFloat64(da, db).d; 95 } 96 return subFloat64(da, db).d; 69 97 } 70 98 -
softfloat/generic/sub.c
r4a5abddd ra96c570 27 27 */ 28 28 29 #include "sftypes.h" 30 #include "sub.h" 29 #include<sftypes.h> 30 #include<sub.h> 31 #include<comparison.h> 31 32 32 33 /** Subtract two float32 numbers with same signs … … 35 36 { 36 37 int expdiff; 37 __u32 exp1, exp2,mant1,mant2;38 __u32 exp1, exp2, mant1, mant2; 38 39 float32 result; 39 40 40 41 result.f = 0; 41 42 42 expdiff =a.parts.exp - b.parts.exp;43 if ((expdiff <0)||((expdiff==0)&&(a.parts.mantisa<b.parts.mantisa))) {43 expdiff = a.parts.exp - b.parts.exp; 44 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.mantisa < b.parts.mantisa))) { 44 45 if (isFloat32NaN(b)) { 45 46 //TODO: fix SigNaN … … 49 50 }; 50 51 51 if (b.parts.exp ==0xFF) {52 b.parts.sign =!b.parts.sign; /* num -(+-inf) = -+inf */52 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 53 b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ 53 54 return b; 54 55 } … … 56 57 result.parts.sign = !a.parts.sign; 57 58 58 mant1 =b.parts.mantisa;59 exp1 =b.parts.exp;60 mant2 =a.parts.mantisa;61 exp2 =a.parts.exp;62 expdiff *=-1;59 mant1 = b.parts.mantisa; 60 exp1 = b.parts.exp; 61 mant2 = a.parts.mantisa; 62 exp2 = a.parts.exp; 63 expdiff *= -1; 63 64 } else { 64 65 if (isFloat32NaN(a)) { 65 66 //TODO: fix SigNaN 66 if ( (isFloat32SigNaN(a))||(isFloat32SigNaN(b))) {67 }; 68 return a; 69 }; 70 71 if (a.parts.exp ==0xFF) {72 if (b.parts.exp ==0xFF) {67 if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { 68 }; 69 return a; 70 }; 71 72 if (a.parts.exp == FLOAT32_MAX_EXPONENT) { 73 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 73 74 /* inf - inf => nan */ 74 75 //TODO: fix exception … … 81 82 result.parts.sign = a.parts.sign; 82 83 83 mant1 =a.parts.mantisa;84 exp1 =a.parts.exp;85 mant2 =b.parts.mantisa;86 exp2 =b.parts.exp;87 }; 88 89 if (exp1 ==0) {84 mant1 = a.parts.mantisa; 85 exp1 = a.parts.exp; 86 mant2 = b.parts.mantisa; 87 exp2 = b.parts.exp; 88 }; 89 90 if (exp1 == 0) { 90 91 //both are denormalized 91 result.parts.mantisa =mant1-mant2;92 if (result.parts.mantisa >mant1) {92 result.parts.mantisa = mant1-mant2; 93 if (result.parts.mantisa > mant1) { 93 94 //TODO: underflow exception 94 95 return result; 95 96 }; 96 result.parts.exp =0;97 result.parts.exp = 0; 97 98 return result; 98 99 }; 99 100 // create some space for rounding 101 mant1<<=6; 102 mant2<<=6; 103 104 mant1|=0x20000000; //add hidden bit 105 106 107 if (exp2==0) { 100 101 /* add hidden bit */ 102 mant1 |= FLOAT32_HIDDEN_BIT_MASK; 103 104 if (exp2 == 0) { 105 /* denormalized */ 108 106 --expdiff; 109 107 } else { 110 mant2|=0x20000000; //hidden bit 111 }; 112 113 if (expdiff>24) { 108 /* normalized */ 109 mant2 |= FLOAT32_HIDDEN_BIT_MASK; 110 }; 111 112 /* create some space for rounding */ 113 mant1 <<= 6; 114 mant2 <<= 6; 115 116 if (expdiff > FLOAT32_MANTISA_SIZE + 1) { 114 117 goto done; 115 118 }; 116 119 117 mant1 = mant1 -(mant2>>expdiff);120 mant1 = mant1 - (mant2 >> expdiff); 118 121 done: 119 122 //TODO: find first nonzero digit and shift result and detect possibly underflow 120 while ((exp1 >0)&&(!(mant1&0x20000000))) {121 exp1--;123 while ((exp1 > 0) && (!(mant1 & (FLOAT32_HIDDEN_BIT_MASK << 6 )))) { 124 --exp1; 122 125 mant1 <<= 1; 123 126 /* TODO: fix underflow - mant1 == 0 does not necessary means underflow... */ 124 127 }; 125 128 126 / /rounding - if first bit after mantisa is set then round up129 /* rounding - if first bit after mantisa is set then round up */ 127 130 mant1 += 0x20; 128 131 129 if (mant1 &0x40000000) {132 if (mant1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 130 133 ++exp1; 131 mant1>>=1; 132 }; 133 134 result.parts.mantisa = ((mant1&(~0x20000000))>>6); /*Clear hidden bit and shift */ 134 mant1 >>= 1; 135 }; 136 137 /*Clear hidden bit and shift */ 138 result.parts.mantisa = ((mant1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); 135 139 result.parts.exp = exp1; 136 140 137 141 return result; 138 }; 139 142 } 143 144 /** Subtract two float64 numbers with same signs 145 */ 146 float64 subFloat64(float64 a, float64 b) 147 { 148 int expdiff; 149 __u32 exp1, exp2; 150 __u64 mant1, mant2; 151 float64 result; 152 153 result.d = 0; 154 155 expdiff = a.parts.exp - b.parts.exp; 156 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.mantisa < b.parts.mantisa))) { 157 if (isFloat64NaN(b)) { 158 //TODO: fix SigNaN 159 if (isFloat64SigNaN(b)) { 160 }; 161 return b; 162 }; 163 164 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 165 b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ 166 return b; 167 } 168 169 result.parts.sign = !a.parts.sign; 170 171 mant1 = b.parts.mantisa; 172 exp1 = b.parts.exp; 173 mant2 = a.parts.mantisa; 174 exp2 = a.parts.exp; 175 expdiff *= -1; 176 } else { 177 if (isFloat64NaN(a)) { 178 //TODO: fix SigNaN 179 if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { 180 }; 181 return a; 182 }; 183 184 if (a.parts.exp == FLOAT64_MAX_EXPONENT) { 185 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 186 /* inf - inf => nan */ 187 //TODO: fix exception 188 result.binary = FLOAT64_NAN; 189 return result; 190 }; 191 return a; 192 } 193 194 result.parts.sign = a.parts.sign; 195 196 mant1 = a.parts.mantisa; 197 exp1 = a.parts.exp; 198 mant2 = b.parts.mantisa; 199 exp2 = b.parts.exp; 200 }; 201 202 if (exp1 == 0) { 203 //both are denormalized 204 result.parts.mantisa = mant1 - mant2; 205 if (result.parts.mantisa > mant1) { 206 //TODO: underflow exception 207 return result; 208 }; 209 result.parts.exp = 0; 210 return result; 211 }; 212 213 /* add hidden bit */ 214 mant1 |= FLOAT64_HIDDEN_BIT_MASK; 215 216 if (exp2 == 0) { 217 /* denormalized */ 218 --expdiff; 219 } else { 220 /* normalized */ 221 mant2 |= FLOAT64_HIDDEN_BIT_MASK; 222 }; 223 224 /* create some space for rounding */ 225 mant1 <<= 6; 226 mant2 <<= 6; 227 228 if (expdiff > FLOAT64_MANTISA_SIZE + 1) { 229 goto done; 230 }; 231 232 mant1 = mant1 - (mant2 >> expdiff); 233 done: 234 //TODO: find first nonzero digit and shift result and detect possibly underflow 235 while ((exp1 > 0) && (!(mant1 & (FLOAT64_HIDDEN_BIT_MASK << 6 )))) { 236 --exp1; 237 mant1 <<= 1; 238 /* TODO: fix underflow - mant1 == 0 does not necessary means underflow... */ 239 }; 240 241 /* rounding - if first bit after mantisa is set then round up */ 242 mant1 += 0x20; 243 244 if (mant1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 245 ++exp1; 246 mant1 >>= 1; 247 }; 248 249 /*Clear hidden bit and shift */ 250 result.parts.mantisa = ((mant1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); 251 result.parts.exp = exp1; 252 253 return result; 254 } 255 -
softfloat/include/sftypes.h
r4a5abddd ra96c570 74 74 75 75 /* For recognizing NaNs or infinity use isFloat32NaN and is Float32Inf, comparing with this constants is not sufficient */ 76 #define FLOAT32_NAN 0x7F 80000177 #define FLOAT32_SIGNAN 0x7F C0000076 #define FLOAT32_NAN 0x7FC00001 77 #define FLOAT32_SIGNAN 0x7F800001 78 78 #define FLOAT32_INF 0x7F800000 79 80 #define FLOAT64_NAN 0x7FF8000000000001ll 81 #define FLOAT64_SIGNAN 0x7FF0000000000001ll 82 #define FLOAT64_INF 0x7FF0000000000000ll 79 83 80 84 #define FLOAT32_MANTISA_SIZE 23 … … 85 89 86 90 #define FLOAT32_MAX_EXPONENT 0xFF 87 #define FLOAT64_MAX_EXPONENT 0x 8FF91 #define FLOAT64_MAX_EXPONENT 0x7FF 88 92 89 93 #define FLOAT32_BIAS 0x7F -
softfloat/include/sub.h
r4a5abddd ra96c570 32 32 float32 subFloat32(float32 a, float32 b); 33 33 34 float64 subFloat64(float64 a, float64 b); 35 34 36 #endif 35 37
Note:
See TracChangeset
for help on using the changeset viewer.