1
2
3
4
5
6
7 package simd_test
8
9 import (
10 "simd/archsimd"
11 "testing"
12 )
13
14
15
16 var comparisonFixed bool = archsimd.X86.AVX512()
17
18 func TestLess(t *testing.T) {
19 testFloat32x4Compare(t, archsimd.Float32x4.Less, lessSlice[float32])
20 testFloat32x8Compare(t, archsimd.Float32x8.Less, lessSlice[float32])
21 testFloat64x2Compare(t, archsimd.Float64x2.Less, lessSlice[float64])
22 testFloat64x4Compare(t, archsimd.Float64x4.Less, lessSlice[float64])
23
24 testInt16x8Compare(t, archsimd.Int16x8.Less, lessSlice[int16])
25 testInt32x4Compare(t, archsimd.Int32x4.Less, lessSlice[int32])
26 testInt64x2Compare(t, archsimd.Int64x2.Less, lessSlice[int64])
27 testInt8x16Compare(t, archsimd.Int8x16.Less, lessSlice[int8])
28
29 if archsimd.X86.AVX2() {
30 testInt16x16Compare(t, archsimd.Int16x16.Less, lessSlice[int16])
31 testInt32x8Compare(t, archsimd.Int32x8.Less, lessSlice[int32])
32 testInt64x4Compare(t, archsimd.Int64x4.Less, lessSlice[int64])
33 testInt8x32Compare(t, archsimd.Int8x32.Less, lessSlice[int8])
34
35 testInt16x16Compare(t, archsimd.Int16x16.Less, lessSlice[int16])
36 testInt32x8Compare(t, archsimd.Int32x8.Less, lessSlice[int32])
37 testInt64x4Compare(t, archsimd.Int64x4.Less, lessSlice[int64])
38 testInt8x32Compare(t, archsimd.Int8x32.Less, lessSlice[int8])
39 }
40
41 testInt16x8Compare(t, archsimd.Int16x8.Less, lessSlice[int16])
42 testInt32x4Compare(t, archsimd.Int32x4.Less, lessSlice[int32])
43 testInt64x2Compare(t, archsimd.Int64x2.Less, lessSlice[int64])
44 testInt8x16Compare(t, archsimd.Int8x16.Less, lessSlice[int8])
45
46 testUint16x8Compare(t, archsimd.Uint16x8.Less, lessSlice[uint16])
47 testUint32x4Compare(t, archsimd.Uint32x4.Less, lessSlice[uint32])
48 testUint64x2Compare(t, archsimd.Uint64x2.Less, lessSlice[uint64])
49 testUint8x16Compare(t, archsimd.Uint8x16.Less, lessSlice[uint8])
50
51 if archsimd.X86.AVX2() {
52 testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
53 testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
54 testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
55 testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
56 }
57
58 if archsimd.X86.AVX512() {
59 testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
60 testUint16x8Compare(t, archsimd.Uint16x8.Less, lessSlice[uint16])
61 testUint32x4Compare(t, archsimd.Uint32x4.Less, lessSlice[uint32])
62 testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
63 testUint64x2Compare(t, archsimd.Uint64x2.Less, lessSlice[uint64])
64 testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
65 testUint8x16Compare(t, archsimd.Uint8x16.Less, lessSlice[uint8])
66 testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
67
68 testFloat32x16Compare(t, archsimd.Float32x16.Less, lessSlice[float32])
69 testFloat64x8Compare(t, archsimd.Float64x8.Less, lessSlice[float64])
70 testInt8x64Compare(t, archsimd.Int8x64.Less, lessSlice[int8])
71 testInt16x32Compare(t, archsimd.Int16x32.Less, lessSlice[int16])
72 testInt32x16Compare(t, archsimd.Int32x16.Less, lessSlice[int32])
73 testInt64x8Compare(t, archsimd.Int64x8.Less, lessSlice[int64])
74 testUint8x64Compare(t, archsimd.Uint8x64.Less, lessSlice[uint8])
75 testUint16x32Compare(t, archsimd.Uint16x32.Less, lessSlice[uint16])
76 testUint32x16Compare(t, archsimd.Uint32x16.Less, lessSlice[uint32])
77 testUint64x8Compare(t, archsimd.Uint64x8.Less, lessSlice[uint64])
78 }
79 }
80
81 func TestLessEqual(t *testing.T) {
82 testFloat32x4Compare(t, archsimd.Float32x4.LessEqual, lessEqualSlice[float32])
83 testFloat32x8Compare(t, archsimd.Float32x8.LessEqual, lessEqualSlice[float32])
84 testFloat64x2Compare(t, archsimd.Float64x2.LessEqual, lessEqualSlice[float64])
85 testFloat64x4Compare(t, archsimd.Float64x4.LessEqual, lessEqualSlice[float64])
86
87 testInt16x8Compare(t, archsimd.Int16x8.LessEqual, lessEqualSlice[int16])
88 testInt32x4Compare(t, archsimd.Int32x4.LessEqual, lessEqualSlice[int32])
89 testInt64x2Compare(t, archsimd.Int64x2.LessEqual, lessEqualSlice[int64])
90 testInt8x16Compare(t, archsimd.Int8x16.LessEqual, lessEqualSlice[int8])
91
92 if archsimd.X86.AVX2() {
93 testInt16x16Compare(t, archsimd.Int16x16.LessEqual, lessEqualSlice[int16])
94 testInt32x8Compare(t, archsimd.Int32x8.LessEqual, lessEqualSlice[int32])
95 testInt64x4Compare(t, archsimd.Int64x4.LessEqual, lessEqualSlice[int64])
96 testInt8x32Compare(t, archsimd.Int8x32.LessEqual, lessEqualSlice[int8])
97 }
98
99 testUint16x8Compare(t, archsimd.Uint16x8.LessEqual, lessEqualSlice[uint16])
100 testUint32x4Compare(t, archsimd.Uint32x4.LessEqual, lessEqualSlice[uint32])
101 testUint64x2Compare(t, archsimd.Uint64x2.LessEqual, lessEqualSlice[uint64])
102 testUint8x16Compare(t, archsimd.Uint8x16.LessEqual, lessEqualSlice[uint8])
103
104 if archsimd.X86.AVX2() {
105 testUint16x16Compare(t, archsimd.Uint16x16.LessEqual, lessEqualSlice[uint16])
106 testUint32x8Compare(t, archsimd.Uint32x8.LessEqual, lessEqualSlice[uint32])
107 testUint64x4Compare(t, archsimd.Uint64x4.LessEqual, lessEqualSlice[uint64])
108 testUint8x32Compare(t, archsimd.Uint8x32.LessEqual, lessEqualSlice[uint8])
109 }
110
111 if archsimd.X86.AVX512() {
112 testFloat32x16Compare(t, archsimd.Float32x16.LessEqual, lessEqualSlice[float32])
113 testFloat64x8Compare(t, archsimd.Float64x8.LessEqual, lessEqualSlice[float64])
114 testInt8x64Compare(t, archsimd.Int8x64.LessEqual, lessEqualSlice[int8])
115 testInt16x32Compare(t, archsimd.Int16x32.LessEqual, lessEqualSlice[int16])
116 testInt32x16Compare(t, archsimd.Int32x16.LessEqual, lessEqualSlice[int32])
117 testInt64x8Compare(t, archsimd.Int64x8.LessEqual, lessEqualSlice[int64])
118 testUint8x64Compare(t, archsimd.Uint8x64.LessEqual, lessEqualSlice[uint8])
119 testUint16x32Compare(t, archsimd.Uint16x32.LessEqual, lessEqualSlice[uint16])
120 testUint32x16Compare(t, archsimd.Uint32x16.LessEqual, lessEqualSlice[uint32])
121 testUint64x8Compare(t, archsimd.Uint64x8.LessEqual, lessEqualSlice[uint64])
122 }
123 }
124
125 func TestGreater(t *testing.T) {
126 testFloat32x4Compare(t, archsimd.Float32x4.Greater, greaterSlice[float32])
127 testFloat32x8Compare(t, archsimd.Float32x8.Greater, greaterSlice[float32])
128 testFloat64x2Compare(t, archsimd.Float64x2.Greater, greaterSlice[float64])
129 testFloat64x4Compare(t, archsimd.Float64x4.Greater, greaterSlice[float64])
130
131 testInt16x8Compare(t, archsimd.Int16x8.Greater, greaterSlice[int16])
132 testInt32x4Compare(t, archsimd.Int32x4.Greater, greaterSlice[int32])
133 testInt64x2Compare(t, archsimd.Int64x2.Greater, greaterSlice[int64])
134 testInt8x16Compare(t, archsimd.Int8x16.Greater, greaterSlice[int8])
135
136 if archsimd.X86.AVX2() {
137 testInt16x16Compare(t, archsimd.Int16x16.Greater, greaterSlice[int16])
138 testInt32x8Compare(t, archsimd.Int32x8.Greater, greaterSlice[int32])
139 testInt64x4Compare(t, archsimd.Int64x4.Greater, greaterSlice[int64])
140 testInt8x32Compare(t, archsimd.Int8x32.Greater, greaterSlice[int8])
141 }
142
143 testUint16x8Compare(t, archsimd.Uint16x8.Greater, greaterSlice[uint16])
144 testUint32x4Compare(t, archsimd.Uint32x4.Greater, greaterSlice[uint32])
145 testUint64x2Compare(t, archsimd.Uint64x2.Greater, greaterSlice[uint64])
146 testUint8x16Compare(t, archsimd.Uint8x16.Greater, greaterSlice[uint8])
147
148 if archsimd.X86.AVX2() {
149 testUint16x16Compare(t, archsimd.Uint16x16.Greater, greaterSlice[uint16])
150 testUint32x8Compare(t, archsimd.Uint32x8.Greater, greaterSlice[uint32])
151 testUint64x4Compare(t, archsimd.Uint64x4.Greater, greaterSlice[uint64])
152 testUint8x32Compare(t, archsimd.Uint8x32.Greater, greaterSlice[uint8])
153 }
154
155 if archsimd.X86.AVX512() {
156
157 testFloat32x16Compare(t, archsimd.Float32x16.Greater, greaterSlice[float32])
158 testFloat64x8Compare(t, archsimd.Float64x8.Greater, greaterSlice[float64])
159 testInt8x64Compare(t, archsimd.Int8x64.Greater, greaterSlice[int8])
160 testInt16x32Compare(t, archsimd.Int16x32.Greater, greaterSlice[int16])
161 testInt32x16Compare(t, archsimd.Int32x16.Greater, greaterSlice[int32])
162 testInt64x8Compare(t, archsimd.Int64x8.Greater, greaterSlice[int64])
163 testUint8x64Compare(t, archsimd.Uint8x64.Greater, greaterSlice[uint8])
164 testUint16x32Compare(t, archsimd.Uint16x32.Greater, greaterSlice[uint16])
165 testUint32x16Compare(t, archsimd.Uint32x16.Greater, greaterSlice[uint32])
166 testUint64x8Compare(t, archsimd.Uint64x8.Greater, greaterSlice[uint64])
167 }
168 }
169
170 func TestGreaterEqual(t *testing.T) {
171 testFloat32x4Compare(t, archsimd.Float32x4.GreaterEqual, greaterEqualSlice[float32])
172 testFloat32x8Compare(t, archsimd.Float32x8.GreaterEqual, greaterEqualSlice[float32])
173 testFloat64x2Compare(t, archsimd.Float64x2.GreaterEqual, greaterEqualSlice[float64])
174 testFloat64x4Compare(t, archsimd.Float64x4.GreaterEqual, greaterEqualSlice[float64])
175
176 testInt16x8Compare(t, archsimd.Int16x8.GreaterEqual, greaterEqualSlice[int16])
177 testInt32x4Compare(t, archsimd.Int32x4.GreaterEqual, greaterEqualSlice[int32])
178 testInt64x2Compare(t, archsimd.Int64x2.GreaterEqual, greaterEqualSlice[int64])
179 testInt8x16Compare(t, archsimd.Int8x16.GreaterEqual, greaterEqualSlice[int8])
180
181 if archsimd.X86.AVX2() {
182 testInt16x16Compare(t, archsimd.Int16x16.GreaterEqual, greaterEqualSlice[int16])
183 testInt32x8Compare(t, archsimd.Int32x8.GreaterEqual, greaterEqualSlice[int32])
184 testInt64x4Compare(t, archsimd.Int64x4.GreaterEqual, greaterEqualSlice[int64])
185 testInt8x32Compare(t, archsimd.Int8x32.GreaterEqual, greaterEqualSlice[int8])
186 }
187
188 testUint16x8Compare(t, archsimd.Uint16x8.GreaterEqual, greaterEqualSlice[uint16])
189 testUint32x4Compare(t, archsimd.Uint32x4.GreaterEqual, greaterEqualSlice[uint32])
190 testUint64x2Compare(t, archsimd.Uint64x2.GreaterEqual, greaterEqualSlice[uint64])
191 testUint8x16Compare(t, archsimd.Uint8x16.GreaterEqual, greaterEqualSlice[uint8])
192
193 if archsimd.X86.AVX2() {
194 testUint16x16Compare(t, archsimd.Uint16x16.GreaterEqual, greaterEqualSlice[uint16])
195 testUint32x8Compare(t, archsimd.Uint32x8.GreaterEqual, greaterEqualSlice[uint32])
196 testUint64x4Compare(t, archsimd.Uint64x4.GreaterEqual, greaterEqualSlice[uint64])
197 testUint8x32Compare(t, archsimd.Uint8x32.GreaterEqual, greaterEqualSlice[uint8])
198 }
199
200 if archsimd.X86.AVX512() {
201 testFloat32x16Compare(t, archsimd.Float32x16.GreaterEqual, greaterEqualSlice[float32])
202 testFloat64x8Compare(t, archsimd.Float64x8.GreaterEqual, greaterEqualSlice[float64])
203 testInt8x64Compare(t, archsimd.Int8x64.GreaterEqual, greaterEqualSlice[int8])
204 testInt16x32Compare(t, archsimd.Int16x32.GreaterEqual, greaterEqualSlice[int16])
205 testInt32x16Compare(t, archsimd.Int32x16.GreaterEqual, greaterEqualSlice[int32])
206 testInt64x8Compare(t, archsimd.Int64x8.GreaterEqual, greaterEqualSlice[int64])
207 testUint8x64Compare(t, archsimd.Uint8x64.GreaterEqual, greaterEqualSlice[uint8])
208 testUint16x32Compare(t, archsimd.Uint16x32.GreaterEqual, greaterEqualSlice[uint16])
209 testUint32x16Compare(t, archsimd.Uint32x16.GreaterEqual, greaterEqualSlice[uint32])
210 testUint64x8Compare(t, archsimd.Uint64x8.GreaterEqual, greaterEqualSlice[uint64])
211 }
212 }
213
214 func TestEqual(t *testing.T) {
215 testFloat32x4Compare(t, archsimd.Float32x4.Equal, equalSlice[float32])
216 testFloat32x8Compare(t, archsimd.Float32x8.Equal, equalSlice[float32])
217 testFloat64x2Compare(t, archsimd.Float64x2.Equal, equalSlice[float64])
218 testFloat64x4Compare(t, archsimd.Float64x4.Equal, equalSlice[float64])
219
220 testInt16x8Compare(t, archsimd.Int16x8.Equal, equalSlice[int16])
221 testInt32x4Compare(t, archsimd.Int32x4.Equal, equalSlice[int32])
222 testInt64x2Compare(t, archsimd.Int64x2.Equal, equalSlice[int64])
223 testInt8x16Compare(t, archsimd.Int8x16.Equal, equalSlice[int8])
224
225 if archsimd.X86.AVX2() {
226 testInt16x16Compare(t, archsimd.Int16x16.Equal, equalSlice[int16])
227 testInt32x8Compare(t, archsimd.Int32x8.Equal, equalSlice[int32])
228 testInt64x4Compare(t, archsimd.Int64x4.Equal, equalSlice[int64])
229 testInt8x32Compare(t, archsimd.Int8x32.Equal, equalSlice[int8])
230 }
231
232 testUint16x8Compare(t, archsimd.Uint16x8.Equal, equalSlice[uint16])
233 testUint32x4Compare(t, archsimd.Uint32x4.Equal, equalSlice[uint32])
234 testUint64x2Compare(t, archsimd.Uint64x2.Equal, equalSlice[uint64])
235 testUint8x16Compare(t, archsimd.Uint8x16.Equal, equalSlice[uint8])
236
237 if archsimd.X86.AVX2() {
238 testUint16x16Compare(t, archsimd.Uint16x16.Equal, equalSlice[uint16])
239 testUint32x8Compare(t, archsimd.Uint32x8.Equal, equalSlice[uint32])
240 testUint64x4Compare(t, archsimd.Uint64x4.Equal, equalSlice[uint64])
241 testUint8x32Compare(t, archsimd.Uint8x32.Equal, equalSlice[uint8])
242 }
243
244 if archsimd.X86.AVX512() {
245 testFloat32x16Compare(t, archsimd.Float32x16.Equal, equalSlice[float32])
246 testFloat64x8Compare(t, archsimd.Float64x8.Equal, equalSlice[float64])
247 testInt8x64Compare(t, archsimd.Int8x64.Equal, equalSlice[int8])
248 testInt16x32Compare(t, archsimd.Int16x32.Equal, equalSlice[int16])
249 testInt32x16Compare(t, archsimd.Int32x16.Equal, equalSlice[int32])
250 testInt64x8Compare(t, archsimd.Int64x8.Equal, equalSlice[int64])
251 testUint8x64Compare(t, archsimd.Uint8x64.Equal, equalSlice[uint8])
252 testUint16x32Compare(t, archsimd.Uint16x32.Equal, equalSlice[uint16])
253 testUint32x16Compare(t, archsimd.Uint32x16.Equal, equalSlice[uint32])
254 testUint64x8Compare(t, archsimd.Uint64x8.Equal, equalSlice[uint64])
255 }
256 }
257
258 func TestNotEqual(t *testing.T) {
259 testFloat32x4Compare(t, archsimd.Float32x4.NotEqual, notEqualSlice[float32])
260 testFloat32x8Compare(t, archsimd.Float32x8.NotEqual, notEqualSlice[float32])
261 testFloat64x2Compare(t, archsimd.Float64x2.NotEqual, notEqualSlice[float64])
262 testFloat64x4Compare(t, archsimd.Float64x4.NotEqual, notEqualSlice[float64])
263
264 testInt16x8Compare(t, archsimd.Int16x8.NotEqual, notEqualSlice[int16])
265 testInt32x4Compare(t, archsimd.Int32x4.NotEqual, notEqualSlice[int32])
266 testInt64x2Compare(t, archsimd.Int64x2.NotEqual, notEqualSlice[int64])
267 testInt8x16Compare(t, archsimd.Int8x16.NotEqual, notEqualSlice[int8])
268
269 if archsimd.X86.AVX2() {
270 testInt16x16Compare(t, archsimd.Int16x16.NotEqual, notEqualSlice[int16])
271 testInt32x8Compare(t, archsimd.Int32x8.NotEqual, notEqualSlice[int32])
272 testInt64x4Compare(t, archsimd.Int64x4.NotEqual, notEqualSlice[int64])
273 testInt8x32Compare(t, archsimd.Int8x32.NotEqual, notEqualSlice[int8])
274 }
275
276 testUint16x8Compare(t, archsimd.Uint16x8.NotEqual, notEqualSlice[uint16])
277 testUint32x4Compare(t, archsimd.Uint32x4.NotEqual, notEqualSlice[uint32])
278 testUint64x2Compare(t, archsimd.Uint64x2.NotEqual, notEqualSlice[uint64])
279 testUint8x16Compare(t, archsimd.Uint8x16.NotEqual, notEqualSlice[uint8])
280
281 if archsimd.X86.AVX2() {
282 testUint16x16Compare(t, archsimd.Uint16x16.NotEqual, notEqualSlice[uint16])
283 testUint32x8Compare(t, archsimd.Uint32x8.NotEqual, notEqualSlice[uint32])
284 testUint64x4Compare(t, archsimd.Uint64x4.NotEqual, notEqualSlice[uint64])
285 testUint8x32Compare(t, archsimd.Uint8x32.NotEqual, notEqualSlice[uint8])
286 }
287
288 if archsimd.X86.AVX512() {
289 testFloat32x16Compare(t, archsimd.Float32x16.NotEqual, notEqualSlice[float32])
290 testFloat64x8Compare(t, archsimd.Float64x8.NotEqual, notEqualSlice[float64])
291 testInt8x64Compare(t, archsimd.Int8x64.NotEqual, notEqualSlice[int8])
292 testInt16x32Compare(t, archsimd.Int16x32.NotEqual, notEqualSlice[int16])
293 testInt32x16Compare(t, archsimd.Int32x16.NotEqual, notEqualSlice[int32])
294 testInt64x8Compare(t, archsimd.Int64x8.NotEqual, notEqualSlice[int64])
295 testUint8x64Compare(t, archsimd.Uint8x64.NotEqual, notEqualSlice[uint8])
296 testUint16x32Compare(t, archsimd.Uint16x32.NotEqual, notEqualSlice[uint16])
297 testUint32x16Compare(t, archsimd.Uint32x16.NotEqual, notEqualSlice[uint32])
298 testUint64x8Compare(t, archsimd.Uint64x8.NotEqual, notEqualSlice[uint64])
299 }
300 }
301
302 func TestIsNaN(t *testing.T) {
303 testFloat32x4UnaryCompare(t, archsimd.Float32x4.IsNaN, isNaNSlice[float32])
304 testFloat32x8UnaryCompare(t, archsimd.Float32x8.IsNaN, isNaNSlice[float32])
305 testFloat64x2UnaryCompare(t, archsimd.Float64x2.IsNaN, isNaNSlice[float64])
306 testFloat64x4UnaryCompare(t, archsimd.Float64x4.IsNaN, isNaNSlice[float64])
307
308 if archsimd.X86.AVX512() {
309 testFloat32x16UnaryCompare(t, archsimd.Float32x16.IsNaN, isNaNSlice[float32])
310 testFloat64x8UnaryCompare(t, archsimd.Float64x8.IsNaN, isNaNSlice[float64])
311 }
312
313
314 want32 := mapCompare(func(x, y float32) bool { return x != x || y != y })
315 want64 := mapCompare(func(x, y float64) bool { return x != x || y != y })
316 testFloat32x4Compare(t,
317 func(x, y archsimd.Float32x4) archsimd.Mask32x4 {
318 return x.IsNaN().Or(y.IsNaN())
319 }, want32)
320 testFloat64x2Compare(t,
321 func(x, y archsimd.Float64x2) archsimd.Mask64x2 {
322 return x.IsNaN().Or(y.IsNaN())
323 }, want64)
324
325 if archsimd.X86.AVX2() {
326 testFloat32x8Compare(t,
327 func(x, y archsimd.Float32x8) archsimd.Mask32x8 {
328 return x.IsNaN().Or(y.IsNaN())
329 }, want32)
330 testFloat64x4Compare(t,
331 func(x, y archsimd.Float64x4) archsimd.Mask64x4 {
332 return x.IsNaN().Or(y.IsNaN())
333 }, want64)
334 }
335
336 if archsimd.X86.AVX512() {
337 testFloat32x16Compare(t,
338 func(x, y archsimd.Float32x16) archsimd.Mask32x16 {
339 return x.IsNaN().Or(y.IsNaN())
340 }, want32)
341 testFloat64x8Compare(t,
342 func(x, y archsimd.Float64x8) archsimd.Mask64x8 {
343 return x.IsNaN().Or(y.IsNaN())
344 }, want64)
345 }
346 }
347
View as plain text