Changeset 1266543 in mainline for softfloat/generic/mul.c
- Timestamp:
- 2006-02-07T00:41:18Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1a030b8
- Parents:
- b7e65d4
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
softfloat/generic/mul.c
rb7e65d4 r1266543 37 37 { 38 38 float32 result; 39 __u64 mant1, mant2;39 __u64 frac1, frac2; 40 40 __s32 exp; 41 41 … … 45 45 /* TODO: fix SigNaNs */ 46 46 if (isFloat32SigNaN(a)) { 47 result.parts. mantisa = a.parts.mantisa;47 result.parts.fraction = a.parts.fraction; 48 48 result.parts.exp = a.parts.exp; 49 49 return result; 50 50 }; 51 51 if (isFloat32SigNaN(b)) { /* TODO: fix SigNaN */ 52 result.parts. mantisa = b.parts.mantisa;52 result.parts.fraction = b.parts.fraction; 53 53 result.parts.exp = b.parts.exp; 54 54 return result; … … 65 65 return result; 66 66 } 67 result.parts. mantisa = a.parts.mantisa;67 result.parts.fraction = a.parts.fraction; 68 68 result.parts.exp = a.parts.exp; 69 69 return result; … … 76 76 return result; 77 77 } 78 result.parts. mantisa = b.parts.mantisa;78 result.parts.fraction = b.parts.fraction; 79 79 result.parts.exp = b.parts.exp; 80 80 return result; … … 96 96 /* FIXME: underflow */ 97 97 /* return signed zero */ 98 result.parts. mantisa= 0x0;98 result.parts.fraction = 0x0; 99 99 result.parts.exp = 0x0; 100 100 return result; 101 101 }; 102 102 103 mant1 = a.parts.mantisa;103 frac1 = a.parts.fraction; 104 104 if (a.parts.exp > 0) { 105 mant1 |= FLOAT32_HIDDEN_BIT_MASK;105 frac1 |= FLOAT32_HIDDEN_BIT_MASK; 106 106 } else { 107 107 ++exp; 108 108 }; 109 109 110 mant2 = b.parts.mantisa;110 frac2 = b.parts.fraction; 111 111 112 112 if (b.parts.exp > 0) { 113 mant2 |= FLOAT32_HIDDEN_BIT_MASK;113 frac2 |= FLOAT32_HIDDEN_BIT_MASK; 114 114 } else { 115 115 ++exp; 116 116 }; 117 117 118 mant1 <<= 1; /* one bit space for rounding */119 120 mant1 = mant1 * mant2;118 frac1 <<= 1; /* one bit space for rounding */ 119 120 frac1 = frac1 * frac2; 121 121 /* round and return */ 122 122 123 while ((exp < FLOAT32_MAX_EXPONENT) && ( mant1 >= ( 1 << (FLOAT32_MANTISA_SIZE + 2)))) {124 /* 23 bits of mantisa+ one more for hidden bit (all shifted 1 bit left)*/125 ++exp; 126 mant1 >>= 1;123 while ((exp < FLOAT32_MAX_EXPONENT) && (frac1 >= ( 1 << (FLOAT32_FRACTION_SIZE + 2)))) { 124 /* 23 bits of fraction + one more for hidden bit (all shifted 1 bit left)*/ 125 ++exp; 126 frac1 >>= 1; 127 127 }; 128 128 129 129 /* rounding */ 130 / /++mant1; /*FIXME: not works - without it is ok */131 mant1 >>= 1; /* shift off rounding space */132 133 if ((exp < FLOAT32_MAX_EXPONENT) && ( mant1 >= (1 << (FLOAT32_MANTISA_SIZE + 1)))) {134 ++exp; 135 mant1 >>= 1;130 /* ++frac1; FIXME: not works - without it is ok */ 131 frac1 >>= 1; /* shift off rounding space */ 132 133 if ((exp < FLOAT32_MAX_EXPONENT) && (frac1 >= (1 << (FLOAT32_FRACTION_SIZE + 1)))) { 134 ++exp; 135 frac1 >>= 1; 136 136 }; 137 137 … … 140 140 /* return infinity*/ 141 141 result.parts.exp = FLOAT32_MAX_EXPONENT; 142 result.parts. mantisa= 0x0;143 return result; 144 } 145 146 exp -= FLOAT32_ MANTISA_SIZE;147 148 if (exp <= FLOAT32_ MANTISA_SIZE) {142 result.parts.fraction = 0x0; 143 return result; 144 } 145 146 exp -= FLOAT32_FRACTION_SIZE; 147 148 if (exp <= FLOAT32_FRACTION_SIZE) { 149 149 /* denormalized number */ 150 mant1 >>= 1; /* denormalize */151 while (( mant1 > 0) && (exp < 0)) {152 mant1 >>= 1;150 frac1 >>= 1; /* denormalize */ 151 while ((frac1 > 0) && (exp < 0)) { 152 frac1 >>= 1; 153 153 ++exp; 154 154 }; 155 if ( mant1 == 0) {155 if (frac1 == 0) { 156 156 /* FIXME : underflow */ 157 157 result.parts.exp = 0; 158 result.parts. mantisa= 0;158 result.parts.fraction = 0; 159 159 return result; 160 160 }; 161 161 }; 162 162 result.parts.exp = exp; 163 result.parts. mantisa = mant1 & ( (1 << FLOAT32_MANTISA_SIZE) - 1);163 result.parts.fraction = frac1 & ( (1 << FLOAT32_FRACTION_SIZE) - 1); 164 164 165 165 return result; … … 173 173 { 174 174 float64 result; 175 __u64 mant1, mant2;175 __u64 frac1, frac2; 176 176 __s32 exp; 177 177 … … 181 181 /* TODO: fix SigNaNs */ 182 182 if (isFloat64SigNaN(a)) { 183 result.parts. mantisa = a.parts.mantisa;183 result.parts.fraction = a.parts.fraction; 184 184 result.parts.exp = a.parts.exp; 185 185 return result; 186 186 }; 187 187 if (isFloat64SigNaN(b)) { /* TODO: fix SigNaN */ 188 result.parts. mantisa = b.parts.mantisa;188 result.parts.fraction = b.parts.fraction; 189 189 result.parts.exp = b.parts.exp; 190 190 return result; … … 201 201 return result; 202 202 } 203 result.parts. mantisa = a.parts.mantisa;203 result.parts.fraction = a.parts.fraction; 204 204 result.parts.exp = a.parts.exp; 205 205 return result; … … 212 212 return result; 213 213 } 214 result.parts. mantisa = b.parts.mantisa;214 result.parts.fraction = b.parts.fraction; 215 215 result.parts.exp = b.parts.exp; 216 216 return result; … … 232 232 /* FIXME: underflow */ 233 233 /* return signed zero */ 234 result.parts. mantisa= 0x0;234 result.parts.fraction = 0x0; 235 235 result.parts.exp = 0x0; 236 236 return result; 237 237 }; 238 238 239 mant1 = a.parts.mantisa;239 frac1 = a.parts.fraction; 240 240 if (a.parts.exp > 0) { 241 mant1 |= FLOAT64_HIDDEN_BIT_MASK;241 frac1 |= FLOAT64_HIDDEN_BIT_MASK; 242 242 } else { 243 243 ++exp; 244 244 }; 245 245 246 mant2 = b.parts.mantisa;246 frac2 = b.parts.fraction; 247 247 248 248 if (b.parts.exp > 0) { 249 mant2 |= FLOAT64_HIDDEN_BIT_MASK;249 frac2 |= FLOAT64_HIDDEN_BIT_MASK; 250 250 } else { 251 251 ++exp; 252 252 }; 253 253 254 mant1 <<= 1; /* one bit space for rounding */255 256 mul64integers( mant1, mant2, &mant1, &mant2);254 frac1 <<= 1; /* one bit space for rounding */ 255 256 mul64integers(frac1, frac2, &frac1, &frac2); 257 257 258 258 /* round and return */ 259 /* FIXME: ugly soulution is to shift whole mant2 >> as in 32bit version259 /* FIXME: ugly soulution is to shift whole frac2 >> as in 32bit version 260 260 * Here is is more slower because we have to shift two numbers with carry 261 261 * Better is find first nonzero bit and make only one shift … … 264 264 */ 265 265 266 while ((exp < FLOAT64_MAX_EXPONENT) && ( mant2 > 0 )) {267 mant1 >>= 1;268 mant1 &= ((mant2 & 0x1) << 63);269 mant2 >>= 1;270 ++exp; 271 } 272 273 while ((exp < FLOAT64_MAX_EXPONENT) && ( mant1 >= ( (__u64)1 << (FLOAT64_MANTISA_SIZE + 2)))) {274 ++exp; 275 mant1 >>= 1;266 while ((exp < FLOAT64_MAX_EXPONENT) && (frac2 > 0 )) { 267 frac1 >>= 1; 268 frac1 &= ((frac2 & 0x1) << 63); 269 frac2 >>= 1; 270 ++exp; 271 } 272 273 while ((exp < FLOAT64_MAX_EXPONENT) && (frac1 >= ( (__u64)1 << (FLOAT64_FRACTION_SIZE + 2)))) { 274 ++exp; 275 frac1 >>= 1; 276 276 }; 277 277 278 278 /* rounding */ 279 / /++mant1; /*FIXME: not works - without it is ok */280 mant1 >>= 1; /* shift off rounding space */281 282 if ((exp < FLOAT64_MAX_EXPONENT) && ( mant1 >= ((__u64)1 << (FLOAT64_MANTISA_SIZE + 1)))) {283 ++exp; 284 mant1 >>= 1;279 /* ++frac1; FIXME: not works - without it is ok */ 280 frac1 >>= 1; /* shift off rounding space */ 281 282 if ((exp < FLOAT64_MAX_EXPONENT) && (frac1 >= ((__u64)1 << (FLOAT64_FRACTION_SIZE + 1)))) { 283 ++exp; 284 frac1 >>= 1; 285 285 }; 286 286 … … 289 289 /* return infinity*/ 290 290 result.parts.exp = FLOAT64_MAX_EXPONENT; 291 result.parts. mantisa= 0x0;292 return result; 293 } 294 295 exp -= FLOAT64_ MANTISA_SIZE;296 297 if (exp <= FLOAT64_ MANTISA_SIZE) {291 result.parts.fraction = 0x0; 292 return result; 293 } 294 295 exp -= FLOAT64_FRACTION_SIZE; 296 297 if (exp <= FLOAT64_FRACTION_SIZE) { 298 298 /* denormalized number */ 299 mant1 >>= 1; /* denormalize */300 while (( mant1 > 0) && (exp < 0)) {301 mant1 >>= 1;299 frac1 >>= 1; /* denormalize */ 300 while ((frac1 > 0) && (exp < 0)) { 301 frac1 >>= 1; 302 302 ++exp; 303 303 }; 304 if ( mant1 == 0) {304 if (frac1 == 0) { 305 305 /* FIXME : underflow */ 306 306 result.parts.exp = 0; 307 result.parts. mantisa= 0;307 result.parts.fraction = 0; 308 308 return result; 309 309 }; 310 310 }; 311 311 result.parts.exp = exp; 312 result.parts. mantisa = mant1 & ( ((__u64)1 << FLOAT64_MANTISA_SIZE) - 1);312 result.parts.fraction = frac1 & ( ((__u64)1 << FLOAT64_FRACTION_SIZE) - 1); 313 313 314 314 return result; … … 339 339 340 340 middle1 += middle2; 341 high += ((__u64)(middle1 < middle2) << 32) + middle1>>32;342 middle1 << 32;341 high += ((__u64)(middle1 < middle2) << 32) + (middle1 >> 32); 342 middle1 <<= 32; 343 343 low += middle1; 344 344 high += (low < middle1);
Note:
See TracChangeset
for help on using the changeset viewer.