Changes in uspace/lib/softfloat/generic/sub.c [9d58539:88d5c1e] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/softfloat/generic/sub.c
r9d58539 r88d5c1e 39 39 #include <common.h> 40 40 41 /** 42 * Subtract two single-precision floats with the same signs. 41 /** Subtract two single-precision floats with the same sign. 43 42 * 44 43 * @param a First input operand. 45 44 * @param b Second input operand. 45 * 46 46 * @return Result of substraction. 47 */ 48 float32 subFloat32(float32 a, float32 b) 47 * 48 */ 49 float32 sub_float32(float32 a, float32 b) 49 50 { 50 51 int expdiff; 51 52 uint32_t exp1, exp2, frac1, frac2; 52 53 float32 result; 53 54 result. f= 0;54 55 result.bin = 0; 55 56 56 57 expdiff = a.parts.exp - b.parts.exp; 57 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { 58 if (isFloat32NaN(b)) { 59 /* TODO: fix SigNaN */ 60 if (isFloat32SigNaN(b)) { 61 } 62 return b; 63 } 64 65 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 66 b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ 67 return b; 68 } 69 70 result.parts.sign = !a.parts.sign; 58 if ((expdiff < 0 ) || ((expdiff == 0) && 59 (a.parts.fraction < b.parts.fraction))) { 60 if (is_float32_nan(b)) { 61 if (is_float32_signan(b)) { 62 // TODO: fix SigNaN 63 } 64 65 return b; 66 } 67 68 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 69 /* num -(+-inf) = -+inf */ 70 b.parts.sign = !b.parts.sign; 71 return b; 72 } 73 74 result.parts.sign = !a.parts.sign; 71 75 72 76 frac1 = b.parts.fraction; … … 76 80 expdiff *= -1; 77 81 } else { 78 if (isFloat32NaN(a)) { 79 /* TODO: fix SigNaN */ 80 if (isFloat32SigNaN(a) || isFloat32SigNaN(b)) { 81 } 82 return a; 83 } 84 85 if (a.parts.exp == FLOAT32_MAX_EXPONENT) { 82 if (is_float32_nan(a)) { 83 if ((is_float32_signan(a)) || (is_float32_signan(b))) { 84 // TODO: fix SigNaN 85 } 86 87 return a; 88 } 89 90 if (a.parts.exp == FLOAT32_MAX_EXPONENT) { 86 91 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 87 92 /* inf - inf => nan */ 88 / * TODO: fix exception */89 result.bin ary= FLOAT32_NAN;93 // TODO: fix exception 94 result.bin = FLOAT32_NAN; 90 95 return result; 91 96 } 97 92 98 return a; 93 99 } … … 98 104 exp1 = a.parts.exp; 99 105 frac2 = b.parts.fraction; 100 exp2 = b.parts.exp; 106 exp2 = b.parts.exp; 101 107 } 102 108 … … 105 111 result.parts.fraction = frac1 - frac2; 106 112 if (result.parts.fraction > frac1) { 107 / * TODO: underflow exception */113 // TODO: underflow exception 108 114 return result; 109 115 } 116 110 117 result.parts.exp = 0; 111 118 return result; 112 119 } 113 120 114 121 /* add hidden bit */ 115 frac1 |= FLOAT32_HIDDEN_BIT_MASK; 122 frac1 |= FLOAT32_HIDDEN_BIT_MASK; 116 123 117 124 if (exp2 == 0) { 118 125 /* denormalized */ 119 --expdiff; 126 --expdiff; 120 127 } else { 121 128 /* normalized */ … … 127 134 frac2 <<= 6; 128 135 129 if (expdiff > FLOAT32_FRACTION_SIZE + 1) {136 if (expdiff > FLOAT32_FRACTION_SIZE + 1) 130 137 goto done; 131 }132 138 133 139 frac1 = frac1 - (frac2 >> expdiff); 134 140 135 141 done: 136 142 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ … … 143 149 /* rounding - if first bit after fraction is set then round up */ 144 150 frac1 += 0x20; 145 151 146 152 if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 147 153 ++exp1; … … 150 156 151 157 /* Clear hidden bit and shift */ 152 result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); 158 result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); 153 159 result.parts.exp = exp1; 154 160 … … 156 162 } 157 163 158 /** 159 * Subtract two double-precision floats with the same signs. 164 /** Subtract two double-precision floats with the same sign. 160 165 * 161 166 * @param a First input operand. 162 167 * @param b Second input operand. 168 * 163 169 * @return Result of substraction. 164 */ 165 float64 subFloat64(float64 a, float64 b) 170 * 171 */ 172 float64 sub_float64(float64 a, float64 b) 166 173 { 167 174 int expdiff; … … 169 176 uint64_t frac1, frac2; 170 177 float64 result; 171 172 result. d= 0;178 179 result.bin = 0; 173 180 174 181 expdiff = a.parts.exp - b.parts.exp; 175 if ((expdiff < 0 ) || ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { 176 if (isFloat64NaN(b)) { 177 /* TODO: fix SigNaN */ 178 if (isFloat64SigNaN(b)) { 179 } 180 return b; 181 } 182 183 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 184 b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ 185 return b; 186 } 187 188 result.parts.sign = !a.parts.sign; 182 if ((expdiff < 0 ) || 183 ((expdiff == 0) && (a.parts.fraction < b.parts.fraction))) { 184 if (is_float64_nan(b)) { 185 if (is_float64_signan(b)) { 186 // TODO: fix SigNaN 187 } 188 189 return b; 190 } 191 192 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 193 /* num -(+-inf) = -+inf */ 194 b.parts.sign = !b.parts.sign; 195 return b; 196 } 197 198 result.parts.sign = !a.parts.sign; 189 199 190 200 frac1 = b.parts.fraction; … … 194 204 expdiff *= -1; 195 205 } else { 196 if (isFloat64NaN(a)) { 197 /* TODO: fix SigNaN */ 198 if (isFloat64SigNaN(a) || isFloat64SigNaN(b)) { 199 } 200 return a; 201 } 202 203 if (a.parts.exp == FLOAT64_MAX_EXPONENT) { 206 if (is_float64_nan(a)) { 207 if (is_float64_signan(a) || is_float64_signan(b)) { 208 // TODO: fix SigNaN 209 } 210 211 return a; 212 } 213 214 if (a.parts.exp == FLOAT64_MAX_EXPONENT) { 204 215 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 205 216 /* inf - inf => nan */ 206 / * TODO: fix exception */207 result.bin ary= FLOAT64_NAN;217 // TODO: fix exception 218 result.bin = FLOAT64_NAN; 208 219 return result; 209 220 } 221 210 222 return a; 211 223 } … … 216 228 exp1 = a.parts.exp; 217 229 frac2 = b.parts.fraction; 218 exp2 = b.parts.exp; 230 exp2 = b.parts.exp; 219 231 } 220 232 … … 223 235 result.parts.fraction = frac1 - frac2; 224 236 if (result.parts.fraction > frac1) { 225 / * TODO: underflow exception */237 // TODO: underflow exception 226 238 return result; 227 239 } 240 228 241 result.parts.exp = 0; 229 242 return result; 230 243 } 231 244 232 245 /* add hidden bit */ 233 frac1 |= FLOAT64_HIDDEN_BIT_MASK; 246 frac1 |= FLOAT64_HIDDEN_BIT_MASK; 234 247 235 248 if (exp2 == 0) { 236 249 /* denormalized */ 237 --expdiff; 250 --expdiff; 238 251 } else { 239 252 /* normalized */ … … 245 258 frac2 <<= 6; 246 259 247 if (expdiff > FLOAT64_FRACTION_SIZE + 1) {260 if (expdiff > FLOAT64_FRACTION_SIZE + 1) 248 261 goto done; 249 }250 262 251 263 frac1 = frac1 - (frac2 >> expdiff); 252 264 253 265 done: 254 266 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ … … 261 273 /* rounding - if first bit after fraction is set then round up */ 262 274 frac1 += 0x20; 263 275 264 276 if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 265 277 ++exp1; … … 268 280 269 281 /* Clear hidden bit and shift */ 270 result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); 282 result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); 271 283 result.parts.exp = exp1; 272 284 … … 274 286 } 275 287 276 /** 277 * Subtract two quadruple-precision floats with the same signs. 288 /** Subtract two quadruple-precision floats with the same sign. 278 289 * 279 290 * @param a First input operand. 280 291 * @param b Second input operand. 292 * 281 293 * @return Result of substraction. 282 */ 283 float128 subFloat128(float128 a, float128 b) 294 * 295 */ 296 float128 sub_float128(float128 a, float128 b) 284 297 { 285 298 int expdiff; … … 287 300 uint64_t frac1_hi, frac1_lo, frac2_hi, frac2_lo, tmp_hi, tmp_lo; 288 301 float128 result; 289 290 result.bin ary.hi = 0;291 result.bin ary.lo = 0;292 302 303 result.bin.hi = 0; 304 result.bin.lo = 0; 305 293 306 expdiff = a.parts.exp - b.parts.exp; 294 307 if ((expdiff < 0 ) || ((expdiff == 0) && 295 308 lt128(a.parts.frac_hi, a.parts.frac_lo, b.parts.frac_hi, b.parts.frac_lo))) { 296 if (isFloat128NaN(b)) { 297 /* TODO: fix SigNaN */ 298 if (isFloat128SigNaN(b)) { 299 } 300 return b; 301 } 302 309 if (is_float128_nan(b)) { 310 if (is_float128_signan(b)) { 311 // TODO: fix SigNaN 312 } 313 314 return b; 315 } 316 303 317 if (b.parts.exp == FLOAT128_MAX_EXPONENT) { 304 b.parts.sign = !b.parts.sign; /* num -(+-inf) = -+inf */ 305 return b; 306 } 307 318 /* num -(+-inf) = -+inf */ 319 b.parts.sign = !b.parts.sign; 320 return b; 321 } 322 308 323 result.parts.sign = !a.parts.sign; 309 324 310 325 frac1_hi = b.parts.frac_hi; 311 326 frac1_lo = b.parts.frac_lo; … … 316 331 expdiff *= -1; 317 332 } else { 318 if (isFloat128NaN(a)) { 319 /* TODO: fix SigNaN */ 320 if (isFloat128SigNaN(a) || isFloat128SigNaN(b)) { 321 } 322 return a; 323 } 324 333 if (is_float128_nan(a)) { 334 if (is_float128_signan(a) || is_float128_signan(b)) { 335 // TODO: fix SigNaN 336 } 337 338 return a; 339 } 340 325 341 if (a.parts.exp == FLOAT128_MAX_EXPONENT) { 326 342 if (b.parts.exp == FLOAT128_MAX_EXPONENT) { 327 343 /* inf - inf => nan */ 328 / * TODO: fix exception */329 result.bin ary.hi = FLOAT128_NAN_HI;330 result.bin ary.lo = FLOAT128_NAN_LO;344 // TODO: fix exception 345 result.bin.hi = FLOAT128_NAN_HI; 346 result.bin.lo = FLOAT128_NAN_LO; 331 347 return result; 332 348 } 333 349 return a; 334 350 } 335 351 336 352 result.parts.sign = a.parts.sign; 337 353 338 354 frac1_hi = a.parts.frac_hi; 339 355 frac1_lo = a.parts.frac_lo; … … 343 359 exp2 = b.parts.exp; 344 360 } 345 361 346 362 if (exp1 == 0) { 347 363 /* both are denormalized */ … … 350 366 result.parts.frac_lo = tmp_lo; 351 367 if (lt128(frac1_hi, frac1_lo, result.parts.frac_hi, result.parts.frac_lo)) { 352 / * TODO: underflow exception */368 // TODO: underflow exception 353 369 return result; 354 370 } 371 355 372 result.parts.exp = 0; 356 373 return result; 357 374 } 358 375 359 376 /* add hidden bit */ 360 377 or128(frac1_hi, frac1_lo, 361 378 FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 362 379 &frac1_hi, &frac1_lo); 363 380 364 381 if (exp2 == 0) { 365 382 /* denormalized */ … … 371 388 &frac2_hi, &frac2_lo); 372 389 } 373 390 374 391 /* create some space for rounding */ 375 392 lshift128(frac1_hi, frac1_lo, 6, &frac1_hi, &frac1_lo); 376 393 lshift128(frac2_hi, frac2_lo, 6, &frac2_hi, &frac2_lo); 377 378 if (expdiff > FLOAT128_FRACTION_SIZE + 1) {394 395 if (expdiff > FLOAT128_FRACTION_SIZE + 1) 379 396 goto done; 380 } 381 397 382 398 rshift128(frac2_hi, frac2_lo, expdiff, &tmp_hi, &tmp_lo); 383 399 sub128(frac1_hi, frac1_lo, tmp_hi, tmp_lo, &frac1_hi, &frac1_lo); 384 400 385 401 done: 386 402 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ … … 392 408 lshift128(frac1_hi, frac1_lo, 1, &frac1_hi, &frac1_lo); 393 409 /* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ 394 410 395 411 lshift128(FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 6, 396 412 &tmp_hi, &tmp_lo); 397 413 and128(frac1_hi, frac1_lo, tmp_hi, tmp_lo, &tmp_hi, &tmp_lo); 398 414 } 399 415 400 416 /* rounding - if first bit after fraction is set then round up */ 401 417 add128(frac1_hi, frac1_lo, 0x0ll, 0x20ll, &frac1_hi, &frac1_lo); 402 418 403 419 lshift128(FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 7, 404 420 &tmp_hi, &tmp_lo); … … 408 424 rshift128(frac1_hi, frac1_lo, 1, &frac1_hi, &frac1_lo); 409 425 } 410 426 411 427 /* Clear hidden bit and shift */ 412 428 rshift128(frac1_hi, frac1_lo, 6, &frac1_hi, &frac1_lo); … … 416 432 result.parts.frac_hi = tmp_hi; 417 433 result.parts.frac_lo = tmp_lo; 418 434 419 435 result.parts.exp = exp1; 420 436 421 437 return result; 422 438 }
Note:
See TracChangeset
for help on using the changeset viewer.