@@ -2,6 +2,7 @@ const std = @import("std");
2
2
const builtin = @import ("builtin" );
3
3
const mem = std .mem ;
4
4
const expect = std .testing .expect ;
5
+ const expectEqual = std .testing .expectEqual ;
5
6
6
7
test "@shuffle int" {
7
8
if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
@@ -49,6 +50,88 @@ test "@shuffle int" {
49
50
try comptime S .doTheTest ();
50
51
}
51
52
53
+ test "@shuffle int strange sizes" {
54
+ if (builtin .zig_backend == .stage2_wasm ) return error .SkipZigTest ; // TODO
55
+ if (builtin .zig_backend == .stage2_x86_64 ) return error .SkipZigTest ; // TODO
56
+ if (builtin .zig_backend == .stage2_aarch64 ) return error .SkipZigTest ; // TODO
57
+ if (builtin .zig_backend == .stage2_arm ) return error .SkipZigTest ; // TODO
58
+ if (builtin .zig_backend == .stage2_sparc64 ) return error .SkipZigTest ; // TODO
59
+ if (builtin .zig_backend == .stage2_riscv64 ) return error .SkipZigTest ;
60
+
61
+ try comptime testShuffle (2 , 2 , 2 );
62
+ try testShuffle (2 , 2 , 2 );
63
+ try comptime testShuffle (4 , 4 , 4 );
64
+ try testShuffle (4 , 4 , 4 );
65
+ try comptime testShuffle (7 , 4 , 4 );
66
+ try testShuffle (7 , 4 , 4 );
67
+ try comptime testShuffle (8 , 6 , 4 );
68
+ try testShuffle (8 , 6 , 4 );
69
+ try comptime testShuffle (2 , 7 , 5 );
70
+ try testShuffle (2 , 7 , 5 );
71
+ try comptime testShuffle (13 , 16 , 12 );
72
+ try testShuffle (13 , 16 , 12 );
73
+ try comptime testShuffle (19 , 3 , 17 );
74
+ try testShuffle (19 , 3 , 17 );
75
+ try comptime testShuffle (1 , 10 , 1 );
76
+ try testShuffle (1 , 10 , 1 );
77
+ }
78
+
79
+ fn testShuffle (
80
+ comptime x_len : comptime_int ,
81
+ comptime a_len : comptime_int ,
82
+ comptime b_len : comptime_int ,
83
+ ) ! void {
84
+ const T = i32 ;
85
+ const XT = @Vector (x_len , T );
86
+ const AT = @Vector (a_len , T );
87
+ const BT = @Vector (b_len , T );
88
+
89
+ const a_elems = comptime blk : {
90
+ var elems : [a_len ]T = undefined ;
91
+ for (& elems , 0.. ) | * elem , i | elem .* = @intCast (100 + i );
92
+ break :blk elems ;
93
+ };
94
+ var a : AT = a_elems ;
95
+ _ = & a ;
96
+
97
+ const b_elems = comptime blk : {
98
+ var elems : [b_len ]T = undefined ;
99
+ for (& elems , 0.. ) | * elem , i | elem .* = @intCast (1000 + i );
100
+ break :blk elems ;
101
+ };
102
+ var b : BT = b_elems ;
103
+ _ = & b ;
104
+
105
+ const mask_seed : []const i32 = &.{ -14 , -31 , 23 , 1 , 21 , 13 , 17 , -21 , -10 , -27 , -16 , -5 , 15 , 14 , -2 , 26 , 2 , -31 , -24 , -16 };
106
+
107
+ const mask = comptime blk : {
108
+ var elems : [x_len ]i32 = undefined ;
109
+ for (& elems , 0.. ) | * elem , i | {
110
+ const mask_val = mask_seed [i ];
111
+ if (mask_val >= 0 ) {
112
+ elem .* = @mod (mask_val , a_len );
113
+ } else {
114
+ elem .* = @mod (mask_val , - b_len );
115
+ }
116
+ }
117
+
118
+ break :blk elems ;
119
+ };
120
+
121
+ const x : XT = @shuffle (T , a , b , mask );
122
+
123
+ const x_elems : [x_len ]T = x ;
124
+ for (mask , x_elems ) | m , x_elem | {
125
+ if (m >= 0 ) {
126
+ // Element from A
127
+ try expectEqual (x_elem , a_elems [@intCast (m )]);
128
+ } else {
129
+ // Element from B
130
+ try expectEqual (x_elem , b_elems [@intCast (~ m )]);
131
+ }
132
+ }
133
+ }
134
+
52
135
test "@shuffle bool 1" {
53
136
if (builtin .zig_backend == .stage2_wasm ) return error .SkipZigTest ; // TODO
54
137
if (builtin .zig_backend == .stage2_x86_64 ) return error .SkipZigTest ; // TODO
0 commit comments