1
2
3
4
5
6
7 package simd_test
8
9 import (
10 "simd/archsimd"
11 "testing"
12 )
13
14 func TestLessAMD64(t *testing.T) {
15 testFloat32x8Compare(t, archsimd.Float32x8.Less, lessSlice[float32])
16 testFloat64x4Compare(t, archsimd.Float64x4.Less, lessSlice[float64])
17
18 if archsimd.X86.AVX2() {
19 testInt16x16Compare(t, archsimd.Int16x16.Less, lessSlice[int16])
20 testInt32x8Compare(t, archsimd.Int32x8.Less, lessSlice[int32])
21 testInt64x4Compare(t, archsimd.Int64x4.Less, lessSlice[int64])
22 testInt8x32Compare(t, archsimd.Int8x32.Less, lessSlice[int8])
23
24 testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
25 testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
26 testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
27 testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
28 }
29
30 if archsimd.X86.AVX512() {
31 testUint16x16Compare(t, archsimd.Uint16x16.Less, lessSlice[uint16])
32 testUint16x8Compare(t, archsimd.Uint16x8.Less, lessSlice[uint16])
33 testUint32x4Compare(t, archsimd.Uint32x4.Less, lessSlice[uint32])
34 testUint32x8Compare(t, archsimd.Uint32x8.Less, lessSlice[uint32])
35 testUint64x2Compare(t, archsimd.Uint64x2.Less, lessSlice[uint64])
36 testUint64x4Compare(t, archsimd.Uint64x4.Less, lessSlice[uint64])
37 testUint8x16Compare(t, archsimd.Uint8x16.Less, lessSlice[uint8])
38 testUint8x32Compare(t, archsimd.Uint8x32.Less, lessSlice[uint8])
39
40 testFloat32x16Compare(t, archsimd.Float32x16.Less, lessSlice[float32])
41 testFloat64x8Compare(t, archsimd.Float64x8.Less, lessSlice[float64])
42 testInt8x64Compare(t, archsimd.Int8x64.Less, lessSlice[int8])
43 testInt16x32Compare(t, archsimd.Int16x32.Less, lessSlice[int16])
44 testInt32x16Compare(t, archsimd.Int32x16.Less, lessSlice[int32])
45 testInt64x8Compare(t, archsimd.Int64x8.Less, lessSlice[int64])
46 testUint8x64Compare(t, archsimd.Uint8x64.Less, lessSlice[uint8])
47 testUint16x32Compare(t, archsimd.Uint16x32.Less, lessSlice[uint16])
48 testUint32x16Compare(t, archsimd.Uint32x16.Less, lessSlice[uint32])
49 testUint64x8Compare(t, archsimd.Uint64x8.Less, lessSlice[uint64])
50 }
51 }
52
53 func TestLessEqualAMD64(t *testing.T) {
54 testFloat32x8Compare(t, archsimd.Float32x8.LessEqual, lessEqualSlice[float32])
55 testFloat64x4Compare(t, archsimd.Float64x4.LessEqual, lessEqualSlice[float64])
56
57 if archsimd.X86.AVX2() {
58 testInt16x16Compare(t, archsimd.Int16x16.LessEqual, lessEqualSlice[int16])
59 testInt32x8Compare(t, archsimd.Int32x8.LessEqual, lessEqualSlice[int32])
60 testInt64x4Compare(t, archsimd.Int64x4.LessEqual, lessEqualSlice[int64])
61 testInt8x32Compare(t, archsimd.Int8x32.LessEqual, lessEqualSlice[int8])
62
63 testUint16x16Compare(t, archsimd.Uint16x16.LessEqual, lessEqualSlice[uint16])
64 testUint32x8Compare(t, archsimd.Uint32x8.LessEqual, lessEqualSlice[uint32])
65 testUint64x4Compare(t, archsimd.Uint64x4.LessEqual, lessEqualSlice[uint64])
66 testUint8x32Compare(t, archsimd.Uint8x32.LessEqual, lessEqualSlice[uint8])
67 }
68
69 if archsimd.X86.AVX512() {
70 testFloat32x16Compare(t, archsimd.Float32x16.LessEqual, lessEqualSlice[float32])
71 testFloat64x8Compare(t, archsimd.Float64x8.LessEqual, lessEqualSlice[float64])
72 testInt8x64Compare(t, archsimd.Int8x64.LessEqual, lessEqualSlice[int8])
73 testInt16x32Compare(t, archsimd.Int16x32.LessEqual, lessEqualSlice[int16])
74 testInt32x16Compare(t, archsimd.Int32x16.LessEqual, lessEqualSlice[int32])
75 testInt64x8Compare(t, archsimd.Int64x8.LessEqual, lessEqualSlice[int64])
76 testUint8x64Compare(t, archsimd.Uint8x64.LessEqual, lessEqualSlice[uint8])
77 testUint16x32Compare(t, archsimd.Uint16x32.LessEqual, lessEqualSlice[uint16])
78 testUint32x16Compare(t, archsimd.Uint32x16.LessEqual, lessEqualSlice[uint32])
79 testUint64x8Compare(t, archsimd.Uint64x8.LessEqual, lessEqualSlice[uint64])
80 }
81 }
82
83 func TestGreaterAMD64(t *testing.T) {
84 testFloat32x8Compare(t, archsimd.Float32x8.Greater, greaterSlice[float32])
85 testFloat64x4Compare(t, archsimd.Float64x4.Greater, greaterSlice[float64])
86
87 if archsimd.X86.AVX2() {
88 testInt16x16Compare(t, archsimd.Int16x16.Greater, greaterSlice[int16])
89 testInt32x8Compare(t, archsimd.Int32x8.Greater, greaterSlice[int32])
90 testInt64x4Compare(t, archsimd.Int64x4.Greater, greaterSlice[int64])
91 testInt8x32Compare(t, archsimd.Int8x32.Greater, greaterSlice[int8])
92
93 testUint16x16Compare(t, archsimd.Uint16x16.Greater, greaterSlice[uint16])
94 testUint32x8Compare(t, archsimd.Uint32x8.Greater, greaterSlice[uint32])
95 testUint64x4Compare(t, archsimd.Uint64x4.Greater, greaterSlice[uint64])
96 testUint8x32Compare(t, archsimd.Uint8x32.Greater, greaterSlice[uint8])
97 }
98
99 if archsimd.X86.AVX512() {
100
101 testFloat32x16Compare(t, archsimd.Float32x16.Greater, greaterSlice[float32])
102 testFloat64x8Compare(t, archsimd.Float64x8.Greater, greaterSlice[float64])
103 testInt8x64Compare(t, archsimd.Int8x64.Greater, greaterSlice[int8])
104 testInt16x32Compare(t, archsimd.Int16x32.Greater, greaterSlice[int16])
105 testInt32x16Compare(t, archsimd.Int32x16.Greater, greaterSlice[int32])
106 testInt64x8Compare(t, archsimd.Int64x8.Greater, greaterSlice[int64])
107 testUint8x64Compare(t, archsimd.Uint8x64.Greater, greaterSlice[uint8])
108 testUint16x32Compare(t, archsimd.Uint16x32.Greater, greaterSlice[uint16])
109 testUint32x16Compare(t, archsimd.Uint32x16.Greater, greaterSlice[uint32])
110 testUint64x8Compare(t, archsimd.Uint64x8.Greater, greaterSlice[uint64])
111 }
112 }
113
114 func TestGreaterEqualAMD64(t *testing.T) {
115 testFloat32x8Compare(t, archsimd.Float32x8.GreaterEqual, greaterEqualSlice[float32])
116 testFloat64x4Compare(t, archsimd.Float64x4.GreaterEqual, greaterEqualSlice[float64])
117
118 if archsimd.X86.AVX2() {
119 testInt16x16Compare(t, archsimd.Int16x16.GreaterEqual, greaterEqualSlice[int16])
120 testInt32x8Compare(t, archsimd.Int32x8.GreaterEqual, greaterEqualSlice[int32])
121 testInt64x4Compare(t, archsimd.Int64x4.GreaterEqual, greaterEqualSlice[int64])
122 testInt8x32Compare(t, archsimd.Int8x32.GreaterEqual, greaterEqualSlice[int8])
123
124 testUint16x16Compare(t, archsimd.Uint16x16.GreaterEqual, greaterEqualSlice[uint16])
125 testUint32x8Compare(t, archsimd.Uint32x8.GreaterEqual, greaterEqualSlice[uint32])
126 testUint64x4Compare(t, archsimd.Uint64x4.GreaterEqual, greaterEqualSlice[uint64])
127 testUint8x32Compare(t, archsimd.Uint8x32.GreaterEqual, greaterEqualSlice[uint8])
128 }
129
130 if archsimd.X86.AVX512() {
131 testFloat32x16Compare(t, archsimd.Float32x16.GreaterEqual, greaterEqualSlice[float32])
132 testFloat64x8Compare(t, archsimd.Float64x8.GreaterEqual, greaterEqualSlice[float64])
133 testInt8x64Compare(t, archsimd.Int8x64.GreaterEqual, greaterEqualSlice[int8])
134 testInt16x32Compare(t, archsimd.Int16x32.GreaterEqual, greaterEqualSlice[int16])
135 testInt32x16Compare(t, archsimd.Int32x16.GreaterEqual, greaterEqualSlice[int32])
136 testInt64x8Compare(t, archsimd.Int64x8.GreaterEqual, greaterEqualSlice[int64])
137 testUint8x64Compare(t, archsimd.Uint8x64.GreaterEqual, greaterEqualSlice[uint8])
138 testUint16x32Compare(t, archsimd.Uint16x32.GreaterEqual, greaterEqualSlice[uint16])
139 testUint32x16Compare(t, archsimd.Uint32x16.GreaterEqual, greaterEqualSlice[uint32])
140 testUint64x8Compare(t, archsimd.Uint64x8.GreaterEqual, greaterEqualSlice[uint64])
141 }
142 }
143
144 func TestEqualAMD64(t *testing.T) {
145 testFloat32x8Compare(t, archsimd.Float32x8.Equal, equalSlice[float32])
146 testFloat64x4Compare(t, archsimd.Float64x4.Equal, equalSlice[float64])
147
148 if archsimd.X86.AVX2() {
149 testInt16x16Compare(t, archsimd.Int16x16.Equal, equalSlice[int16])
150 testInt32x8Compare(t, archsimd.Int32x8.Equal, equalSlice[int32])
151 testInt64x4Compare(t, archsimd.Int64x4.Equal, equalSlice[int64])
152 testInt8x32Compare(t, archsimd.Int8x32.Equal, equalSlice[int8])
153
154 testUint16x16Compare(t, archsimd.Uint16x16.Equal, equalSlice[uint16])
155 testUint32x8Compare(t, archsimd.Uint32x8.Equal, equalSlice[uint32])
156 testUint64x4Compare(t, archsimd.Uint64x4.Equal, equalSlice[uint64])
157 testUint8x32Compare(t, archsimd.Uint8x32.Equal, equalSlice[uint8])
158 }
159
160 if archsimd.X86.AVX512() {
161 testFloat32x16Compare(t, archsimd.Float32x16.Equal, equalSlice[float32])
162 testFloat64x8Compare(t, archsimd.Float64x8.Equal, equalSlice[float64])
163 testInt8x64Compare(t, archsimd.Int8x64.Equal, equalSlice[int8])
164 testInt16x32Compare(t, archsimd.Int16x32.Equal, equalSlice[int16])
165 testInt32x16Compare(t, archsimd.Int32x16.Equal, equalSlice[int32])
166 testInt64x8Compare(t, archsimd.Int64x8.Equal, equalSlice[int64])
167 testUint8x64Compare(t, archsimd.Uint8x64.Equal, equalSlice[uint8])
168 testUint16x32Compare(t, archsimd.Uint16x32.Equal, equalSlice[uint16])
169 testUint32x16Compare(t, archsimd.Uint32x16.Equal, equalSlice[uint32])
170 testUint64x8Compare(t, archsimd.Uint64x8.Equal, equalSlice[uint64])
171 }
172 }
173
174 func TestNotEqualAMD64(t *testing.T) {
175 testFloat32x8Compare(t, archsimd.Float32x8.NotEqual, notEqualSlice[float32])
176 testFloat64x4Compare(t, archsimd.Float64x4.NotEqual, notEqualSlice[float64])
177
178 if archsimd.X86.AVX2() {
179 testInt16x16Compare(t, archsimd.Int16x16.NotEqual, notEqualSlice[int16])
180 testInt32x8Compare(t, archsimd.Int32x8.NotEqual, notEqualSlice[int32])
181 testInt64x4Compare(t, archsimd.Int64x4.NotEqual, notEqualSlice[int64])
182 testInt8x32Compare(t, archsimd.Int8x32.NotEqual, notEqualSlice[int8])
183
184 testUint16x16Compare(t, archsimd.Uint16x16.NotEqual, notEqualSlice[uint16])
185 testUint32x8Compare(t, archsimd.Uint32x8.NotEqual, notEqualSlice[uint32])
186 testUint64x4Compare(t, archsimd.Uint64x4.NotEqual, notEqualSlice[uint64])
187 testUint8x32Compare(t, archsimd.Uint8x32.NotEqual, notEqualSlice[uint8])
188 }
189
190 if archsimd.X86.AVX512() {
191 testFloat32x16Compare(t, archsimd.Float32x16.NotEqual, notEqualSlice[float32])
192 testFloat64x8Compare(t, archsimd.Float64x8.NotEqual, notEqualSlice[float64])
193 testInt8x64Compare(t, archsimd.Int8x64.NotEqual, notEqualSlice[int8])
194 testInt16x32Compare(t, archsimd.Int16x32.NotEqual, notEqualSlice[int16])
195 testInt32x16Compare(t, archsimd.Int32x16.NotEqual, notEqualSlice[int32])
196 testInt64x8Compare(t, archsimd.Int64x8.NotEqual, notEqualSlice[int64])
197 testUint8x64Compare(t, archsimd.Uint8x64.NotEqual, notEqualSlice[uint8])
198 testUint16x32Compare(t, archsimd.Uint16x32.NotEqual, notEqualSlice[uint16])
199 testUint32x16Compare(t, archsimd.Uint32x16.NotEqual, notEqualSlice[uint32])
200 testUint64x8Compare(t, archsimd.Uint64x8.NotEqual, notEqualSlice[uint64])
201 }
202 }
203
204 func TestIsNaN(t *testing.T) {
205 testFloat32x4UnaryCompare(t, archsimd.Float32x4.IsNaN, isNaNSlice[float32])
206 testFloat32x8UnaryCompare(t, archsimd.Float32x8.IsNaN, isNaNSlice[float32])
207 testFloat64x2UnaryCompare(t, archsimd.Float64x2.IsNaN, isNaNSlice[float64])
208 testFloat64x4UnaryCompare(t, archsimd.Float64x4.IsNaN, isNaNSlice[float64])
209
210 if archsimd.X86.AVX512() {
211 testFloat32x16UnaryCompare(t, archsimd.Float32x16.IsNaN, isNaNSlice[float32])
212 testFloat64x8UnaryCompare(t, archsimd.Float64x8.IsNaN, isNaNSlice[float64])
213 }
214
215
216 want32 := mapCompare(func(x, y float32) bool { return x != x || y != y })
217 want64 := mapCompare(func(x, y float64) bool { return x != x || y != y })
218 testFloat32x4Compare(t,
219 func(x, y archsimd.Float32x4) archsimd.Mask32x4 {
220 return x.IsNaN().Or(y.IsNaN())
221 }, want32)
222 testFloat64x2Compare(t,
223 func(x, y archsimd.Float64x2) archsimd.Mask64x2 {
224 return x.IsNaN().Or(y.IsNaN())
225 }, want64)
226
227 if archsimd.X86.AVX2() {
228 testFloat32x8Compare(t,
229 func(x, y archsimd.Float32x8) archsimd.Mask32x8 {
230 return x.IsNaN().Or(y.IsNaN())
231 }, want32)
232 testFloat64x4Compare(t,
233 func(x, y archsimd.Float64x4) archsimd.Mask64x4 {
234 return x.IsNaN().Or(y.IsNaN())
235 }, want64)
236 }
237
238 if archsimd.X86.AVX512() {
239 testFloat32x16Compare(t,
240 func(x, y archsimd.Float32x16) archsimd.Mask32x16 {
241 return x.IsNaN().Or(y.IsNaN())
242 }, want32)
243 testFloat64x8Compare(t,
244 func(x, y archsimd.Float64x8) archsimd.Mask64x8 {
245 return x.IsNaN().Or(y.IsNaN())
246 }, want64)
247 }
248 }
249
View as plain text