1
2
3
4
5
6
7 package simd_test
8
9 import (
10 "simd/archsimd"
11 "testing"
12 )
13
14 func TestAddAMD64(t *testing.T) {
15 testFloat32x8Binary(t, archsimd.Float32x8.Add, addSlice[float32])
16 testFloat64x4Binary(t, archsimd.Float64x4.Add, addSlice[float64])
17
18 if archsimd.X86.AVX2() {
19 testUint16x16Binary(t, archsimd.Uint16x16.Add, addSlice[uint16])
20 testUint32x8Binary(t, archsimd.Uint32x8.Add, addSlice[uint32])
21 testUint64x4Binary(t, archsimd.Uint64x4.Add, addSlice[uint64])
22 testUint8x32Binary(t, archsimd.Uint8x32.Add, addSlice[uint8])
23 }
24
25 if archsimd.X86.AVX2() {
26 testInt16x16Binary(t, archsimd.Int16x16.Add, addSlice[int16])
27 testInt32x8Binary(t, archsimd.Int32x8.Add, addSlice[int32])
28 testInt64x4Binary(t, archsimd.Int64x4.Add, addSlice[int64])
29 testInt8x32Binary(t, archsimd.Int8x32.Add, addSlice[int8])
30 }
31
32 if archsimd.X86.AVX512() {
33 testFloat32x16Binary(t, archsimd.Float32x16.Add, addSlice[float32])
34 testFloat64x8Binary(t, archsimd.Float64x8.Add, addSlice[float64])
35 testInt8x64Binary(t, archsimd.Int8x64.Add, addSlice[int8])
36 testInt16x32Binary(t, archsimd.Int16x32.Add, addSlice[int16])
37 testInt32x16Binary(t, archsimd.Int32x16.Add, addSlice[int32])
38 testInt64x8Binary(t, archsimd.Int64x8.Add, addSlice[int64])
39 testUint8x64Binary(t, archsimd.Uint8x64.Add, addSlice[uint8])
40 testUint16x32Binary(t, archsimd.Uint16x32.Add, addSlice[uint16])
41 testUint32x16Binary(t, archsimd.Uint32x16.Add, addSlice[uint32])
42 testUint64x8Binary(t, archsimd.Uint64x8.Add, addSlice[uint64])
43 }
44 }
45
46 func TestSubAMD64(t *testing.T) {
47 testFloat32x8Binary(t, archsimd.Float32x8.Sub, subSlice[float32])
48 testFloat64x4Binary(t, archsimd.Float64x4.Sub, subSlice[float64])
49
50 if archsimd.X86.AVX2() {
51 testInt16x16Binary(t, archsimd.Int16x16.Sub, subSlice[int16])
52 testInt32x8Binary(t, archsimd.Int32x8.Sub, subSlice[int32])
53 testInt64x4Binary(t, archsimd.Int64x4.Sub, subSlice[int64])
54 testInt8x32Binary(t, archsimd.Int8x32.Sub, subSlice[int8])
55 }
56
57 if archsimd.X86.AVX2() {
58 testUint16x16Binary(t, archsimd.Uint16x16.Sub, subSlice[uint16])
59 testUint32x8Binary(t, archsimd.Uint32x8.Sub, subSlice[uint32])
60 testUint64x4Binary(t, archsimd.Uint64x4.Sub, subSlice[uint64])
61 testUint8x32Binary(t, archsimd.Uint8x32.Sub, subSlice[uint8])
62 }
63
64 if archsimd.X86.AVX512() {
65 testFloat32x16Binary(t, archsimd.Float32x16.Sub, subSlice[float32])
66 testFloat64x8Binary(t, archsimd.Float64x8.Sub, subSlice[float64])
67 testInt8x64Binary(t, archsimd.Int8x64.Sub, subSlice[int8])
68 testInt16x32Binary(t, archsimd.Int16x32.Sub, subSlice[int16])
69 testInt32x16Binary(t, archsimd.Int32x16.Sub, subSlice[int32])
70 testInt64x8Binary(t, archsimd.Int64x8.Sub, subSlice[int64])
71 testUint8x64Binary(t, archsimd.Uint8x64.Sub, subSlice[uint8])
72 testUint16x32Binary(t, archsimd.Uint16x32.Sub, subSlice[uint16])
73 testUint32x16Binary(t, archsimd.Uint32x16.Sub, subSlice[uint32])
74 testUint64x8Binary(t, archsimd.Uint64x8.Sub, subSlice[uint64])
75 }
76 }
77
78 func TestMaxAMD64(t *testing.T) {
79
80
81
82 if archsimd.X86.AVX2() {
83 testInt16x16Binary(t, archsimd.Int16x16.Max, maxSlice[int16])
84 testInt32x8Binary(t, archsimd.Int32x8.Max, maxSlice[int32])
85 testInt8x32Binary(t, archsimd.Int8x32.Max, maxSlice[int8])
86 testUint16x16Binary(t, archsimd.Uint16x16.Max, maxSlice[uint16])
87 testUint32x8Binary(t, archsimd.Uint32x8.Max, maxSlice[uint32])
88 testUint8x32Binary(t, archsimd.Uint8x32.Max, maxSlice[uint8])
89 }
90
91 if archsimd.X86.AVX512() {
92
93
94 testInt64x2Binary(t, archsimd.Int64x2.Max, maxSlice[int64])
95 testInt64x4Binary(t, archsimd.Int64x4.Max, maxSlice[int64])
96 testUint64x2Binary(t, archsimd.Uint64x2.Max, maxSlice[uint64])
97 testUint64x4Binary(t, archsimd.Uint64x4.Max, maxSlice[uint64])
98 testInt8x64Binary(t, archsimd.Int8x64.Max, maxSlice[int8])
99 testInt16x32Binary(t, archsimd.Int16x32.Max, maxSlice[int16])
100 testInt32x16Binary(t, archsimd.Int32x16.Max, maxSlice[int32])
101 testInt64x8Binary(t, archsimd.Int64x8.Max, maxSlice[int64])
102 testUint8x64Binary(t, archsimd.Uint8x64.Max, maxSlice[uint8])
103 testUint16x32Binary(t, archsimd.Uint16x32.Max, maxSlice[uint16])
104 testUint32x16Binary(t, archsimd.Uint32x16.Max, maxSlice[uint32])
105 testUint64x8Binary(t, archsimd.Uint64x8.Max, maxSlice[uint64])
106 }
107 }
108
109 func TestMinAMD64(t *testing.T) {
110
111
112
113 if archsimd.X86.AVX2() {
114 testInt16x16Binary(t, archsimd.Int16x16.Min, minSlice[int16])
115 testInt32x8Binary(t, archsimd.Int32x8.Min, minSlice[int32])
116 testInt8x32Binary(t, archsimd.Int8x32.Min, minSlice[int8])
117 testUint16x16Binary(t, archsimd.Uint16x16.Min, minSlice[uint16])
118 testUint32x8Binary(t, archsimd.Uint32x8.Min, minSlice[uint32])
119 testUint8x32Binary(t, archsimd.Uint8x32.Min, minSlice[uint8])
120 }
121
122 if archsimd.X86.AVX512() {
123
124
125 testInt64x2Binary(t, archsimd.Int64x2.Min, minSlice[int64])
126 testInt64x4Binary(t, archsimd.Int64x4.Min, minSlice[int64])
127 testUint64x2Binary(t, archsimd.Uint64x2.Min, minSlice[uint64])
128 testUint64x4Binary(t, archsimd.Uint64x4.Min, minSlice[uint64])
129 testInt8x64Binary(t, archsimd.Int8x64.Min, minSlice[int8])
130 testInt16x32Binary(t, archsimd.Int16x32.Min, minSlice[int16])
131 testInt32x16Binary(t, archsimd.Int32x16.Min, minSlice[int32])
132 testInt64x8Binary(t, archsimd.Int64x8.Min, minSlice[int64])
133 testUint8x64Binary(t, archsimd.Uint8x64.Min, minSlice[uint8])
134 testUint16x32Binary(t, archsimd.Uint16x32.Min, minSlice[uint16])
135 testUint32x16Binary(t, archsimd.Uint32x16.Min, minSlice[uint32])
136 testUint64x8Binary(t, archsimd.Uint64x8.Min, minSlice[uint64])
137 }
138 }
139
140 func TestAndAMD64(t *testing.T) {
141 if archsimd.X86.AVX2() {
142 testInt16x16Binary(t, archsimd.Int16x16.And, andSlice[int16])
143 testInt32x8Binary(t, archsimd.Int32x8.And, andSlice[int32])
144 testInt64x4Binary(t, archsimd.Int64x4.And, andSlice[int64])
145 testInt8x32Binary(t, archsimd.Int8x32.And, andSlice[int8])
146
147 testUint16x16Binary(t, archsimd.Uint16x16.And, andSlice[uint16])
148 testUint32x8Binary(t, archsimd.Uint32x8.And, andSlice[uint32])
149 testUint64x4Binary(t, archsimd.Uint64x4.And, andSlice[uint64])
150 testUint8x32Binary(t, archsimd.Uint8x32.And, andSlice[uint8])
151 }
152
153 if archsimd.X86.AVX512() {
154 testInt8x64Binary(t, archsimd.Int8x64.And, andSlice[int8])
155 testInt16x32Binary(t, archsimd.Int16x32.And, andSlice[int16])
156 testInt32x16Binary(t, archsimd.Int32x16.And, andSlice[int32])
157 testInt64x8Binary(t, archsimd.Int64x8.And, andSlice[int64])
158 testUint8x64Binary(t, archsimd.Uint8x64.And, andSlice[uint8])
159 testUint16x32Binary(t, archsimd.Uint16x32.And, andSlice[uint16])
160 testUint32x16Binary(t, archsimd.Uint32x16.And, andSlice[uint32])
161 testUint64x8Binary(t, archsimd.Uint64x8.And, andSlice[uint64])
162 }
163 }
164
165 func TestAndNotAMD64(t *testing.T) {
166 if archsimd.X86.AVX2() {
167 testInt16x16Binary(t, archsimd.Int16x16.AndNot, andNotSlice[int16])
168 testInt32x8Binary(t, archsimd.Int32x8.AndNot, andNotSlice[int32])
169 testInt64x4Binary(t, archsimd.Int64x4.AndNot, andNotSlice[int64])
170 testInt8x32Binary(t, archsimd.Int8x32.AndNot, andNotSlice[int8])
171
172 testUint16x16Binary(t, archsimd.Uint16x16.AndNot, andNotSlice[uint16])
173 testUint32x8Binary(t, archsimd.Uint32x8.AndNot, andNotSlice[uint32])
174 testUint64x4Binary(t, archsimd.Uint64x4.AndNot, andNotSlice[uint64])
175 testUint8x32Binary(t, archsimd.Uint8x32.AndNot, andNotSlice[uint8])
176 }
177
178 if archsimd.X86.AVX512() {
179 testInt8x64Binary(t, archsimd.Int8x64.AndNot, andNotSlice[int8])
180 testInt16x32Binary(t, archsimd.Int16x32.AndNot, andNotSlice[int16])
181 testInt32x16Binary(t, archsimd.Int32x16.AndNot, andNotSlice[int32])
182 testInt64x8Binary(t, archsimd.Int64x8.AndNot, andNotSlice[int64])
183 testUint8x64Binary(t, archsimd.Uint8x64.AndNot, andNotSlice[uint8])
184 testUint16x32Binary(t, archsimd.Uint16x32.AndNot, andNotSlice[uint16])
185 testUint32x16Binary(t, archsimd.Uint32x16.AndNot, andNotSlice[uint32])
186 testUint64x8Binary(t, archsimd.Uint64x8.AndNot, andNotSlice[uint64])
187 }
188 }
189
190 func TestXorAMD64(t *testing.T) {
191 if archsimd.X86.AVX2() {
192 testInt16x16Binary(t, archsimd.Int16x16.Xor, xorSlice[int16])
193 testInt32x8Binary(t, archsimd.Int32x8.Xor, xorSlice[int32])
194 testInt64x4Binary(t, archsimd.Int64x4.Xor, xorSlice[int64])
195 testInt8x32Binary(t, archsimd.Int8x32.Xor, xorSlice[int8])
196
197 testUint16x16Binary(t, archsimd.Uint16x16.Xor, xorSlice[uint16])
198 testUint32x8Binary(t, archsimd.Uint32x8.Xor, xorSlice[uint32])
199 testUint64x4Binary(t, archsimd.Uint64x4.Xor, xorSlice[uint64])
200 testUint8x32Binary(t, archsimd.Uint8x32.Xor, xorSlice[uint8])
201 }
202
203 if archsimd.X86.AVX512() {
204 testInt8x64Binary(t, archsimd.Int8x64.Xor, xorSlice[int8])
205 testInt16x32Binary(t, archsimd.Int16x32.Xor, xorSlice[int16])
206 testInt32x16Binary(t, archsimd.Int32x16.Xor, xorSlice[int32])
207 testInt64x8Binary(t, archsimd.Int64x8.Xor, xorSlice[int64])
208 testUint8x64Binary(t, archsimd.Uint8x64.Xor, xorSlice[uint8])
209 testUint16x32Binary(t, archsimd.Uint16x32.Xor, xorSlice[uint16])
210 testUint32x16Binary(t, archsimd.Uint32x16.Xor, xorSlice[uint32])
211 testUint64x8Binary(t, archsimd.Uint64x8.Xor, xorSlice[uint64])
212 }
213 }
214
215 func TestOrAMD64(t *testing.T) {
216 if archsimd.X86.AVX2() {
217 testInt16x16Binary(t, archsimd.Int16x16.Or, orSlice[int16])
218 testInt32x8Binary(t, archsimd.Int32x8.Or, orSlice[int32])
219 testInt64x4Binary(t, archsimd.Int64x4.Or, orSlice[int64])
220 testInt8x32Binary(t, archsimd.Int8x32.Or, orSlice[int8])
221
222 testUint16x16Binary(t, archsimd.Uint16x16.Or, orSlice[uint16])
223 testUint32x8Binary(t, archsimd.Uint32x8.Or, orSlice[uint32])
224 testUint64x4Binary(t, archsimd.Uint64x4.Or, orSlice[uint64])
225 testUint8x32Binary(t, archsimd.Uint8x32.Or, orSlice[uint8])
226 }
227
228 if archsimd.X86.AVX512() {
229 testInt8x64Binary(t, archsimd.Int8x64.Or, orSlice[int8])
230 testInt16x32Binary(t, archsimd.Int16x32.Or, orSlice[int16])
231 testInt32x16Binary(t, archsimd.Int32x16.Or, orSlice[int32])
232 testInt64x8Binary(t, archsimd.Int64x8.Or, orSlice[int64])
233 testUint8x64Binary(t, archsimd.Uint8x64.Or, orSlice[uint8])
234 testUint16x32Binary(t, archsimd.Uint16x32.Or, orSlice[uint16])
235 testUint32x16Binary(t, archsimd.Uint32x16.Or, orSlice[uint32])
236 testUint64x8Binary(t, archsimd.Uint64x8.Or, orSlice[uint64])
237 }
238 }
239
240 func TestMulAMD64(t *testing.T) {
241 testFloat32x8Binary(t, archsimd.Float32x8.Mul, mulSlice[float32])
242 testFloat64x4Binary(t, archsimd.Float64x4.Mul, mulSlice[float64])
243
244 if archsimd.X86.AVX2() {
245 testInt16x16Binary(t, archsimd.Int16x16.Mul, mulSlice[int16])
246 testInt32x8Binary(t, archsimd.Int32x8.Mul, mulSlice[int32])
247 testInt8x32Binary(t, archsimd.Int8x32.Mul, mulSlice[int8])
248 testUint8x32Binary(t, archsimd.Uint8x32.Mul, mulSlice[uint8])
249 }
250
251
252
253
254
255
256
257
258
259
260
261
262 if archsimd.X86.AVX512() {
263 testInt64x2Binary(t, archsimd.Int64x2.Mul, mulSlice[int64])
264 testInt64x4Binary(t, archsimd.Int64x4.Mul, mulSlice[int64])
265
266 testFloat32x16Binary(t, archsimd.Float32x16.Mul, mulSlice[float32])
267 testFloat64x8Binary(t, archsimd.Float64x8.Mul, mulSlice[float64])
268
269
270 testInt16x32Binary(t, archsimd.Int16x32.Mul, mulSlice[int16])
271 testInt32x16Binary(t, archsimd.Int32x16.Mul, mulSlice[int32])
272 testInt64x8Binary(t, archsimd.Int64x8.Mul, mulSlice[int64])
273
274
275
276
277
278
279 }
280 }
281
282 func TestDivAMD64(t *testing.T) {
283 testFloat32x8Binary(t, archsimd.Float32x8.Div, divSlice[float32])
284 testFloat64x4Binary(t, archsimd.Float64x4.Div, divSlice[float64])
285
286 if archsimd.X86.AVX512() {
287 testFloat32x16Binary(t, archsimd.Float32x16.Div, divSlice[float32])
288 testFloat64x8Binary(t, archsimd.Float64x8.Div, divSlice[float64])
289 }
290 }
291
292 func TestInterleaveLo(t *testing.T) {
293 testInt8x16Binary(t, archsimd.Int8x16.InterleaveLo, interleaveSlice[int8](128, false))
294 testInt16x8Binary(t, archsimd.Int16x8.InterleaveLo, interleaveSlice[int16](128, false))
295 testInt32x4Binary(t, archsimd.Int32x4.InterleaveLo, interleaveSlice[int32](128, false))
296 testInt64x2Binary(t, archsimd.Int64x2.InterleaveLo, interleaveSlice[int64](128, false))
297 testUint8x16Binary(t, archsimd.Uint8x16.InterleaveLo, interleaveSlice[uint8](128, false))
298 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveLo, interleaveSlice[uint16](128, false))
299 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveLo, interleaveSlice[uint32](128, false))
300 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveLo, interleaveSlice[uint64](128, false))
301
302 if archsimd.X86.AVX2() {
303 testInt8x32Binary(t, archsimd.Int8x32.InterleaveLoGrouped, interleaveSlice[int8](128, false))
304 testInt16x16Binary(t, archsimd.Int16x16.InterleaveLoGrouped, interleaveSlice[int16](128, false))
305 testInt32x8Binary(t, archsimd.Int32x8.InterleaveLoGrouped, interleaveSlice[int32](128, false))
306 testInt64x4Binary(t, archsimd.Int64x4.InterleaveLoGrouped, interleaveSlice[int64](128, false))
307 testUint8x32Binary(t, archsimd.Uint8x32.InterleaveLoGrouped, interleaveSlice[uint8](128, false))
308 testUint16x16Binary(t, archsimd.Uint16x16.InterleaveLoGrouped, interleaveSlice[uint16](128, false))
309 testUint32x8Binary(t, archsimd.Uint32x8.InterleaveLoGrouped, interleaveSlice[uint32](128, false))
310 testUint64x4Binary(t, archsimd.Uint64x4.InterleaveLoGrouped, interleaveSlice[uint64](128, false))
311 }
312
313 if archsimd.X86.AVX512() {
314 testInt8x64Binary(t, archsimd.Int8x64.InterleaveLoGrouped, interleaveSlice[int8](128, false))
315 testInt16x32Binary(t, archsimd.Int16x32.InterleaveLoGrouped, interleaveSlice[int16](128, false))
316 testInt32x16Binary(t, archsimd.Int32x16.InterleaveLoGrouped, interleaveSlice[int32](128, false))
317 testInt64x8Binary(t, archsimd.Int64x8.InterleaveLoGrouped, interleaveSlice[int64](128, false))
318 testUint8x64Binary(t, archsimd.Uint8x64.InterleaveLoGrouped, interleaveSlice[uint8](128, false))
319 testUint16x32Binary(t, archsimd.Uint16x32.InterleaveLoGrouped, interleaveSlice[uint16](128, false))
320 testUint32x16Binary(t, archsimd.Uint32x16.InterleaveLoGrouped, interleaveSlice[uint32](128, false))
321 testUint64x8Binary(t, archsimd.Uint64x8.InterleaveLoGrouped, interleaveSlice[uint64](128, false))
322 }
323 }
324
325 func TestInterleaveHi(t *testing.T) {
326 testInt8x16Binary(t, archsimd.Int8x16.InterleaveHi, interleaveSlice[int8](128, true))
327 testInt16x8Binary(t, archsimd.Int16x8.InterleaveHi, interleaveSlice[int16](128, true))
328 testInt32x4Binary(t, archsimd.Int32x4.InterleaveHi, interleaveSlice[int32](128, true))
329 testInt64x2Binary(t, archsimd.Int64x2.InterleaveHi, interleaveSlice[int64](128, true))
330 testUint8x16Binary(t, archsimd.Uint8x16.InterleaveHi, interleaveSlice[uint8](128, true))
331 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveHi, interleaveSlice[uint16](128, true))
332 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveHi, interleaveSlice[uint32](128, true))
333 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveHi, interleaveSlice[uint64](128, true))
334
335 if archsimd.X86.AVX2() {
336 testInt8x32Binary(t, archsimd.Int8x32.InterleaveHiGrouped, interleaveSlice[int8](128, true))
337 testInt16x16Binary(t, archsimd.Int16x16.InterleaveHiGrouped, interleaveSlice[int16](128, true))
338 testInt32x8Binary(t, archsimd.Int32x8.InterleaveHiGrouped, interleaveSlice[int32](128, true))
339 testInt64x4Binary(t, archsimd.Int64x4.InterleaveHiGrouped, interleaveSlice[int64](128, true))
340 testUint8x32Binary(t, archsimd.Uint8x32.InterleaveHiGrouped, interleaveSlice[uint8](128, true))
341 testUint16x16Binary(t, archsimd.Uint16x16.InterleaveHiGrouped, interleaveSlice[uint16](128, true))
342 testUint32x8Binary(t, archsimd.Uint32x8.InterleaveHiGrouped, interleaveSlice[uint32](128, true))
343 testUint64x4Binary(t, archsimd.Uint64x4.InterleaveHiGrouped, interleaveSlice[uint64](128, true))
344 }
345
346 if archsimd.X86.AVX512() {
347 testInt8x64Binary(t, archsimd.Int8x64.InterleaveHiGrouped, interleaveSlice[int8](128, true))
348 testInt16x32Binary(t, archsimd.Int16x32.InterleaveHiGrouped, interleaveSlice[int16](128, true))
349 testInt32x16Binary(t, archsimd.Int32x16.InterleaveHiGrouped, interleaveSlice[int32](128, true))
350 testInt64x8Binary(t, archsimd.Int64x8.InterleaveHiGrouped, interleaveSlice[int64](128, true))
351 testUint8x64Binary(t, archsimd.Uint8x64.InterleaveHiGrouped, interleaveSlice[uint8](128, true))
352 testUint16x32Binary(t, archsimd.Uint16x32.InterleaveHiGrouped, interleaveSlice[uint16](128, true))
353 testUint32x16Binary(t, archsimd.Uint32x16.InterleaveHiGrouped, interleaveSlice[uint32](128, true))
354 testUint64x8Binary(t, archsimd.Uint64x8.InterleaveHiGrouped, interleaveSlice[uint64](128, true))
355 }
356 }
357
View as plain text