Changeset a35b458 in mainline for uspace/lib/softfloat/add.c
- Timestamp:
- 2018-03-02T20:10:49Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f1380b7
- Parents:
- 3061bc1
- git-author:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-02-28 17:38:31)
- git-committer:
- Jiří Zárevúcky <zarevucky.jiri@…> (2018-03-02 20:10:49)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/softfloat/add.c
r3061bc1 ra35b458 49 49 int expdiff; 50 50 uint32_t exp1, exp2, frac1, frac2; 51 51 52 52 expdiff = a.parts.exp - b.parts.exp; 53 53 if (expdiff < 0) { … … 59 59 return b; 60 60 } 61 61 62 62 if (b.parts.exp == FLOAT32_MAX_EXPONENT) { 63 63 return b; 64 64 } 65 65 66 66 frac1 = b.parts.fraction; 67 67 exp1 = b.parts.exp; … … 76 76 return (is_float32_nan(a) ? a : b); 77 77 } 78 78 79 79 if (a.parts.exp == FLOAT32_MAX_EXPONENT) { 80 80 return a; 81 81 } 82 82 83 83 frac1 = a.parts.fraction; 84 84 exp1 = a.parts.exp; … … 86 86 exp2 = b.parts.exp; 87 87 } 88 88 89 89 if (exp1 == 0) { 90 90 /* both are denormalized */ … … 97 97 return a; 98 98 } 99 99 100 100 frac1 |= FLOAT32_HIDDEN_BIT_MASK; /* add hidden bit */ 101 101 … … 107 107 frac2 |= FLOAT32_HIDDEN_BIT_MASK; 108 108 } 109 109 110 110 /* create some space for rounding */ 111 111 frac1 <<= 6; 112 112 frac2 <<= 6; 113 113 114 114 if (expdiff < (FLOAT32_FRACTION_SIZE + 2)) { 115 115 frac2 >>= expdiff; … … 120 120 return a; 121 121 } 122 122 123 123 if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 124 124 ++exp1; 125 125 frac1 >>= 1; 126 126 } 127 127 128 128 /* rounding - if first bit after fraction is set then round up */ 129 129 frac1 += (0x1 << 5); 130 130 131 131 if (frac1 & (FLOAT32_HIDDEN_BIT_MASK << 7)) { 132 132 /* rounding overflow */ … … 134 134 frac1 >>= 1; 135 135 } 136 136 137 137 if ((exp1 == FLOAT32_MAX_EXPONENT) || (exp2 > exp1)) { 138 138 /* overflow - set infinity as result */ … … 141 141 return a; 142 142 } 143 143 144 144 a.parts.exp = exp1; 145 145 146 146 /* Clear hidden bit and shift */ 147 147 a.parts.fraction = ((frac1 >> 6) & (~FLOAT32_HIDDEN_BIT_MASK)); … … 160 160 uint32_t exp1, exp2; 161 161 uint64_t frac1, frac2; 162 162 163 163 expdiff = ((int) a.parts.exp) - b.parts.exp; 164 164 if (expdiff < 0) { … … 170 170 return b; 171 171 } 172 172 173 173 /* b is infinity and a not */ 174 174 if (b.parts.exp == FLOAT64_MAX_EXPONENT) { 175 175 return b; 176 176 } 177 177 178 178 frac1 = b.parts.fraction; 179 179 exp1 = b.parts.exp; … … 188 188 return a; 189 189 } 190 190 191 191 /* a is infinity and b not */ 192 192 if (a.parts.exp == FLOAT64_MAX_EXPONENT) { 193 193 return a; 194 194 } 195 195 196 196 frac1 = a.parts.fraction; 197 197 exp1 = a.parts.exp; … … 199 199 exp2 = b.parts.exp; 200 200 } 201 201 202 202 if (exp1 == 0) { 203 203 /* both are denormalized */ … … 210 210 return a; 211 211 } 212 212 213 213 /* add hidden bit - frac1 is sure not denormalized */ 214 214 frac1 |= FLOAT64_HIDDEN_BIT_MASK; … … 222 222 frac2 |= FLOAT64_HIDDEN_BIT_MASK; 223 223 } 224 224 225 225 /* create some space for rounding */ 226 226 frac1 <<= 6; 227 227 frac2 <<= 6; 228 228 229 229 if (expdiff < (FLOAT64_FRACTION_SIZE + 2)) { 230 230 frac2 >>= expdiff; … … 235 235 return a; 236 236 } 237 237 238 238 if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 239 239 ++exp1; 240 240 frac1 >>= 1; 241 241 } 242 242 243 243 /* rounding - if first bit after fraction is set then round up */ 244 244 frac1 += (0x1 << 5); 245 245 246 246 if (frac1 & (FLOAT64_HIDDEN_BIT_MASK << 7)) { 247 247 /* rounding overflow */ … … 249 249 frac1 >>= 1; 250 250 } 251 251 252 252 if ((exp1 == FLOAT64_MAX_EXPONENT) || (exp2 > exp1)) { 253 253 /* overflow - set infinity as result */ … … 256 256 return a; 257 257 } 258 258 259 259 a.parts.exp = exp1; 260 260 /* Clear hidden bit and shift */ … … 400 400 401 401 a.parts.exp = exp1; 402 402 403 403 /* Clear hidden bit and shift */ 404 404 rshift128(frac1_hi, frac1_lo, 6, &frac1_hi, &frac1_lo); … … 419 419 float32_u ua; 420 420 ua.val = a; 421 421 422 422 float32_u ub; 423 423 ub.val = b; 424 424 425 425 float32_u res; 426 426 427 427 if (ua.data.parts.sign != ub.data.parts.sign) { 428 428 if (ua.data.parts.sign) { … … 435 435 } else 436 436 res.data = add_float32(ua.data, ub.data); 437 437 438 438 return res.val; 439 439 } … … 443 443 float32_u ua; 444 444 ua.val = a; 445 445 446 446 float32_u ub; 447 447 ub.val = b; 448 448 449 449 float32_u res; 450 450 451 451 if (ua.data.parts.sign != ub.data.parts.sign) { 452 452 if (ua.data.parts.sign) { … … 459 459 } else 460 460 res.data = add_float32(ua.data, ub.data); 461 461 462 462 return res.val; 463 463 } … … 471 471 float64_u ua; 472 472 ua.val = a; 473 473 474 474 float64_u ub; 475 475 ub.val = b; 476 476 477 477 float64_u res; 478 478 479 479 if (ua.data.parts.sign != ub.data.parts.sign) { 480 480 if (ua.data.parts.sign) { … … 487 487 } else 488 488 res.data = add_float64(ua.data, ub.data); 489 489 490 490 return res.val; 491 491 } … … 495 495 float64_u ua; 496 496 ua.val = a; 497 497 498 498 float64_u ub; 499 499 ub.val = b; 500 500 501 501 float64_u res; 502 502 503 503 if (ua.data.parts.sign != ub.data.parts.sign) { 504 504 if (ua.data.parts.sign) { … … 511 511 } else 512 512 res.data = add_float64(ua.data, ub.data); 513 513 514 514 return res.val; 515 515 } … … 523 523 float128_u ua; 524 524 ua.val = a; 525 525 526 526 float128_u ub; 527 527 ub.val = b; 528 528 529 529 float128_u res; 530 530 531 531 if (ua.data.parts.sign != ub.data.parts.sign) { 532 532 if (ua.data.parts.sign) { … … 539 539 } else 540 540 res.data = add_float128(ua.data, ub.data); 541 541 542 542 return res.val; 543 543 }
Note:
See TracChangeset
for help on using the changeset viewer.