| ... | @@ -664,7 +664,7 @@ test "small int addition" { | ... | @@ -664,7 +664,7 @@ test "small int addition" { |
| 664 | try expect(result == 0); | 664 | try expect(result == 0); |
| 665 | } | 665 | } |
| 666 | | 666 | |
| 667 | test "@mulWithOverflow" { | 667 | test "basic @mulWithOverflow" { |
| 668 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 668 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 669 | | 669 | |
| 670 | var result: u8 = undefined; | 670 | var result: u8 = undefined; |
| ... | @@ -683,6 +683,159 @@ test "@mulWithOverflow" { | ... | @@ -683,6 +683,159 @@ test "@mulWithOverflow" { |
| 683 | try expect(result == 236); | 683 | try expect(result == 236); |
| 684 | } | 684 | } |
| 685 | | 685 | |
| | 686 | // TODO migrate to this for all backends once they handle more cases |
| | 687 | test "extensive @mulWithOverflow" { |
| | 688 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| | 689 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| | 690 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| | 691 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| | 692 | |
| | 693 | { |
| | 694 | var a: u8 = 3; |
| | 695 | var b: u8 = 85; |
| | 696 | var res: u8 = undefined; |
| | 697 | |
| | 698 | try expect(!@mulWithOverflow(u8, a, b, &res)); |
| | 699 | try expect(res == 255); |
| | 700 | |
| | 701 | b = 86; |
| | 702 | try expect(@mulWithOverflow(u8, a, b, &res)); |
| | 703 | try expect(res == 2); |
| | 704 | } |
| | 705 | |
| | 706 | { |
| | 707 | var a: i8 = 3; |
| | 708 | var b: i8 = -42; |
| | 709 | var res: i8 = undefined; |
| | 710 | try expect(!@mulWithOverflow(i8, a, b, &res)); |
| | 711 | try expect(res == -126); |
| | 712 | |
| | 713 | b = -43; |
| | 714 | try expect(@mulWithOverflow(i8, a, b, &res)); |
| | 715 | try expect(res == 127); |
| | 716 | } |
| | 717 | |
| | 718 | { |
| | 719 | var a: u16 = 3; |
| | 720 | var b: u16 = 0x5555; |
| | 721 | var res: u16 = undefined; |
| | 722 | try expect(!@mulWithOverflow(u16, a, b, &res)); |
| | 723 | try expect(res == 0xffff); |
| | 724 | |
| | 725 | b = 0x5556; |
| | 726 | try expect(@mulWithOverflow(u16, a, b, &res)); |
| | 727 | try expect(res == 2); |
| | 728 | } |
| | 729 | |
| | 730 | { |
| | 731 | var a: i16 = 3; |
| | 732 | var b: i16 = -0x2aaa; |
| | 733 | var res: i16 = undefined; |
| | 734 | try expect(!@mulWithOverflow(i16, a, b, &res)); |
| | 735 | try expect(res == -0x7ffe); |
| | 736 | |
| | 737 | b = -0x2aab; |
| | 738 | try expect(@mulWithOverflow(i16, a, b, &res)); |
| | 739 | try expect(res == 0x7fff); |
| | 740 | } |
| | 741 | |
| | 742 | { |
| | 743 | var a: u30 = 3; |
| | 744 | var b: u30 = 0x15555555; |
| | 745 | var res: u30 = undefined; |
| | 746 | try expect(!@mulWithOverflow(u30, a, b, &res)); |
| | 747 | try expect(res == 0x3fffffff); |
| | 748 | |
| | 749 | b = 0x15555556; |
| | 750 | try expect(@mulWithOverflow(u30, a, b, &res)); |
| | 751 | try expect(res == 2); |
| | 752 | } |
| | 753 | |
| | 754 | { |
| | 755 | var a: i30 = 3; |
| | 756 | var b: i30 = -0xaaaaaaa; |
| | 757 | var res: i30 = undefined; |
| | 758 | try expect(!@mulWithOverflow(i30, a, b, &res)); |
| | 759 | try expect(res == -0x1ffffffe); |
| | 760 | |
| | 761 | b = -0xaaaaaab; |
| | 762 | try expect(@mulWithOverflow(i30, a, b, &res)); |
| | 763 | try expect(res == 0x1fffffff); |
| | 764 | } |
| | 765 | |
| | 766 | { |
| | 767 | var a: u32 = 3; |
| | 768 | var b: u32 = 0x55555555; |
| | 769 | var res: u32 = undefined; |
| | 770 | try expect(!@mulWithOverflow(u32, a, b, &res)); |
| | 771 | try expect(res == 0xffffffff); |
| | 772 | |
| | 773 | b = 0x55555556; |
| | 774 | try expect(@mulWithOverflow(u32, a, b, &res)); |
| | 775 | try expect(res == 2); |
| | 776 | } |
| | 777 | |
| | 778 | { |
| | 779 | var a: i32 = 3; |
| | 780 | var b: i32 = -0x2aaaaaaa; |
| | 781 | var res: i32 = undefined; |
| | 782 | try expect(!@mulWithOverflow(i32, a, b, &res)); |
| | 783 | try expect(res == -0x7ffffffe); |
| | 784 | |
| | 785 | b = -0x2aaaaaab; |
| | 786 | try expect(@mulWithOverflow(i32, a, b, &res)); |
| | 787 | try expect(res == 0x7fffffff); |
| | 788 | } |
| | 789 | |
| | 790 | { |
| | 791 | var a: u62 = 3; |
| | 792 | var b: u62 = 0x1555555555555555; |
| | 793 | var res: u62 = undefined; |
| | 794 | try expect(!@mulWithOverflow(u62, a, b, &res)); |
| | 795 | try expect(res == 0x3fffffffffffffff); |
| | 796 | |
| | 797 | b = 0x1555555555555556; |
| | 798 | try expect(@mulWithOverflow(u62, a, b, &res)); |
| | 799 | try expect(res == 2); |
| | 800 | } |
| | 801 | |
| | 802 | { |
| | 803 | var a: i62 = 3; |
| | 804 | var b: i62 = -0xaaaaaaaaaaaaaaa; |
| | 805 | var res: i62 = undefined; |
| | 806 | try expect(!@mulWithOverflow(i62, a, b, &res)); |
| | 807 | try expect(res == -0x1ffffffffffffffe); |
| | 808 | |
| | 809 | b = -0xaaaaaaaaaaaaaab; |
| | 810 | try expect(@mulWithOverflow(i62, a, b, &res)); |
| | 811 | try expect(res == 0x1fffffffffffffff); |
| | 812 | } |
| | 813 | |
| | 814 | { |
| | 815 | var a: u64 = 3; |
| | 816 | var b: u64 = 0x5555555555555555; |
| | 817 | var res: u64 = undefined; |
| | 818 | try expect(!@mulWithOverflow(u64, a, b, &res)); |
| | 819 | try expect(res == 0xffffffffffffffff); |
| | 820 | |
| | 821 | b = 0x5555555555555556; |
| | 822 | try expect(@mulWithOverflow(u64, a, b, &res)); |
| | 823 | try expect(res == 2); |
| | 824 | } |
| | 825 | |
| | 826 | { |
| | 827 | var a: i64 = 3; |
| | 828 | var b: i64 = -0x2aaaaaaaaaaaaaaa; |
| | 829 | var res: i64 = undefined; |
| | 830 | try expect(!@mulWithOverflow(i64, a, b, &res)); |
| | 831 | try expect(res == -0x7ffffffffffffffe); |
| | 832 | |
| | 833 | b = -0x2aaaaaaaaaaaaaab; |
| | 834 | try expect(@mulWithOverflow(i64, a, b, &res)); |
| | 835 | try expect(res == 0x7fffffffffffffff); |
| | 836 | } |
| | 837 | } |
| | 838 | |
| 686 | test "@subWithOverflow" { | 839 | test "@subWithOverflow" { |
| 687 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 840 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 688 | | 841 | |