lib/simd/src/tuple.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 pub fn create2(comptime D: type, v0: D.Vector, v1: D.Vector) [2]D.Vector {
4 return .{ v0, v1 };
5 }
6
7 pub fn create3(
8 comptime D: type,
9 v0: D.Vector,
10 v1: D.Vector,
11 v2: D.Vector,
12 ) [3]D.Vector {
13 return .{ v0, v1, v2 };
14 }
15
16 pub fn create4(
17 comptime D: type,
18 v0: D.Vector,
19 v1: D.Vector,
20 v2: D.Vector,
21 v3: D.Vector,
22 ) [4]D.Vector {
23 return .{ v0, v1, v2, v3 };
24 }
25
26 pub fn get2(comptime index: usize, value: anytype) @TypeOf(value[index]) {
27 if (comptime index >= 2) @compileError("get2 index must be less than two");
28 return value[index];
29 }
30
31 pub fn get3(comptime index: usize, value: anytype) @TypeOf(value[index]) {
32 if (comptime index >= 3) @compileError("get3 index must be less than three");
33 return value[index];
34 }
35
36 pub fn get4(comptime index: usize, value: anytype) @TypeOf(value[index]) {
37 if (comptime index >= 4) @compileError("get4 index must be less than four");
38 return value[index];
39 }
40
41 pub fn set2(comptime index: usize, value: anytype, replacement: @TypeOf(value[index])) @TypeOf(value) {
42 if (comptime index >= 2) @compileError("set2 index must be less than two");
43 var result = value;
44 result[index] = replacement;
45 return result;
46 }
47
48 pub fn set3(comptime index: usize, value: anytype, replacement: @TypeOf(value[index])) @TypeOf(value) {
49 if (comptime index >= 3) @compileError("set3 index must be less than three");
50 var result = value;
51 result[index] = replacement;
52 return result;
53 }
54
55 pub fn set4(comptime index: usize, value: anytype, replacement: @TypeOf(value[index])) @TypeOf(value) {
56 if (comptime index >= 4) @compileError("set4 index must be less than four");
57 var result = value;
58 result[index] = replacement;
59 return result;
60 }
61
62 test "Highway tuples retain ordered vectors and replace one vector" {
63 const simd = @import("root.zig");
64 const D = simd.FixedTag(u32, 4);
65 const a: D.Vector = @splat(1);
66 const b: D.Vector = @splat(2);
67 const c: D.Vector = @splat(3);
68 const d: D.Vector = @splat(4);
69 const pair = create2(D, a, b);
70 try std.testing.expect(@reduce(.And, get2(1, pair) == b));
71 const triple = set3(1, create3(D, a, b, c), d);
72 try std.testing.expect(@reduce(.And, get3(0, triple) == a));
73 try std.testing.expect(@reduce(.And, get3(1, triple) == d));
74 const quad = set4(2, create4(D, a, b, c, d), a);
75 try std.testing.expect(@reduce(.And, get4(2, quad) == a));
76 try std.testing.expect(@reduce(.And, get4(3, quad) == d));
77 }