From 01cd4119b032f13899e9b7b30c7e093620058dfd Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Fri, 11 Mar 2022 14:25:15 +0200 Subject: Sema: implement `@shuffle` at comptime and for differing lengths --- test/behavior/shuffle.zig | 59 +++++++++++++++++++++++++++++------------------ 1 file changed, 36 insertions(+), 23 deletions(-) (limited to 'test/behavior') diff --git a/test/behavior/shuffle.zig b/test/behavior/shuffle.zig index e0f973762e..ec9305c8b6 100644 --- a/test/behavior/shuffle.zig +++ b/test/behavior/shuffle.zig @@ -4,12 +4,12 @@ const mem = std.mem; const expect = std.testing.expect; const Vector = std.meta.Vector; -test "@shuffle" { +test "@shuffle int" { const S = struct { fn doTheTest() !void { var v: Vector(4, i32) = [4]i32{ 2147483647, -2, 30, 40 }; var x: Vector(4, i32) = [4]i32{ 1, 2147483647, 3, 4 }; - const mask: Vector(4, i32) = [4]i32{ 0, ~@as(i32, 2), 3, ~@as(i32, 3) }; + const mask = [4]i32{ 0, ~@as(i32, 2), 3, ~@as(i32, 3) }; var res = @shuffle(i32, v, x, mask); try expect(mem.eql(i32, &@as([4]i32, res), &[4]i32{ 2147483647, 3, 40, 4 })); @@ -18,40 +18,53 @@ test "@shuffle" { try expect(mem.eql(i32, &@as([4]i32, res), &[4]i32{ 2147483647, 3, 40, 4 })); // Undefined - const mask2: Vector(4, i32) = [4]i32{ 3, 1, 2, 0 }; + const mask2 = [4]i32{ 3, 1, 2, 0 }; res = @shuffle(i32, v, undefined, mask2); try expect(mem.eql(i32, &@as([4]i32, res), &[4]i32{ 40, -2, 30, 2147483647 })); // Upcasting of b var v2: Vector(2, i32) = [2]i32{ 2147483647, undefined }; - const mask3: Vector(4, i32) = [4]i32{ ~@as(i32, 0), 2, ~@as(i32, 0), 3 }; + const mask3 = [4]i32{ ~@as(i32, 0), 2, ~@as(i32, 0), 3 }; res = @shuffle(i32, x, v2, mask3); try expect(mem.eql(i32, &@as([4]i32, res), &[4]i32{ 2147483647, 3, 2147483647, 4 })); // Upcasting of a var v3: Vector(2, i32) = [2]i32{ 2147483647, -2 }; - const mask4: Vector(4, i32) = [4]i32{ 0, ~@as(i32, 2), 1, ~@as(i32, 3) }; + const mask4 = [4]i32{ 0, ~@as(i32, 2), 1, ~@as(i32, 3) }; res = @shuffle(i32, v3, x, mask4); try expect(mem.eql(i32, &@as([4]i32, res), &[4]i32{ 2147483647, 3, -2, 4 })); + } + }; + try S.doTheTest(); + comptime try S.doTheTest(); +} - // bool - { - var x2: Vector(4, bool) = [4]bool{ false, true, false, true }; - var v4: Vector(2, bool) = [2]bool{ true, false }; - const mask5: Vector(4, i32) = [4]i32{ 0, ~@as(i32, 1), 1, 2 }; - var res2 = @shuffle(bool, x2, v4, mask5); - try expect(mem.eql(bool, &@as([4]bool, res2), &[4]bool{ false, false, true, false })); - } - - // TODO re-enable when LLVM codegen is fixed - // https://github.com/ziglang/zig/issues/3246 - if (false) { - var x2: Vector(3, bool) = [3]bool{ false, true, false }; - var v4: Vector(2, bool) = [2]bool{ true, false }; - const mask5: Vector(4, i32) = [4]i32{ 0, ~@as(i32, 1), 1, 2 }; - var res2 = @shuffle(bool, x2, v4, mask5); - try expect(mem.eql(bool, &@as([4]bool, res2), &[4]bool{ false, false, true, false })); - } +test "@shuffle bool" { + const S = struct { + fn doTheTest() !void { + var x: Vector(4, bool) = [4]bool{ false, true, false, true }; + var v: Vector(2, bool) = [2]bool{ true, false }; + const mask = [4]i32{ 0, ~@as(i32, 1), 1, 2 }; + var res = @shuffle(bool, x, v, mask); + try expect(mem.eql(bool, &@as([4]bool, res), &[4]bool{ false, false, true, false })); + } + }; + if (builtin.zig_backend == .stage1) try S.doTheTest(); + comptime try S.doTheTest(); +} + +test "@shuffle bool" { + // TODO re-enable when LLVM codegen is fixed + // https://github.com/ziglang/zig/issues/3246 + if (true) return error.SkipZigTest; + + const S = struct { + fn doTheTest() !void { + var x: Vector(3, bool) = [3]bool{ false, true, false }; + var v: Vector(2, bool) = [2]bool{ true, false }; + const mask: Vector(4, i32) = [4]i32{ 0, ~@as(i32, 1), 1, 2 }; + var res = @shuffle(bool, x, v, mask); + try expect(mem.eql(bool, &@as([4]bool, res), &[4]bool{ false, false, true, false })); } }; try S.doTheTest(); -- cgit v1.2.3