]> git.proxmox.com Git - ceph.git/blame - ceph/src/spdk/dpdk/drivers/net/softnic/hash_func.h
update download target update for octopus release
[ceph.git] / ceph / src / spdk / dpdk / drivers / net / softnic / hash_func.h
CommitLineData
11fdf7f2
TL
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
10static inline uint64_t
11hash_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
23static inline uint64_t
24hash_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
36static inline uint64_t
37hash_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
51static inline uint64_t
52hash_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
67static inline uint64_t
68hash_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
85static inline uint64_t
86hash_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
104static inline uint64_t
105hash_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
124static inline uint64_t
125hash_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
149static inline uint64_t
150hash_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
162static inline uint64_t
163hash_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
180static inline uint64_t
181hash_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
201static inline uint64_t
202hash_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
226static inline uint64_t
227hash_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
251static inline uint64_t
252hash_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
277static inline uint64_t
278hash_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
306static inline uint64_t
307hash_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