reverts commit 310e3b428cfd181b51723276e6563b90d670da06 (more info there) now functions check for sign bit in float. now hopefully this patch will cover entirety of areas it might affect
Unified · Split
| @@ -541,13 +541,19 @@ unsigned long long __fixunssfdi (float a1) · 540 unmodified lines | ||
| 541 | 541 | |
| 542 | 542 | l = MANT(fl1.l); |
| 543 | 543 | if (exp >= 41) |
| 544 | − return (unsigned long long)-1; | |
| 544 | + return (unsigned long long)-1; | |
| 545 | 545 | else if (exp >= 0) |
| 546 | − return (unsigned long long)l << exp; | |
| 546 | + if(SIGN(fl1.l)) | |
| 547 | + return (unsigned long long)-(l << exp); | |
| 548 | + else | |
| 549 | + return (unsigned long long)l << exp; | |
| 547 | 550 | else if (exp >= -23) |
| 548 | − return l >> -exp; | |
| 551 | + if(SIGN(fl1.l)) | |
| 552 | + return -(l >> -exp); | |
| 553 | + else | |
| 554 | + return l >> -exp; | |
| 549 | 555 | else |
| 550 | − return 0; | |
| 556 | + return 0; | |
| 551 | 557 | } |
| 552 | 558 | |
| 553 | 559 | long long __fixsfdi (float a1) |
| @@ -573,13 +579,19 @@ unsigned long long __fixunsdfdi (double a1) · 19 unmodified lines | ||
| 573 | 579 | l = MANTD_LL(dl1); |
| 574 | 580 | |
| 575 | 581 | if (exp >= 12) |
| 576 | − return (unsigned long long)-1; | |
| 582 | + return (unsigned long long)-1; | |
| 577 | 583 | else if (exp >= 0) |
| 578 | − return l << exp; | |
| 584 | + if(SIGND(dl1)) | |
| 585 | + return -(l >> exp); | |
| 586 | + else | |
| 587 | + return l << exp; | |
| 579 | 588 | else if (exp >= -52) |
| 580 | − return l >> -exp; | |
| 589 | + if(SIGND(dl1)) | |
| 590 | + return -(l >> -exp); | |
| 591 | + else | |
| 592 | + return l >> -exp; | |
| 581 | 593 | else |
| 582 | − return 0; | |
| 594 | + return 0; | |
| 583 | 595 | } |
| 584 | 596 | |
| 585 | 597 | long long __fixdfdi (double a1) |
| @@ -608,7 +620,12 @@ unsigned long long __fixunsxfdi (long double a1) · 22 unmodified lines | ||
| 608 | 620 | if (exp > 0) |
| 609 | 621 | return (unsigned long long)-1; |
| 610 | 622 | else if (exp >= -63) |
| 611 | − return l >> -exp; | |
| 623 | + { | |
| 624 | + if(SIGNLD(dl1)) | |
| 625 | + return -(l >> -exp); | |
| 626 | + else | |
| 627 | + return l >> -exp; | |
| 628 | + } | |
| 612 | 629 | else |
| 613 | 630 | return 0; |
| 614 | 631 | } |
| @@ -3478,7 +3478,7 @@ again: · 3477 unmodified lines | ||
| 3478 | 3478 | vtop->c.i = (vtop->c.ld != 0); |
| 3479 | 3479 | } else { |
| 3480 | 3480 | if(sf) |
| 3481 | − vtop->c.i = (int64_t)vtop->c.ld; | |
| 3481 | + vtop->c.i = vtop->c.ld; | |
| 3482 | 3482 | else if (sbt_bt == VT_LLONG || (PTR_SIZE == 8 && sbt == VT_PTR)) |
| 3483 | 3483 | ; |
| 3484 | 3484 | else if (sbt & VT_UNSIGNED) |