authorgravatar for william@sengir.comWilliam Sengir <william@sengir.com> 2022-03-20 01:11:21-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-03-21 16:54:19-07:00
logc9598c4cd38f742e75a54d5a28d169351104b61d
tree01de9914d3bdc663b0c02c2ff83a6c49f04d9d71
parentafdcfb005ea32849f30e2abd7361ce1f33d0ee74

behavior tests: enable all vector tests for the stage2 LLVM backend


2 files changed, 184 insertions(+), 41 deletions(-)

src/value.zig+6-10
......@@ -2693,16 +2693,14 @@ pub const Value = extern union {
26932693 if (int_ty.zigTypeTag() == .Vector) {
26942694 const result_data = try arena.alloc(Value, int_ty.vectorLen());
26952695 for (result_data) |*scalar, i| {
2696 scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, int_ty.scalarType(), float_ty.scalarType(), target);
2696 scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target);
26972697 }
26982698 return Value.Tag.aggregate.create(arena, result_data);
26992699 }
2700 return intToFloatScalar(val, arena, int_ty, float_ty, target);
2700 return intToFloatScalar(val, arena, float_ty, target);
27012701 }
27022702
2703 pub fn intToFloatScalar(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target) !Value {
2704 assert(int_ty.isNumeric() and !int_ty.isAnyFloat());
2705 assert(float_ty.isAnyFloat());
2703 pub fn intToFloatScalar(val: Value, arena: Allocator, float_ty: Type, target: Target) !Value {
27062704 switch (val.tag()) {
27072705 .undef, .zero, .one => return val,
27082706 .the_only_possible_value => return Value.initTag(.zero), // for i0, u0
......@@ -2754,16 +2752,14 @@ pub const Value = extern union {
27542752 if (float_ty.zigTypeTag() == .Vector) {
27552753 const result_data = try arena.alloc(Value, float_ty.vectorLen());
27562754 for (result_data) |*scalar, i| {
2757 scalar.* = try floatToIntScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), int_ty.scalarType(), target);
2755 scalar.* = try floatToIntScalar(val.indexVectorlike(i), arena, int_ty.scalarType(), target);
27582756 }
27592757 return Value.Tag.aggregate.create(arena, result_data);
27602758 }
2761 return floatToIntScalar(val, arena, float_ty, int_ty, target);
2759 return floatToIntScalar(val, arena, int_ty, target);
27622760 }
27632761
2764 pub fn floatToIntScalar(val: Value, arena: Allocator, float_ty: Type, int_ty: Type, target: Target) error{ FloatCannotFit, OutOfMemory }!Value {
2765 assert(float_ty.isAnyFloat());
2766 assert(int_ty.isInt());
2762 pub fn floatToIntScalar(val: Value, arena: Allocator, int_ty: Type, target: Target) error{ FloatCannotFit, OutOfMemory }!Value {
27672763 const Limb = std.math.big.Limb;
27682764
27692765 var value = val.toFloat(f64); // TODO: f128 ?
test/behavior/vector.zig+178-31
......@@ -6,7 +6,12 @@ const expect = std.testing.expect;
66const Vector = std.meta.Vector;
77
88test "implicit cast vector to array - bool" {
9 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
9 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
11 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
12 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
13 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
14
1015 const S = struct {
1116 fn doTheTest() !void {
1217 const a: Vector(4, bool) = [_]bool{ true, false, true, false };
......@@ -19,7 +24,12 @@ test "implicit cast vector to array - bool" {
1924}
2025
2126test "vector wrap operators" {
22 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
27 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
28 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
29 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
30 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
31 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
32
2333 const S = struct {
2434 fn doTheTest() !void {
2535 var v: Vector(4, i32) = [4]i32{ 2147483647, -2, 30, 40 };
......@@ -36,7 +46,12 @@ test "vector wrap operators" {
3646}
3747
3848test "vector bin compares with mem.eql" {
39 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
49 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
50 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
51 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
52 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
53 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
54
4055 const S = struct {
4156 fn doTheTest() !void {
4257 var v: Vector(4, i32) = [4]i32{ 2147483647, -2, 30, 40 };
......@@ -54,7 +69,12 @@ test "vector bin compares with mem.eql" {
5469}
5570
5671test "vector int operators" {
57 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
72 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
73 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
74 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
75 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
76 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
77
5878 const S = struct {
5979 fn doTheTest() !void {
6080 var v: Vector(4, i32) = [4]i32{ 10, 20, 30, 40 };
......@@ -70,7 +90,12 @@ test "vector int operators" {
7090}
7191
7292test "vector float operators" {
73 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
93 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
94 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
95 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
96 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
97 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
98
7499 const S = struct {
75100 fn doTheTest() !void {
76101 var v: Vector(4, f32) = [4]f32{ 10, 20, 30, 40 };
......@@ -86,7 +111,12 @@ test "vector float operators" {
86111}
87112
88113test "vector bit operators" {
89 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
114 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
115 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
116 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
117 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
118 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
119
90120 const S = struct {
91121 fn doTheTest() !void {
92122 var v: Vector(4, u8) = [4]u8{ 0b10101010, 0b10101010, 0b10101010, 0b10101010 };
......@@ -101,7 +131,12 @@ test "vector bit operators" {
101131}
102132
103133test "implicit cast vector to array" {
104 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
134 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
135 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
136 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
137 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
138 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
139
105140 const S = struct {
106141 fn doTheTest() !void {
107142 var a: Vector(4, i32) = [_]i32{ 1, 2, 3, 4 };
......@@ -115,7 +150,12 @@ test "implicit cast vector to array" {
115150}
116151
117152test "array to vector" {
118 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
153 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
154 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
155 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
156 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
157 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
158
119159 const S = struct {
120160 fn doTheTest() !void {
121161 var foo: f32 = 3.14;
......@@ -129,7 +169,12 @@ test "array to vector" {
129169}
130170
131171test "vector casts of sizes not divisible by 8" {
132 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
172 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
173 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
174 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
175 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
176 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
177
133178 const S = struct {
134179 fn doTheTest() !void {
135180 {
......@@ -159,7 +204,12 @@ test "vector casts of sizes not divisible by 8" {
159204}
160205
161206test "vector @splat" {
162 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
207 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
208 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
209 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
210 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
211 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
212
163213 const S = struct {
164214 fn testForT(comptime N: comptime_int, v: anytype) !void {
165215 const T = @TypeOf(v);
......@@ -195,7 +245,12 @@ test "vector @splat" {
195245}
196246
197247test "load vector elements via comptime index" {
198 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
248 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
249 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
250 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
251 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
252 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
253
199254 const S = struct {
200255 fn doTheTest() !void {
201256 var v: Vector(4, i32) = [_]i32{ 1, 2, 3, undefined };
......@@ -213,7 +268,12 @@ test "load vector elements via comptime index" {
213268}
214269
215270test "store vector elements via comptime index" {
216 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
271 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
272 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
273 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
274 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
275 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
276
217277 const S = struct {
218278 fn doTheTest() !void {
219279 var v: Vector(4, i32) = [_]i32{ 1, 5, 3, undefined };
......@@ -237,7 +297,12 @@ test "store vector elements via comptime index" {
237297}
238298
239299test "load vector elements via runtime index" {
240 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
300 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
301 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
302 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
303 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
304 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
305
241306 const S = struct {
242307 fn doTheTest() !void {
243308 var v: Vector(4, i32) = [_]i32{ 1, 2, 3, undefined };
......@@ -255,7 +320,12 @@ test "load vector elements via runtime index" {
255320}
256321
257322test "store vector elements via runtime index" {
258 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
323 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
324 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
325 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
326 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
327 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
328
259329 const S = struct {
260330 fn doTheTest() !void {
261331 var v: Vector(4, i32) = [_]i32{ 1, 5, 3, undefined };
......@@ -274,7 +344,12 @@ test "store vector elements via runtime index" {
274344}
275345
276346test "initialize vector which is a struct field" {
277 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
347 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
348 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
349 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
350 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
351 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
352
278353 const Vec4Obj = struct {
279354 data: Vector(4, f32),
280355 };
......@@ -292,7 +367,12 @@ test "initialize vector which is a struct field" {
292367}
293368
294369test "vector comparison operators" {
295 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
370 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
371 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
372 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
373 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
374 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
375
296376 const S = struct {
297377 fn doTheTest() !void {
298378 {
......@@ -327,7 +407,12 @@ test "vector comparison operators" {
327407}
328408
329409test "vector division operators" {
330 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
410 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
411 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
412 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
413 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
414 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
415
331416 const S = struct {
332417 fn doTheTestDiv(comptime T: type, x: Vector(4, T), y: Vector(4, T)) !void {
333418 if (!comptime std.meta.trait.isSignedInt(T)) {
......@@ -410,7 +495,12 @@ test "vector division operators" {
410495}
411496
412497test "vector bitwise not operator" {
413 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
498 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
499 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
500 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
501 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
502 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
503
414504 const S = struct {
415505 fn doTheTestNot(comptime T: type, x: Vector(4, T)) !void {
416506 var y = ~x;
......@@ -436,7 +526,12 @@ test "vector bitwise not operator" {
436526}
437527
438528test "vector shift operators" {
439 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
529 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
530 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
531 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
532 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
533 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
534
440535 const S = struct {
441536 fn doTheTestShift(x: anytype, y: anytype) !void {
442537 const N = @typeInfo(@TypeOf(x)).Array.len;
......@@ -667,7 +762,12 @@ test "vector reduce operation" {
667762}
668763
669764test "mask parameter of @shuffle is comptime scope" {
670 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
765 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
766 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
767 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
768 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
769 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
770
671771 const __v4hi = std.meta.Vector(4, i16);
672772 var v4_a = __v4hi{ 0, 0, 0, 0 };
673773 var v4_b = __v4hi{ 0, 0, 0, 0 };
......@@ -681,13 +781,30 @@ test "mask parameter of @shuffle is comptime scope" {
681781}
682782
683783test "saturating add" {
684 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
784 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
785 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
786 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
787 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
788 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
789
685790 const S = struct {
686791 fn doTheTest() !void {
687 const u8x3 = std.meta.Vector(3, u8);
688 try expect(mem.eql(u8, &@as([3]u8, u8x3{ 255, 255, 255 }), &@as([3]u8, u8x3{ 255, 254, 1 } +| u8x3{ 1, 2, 255 })));
689 const i8x3 = std.meta.Vector(3, i8);
690 try expect(mem.eql(i8, &@as([3]i8, i8x3{ 127, 127, 127 }), &@as([3]i8, i8x3{ 127, 126, 1 } +| i8x3{ 1, 2, 127 })));
792 { // Broken out to avoid https://github.com/ziglang/zig/issues/11251
793 const u8x3 = std.meta.Vector(3, u8);
794 const lhs = u8x3{ 255, 254, 1 };
795 const rhs = u8x3{ 1, 2, 255 };
796 const result = lhs +| rhs;
797 const expected = u8x3{ 255, 255, 255 };
798 try expect(mem.eql(u8, &@as([3]u8, expected), &@as([3]u8, result)));
799 }
800 { // Broken out to avoid https://github.com/ziglang/zig/issues/11251
801 const i8x3 = std.meta.Vector(3, i8);
802 const lhs = i8x3{ 127, 126, 1 };
803 const rhs = i8x3{ 1, 2, 127 };
804 const result = lhs +| rhs;
805 const expected = i8x3{ 127, 127, 127 };
806 try expect(mem.eql(i8, &@as([3]i8, expected), &@as([3]i8, result)));
807 }
691808 }
692809 };
693810 try S.doTheTest();
......@@ -695,11 +812,21 @@ test "saturating add" {
695812}
696813
697814test "saturating subtraction" {
698 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
815 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
816 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
817 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
818 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
819 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
820
699821 const S = struct {
700822 fn doTheTest() !void {
823 // Broken out to avoid https://github.com/ziglang/zig/issues/11251
701824 const u8x3 = std.meta.Vector(3, u8);
702 try expect(mem.eql(u8, &@as([3]u8, u8x3{ 0, 0, 0 }), &@as([3]u8, u8x3{ 0, 0, 0 } -| u8x3{ 255, 255, 255 })));
825 const lhs = u8x3{ 0, 0, 0 };
826 const rhs = u8x3{ 255, 255, 255 };
827 const result = lhs -| rhs;
828 const expected = u8x3{ 0, 0, 0 };
829 try expect(mem.eql(u8, &@as([3]u8, expected), &@as([3]u8, result)));
703830 }
704831 };
705832 try S.doTheTest();
......@@ -707,14 +834,24 @@ test "saturating subtraction" {
707834}
708835
709836test "saturating multiplication" {
710 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
837 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
838 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
839 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
840 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
841 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
842
711843 // TODO: once #9660 has been solved, remove this line
712844 if (builtin.target.cpu.arch == .wasm32) return error.SkipZigTest;
713845
714846 const S = struct {
715847 fn doTheTest() !void {
848 // Broken out to avoid https://github.com/ziglang/zig/issues/11251
716849 const u8x3 = std.meta.Vector(3, u8);
717 try expect(mem.eql(u8, &@as([3]u8, u8x3{ 255, 255, 255 }), &@as([3]u8, u8x3{ 2, 2, 2 } *| u8x3{ 255, 255, 255 })));
850 const lhs = u8x3{ 2, 2, 2 };
851 const rhs = u8x3{ 255, 255, 255 };
852 const result = lhs *| rhs;
853 const expected = u8x3{ 255, 255, 255 };
854 try expect(mem.eql(u8, &@as([3]u8, expected), &@as([3]u8, result)));
718855 }
719856 };
720857
......@@ -723,11 +860,21 @@ test "saturating multiplication" {
723860}
724861
725862test "saturating shift-left" {
726 if (builtin.zig_backend != .stage1) return error.SkipZigTest; // TODO
863 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
864 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
865 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
866 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
867 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
868
727869 const S = struct {
728870 fn doTheTest() !void {
871 // Broken out to avoid https://github.com/ziglang/zig/issues/11251
729872 const u8x3 = std.meta.Vector(3, u8);
730 try expect(mem.eql(u8, &@as([3]u8, u8x3{ 255, 255, 255 }), &@as([3]u8, u8x3{ 255, 255, 255 } <<| u8x3{ 1, 1, 1 })));
873 const lhs = u8x3{ 1, 1, 1 };
874 const rhs = u8x3{ 255, 255, 255 };
875 const result = lhs <<| rhs;
876 const expected = u8x3{ 255, 255, 255 };
877 try expect(mem.eql(u8, &@as([3]u8, expected), &@as([3]u8, result)));
731878 }
732879 };
733880 try S.doTheTest();