Changes in uspace/lib/softfloat/sub.c [c0c38c7c:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/softfloat/sub.c
rc0c38c7c ra35b458 52 52 uint32_t exp1, exp2, frac1, frac2; 53 53 float32 result; 54 54 55 55 result.bin = 0; 56 56 57 57 expdiff = a.parts.exp - b.parts.exp; 58 58 if ((expdiff < 0 ) || ((expdiff == 0) && … … 62 62 // TODO: fix SigNaN 63 63 } 64 64 65 65 return b; 66 66 } 67 67 68 68 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 69 69 /* num -(+-inf) = -+inf */ … … 71 71 return b; 72 72 } 73 73 74 74 result.parts.sign = !a.parts.sign; 75 75 76 76 frac1 = b.parts.fraction; 77 77 exp1 = b.parts.exp; … … 84 84 // TODO: fix SigNaN 85 85 } 86 86 87 87 return a; 88 88 } 89 89 90 90 if (a.parts.exp == FLOAT32_MAX_EXPONENT) { 91 91 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { … … 95 95 return result; 96 96 } 97 97 98 98 return a; 99 99 } 100 100 101 101 result.parts.sign = a.parts.sign; 102 102 103 103 frac1 = a.parts.fraction; 104 104 exp1 = a.parts.exp; … … 106 106 exp2 = b.parts.exp; 107 107 } 108 108 109 109 if (exp1 == 0) { 110 110 /* both are denormalized */ … … 114 114 return result; 115 115 } 116 116 117 117 result.parts.exp = 0; 118 118 return result; 119 119 } 120 120 121 121 /* add hidden bit */ 122 122 frac1 |= FLOAT32_HIDDEN_BIT_MASK; 123 123 124 124 if (exp2 == 0) { 125 125 /* denormalized */ … … 129 129 frac2 |= FLOAT32_HIDDEN_BIT_MASK; 130 130 } 131 131 132 132 /* create some space for rounding */ 133 133 frac1 <<= 6; 134 134 frac2 <<= 6; 135 135 136 136 if (expdiff > FLOAT32_FRACTION_SIZE + 1) 137 137 goto done; 138 138 139 139 frac1 = frac1 - (frac2 >> expdiff); 140 140 141 141 done: 142 142 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ … … 146 146 /* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ 147 147 } 148 148 149 149 /* rounding - if first bit after fraction is set then round up */ 150 150 frac1 += 0x20; 151 151 152 152 if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 153 153 ++exp1; 154 154 frac1 >>= 1; 155 155 } 156 156 157 157 /* Clear hidden bit and shift */ 158 158 result.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); 159 159 result.parts.exp = exp1; 160 160 161 161 return result; 162 162 } … … 176 176 uint64_t frac1, frac2; 177 177 float64 result; 178 178 179 179 result.bin = 0; 180 180 181 181 expdiff = a.parts.exp - b.parts.exp; 182 182 if ((expdiff < 0 ) || … … 186 186 // TODO: fix SigNaN 187 187 } 188 188 189 189 return b; 190 190 } 191 191 192 192 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 193 193 /* num -(+-inf) = -+inf */ … … 195 195 return b; 196 196 } 197 197 198 198 result.parts.sign = !a.parts.sign; 199 199 200 200 frac1 = b.parts.fraction; 201 201 exp1 = b.parts.exp; … … 208 208 // TODO: fix SigNaN 209 209 } 210 210 211 211 return a; 212 212 } 213 213 214 214 if (a.parts.exp == FLOAT64_MAX_EXPONENT) { 215 215 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { … … 219 219 return result; 220 220 } 221 221 222 222 return a; 223 223 } 224 224 225 225 result.parts.sign = a.parts.sign; 226 226 227 227 frac1 = a.parts.fraction; 228 228 exp1 = a.parts.exp; … … 230 230 exp2 = b.parts.exp; 231 231 } 232 232 233 233 if (exp1 == 0) { 234 234 /* both are denormalized */ … … 238 238 return result; 239 239 } 240 240 241 241 result.parts.exp = 0; 242 242 return result; 243 243 } 244 244 245 245 /* add hidden bit */ 246 246 frac1 |= FLOAT64_HIDDEN_BIT_MASK; 247 247 248 248 if (exp2 == 0) { 249 249 /* denormalized */ … … 253 253 frac2 |= FLOAT64_HIDDEN_BIT_MASK; 254 254 } 255 255 256 256 /* create some space for rounding */ 257 257 frac1 <<= 6; 258 258 frac2 <<= 6; 259 259 260 260 if (expdiff > FLOAT64_FRACTION_SIZE + 1) 261 261 goto done; 262 262 263 263 frac1 = frac1 - (frac2 >> expdiff); 264 264 265 265 done: 266 266 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ … … 270 270 /* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ 271 271 } 272 272 273 273 /* rounding - if first bit after fraction is set then round up */ 274 274 frac1 += 0x20; 275 275 276 276 if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 277 277 ++exp1; 278 278 frac1 >>= 1; 279 279 } 280 280 281 281 /* Clear hidden bit and shift */ 282 282 result.parts.fraction = ((frac1 >> 6) & (~FLOAT64_HIDDEN_BIT_MASK)); 283 283 result.parts.exp = exp1; 284 284 285 285 return result; 286 286 } … … 300 300 uint64_t frac1_hi, frac1_lo, frac2_hi, frac2_lo, tmp_hi, tmp_lo; 301 301 float128 result; 302 302 303 303 result.bin.hi = 0; 304 304 result.bin.lo = 0; 305 305 306 306 expdiff = a.parts.exp - b.parts.exp; 307 307 if ((expdiff < 0 ) || ((expdiff == 0) && … … 311 311 // TODO: fix SigNaN 312 312 } 313 313 314 314 return b; 315 315 } 316 316 317 317 if (b.parts.exp == FLOAT128_MAX_EXPONENT) { 318 318 /* num -(+-inf) = -+inf */ … … 320 320 return b; 321 321 } 322 322 323 323 result.parts.sign = !a.parts.sign; 324 324 325 325 frac1_hi = b.parts.frac_hi; 326 326 frac1_lo = b.parts.frac_lo; … … 335 335 // TODO: fix SigNaN 336 336 } 337 337 338 338 return a; 339 339 } 340 340 341 341 if (a.parts.exp == FLOAT128_MAX_EXPONENT) { 342 342 if (b.parts.exp == FLOAT128_MAX_EXPONENT) { … … 349 349 return a; 350 350 } 351 351 352 352 result.parts.sign = a.parts.sign; 353 353 354 354 frac1_hi = a.parts.frac_hi; 355 355 frac1_lo = a.parts.frac_lo; … … 359 359 exp2 = b.parts.exp; 360 360 } 361 361 362 362 if (exp1 == 0) { 363 363 /* both are denormalized */ … … 369 369 return result; 370 370 } 371 371 372 372 result.parts.exp = 0; 373 373 return result; 374 374 } 375 375 376 376 /* add hidden bit */ 377 377 or128(frac1_hi, frac1_lo, 378 378 FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 379 379 &frac1_hi, &frac1_lo); 380 380 381 381 if (exp2 == 0) { 382 382 /* denormalized */ … … 388 388 &frac2_hi, &frac2_lo); 389 389 } 390 390 391 391 /* create some space for rounding */ 392 392 lshift128(frac1_hi, frac1_lo, 6, &frac1_hi, &frac1_lo); 393 393 lshift128(frac2_hi, frac2_lo, 6, &frac2_hi, &frac2_lo); 394 394 395 395 if (expdiff > FLOAT128_FRACTION_SIZE + 1) 396 396 goto done; 397 397 398 398 rshift128(frac2_hi, frac2_lo, expdiff, &tmp_hi, &tmp_lo); 399 399 sub128(frac1_hi, frac1_lo, tmp_hi, tmp_lo, &frac1_hi, &frac1_lo); 400 400 401 401 done: 402 402 /* TODO: find first nonzero digit and shift result and detect possibly underflow */ … … 408 408 lshift128(frac1_hi, frac1_lo, 1, &frac1_hi, &frac1_lo); 409 409 /* TODO: fix underflow - frac1 == 0 does not necessary means underflow... */ 410 410 411 411 lshift128(FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 6, 412 412 &tmp_hi, &tmp_lo); 413 413 and128(frac1_hi, frac1_lo, tmp_hi, tmp_lo, &tmp_hi, &tmp_lo); 414 414 } 415 415 416 416 /* rounding - if first bit after fraction is set then round up */ 417 417 add128(frac1_hi, frac1_lo, 0x0ll, 0x20ll, &frac1_hi, &frac1_lo); 418 418 419 419 lshift128(FLOAT128_HIDDEN_BIT_MASK_HI, FLOAT128_HIDDEN_BIT_MASK_LO, 7, 420 420 &tmp_hi, &tmp_lo); … … 424 424 rshift128(frac1_hi, frac1_lo, 1, &frac1_hi, &frac1_lo); 425 425 } 426 426 427 427 /* Clear hidden bit and shift */ 428 428 rshift128(frac1_hi, frac1_lo, 6, &frac1_hi, &frac1_lo); … … 432 432 result.parts.frac_hi = tmp_hi; 433 433 result.parts.frac_lo = tmp_lo; 434 434 435 435 result.parts.exp = exp1; 436 436 437 437 return result; 438 438 } … … 444 444 float32_u ua; 445 445 ua.val = a; 446 446 447 447 float32_u ub; 448 448 ub.val = b; 449 449 450 450 float32_u res; 451 451 452 452 if (ua.data.parts.sign != ub.data.parts.sign) { 453 453 ub.data.parts.sign = !ub.data.parts.sign; … … 455 455 } else 456 456 res.data = sub_float32(ua.data, ub.data); 457 457 458 458 return res.val; 459 459 } … … 463 463 float32_u ua; 464 464 ua.val = a; 465 465 466 466 float32_u ub; 467 467 ub.val = b; 468 468 469 469 float32_u res; 470 470 471 471 if (ua.data.parts.sign != ub.data.parts.sign) { 472 472 ub.data.parts.sign = !ub.data.parts.sign; … … 474 474 } else 475 475 res.data = sub_float32(ua.data, ub.data); 476 476 477 477 return res.val; 478 478 } … … 486 486 float64_u ua; 487 487 ua.val = a; 488 488 489 489 float64_u ub; 490 490 ub.val = b; 491 491 492 492 float64_u res; 493 493 494 494 if (ua.data.parts.sign != ub.data.parts.sign) { 495 495 ub.data.parts.sign = !ub.data.parts.sign; … … 497 497 } else 498 498 res.data = sub_float64(ua.data, ub.data); 499 499 500 500 return res.val; 501 501 } … … 505 505 float64_u ua; 506 506 ua.val = a; 507 507 508 508 float64_u ub; 509 509 ub.val = b; 510 510 511 511 float64_u res; 512 512 513 513 if (ua.data.parts.sign != ub.data.parts.sign) { 514 514 ub.data.parts.sign = !ub.data.parts.sign; … … 516 516 } else 517 517 res.data = sub_float64(ua.data, ub.data); 518 518 519 519 return res.val; 520 520 } … … 528 528 float128_u ua; 529 529 ua.val = a; 530 530 531 531 float128_u ub; 532 532 ub.val = b; 533 533 534 534 float128_u res; 535 535 536 536 if (ua.data.parts.sign != ub.data.parts.sign) { 537 537 ub.data.parts.sign = !ub.data.parts.sign; … … 539 539 } else 540 540 res.data = sub_float128(ua.data, ub.data); 541 541 542 542 return res.val; 543 543 }
Note:
See TracChangeset
for help on using the changeset viewer.