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