@@ -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
0 commit comments