1
2
3
4
5
6
7 package simd_test
8
9 import (
10 "simd/archsimd"
11 "testing"
12 )
13
14 func TestConcatEven(t *testing.T) {
15 testInt8x16Binary(t, archsimd.Int8x16.ConcatEven, deinterleaveSlice[int8](128, false))
16 testInt16x8Binary(t, archsimd.Int16x8.ConcatEven, deinterleaveSlice[int16](128, false))
17 testInt32x4Binary(t, archsimd.Int32x4.ConcatEven, deinterleaveSlice[int32](128, false))
18 testInt64x2Binary(t, archsimd.Int64x2.ConcatEven, deinterleaveSlice[int64](128, false))
19 testUint8x16Binary(t, archsimd.Uint8x16.ConcatEven, deinterleaveSlice[uint8](128, false))
20 testUint16x8Binary(t, archsimd.Uint16x8.ConcatEven, deinterleaveSlice[uint16](128, false))
21 testUint32x4Binary(t, archsimd.Uint32x4.ConcatEven, deinterleaveSlice[uint32](128, false))
22 testUint64x2Binary(t, archsimd.Uint64x2.ConcatEven, deinterleaveSlice[uint64](128, false))
23 }
24
25 func TestConcatOdd(t *testing.T) {
26 testInt8x16Binary(t, archsimd.Int8x16.ConcatOdd, deinterleaveSlice[int8](128, true))
27 testInt16x8Binary(t, archsimd.Int16x8.ConcatOdd, deinterleaveSlice[int16](128, true))
28 testInt32x4Binary(t, archsimd.Int32x4.ConcatOdd, deinterleaveSlice[int32](128, true))
29 testInt64x2Binary(t, archsimd.Int64x2.ConcatOdd, deinterleaveSlice[int64](128, true))
30 testUint8x16Binary(t, archsimd.Uint8x16.ConcatOdd, deinterleaveSlice[uint8](128, true))
31 testUint16x8Binary(t, archsimd.Uint16x8.ConcatOdd, deinterleaveSlice[uint16](128, true))
32 testUint32x4Binary(t, archsimd.Uint32x4.ConcatOdd, deinterleaveSlice[uint32](128, true))
33 testUint64x2Binary(t, archsimd.Uint64x2.ConcatOdd, deinterleaveSlice[uint64](128, true))
34 }
35
36 func TestConcatAddPairs(t *testing.T) {
37 testFloat32x4Binary(t, archsimd.Float32x4.ConcatAddPairs, concatAddPairsSlice[float32])
38 testFloat64x2Binary(t, archsimd.Float64x2.ConcatAddPairs, concatAddPairsSlice[float64])
39
40 testInt8x16Binary(t, archsimd.Int8x16.ConcatAddPairs, concatAddPairsSlice[int8])
41 testInt16x8Binary(t, archsimd.Int16x8.ConcatAddPairs, concatAddPairsSlice[int16])
42 testInt32x4Binary(t, archsimd.Int32x4.ConcatAddPairs, concatAddPairsSlice[int32])
43 testInt64x2Binary(t, archsimd.Int64x2.ConcatAddPairs, concatAddPairsSlice[int64])
44
45 testUint8x16Binary(t, archsimd.Uint8x16.ConcatAddPairs, concatAddPairsSlice[uint8])
46 testUint16x8Binary(t, archsimd.Uint16x8.ConcatAddPairs, concatAddPairsSlice[uint16])
47 testUint32x4Binary(t, archsimd.Uint32x4.ConcatAddPairs, concatAddPairsSlice[uint32])
48 testUint64x2Binary(t, archsimd.Uint64x2.ConcatAddPairs, concatAddPairsSlice[uint64])
49 }
50
51 func TestConcatMaxPairs(t *testing.T) {
52 testFloat32x4Binary(t, archsimd.Float32x4.ConcatMaxPairs, concatMaxPairsSlice[float32])
53 testFloat64x2Binary(t, archsimd.Float64x2.ConcatMaxPairs, concatMaxPairsSlice[float64])
54
55 testInt8x16Binary(t, archsimd.Int8x16.ConcatMaxPairs, concatMaxPairsSlice[int8])
56 testInt16x8Binary(t, archsimd.Int16x8.ConcatMaxPairs, concatMaxPairsSlice[int16])
57 testInt32x4Binary(t, archsimd.Int32x4.ConcatMaxPairs, concatMaxPairsSlice[int32])
58
59 testUint8x16Binary(t, archsimd.Uint8x16.ConcatMaxPairs, concatMaxPairsSlice[uint8])
60 testUint16x8Binary(t, archsimd.Uint16x8.ConcatMaxPairs, concatMaxPairsSlice[uint16])
61 testUint32x4Binary(t, archsimd.Uint32x4.ConcatMaxPairs, concatMaxPairsSlice[uint32])
62 }
63
64 func TestConcatMinPairs(t *testing.T) {
65 testFloat32x4Binary(t, archsimd.Float32x4.ConcatMinPairs, concatMinPairsSlice[float32])
66 testFloat64x2Binary(t, archsimd.Float64x2.ConcatMinPairs, concatMinPairsSlice[float64])
67
68 testInt8x16Binary(t, archsimd.Int8x16.ConcatMinPairs, concatMinPairsSlice[int8])
69 testInt16x8Binary(t, archsimd.Int16x8.ConcatMinPairs, concatMinPairsSlice[int16])
70 testInt32x4Binary(t, archsimd.Int32x4.ConcatMinPairs, concatMinPairsSlice[int32])
71
72 testUint8x16Binary(t, archsimd.Uint8x16.ConcatMinPairs, concatMinPairsSlice[uint8])
73 testUint16x8Binary(t, archsimd.Uint16x8.ConcatMinPairs, concatMinPairsSlice[uint16])
74 testUint32x4Binary(t, archsimd.Uint32x4.ConcatMinPairs, concatMinPairsSlice[uint32])
75 }
76
77 func TestInterleaveEven(t *testing.T) {
78 testInt8x16Binary(t, archsimd.Int8x16.InterleaveEven, transposeSlice[int8](128, false))
79 testInt16x8Binary(t, archsimd.Int16x8.InterleaveEven, transposeSlice[int16](128, false))
80 testInt32x4Binary(t, archsimd.Int32x4.InterleaveEven, transposeSlice[int32](128, false))
81 testInt64x2Binary(t, archsimd.Int64x2.InterleaveEven, transposeSlice[int64](128, false))
82 testUint8x16Binary(t, archsimd.Uint8x16.InterleaveEven, transposeSlice[uint8](128, false))
83 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveEven, transposeSlice[uint16](128, false))
84 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveEven, transposeSlice[uint32](128, false))
85 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveEven, transposeSlice[uint64](128, false))
86 }
87
88 func TestInterleaveOdd(t *testing.T) {
89 testInt8x16Binary(t, archsimd.Int8x16.InterleaveOdd, transposeSlice[int8](128, true))
90 testInt16x8Binary(t, archsimd.Int16x8.InterleaveOdd, transposeSlice[int16](128, true))
91 testInt32x4Binary(t, archsimd.Int32x4.InterleaveOdd, transposeSlice[int32](128, true))
92 testInt64x2Binary(t, archsimd.Int64x2.InterleaveOdd, transposeSlice[int64](128, true))
93 testUint8x16Binary(t, archsimd.Uint8x16.InterleaveOdd, transposeSlice[uint8](128, true))
94 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveOdd, transposeSlice[uint16](128, true))
95 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveOdd, transposeSlice[uint32](128, true))
96 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveOdd, transposeSlice[uint64](128, true))
97 }
98
99 func TestInterleaveLoARM64(t *testing.T) {
100 testInt8x16Binary(t, archsimd.Int8x16.InterleaveLo, interleaveSlice[int8](128, false))
101 testInt16x8Binary(t, archsimd.Int16x8.InterleaveLo, interleaveSlice[int16](128, false))
102 testInt32x4Binary(t, archsimd.Int32x4.InterleaveLo, interleaveSlice[int32](128, false))
103 testInt64x2Binary(t, archsimd.Int64x2.InterleaveLo, interleaveSlice[int64](128, false))
104 testUint8x16Binary(t, archsimd.Uint8x16.InterleaveLo, interleaveSlice[uint8](128, false))
105 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveLo, interleaveSlice[uint16](128, false))
106 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveLo, interleaveSlice[uint32](128, false))
107 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveLo, interleaveSlice[uint64](128, false))
108 }
109
110 func TestInterleaveHiARM64(t *testing.T) {
111 testInt8x16Binary(t, archsimd.Int8x16.InterleaveHi, interleaveSlice[int8](128, true))
112 testInt16x8Binary(t, archsimd.Int16x8.InterleaveHi, interleaveSlice[int16](128, true))
113 testInt32x4Binary(t, archsimd.Int32x4.InterleaveHi, interleaveSlice[int32](128, true))
114 testInt64x2Binary(t, archsimd.Int64x2.InterleaveHi, interleaveSlice[int64](128, true))
115 testUint8x16Binary(t, archsimd.Uint8x16.InterleaveHi, interleaveSlice[uint8](128, true))
116 testUint16x8Binary(t, archsimd.Uint16x8.InterleaveHi, interleaveSlice[uint16](128, true))
117 testUint32x4Binary(t, archsimd.Uint32x4.InterleaveHi, interleaveSlice[uint32](128, true))
118 testUint64x2Binary(t, archsimd.Uint64x2.InterleaveHi, interleaveSlice[uint64](128, true))
119 }
120
121 func TestOrNot(t *testing.T) {
122 testInt8x16Binary(t, archsimd.Int8x16.OrNot, orNotSlice[int8])
123 testInt16x8Binary(t, archsimd.Int16x8.OrNot, orNotSlice[int16])
124 testInt32x4Binary(t, archsimd.Int32x4.OrNot, orNotSlice[int32])
125 testInt64x2Binary(t, archsimd.Int64x2.OrNot, orNotSlice[int64])
126
127 testUint8x16Binary(t, archsimd.Uint8x16.OrNot, orNotSlice[uint8])
128 testUint16x8Binary(t, archsimd.Uint16x8.OrNot, orNotSlice[uint16])
129 testUint32x4Binary(t, archsimd.Uint32x4.OrNot, orNotSlice[uint32])
130 testUint64x2Binary(t, archsimd.Uint64x2.OrNot, orNotSlice[uint64])
131 }
132
133 func cmtst[T integer](x, y T) bool {
134 return (x & y) != 0
135 }
136
137 func cmtstSlice[T integer](x, y []T) []int64 {
138 return mapCompare[T](cmtst)(x, y)
139 }
140
141
142 func cmtst8(x, y archsimd.Int8x16) archsimd.Mask8x16 {
143 var z archsimd.Int8x16
144 return x.And(y).Equal(z).Not()
145 }
146
147
148 func cmtst16(x, y archsimd.Int16x8) archsimd.Mask16x8 {
149 var z archsimd.Int16x8
150 return x.And(y).Equal(z).Not()
151 }
152
153
154 func cmtst32(x, y archsimd.Int32x4) archsimd.Mask32x4 {
155 z := x.Xor(x)
156 return x.And(y).Equal(z).Not()
157 }
158
159
160 func cmtst64(x, y archsimd.Int64x2) archsimd.Mask64x2 {
161 var z archsimd.Int64x2
162 return x.And(y).Equal(z).Not()
163 }
164
165 func TestCmtst(t *testing.T) {
166 testInt8x16Compare(t, cmtst8, cmtstSlice[int8])
167 testInt16x8Compare(t, cmtst16, cmtstSlice[int16])
168 testInt32x4Compare(t, cmtst32, cmtstSlice[int32])
169 testInt64x2Compare(t, cmtst64, cmtstSlice[int64])
170 }
171
View as plain text