Unified · Split
| @@ -533,21 +533,22 @@ unsigned long long __fixunssfdi (float a1) · 532 unmodified lines | ||
| 533 | 533 | register union float_long fl1; |
| 534 | 534 | register int exp; |
| 535 | 535 | register unsigned long l; |
| 536 | − | |
| 536 | + int s; | |
| 537 | 537 | fl1.f = a1; |
| 538 | 538 | |
| 539 | 539 | if (fl1.l == 0) |
| 540 | − return (0); | |
| 540 | + return 0; | |
| 541 | 541 | |
| 542 | 542 | exp = EXP (fl1.l) - EXCESS - 24; |
| 543 | 543 | |
| 544 | 544 | l = MANT(fl1.l); |
| 545 | − if (exp >= 41) | |
| 546 | − return (unsigned long long)-1; | |
| 545 | + s = SIGN(fl1.l)? -1: 1; | |
| 546 | + if (exp >= 64) | |
| 547 | + return (unsigned long long)-1; | |
| 547 | 548 | else if (exp >= 0) |
| 548 | − return (unsigned long long)l << exp; | |
| 549 | + return ((unsigned long long)l << exp)*s; | |
| 549 | 550 | else if (exp >= -23) |
| 550 | − return l >> -exp; | |
| 551 | + return (l >> -exp)*s; | |
| 551 | 552 | else |
| 552 | 553 | return 0; |
| 553 | 554 | } |
| @@ -557,22 +558,22 @@ unsigned long long __fixunsdfdi (double a1) · 3 unmodified lines | ||
| 557 | 558 | register union double_long dl1; |
| 558 | 559 | register int exp; |
| 559 | 560 | register unsigned long long l; |
| 560 | − | |
| 561 | + int s; | |
| 561 | 562 | dl1.d = a1; |
| 562 | 563 | |
| 563 | 564 | if (dl1.ll == 0) |
| 564 | − return (0); | |
| 565 | + return (0); | |
| 565 | 566 | |
| 566 | 567 | exp = EXPD (dl1) - EXCESSD - 53; |
| 567 | 568 | |
| 568 | 569 | l = MANTD_LL(dl1); |
| 569 | − | |
| 570 | − if (exp >= 12) | |
| 571 | − return (unsigned long long)-1; | |
| 570 | + s = SIGND(dl1)? -1: 1; | |
| 571 | + if (exp >= 64) | |
| 572 | + return (unsigned long long)-1; | |
| 572 | 573 | else if (exp >= 0) |
| 573 | − return l << exp; | |
| 574 | + return (l << exp)*s; | |
| 574 | 575 | else if (exp >= -52) |
| 575 | − return l >> -exp; | |
| 576 | + return (l >> -exp)*s; | |
| 576 | 577 | else |
| 577 | 578 | return 0; |
| 578 | 579 | } |
| @@ -582,20 +583,22 @@ unsigned long long __fixunsxfdi (long double a1) · 3 unmodified lines | ||
| 582 | 583 | register union ldouble_long dl1; |
| 583 | 584 | register int exp; |
| 584 | 585 | register unsigned long long l; |
| 585 | − | |
| 586 | + int s; | |
| 586 | 587 | dl1.ld = a1; |
| 587 | 588 | |
| 588 | 589 | if (dl1.l.lower == 0 && dl1.l.upper == 0) |
| 589 | − return (0); | |
| 590 | + return (0); | |
| 590 | 591 | |
| 591 | 592 | exp = EXPLD (dl1) - EXCESSLD - 64; |
| 592 | − | |
| 593 | + s = SIGNLD(dl1)? -1: 1; | |
| 593 | 594 | l = dl1.l.lower; |
| 594 | 595 | |
| 595 | − if (exp > 0) | |
| 596 | − return (unsigned long long)-1; | |
| 597 | − else if (exp >= -63) | |
| 598 | − return l >> -exp; | |
| 596 | + if (exp >= 64) | |
| 597 | + return (unsigned long long)-1; | |
| 598 | + else if (exp >= 0) | |
| 599 | + return ((unsigned long long)l << exp)*s; | |
| 600 | + else if (exp >= -64) | |
| 601 | + return (l >> -exp)*s; | |
| 599 | 602 | else |
| 600 | 603 | return 0; |
| 601 | 604 | } |
| @@ -637,7 +640,7 @@ extern void abort(void); · 35 unmodified lines | ||
| 637 | 640 | #endif |
| 638 | 641 | |
| 639 | 642 | enum __va_arg_type { |
| 640 | − __va_gen_reg, __va_float_reg, __va_stack | |
| 643 | + __va_gen_reg, __va_float_reg, __va_ld_reg, __va_stack | |
| 641 | 644 | }; |
| 642 | 645 | |
| 643 | 646 | //This should be in sync with the declaration on our include/stdarg.h |
| @@ -1729,7 +1729,6 @@ void prefix ## fcast(type a)\ · 1728 unmodified lines | ||
| 1729 | 1729 | printf("ftof: %f %f %Lf\n", fa, da, la);\ |
| 1730 | 1730 | ia = (int)a;\ |
| 1731 | 1731 | llia = (long long)a;\ |
| 1732 | − a = (a >= 0) ? a : -a;\ | |
| 1733 | 1732 | ua = (unsigned int)a;\ |
| 1734 | 1733 | llua = (unsigned long long)a;\ |
| 1735 | 1734 | printf("ftoi: %d %u %lld %llu\n", ia, ua, llia, llua);\ |
| @@ -1759,6 +1758,18 @@ void prefix ## call(void)\ · 23 unmodified lines | ||
| 1759 | 1758 | printf("strto%s: %f\n", #prefix, (double)strto ## prefix("1.2", NULL));\ |
| 1760 | 1759 | }\ |
| 1761 | 1760 | \ |
| 1761 | +void prefix ## calc(type x, type y)\ | |
| 1762 | +{\ | |
| 1763 | + x=x*x;y=y*y;\ | |
| 1764 | + printf("%d, %d\n", (int)x, (int)y);\ | |
| 1765 | + x=x-y;y=y-x;\ | |
| 1766 | + printf("%d, %d\n", (int)x, (int)y);\ | |
| 1767 | + x=x/y;y=y/x;\ | |
| 1768 | + printf("%d, %d\n", (int)x, (int)y);\ | |
| 1769 | + x=x+x;y=y+y;\ | |
| 1770 | + printf("%d, %d\n", (int)x, (int)y);\ | |
| 1771 | +}\ | |
| 1772 | +\ | |
| 1762 | 1773 | void prefix ## signed_zeros(void) \ |
| 1763 | 1774 | {\ |
| 1764 | 1775 | type x = 0.0, y = -0.0, n, p;\ |
| @@ -1781,7 +1792,7 @@ void prefix ## signed_zeros(void) \ · 16 unmodified lines | ||
| 1781 | 1792 | 1.0 / x != 1.0 / p);\ |
| 1782 | 1793 | else\ |
| 1783 | 1794 | printf ("x != +y; this is wrong!\n");\ |
| 1784 | − p = -y;\ | |
| 1795 | + p = -y;\ | |
| 1785 | 1796 | if (x == p)\ |
| 1786 | 1797 | printf ("Test 1.0 / x != 1.0 / -y returns %d (should be 0).\n",\ |
| 1787 | 1798 | 1.0 / x != 1.0 / p);\ |
| @@ -1797,6 +1808,7 @@ void prefix ## test(void)\ · 9 unmodified lines | ||
| 1797 | 1808 | prefix ## fcast(234.6);\ |
| 1798 | 1809 | prefix ## fcast(-2334.6);\ |
| 1799 | 1810 | prefix ## call();\ |
| 1811 | + prefix ## calc(1, 1.0000000000000001);\ | |
| 1800 | 1812 | prefix ## signed_zeros();\ |
| 1801 | 1813 | } |
| 1802 | 1814 | |
| @@ -2623,7 +2635,6 @@ int constant_p_var; · 820 unmodified lines | ||
| 2623 | 2635 | |
| 2624 | 2636 | void builtin_test(void) |
| 2625 | 2637 | { |
| 2626 | −#if GCC_MAJOR >= 3 | |
| 2627 | 2638 | COMPAT_TYPE(int, int); |
| 2628 | 2639 | COMPAT_TYPE(int, unsigned int); |
| 2629 | 2640 | COMPAT_TYPE(int, char); |
| @@ -2633,9 +2644,9 @@ void builtin_test(void) · 3 unmodified lines | ||
| 2633 | 2644 | COMPAT_TYPE(int *, void *); |
| 2634 | 2645 | COMPAT_TYPE(int *, const int *); |
| 2635 | 2646 | COMPAT_TYPE(char *, unsigned char *); |
| 2647 | + COMPAT_TYPE(char, unsigned char); | |
| 2636 | 2648 | /* space is needed because tcc preprocessor introduces a space between each token */ |
| 2637 | − COMPAT_TYPE(char * *, void *); | |
| 2638 | −#endif | |
| 2649 | + COMPAT_TYPE(char **, void *); | |
| 2639 | 2650 | printf("res = %d\n", __builtin_constant_p(1)); |
| 2640 | 2651 | printf("res = %d\n", __builtin_constant_p(1 + 2)); |
| 2641 | 2652 | printf("res = %d\n", __builtin_constant_p(&constant_p_var)); |