aboutsummaryrefslogtreecommitdiff
path: root/test/behavior/shuffle.zig
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-03-11 14:25:15 +0200
committerVeikka Tuominen <git@vexu.eu>2022-03-11 14:25:15 +0200
commit01cd4119b032f13899e9b7b30c7e093620058dfd (patch)
treebfafdc11324d3b77ff5af8b59b5ff324db66335b /test/behavior/shuffle.zig
parentcba68090a60c3de8eadbf8eb53e37620a1d66683 (diff)
downloadzig-01cd4119b032f13899e9b7b30c7e093620058dfd.tar.gz
zig-01cd4119b032f13899e9b7b30c7e093620058dfd.zip
Sema: implement `@shuffle` at comptime and for differing lengths
Diffstat (limited to 'test/behavior/shuffle.zig')
-rw-r--r--test/behavior/shuffle.zig59
1 files changed, 36 insertions, 23 deletions
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();