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 }