@@ -440,7 +440,6 @@ test "division" {
440
440
if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
441
441
if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
442
442
if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
443
- if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
444
443
if (builtin .zig_backend == .stage2_wasm ) return error .SkipZigTest ;
445
444
if (builtin .zig_backend == .stage2_x86_64 and builtin .target .ofmt != .elf and builtin .target .ofmt != .macho ) return error .SkipZigTest ;
446
445
if (builtin .zig_backend == .stage2_riscv64 ) return error .SkipZigTest ;
@@ -530,7 +529,6 @@ test "division half-precision floats" {
530
529
if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
531
530
if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
532
531
if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
533
- if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
534
532
if (builtin .zig_backend == .stage2_x86_64 and builtin .target .ofmt != .elf and builtin .target .ofmt != .macho ) return error .SkipZigTest ;
535
533
if (builtin .zig_backend == .stage2_riscv64 ) return error .SkipZigTest ;
536
534
@@ -622,7 +620,6 @@ test "negation wrapping" {
622
620
if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
623
621
if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
624
622
if (builtin .zig_backend == .stage2_riscv64 ) return error .SkipZigTest ;
625
- if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
626
623
627
624
try expectEqual (@as (u1 , 1 ), negateWrap (u1 , 1 ));
628
625
}
@@ -1031,6 +1028,60 @@ test "@mulWithOverflow bitsize > 32" {
1031
1028
if (builtin .zig_backend == .stage2_wasm ) return error .SkipZigTest ; // TODO
1032
1029
if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
1033
1030
1031
+ {
1032
+ var a : u40 = 3 ;
1033
+ var b : u40 = 0x55_5555_5555 ;
1034
+ var ov = @mulWithOverflow (a , b );
1035
+
1036
+ try expect (ov [0 ] == 0xff_ffff_ffff );
1037
+ try expect (ov [1 ] == 0 );
1038
+
1039
+ // Check that overflow bits in the low-word of wide-multiplications are checked too.
1040
+ // Intermediate result is less than 2**64
1041
+ b = 0x55_5555_5556 ;
1042
+ ov = @mulWithOverflow (a , b );
1043
+ try expect (ov [0 ] == 2 );
1044
+ try expect (ov [1 ] == 1 );
1045
+
1046
+ // Check that overflow bits in the high-word of wide-multiplications are checked too.
1047
+ // Intermediate result is more than 2**64 and bits 40..64 are not set.
1048
+ a = 0x10_0000_0000 ;
1049
+ b = 0x10_0000_0000 ;
1050
+ ov = @mulWithOverflow (a , b );
1051
+ try expect (ov [0 ] == 0 );
1052
+ try expect (ov [1 ] == 1 );
1053
+ }
1054
+
1055
+ {
1056
+ var a : i40 = 3 ;
1057
+ var b : i40 = -0x2a_aaaa_aaaa ;
1058
+ var ov = @mulWithOverflow (a , b );
1059
+
1060
+ try expect (ov [0 ] == -0x7f_ffff_fffe );
1061
+ try expect (ov [1 ] == 0 );
1062
+
1063
+ // Check that the sign bit is properly checked
1064
+ b = -0x2a_aaaa_aaab ;
1065
+ ov = @mulWithOverflow (a , b );
1066
+ try expect (ov [0 ] == 0x7f_ffff_ffff );
1067
+ try expect (ov [1 ] == 1 );
1068
+
1069
+ // Check that the low-order bits above the sign are checked.
1070
+ a = 6 ;
1071
+ ov = @mulWithOverflow (a , b );
1072
+ try expect (ov [0 ] == -2 );
1073
+ try expect (ov [1 ] == 1 );
1074
+
1075
+ // Check that overflow bits in the high-word of wide-multiplications are checked too.
1076
+ // high parts and sign of low-order bits are all 1.
1077
+ a = 0x08_0000_0000 ;
1078
+ b = -0x08_0000_0001 ;
1079
+ ov = @mulWithOverflow (a , b );
1080
+
1081
+ try expect (ov [0 ] == -0x8_0000_0000 );
1082
+ try expect (ov [1 ] == 1 );
1083
+ }
1084
+
1034
1085
{
1035
1086
var a : u62 = 3 ;
1036
1087
_ = & a ;
@@ -1580,7 +1631,6 @@ test "@round f16" {
1580
1631
if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
1581
1632
if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
1582
1633
if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
1583
- if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
1584
1634
if (builtin .zig_backend == .stage2_x86_64 and builtin .target .ofmt != .elf and builtin .target .ofmt != .macho ) return error .SkipZigTest ;
1585
1635
if (builtin .zig_backend == .stage2_riscv64 ) return error .SkipZigTest ;
1586
1636
@@ -1592,7 +1642,6 @@ test "@round f32/f64" {
1592
1642
if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
1593
1643
if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
1594
1644
if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
1595
- if (builtin .zig_backend == .stage2_spirv64 ) return error .SkipZigTest ;
1596
1645
if (builtin .zig_backend == .stage2_x86_64 and builtin .target .ofmt != .elf and builtin .target .ofmt != .macho ) return error .SkipZigTest ;
1597
1646
if (builtin .zig_backend == .stage2_riscv64 ) return error .SkipZigTest ;
1598
1647
0 commit comments