| ... | ... | @@ -664,7 +664,7 @@ test "small int addition" { |
| 664 | 664 | try expect(result == 0); |
| 665 | 665 | } |
| 666 | 666 | |
| 667 | | test "@mulWithOverflow" { |
| 667 | test "basic @mulWithOverflow" { |
| 668 | 668 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 669 | 669 | |
| 670 | 670 | var result: u8 = undefined; |
| ... | ... | @@ -683,6 +683,159 @@ test "@mulWithOverflow" { |
| 683 | 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 | 839 | test "@subWithOverflow" { |
| 687 | 840 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 688 | 841 | |