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 testInt16x8Binary(t, archsimd.Int16x8.InterleaveLo, interleaveSlice[int16](128, false))
294 testInt32x4Binary(t, archsimd.Int32x4.InterleaveLo, interleaveSlice[int32](128, false))
295 testInt64x2Binary(t, archsimd.Int64x2.InterleaveLo, interleaveSlice[int64](128, false))
296 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveLo, interleaveSlice[uint16](128, false))
297 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveLo, interleaveSlice[uint32](128, false))
298 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveLo, interleaveSlice[uint64](128, false))
299
300 if archsimd.X86.AVX2() {
301 testInt16x16Binary(t, archsimd.Int16x16.InterleaveLoGrouped, interleaveSlice[int16](128, false))
302 testInt32x8Binary(t, archsimd.Int32x8.InterleaveLoGrouped, interleaveSlice[int32](128, false))
303 testInt64x4Binary(t, archsimd.Int64x4.InterleaveLoGrouped, interleaveSlice[int64](128, false))
304 testUint16x16Binary(t, archsimd.Uint16x16.InterleaveLoGrouped, interleaveSlice[uint16](128, false))
305 testUint32x8Binary(t, archsimd.Uint32x8.InterleaveLoGrouped, interleaveSlice[uint32](128, false))
306 testUint64x4Binary(t, archsimd.Uint64x4.InterleaveLoGrouped, interleaveSlice[uint64](128, false))
307 }
308
309 if archsimd.X86.AVX512() {
310 testInt16x32Binary(t, archsimd.Int16x32.InterleaveLoGrouped, interleaveSlice[int16](128, false))
311 testInt32x16Binary(t, archsimd.Int32x16.InterleaveLoGrouped, interleaveSlice[int32](128, false))
312 testInt64x8Binary(t, archsimd.Int64x8.InterleaveLoGrouped, interleaveSlice[int64](128, false))
313 testUint16x32Binary(t, archsimd.Uint16x32.InterleaveLoGrouped, interleaveSlice[uint16](128, false))
314 testUint32x16Binary(t, archsimd.Uint32x16.InterleaveLoGrouped, interleaveSlice[uint32](128, false))
315 testUint64x8Binary(t, archsimd.Uint64x8.InterleaveLoGrouped, interleaveSlice[uint64](128, false))
316 }
317 }
318
319 func TestInterleaveHi(t *testing.T) {
320 testInt16x8Binary(t, archsimd.Int16x8.InterleaveHi, interleaveSlice[int16](128, true))
321 testInt32x4Binary(t, archsimd.Int32x4.InterleaveHi, interleaveSlice[int32](128, true))
322 testInt64x2Binary(t, archsimd.Int64x2.InterleaveHi, interleaveSlice[int64](128, true))
323 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveHi, interleaveSlice[uint16](128, true))
324 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveHi, interleaveSlice[uint32](128, true))
325 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveHi, interleaveSlice[uint64](128, true))
326
327 if archsimd.X86.AVX2() {
328 testInt16x16Binary(t, archsimd.Int16x16.InterleaveHiGrouped, interleaveSlice[int16](128, true))
329 testInt32x8Binary(t, archsimd.Int32x8.InterleaveHiGrouped, interleaveSlice[int32](128, true))
330 testInt64x4Binary(t, archsimd.Int64x4.InterleaveHiGrouped, interleaveSlice[int64](128, true))
331 testUint16x16Binary(t, archsimd.Uint16x16.InterleaveHiGrouped, interleaveSlice[uint16](128, true))
332 testUint32x8Binary(t, archsimd.Uint32x8.InterleaveHiGrouped, interleaveSlice[uint32](128, true))
333 testUint64x4Binary(t, archsimd.Uint64x4.InterleaveHiGrouped, interleaveSlice[uint64](128, true))
334 }
335
336 if archsimd.X86.AVX512() {
337 testInt16x32Binary(t, archsimd.Int16x32.InterleaveHiGrouped, interleaveSlice[int16](128, true))
338 testInt32x16Binary(t, archsimd.Int32x16.InterleaveHiGrouped, interleaveSlice[int32](128, true))
339 testInt64x8Binary(t, archsimd.Int64x8.InterleaveHiGrouped, interleaveSlice[int64](128, true))
340 testUint16x32Binary(t, archsimd.Uint16x32.InterleaveHiGrouped, interleaveSlice[uint16](128, true))
341 testUint32x16Binary(t, archsimd.Uint32x16.InterleaveHiGrouped, interleaveSlice[uint32](128, true))
342 testUint64x8Binary(t, archsimd.Uint64x8.InterleaveHiGrouped, interleaveSlice[uint64](128, true))
343 }
344 }
345
View as plain text