New upstream version 18.08
[deb_dpdk.git] / drivers / net / softnic / hash_func.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2018 Intel Corporation
3  */
4
5 #ifndef __INCLUDE_HASH_FUNC_H__
6 #define __INCLUDE_HASH_FUNC_H__
7
8 #include <rte_common.h>
9
10 static inline uint64_t
11 hash_xor_key8(void *key, void *mask, __rte_unused uint32_t key_size,
12         uint64_t seed)
13 {
14         uint64_t *k = key;
15         uint64_t *m = mask;
16         uint64_t xor0;
17
18         xor0 = seed ^ (k[0] & m[0]);
19
20         return (xor0 >> 32) ^ xor0;
21 }
22
23 static inline uint64_t
24 hash_xor_key16(void *key, void *mask, __rte_unused uint32_t key_size,
25         uint64_t seed)
26 {
27         uint64_t *k = key;
28         uint64_t *m = mask;
29         uint64_t xor0;
30
31         xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
32
33         return (xor0 >> 32) ^ xor0;
34 }
35
36 static inline uint64_t
37 hash_xor_key24(void *key, void *mask, __rte_unused uint32_t key_size,
38         uint64_t seed)
39 {
40         uint64_t *k = key;
41         uint64_t *m = mask;
42         uint64_t xor0;
43
44         xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
45
46         xor0 ^= k[2] & m[2];
47
48         return (xor0 >> 32) ^ xor0;
49 }
50
51 static inline uint64_t
52 hash_xor_key32(void *key, void *mask, __rte_unused uint32_t key_size,
53         uint64_t seed)
54 {
55         uint64_t *k = key;
56         uint64_t *m = mask;
57         uint64_t xor0, xor1;
58
59         xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
60         xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
61
62         xor0 ^= xor1;
63
64         return (xor0 >> 32) ^ xor0;
65 }
66
67 static inline uint64_t
68 hash_xor_key40(void *key, void *mask, __rte_unused uint32_t key_size,
69         uint64_t seed)
70 {
71         uint64_t *k = key;
72         uint64_t *m = mask;
73         uint64_t xor0, xor1;
74
75         xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
76         xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
77
78         xor0 ^= xor1;
79
80         xor0 ^= k[4] & m[4];
81
82         return (xor0 >> 32) ^ xor0;
83 }
84
85 static inline uint64_t
86 hash_xor_key48(void *key, void *mask, __rte_unused uint32_t key_size,
87         uint64_t seed)
88 {
89         uint64_t *k = key;
90         uint64_t *m = mask;
91         uint64_t xor0, xor1, xor2;
92
93         xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
94         xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
95         xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
96
97         xor0 ^= xor1;
98
99         xor0 ^= xor2;
100
101         return (xor0 >> 32) ^ xor0;
102 }
103
104 static inline uint64_t
105 hash_xor_key56(void *key, void *mask, __rte_unused uint32_t key_size,
106         uint64_t seed)
107 {
108         uint64_t *k = key;
109         uint64_t *m = mask;
110         uint64_t xor0, xor1, xor2;
111
112         xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
113         xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
114         xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
115
116         xor0 ^= xor1;
117         xor2 ^= k[6] & m[6];
118
119         xor0 ^= xor2;
120
121         return (xor0 >> 32) ^ xor0;
122 }
123
124 static inline uint64_t
125 hash_xor_key64(void *key, void *mask, __rte_unused uint32_t key_size,
126         uint64_t seed)
127 {
128         uint64_t *k = key;
129         uint64_t *m = mask;
130         uint64_t xor0, xor1, xor2, xor3;
131
132         xor0 = ((k[0] & m[0]) ^ seed) ^ (k[1] & m[1]);
133         xor1 = (k[2] & m[2]) ^ (k[3] & m[3]);
134         xor2 = (k[4] & m[4]) ^ (k[5] & m[5]);
135         xor3 = (k[6] & m[6]) ^ (k[7] & m[7]);
136
137         xor0 ^= xor1;
138         xor2 ^= xor3;
139
140         xor0 ^= xor2;
141
142         return (xor0 >> 32) ^ xor0;
143 }
144
145 #if defined(RTE_ARCH_X86_64)
146
147 #include <x86intrin.h>
148
149 static inline uint64_t
150 hash_crc_key8(void *key, void *mask, __rte_unused uint32_t key_size,
151         uint64_t seed)
152 {
153         uint64_t *k = key;
154         uint64_t *m = mask;
155         uint64_t crc0;
156
157         crc0 = _mm_crc32_u64(seed, k[0] & m[0]);
158
159         return crc0;
160 }
161
162 static inline uint64_t
163 hash_crc_key16(void *key, void *mask, __rte_unused uint32_t key_size,
164         uint64_t seed)
165 {
166         uint64_t *k = key;
167         uint64_t *m = mask;
168         uint64_t k0, crc0, crc1;
169
170         k0 = k[0] & m[0];
171
172         crc0 = _mm_crc32_u64(k0, seed);
173         crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
174
175         crc0 ^= crc1;
176
177         return crc0;
178 }
179
180 static inline uint64_t
181 hash_crc_key24(void *key, void *mask, __rte_unused uint32_t key_size,
182         uint64_t seed)
183 {
184         uint64_t *k = key;
185         uint64_t *m = mask;
186         uint64_t k0, k2, crc0, crc1;
187
188         k0 = k[0] & m[0];
189         k2 = k[2] & m[2];
190
191         crc0 = _mm_crc32_u64(k0, seed);
192         crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
193
194         crc0 = _mm_crc32_u64(crc0, k2);
195
196         crc0 ^= crc1;
197
198         return crc0;
199 }
200
201 static inline uint64_t
202 hash_crc_key32(void *key, void *mask, __rte_unused uint32_t key_size,
203         uint64_t seed)
204 {
205         uint64_t *k = key;
206         uint64_t *m = mask;
207         uint64_t k0, k2, crc0, crc1, crc2, crc3;
208
209         k0 = k[0] & m[0];
210         k2 = k[2] & m[2];
211
212         crc0 = _mm_crc32_u64(k0, seed);
213         crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
214
215         crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
216         crc3 = k2 >> 32;
217
218         crc0 = _mm_crc32_u64(crc0, crc1);
219         crc1 = _mm_crc32_u64(crc2, crc3);
220
221         crc0 ^= crc1;
222
223         return crc0;
224 }
225
226 static inline uint64_t
227 hash_crc_key40(void *key, void *mask, __rte_unused uint32_t key_size,
228         uint64_t seed)
229 {
230         uint64_t *k = key;
231         uint64_t *m = mask;
232         uint64_t k0, k2, crc0, crc1, crc2, crc3;
233
234         k0 = k[0] & m[0];
235         k2 = k[2] & m[2];
236
237         crc0 = _mm_crc32_u64(k0, seed);
238         crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
239
240         crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
241         crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
242
243         crc0 = _mm_crc32_u64(crc0, crc1);
244         crc1 = _mm_crc32_u64(crc2, crc3);
245
246         crc0 ^= crc1;
247
248         return crc0;
249 }
250
251 static inline uint64_t
252 hash_crc_key48(void *key, void *mask, __rte_unused uint32_t key_size,
253         uint64_t seed)
254 {
255         uint64_t *k = key;
256         uint64_t *m = mask;
257         uint64_t k0, k2, k5, crc0, crc1, crc2, crc3;
258
259         k0 = k[0] & m[0];
260         k2 = k[2] & m[2];
261         k5 = k[5] & m[5];
262
263         crc0 = _mm_crc32_u64(k0, seed);
264         crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
265
266         crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
267         crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
268
269         crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
270         crc1 = _mm_crc32_u64(crc3, k5);
271
272         crc0 ^= crc1;
273
274         return crc0;
275 }
276
277 static inline uint64_t
278 hash_crc_key56(void *key, void *mask, __rte_unused uint32_t key_size,
279         uint64_t seed)
280 {
281         uint64_t *k = key;
282         uint64_t *m = mask;
283         uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
284
285         k0 = k[0] & m[0];
286         k2 = k[2] & m[2];
287         k5 = k[5] & m[5];
288
289         crc0 = _mm_crc32_u64(k0, seed);
290         crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
291
292         crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
293         crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
294
295         crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
296         crc5 = k5 >> 32;
297
298         crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
299         crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
300
301         crc0 ^= crc1;
302
303         return crc0;
304 }
305
306 static inline uint64_t
307 hash_crc_key64(void *key, void *mask, __rte_unused uint32_t key_size,
308         uint64_t seed)
309 {
310         uint64_t *k = key;
311         uint64_t *m = mask;
312         uint64_t k0, k2, k5, crc0, crc1, crc2, crc3, crc4, crc5;
313
314         k0 = k[0] & m[0];
315         k2 = k[2] & m[2];
316         k5 = k[5] & m[5];
317
318         crc0 = _mm_crc32_u64(k0, seed);
319         crc1 = _mm_crc32_u64(k0 >> 32, k[1] & m[1]);
320
321         crc2 = _mm_crc32_u64(k2, k[3] & m[3]);
322         crc3 = _mm_crc32_u64(k2 >> 32, k[4] & m[4]);
323
324         crc4 = _mm_crc32_u64(k5, k[6] & m[6]);
325         crc5 = _mm_crc32_u64(k5 >> 32, k[7] & m[7]);
326
327         crc0 = _mm_crc32_u64(crc0, (crc1 << 32) ^ crc2);
328         crc1 = _mm_crc32_u64(crc3, (crc4 << 32) ^ crc5);
329
330         crc0 ^= crc1;
331
332         return crc0;
333 }
334
335 #define hash_default_key8                       hash_crc_key8
336 #define hash_default_key16                      hash_crc_key16
337 #define hash_default_key24                      hash_crc_key24
338 #define hash_default_key32                      hash_crc_key32
339 #define hash_default_key40                      hash_crc_key40
340 #define hash_default_key48                      hash_crc_key48
341 #define hash_default_key56                      hash_crc_key56
342 #define hash_default_key64                      hash_crc_key64
343
344 #elif defined(RTE_ARCH_ARM64)
345 #include "hash_func_arm64.h"
346 #else
347
348 #define hash_default_key8                       hash_xor_key8
349 #define hash_default_key16                      hash_xor_key16
350 #define hash_default_key24                      hash_xor_key24
351 #define hash_default_key32                      hash_xor_key32
352 #define hash_default_key40                      hash_xor_key40
353 #define hash_default_key48                      hash_xor_key48
354 #define hash_default_key56                      hash_xor_key56
355 #define hash_default_key64                      hash_xor_key64
356
357 #endif
358
359 #endif